[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>
This commit is contained in:
Nicolas Pitre 2005-05-20 16:57:28 -04:00 committed by Linus Torvalds
parent e99d59ff0b
commit 91d7b8afc2
2 changed files with 21 additions and 13 deletions

20
mktag.c
View File

@ -25,20 +25,14 @@
static int verify_object(unsigned char *sha1, const char *expected_type)
{
int ret = -1;
unsigned long mapsize;
void *map = map_sha1_file(sha1, &mapsize);
char type[100];
unsigned long size;
void *buffer = read_sha1_file(sha1, type, &size);
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);
if (buffer) {
if (!strcmp(type, expected_type))
ret = check_sha1_signature(sha1, buffer, size, type);
free(buffer);
}
return ret;
}

View 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;