Merge branch 'da/mergetool-temporary-directory'
authorJunio C Hamano <gitster@pobox.com>
Tue, 21 Oct 2014 20:28:42 +0000 (13:28 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 21 Oct 2014 20:28:42 +0000 (13:28 -0700)
Allow a temporary directory specified to be used while running "git
mergetool" backend.

* da/mergetool-temporary-directory:
t7610-mergetool: add test cases for mergetool.writeToTemp
mergetool: add an option for writing to a temporary directory

Documentation/config.txt
git-mergetool.sh
t/t7610-mergetool.sh
index 04a1e2f37e938f004c899d3fb6c59d282c2071ce..be6cf35c02fbf9f12f221f7bd6e687691e430daf 100644 (file)
@@ -1768,6 +1768,12 @@ mergetool.keepTemporaries::
        preserved, otherwise they will be removed after the tool has
        exited. Defaults to `false`.
 
+mergetool.writeToTemp::
+       Git writes temporary 'BASE', 'LOCAL', and 'REMOTE' versions of
+       conflicting files in the worktree by default.  Git will attempt
+       to use a temporary directory for these files when set `true`.
+       Defaults to `false`.
+
 mergetool.prompt::
        Prompt before each invocation of the merge resolution program.
 
index ec644d542d9754fa09ac7fb1b0f1f932a9bedbed..ff050e58ff3b752113105ba3ea5e20c6b633aae9 100755 (executable)
@@ -37,6 +37,19 @@ base_present () {
        test -n "$base_mode"
 }
 
+mergetool_tmpdir_init () {
+       if test "$(git config --bool mergetool.writeToTemp)" != true
+       then
+               MERGETOOL_TMPDIR=.
+               return 0
+       fi
+       if MERGETOOL_TMPDIR=$(mktemp -d -t "git-mergetool-XXXXXX" 2>/dev/null)
+       then
+               return 0
+       fi
+       die "error: mktemp is needed when 'mergetool.writeToTemp' is true"
+}
+
 cleanup_temp_files () {
        if test "$1" = --save-backup
        then
@@ -46,6 +59,10 @@ cleanup_temp_files () {
        else
                rm -f -- "$LOCAL" "$REMOTE" "$BASE" "$BACKUP"
        fi
+       if test "$MERGETOOL_TMPDIR" != "."
+       then
+               rmdir "$MERGETOOL_TMPDIR"
+       fi
 }
 
 describe_file () {
@@ -235,10 +252,20 @@ merge_file () {
                BASE=$MERGED
                ext=
        fi
-       BACKUP="./${BASE}_BACKUP_$$$ext"
-       LOCAL="./${BASE}_LOCAL_$$$ext"
-       REMOTE="./${BASE}_REMOTE_$$$ext"
-       BASE="./${BASE}_BASE_$$$ext"
+
+       mergetool_tmpdir_init
+
+       if test "$MERGETOOL_TMPDIR" != "."
+       then
+               # If we're using a temporary directory then write to the
+               # top-level of that directory.
+               BASE=${BASE##*/}
+       fi
+
+       BACKUP="$MERGETOOL_TMPDIR/${BASE}_BACKUP_$$$ext"
+       LOCAL="$MERGETOOL_TMPDIR/${BASE}_LOCAL_$$$ext"
+       REMOTE="$MERGETOOL_TMPDIR/${BASE}_REMOTE_$$$ext"
+       BASE="$MERGETOOL_TMPDIR/${BASE}_BASE_$$$ext"
 
        base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
        local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
index 3502ec9fe567af2a029c0c0d6faa3b189be8717f..7eeb207b32b48041037488f42e645b8b12742690 100755 (executable)
@@ -514,4 +514,27 @@ test_expect_success 'custom commands override built-ins' '
        git reset --hard master >/dev/null 2>&1
 '
 
+test_expect_success 'filenames seen by tools start with ./' '
+       git checkout -b test15 branch1 &&
+       test_config mergetool.writeToTemp false &&
+       test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+       test_config mergetool.myecho.trustExitCode true &&
+       test_must_fail git merge master &&
+       git mergetool --no-prompt --tool myecho -- both >actual &&
+       grep ^\./both_LOCAL_ actual >/dev/null &&
+       git reset --hard master >/dev/null 2>&1
+'
+
+test_expect_success 'temporary filenames are used with mergetool.writeToTemp' '
+       git checkout -b test16 branch1 &&
+       test_config mergetool.writeToTemp true &&
+       test_config mergetool.myecho.cmd "echo \"\$LOCAL\"" &&
+       test_config mergetool.myecho.trustExitCode true &&
+       test_must_fail git merge master &&
+       git mergetool --no-prompt --tool myecho -- both >actual &&
+       test_must_fail grep ^\./both_LOCAL_ actual >/dev/null &&
+       grep /both_LOCAL_ actual >/dev/null &&
+       git reset --hard master >/dev/null 2>&1
+'
+
 test_done