From 65b4ad82b81e1a1f4afbb7f4974384d7db479c0a Mon Sep 17 00:00:00 2001 From: Linus Arver Date: Fri, 15 Mar 2024 06:55:01 +0000 Subject: [PATCH] format_trailer_info(): use trailer_item objects This is another preparatory refactor to unify the trailer formatters. Make format_trailer_info() operate on trailer_item objects, not the raw string array. We will continue to make improvements, culminating in the renaming of format_trailer_info() to format_trailers(), at which point the unification of these formatters will be complete. In order to avoid breaking t4205 and t6300, flip *_success to *_failure in the affected test cases. Add a temporary "test_trailer_option_expect_failure" wrapper which we will use along with "test_expect_failure" in the next commit to avoid breaking tests. When the dust settles with the refactors a few more commits later, we will drop the use of *_failure to make the tests truly pass again. When the preparatory refactors are complete, we'll be able to drop the use of *_failure that we introduce here. Signed-off-by: Linus Arver Signed-off-by: Junio C Hamano --- t/t4205-log-pretty-formats.sh | 12 ++++++------ t/t6300-for-each-ref.sh | 16 ++++++++++++++-- trailer.c | 21 ++++++++++----------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh index e3d655e6b8..339e0c892e 100755 --- a/t/t4205-log-pretty-formats.sh +++ b/t/t4205-log-pretty-formats.sh @@ -675,7 +675,7 @@ test_expect_success '%(trailers:only=no,only=true) shows only "key: value" trail test_cmp expect actual ' -test_expect_success '%(trailers:unfold) unfolds trailers' ' +test_expect_failure '%(trailers:unfold) unfolds trailers' ' git log --no-walk --pretty="%(trailers:unfold)" >actual && { unfold actual && { echo "Acked-by: A U Thor " && @@ -752,7 +752,7 @@ test_expect_success '%(trailers:key) without value is error' ' test_cmp expect actual ' -test_expect_success '%(trailers:keyonly) shows only keys' ' +test_expect_failure '%(trailers:keyonly) shows only keys' ' git log --no-walk --pretty="format:%(trailers:keyonly)" >actual && test_write_lines \ "Signed-off-by" \ @@ -774,7 +774,7 @@ test_expect_success '%(trailers:key=foo,valueonly) shows only value' ' test_cmp expect actual ' -test_expect_success '%(trailers:valueonly) shows only values' ' +test_expect_failure '%(trailers:valueonly) shows only values' ' git log --no-walk --pretty="format:%(trailers:valueonly)" >actual && test_write_lines \ "A U Thor " \ @@ -813,7 +813,7 @@ test_expect_success 'pretty format %(trailers:separator=X,unfold) changes separa test_cmp expect actual ' -test_expect_success 'pretty format %(trailers:key_value_separator) changes key-value separator' ' +test_expect_failure 'pretty format %(trailers:key_value_separator) changes key-value separator' ' git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00)X" >actual && ( printf "XSigned-off-by\0A U Thor \n" && @@ -824,7 +824,7 @@ test_expect_success 'pretty format %(trailers:key_value_separator) changes key-v test_cmp expect actual ' -test_expect_success 'pretty format %(trailers:key_value_separator,unfold) changes key-value separator' ' +test_expect_failure 'pretty format %(trailers:key_value_separator,unfold) changes key-value separator' ' git log --no-walk --pretty=format:"X%(trailers:key_value_separator=%x00,unfold)X" >actual && ( printf "XSigned-off-by\0A U Thor \n" && diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh index eb6c8204e8..2688dcc7b9 100755 --- a/t/t6300-for-each-ref.sh +++ b/t/t6300-for-each-ref.sh @@ -1446,7 +1446,19 @@ test_trailer_option () { ' } -test_trailer_option '%(trailers:unfold) unfolds trailers' \ +# Just like test_trailer_option, but expect failure instead of success. +test_trailer_option_expect_failure () { + title=$1 option=$2 + cat >expect + test_expect_failure "$title" ' + git for-each-ref --format="%($option)" refs/heads/main >actual && + test_cmp expect actual && + git for-each-ref --format="%(contents:$option)" refs/heads/main >actual && + test_cmp expect actual + ' +} + +test_trailer_option_expect_failure '%(trailers:unfold) unfolds trailers' \ 'trailers:unfold' <<-EOF $(unfold $(grep patch.description len; - size_t i; - - for (i = 0; i < info->trailer_nr; i++) { - char *trailer = info->trailers[i]; - ssize_t separator_pos = find_separator(trailer, separators); + struct list_head *pos; + struct trailer_item *item; - if (separator_pos >= 1) { + list_for_each(pos, trailers) { + item = list_entry(pos, struct trailer_item, list); + if (item->token) { struct strbuf tok = STRBUF_INIT; struct strbuf val = STRBUF_INIT; + strbuf_addstr(&tok, item->token); + strbuf_addstr(&val, item->value); - parse_trailer(&tok, &val, NULL, trailer, separator_pos); if (!opts->filter || opts->filter(&tok, opts->filter_data)) { if (opts->unfold) unfold_value(&val); @@ -1126,13 +1126,12 @@ static void format_trailer_info(const struct process_trailer_options *opts, if (opts->separator && out->len != origlen) { strbuf_addbuf(out, opts->separator); } - strbuf_addstr(out, trailer); + strbuf_addstr(out, item->value); if (opts->separator) { strbuf_rtrim(out); } } } - } void format_trailers_from_commit(const struct process_trailer_options *opts, @@ -1151,7 +1150,7 @@ void format_trailers_from_commit(const struct process_trailer_options *opts, strbuf_add(out, msg + info.trailer_block_start, info.trailer_block_end - info.trailer_block_start); } else - format_trailer_info(opts, &info, out); + format_trailer_info(opts, &trailer_objects, out); free_trailers(&trailer_objects); trailer_info_release(&info); -- 2.39.5