Merge branch 'jn/paginate-fix'

* jn/paginate-fix:
  git --paginate: paginate external commands again
  git --paginate: do not commit pager choice too early
  tests: local config file should be honored from subdirs of toplevel
  t7006: test pager configuration for several git commands
  t7006 (pager): introduce helper for parameterized tests

Conflicts:
	t/t7006-pager.sh
This commit is contained in:
Junio C Hamano
2010-07-15 12:09:14 -07:00
2 changed files with 200 additions and 46 deletions

5
git.c
View File

@ -167,6 +167,7 @@ static int handle_alias(int *argcp, const char ***argv)
alias_string = alias_lookup(alias_command); alias_string = alias_lookup(alias_command);
if (alias_string) { if (alias_string) {
if (alias_string[0] == '!') { if (alias_string[0] == '!') {
commit_pager_choice();
if (*argcp > 1) { if (*argcp > 1) {
struct strbuf buf; struct strbuf buf;
@ -432,6 +433,8 @@ static void execv_dashed_external(const char **argv)
const char *tmp; const char *tmp;
int status; int status;
commit_pager_choice();
strbuf_addf(&cmd, "git-%s", argv[0]); strbuf_addf(&cmd, "git-%s", argv[0]);
/* /*
@ -511,12 +514,12 @@ int main(int argc, const char **argv)
argv++; argv++;
argc--; argc--;
handle_options(&argv, &argc, NULL); handle_options(&argv, &argc, NULL);
commit_pager_choice();
if (argc > 0) { if (argc > 0) {
if (!prefixcmp(argv[0], "--")) if (!prefixcmp(argv[0], "--"))
argv[0] += 2; argv[0] += 2;
} else { } else {
/* The user didn't specify a command; give them help */ /* The user didn't specify a command; give them help */
commit_pager_choice();
printf("usage: %s\n\n", git_usage_string); printf("usage: %s\n\n", git_usage_string);
list_common_cmds_help(); list_common_cmds_help();
printf("\n%s\n", git_more_info_string); printf("\n%s\n", git_more_info_string);

View File

@ -164,58 +164,209 @@ then
test_set_prereq SIMPLEPAGERTTY test_set_prereq SIMPLEPAGERTTY
fi fi
test_expect_success SIMPLEPAGERTTY 'default pager is used by default' ' # Use this helper to make it easy for the caller of your
unset PAGER GIT_PAGER; # terminal-using function to specify whether it should fail.
test_might_fail git config --unset core.pager && # If you write
rm -f default_pager_used || #
cleanup_fail && # your_test() {
# parse_args "$@"
#
# $test_expectation "$cmd - behaves well" "
# ...
# $full_command &&
# ...
# "
# }
#
# then your test can be used like this:
#
# your_test expect_(success|failure) [test_must_fail] 'git foo'
#
parse_args() {
test_expectation="test_$1"
shift
if test "$1" = test_must_fail
then
full_command="test_must_fail test_terminal "
shift
else
full_command="test_terminal "
fi
cmd=$1
full_command="$full_command $1"
}
cat >$less <<-\EOF && test_default_pager() {
#!/bin/sh parse_args "$@"
wc >default_pager_used
EOF $test_expectation SIMPLEPAGERTTY "$cmd - default pager is used by default" "
chmod +x $less && unset PAGER GIT_PAGER;
( test_might_fail git config --unset core.pager &&
PATH=.:$PATH && rm -f default_pager_used ||
export PATH && cleanup_fail &&
test_terminal git log
) && cat >\$less <<-\EOF &&
test -e default_pager_used #!/bin/sh
wc >default_pager_used
EOF
chmod +x \$less &&
(
PATH=.:\$PATH &&
export PATH &&
$full_command
) &&
test -e default_pager_used
"
}
test_PAGER_overrides() {
parse_args "$@"
$test_expectation TTY "$cmd - PAGER overrides default pager" "
unset GIT_PAGER;
test_might_fail git config --unset core.pager &&
rm -f PAGER_used ||
cleanup_fail &&
PAGER='wc >PAGER_used' &&
export PAGER &&
$full_command &&
test -e PAGER_used
"
}
test_core_pager_overrides() {
if_local_config=
used_if_wanted='overrides PAGER'
test_core_pager "$@"
}
test_local_config_ignored() {
if_local_config='! '
used_if_wanted='is not used'
test_core_pager "$@"
}
test_core_pager() {
parse_args "$@"
$test_expectation TTY "$cmd - repository-local core.pager setting $used_if_wanted" "
unset GIT_PAGER;
rm -f core.pager_used ||
cleanup_fail &&
PAGER=wc &&
export PAGER &&
git config core.pager 'wc >core.pager_used' &&
$full_command &&
${if_local_config}test -e core.pager_used
"
}
test_core_pager_subdir() {
if_local_config=
used_if_wanted='overrides PAGER'
test_pager_subdir_helper "$@"
}
test_no_local_config_subdir() {
if_local_config='! '
used_if_wanted='is not used'
test_pager_subdir_helper "$@"
}
test_pager_subdir_helper() {
parse_args "$@"
$test_expectation TTY "$cmd - core.pager $used_if_wanted from subdirectory" "
unset GIT_PAGER;
rm -f core.pager_used &&
rm -fr sub ||
cleanup_fail &&
PAGER=wc &&
stampname=\$(pwd)/core.pager_used &&
export PAGER stampname &&
git config core.pager 'wc >\"\$stampname\"' &&
mkdir sub &&
(
cd sub &&
$full_command
) &&
${if_local_config}test -e core.pager_used
"
}
test_GIT_PAGER_overrides() {
parse_args "$@"
$test_expectation TTY "$cmd - GIT_PAGER overrides core.pager" "
rm -f GIT_PAGER_used ||
cleanup_fail &&
git config core.pager wc &&
GIT_PAGER='wc >GIT_PAGER_used' &&
export GIT_PAGER &&
$full_command &&
test -e GIT_PAGER_used
"
}
test_doesnt_paginate() {
parse_args "$@"
$test_expectation TTY "no pager for '$cmd'" "
rm -f GIT_PAGER_used ||
cleanup_fail &&
GIT_PAGER='wc >GIT_PAGER_used' &&
export GIT_PAGER &&
$full_command &&
! test -e GIT_PAGER_used
"
}
test_pager_choices() {
test_default_pager expect_success "$@"
test_PAGER_overrides expect_success "$@"
test_core_pager_overrides expect_success "$@"
test_core_pager_subdir expect_success "$@"
test_GIT_PAGER_overrides expect_success "$@"
}
test_expect_success 'setup: some aliases' '
git config alias.aliasedlog log &&
git config alias.true "!true"
' '
test_expect_success TTY 'PAGER overrides default pager' ' test_pager_choices 'git log'
unset GIT_PAGER; test_pager_choices 'git -p log'
test_might_fail git config --unset core.pager && test_pager_choices 'git aliasedlog'
rm -f PAGER_used ||
cleanup_fail &&
PAGER="wc >PAGER_used" && test_default_pager expect_success 'git -p aliasedlog'
export PAGER && test_PAGER_overrides expect_success 'git -p aliasedlog'
test_terminal git log && test_core_pager_overrides expect_success 'git -p aliasedlog'
test -e PAGER_used test_core_pager_subdir expect_failure 'git -p aliasedlog'
' test_GIT_PAGER_overrides expect_success 'git -p aliasedlog'
test_expect_success TTY 'core.pager overrides PAGER' ' test_default_pager expect_success 'git -p true'
unset GIT_PAGER; test_PAGER_overrides expect_success 'git -p true'
rm -f core.pager_used || test_core_pager_overrides expect_success 'git -p true'
cleanup_fail && test_core_pager_subdir expect_failure 'git -p true'
test_GIT_PAGER_overrides expect_success 'git -p true'
PAGER=wc && test_default_pager expect_success test_must_fail 'git -p request-pull'
export PAGER && test_PAGER_overrides expect_success test_must_fail 'git -p request-pull'
git config core.pager "wc >core.pager_used" && test_core_pager_overrides expect_success test_must_fail 'git -p request-pull'
test_terminal git log && test_core_pager_subdir expect_failure test_must_fail 'git -p request-pull'
test -e core.pager_used test_GIT_PAGER_overrides expect_success test_must_fail 'git -p request-pull'
'
test_expect_success TTY 'GIT_PAGER overrides core.pager' ' test_default_pager expect_success test_must_fail 'git -p'
rm -f GIT_PAGER_used || test_PAGER_overrides expect_success test_must_fail 'git -p'
cleanup_fail && test_local_config_ignored expect_failure test_must_fail 'git -p'
test_no_local_config_subdir expect_success test_must_fail 'git -p'
test_GIT_PAGER_overrides expect_success test_must_fail 'git -p'
git config core.pager wc && test_doesnt_paginate expect_failure test_must_fail 'git -p nonsense'
GIT_PAGER="wc >GIT_PAGER_used" &&
export GIT_PAGER &&
test_terminal git log &&
test -e GIT_PAGER_used
'
test_done test_done