Discussion:
[PATCH] mergetool: add an option for writing to a temporary directory
David Aguilar
2014-10-11 17:04:45 UTC
Permalink
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.

This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.

Suggested-by: Charles Bailey <***@hashpling.org>
Signed-off-by: David Aguilar <***@gmail.com>
---
This patch is dependent on my previous mergetool patches:
"use more conservative temporary..." and the subsequent --tool-help
series.

Documentation/config.txt | 6 ++++++
git-mergetool.sh | 35 +++++++++++++++++++++++++++++++----
2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 04a1e2f..be6cf35 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -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.

diff --git a/git-mergetool.sh b/git-mergetool.sh
index 10782b8..2b788c5 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -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;}')
--
2.1.2.379.gc4e1e0c
Junio C Hamano
2014-10-13 19:18:36 UTC
Permalink
Post by David Aguilar
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.
This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.
---
"use more conservative temporary..." and the subsequent --tool-help
series.
I can understand why it depends on the "foo_BACKUP_1234.c" change,
but why does it need to depend on the other one?
Post by David Aguilar
Documentation/config.txt | 6 ++++++
git-mergetool.sh | 35 +++++++++++++++++++++++++++++++----
2 files changed, 37 insertions(+), 4 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 04a1e2f..be6cf35 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
preserved, otherwise they will be removed after the tool has
exited. Defaults to `false`.
+ 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`.
+
Prompt before each invocation of the merge resolution program.
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 10782b8..2b788c5 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -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;}')
Junio C Hamano
2014-10-13 19:24:41 UTC
Permalink
Post by David Aguilar
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.
This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.
With this can we drop the "change the temporary file name" patch by
Robin Rosenberg?

http://thread.gmane.org/gmane.comp.version-control.git/255457/focus=255599

Message-Id: <1408607240-11369-1-git-send-email-***@dewire.com>
David Aguilar
2014-10-15 06:38:49 UTC
Permalink
Post by Junio C Hamano
Post by David Aguilar
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.
This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.
With this can we drop the "change the temporary file name" patch by
Robin Rosenberg?
http://thread.gmane.org/gmane.comp.version-control.git/255457/focus=255599
I would think so but I'm biased ;-)
--
David
Robin Rosenberg
2014-10-15 19:30:11 UTC
Permalink
----- Ursprungligt meddelande -----
Skickat: onsdag, 15 okt 2014 8:38:49
=C3=84mne: Re: [PATCH] mergetool: add an option for writing to a temp=
orary directory
=20
Post by Junio C Hamano
=20
Post by David Aguilar
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.
This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.
=20
With this can we drop the "change the temporary file name" patch by
Robin Rosenberg?
=20
http://thread.gmane.org/gmane.comp.version-control.git/255457/focus=
=3D255599
Post by Junio C Hamano
=20
re.com>
=20
I would think so but I'm biased ;-)
The new patch solves my problem.

-- robin
Junio C Hamano
2014-10-15 20:45:42 UTC
Permalink
Post by Robin Rosenberg
----- Ursprungligt meddelande -----
Skickat: onsdag, 15 okt 2014 8:38:49
=C3=84mne: Re: [PATCH] mergetool: add an option for writing to a tem=
porary directory
Post by Robin Rosenberg
=20
=20
Post by David Aguilar
Teach mergetool to write files in a temporary directory when
'mergetool.writeToTemp' is true.
This is helpful for tools such as Eclipse which cannot cope with
multiple copies of the same file in the worktree.
=20
With this can we drop the "change the temporary file name" patch b=
y
Post by Robin Rosenberg
Robin Rosenberg?
=20
http://thread.gmane.org/gmane.comp.version-control.git/255457/focu=
s=3D255599
Post by Robin Rosenberg
=20
ire.com>
Post by Robin Rosenberg
=20
I would think so but I'm biased ;-)
The new patch solves my problem.
Thanks. Let's move David's series forward then.

Loading...