From: Siddh Raman Pant Date: Tue, 19 May 2026 16:30:38 GMT Subject: [PATCH 9/9] t: add tests for external notes command Message-ID: <3a470a117d5e0a7e130eff0d203ed7e3700b5d61.1779207350.git.siddh.raman.pant@oracle.com> In-Reply-To: Assisted-by: Codex:gpt-5.5-xhigh-fast Signed-off-by: Siddh Raman Pant --- t/helper/meson.build | 1 + t/helper/test-external-notes | 64 +++ t/helper/test-notes-external-config-reset.c | 20 + t/helper/test-tool.c | 1 + t/helper/test-tool.h | 1 + t/lib-notes.sh | 19 + t/t3206-range-diff.sh | 68 +++ t/t3301-notes.sh | 437 ++++++++++++++++++++ t/t6120-describe.sh | 17 + 9 files changed, 628 insertions(+) create mode 100755 t/helper/test-external-notes create mode 100644 t/helper/test-notes-external-config-reset.c create mode 100644 t/lib-notes.sh diff --git a/t/helper/meson.build b/t/helper/meson.build index 675e64c0101b..739614b90e78 100644 --- a/t/helper/meson.build +++ b/t/helper/meson.build @@ -35,6 +35,7 @@ test_tool_sources = [ 'test-mergesort.c', 'test-mktemp.c', 'test-name-hash.c', + 'test-notes-external-config-reset.c', 'test-online-cpus.c', 'test-pack-deltas.c', 'test-pack-mtimes.c', diff --git a/t/helper/test-external-notes b/t/helper/test-external-notes new file mode 100755 index 000000000000..5e9dde3977ab --- /dev/null +++ b/t/helper/test-external-notes @@ -0,0 +1,64 @@ +#!/bin/sh + +prefix=${TEST_EXTERNAL_NOTES_PREFIX:-external-notes} +response=${TEST_EXTERNAL_NOTES_RESPONSE:-ok} +line_ending=${TEST_EXTERNAL_NOTES_LINE_ENDING:-lf} +exit_after_response=${TEST_EXTERNAL_NOTES_EXIT_AFTER_RESPONSE:-} +exit_delay=${TEST_EXTERNAL_NOTES_EXIT_DELAY:-} +delay=${TEST_EXTERNAL_NOTES_DELAY:-} +char_delay=${TEST_EXTERNAL_NOTES_CHAR_DELAY:-} +ignore_term=${TEST_EXTERNAL_NOTES_IGNORE_TERM:-} + +newline='\n' +case "$line_ending" in +crlf) + newline='\r\n' + ;; +none) + newline= + ;; +esac + +echo start >>"$prefix-starts" + +test "$ignore_term" = true && trap '' TERM + +emit_output() { + if test -n "$char_delay" + then + LC_ALL=C + payload=$(printf "$@"; printf .) + payload=${payload%.} + + while test -n "$payload" + do + char=${payload%"${payload#?}"} + printf '%s' "$char" || return 1 + payload=${payload#?} + sleep "$char_delay" || return 1 + done + else + printf "$@" + fi +} + +while IFS= read -r commit; do + if test "${TEST_EXTERNAL_NOTES_BODY+x}" = x + then + note=$TEST_EXTERNAL_NOTES_BODY + else + note=$commit + fi + printf "%s\n" "$commit" >>"$prefix-requests" + test -z "$delay" || sleep "$delay" + if test "$response" = missing + then + emit_output "%s missing%b" "$commit" "$newline" + else + emit_output "%s ok %d%b%s%b" \ + "$commit" "${#note}" "$newline" "$note" "$newline" + fi + test "$exit_after_response" = true && break +done + +test -z "$exit_delay" || sleep "$exit_delay" diff --git a/t/helper/test-notes-external-config-reset.c b/t/helper/test-notes-external-config-reset.c new file mode 100644 index 000000000000..1c6b26e3b49a --- /dev/null +++ b/t/helper/test-notes-external-config-reset.c @@ -0,0 +1,20 @@ +#include "test-tool.h" +#include "notes-external.h" + +int cmd__notes_external_config_reset(int argc, const char **argv UNUSED) +{ + if (argc != 1) + die("usage: test-tool notes-external-config-reset"); + + set_external_notes_command("helper"); + set_external_notes_command_name("label"); + set_external_notes_command_timeout_ms(250); + set_external_notes_for_grep(1); + reset_external_notes_command(); + + printf("configured=%d\n", external_notes_command_configured()); + printf("name=%s\n", external_notes_command_name()); + printf("timeout_ms=%d\n", external_notes_command_timeout_ms()); + printf("grep=%d\n", external_notes_for_grep_enabled()); + return 0; +} diff --git a/t/helper/test-tool.c b/t/helper/test-tool.c index a7abc618b388..31bb2d1dca47 100644 --- a/t/helper/test-tool.c +++ b/t/helper/test-tool.c @@ -45,6 +45,7 @@ static struct test_cmd cmds[] = { { "mergesort", cmd__mergesort }, { "mktemp", cmd__mktemp }, { "name-hash", cmd__name_hash }, + { "notes-external-config-reset", cmd__notes_external_config_reset }, { "online-cpus", cmd__online_cpus }, { "pack-deltas", cmd__pack_deltas }, { "pack-mtimes", cmd__pack_mtimes }, diff --git a/t/helper/test-tool.h b/t/helper/test-tool.h index 7f150fa1eb9a..ff25f0a29cf2 100644 --- a/t/helper/test-tool.h +++ b/t/helper/test-tool.h @@ -38,6 +38,7 @@ int cmd__match_trees(int argc, const char **argv); int cmd__mergesort(int argc, const char **argv); int cmd__mktemp(int argc, const char **argv); int cmd__name_hash(int argc, const char **argv); +int cmd__notes_external_config_reset(int argc, const char **argv); int cmd__online_cpus(int argc, const char **argv); int cmd__pack_deltas(int argc, const char **argv); int cmd__pack_mtimes(int argc, const char **argv); diff --git a/t/lib-notes.sh b/t/lib-notes.sh new file mode 100644 index 000000000000..07422540d58f --- /dev/null +++ b/t/lib-notes.sh @@ -0,0 +1,19 @@ +# Helpers for scripts testing notes behavior. + +# notes.externalCommand is run through a shell, so quote the path. +external_notes_command=$( + printf "%s\n" "$TEST_DIRECTORY/helper/test-external-notes" | + sed "s/'/'\\\\''/g; s/^/'/; s/$/'/" +) + +# The helper above is a shell script. Few Windows CI tests (3 out of 10 +# in matrix) are spending more than the production default timeout just +# starting the shell and exchanging the first response, so tests that +# are not about timeout behavior fail. So let us opt into a wider 1s +# deadline for Windows instead of 100ms. +external_notes_command_timeout_config= +if test_have_prereq MINGW +then + _timeout_config="notes.externalCommandTimeoutMs=1000" + external_notes_command_timeout_config="-c $_timeout_config" +fi diff --git a/t/t3206-range-diff.sh b/t/t3206-range-diff.sh index 1e812df806bb..96adeb9bc4fe 100755 --- a/t/t3206-range-diff.sh +++ b/t/t3206-range-diff.sh @@ -6,6 +6,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-notes.sh # Note that because of the range-diff's heuristics, test_commit does more # harm than good. We need some real history. @@ -690,6 +691,37 @@ test_expect_success 'range-diff with --notes=custom does not show default notes' grep "## Notes (custom) ##" actual ' +test_expect_success 'range-diff with --external-notes' ' + topic_oid=$(git rev-parse topic) && + unmodified_oid=$(git rev-parse unmodified) && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + range-diff --no-color --external-notes \ + main..topic main..unmodified >actual && + test_grep "## Notes (external) ##" actual && + test_grep "^ - $topic_oid$" actual && + test_grep "^ + $unmodified_oid$" actual && + ! grep "## Notes ##" actual +' + +test_expect_success 'range-diff with disabled external notes' ' + test_when_finished "git notes remove topic unmodified || :" && + git notes add -m "topic note" topic && + git notes add -m "unmodified note" unmodified && + TEST_EXTERNAL_NOTES_PREFIX=range-diff-external-notes \ + git -c notes.externalCommand="$external_notes_command" \ + range-diff --no-color --external-notes --no-external-notes \ + main..topic main..unmodified >actual && + cat >expect <<-EOF && + 1: $(test_oid t1) = 1: $(test_oid u1) s/5/A/ + 2: $(test_oid t2) = 2: $(test_oid u2) s/4/A/ + 3: $(test_oid t3) = 3: $(test_oid u3) s/11/B/ + 4: $(test_oid t4) = 4: $(test_oid u4) s/12/B/ + EOF + test_cmp expect actual && + test_path_is_missing range-diff-external-notes-starts +' + test_expect_success 'format-patch --range-diff does not compare notes by default' ' test_when_finished "git notes remove topic unmodified || :" && git notes add -m "topic note" topic && @@ -780,6 +812,42 @@ test_expect_success 'format-patch --range-diff with --notes' ' test_cmp expect actual ' +test_expect_success 'format-patch --range-diff with --external-notes' ' + topic_oid=$(git rev-parse topic) && + unmodified_oid=$(git rev-parse unmodified) && + test_when_finished "rm -f 000?-*" && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + format-patch --external-notes --cover-letter --range-diff=$prev \ + main..unmodified >actual && + test_line_count = 5 actual && + test_grep "^Range-diff:$" 0000-* && + test_grep "## Notes (external) ##" 0000-* && + test_grep "^ - $topic_oid$" 0000-* && + test_grep "^ + $unmodified_oid$" 0000-* && + ! grep "## Notes ##" 0000-* +' + +test_expect_success 'format-patch --range-diff with disabled external notes' ' + test_when_finished "git notes remove topic unmodified || :" && + git notes add -m "topic note" topic && + git notes add -m "unmodified note" unmodified && + test_when_finished "rm -f 000?-*" && + TEST_EXTERNAL_NOTES_PREFIX=range-diff-external-notes \ + git -c notes.externalCommand="$external_notes_command" \ + format-patch --external-notes --no-external-notes \ + --cover-letter --range-diff=$prev main..unmodified >actual && + test_line_count = 5 actual && + test_grep "^Range-diff:$" 0000-* && + grep "= 1: .* s/5/A" 0000-* && + grep "= 2: .* s/4/A" 0000-* && + grep "= 3: .* s/11/B" 0000-* && + grep "= 4: .* s/12/B" 0000-* && + ! grep "Notes" 0000-* && + ! grep "note" 0000-* && + test_path_is_missing range-diff-external-notes-starts +' + test_expect_success 'format-patch --range-diff with format.notes config' ' test_when_finished "git notes remove topic unmodified || :" && git notes add -m "topic note" topic && diff --git a/t/t3301-notes.sh b/t/t3301-notes.sh index 27439010dfbc..5a162dff3917 100755 --- a/t/t3301-notes.sh +++ b/t/t3301-notes.sh @@ -6,6 +6,7 @@ test_description='Test commit notes' . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-notes.sh write_script fake_editor <<\EOF echo "$MSG" >"$1" @@ -16,6 +17,11 @@ export GIT_EDITOR indent=" " +run_with_limited_time () ( + { set +x; } 2>/dev/null + "$PERL_PATH" -e 'alarm shift; exec @ARGV' -- "$@" +) + test_expect_success 'cannot annotate non-existing HEAD' ' test_must_fail env MSG=3 git notes add ' @@ -909,6 +915,437 @@ test_expect_success 'displayed notes are used for grep matching' ' test_must_be_empty actual ' +test_expect_success 'notes.externalCommand shows external notes from protected config' ' + commit=$(git rev-parse HEAD) && + parent=$(git rev-parse HEAD^) && + rm -f external-notes-starts external-notes-requests && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log -2 >actual && + test_line_count = 1 external-notes-starts && + { + printf "%s\n" "$commit" && + printf "%s\n" "$parent" + } >expect-requests && + test_cmp expect-requests external-notes-requests && + test_grep "Notes (external):" actual && + test_grep "^ $commit$" actual && + test_grep "^ $parent$" actual +' + +test_expect_success PERL,EXECKEEPSPID 'notes.externalCommand terminates helper during exit cleanup' ' + commit=$(git rev-parse HEAD) && + test_env TEST_EXTERNAL_NOTES_EXIT_DELAY=10 \ + run_with_limited_time 2 \ + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes -1 >actual && + test_grep "^Notes (external):$" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommandName labels external notes' ' + commit=$(git rev-parse HEAD) && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + -c notes.externalCommandName=commit-id log -1 >actual && + test_grep "Notes (commit-id):" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommandName is rendered literally' ' + commit=$(git rev-parse HEAD) && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + -c notes.externalCommandName=refs/notes/commits \ + log --external-notes -1 >actual && + test_grep "^Notes (refs/notes/commits):$" actual && + ! grep "^Notes:$" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommandTimeoutMs rejects negative values' ' + test_must_fail git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=-1 log -1 2>err && + test_grep "notes.externalCommandTimeoutMs must be non-negative" err +' + +test_expect_success 'notes.externalCommandTimeoutMs times out delayed response' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_DELAY=1 \ + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=1 \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success 'notes.externalCommandTimeoutMs applies to whole response' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_BODY=x \ + TEST_EXTERNAL_NOTES_CHAR_DELAY=0.02 \ + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=50 \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success PERL,EXECKEEPSPID 'notes.externalCommandTimeoutMs terminates timed-out helper' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_DELAY=10 \ + run_with_limited_time 2 \ + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=1 \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success PERL,EXECKEEPSPID 'notes.externalCommandTimeoutMs force-kills timed-out helper' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_DELAY=10 \ + TEST_EXTERNAL_NOTES_IGNORE_TERM=true \ + run_with_limited_time 2 \ + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=1 \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success 'notes.externalCommandTimeoutMs=0 disables timeout' ' + commit=$(git rev-parse HEAD) && + test_env TEST_EXTERNAL_NOTES_DELAY=1 \ + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandTimeoutMs=0 \ + log --external-notes -1 >actual && + test_grep "^Notes (external):$" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommand handles CRLF note bodies' ' + body=$(printf "A\r\nB") && + test_env TEST_EXTERNAL_NOTES_BODY="$body" \ + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes -1 >actual && + test_grep "^Notes (external):$" actual && + test_grep "^ B$" actual +' + +test_expect_success 'notes.externalCommand accepts CRLF missing response' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_RESPONSE=missing \ + TEST_EXTERNAL_NOTES_LINE_ENDING=crlf \ + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log -1 >actual && + test_cmp expect actual +' + +test_expect_success 'notes.externalCommand rejects unterminated missing response' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_RESPONSE=missing \ + TEST_EXTERNAL_NOTES_LINE_ENDING=none \ + TEST_EXTERNAL_NOTES_EXIT_AFTER_RESPONSE=true \ + git -c notes.externalCommand="$external_notes_command" \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success PERL,EXECKEEPSPID 'notes.externalCommand rejects unterminated live response without deadlock' ' + git log -1 >expect && + test_env TEST_EXTERNAL_NOTES_RESPONSE=missing \ + TEST_EXTERNAL_NOTES_LINE_ENDING=none \ + run_with_limited_time 2 \ + git -c notes.externalCommand="$external_notes_command" \ + log -1 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + +test_expect_success 'notes.externalCommand accepts CRLF protocol lines' ' + commit=$(git rev-parse HEAD) && + test_env TEST_EXTERNAL_NOTES_LINE_ENDING=crlf \ + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes -1 >actual && + test_grep "^Notes (external):$" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommand missing response shows no external notes' ' + write_script external-notes-missing <<-\EOF && + while IFS= read -r commit + do + printf "%s missing\n" "$commit" + done + EOF + git log -1 >expect && + git -c notes.externalCommand=./external-notes-missing log -1 >actual && + test_cmp expect actual +' + +test_expect_success 'notes.externalCommand empty note shows no external notes' ' + write_script external-notes-empty <<-\EOF && + while IFS= read -r commit + do + printf "%s ok 0\n\n" "$commit" + done + EOF + git log -1 >expect && + git -c notes.externalCommand=./external-notes-empty log -1 >actual && + test_cmp expect actual +' + +test_expect_success 'notes.externalCommand rejects invalid note lengths' ' + write_script external-notes-invalid-length <<-\EOF && + while IFS= read -r commit + do + printf "%s ok %s\n" "$commit" "$1" + done + EOF + git log -2 >expect && + for bad_length in -1 +1 1x x + do + git -c notes.externalCommand="./external-notes-invalid-length $bad_length" \ + log -2 >actual 2>err && + test_cmp expect actual && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err || return 1 + done +' + +test_expect_success 'notes.externalCommand is suppressed by --no-notes' ' + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" log --no-notes -1 >actual && + test_path_is_missing external-notes-starts && + ! grep "Notes (external):" actual +' + +test_expect_success 'notes.externalCommand is suppressed by --no-external-notes' ' + rm -f external-notes-starts && + git log -1 >expect && + git -c notes.externalCommand="$external_notes_command" \ + log --no-external-notes -1 >actual && + test_cmp expect actual && + test_path_is_missing external-notes-starts +' + +test_expect_success 'notes.externalCommand combines with explicit notes ref' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --notes=other --external-notes -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes (other):" actual && + test_grep "^ other note$" actual && + test_grep "Notes (external):" actual && + test_grep "^ $commit$" actual && + ! grep "^ order test$" actual +' + +test_expect_success '--show-notes=ref remains additive after --external-notes' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes --show-notes=other -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "^Notes:$" actual && + test_grep "^ order test$" actual && + test_grep "^Notes (other):$" actual && + test_grep "^ other note$" actual && + test_grep "^Notes (external):$" actual && + test_grep "^ $commit$" actual +' + +test_expect_success 'notes.externalCommand can be enabled without default notes refs' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes (external):" actual && + test_grep "^ $commit$" actual && + ! grep "^ order test$" actual && + ! grep "^ other note$" actual +' + +test_expect_success 'notes.externalCommand combines with default notes refs' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --external-notes --notes -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes:" actual && + test_grep "^ order test$" actual && + test_grep "Notes (external):" actual && + test_grep "^ $commit$" actual && + ! grep "^ other note$" actual +' + +test_expect_success 'notes.externalCommand obeys last --external-notes option' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git log --no-notes -1 >expect && + git -c notes.externalCommand="$external_notes_command" \ + log --external-notes --no-external-notes -1 >actual && + test_cmp expect actual && + test_path_is_missing external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log --notes=other --no-external-notes --external-notes -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes (other):" actual && + test_grep "^ other note$" actual && + test_grep "Notes (external):" actual && + test_grep "^ $commit$" actual && + ! grep "^ order test$" actual +' + +test_expect_success 'notes.externalCommand honors raw notes formatting' ' + commit=$(git rev-parse HEAD) && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + show -s --format=%N >actual && + test_grep "^$commit$" actual && + ! grep "Notes (external):" actual +' + +test_expect_success 'format-patch --external-notes includes external notes only' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + format-patch --external-notes -1 --stdout >actual && + test_line_count = 1 external-notes-starts && + test_grep "^Notes (external):" actual && + test_grep "^ $commit$" actual && + ! grep "^ order test$" actual +' + +test_expect_success 'notes.externalCommand is not used for grep matching' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + log --grep="$commit" >actual && + test_must_be_empty actual && + test_path_is_missing external-notes-starts +' + +test_expect_success 'notes.externalCommandForGrep includes external notes in grep matching' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + -c notes.externalCommandForGrep=true \ + log --grep="$commit" -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes (external):" actual +' + +test_expect_success 'notes.externalCommandForGrep does not search hidden notes' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandForGrep=true \ + log --oneline --grep="$commit" -1 >actual && + test_must_be_empty actual && + test_path_is_missing external-notes-starts +' + +test_expect_success 'notes.externalCommandForGrep honors --no-external-notes' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + -c notes.externalCommandForGrep=true \ + log --no-external-notes --grep="$commit" -1 >actual && + test_must_be_empty actual && + test_path_is_missing external-notes-starts +' + +test_expect_success 'notes.externalCommandForGrep combines with explicit notes ref' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + -c notes.externalCommandForGrep=true \ + log --notes=other --external-notes --grep="$commit" -1 >actual && + test_line_count = 1 external-notes-starts && + test_grep "Notes (external):" actual && + test_grep "Notes (other):" actual && + ! grep "^ order test$" actual +' + +test_expect_success 'notes.externalCommandForGrep is ignored from local config' ' + commit=$(git rev-parse HEAD) && + rm -f external-notes-starts && + test_config notes.externalCommandForGrep true && + git -c notes.externalCommand="$external_notes_command" \ + log --grep="$commit" >actual && + test_must_be_empty actual && + test_path_is_missing external-notes-starts +' + +test_expect_success 'notes.externalCommand is not used with explicit notes ref' ' + rm -f external-notes-starts && + git -c notes.externalCommand="$external_notes_command" log --notes=other -1 >actual && + test_path_is_missing external-notes-starts && + ! grep "Notes (external):" actual +' + +test_expect_success 'notes.externalCommand is ignored from local config' ' + rm -f external-notes-starts && + test_config notes.externalCommand "$external_notes_command" && + git log -1 >actual && + test_path_is_missing external-notes-starts && + ! grep "Notes (external):" actual +' + +test_expect_success 'notes.externalCommandName is ignored from local config' ' + test_config notes.externalCommandName local && + git -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + log -1 >actual && + test_grep "Notes (external):" actual && + ! grep "Notes (local):" actual +' + +test_expect_success 'reset_external_notes_command clears cached helper config' ' + test-tool notes-external-config-reset >actual && + cat >expect <<-\EOF && + configured=0 + name=external + timeout_ms=100 + grep=0 + EOF + test_cmp expect actual +' + +test_expect_success 'notes.externalCommand warning is shown once' ' + write_script external-notes-fail <<-\EOF && + while IFS= read -r commit + do + printf "%s-mismatch missing\n" "$commit" + done + EOF + git -c notes.externalCommand=./external-notes-fail log -2 >actual 2>err && + test_grep "notes.externalCommand failed" err && + test_line_count = 1 err +' + test_expect_success 'Allow notes on non-commits (trees, blobs, tags)' ' test_config core.notesRef refs/notes/other && echo "Note on a tree" >expect && diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh index 8ee3d2c37d02..abbdb42dc9f7 100755 --- a/t/t6120-describe.sh +++ b/t/t6120-describe.sh @@ -15,6 +15,7 @@ GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME . ./test-lib.sh +. "$TEST_DIRECTORY"/lib-notes.sh check_describe () { indir= && @@ -867,6 +868,22 @@ test_expect_success 'format-rev with %N (note)' ' test_cmp expect actual ' +test_expect_success 'format-rev with %N uses external notes' ' + commit=$(git -C repo-format rev-parse HEAD) && + rm -f repo-format/format-rev-external-notes-starts \ + repo-format/format-rev-external-notes-requests && + printf "%s\n" "$commit" >input && + printf "%s\n\n" "$commit" >expect && + TEST_EXTERNAL_NOTES_PREFIX=format-rev-external-notes \ + git -C repo-format -c notes.externalCommand="$external_notes_command" \ + $external_notes_command_timeout_config \ + format-rev --stdin-mode=text --format="tformat:%N" \ + actual && + test_line_count = 1 repo-format/format-rev-external-notes-starts && + test_cmp input repo-format/format-rev-external-notes-requests && + test_cmp expect actual +' + test_expect_success 'format-rev --notes (custom notes ref)' ' # One custom notes ref test_when_finished "git -C repo-format notes remove" && -- 2.53.0