diff options
author | Nicolas Pitre <nico@cam.org> | 2005-05-20 16:57:28 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-05-20 15:41:45 -0700 |
commit | 91d7b8afc2dc8bacde2012ad076cd8d0c4d36697 (patch) | |
tree | 52d6c623ba410127411bcc914b7c6cc4ba32f4f3 /sha1_file.c | |
parent | e99d59ff0bff349ef205cef1076e0354c8130680 (diff) | |
download | git-91d7b8afc2dc8bacde2012ad076cd8d0c4d36697.tar.gz |
[PATCH] delta read
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>
Diffstat (limited to 'sha1_file.c')
-rw-r--r-- | sha1_file.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/sha1_file.c b/sha1_file.c index ece9dff80d..edbf9f9a84 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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; |