[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:
parent
e99d59ff0b
commit
91d7b8afc2
20
mktag.c
20
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) {
|
if (buffer) {
|
||||||
char type[100];
|
if (!strcmp(type, expected_type))
|
||||||
unsigned long size;
|
ret = check_sha1_signature(sha1, buffer, size, type);
|
||||||
void *buffer = unpack_sha1_file(map, mapsize, type, &size);
|
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
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…
Reference in New Issue
Block a user