Browse Source

[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>
maint
Nicolas Pitre 20 years ago committed by Linus Torvalds
parent
commit
91d7b8afc2
  1. 22
      mktag.c
  2. 14
      sha1_file.c

22
mktag.c

@ -25,20 +25,14 @@
static int verify_object(unsigned char *sha1, const char *expected_type) static int verify_object(unsigned char *sha1, const char *expected_type)
{ {
int ret = -1; int ret = -1;
unsigned long mapsize; char type[100];
void *map = map_sha1_file(sha1, &mapsize); unsigned long size;

void *buffer = read_sha1_file(sha1, type, &size);
if (map) {
char type[100]; if (buffer) {
unsigned long size; if (!strcmp(type, expected_type))
void *buffer = unpack_sha1_file(map, mapsize, type, &size); ret = check_sha1_signature(sha1, buffer, size, type);

free(buffer);
if (buffer) {
if (!strcmp(type, expected_type))
ret = check_sha1_signature(sha1, buffer, size, type);
free(buffer);
}
munmap(map, mapsize);
} }
return ret; return ret;
} }

14
sha1_file.c

@ -9,6 +9,7 @@
#include <stdarg.h> #include <stdarg.h>
#include <limits.h> #include <limits.h>
#include "cache.h" #include "cache.h"
#include "delta.h"


#ifndef O_NOATIME #ifndef O_NOATIME
#if defined(__linux__) && (defined(__i386__) || defined(__PPC__)) #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) { if (map) {
buf = unpack_sha1_file(map, mapsize, type, size); buf = unpack_sha1_file(map, mapsize, type, size);
munmap(map, mapsize); 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 buf;
} }
return NULL; return NULL;

Loading…
Cancel
Save