The `init` and `clone` commands create their own .git/ directory,
therefore we must be careful not to read any repository config when
determining the pager settings.

Signed-off-by: Johannes Schindelin <johannes.schinde...@gmx.de>
---
 builtin/am.c    |  2 +-
 builtin/blame.c |  2 +-
 builtin/grep.c  |  4 ++--
 builtin/log.c   |  4 ++--
 builtin/var.c   |  2 +-
 cache.h         |  9 +++++----
 config.c        |  4 ++--
 diff.c          |  4 ++--
 git.c           | 16 ++++++++--------
 pager.c         | 13 +++++++------
 10 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 6981f42ce9..e6c2ee01bc 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1791,7 +1791,7 @@ static int do_interactive(struct am_state *state)
                        }
                        strbuf_release(&msg);
                } else if (*reply == 'v' || *reply == 'V') {
-                       const char *pager = git_pager(1);
+                       const char *pager = git_pager(1, 1);
                        struct child_process cp = CHILD_PROCESS_INIT;
 
                        if (!pager)
diff --git a/builtin/blame.c b/builtin/blame.c
index 4ddfadb71f..5b7daa3686 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -2913,7 +2913,7 @@ int cmd_blame(int argc, const char **argv, const char 
*prefix)
        assign_blame(&sb, opt);
 
        if (!incremental)
-               setup_pager();
+               setup_pager(1);
 
        free(final_commit_name);
 
diff --git a/builtin/grep.c b/builtin/grep.c
index 8887b6addb..363a753369 100644
--- a/builtin/grep.c
+++ b/builtin/grep.c
@@ -800,7 +800,7 @@ int cmd_grep(int argc, const char **argv, const char 
*prefix)
        }
 
        if (show_in_pager == default_pager)
-               show_in_pager = git_pager(1);
+               show_in_pager = git_pager(1, 1);
        if (show_in_pager) {
                opt.color = 0;
                opt.name_only = 1;
@@ -896,7 +896,7 @@ int cmd_grep(int argc, const char **argv, const char 
*prefix)
        }
 
        if (!show_in_pager && !opt.status_only)
