From 680955702990c1d4bfb3c6feed6ae9c6cb5c3c07 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Fri, 23 Jan 2009 10:06:53 +0100 Subject: 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 Signed-off-by: Junio C Hamano --- sha1_file.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'sha1_file.c') diff --git a/sha1_file.c b/sha1_file.c index e73cd4fc0..4bf24ffcf 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -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; } -- cgit v1.2.1 From f5552aee39d664bb8774c205341abd6db74b38d3 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Fri, 23 Jan 2009 10:07:01 +0100 Subject: sha1_file: add a "read_sha1_file_repl" function This new function will replace "read_sha1_file". This latter function becoming just a stub to call the former will a NULL "replacement" argument. This new function is needed because sometimes we need to use the replacement sha1. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- sha1_file.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'sha1_file.c') diff --git a/sha1_file.c b/sha1_file.c index 4bf24ffcf..9119b795b 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2145,8 +2145,10 @@ static void *read_object(const unsigned char *sha1, enum object_type *type, return read_packed_sha1(sha1, type, size); } -void *read_sha1_file(const unsigned char *sha1, enum object_type *type, - unsigned long *size) +void *read_sha1_file_repl(const unsigned char *sha1, + enum object_type *type, + unsigned long *size, + const unsigned char **replacement) { const unsigned char *repl = lookup_replace_object(sha1); void *data = read_object(repl, type, size); @@ -2160,6 +2162,9 @@ void *read_sha1_file(const unsigned char *sha1, enum object_type *type, if (!data && (has_loose_object(repl) || has_packed_and_bad(repl))) die("object %s is corrupted", sha1_to_hex(repl)); + if (replacement) + *replacement = repl; + return data; } -- cgit v1.2.1