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