Merge branches 'lt/crlf' and 'jc/apply-config'

* lt/crlf:
  Teach core.autocrlf to 'git apply'
  t0020: add test for auto-crlf
  Make AutoCRLF ternary variable.
  Lazy man's auto-CRLF

* jc/apply-config:
  t4119: test autocomputing -p<n> for traditional diff input.
  git-apply: guess correct -p<n> value for non-git patches.
  git-apply: notice "diff --git" patch again
  Fix botched "leak fix"
  t4119: add test for traditional patch and different p_value
  apply: fix memory leak in prefix_one()
  git-apply: require -p<n> when working in a subdirectory.
  git-apply: do not lose cwd when run from a subdirectory.
  Teach 'git apply' to look at $HOME/.gitconfig even outside of a repository
  Teach 'git apply' to look at $GIT_DIR/config
This commit is contained in:
Junio C Hamano
2007-02-22 21:34:36 -08:00
11 changed files with 767 additions and 27 deletions

217
t/t0020-crlf.sh Executable file
View File

@ -0,0 +1,217 @@
#!/bin/sh
test_description='CRLF conversion'
. ./test-lib.sh
append_cr () {
sed -e 's/$/Q/' | tr Q '\015'
}
remove_cr () {
tr '\015' Q <"$1" | grep Q >/dev/null &&
tr '\015' Q <"$1" | sed -ne 's/Q$//p'
}
test_expect_success setup '
git repo-config core.autocrlf false &&
for w in Hello world how are you; do echo $w; done >one &&
mkdir dir &&
for w in I am very very fine thank you; do echo $w; done >dir/two &&
git add . &&
git commit -m initial &&
one=`git rev-parse HEAD:one` &&
dir=`git rev-parse HEAD:dir` &&
two=`git rev-parse HEAD:dir/two` &&
for w in Some extra lines here; do echo $w; done >>one &&
git diff >patch.file &&
patched=`git hash-object --stdin <one` &&
git read-tree --reset -u HEAD &&
echo happy.
'
test_expect_success 'update with autocrlf=input' '
rm -f tmp one dir/two &&
git read-tree --reset -u HEAD &&
git repo-config core.autocrlf input &&
for f in one dir/two
do
append_cr <$f >tmp && mv -f tmp $f &&
git update-index -- $f || {
echo Oops
false
break
}
done &&
differs=`git diff-index --cached HEAD` &&
test -z "$differs" || {
echo Oops "$differs"
false
}
'
test_expect_success 'update with autocrlf=true' '
rm -f tmp one dir/two &&
git read-tree --reset -u HEAD &&
git repo-config core.autocrlf true &&
for f in one dir/two
do
append_cr <$f >tmp && mv -f tmp $f &&
git update-index -- $f || {
echo "Oops $f"
false
break
}
done &&
differs=`git diff-index --cached HEAD` &&
test -z "$differs" || {
echo Oops "$differs"
false
}
'
test_expect_success 'checkout with autocrlf=true' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf true &&
git read-tree --reset -u HEAD &&
for f in one dir/two
do
remove_cr "$f" >tmp && mv -f tmp $f &&
git update-index -- $f || {
echo "Eh? $f"
false
break
}
done &&
test "$one" = `git hash-object --stdin <one` &&
test "$two" = `git hash-object --stdin <dir/two` &&
differs=`git diff-index --cached HEAD` &&
test -z "$differs" || {
echo Oops "$differs"
false
}
'
test_expect_success 'checkout with autocrlf=input' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf input &&
git read-tree --reset -u HEAD &&
for f in one dir/two
do
if remove_cr "$f" >/dev/null
then
echo "Eh? $f"
false
break
else
git update-index -- $f
fi
done &&
test "$one" = `git hash-object --stdin <one` &&
test "$two" = `git hash-object --stdin <dir/two` &&
differs=`git diff-index --cached HEAD` &&
test -z "$differs" || {
echo Oops "$differs"
false
}
'
test_expect_success 'apply patch (autocrlf=input)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf input &&
git read-tree --reset -u HEAD &&
git apply patch.file &&
test "$patched" = "`git hash-object --stdin <one`" || {
echo "Eh? apply without index"
false
}
'
test_expect_success 'apply patch --cached (autocrlf=input)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf input &&
git read-tree --reset -u HEAD &&
git apply --cached patch.file &&
test "$patched" = `git rev-parse :one` || {
echo "Eh? apply with --cached"
false
}
'
test_expect_success 'apply patch --index (autocrlf=input)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf input &&
git read-tree --reset -u HEAD &&
git apply --index patch.file &&
test "$patched" = `git rev-parse :one` &&
test "$patched" = `git hash-object --stdin <one` || {
echo "Eh? apply with --index"
false
}
'
test_expect_success 'apply patch (autocrlf=true)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf true &&
git read-tree --reset -u HEAD &&
git apply patch.file &&
test "$patched" = "`remove_cr one | git hash-object --stdin`" || {
echo "Eh? apply without index"
false
}
'
test_expect_success 'apply patch --cached (autocrlf=true)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf true &&
git read-tree --reset -u HEAD &&
git apply --cached patch.file &&
test "$patched" = `git rev-parse :one` || {
echo "Eh? apply without index"
false
}
'
test_expect_success 'apply patch --index (autocrlf=true)' '
rm -f tmp one dir/two &&
git repo-config core.autocrlf true &&
git read-tree --reset -u HEAD &&
git apply --index patch.file &&
test "$patched" = `git rev-parse :one` &&
test "$patched" = "`remove_cr one | git hash-object --stdin`" || {
echo "Eh? apply with --index"
false
}
'
test_done