-               setup_pager();
+               setup_pager(1);
 
        if (!use_index && (untracked || cached))
                die(_("--cached or --untracked cannot be used with 
--no-index."));
diff --git a/builtin/log.c b/builtin/log.c
index 55d20cc2d8..96618d38cb 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -203,7 +203,7 @@ static void cmd_log_init_finish(int argc, const char 
**argv, const char *prefix,
        if (rev->line_level_traverse)
                line_log_init(rev, line_cb.prefix, &line_cb.args);
 
-       setup_pager();
+       setup_pager(1);
 }
 
 static void cmd_log_init(int argc, const char **argv, const char *prefix,
@@ -1600,7 +1600,7 @@ int cmd_format_patch(int argc, const char **argv, const 
char *prefix)
        if (!use_stdout)
                output_directory = set_outdir(prefix, output_directory);
        else
-               setup_pager();
+               setup_pager(1);
 
        if (output_directory) {
                if (rev.diffopt.use_color != GIT_COLOR_ALWAYS)
diff --git a/builtin/var.c b/builtin/var.c
index aedbb53a2d..879867b842 100644
--- a/builtin/var.c
+++ b/builtin/var.c
@@ -19,7 +19,7 @@ static const char *editor(int flag)
 
 static const char *pager(int flag)
 {
-       const char *pgm = git_pager(1);
+       const char *pgm = git_pager(1, 1);
 
        if (!pgm)
                pgm = "cat";
diff --git a/cache.h b/cache.h
index 96e0cb2523..6627239de8 100644
--- a/cache.h
+++ b/cache.h
@@ -1325,7 +1325,7 @@ extern const char *fmt_name(const char *name, const char 
*email);
 extern const char *ident_default_name(void);
 extern const char *ident_default_email(void);
 extern const char *git_editor(void);
-extern const char *git_pager(int stdout_is_tty);
+extern const char *git_pager(int stdout_is_tty, int discover_git_dir);
 extern int git_ident_config(const char *, const char *, void *);
 extern void reset_ident_date(void);
 
@@ -1692,7 +1692,8 @@ extern int git_config_from_mem(config_fn_t fn, const enum 
config_origin_type,
                                        const char *name, const char *buf, 
size_t len, void *data);
 extern void git_config_push_parameter(const char *text);
 extern int git_config_from_parameters(config_fn_t fn, void *data);
-extern void read_early_config(config_fn_t cb, void *data);
+extern void read_early_config(config_fn_t cb, void *data,
+                             int discover_git_dir);
 extern void git_config(config_fn_t fn, void *);
 extern int git_config_with_options(config_fn_t fn, void *,
                                   struct git_config_source *config_source,
@@ -1888,12 +1889,12 @@ __attribute__((format (printf, 2, 3)))
 extern void write_file(const char *path, const char *fmt, ...);
 
 /* pager.c */
-extern void setup_pager(void);
+extern void setup_pager(int discover_git_dir);
 extern int pager_in_use(void);
 extern int pager_use_color;
 extern int term_columns(void);
 extern int decimal_width(uintmax_t);
-extern int check_pager_config(const char *cmd);
+extern int check_pager_config(const char *cmd, int discover_git_dir);
 extern void prepare_pager_args(struct child_process *, const char *pager);
 
 extern const char *editor_program;
diff --git a/config.c b/config.c
index 104c3c3dcd..4c756edca1 100644
--- a/config.c
+++ b/config.c
@@ -1385,7 +1385,7 @@ static void configset_iter(struct config_set *cs, 
config_fn_t fn, void *data)
        }
 }
 
-void read_early_config(config_fn_t cb, void *data)
+void read_early_config(config_fn_t cb, void *data, int discover_git_dir)
 {
        git_config_with_options(cb, data, NULL, 1);
 
@@ -1407,7 +1407,7 @@ void read_early_config(config_fn_t cb, void *data)
         * valid repository), and would rarely make things worse (i.e., you do
         * not generally have a .git/config file sitting around).
         */
-       if (!have_git_dir()) {
+       if (discover_git_dir && !have_git_dir()) {
                struct git_config_source repo_config;
 
                memset(&repo_config, 0, sizeof(repo_config));
diff --git a/diff.c b/diff.c
index ec8728362d..0769c0590a 100644
--- a/diff.c
+++ b/diff.c
@@ -5267,6 +5267,6 @@ void setup_diff_pager(struct diff_options *opt)
         * --exit-code" in hooks and other scripts, we do not do so.
         */
        if (!DIFF_OPT_TST(opt, EXIT_WITH_STATUS) &&
-           check_pager_config("diff") != 0)
-               setup_pager();
+           check_pager_config("diff", 1) != 0)
+               setup_pager(1);
 }
diff --git a/git.c b/git.c
index 61df78afc8..2b007b83ec 100644
--- a/git.c
+++ b/git.c
@@ -61,13 +61,13 @@ static void restore_env(int external_alias)
        }
 }
 
-static void commit_pager_choice(void) {
+static void commit_pager_choice(int discover_git_dir) {
        switch (use_pager) {
        case 0:
                setenv("GIT_PAGER", "cat", 1);
                break;
        case 1:
-               setup_pager();
+               setup_pager(discover_git_dir);
                break;
        default:
                break;
@@ -261,7 +261,7 @@ static int handle_alias(int *argcp, const char ***argv)
                if (alias_string[0] == '!') {
                        struct child_process child = CHILD_PROCESS_INIT;
 
-                       commit_pager_choice();
+                       commit_pager_choice(1);
                        restore_env(1);
 
                        child.use_shell = 1;
@@ -349,7 +349,7 @@ static int run_builtin(struct cmd_struct *p, int argc, 
const char **argv)
                }
 
                if (use_pager == -1 && p->option & (RUN_SETUP | 
RUN_SETUP_GENTLY))
-                       use_pager = check_pager_config(p->cmd);
+                       use_pager = check_pager_config(p->cmd, !(p->option & 
CREATES_GIT_DIR));
                if (use_pager == -1 && p->option & USE_PAGER)
                        use_pager = 1;
 
@@ -357,7 +357,7 @@ static int run_builtin(struct cmd_struct *p, int argc, 
const char **argv)
                    startup_info->have_repository) /* get_git_dir() may set up 
repo, avoid that */
                        trace_repo_setup(prefix);
        }
-       commit_pager_choice();
+       commit_pager_choice(!(p->option & CREATES_GIT_DIR));
 
        if (!help && get_super_prefix()) {
                if (!(p->option & SUPPORT_SUPER_PREFIX))
@@ -584,8 +584,8 @@ static void execv_dashed_external(const char **argv)
                die("%s doesn't support --super-prefix", argv[0]);
 
        if (use_pager == -1)
-               use_pager = check_pager_config(argv[0]);
-       commit_pager_choice();
+               use_pager = check_pager_config(argv[0], 1);
+       commit_pager_choice(1);
 
        strbuf_addf(&cmd, "git-%s", argv[0]);
 
@@ -688,7 +688,7 @@ int cmd_main(int argc, const char **argv)
                skip_prefix(argv[0], "--", &argv[0]);
        } else {
                /* The user didn't specify a command; give them help */
-               commit_pager_choice();
+               commit_pager_choice(1);
                printf("usage: %s\n\n", git_usage_string);
                list_common_cmds_help();
                printf("\n%s\n", _(git_more_info_string));
diff --git a/pager.c b/pager.c
index 73ca8bc3b1..16b3cbe232 100644
--- a/pager.c
+++ b/pager.c
@@ -43,7 +43,7 @@ static int core_pager_config(const char *var, const char 
*value, void *data)
        return 0;
 }
 
-const char *git_pager(int stdout_is_tty)
+const char *git_pager(int stdout_is_tty, int discover_git_dir)
 {
        const char *pager;
 
@@ -53,7 +53,8 @@ const char *git_pager(int stdout_is_tty)
        pager = getenv("GIT_PAGER");
        if (!pager) {
                if (!pager_program)
-                       read_early_config(core_pager_config, NULL);
+                       read_early_config(core_pager_config, NULL,
+                                         discover_git_dir);
                pager = pager_program;
        }
        if (!pager)
@@ -100,9 +101,9 @@ void prepare_pager_args(struct child_process 
*pager_process, const char *pager)
        setup_pager_env(&pager_process->env_array);
 }
 
-void setup_pager(void)
+void setup_pager(int discover_git_dir)
 {
-       const char *pager = git_pager(isatty(1));
+       const char *pager = git_pager(isatty(1), discover_git_dir);
 
        if (!pager)
                return;
@@ -208,7 +209,7 @@ static int pager_command_config(const char *var, const char 
*value, void *vdata)
 }
 
 /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */
-int check_pager_config(const char *cmd)
+int check_pager_config(const char *cmd, int discover_git_dir)
 {
        struct pager_command_config_data data;
 
@@ -216,7 +217,7 @@ int check_pager_config(const char *cmd)
        data.want = -1;
        data.value = NULL;
 
-       read_early_config(pager_command_config, &data);
+       read_early_config(pager_command_config, &data, discover_git_dir);
 
        if (data.value)
                pager_program = data.value;
-- 
2.11.0.rc3.windows.1


Reply via email to