Merge branch 'da/git-prefix-everywhere' into next

* da/git-prefix-everywhere:
  git-mergetool--lib: Make vimdiff retain the current directory
  git: Remove handling for GIT_PREFIX
  setup: Provide GIT_PREFIX to built-ins
This commit is contained in:
Junio C Hamano
2011-05-30 00:16:23 -07:00
4 changed files with 29 additions and 9 deletions

View File

@@ -86,6 +86,11 @@ get_merge_tool_cmd () {
}
run_merge_tool () {
# If GIT_PREFIX is empty then we cannot use it in tools
# that expect to be able to chdir() to its value.
GIT_PREFIX=${GIT_PREFIX:-.}
export GIT_PREFIX
merge_tool_path="$(get_merge_tool_path "$1")" || exit
base_present="$2"
status=0
@@ -188,6 +193,7 @@ run_merge_tool () {
check_unchanged
else
"$merge_tool_path" -R -f -d -c "wincmd l" \
-c 'cd $GIT_PREFIX' \
"$LOCAL" "$REMOTE"
fi
;;
@@ -199,6 +205,7 @@ run_merge_tool () {
check_unchanged
else
"$merge_tool_path" -R -f -d -c "wincmd l" \
-c 'cd $GIT_PREFIX' \
"$LOCAL" "$REMOTE"
fi
;;

10
git.c
View File

@@ -183,8 +183,6 @@ static int handle_alias(int *argcp, const char ***argv)
if (alias_string[0] == '!') {
const char **alias_argv;
int argc = *argcp, i;
struct strbuf sb = STRBUF_INIT;
const char *env[2];
commit_pager_choice();
@@ -195,13 +193,7 @@ static int handle_alias(int *argcp, const char ***argv)
alias_argv[i] = (*argv)[i];
alias_argv[argc] = NULL;
strbuf_addstr(&sb, "GIT_PREFIX=");
if (subdir)
strbuf_addstr(&sb, subdir);
env[0] = sb.buf;
env[1] = NULL;
ret = run_command_v_opt_cd_env(alias_argv, RUN_USING_SHELL, NULL, env);
strbuf_release(&sb);
ret = run_command_v_opt(alias_argv, RUN_USING_SHELL);
if (ret >= 0) /* normal exit */
exit(ret);

View File

@@ -710,6 +710,11 @@ const char *setup_git_directory_gently(int *nongit_ok)
const char *prefix;
prefix = setup_git_directory_gently_1(nongit_ok);
if (prefix)
setenv("GIT_PREFIX", prefix, 1);
else
setenv("GIT_PREFIX", "", 1);
if (startup_info) {
startup_info->have_repository = !nongit_ok || !*nongit_ok;
startup_info->prefix = prefix;

View File

@@ -140,6 +140,22 @@ test_expect_success 'GIT_PREFIX for !alias' '
test_cmp expect actual
'
test_expect_success 'GIT_PREFIX for built-ins' '
# Use GIT_EXTERNAL_DIFF to test that the "diff" built-in
# receives the GIT_PREFIX variable.
printf "dir/" >expect &&
printf "#!/bin/sh\n" >diff &&
printf "printf \"\$GIT_PREFIX\"" >>diff &&
chmod +x diff &&
(
cd dir &&
printf "change" >two &&
env GIT_EXTERNAL_DIFF=./diff git diff >../actual
git checkout -- two
) &&
test_cmp expect actual
'
test_expect_success 'no file/rev ambiguity check inside .git' '
git commit -a -m 1 &&
(