Show More
@@ -0,0 +1,355 | |||||
|
1 | This tests the interaction between the largefiles and lfs extensions, and | |||
|
2 | conversion from largefiles -> lfs. | |||
|
3 | ||||
|
4 | $ cat >> $HGRCPATH << EOF | |||
|
5 | > [extensions] | |||
|
6 | > largefiles = | |||
|
7 | > | |||
|
8 | > [lfs] | |||
|
9 | > # standin files are 41 bytes. Stay bigger for clarity. | |||
|
10 | > threshold = 42 | |||
|
11 | > EOF | |||
|
12 | ||||
|
13 | Setup a repo with a normal file and a largefile, above and below the lfs | |||
|
14 | threshold to test lfconvert. *.txt start life as a normal file; *.bin start as | |||
|
15 | an lfs/largefile. | |||
|
16 | ||||
|
17 | $ hg init largefiles | |||
|
18 | $ cd largefiles | |||
|
19 | $ echo 'normal' > normal.txt | |||
|
20 | $ echo 'normal above lfs threshold 0000000000000000000000000' > lfs.txt | |||
|
21 | $ hg ci -Am 'normal.txt' | |||
|
22 | adding lfs.txt | |||
|
23 | adding normal.txt | |||
|
24 | $ echo 'largefile' > large.bin | |||
|
25 | $ echo 'largefile above lfs threshold 0000000000000000000000' > lfs.bin | |||
|
26 | $ hg add --large large.bin lfs.bin | |||
|
27 | $ hg ci -m 'add largefiles' | |||
|
28 | ||||
|
29 | $ cat >> $HGRCPATH << EOF | |||
|
30 | > [extensions] | |||
|
31 | > lfs = | |||
|
32 | > EOF | |||
|
33 | ||||
|
34 | Add an lfs file and normal file that collide with files on the other branch. | |||
|
35 | large.bin is added as a normal file, and is named as such only to clash with the | |||
|
36 | largefile on the other branch. | |||
|
37 | ||||
|
38 | $ hg up -q '.^' | |||
|
39 | $ echo 'below lfs threshold' > large.bin | |||
|
40 | $ echo 'lfs above the lfs threshold for length 0000000000000' > lfs.bin | |||
|
41 | $ hg ci -Am 'add with lfs extension' | |||
|
42 | adding large.bin | |||
|
43 | adding lfs.bin | |||
|
44 | created new head | |||
|
45 | ||||
|
46 | $ hg log -G | |||
|
47 | @ changeset: 2:e989d0fa3764 | |||
|
48 | | tag: tip | |||
|
49 | | parent: 0:29361292f54d | |||
|
50 | | user: test | |||
|
51 | | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
52 | | summary: add with lfs extension | |||
|
53 | | | |||
|
54 | | o changeset: 1:6513aaab9ca0 | |||
|
55 | |/ user: test | |||
|
56 | | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
57 | | summary: add largefiles | |||
|
58 | | | |||
|
59 | o changeset: 0:29361292f54d | |||
|
60 | user: test | |||
|
61 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
62 | summary: normal.txt | |||
|
63 | ||||
|
64 | -------------------------------------------------------------------------------- | |||
|
65 | Merge largefiles into lfs branch | |||
|
66 | ||||
|
67 | The largefiles extension will prompt to use the normal or largefile when merged | |||
|
68 | into the lfs files. `hg manifest` will show standins if present. They aren't, | |||
|
69 | because largefiles merge doesn't merge content. If it did, selecting (n)ormal | |||
|
70 | would convert to lfs on commit, if appropriate. | |||
|
71 | ||||
|
72 | BUG: Largefiles isn't running the merge tool, like when two lfs files are | |||
|
73 | merged. This is probably by design, but it should probably at least prompt if | |||
|
74 | content should be taken from (l)ocal or (o)ther as well. | |||
|
75 | ||||
|
76 | $ hg --config ui.interactive=True merge 6513aaab9ca0 <<EOF | |||
|
77 | > n | |||
|
78 | > n | |||
|
79 | > EOF | |||
|
80 | remote turned local normal file large.bin into a largefile | |||
|
81 | use (l)argefile or keep (n)ormal file? n | |||
|
82 | remote turned local normal file lfs.bin into a largefile | |||
|
83 | use (l)argefile or keep (n)ormal file? n | |||
|
84 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
85 | (branch merge, don't forget to commit) | |||
|
86 | $ hg ci -m 'merge lfs with largefiles -> normal' | |||
|
87 | $ hg manifest | |||
|
88 | large.bin | |||
|
89 | lfs.bin | |||
|
90 | lfs.txt | |||
|
91 | normal.txt | |||
|
92 | ||||
|
93 | The merged lfs.bin resolved to lfs because the (n)ormal option was picked. The | |||
|
94 | lfs.txt file is unchanged by the merge, because it was added before lfs was | |||
|
95 | enabled, and the content didn't change. | |||
|
96 | $ hg debugdata lfs.bin 0 | |||
|
97 | version https://git-lfs.github.com/spec/v1 | |||
|
98 | oid sha256:81c7492b2c05e130431f65a87651b54a30c5da72c99ce35a1e9b9872a807312b | |||
|
99 | size 53 | |||
|
100 | x-is-binary 0 | |||
|
101 | $ hg debugdata lfs.txt 0 | |||
|
102 | normal above lfs threshold 0000000000000000000000000 | |||
|
103 | ||||
|
104 | Another filelog entry is NOT made by the merge, so nothing is committed as lfs. | |||
|
105 | $ hg log -r . -T '{join(lfs_files, ", ")}\n' | |||
|
106 | ||||
|
107 | ||||
|
108 | Replay the last merge, but pick (l)arge this time. The manifest will show any | |||
|
109 | standins. | |||
|
110 | ||||
|
111 | $ hg up -Cq e989d0fa3764 | |||
|
112 | ||||
|
113 | $ hg --config ui.interactive=True merge 6513aaab9ca0 <<EOF | |||
|
114 | > l | |||
|
115 | > l | |||
|
116 | > EOF | |||
|
117 | remote turned local normal file large.bin into a largefile | |||
|
118 | use (l)argefile or keep (n)ormal file? l | |||
|
119 | remote turned local normal file lfs.bin into a largefile | |||
|
120 | use (l)argefile or keep (n)ormal file? l | |||
|
121 | getting changed largefiles | |||
|
122 | 2 largefiles updated, 0 removed | |||
|
123 | 2 files updated, 0 files merged, 2 files removed, 0 files unresolved | |||
|
124 | (branch merge, don't forget to commit) | |||
|
125 | $ hg ci -m 'merge lfs with largefiles -> large' | |||
|
126 | created new head | |||
|
127 | $ hg manifest | |||
|
128 | .hglf/large.bin | |||
|
129 | .hglf/lfs.bin | |||
|
130 | lfs.txt | |||
|
131 | normal.txt | |||
|
132 | ||||
|
133 | -------------------------------------------------------------------------------- | |||
|
134 | Merge lfs into largefiles branch | |||
|
135 | ||||
|
136 | $ hg up -Cq 6513aaab9ca0 | |||
|
137 | $ hg --config ui.interactive=True merge e989d0fa3764 <<EOF | |||
|
138 | > n | |||
|
139 | > n | |||
|
140 | > EOF | |||
|
141 | remote turned local largefile large.bin into a normal file | |||
|
142 | keep (l)argefile or use (n)ormal file? n | |||
|
143 | remote turned local largefile lfs.bin into a normal file | |||
|
144 | keep (l)argefile or use (n)ormal file? n | |||
|
145 | getting changed largefiles | |||
|
146 | 0 largefiles updated, 0 removed | |||
|
147 | 2 files updated, 0 files merged, 2 files removed, 0 files unresolved | |||
|
148 | (branch merge, don't forget to commit) | |||
|
149 | $ hg ci -m 'merge largefiles with lfs -> normal' | |||
|
150 | created new head | |||
|
151 | $ hg manifest | |||
|
152 | large.bin | |||
|
153 | lfs.bin | |||
|
154 | lfs.txt | |||
|
155 | normal.txt | |||
|
156 | ||||
|
157 | The merged lfs.bin got converted to lfs because the (n)ormal option was picked. | |||
|
158 | The lfs.txt file is unchanged by the merge, because it was added before lfs was | |||
|
159 | enabled. | |||
|
160 | $ hg debugdata lfs.bin 0 | |||
|
161 | version https://git-lfs.github.com/spec/v1 | |||
|
162 | oid sha256:81c7492b2c05e130431f65a87651b54a30c5da72c99ce35a1e9b9872a807312b | |||
|
163 | size 53 | |||
|
164 | x-is-binary 0 | |||
|
165 | $ hg debugdata lfs.txt 0 | |||
|
166 | normal above lfs threshold 0000000000000000000000000 | |||
|
167 | ||||
|
168 | Another filelog entry is NOT made by the merge, so nothing is committed as lfs. | |||
|
169 | $ hg log -r . -T '{join(lfs_files, ", ")}\n' | |||
|
170 | ||||
|
171 | ||||
|
172 | Replay the last merge, but pick (l)arge this time. The manifest will show the | |||
|
173 | standins. | |||
|
174 | ||||
|
175 | $ hg up -Cq 6513aaab9ca0 | |||
|
176 | ||||
|
177 | $ hg --config ui.interactive=True merge e989d0fa3764 <<EOF | |||
|
178 | > l | |||
|
179 | > l | |||
|
180 | > EOF | |||
|
181 | remote turned local largefile large.bin into a normal file | |||
|
182 | keep (l)argefile or use (n)ormal file? l | |||
|
183 | remote turned local largefile lfs.bin into a normal file | |||
|
184 | keep (l)argefile or use (n)ormal file? l | |||
|
185 | 0 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
186 | (branch merge, don't forget to commit) | |||
|
187 | $ hg ci -m 'merge largefiles with lfs -> large' | |||
|
188 | created new head | |||
|
189 | $ hg manifest | |||
|
190 | .hglf/large.bin | |||
|
191 | .hglf/lfs.bin | |||
|
192 | lfs.txt | |||
|
193 | normal.txt | |||
|
194 | ||||
|
195 | -------------------------------------------------------------------------------- | |||
|
196 | ||||
|
197 | When both largefiles and lfs are configured to add by size, the tie goes to | |||
|
198 | largefiles since it hooks cmdutil.add() and lfs hooks the filelog write in the | |||
|
199 | commit. By the time the commit occurs, the tracked file is smaller than the | |||
|
200 | threshold (assuming it is > 41, so the standins don't become lfs objects). | |||
|
201 | ||||
|
202 | $ yes | head -n 1048576 > large_by_size.bin | |||
|
203 | $ hg --config largefiles.minsize=1 ci -Am 'large by size' | |||
|
204 | adding large_by_size.bin as a largefile | |||
|
205 | $ hg manifest | |||
|
206 | .hglf/large.bin | |||
|
207 | .hglf/large_by_size.bin | |||
|
208 | .hglf/lfs.bin | |||
|
209 | lfs.txt | |||
|
210 | normal.txt | |||
|
211 | ||||
|
212 | $ hg rm large_by_size.bin | |||
|
213 | $ hg ci -m 'remove large_by_size.bin' | |||
|
214 | ||||
|
215 | Largefiles doesn't do anything special with diff, so it falls back to diffing | |||
|
216 | the standins. Extdiff also is standin based comparison. Diff and extdiff both | |||
|
217 | work on the original file for lfs objects. | |||
|
218 | ||||
|
219 | Largefile -> lfs transition | |||
|
220 | $ hg diff -r 1 -r 3 | |||
|
221 | diff -r 6513aaab9ca0 -r dcc5ce63e252 .hglf/large.bin | |||
|
222 | --- a/.hglf/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
223 | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
224 | @@ -1,1 +0,0 @@ | |||
|
225 | -cef9a458373df9b0743a0d3c14d0c66fb19b8629 | |||
|
226 | diff -r 6513aaab9ca0 -r dcc5ce63e252 .hglf/lfs.bin | |||
|
227 | --- a/.hglf/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
228 | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
229 | @@ -1,1 +0,0 @@ | |||
|
230 | -557fb6309cef935e1ac2c8296508379e4b15a6e6 | |||
|
231 | diff -r 6513aaab9ca0 -r dcc5ce63e252 large.bin | |||
|
232 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
233 | +++ b/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
234 | @@ -0,0 +1,1 @@ | |||
|
235 | +below lfs threshold | |||
|
236 | diff -r 6513aaab9ca0 -r dcc5ce63e252 lfs.bin | |||
|
237 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
238 | +++ b/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
239 | @@ -0,0 +1,1 @@ | |||
|
240 | +lfs above the lfs threshold for length 0000000000000 | |||
|
241 | ||||
|
242 | lfs -> largefiles transition | |||
|
243 | $ hg diff -r 2 -r 6 | |||
|
244 | diff -r e989d0fa3764 -r 95e1e80325c8 .hglf/large.bin | |||
|
245 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
246 | +++ b/.hglf/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
247 | @@ -0,0 +1,1 @@ | |||
|
248 | +cef9a458373df9b0743a0d3c14d0c66fb19b8629 | |||
|
249 | diff -r e989d0fa3764 -r 95e1e80325c8 .hglf/lfs.bin | |||
|
250 | --- /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
251 | +++ b/.hglf/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
252 | @@ -0,0 +1,1 @@ | |||
|
253 | +557fb6309cef935e1ac2c8296508379e4b15a6e6 | |||
|
254 | diff -r e989d0fa3764 -r 95e1e80325c8 large.bin | |||
|
255 | --- a/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
256 | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
257 | @@ -1,1 +0,0 @@ | |||
|
258 | -below lfs threshold | |||
|
259 | diff -r e989d0fa3764 -r 95e1e80325c8 lfs.bin | |||
|
260 | --- a/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
261 | +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 | |||
|
262 | @@ -1,1 +0,0 @@ | |||
|
263 | -lfs above the lfs threshold for length 0000000000000 | |||
|
264 | ||||
|
265 | A largefiles repo can be converted to lfs. The lfconvert command uses the | |||
|
266 | convert extension under the hood with --to-normal. So the --config based | |||
|
267 | parameters are available, but not --authormap, --branchmap, etc. | |||
|
268 | ||||
|
269 | XXX: The default configitems are registered in convert.__init__, and I have no | |||
|
270 | idea how to load that before lfconvert starts using other convert modules and | |||
|
271 | incurring a devel-warn. Even if the convert extension is enabled on the command | |||
|
272 | line, it complains. I have no idea how this fails, and the test in fcd2f9b06629 | |||
|
273 | works. | |||
|
274 | ||||
|
275 | $ cd .. | |||
|
276 | $ hg lfconvert --to-normal largefiles nolargefiles 2>&1 | grep -v 'devel-warn' | |||
|
277 | initializing destination nolargefiles | |||
|
278 | 0 additional largefiles cached | |||
|
279 | scanning source... | |||
|
280 | sorting... | |||
|
281 | converting... | |||
|
282 | 8 normal.txt | |||
|
283 | 7 add largefiles | |||
|
284 | 6 add with lfs extension | |||
|
285 | 5 merge lfs with largefiles -> normal | |||
|
286 | 4 merge lfs with largefiles -> large | |||
|
287 | 3 merge largefiles with lfs -> normal | |||
|
288 | 2 merge largefiles with lfs -> large | |||
|
289 | 1 large by size | |||
|
290 | 0 remove large_by_size.bin | |||
|
291 | $ cd nolargefiles | |||
|
292 | ||||
|
293 | BUG: This should have a requires line for 'lfs' | |||
|
294 | ||||
|
295 | $ cat .hg/requires | |||
|
296 | dotencode | |||
|
297 | fncache | |||
|
298 | generaldelta | |||
|
299 | revlogv1 | |||
|
300 | store | |||
|
301 | $ hg log -r 'all()' -G -T '{rev} {join(lfs_files, ", ")} ({desc})\n' | |||
|
302 | o 8 (remove large_by_size.bin) | |||
|
303 | | | |||
|
304 | o 7 large_by_size.bin (large by size) | |||
|
305 | | | |||
|
306 | o 6 (merge largefiles with lfs -> large) | |||
|
307 | |\ | |||
|
308 | +---o 5 (merge largefiles with lfs -> normal) | |||
|
309 | | |/ | |||
|
310 | +---o 4 lfs.bin (merge lfs with largefiles -> large) | |||
|
311 | | |/ | |||
|
312 | +---o 3 (merge lfs with largefiles -> normal) | |||
|
313 | | |/ | |||
|
314 | | o 2 lfs.bin (add with lfs extension) | |||
|
315 | | | | |||
|
316 | o | 1 lfs.bin (add largefiles) | |||
|
317 | |/ | |||
|
318 | o 0 lfs.txt (normal.txt) | |||
|
319 | ||||
|
320 | $ hg debugdata lfs.bin 0 | |||
|
321 | version https://git-lfs.github.com/spec/v1 | |||
|
322 | oid sha256:2172a5bd492dd41ec533b9bb695f7691b6351719407ac797f0ccad5348c81e62 | |||
|
323 | size 53 | |||
|
324 | x-is-binary 0 | |||
|
325 | $ hg debugdata lfs.bin 1 | |||
|
326 | version https://git-lfs.github.com/spec/v1 | |||
|
327 | oid sha256:81c7492b2c05e130431f65a87651b54a30c5da72c99ce35a1e9b9872a807312b | |||
|
328 | size 53 | |||
|
329 | x-is-binary 0 | |||
|
330 | $ hg debugdata lfs.bin 2 | |||
|
331 | version https://git-lfs.github.com/spec/v1 | |||
|
332 | oid sha256:2172a5bd492dd41ec533b9bb695f7691b6351719407ac797f0ccad5348c81e62 | |||
|
333 | size 53 | |||
|
334 | x-is-binary 0 | |||
|
335 | $ hg debugdata lfs.bin 3 | |||
|
336 | abort: invalid revision identifier 3 | |||
|
337 | [255] | |||
|
338 | ||||
|
339 | No diffs when comparing merge and p1 that kept p1's changes. Diff of lfs to | |||
|
340 | largefiles no longer operates in standin files. | |||
|
341 | ||||
|
342 | $ hg diff -r 2:3 | |||
|
343 | $ hg diff -r 2:6 | |||
|
344 | diff -r e989d0fa3764 -r 752e3a0d8488 large.bin | |||
|
345 | --- a/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
346 | +++ b/large.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
347 | @@ -1,1 +1,1 @@ | |||
|
348 | -below lfs threshold | |||
|
349 | +largefile | |||
|
350 | diff -r e989d0fa3764 -r 752e3a0d8488 lfs.bin | |||
|
351 | --- a/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
352 | +++ b/lfs.bin Thu Jan 01 00:00:00 1970 +0000 | |||
|
353 | @@ -1,1 +1,1 @@ | |||
|
354 | -lfs above the lfs threshold for length 0000000000000 | |||
|
355 | +largefile above lfs threshold 0000000000000000000000 |
General Comments 0
You need to be logged in to leave comments.
Login now