d887eb6c1ac1084effb9ab422d471e8c52754700
   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
  11        exit
  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
  25echo file >subdir/file
  26git add subdir/file
  27git commit -q -m file
  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