blob: 86bbd7d024ff6b1ee775ec737c550d54f9371ad7 [file] [log] [blame]
Marcel M. Cary08fc0602008-12-15 09:34:37 -08001#!/bin/sh
2
3test_description='pulling from symlinked subdir'
4
5. ./test-lib.sh
6
Johannes Sixt704a3142009-03-04 22:38:24 +01007if ! test_have_prereq SYMLINKS
8then
9 say 'Symbolic links not supported, skipping tests.'
10 test_done
Johannes Sixt704a3142009-03-04 22:38:24 +010011fi
12
Marcel M. Cary08fc0602008-12-15 09:34:37 -080013# 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
24echo file >subdir/file
25git add subdir/file
26git commit -q -m file
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