1#!/bin/sh 2 3test_description='pulling from symlinked subdir' 4 5. ./test-lib.sh 6 7if! test_have_prereq SYMLINKS 8then 9 say 'Symbolic links not supported, skipping tests.' 10 test_done 11fi 12 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 23mkdir subdir 24echofile>subdir/file 25git add subdir/file 26git commit -q -mfile 27git clone -q . clone-repo 28ln-s clone-repo/subdir/ subdir-link 29 30 31# Demonstrate that things work if we just avoid the symlink 32# 33test_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# 61test_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# 74test_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 84test_done