Skip to content

Commit

Permalink
[PATCH] delta read
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nicolas Pitre authored and Linus Torvalds committed May 20, 2005
1 parent e99d59f commit 91d7b8a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 14 deletions.
22 changes: 8 additions & 14 deletions mktag.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
14 changes: 14 additions & 0 deletions sha1_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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__))
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 91d7b8a

Please sign in to comment.