On 9/27/07, Junio C Hamano <gitster@xxxxxxxxx> wrote: > When mergetool is run from a subdirectory, "ls-files -u" nicely > limits the output to conflicted files in that directory, but > we need to give the full path to cat-file plumbing to grab the > contents of stages. > > Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx> > --- > > * I earlier sent one with cd_to_toplevel but I think the > approach in this patch is nicer. > > git-mergetool.sh | 7 ++++--- > 1 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/git-mergetool.sh b/git-mergetool.sh > index a0e44f7..3b1ec13 100755 > --- a/git-mergetool.sh > +++ b/git-mergetool.sh > @@ -12,6 +12,7 @@ USAGE='[--tool=tool] [file to merge] ...' > SUBDIRECTORY_OK=Yes > . git-sh-setup > require_work_tree > +prefix=$(git rev-parse --show-prefix) > > # Returns true if the mode reflects a symlink > is_symlink () { > @@ -162,9 +163,9 @@ merge_file () { > local_mode=`git ls-files -u -- "$path" | awk '{if ($3==2) print $1;}'` > remote_mode=`git ls-files -u -- "$path" | awk '{if ($3==3) print $1;}'` > > - base_present && git cat-file blob ":1:$path" > "$BASE" 2>/dev/null > - local_present && git cat-file blob ":2:$path" > "$LOCAL" 2>/dev/null > - remote_present && git cat-file blob ":3:$path" > "$REMOTE" 2>/dev/null > + base_present && git cat-file blob ":1:$prefix$path" >"$BASE" 2>/dev/null > + local_present && git cat-file blob ":2:$prefix$path" >"$LOCAL" 2>/dev/null > + remote_present && git cat-file blob ":3:$prefix$path" >"$REMOTE" 2>/dev/null > > if test -z "$local_mode" -o -z "$remote_mode"; then > echo "Deleted merge conflict for '$path':" > --- a/git-mergetool 2007-09-24 09:08:23.000000000 -0700 +++ b/git-mergetool 2007-09-27 15:04:15.000000000 -0700 @@ -12,6 +12,7 @@ SUBDIRECTORY_OK=Yes . git-sh-setup require_work_tree +prefix=$(git rev-parse --show-prefix) # Returns true if the mode reflects a symlink is_symlink () { @@ -162,9 +163,9 @@ local_mode=`git ls-files -u -- "$path" | awk '{if ($3==2) print $1;}'` remote_mode=`git ls-files -u -- "$path" | awk '{if ($3==3) print $1;}'` - base_present && git cat-file blob ":1:$path" > "$BASE" 2>/dev/null - local_present && git cat-file blob ":2:$path" > "$LOCAL" 2>/dev/null - remote_present && git cat-file blob ":3:$path" > "$REMOTE" 2>/dev/null + base_present && git cat-file blob ":1:$prefix$path" > "$BASE" 2>/dev/null + local_present && git cat-file blob ":2:$prefix$path" > "$LOCAL" 2>/dev/null + remote_present && git cat-file blob ":3:$prefix$path" > "$REMOTE" 2>/dev/null if test -z "$local_mode" -o -z "$remote_mode"; then echo "Deleted merge conflict for '$path':" @@ -251,7 +252,7 @@ ;; emerge) if base_present ; then - emacs -f emerge-files-with-ancestor-command "$LOCAL" "$REMOTE" "$BASE" "$path" + emacs -f emerge-files-with-ancestor-command "$LOCAL" "$REMOTE" "$BASE" "$(basename "$path")" else emacs -f emerge-files-command "$LOCAL" "$REMOTE" "$(basename "$path")" fi Finally got it to work. emacs (at least the version I'm using, 22.1.1) seems to set the $PWD via its first argument, that is, $LOCAL's directory, and when it goes to save, it tries to save $path on top of that. The updated patch above would be just to use the basename, that is, if it is certain that $LOCAL and $path will always reside in the same directory -- and I believe, but am not certain, that this is the case. Also, I am not sure if this is specific to my version of Emacs, so perhaps some further testing is required. -- Kelvie - To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html