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 @@ @@ -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);

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

14
sha1_file.c

@ -9,6 +9,7 @@ @@ -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 @@ -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;

Loading…
Cancel
Save