replace_object: add mechanism to replace objects found in "refs/replace/"

The code implementing this mechanism has been copied more-or-less
from the commit graft code.

This mechanism is used in "read_sha1_file". sha1 passed to this
function that match a ref name in "refs/replace/" are replaced by
the sha1 that has been read in the ref.

We "die" if the replacement recursion depth is too high or if we
can't read the replacement object.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Christian Couder
2009-01-23 10:06:53 +01:00
committed by Junio C Hamano
parent 292687003a
commit 6809557029
4 changed files with 125 additions and 3 deletions

View File

@ -2148,10 +2148,18 @@ static void *read_object(const unsigned char *sha1, enum object_type *type,
void *read_sha1_file(const unsigned char *sha1, enum object_type *type,
unsigned long *size)
{
void *data = read_object(sha1, type, size);
const unsigned char *repl = lookup_replace_object(sha1);
void *data = read_object(repl, type, size);
/* die if we replaced an object with one that does not exist */
if (!data && repl != sha1)
die("replacement %s not found for %s",
sha1_to_hex(repl), sha1_to_hex(sha1));
/* legacy behavior is to die on corrupted objects */
if (!data && (has_loose_object(sha1) || has_packed_and_bad(sha1)))
die("object %s is corrupted", sha1_to_hex(sha1));
if (!data && (has_loose_object(repl) || has_packed_and_bad(repl)))
die("object %s is corrupted", sha1_to_hex(repl));
return data;
}