162
t/t4119-apply-config.sh Executable file
View File

@ -0,0 +1,162 @@
#!/bin/sh
#
# Copyright (c) 2007 Junio C Hamano
#
test_description='git-apply --whitespace=strip and configuration file.
'
. ./test-lib.sh
test_expect_success setup '
mkdir sub &&
echo A >sub/file1 &&
cp sub/file1 saved &&
git add sub/file1 &&
echo "B " >sub/file1 &&
git diff >patch.file
'
# Also handcraft GNU diff output; note this has trailing whitespace.
cat >gpatch.file <<\EOF &&
--- file1 2007-02-21 01:04:24.000000000 -0800
+++ file1+ 2007-02-21 01:07:44.000000000 -0800
@@ -1 +1 @@
-A
+B
EOF
sed -e 's|file1|sub/&|' gpatch.file >gpatch-sub.file &&
sed -e '
/^--- /s|file1|a/sub/&|
/^+++ /s|file1|b/sub/&|
' gpatch.file >gpatch-ab-sub.file &&
check_result () {
if grep " " "$1"
then
echo "Eh?"
false
elif grep B "$1"
then
echo Happy
else
echo "Huh?"
false
fi
}
test_expect_success 'apply --whitespace=strip' '
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
git apply --whitespace=strip patch.file &&
check_result sub/file1
'
test_expect_success 'apply --whitespace=strip from config' '
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
git config apply.whitespace strip &&
git apply patch.file &&
check_result sub/file1
'
D=`pwd`
test_expect_success 'apply --whitespace=strip in subdir' '
cd "$D" &&
git config --unset-all apply.whitespace
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
git apply --whitespace=strip ../patch.file &&
check_result file1
'
test_expect_success 'apply --whitespace=strip from config in subdir' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
git apply ../patch.file &&
check_result file1
'
test_expect_success 'same in subdir but with traditional patch input' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
git apply ../gpatch.file &&
check_result file1
'
test_expect_success 'same but with traditional patch input of depth 1' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
git apply ../gpatch-sub.file &&
check_result file1
'
test_expect_success 'same but with traditional patch input of depth 2' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
cd sub &&
git apply ../gpatch-ab-sub.file &&
check_result file1
'
test_expect_success 'same but with traditional patch input of depth 1' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
git apply -p0 gpatch-sub.file &&
check_result sub/file1
'
test_expect_success 'same but with traditional patch input of depth 2' '
cd "$D" &&
git config apply.whitespace strip &&
rm -f sub/file1 &&
cp saved sub/file1 &&
git update-index --refresh &&
git apply gpatch-ab-sub.file &&
check_result sub/file1
'
test_done