Using, e.g., `git -c pager.tag tag -a new-tag` results in errors such as
"Vim: Warning: Output is not to a terminal" and a garbled terminal. A
user who makes use of `git tag -a` and `git tag -l` will probably choose
not to configure `pager.tag` or to set it to "no", so that `git tag -a`
will actually work, at the cost of not getting the pager with `git tag
-l`.

Introduce `pager.tag.list`. Teach git tag to prefer it over `pager.tag`
when running with -l. Update the documentation and add tests. Update an
existing test to use `pager.tag.list` instead of `pager.tag` together
with `git tag -l` since the former is arguably more relevant.

Do not introduce an "else" where we call setup_auto_pager(), although we
could have. Omitting it might keep someone who later implements even
more fine-grained configurations from building a correspondingly
complicated decision tree which carefully ensures that
setup_auto_pager() is called precisely once. A greedy approach such as
the one taken here works just fine.

Noticed-by: Anatoly Borodin <anatoly.boro...@gmail.com>
Suggested-by: Jeff King <p...@peff.net>
Signed-off-by: Martin Ågren <martin.ag...@gmail.com>
---
 Documentation/git-tag.txt |  4 ++++
 builtin/tag.c             |  2 ++
 t/t7006-pager.sh          | 16 +++++++++++++++-
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 1eb15afa1..6ad5811a2 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -101,6 +101,10 @@ patterns may be given; if any of them matches, the tag is 
shown.
 This option is implicitly supplied if any other list-like option such
 as `--contains` is provided. See the documentation for each of those
 options for details.
++
+When determining whether to use a pager, `pager.tag.list` is considered
+before `pager.tag`.
+See linkgit:git-config[1].
 
 --sort=<key>::
        Sort based on the key given.  Prefix `-` to sort in
diff --git a/builtin/tag.c b/builtin/tag.c
index e0f129872..e96ef7d70 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -446,6 +446,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 
        argc = parse_options(argc, argv, prefix, options, git_tag_usage, 0);
 
+       if (cmdmode == 'l')
+               setup_auto_pager("tag.list", 0);
        setup_auto_pager("tag", 0);
 
        if (keyid) {
diff --git a/t/t7006-pager.sh b/t/t7006-pager.sh
index 43cce3694..ed34c6734 100755
--- a/t/t7006-pager.sh
+++ b/t/t7006-pager.sh
@@ -146,9 +146,15 @@ test_expect_success TTY 'git tag -l respects pager.tag' '
        test -e paginated.out
 '
 
+test_expect_success TTY 'git tag -l respects pager.tag.list' '
+       rm -f paginated.out &&
+       test_terminal git -c pager.tag=false -c pager.tag.list tag -l &&
+       test -e paginated.out
+'
+
 test_expect_success TTY 'git tag -l respects --no-pager' '
        rm -f paginated.out &&
-       test_terminal git -c pager.tag --no-pager tag -l &&
+       test_terminal git -c pager.tag.list --no-pager tag -l &&
        ! test -e paginated.out
 '
 
@@ -166,6 +172,14 @@ test_expect_success TTY 'git tag -a respects pager.tag' '
        test -e paginated.out
 '
 
+test_expect_success TTY 'git tag -a ignores pager.tag.list' '
+       test_when_finished "git tag -d newtag" &&
+       rm -f paginated.out &&
+       test_terminal git -c pager.tag -c pager.tag.list=false \
+               tag -am message newtag &&
+       test -e paginated.out
+'
+
 test_expect_success TTY 'git tag -a respects --paginate' '
        test_when_finished "git tag -d newtag" &&
        rm -f paginated.out &&
-- 
2.13.2.653.gfb5159d

Reply via email to