Code

am: read from the right mailbox when started from a subdirectory
authorJunio C Hamano <gitster@pobox.com>
Tue, 4 Mar 2008 08:25:04 +0000 (00:25 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Mar 2008 18:52:56 +0000 (10:52 -0800)
An earlier commit c149184 (allow git-am to run in a subdirectory) taught
git-am to start from a subdirectory by going up to the root of the work
tree byitself, but it did not adjust the path to read the mbox from when
it did so.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-am.sh
t/t4150-am-subdir.sh [new file with mode: 0755]

index a2c6fea47af1e4616bc549f26f3fe1b364841abe..2b5bbb772ae9e3ac716210b3e19eef64f70f0944 100755 (executable)
--- a/git-am.sh
+++ b/git-am.sh
@@ -24,6 +24,7 @@ r,resolved      to be used after a patch failure
 skip            skip the current patch"
 
 . git-sh-setup
+prefix=$(git rev-parse --show-prefix)
 set_reflog_action am
 require_work_tree
 cd_to_toplevel
@@ -124,7 +125,8 @@ reread_subject () {
 }
 
 prec=4
-dotest=.dotest sign= utf8=t keep= skip= interactive= resolved= binary=
+dotest="${prefix}.dotest"
+sign= utf8=t keep= skip= interactive= resolved= binary=
 resolvemsg= resume=
 git_apply_opt=
 
@@ -150,7 +152,8 @@ do
        --skip)
                skip=t ;;
        -d|--dotest)
-               shift; dotest=$1;;
+               shift
+               case "$1" in /*) dotest=$1;; *) dotest="$prefix$1" ;; esac ;;
        --resolvemsg)
                shift; resolvemsg=$1 ;;
        --whitespace)
@@ -206,6 +209,24 @@ else
        # Start afresh.
        mkdir -p "$dotest" || exit
 
+       if test -n "$prefix" && test $# != 0
+       then
+               first=t
+               for arg
+               do
+                       test -n "$first" && {
+                               set x
+                               first=
+                       }
+                       case "$arg" in
+                       /*)
+                               set "$@" "$arg" ;;
+                       *)
+                               set "$@" "$prefix$arg" ;;
+                       esac
+               done
+               shift
+       fi
        git mailsplit -d"$prec" -o"$dotest" -b -- "$@" > "$dotest/last" ||  {
                rm -fr "$dotest"
                exit 1
diff --git a/t/t4150-am-subdir.sh b/t/t4150-am-subdir.sh
new file mode 100755 (executable)
index 0000000..929d2cb
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+
+test_description='git am running from a subdirectory'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+       echo hello >world &&
+       git add world &&
+       test_tick &&
+       git commit -m initial &&
+       git tag initial &&
+       echo goodbye >world &&
+       git add world &&
+       test_tick &&
+       git commit -m second &&
+       git format-patch --stdout HEAD^ >patchfile &&
+       : >expect
+'
+
+test_expect_success 'am regularly from stdin' '
+       git checkout initial &&
+       git am <patchfile &&
+       git diff master >actual &&
+       diff -u expect actual
+'
+
+test_expect_success 'am regularly from file' '
+       git checkout initial &&
+       git am patchfile &&
+       git diff master >actual &&
+       diff -u expect actual
+'
+
+test_expect_success 'am regularly from stdin in subdirectory' '
+       rm -fr subdir &&
+       git checkout initial &&
+       (
+               mkdir -p subdir &&
+               cd subdir &&
+               git am <../patchfile
+       ) &&
+       git diff master>actual &&
+       diff -u expect actual
+'
+
+test_expect_success 'am regularly from file in subdirectory' '
+       rm -fr subdir &&
+       git checkout initial &&
+       (
+               mkdir -p subdir &&
+               cd subdir &&
+               git am ../patchfile
+       ) &&
+       git diff master >actual &&
+       diff -u expect actual
+'
+
+test_expect_success 'am regularly from file in subdirectory with full path' '
+       rm -fr subdir &&
+       git checkout initial &&
+       P=$(pwd) &&
+       (
+               mkdir -p subdir &&
+               cd subdir &&
+               git am "$P/patchfile"
+       ) &&
+       git diff master >actual &&
+       diff -u expect actual
+'
+
+test_done