Marcel M. Cary | 08fc060 | 2008-12-15 09:34:37 -0800 | [diff] [blame] | 1 | #!/bin/sh |
| 2 | |
| 3 | test_description='pulling from symlinked subdir' |
| 4 | |
| 5 | . ./test-lib.sh |
| 6 | |
Johannes Sixt | 704a314 | 2009-03-04 22:38:24 +0100 | [diff] [blame] | 7 | if ! test_have_prereq SYMLINKS |
| 8 | then |
| 9 | say 'Symbolic links not supported, skipping tests.' |
| 10 | test_done |
Johannes Sixt | 704a314 | 2009-03-04 22:38:24 +0100 | [diff] [blame] | 11 | fi |
| 12 | |
Marcel M. Cary | 08fc060 | 2008-12-15 09:34:37 -0800 | [diff] [blame] | 13 | # The scenario we are building: |
| 14 | # |
| 15 | # trash\ directory/ |
| 16 | # clone-repo/ |
| 17 | # subdir/ |
| 18 | # bar |
| 19 | # subdir-link -> clone-repo/subdir/ |
| 20 | # |
| 21 | # The working directory is subdir-link. |
| 22 | |
| 23 | mkdir subdir |
| 24 | echo file >subdir/file |
| 25 | git add subdir/file |
| 26 | git commit -q -m file |
| 27 | git clone -q . clone-repo |
| 28 | ln -s clone-repo/subdir/ subdir-link |
| 29 | |
| 30 | |
| 31 | # Demonstrate that things work if we just avoid the symlink |
| 32 | # |
| 33 | test_expect_success 'pulling from real subdir' ' |
| 34 | ( |
| 35 | echo real >subdir/file && |
| 36 | git commit -m real subdir/file && |
| 37 | cd clone-repo/subdir/ && |
| 38 | git pull && |
| 39 | test real = $(cat file) |
| 40 | ) |
| 41 | ' |
| 42 | |
| 43 | # From subdir-link, pulling should work as it does from |
| 44 | # clone-repo/subdir/. |
| 45 | # |
| 46 | # Instead, the error pull gave was: |
| 47 | # |
| 48 | # fatal: 'origin': unable to chdir or not a git archive |
| 49 | # fatal: The remote end hung up unexpectedly |
| 50 | # |
| 51 | # because git would find the .git/config for the "trash directory" |
| 52 | # repo, not for the clone-repo repo. The "trash directory" repo |
| 53 | # had no entry for origin. Git found the wrong .git because |
| 54 | # git rev-parse --show-cdup printed a path relative to |
| 55 | # clone-repo/subdir/, not subdir-link/. Git rev-parse --show-cdup |
| 56 | # used the correct .git, but when the git pull shell script did |
| 57 | # "cd `git rev-parse --show-cdup`", it ended up in the wrong |
| 58 | # directory. A POSIX shell's "cd" works a little differently |
| 59 | # than chdir() in C; "cd -P" is much closer to chdir(). |
| 60 | # |
| 61 | test_expect_success 'pulling from symlinked subdir' ' |
| 62 | ( |
| 63 | echo link >subdir/file && |
| 64 | git commit -m link subdir/file && |
| 65 | cd subdir-link/ && |
| 66 | git pull && |
| 67 | test link = $(cat file) |
| 68 | ) |
| 69 | ' |
| 70 | |
| 71 | # Prove that the remote end really is a repo, and other commands |
| 72 | # work fine in this context. It's just that "git pull" breaks. |
| 73 | # |
| 74 | test_expect_success 'pushing from symlinked subdir' ' |
| 75 | ( |
| 76 | cd subdir-link/ && |
| 77 | echo push >file && |
| 78 | git commit -m push ./file && |
| 79 | git push |
| 80 | ) && |
| 81 | test push = $(git show HEAD:subdir/file) |
| 82 | ' |
| 83 | |
| 84 | test_done |