Raw
1 #!/bin/sh
2
3 test_description='test conversion filters on large files'
4
5 . ./test-lib.sh
6
7 set_attr() {
8 test_when_finished 'rm -f .gitattributes' &&
9 echo "* $*" >.gitattributes
10 }
11
12 check_input() {
13 git read-tree --empty &&
14 git add small large &&
15 git cat-file blob :small >small.index &&
16 git cat-file blob :large | head -n 1 >large.index &&
17 test_cmp small.index large.index
18 }
19
20 check_output() {
21 rm -f small large &&
22 git checkout small large &&
23 head -n 1 large >large.head &&
24 test_cmp small large.head
25 }
26
27 test_expect_success 'setup input tests' '
28 printf "\$Id: foo\$\\r\\n" >small &&
29 cat small small >large &&
30 git config core.bigfilethreshold 20 &&
31 git config filter.test.clean "sed s/.*/CLEAN/"
32 '
33
34 test_expect_success 'autocrlf=true converts on input' '
35 test_config core.autocrlf true &&
36 check_input
37 '
38
39 test_expect_success 'eol=crlf converts on input' '
40 set_attr eol=crlf &&
41 check_input
42 '
43
44 test_expect_success 'ident converts on input' '
45 set_attr ident &&
46 check_input
47 '
48
49 test_expect_success 'user-defined filters convert on input' '
50 set_attr filter=test &&
51 check_input
52 '
53
54 test_expect_success 'setup output tests' '
55 echo "\$Id\$" >small &&
56 cat small small >large &&
57 git add small large &&
58 git config core.bigfilethreshold 7 &&
59 git config filter.test.smudge "sed s/.*/SMUDGE/"
60 '
61
62 test_expect_success 'autocrlf=true converts on output' '
63 test_config core.autocrlf true &&
64 check_output
65 '
66
67 test_expect_success 'eol=crlf converts on output' '
68 set_attr eol=crlf &&
69 check_output
70 '
71
72 test_expect_success 'user-defined filters convert on output' '
73 set_attr filter=test &&
74 check_output
75 '
76
77 test_expect_success 'ident converts on output' '
78 set_attr ident &&
79 rm -f small large &&
80 git checkout small large &&
81 sed -n "s/Id: .*/Id: SHA/p" <small >small.clean &&
82 head -n 1 large >large.head &&
83 sed -n "s/Id: .*/Id: SHA/p" <large.head >large.clean &&
84 test_cmp small.clean large.clean
85 '
86
87 # This smudge filter prepends 5GB of zeros to the file it checks out. This
88 # ensures that smudging doesn't mangle large files on 64-bit Windows.
89 test_expect_success EXPENSIVE,SIZE_T_IS_64BIT,!LONG_IS_64BIT \
90 'files over 4GB convert on output' '
91 test_commit test small "a small file" &&
92 small_size=$(test_file_size small) &&
93 test_config filter.makelarge.smudge \
94 "test-tool genzeros $((5*1024*1024*1024)) && cat" &&
95 echo "small filter=makelarge" >.gitattributes &&
96 rm small &&
97 git checkout -- small &&
98 size=$(test_file_size small) &&
99 test "$size" -eq $((5 * 1024 * 1024 * 1024 + $small_size))
100 '
101
102 # This clean filter writes down the size of input it receives. By checking against
103 # the actual size, we ensure that cleaning doesn't mangle large files on 64-bit Windows.
104 test_expect_success EXPENSIVE,SIZE_T_IS_64BIT,!LONG_IS_64BIT \
105 'files over 4GB convert on input' '
106 test-tool genzeros $((5*1024*1024*1024)) >big &&
107 test_config filter.checklarge.clean "wc -c >big.size" &&
108 echo "big filter=checklarge" >.gitattributes &&
109 git add big &&
110 test $(test_file_size big) -eq $(cat big.size)
111 '
112
113 test_done