Merge branch 'ma/config-page-only-in-list-mode'
authorJunio C Hamano <gitster@pobox.com>
Wed, 21 Mar 2018 18:30:09 +0000 (11:30 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 21 Mar 2018 18:30:09 +0000 (11:30 -0700)
In a way similar to how "git tag" learned to honor the pager
setting only in the list mode, "git config" learned to ignore the
pager setting when it is used for setting values (i.e. when the
purpose of the operation is not to "show").

* ma/config-page-only-in-list-mode:
config: change default of `pager.config` to "on"
config: respect `pager.config` in list/get-mode only
t7006: add tests for how git config paginates

Documentation/git-config.txt
builtin/config.c
git.c
t/t7006-pager.sh
index 14da5fc157ee0ea7467e7b9bd9d33d465c1f7a3f..e09ed5d7d5147d93039c479efc8ab450bf5ca8b4 100644 (file)
@@ -233,6 +233,12 @@ See also <<FILES>>.
        using `--file`, `--global`, etc) and `on` when searching all
        config files.
 
+CONFIGURATION
+-------------
+`pager.config` is only respected when listing configuration, i.e., when
+using `--list` or any of the `--get-*` which may return multiple results.
+The default is to use a pager.
+
 [[FILES]]
 FILES
 -----
index ab5f95476e6c726798fd84b4a6300577bf0fafba..01169dd628b24a7b5502550a6342ab73cb8154c5 100644 (file)
@@ -48,6 +48,13 @@ static int show_origin;
 #define ACTION_GET_COLORBOOL (1<<14)
 #define ACTION_GET_URLMATCH (1<<15)
 
+/*
+ * The actions "ACTION_LIST | ACTION_GET_*" which may produce more than
+ * one line of output and which should therefore be paged.
+ */
+#define PAGING_ACTIONS (ACTION_LIST | ACTION_GET_ALL | \
+                       ACTION_GET_REGEXP | ACTION_GET_URLMATCH)
+
 #define TYPE_BOOL (1<<0)
 #define TYPE_INT (1<<1)
 #define TYPE_BOOL_OR_INT (1<<2)
@@ -594,6 +601,9 @@ int cmd_config(int argc, const char **argv, const char *prefix)
                usage_with_options(builtin_config_usage, builtin_config_options);
        }
 
+       if (actions & PAGING_ACTIONS)
+               setup_auto_pager("config", 1);
+
        if (actions == ACTION_LIST) {
                check_argc(argc, 0, 0);
                if (config_with_options(show_all_config, NULL,
diff --git a/git.c b/git.c
index 96cd734f1282161eebde954f7e638cf8dd8c3516..ceaa58ef40e536f1290cce3ad1223004063e41a6 100644 (file)
--- a/git.c
+++ b/git.c
@@ -389,7 +389,7 @@ static struct cmd_struct commands[] = {
        { "column", cmd_column, RUN_SETUP_GENTLY },
        { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE },
        { "commit-tree", cmd_commit_tree, RUN_SETUP },
-       { "config", cmd_config, RUN_SETUP_GENTLY },
+       { "config", cmd_config, RUN_SETUP_GENTLY | DELAY_PAGER_CONFIG },
        { "count-objects", cmd_count_objects, RUN_SETUP },
        { "credential", cmd_credential, RUN_SETUP_GENTLY },
        { "describe", cmd_describe, RUN_SETUP },
index f5f46a95b4be9bca4ca30e70cbe75051a191c96a..7541ba5edbcae1f1555c367b7f8bfc795913ff60 100755 (executable)
@@ -110,13 +110,6 @@ test_expect_success TTY 'configuration can disable pager' '
        ! test -e paginated.out
 '
 
-test_expect_success TTY 'git config uses a pager if configured to' '
-       rm -f paginated.out &&
-       test_config pager.config true &&
-       test_terminal git config --list &&
-       test -e paginated.out
-'
-
 test_expect_success TTY 'configuration can enable pager (from subdir)' '
        rm -f paginated.out &&
        mkdir -p subdir &&
@@ -252,6 +245,48 @@ test_expect_success TTY 'git branch --set-upstream-to ignores pager.branch' '
        ! test -e paginated.out
 '
 
+test_expect_success TTY 'git config ignores pager.config when setting' '
+       rm -f paginated.out &&
+       test_terminal git -c pager.config config foo.bar bar &&
+       ! test -e paginated.out
+'
+
+test_expect_success TTY 'git config --edit ignores pager.config' '
+       rm -f paginated.out editor.used &&
+       write_script editor <<-\EOF &&
+               touch editor.used
+       EOF
+       EDITOR=./editor test_terminal git -c pager.config config --edit &&
+       ! test -e paginated.out &&
+       test -e editor.used
+'
+
+test_expect_success TTY 'git config --get ignores pager.config' '
+       rm -f paginated.out &&
+       test_terminal git -c pager.config config --get foo.bar &&
+       ! test -e paginated.out
+'
+
+test_expect_success TTY 'git config --get-urlmatch defaults to paging' '
+       rm -f paginated.out &&
+       test_terminal git -c http."https://foo.com/".bar=foo \
+                         config --get-urlmatch http https://foo.com &&
+       test -e paginated.out
+'
+
+test_expect_success TTY 'git config --get-all respects pager.config' '
+       rm -f paginated.out &&
+       test_terminal git -c pager.config=false config --get-all foo.bar &&
+       ! test -e paginated.out
+'
+
+test_expect_success TTY 'git config --list defaults to paging' '
+       rm -f paginated.out &&
+       test_terminal git config --list &&
+       test -e paginated.out
+'
+
+
 # A colored commit log will begin with an appropriate ANSI escape
 # for the first color; the text "commit" comes later.
 colorful() {