unpack-object: cache for non written objects
Preventing objects with broken links entering the repository means, that write of some objects must be delayed. This patch adds a cache to keep the object data in memory. The delta resolving code must also search in the cache. Signed-off-by: Martin Koegler <mkoegler@auto.tuwien.ac.at> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
d6ffc8d784
commit
2add1e6db4
@ -8,6 +8,7 @@
|
|||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "progress.h"
|
#include "progress.h"
|
||||||
|
#include "decorate.h"
|
||||||
|
|
||||||
static int dry_run, quiet, recover, has_errors;
|
static int dry_run, quiet, recover, has_errors;
|
||||||
static const char unpack_usage[] = "git-unpack-objects [-n] [-q] [-r] < pack-file";
|
static const char unpack_usage[] = "git-unpack-objects [-n] [-q] [-r] < pack-file";
|
||||||
@ -18,6 +19,18 @@ static unsigned int offset, len;
|
|||||||
static off_t consumed_bytes;
|
static off_t consumed_bytes;
|
||||||
static SHA_CTX ctx;
|
static SHA_CTX ctx;
|
||||||
|
|
||||||
|
struct obj_buffer {
|
||||||
|
char *buffer;
|
||||||
|
unsigned long size;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct decoration obj_decorate;
|
||||||
|
|
||||||
|
static struct obj_buffer *lookup_object_buffer(struct object *base)
|
||||||
|
{
|
||||||
|
return lookup_decoration(&obj_decorate, base);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure at least "min" bytes are available in the buffer, and
|
* Make sure at least "min" bytes are available in the buffer, and
|
||||||
* return the pointer to the buffer.
|
* return the pointer to the buffer.
|
||||||
@ -189,6 +202,7 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
|
|||||||
void *delta_data, *base;
|
void *delta_data, *base;
|
||||||
unsigned long base_size;
|
unsigned long base_size;
|
||||||
unsigned char base_sha1[20];
|
unsigned char base_sha1[20];
|
||||||
|
struct object *obj;
|
||||||
|
|
||||||
if (type == OBJ_REF_DELTA) {
|
if (type == OBJ_REF_DELTA) {
|
||||||
hashcpy(base_sha1, fill(20));
|
hashcpy(base_sha1, fill(20));
|
||||||
@ -252,6 +266,15 @@ static void unpack_delta_entry(enum object_type type, unsigned long delta_size,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
obj = lookup_object(base_sha1);
|
||||||
|
if (obj) {
|
||||||
|
struct obj_buffer *obj_buf = lookup_object_buffer(obj);
|
||||||
|
if (obj_buf) {
|
||||||
|
resolve_delta(nr, obj->type, obj_buf->buffer, obj_buf->size, delta_data, delta_size);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
base = read_sha1_file(base_sha1, &type, &base_size);
|
base = read_sha1_file(base_sha1, &type, &base_size);
|
||||||
if (!base) {
|
if (!base) {
|
||||||
error("failed to read delta-pack base object %s",
|
error("failed to read delta-pack base object %s",
|
||||||
|
Loading…
Reference in New Issue
Block a user