[PATCH] delta read
authorNicolas Pitre <nico@cam.org>
Fri, 20 May 2005 20:57:28 +0000 (16:57 -0400)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 20 May 2005 22:41:45 +0000 (15:41 -0700)
This makes the core code aware of delta objects and undeltafy them as
needed.  The convention is to use read_sha1_file() to have
undeltafication done automatically (most users do that already so this
is transparent).

If the delta object itself has to be accessed then it must be done
through map_sha1_file() and unpack_sha1_file().

In that context mktag.c has been switched to read_sha1_file() as there
is no reason to do the full map+unpack manually.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
mktag.c
sha1_file.c

diff --git a/mktag.c b/mktag.c
index 8605802..aa4a6d8 100644 (file)
--- a/mktag.c
+++ b/mktag.c
 static int verify_object(unsigned char *sha1, const char *expected_type)
 {
        int ret = -1;
-       unsigned long mapsize;
-       void *map = map_sha1_file(sha1, &mapsize);
-
-       if (map) {
-               char type[100];
-               unsigned long size;
-               void *buffer = unpack_sha1_file(map, mapsize, type, &size);
-
-               if (buffer) {
-                       if (!strcmp(type, expected_type))
-                               ret = check_sha1_signature(sha1, buffer, size, type);
-                       free(buffer);
-               }
-               munmap(map, mapsize);
+       char type[100];
+       unsigned long size;
+       void *buffer = read_sha1_file(sha1, type, &size);
+
+       if (buffer) {
+               if (!strcmp(type, expected_type))
+                       ret = check_sha1_signature(sha1, buffer, size, type);
+               free(buffer);
        }
        return ret;
 }
index ece9dff..edbf9f9 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdarg.h>
 #include <limits.h>
 #include "cache.h"
+#include "delta.h"
 
 #ifndef O_NOATIME
 #if defined(__linux__) && (defined(__i386__) || defined(__PPC__))
@@ -353,6 +354,19 @@ void * read_sha1_file(const unsigned char *sha1, char *type, unsigned long *size
        if (map) {
                buf = unpack_sha1_file(map, mapsize, type, size);
                munmap(map, mapsize);
+               if (buf && !strcmp(type, "delta")) {
+                       void *ref = NULL, *delta = buf;
+                       unsigned long ref_size, delta_size = *size;
+                       buf = NULL;
+                       if (delta_size > 20)
+                               ref = read_sha1_file(delta, type, &ref_size);
+                       if (ref)
+                               buf = patch_delta(ref, ref_size,
+                                                 delta+20, delta_size-20, 
+                                                 size);
+                       free(delta);
+                       free(ref);
+               }
                return buf;
        }
        return NULL;