1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229
|
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
# Copyright (c) 2005 Robert Fitzsimons
#
test_description='git ls-tree directory and filenames handling.
This test runs git ls-tree with the following in a tree.
1.txt - a file
2.txt - a file
path0/a/b/c/1.txt - a file in a directory
path1/b/c/1.txt - a file in a directory
path2/1.txt - a file in a directory
path3/1.txt - a file in a directory
path3/2.txt - a file in a directory
Test the handling of multiple directories which have matching file
entries. Also test odd filename and missing entries handling.
'
. ./test-lib.sh
test_expect_success 'setup' '
echo 111 >1.txt &&
echo 222 >2.txt &&
mkdir path0 path0/a path0/a/b path0/a/b/c &&
echo 111 >path0/a/b/c/1.txt &&
mkdir path1 path1/b path1/b/c &&
echo 111 >path1/b/c/1.txt &&
mkdir path2 &&
echo 111 >path2/1.txt &&
mkdir path3 &&
echo 111 >path3/1.txt &&
echo 222 >path3/2.txt &&
find *.txt path* \( -type f -o -type l \) -print |
xargs git update-index --add &&
tree=$(git write-tree) &&
echo $tree
'
test_output () {
sed -e "s/ $OID_REGEX / X /" <current >check &&
test_cmp expected check
}
test_expect_success 'ls-tree plain' '
git ls-tree $tree >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X 2.txt
040000 tree X path0
040000 tree X path1
040000 tree X path2
040000 tree X path3
EOF
test_output
'
# Recursive does not show tree nodes anymore...
test_expect_success 'ls-tree recursive' '
git ls-tree -r $tree >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X 2.txt
100644 blob X path0/a/b/c/1.txt
100644 blob X path1/b/c/1.txt
100644 blob X path2/1.txt
100644 blob X path3/1.txt
100644 blob X path3/2.txt
EOF
test_output
'
test_expect_success 'ls-tree filter 1.txt' '
git ls-tree $tree 1.txt >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
EOF
test_output
'
test_expect_success 'ls-tree filter path1/b/c/1.txt' '
git ls-tree $tree path1/b/c/1.txt >current &&
cat >expected <<\EOF &&
100644 blob X path1/b/c/1.txt
EOF
test_output
'
test_expect_success 'ls-tree filter all 1.txt files' '
git ls-tree $tree 1.txt path0/a/b/c/1.txt \
path1/b/c/1.txt path2/1.txt path3/1.txt >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X path0/a/b/c/1.txt
100644 blob X path1/b/c/1.txt
100644 blob X path2/1.txt
100644 blob X path3/1.txt
EOF
test_output
'
# I am not so sure about this one after ls-tree doing pathspec match.
# Having both path0/a and path0/a/b/c makes path0/a redundant, and
# it behaves as if path0/a/b/c, path1/b/c, path2 and path3 are specified.
test_expect_success 'ls-tree filter directories' '
git ls-tree $tree path3 path2 path0/a/b/c path1/b/c path0/a >current &&
cat >expected <<\EOF &&
040000 tree X path0/a/b/c
040000 tree X path1/b/c
040000 tree X path2
040000 tree X path3
EOF
test_output
'
# Again, duplicates are filtered away so this is equivalent to
# having 1.txt and path3
test_expect_success 'ls-tree filter odd names' '
git ls-tree $tree 1.txt ./1.txt .//1.txt \
path3/1.txt path3/./1.txt path3 path3// >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X path3/1.txt
100644 blob X path3/2.txt
EOF
test_output
'
test_expect_success 'ls-tree filter missing files and extra slashes' '
git ls-tree $tree 1.txt/ abc.txt \
path3//23.txt path3/2.txt/// >current &&
>expected &&
test_output
'
test_expect_success 'ls-tree filter is leading path match' '
git ls-tree $tree pa path3/a >current &&
>expected &&
test_output
'
test_expect_success 'ls-tree --full-name' '
(
cd path0 &&
git ls-tree --full-name $tree a
) >current &&
cat >expected <<\EOF &&
040000 tree X path0/a
EOF
test_output
'
test_expect_success 'ls-tree --full-tree' '
(
cd path1/b/c &&
git ls-tree --full-tree $tree
) >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X 2.txt
040000 tree X path0
040000 tree X path1
040000 tree X path2
040000 tree X path3
EOF
test_output
'
test_expect_success 'ls-tree --full-tree -r' '
(
cd path3/ &&
git ls-tree --full-tree -r $tree
) >current &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X 2.txt
100644 blob X path0/a/b/c/1.txt
100644 blob X path1/b/c/1.txt
100644 blob X path2/1.txt
100644 blob X path3/1.txt
100644 blob X path3/2.txt
EOF
test_output
'
test_expect_success 'ls-tree --abbrev=5' '
git ls-tree --abbrev=5 $tree >current &&
sed -e "s/ $_x05[0-9a-f]* / X /" <current >check &&
cat >expected <<\EOF &&
100644 blob X 1.txt
100644 blob X 2.txt
040000 tree X path0
040000 tree X path1
040000 tree X path2
040000 tree X path3
EOF
test_cmp expected check
'
test_expect_success 'ls-tree --name-only' '
git ls-tree --name-only $tree >current &&
cat >expected <<\EOF &&
1.txt
2.txt
path0
path1
path2
path3
EOF
test_output
'
test_expect_success 'ls-tree --name-only -r' '
git ls-tree --name-only -r $tree >current &&
cat >expected <<\EOF &&
1.txt
2.txt
path0/a/b/c/1.txt
path1/b/c/1.txt
path2/1.txt
path3/1.txt
path3/2.txt
EOF
test_output
'
test_done
|