|  | #!/bin/sh | 
|  |  | 
|  | test_description='pulling from symlinked subdir' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | # The scenario we are building: | 
|  | # | 
|  | #   trash\ directory/ | 
|  | #     clone-repo/ | 
|  | #       subdir/ | 
|  | #         bar | 
|  | #     subdir-link -> clone-repo/subdir/ | 
|  | # | 
|  | # The working directory is subdir-link. | 
|  |  | 
|  | test_expect_success SYMLINKS setup ' | 
|  | mkdir subdir && | 
|  | echo file >subdir/file && | 
|  | git add subdir/file && | 
|  | git commit -q -m file && | 
|  | git clone -q . clone-repo && | 
|  | ln -s clone-repo/subdir/ subdir-link && | 
|  | ( | 
|  | cd clone-repo && | 
|  | git config receive.denyCurrentBranch warn | 
|  | ) && | 
|  | git config receive.denyCurrentBranch warn | 
|  | ' | 
|  |  | 
|  | # Demonstrate that things work if we just avoid the symlink | 
|  | # | 
|  | test_expect_success SYMLINKS 'pulling from real subdir' ' | 
|  | ( | 
|  | echo real >subdir/file && | 
|  | git commit -m real subdir/file && | 
|  | cd clone-repo/subdir/ && | 
|  | git pull && | 
|  | test real = $(cat file) | 
|  | ) | 
|  | ' | 
|  |  | 
|  | # From subdir-link, pulling should work as it does from | 
|  | # clone-repo/subdir/. | 
|  | # | 
|  | # Instead, the error pull gave was: | 
|  | # | 
|  | #   fatal: 'origin': unable to chdir or not a git archive | 
|  | #   fatal: The remote end hung up unexpectedly | 
|  | # | 
|  | # because git would find the .git/config for the "trash directory" | 
|  | # repo, not for the clone-repo repo.  The "trash directory" repo | 
|  | # had no entry for origin.  Git found the wrong .git because | 
|  | # git rev-parse --show-cdup printed a path relative to | 
|  | # clone-repo/subdir/, not subdir-link/.  Git rev-parse --show-cdup | 
|  | # used the correct .git, but when the git pull shell script did | 
|  | # "cd $(git rev-parse --show-cdup)", it ended up in the wrong | 
|  | # directory.  A POSIX shell's "cd" works a little differently | 
|  | # than chdir() in C; "cd -P" is much closer to chdir(). | 
|  | # | 
|  | test_expect_success SYMLINKS 'pulling from symlinked subdir' ' | 
|  | ( | 
|  | echo link >subdir/file && | 
|  | git commit -m link subdir/file && | 
|  | cd subdir-link/ && | 
|  | git pull && | 
|  | test link = $(cat file) | 
|  | ) | 
|  | ' | 
|  |  | 
|  | # Prove that the remote end really is a repo, and other commands | 
|  | # work fine in this context.  It's just that "git pull" breaks. | 
|  | # | 
|  | test_expect_success SYMLINKS 'pushing from symlinked subdir' ' | 
|  | ( | 
|  | cd subdir-link/ && | 
|  | echo push >file && | 
|  | git commit -m push ./file && | 
|  | git push | 
|  | ) && | 
|  | test push = $(git show HEAD:subdir/file) | 
|  | ' | 
|  |  | 
|  | test_done |