From ffe68cf9acf1127078b0dfa0b09661ce52916642 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:04 +0100 Subject: [PATCH 01/11] rename READ_SHA1_FILE_REPLACE flag to LOOKUP_REPLACE_OBJECT The READ_SHA1_FILE_REPLACE flag is more related to using the lookup_replace_object() function rather than the read_sha1_file() function. We also need such a flag to be used with sha1_object_info() instead of read_sha1_file(). The name LOOKUP_REPLACE_OBJECT is therefore better for this flag. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- cache.h | 4 ++-- sha1_file.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cache.h b/cache.h index ce377e1354..873a6b5a89 100644 --- a/cache.h +++ b/cache.h @@ -760,11 +760,11 @@ int daemon_avoid_alias(const char *path); int offset_1st_component(const char *path); /* object replacement */ -#define READ_SHA1_FILE_REPLACE 1 +#define LOOKUP_REPLACE_OBJECT 1 extern void *read_sha1_file_extended(const unsigned char *sha1, enum object_type *type, unsigned long *size, unsigned flag); static inline void *read_sha1_file(const unsigned char *sha1, enum object_type *type, unsigned long *size) { - return read_sha1_file_extended(sha1, type, size, READ_SHA1_FILE_REPLACE); + return read_sha1_file_extended(sha1, type, size, LOOKUP_REPLACE_OBJECT); } extern const unsigned char *do_lookup_replace_object(const unsigned char *sha1); static inline const unsigned char *lookup_replace_object(const unsigned char *sha1) diff --git a/sha1_file.c b/sha1_file.c index 7dadd04cb7..2bd3acfc73 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2662,7 +2662,7 @@ void *read_sha1_file_extended(const unsigned char *sha1, void *data; char *path; const struct packed_git *p; - const unsigned char *repl = (flag & READ_SHA1_FILE_REPLACE) + const unsigned char *repl = (flag & LOOKUP_REPLACE_OBJECT) ? lookup_replace_object(sha1) : sha1; errno = 0; From 500a04f196d90ef3a426ff63f76b44df479efc7d Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:05 +0100 Subject: [PATCH 02/11] replace_object: don't check read_replace_refs twice Since e1111cef (inline lookup_replace_object() calls, May 15 2011) the read_replace_refs global variable is checked twice, once in lookup_replace_object() and once again in do_lookup_replace_object(). As do_lookup_replace_object() is called only from lookup_replace_object(), we can remove the check in do_lookup_replace_object(). Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- replace_object.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/replace_object.c b/replace_object.c index d0b1548726..cdcaf8cbe2 100644 --- a/replace_object.c +++ b/replace_object.c @@ -97,9 +97,6 @@ const unsigned char *do_lookup_replace_object(const unsigned char *sha1) int pos, depth = MAXREPLACEDEPTH; const unsigned char *cur = sha1; - if (!read_replace_refs) - return sha1; - prepare_replace_object(); /* Try to recursively replace the object */ From bf93eea0f67082ec295ac60fa78986f339adf2c6 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:06 +0100 Subject: [PATCH 03/11] sha1_file.c: add lookup_replace_object_extended() to pass flags Currently, there is only one caller to lookup_replace_object() that can benefit from passing it some flags, but we expect that there could be more. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- cache.h | 6 ++++++ sha1_file.c | 3 +-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cache.h b/cache.h index 873a6b5a89..1086071d5e 100644 --- a/cache.h +++ b/cache.h @@ -773,6 +773,12 @@ static inline const unsigned char *lookup_replace_object(const unsigned char *sh return sha1; return do_lookup_replace_object(sha1); } +static inline const unsigned char *lookup_replace_object_extended(const unsigned char *sha1, unsigned flag) +{ + if (!(flag & LOOKUP_REPLACE_OBJECT)) + return sha1; + return lookup_replace_object(sha1); +} /* Read and unpack a sha1 file into memory, write memory to a sha1 file */ extern int sha1_object_info(const unsigned char *, unsigned long *); diff --git a/sha1_file.c b/sha1_file.c index 2bd3acfc73..b0a39649bf 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2662,8 +2662,7 @@ void *read_sha1_file_extended(const unsigned char *sha1, void *data; char *path; const struct packed_git *p; - const unsigned char *repl = (flag & LOOKUP_REPLACE_OBJECT) - ? lookup_replace_object(sha1) : sha1; + const unsigned char *repl = lookup_replace_object_extended(sha1, flag); errno = 0; data = read_object(repl, type, size); From de7b5d6218e4b928c5a395e34e5e1de40fae2a0d Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:07 +0100 Subject: [PATCH 04/11] sha1_object_info_extended(): add an "unsigned flags" parameter This parameter is not used yet, but it will be used to tell sha1_object_info_extended() if it should perform object replacement or not. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- builtin/cat-file.c | 2 +- cache.h | 2 +- sha1_file.c | 6 +++--- streaming.c | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/builtin/cat-file.c b/builtin/cat-file.c index b2ca775a80..b15c0649e9 100644 --- a/builtin/cat-file.c +++ b/builtin/cat-file.c @@ -238,7 +238,7 @@ static int batch_one_object(const char *obj_name, struct batch_options *opt, return 0; } - if (sha1_object_info_extended(data->sha1, &data->info) < 0) { + if (sha1_object_info_extended(data->sha1, &data->info, LOOKUP_REPLACE_OBJECT) < 0) { printf("%s missing\n", obj_name); fflush(stdout); return 0; diff --git a/cache.h b/cache.h index 1086071d5e..9ba9773edf 100644 --- a/cache.h +++ b/cache.h @@ -1104,7 +1104,7 @@ struct object_info { } packed; } u; }; -extern int sha1_object_info_extended(const unsigned char *, struct object_info *); +extern int sha1_object_info_extended(const unsigned char *, struct object_info *, unsigned flags); /* Dumb servers support */ extern int update_server_info(int); diff --git a/sha1_file.c b/sha1_file.c index b0a39649bf..46ed1b12c9 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2514,7 +2514,7 @@ static int sha1_loose_object_info(const unsigned char *sha1, return 0; } -int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) +int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags) { struct cached_object *co; struct pack_entry e; @@ -2548,7 +2548,7 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi) rtype = packed_object_info(e.p, e.offset, oi); if (rtype < 0) { mark_bad_packed_object(e.p, sha1); - return sha1_object_info_extended(sha1, oi); + return sha1_object_info_extended(sha1, oi, 0); } else if (in_delta_base_cache(e.p, e.offset)) { oi->whence = OI_DBCACHED; } else { @@ -2570,7 +2570,7 @@ int sha1_object_info(const unsigned char *sha1, unsigned long *sizep) oi.typep = &type; oi.sizep = sizep; - if (sha1_object_info_extended(sha1, &oi) < 0) + if (sha1_object_info_extended(sha1, &oi, LOOKUP_REPLACE_OBJECT) < 0) return -1; return type; } diff --git a/streaming.c b/streaming.c index debe904523..9659f18be2 100644 --- a/streaming.c +++ b/streaming.c @@ -113,7 +113,7 @@ static enum input_source istream_source(const unsigned char *sha1, oi->typep = type; oi->sizep = &size; - status = sha1_object_info_extended(sha1, oi); + status = sha1_object_info_extended(sha1, oi, 0); if (status < 0) return stream_error; From 303c5d65c972de2e9d0821647b06ab595c21d355 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:08 +0100 Subject: [PATCH 05/11] t6050: show that git cat-file --batch fails with replace objects When --batch is passed to git cat-file, the sha1_object_info_extended() function is used to get information about the objects passed to git cat-file. Unfortunately sha1_object_info_extended() doesn't take care of object replacement properly, so it will often fail with a message like this: $ echo a3fb2e1845a1aaf129b7975048973414dc172173 | git cat-file --batch a3fb2e1845a1aaf129b7975048973414dc172173 commit 231 fatal: object a3fb2e1845a1aaf129b7975048973414dc172173 change size!? The goal of this patch is to show this breakage. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t6050-replace.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index 7d47984352..b90dbdcd2b 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -276,6 +276,11 @@ test_expect_success '-f option bypasses the type check' ' git replace -f HEAD^ $BLOB ' +test_expect_failure 'git cat-file --batch works on replace objects' ' + git replace | grep $PARA3 && + echo $PARA3 | git cat-file --batch +' + test_expect_success 'replace ref cleanup' ' test -n "$(git replace)" && git replace -d $(git replace) && From 1f7117ef7a39ff359a964e681f360f50d7a1c8f2 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:09 +0100 Subject: [PATCH 06/11] sha1_file: perform object replacement in sha1_object_info_extended() sha1_object_info_extended() should perform object replacement if it is needed. The simplest way to do that is to make it call lookup_replace_object_extended(). And now its "unsigned flags" parameter is used as it is passed to lookup_replace_object_extended(). Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- sha1_file.c | 13 +++++++------ t/t6050-replace.sh | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index 46ed1b12c9..0ca6770bed 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2519,8 +2519,9 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, struct cached_object *co; struct pack_entry e; int rtype; + const unsigned char *real = lookup_replace_object_extended(sha1, flags); - co = find_cached_object(sha1); + co = find_cached_object(real); if (co) { if (oi->typep) *(oi->typep) = co->type; @@ -2532,23 +2533,23 @@ int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, return 0; } - if (!find_pack_entry(sha1, &e)) { + if (!find_pack_entry(real, &e)) { /* Most likely it's a loose object. */ - if (!sha1_loose_object_info(sha1, oi)) { + if (!sha1_loose_object_info(real, oi)) { oi->whence = OI_LOOSE; return 0; } /* Not a loose object; someone else may have just packed it. */ reprepare_packed_git(); - if (!find_pack_entry(sha1, &e)) + if (!find_pack_entry(real, &e)) return -1; } rtype = packed_object_info(e.p, e.offset, oi); if (rtype < 0) { - mark_bad_packed_object(e.p, sha1); - return sha1_object_info_extended(sha1, oi, 0); + mark_bad_packed_object(e.p, real); + return sha1_object_info_extended(real, oi, 0); } else if (in_delta_base_cache(e.p, e.offset)) { oi->whence = OI_DBCACHED; } else { diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index b90dbdcd2b..bb785ec1ca 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -276,7 +276,7 @@ test_expect_success '-f option bypasses the type check' ' git replace -f HEAD^ $BLOB ' -test_expect_failure 'git cat-file --batch works on replace objects' ' +test_expect_success 'git cat-file --batch works on replace objects' ' git replace | grep $PARA3 && echo $PARA3 | git cat-file --batch ' From 44f9f850e8ee6e2824ceb1855d836d484340edf7 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:10 +0100 Subject: [PATCH 07/11] builtin/replace: teach listing using short, medium or full formats By default when listing replace refs, only the sha1 of the replaced objects are shown. In many cases, it is much nicer to be able to list all the sha1 of the replaced objects along with the sha1 of the replacment objects. And in other cases it might be interesting to also show the types of the replaced and replacement objects. This patch introduce a new --format= option where can be any of the following: 'short': this is the same as when no --format option is used, that is only the sha1 of the replaced objects are shown 'medium': this also lists the sha1 of the replacement objects 'full': this shows the sha1 and the type of both the replaced and the replacement objects Some documentation and some tests will follow. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- builtin/replace.c | 61 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/builtin/replace.c b/builtin/replace.c index b1bd3ef994..9f3619a1bf 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -16,27 +16,65 @@ static const char * const git_replace_usage[] = { N_("git replace [-f] "), N_("git replace -d ..."), - N_("git replace -l []"), + N_("git replace [--format=] [-l []]"), NULL }; +enum repl_fmt { SHORT, MEDIUM, FULL }; + +struct show_data { + const char *pattern; + enum repl_fmt fmt; +}; + static int show_reference(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { - const char *pattern = cb_data; + struct show_data *data = cb_data; - if (!fnmatch(pattern, refname, 0)) - printf("%s\n", refname); + if (!fnmatch(data->pattern, refname, 0)) { + if (data->fmt == SHORT) + printf("%s\n", refname); + else if (data->fmt == MEDIUM) + printf("%s -> %s\n", refname, sha1_to_hex(sha1)); + else { /* data->fmt == FULL */ + unsigned char object[20]; + enum object_type obj_type, repl_type; + + if (get_sha1(refname, object)) + return error("Failed to resolve '%s' as a valid ref.", refname); + + obj_type = sha1_object_info(object, NULL); + repl_type = sha1_object_info(sha1, NULL); + + printf("%s (%s) -> %s (%s)\n", refname, typename(obj_type), + sha1_to_hex(sha1), typename(repl_type)); + } + } return 0; } -static int list_replace_refs(const char *pattern) +static int list_replace_refs(const char *pattern, const char *format) { + struct show_data data; + if (pattern == NULL) pattern = "*"; + data.pattern = pattern; - for_each_replace_ref(show_reference, (void *) pattern); + if (format == NULL || *format == '\0' || !strcmp(format, "short")) + data.fmt = SHORT; + else if (!strcmp(format, "medium")) + data.fmt = MEDIUM; + else if (!strcmp(format, "full")) + data.fmt = FULL; + else + die("invalid replace format '%s'\n" + "valid formats are 'short', 'medium' and 'full'\n", + format); + + for_each_replace_ref(show_reference, (void *) &data); return 0; } @@ -127,10 +165,12 @@ static int replace_object(const char *object_ref, const char *replace_ref, int cmd_replace(int argc, const char **argv, const char *prefix) { int list = 0, delete = 0, force = 0; + const char *format = NULL; struct option options[] = { OPT_BOOL('l', "list", &list, N_("list replace refs")), OPT_BOOL('d', "delete", &delete, N_("delete replace refs")), OPT_BOOL('f', "force", &force, N_("replace the ref if it exists")), + OPT_STRING(0, "format", &format, N_("format"), N_("use this format")), OPT_END() }; @@ -140,6 +180,10 @@ int cmd_replace(int argc, const char **argv, const char *prefix) usage_msg_opt("-l and -d cannot be used together", git_replace_usage, options); + if (format && delete) + usage_msg_opt("--format and -d cannot be used together", + git_replace_usage, options); + if (force && (list || delete)) usage_msg_opt("-f cannot be used with -d or -l", git_replace_usage, options); @@ -157,6 +201,9 @@ int cmd_replace(int argc, const char **argv, const char *prefix) if (argc != 2) usage_msg_opt("bad number of arguments", git_replace_usage, options); + if (format) + usage_msg_opt("--format cannot be used when not listing", + git_replace_usage, options); return replace_object(argv[0], argv[1], force); } @@ -168,5 +215,5 @@ int cmd_replace(int argc, const char **argv, const char *prefix) usage_msg_opt("-f needs some arguments", git_replace_usage, options); - return list_replace_refs(argv[0]); + return list_replace_refs(argv[0], format); } From bbbb4afc26cd3d711e07a345d1e5f9eedc68100f Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:11 +0100 Subject: [PATCH 08/11] t6050: add tests for listing with --format This patch adds tests for "git replace -l --format=". 'short', 'medium' and 'full' are the only allowed values for . 'short' is the same as with no --format option. Tests for 'medium' and 'full' are the most needed. Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- t/t6050-replace.sh | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index bb785ec1ca..e1cc3b89da 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -281,6 +281,43 @@ test_expect_success 'git cat-file --batch works on replace objects' ' echo $PARA3 | git cat-file --batch ' +test_expect_success 'test --format bogus' ' + test_must_fail git replace --format bogus >/dev/null 2>&1 +' + +test_expect_success 'test --format short' ' + git replace --format=short >actual && + git replace >expected && + test_cmp expected actual +' + +test_expect_success 'test --format medium' ' + H1=$(git --no-replace-objects rev-parse HEAD~1) && + HT=$(git --no-replace-objects rev-parse HEAD^{tree}) && + MYTAG=$(git --no-replace-objects rev-parse mytag) && + { + echo "$H1 -> $BLOB" && + echo "$BLOB -> $REPLACED" && + echo "$HT -> $H1" && + echo "$PARA3 -> $S" && + echo "$MYTAG -> $HASH1" + } | sort >expected && + git replace -l --format medium | sort > actual && + test_cmp expected actual +' + +test_expect_failure 'test --format full' ' + { + echo "$H1 (commit) -> $BLOB (blob)" && + echo "$BLOB (blob) -> $REPLACED (blob)" && + echo "$HT (tree) -> $H1 (commit)" && + echo "$PARA3 (commit) -> $S (commit)" && + echo "$MYTAG (tag) -> $HASH1 (commit)" + } | sort >expected && + git replace --format=full | sort > actual && + test_cmp expected actual +' + test_expect_success 'replace ref cleanup' ' test -n "$(git replace)" && git replace -d $(git replace) && From 769a4fa463bb36ba78eb318f25e0e211f4fae949 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:12 +0100 Subject: [PATCH 09/11] builtin/replace: unset read_replace_refs When checking to see if some objects are of the same type and when displaying the type of objects, git replace uses the sha1_object_info() function. Unfortunately this function by default respects replace refs, so instead of the type of a replaced object, it gives the type of the replacement object which might be different. To fix this bug, and because git replace should work at a level before replacement takes place, let's unset the read_replace_refs global variable at the beginning of cmd_replace(). Suggested-by: Jeff King Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- builtin/replace.c | 2 ++ t/t6050-replace.sh | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/builtin/replace.c b/builtin/replace.c index 9f3619a1bf..1672870e81 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -174,6 +174,8 @@ int cmd_replace(int argc, const char **argv, const char *prefix) OPT_END() }; + read_replace_refs = 0; + argc = parse_options(argc, argv, prefix, options, git_replace_usage, 0); if (list && delete) diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index e1cc3b89da..d0c62f7539 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -306,7 +306,7 @@ test_expect_success 'test --format medium' ' test_cmp expected actual ' -test_expect_failure 'test --format full' ' +test_expect_success 'test --format full' ' { echo "$H1 (commit) -> $BLOB (blob)" && echo "$BLOB (blob) -> $REPLACED (blob)" && From 34a332221c581585ad06ed43eff12fb7e675cc1d Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Wed, 11 Dec 2013 08:46:13 +0100 Subject: [PATCH 10/11] Documentation/git-replace: describe --format option Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- Documentation/git-replace.txt | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt index f373ab48d4..7a078280d3 100644 --- a/Documentation/git-replace.txt +++ b/Documentation/git-replace.txt @@ -10,7 +10,7 @@ SYNOPSIS [verse] 'git replace' [-f] 'git replace' -d ... -'git replace' -l [] +'git replace' [--format=] [-l []] DESCRIPTION ----------- @@ -70,6 +70,23 @@ OPTIONS Typing "git replace" without arguments, also lists all replace refs. +--format=:: + When listing, use the specified , which can be one of + 'short', 'medium' and 'full'. When omitted, the format + defaults to 'short'. + +FORMATS +------- + +The following format are available: + +* 'short': + +* 'medium': + -> +* 'full' + () -> () + CREATING REPLACEMENT OBJECTS ---------------------------- From 663a8566beb5387530641abe71a8d8b2dafd08b3 Mon Sep 17 00:00:00 2001 From: Christian Couder Date: Sat, 28 Dec 2013 12:00:05 +0100 Subject: [PATCH 11/11] replace info: rename 'full' to 'long' and clarify in-code symbols Enum names SHORT/MEDIUM/FULL were too broad to be descriptive. And they clashed with built-in symbols on platforms like Windows. Clarify by giving them REPLACE_FORMAT_ prefix. Rename 'full' format in "git replace --format=" to 'long', to match others (i.e. 'short' and 'medium'). Signed-off-by: Christian Couder Signed-off-by: Junio C Hamano --- Documentation/git-replace.txt | 4 ++-- builtin/replace.c | 24 ++++++++++++++---------- t/t6050-replace.sh | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Documentation/git-replace.txt b/Documentation/git-replace.txt index 7a078280d3..0a02f70657 100644 --- a/Documentation/git-replace.txt +++ b/Documentation/git-replace.txt @@ -72,7 +72,7 @@ OPTIONS --format=:: When listing, use the specified , which can be one of - 'short', 'medium' and 'full'. When omitted, the format + 'short', 'medium' and 'long'. When omitted, the format defaults to 'short'. FORMATS @@ -84,7 +84,7 @@ The following format are available: * 'medium': -> -* 'full' +* 'long': () -> () CREATING REPLACEMENT OBJECTS diff --git a/builtin/replace.c b/builtin/replace.c index 1672870e81..2336325ce3 100644 --- a/builtin/replace.c +++ b/builtin/replace.c @@ -20,11 +20,15 @@ static const char * const git_replace_usage[] = { NULL }; -enum repl_fmt { SHORT, MEDIUM, FULL }; +enum replace_format { + REPLACE_FORMAT_SHORT, + REPLACE_FORMAT_MEDIUM, + REPLACE_FORMAT_LONG +}; struct show_data { const char *pattern; - enum repl_fmt fmt; + enum replace_format format; }; static int show_reference(const char *refname, const unsigned char *sha1, @@ -33,11 +37,11 @@ static int show_reference(const char *refname, const unsigned char *sha1, struct show_data *data = cb_data; if (!fnmatch(data->pattern, refname, 0)) { - if (data->fmt == SHORT) + if (data->format == REPLACE_FORMAT_SHORT) printf("%s\n", refname); - else if (data->fmt == MEDIUM) + else if (data->format == REPLACE_FORMAT_MEDIUM) printf("%s -> %s\n", refname, sha1_to_hex(sha1)); - else { /* data->fmt == FULL */ + else { /* data->format == REPLACE_FORMAT_LONG */ unsigned char object[20]; enum object_type obj_type, repl_type; @@ -64,14 +68,14 @@ static int list_replace_refs(const char *pattern, const char *format) data.pattern = pattern; if (format == NULL || *format == '\0' || !strcmp(format, "short")) - data.fmt = SHORT; + data.format = REPLACE_FORMAT_SHORT; else if (!strcmp(format, "medium")) - data.fmt = MEDIUM; - else if (!strcmp(format, "full")) - data.fmt = FULL; + data.format = REPLACE_FORMAT_MEDIUM; + else if (!strcmp(format, "long")) + data.format = REPLACE_FORMAT_LONG; else die("invalid replace format '%s'\n" - "valid formats are 'short', 'medium' and 'full'\n", + "valid formats are 'short', 'medium' and 'long'\n", format); for_each_replace_ref(show_reference, (void *) &data); diff --git a/t/t6050-replace.sh b/t/t6050-replace.sh index d0c62f7539..719a11673b 100755 --- a/t/t6050-replace.sh +++ b/t/t6050-replace.sh @@ -306,7 +306,7 @@ test_expect_success 'test --format medium' ' test_cmp expected actual ' -test_expect_success 'test --format full' ' +test_expect_success 'test --format long' ' { echo "$H1 (commit) -> $BLOB (blob)" && echo "$BLOB (blob) -> $REPLACED (blob)" && @@ -314,7 +314,7 @@ test_expect_success 'test --format full' ' echo "$PARA3 (commit) -> $S (commit)" && echo "$MYTAG (tag) -> $HASH1 (commit)" } | sort >expected && - git replace --format=full | sort > actual && + git replace --format=long | sort > actual && test_cmp expected actual '