From d6bf6527ebfab4899d52d5662f3c5054195e6415 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Mon, 16 Sep 2024 15:12:06 -0700 Subject: [PATCH] Revert "Merge branch 'jc/patch-id' into maint-2.46" This reverts commit 41c952ebacf7e3369e7bee721f768114d65e50c4, reversing changes made to 712d970c0145b95ce655773e7cd1676f09dfd215. Keeping a known breakage for now is better than introducing new regression(s). --- builtin/patch-id.c | 93 ++++++++++++----------------------------------------- t/t4204-patch-id.sh | 40 ----------------------- 2 files changed, 21 insertions(+), 112 deletions(-) diff --git a/builtin/patch-id.c b/builtin/patch-id.c index 35c1179f7e..d790ae6354 100644 --- a/builtin/patch-id.c +++ b/builtin/patch-id.c @@ -7,9 +7,10 @@ #include "parse-options.h" #include "setup.h" -static void flush_current_id(struct object_id *id, struct object_id *result) +static void flush_current_id(int patchlen, struct object_id *id, struct object_id *result) { - printf("%s %s\n", oid_to_hex(result), oid_to_hex(id)); + if (patchlen) + printf("%s %s\n", oid_to_hex(result), oid_to_hex(id)); } static int remove_space(char *line) @@ -59,27 +60,9 @@ static int scan_hunk_header(const char *p, int *p_before, int *p_after) return 1; } -/* - * flag bits to control get_one_patchid()'s behaviour. - * - * STABLE/VERBATIM are given from the command line option as - * --stable/--verbatim. FIND_HEADER conveys the internal state - * maintained by the caller to allow the function to avoid mistaking - * lines of log message before seeing the "diff" part as the beginning - * of the next patch. - */ -enum { - GOPID_STABLE = (1<<0), /* --stable */ - GOPID_VERBATIM = (1<<1), /* --verbatim */ - GOPID_FIND_HEADER = (1<<2), /* stop at the beginning of patch message */ -}; - static int get_one_patchid(struct object_id *next_oid, struct object_id *result, - struct strbuf *line_buf, unsigned flags) + struct strbuf *line_buf, int stable, int verbatim) { - int stable = flags & GOPID_STABLE; - int verbatim = flags & GOPID_VERBATIM; - int find_header = flags & GOPID_FIND_HEADER; int patchlen = 0, found_next = 0; int before = -1, after = -1; int diff_is_binary = 0; @@ -94,40 +77,24 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result, const char *p = line; int len; - /* - * The caller hasn't seen us find a patch header and - * return to it, or we have started processing patch - * and may encounter the beginning of the next patch. - */ - if (find_header) { - /* - * If we see a line that begins with "", - * "commit " or "From ", it is - * the beginning of a patch. Return to the caller, as - * we are done with the one we have been processing. - */ - if (skip_prefix(line, "commit ", &p)) - ; - else if (skip_prefix(line, "From ", &p)) - ; - if (!get_oid_hex(p, next_oid)) { - if (verbatim) - the_hash_algo->update_fn(&ctx, line, strlen(line)); - found_next = 1; - break; - } + /* Possibly skip over the prefix added by "log" or "format-patch" */ + if (!skip_prefix(line, "commit ", &p) && + !skip_prefix(line, "From ", &p) && + starts_with(line, "\\ ") && 12 < strlen(line)) { + if (verbatim) + the_hash_algo->update_fn(&ctx, line, strlen(line)); + continue; + } + + if (!get_oid_hex(p, next_oid)) { + found_next = 1; + break; } /* Ignore commit comments */ if (!patchlen && !starts_with(line, "diff ")) continue; - /* - * We are past the commit log message. Prepare to - * stop at the beginning of the next patch header. - */ - find_header = 1; - /* Parsing diff header? */ if (before == -1) { if (starts_with(line, "GIT binary patch") || @@ -160,16 +127,6 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result, break; } - /* - * A hunk about an incomplete line may have this - * marker at the end, which should just be ignored. - */ - if (starts_with(line, "\\ ") && 12 < strlen(line)) { - if (verbatim) - the_hash_algo->update_fn(&ctx, line, strlen(line)); - continue; - } - if (diff_is_binary) { if (starts_with(line, "diff ")) { diff_is_binary = 0; @@ -216,20 +173,17 @@ static int get_one_patchid(struct object_id *next_oid, struct object_id *result, return patchlen; } -static void generate_id_list(unsigned flags) +static void generate_id_list(int stable, int verbatim) { struct object_id oid, n, result; int patchlen; struct strbuf line_buf = STRBUF_INIT; oidclr(&oid, the_repository->hash_algo); - flags |= GOPID_FIND_HEADER; while (!feof(stdin)) { - patchlen = get_one_patchid(&n, &result, &line_buf, flags); - if (patchlen) - flush_current_id(&oid, &result); + patchlen = get_one_patchid(&n, &result, &line_buf, stable, verbatim); + flush_current_id(patchlen, &oid, &result); oidcpy(&oid, &n); - flags &= ~GOPID_FIND_HEADER; } strbuf_release(&line_buf); } @@ -265,7 +219,6 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix) /* if nothing is set, default to unstable */ struct patch_id_opts config = {0, 0}; int opts = 0; - unsigned flags = 0; struct option builtin_patch_id_options[] = { OPT_CMDMODE(0, "unstable", &opts, N_("use the unstable patch-id algorithm"), 1), @@ -297,11 +250,7 @@ int cmd_patch_id(int argc, const char **argv, const char *prefix) if (!the_hash_algo) repo_set_hash_algo(the_repository, GIT_HASH_SHA1); - if (opts ? opts > 1 : config.stable) - flags |= GOPID_STABLE; - if (opts ? opts == 3 : config.verbatim) - flags |= GOPID_VERBATIM; - generate_id_list(flags); - + generate_id_list(opts ? opts > 1 : config.stable, + opts ? opts == 3 : config.verbatim); return 0; } diff --git a/t/t4204-patch-id.sh b/t/t4204-patch-id.sh index dc8ddb10af..605faea0c7 100755 --- a/t/t4204-patch-id.sh +++ b/t/t4204-patch-id.sh @@ -114,46 +114,6 @@ test_expect_success 'patch-id supports git-format-patch output' ' test "$2" = $(git rev-parse HEAD) ' -test_expect_success 'patch-id computes the same for various formats' ' - # This test happens to consider "git log -p -1" output - # the canonical input format, so use it as the norm. - git log -1 -p same >log-p.output && - git patch-id expect && - - # format-patch begins with "From " - git format-patch -1 --stdout same >format-patch.output && - git patch-id actual && - test_cmp actual expect && - - # "diff-tree --stdin -p" begins with "" - same=$(git rev-parse same) && - echo $same | git diff-tree --stdin -p >diff-tree.output && - git patch-id actual && - test_cmp actual expect && - - # "diff-tree --stdin -v -p" begins with "commit " - echo $same | git diff-tree --stdin -p -v >diff-tree-v.output && - git patch-id actual && - test_cmp actual expect -' - -hash=$(git rev-parse same:) -for cruft in "$hash" "commit $hash is bad" "From $hash status" -do - test_expect_success "patch-id with <$cruft> in log message" ' - git format-patch -1 --stdout same >patch-0 && - git patch-id expect && - - { - sed -e "/^$/q" patch-0 && - printf "random message\n%s\n\n" "$cruft" && - sed -e "1,/^$/d" patch-0 - } >patch-cruft && - git patch-id actual && - test_cmp actual expect - ' -done - test_expect_success 'whitespace is irrelevant in footer' ' get_patch_id main && git checkout same && -- 2.11.4.GIT