aboutsummaryrefslogtreecommitdiffstats
path: root/sha1_file.c
diff options
context:
space:
mode:
authorNicolas Pitre <nico@cam.org>2005-05-20 16:57:28 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-20 15:41:45 -0700
commit91d7b8afc2dc8bacde2012ad076cd8d0c4d36697 (patch)
tree52d6c623ba410127411bcc914b7c6cc4ba32f4f3 /sha1_file.c
parente99d59ff0bff349ef205cef1076e0354c8130680 (diff)
downloadgit-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.c14
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;