Imported Upstream version 2.5.1
[scm/test.git] / t / t-pull.sh
1 #!/usr/bin/env bash
2
3 . "$(dirname "$0")/testlib.sh"
4
5 begin_test "pull"
6 (
7   set -e
8
9   reponame="$(basename "$0" ".sh")"
10   setup_remote_repo "$reponame"
11
12   clone_repo "$reponame" clone
13   clone_repo "$reponame" repo
14
15   git lfs track "*.dat" 2>&1 | tee track.log
16   grep "Tracking \"\*.dat\"" track.log
17
18   contents="a"
19   contents_oid=$(calc_oid "$contents")
20   contents2="A"
21   contents2_oid=$(calc_oid "$contents2")
22   contents3="dir"
23   contents3_oid=$(calc_oid "$contents3")
24
25   mkdir dir
26   echo "*.log" > .gitignore
27   printf "$contents" > a.dat
28   printf "$contents2" > á.dat
29   printf "$contents3" > dir/dir.dat
30   git add .
31   git commit -m "add files" 2>&1 | tee commit.log
32   grep "master (root-commit)" commit.log
33   grep "5 files changed" commit.log
34   grep "create mode 100644 a.dat" commit.log
35   grep "create mode 100644 .gitattributes" commit.log
36
37   ls -al
38   [ "a" = "$(cat a.dat)" ]
39   [ "A" = "$(cat "á.dat")" ]
40   [ "dir" = "$(cat "dir/dir.dat")" ]
41
42   assert_pointer "master" "a.dat" "$contents_oid" 1
43   assert_pointer "master" "á.dat" "$contents2_oid" 1
44   assert_pointer "master" "dir/dir.dat" "$contents3_oid" 3
45
46   refute_server_object "$reponame" "$contents_oid"
47   refute_server_object "$reponame" "$contents2_oid"
48   refute_server_object "$reponame" "$contents33oid"
49
50   echo "initial push"
51   git push origin master 2>&1 | tee push.log
52   grep "Uploading LFS objects: 100% (3/3), 5 B" push.log
53   grep "master -> master" push.log
54
55   assert_server_object "$reponame" "$contents_oid"
56   assert_server_object "$reponame" "$contents2_oid"
57   assert_server_object "$reponame" "$contents3_oid"
58
59   # change to the clone's working directory
60   cd ../clone
61
62   echo "normal pull"
63   git pull 2>&1
64
65   [ "a" = "$(cat a.dat)" ]
66   [ "A" = "$(cat "á.dat")" ]
67
68   assert_local_object "$contents_oid" 1
69   assert_local_object "$contents2_oid" 1
70   assert_clean_status
71
72   echo "lfs pull"
73   rm -r a.dat á.dat dir # removing files makes the status dirty
74   rm -rf .git/lfs/objects
75   git lfs pull 2>&1 | grep "Downloading LFS objects: 100% (3/3), 5 B"
76   ls -al
77   [ "a" = "$(cat a.dat)" ]
78   [ "A" = "$(cat "á.dat")" ]
79   assert_local_object "$contents_oid" 1
80   assert_local_object "$contents2_oid" 1
81
82   echo "lfs pull with remote"
83   rm -r a.dat á.dat dir
84   rm -rf .git/lfs/objects
85   git lfs pull origin 2>&1 | grep "Downloading LFS objects: 100% (3/3), 5 B"
86   [ "a" = "$(cat a.dat)" ]
87   [ "A" = "$(cat "á.dat")" ]
88   assert_local_object "$contents_oid" 1
89   assert_local_object "$contents2_oid" 1
90   assert_clean_status
91
92   echo "lfs pull with local storage"
93   rm a.dat á.dat
94   git lfs pull
95   [ "a" = "$(cat a.dat)" ]
96   [ "A" = "$(cat "á.dat")" ]
97   assert_clean_status
98
99   echo "lfs pull with include/exclude filters in gitconfig"
100   rm -rf .git/lfs/objects
101   git config "lfs.fetchinclude" "a*"
102   git lfs pull
103   assert_local_object "$contents_oid" 1
104   assert_clean_status
105
106   rm -rf .git/lfs/objects
107   git config --unset "lfs.fetchinclude"
108   git config "lfs.fetchexclude" "a*"
109   git lfs pull
110   refute_local_object "$contents_oid"
111   assert_clean_status
112
113   echo "lfs pull with include/exclude filters in command line"
114   git config --unset "lfs.fetchexclude"
115   rm -rf .git/lfs/objects
116   git lfs pull --include="a*"
117   assert_local_object "$contents_oid" 1
118   assert_clean_status
119
120   rm -rf .git/lfs/objects
121   git lfs pull --exclude="a*"
122   refute_local_object "$contents_oid"
123   assert_clean_status
124
125   echo "resetting to test status"
126   git reset --hard
127   assert_clean_status
128
129   echo "lfs pull clean status"
130   git lfs pull
131   assert_clean_status
132
133   echo "lfs pull with -I"
134   git lfs pull -I "*.dat"
135   assert_clean_status
136
137   echo "lfs pull in subdir"
138   cd dir
139   git lfs pull
140   assert_clean_status
141
142   echo "lfs pull in subdir with -I"
143   git lfs pull -I "*.dat"
144   assert_clean_status
145 )
146 end_test
147
148 begin_test "pull without clean filter"
149 (
150   set -e
151
152   GIT_LFS_SKIP_SMUDGE=1 git clone $GITSERVER/t-pull no-clean
153   cd no-clean
154   git lfs uninstall
155   git config --list > config.txt
156   grep "filter.lfs.clean" config.txt && {
157     echo "clean filter still configured:"
158     cat config.txt
159     exit 1
160   }
161
162   contents="a"
163   contents_oid=$(calc_oid "$contents")
164
165   # LFS object not downloaded, pointer in working directory
166   grep "$contents_oid" a.dat || {
167     echo "a.dat not $contents_oid"
168     ls -al
169     cat a.dat
170     exit 1
171   }
172   assert_local_object "$contents_oid"
173
174   git lfs pull | tee pull.txt
175   if [ "0" -ne "${PIPESTATUS[0]}" ]; then
176     echo >&2 "fatal: expected pull to succeed ..."
177     exit 1
178   fi
179   grep "Git LFS is not installed" pull.txt
180   echo "pulled!"
181
182   # LFS object downloaded, pointer unchanged
183   grep "$contents_oid" a.dat || {
184     echo "a.dat not $contents_oid"
185     ls -al
186     cat a.dat
187     exit 1
188   }
189   assert_local_object "$contents_oid" 1
190 )
191 end_test
192
193 begin_test "pull with raw remote url"
194 (
195   set -e
196   mkdir raw
197   cd raw
198   git init
199   git lfs install --local --skip-smudge
200
201   git remote add origin $GITSERVER/t-pull
202   git pull origin master
203
204   contents="a"
205   contents_oid=$(calc_oid "$contents")
206
207   # LFS object not downloaded, pointer in working directory
208   refute_local_object "$contents_oid"
209   grep "$contents_oid" a.dat
210
211   git lfs pull "$GITSERVER/t-pull"
212   echo "pulled!"
213
214   # LFS object downloaded and in working directory
215   assert_local_object "$contents_oid" 1
216   [ "0" = "$(grep -c "$contents_oid" a.dat)" ]
217   [ "a" = "$(cat a.dat)" ]
218 )
219 end_test
220
221 begin_test "pull with multiple remotes"
222 (
223   set -e
224   mkdir multiple
225   cd multiple
226   git init
227   git lfs install --local --skip-smudge
228
229   git remote add origin "$GITSERVER/t-pull"
230   git remote add bad-remote "invalid-url"
231   git pull origin master
232
233   contents="a"
234   contents_oid=$(calc_oid "$contents")
235
236   # LFS object not downloaded, pointer in working directory
237   refute_local_object "$contents_oid"
238   grep "$contents_oid" a.dat
239
240   # pull should default to origin instead of bad-remote
241   git lfs pull
242   echo "pulled!"
243
244   # LFS object downloaded and in working directory
245   assert_local_object "$contents_oid" 1
246   [ "0" = "$(grep -c "$contents_oid" a.dat)" ]
247   [ "a" = "$(cat a.dat)" ]
248 )
249 end_test
250
251 begin_test "pull: with missing object"
252 (
253   set -e
254
255   # this clone is setup in the first test in this file
256   cd clone
257   rm -rf .git/lfs/objects
258
259   contents_oid=$(calc_oid "a")
260   reponame="$(basename "$0" ".sh")"
261   delete_server_object "$reponame" "$contents_oid"
262   refute_server_object "$reponame" "$contents_oid"
263
264   # should return non-zero, but should also download all the other valid files too
265   git lfs pull 2>&1 | tee pull.log
266   pull_exit="${PIPESTATUS[0]}"
267   [ "$pull_exit" != "0" ]
268
269   grep "$contents_oid" pull.log
270
271   contents2_oid=$(calc_oid "A")
272   assert_local_object "$contents2_oid" 1
273   refute_local_object "$contents_oid"
274 )
275 end_test
276
277 begin_test "pull: outside git repository"
278 (
279   set +e
280   git lfs pull 2>&1 > pull.log
281   res=$?
282
283   set -e
284   if [ "$res" = "0" ]; then
285     echo "Passes because $GIT_LFS_TEST_DIR is unset."
286     exit 0
287   fi
288   [ "$res" = "128" ]
289   grep "Not in a git repository" pull.log
290 )
291 end_test