зеркало из https://github.com/microsoft/git.git
[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:
Родитель
e99d59ff0b
Коммит
91d7b8afc2
20
mktag.c
20
mktag.c
|
@ -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;
|
||||
}
|
||||
|
|
14
sha1_file.c
14
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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче