##// END OF EJS Templates
largefiles: allow use of urls with #revision...
Mads Kiilerich -
r18489:f1700480 stable
parent child Browse files
Show More
@@ -1,191 +1,192 b''
1 1 # Copyright 2009-2010 Gregory P. Ward
2 2 # Copyright 2009-2010 Intelerad Medical Systems Incorporated
3 3 # Copyright 2010-2011 Fog Creek Software
4 4 # Copyright 2010-2011 Unity Technologies
5 5 #
6 6 # This software may be used and distributed according to the terms of the
7 7 # GNU General Public License version 2 or any later version.
8 8
9 9 '''base class for store implementations and store-related utility code'''
10 10
11 11 import binascii
12 12 import re
13 13
14 14 from mercurial import util, node, hg
15 15 from mercurial.i18n import _
16 16
17 17 import lfutil
18 18
19 19 class StoreError(Exception):
20 20 '''Raised when there is a problem getting files from or putting
21 21 files to a central store.'''
22 22 def __init__(self, filename, hash, url, detail):
23 23 self.filename = filename
24 24 self.hash = hash
25 25 self.url = url
26 26 self.detail = detail
27 27
28 28 def longmessage(self):
29 29 return (_("error getting id %s from url %s for file %s: %s\n") %
30 30 (self.hash, self.url, self.filename, self.detail))
31 31
32 32 def __str__(self):
33 33 return "%s: %s" % (self.url, self.detail)
34 34
35 35 class basestore(object):
36 36 def __init__(self, ui, repo, url):
37 37 self.ui = ui
38 38 self.repo = repo
39 39 self.url = url
40 40
41 41 def put(self, source, hash):
42 42 '''Put source file into the store under <filename>/<hash>.'''
43 43 raise NotImplementedError('abstract method')
44 44
45 45 def exists(self, hashes):
46 46 '''Check to see if the store contains the given hashes.'''
47 47 raise NotImplementedError('abstract method')
48 48
49 49 def get(self, files):
50 50 '''Get the specified largefiles from the store and write to local
51 51 files under repo.root. files is a list of (filename, hash)
52 52 tuples. Return (success, missing), lists of files successfully
53 53 downloaded and those not found in the store. success is a list
54 54 of (filename, hash) tuples; missing is a list of filenames that
55 55 we could not get. (The detailed error message will already have
56 56 been presented to the user, so missing is just supplied as a
57 57 summary.)'''
58 58 success = []
59 59 missing = []
60 60 ui = self.ui
61 61
62 62 at = 0
63 63 for filename, hash in files:
64 64 ui.progress(_('getting largefiles'), at, unit='lfile',
65 65 total=len(files))
66 66 at += 1
67 67 ui.note(_('getting %s:%s\n') % (filename, hash))
68 68
69 69 storefilename = lfutil.storepath(self.repo, hash)
70 70 tmpfile = util.atomictempfile(storefilename + '.tmp',
71 71 createmode=self.repo.store.createmode)
72 72
73 73 try:
74 74 hhash = binascii.hexlify(self._getfile(tmpfile, filename, hash))
75 75 except StoreError, err:
76 76 ui.warn(err.longmessage())
77 77 hhash = ""
78 78 tmpfile.close() # has probably already been closed!
79 79
80 80 if hhash != hash:
81 81 if hhash != "":
82 82 ui.warn(_('%s: data corruption (expected %s, got %s)\n')
83 83 % (filename, hash, hhash))
84 84 util.unlink(storefilename + '.tmp')
85 85 missing.append(filename)
86 86 continue
87 87
88 88 util.rename(storefilename + '.tmp', storefilename)
89 89 lfutil.linktousercache(self.repo, hash)
90 90 success.append((filename, hhash))
91 91
92 92 ui.progress(_('getting largefiles'), None)
93 93 return (success, missing)
94 94
95 95 def verify(self, revs, contents=False):
96 96 '''Verify the existence (and, optionally, contents) of every big
97 97 file revision referenced by every changeset in revs.
98 98 Return 0 if all is well, non-zero on any errors.'''
99 99 write = self.ui.write
100 100 failed = False
101 101
102 102 write(_('searching %d changesets for largefiles\n') % len(revs))
103 103 verified = set() # set of (filename, filenode) tuples
104 104
105 105 for rev in revs:
106 106 cctx = self.repo[rev]
107 107 cset = "%d:%s" % (cctx.rev(), node.short(cctx.node()))
108 108
109 109 for standin in cctx:
110 110 if self._verifyfile(cctx, cset, contents, standin, verified):
111 111 failed = True
112 112
113 113 numrevs = len(verified)
114 114 numlfiles = len(set([fname for (fname, fnode) in verified]))
115 115 if contents:
116 116 write(_('verified contents of %d revisions of %d largefiles\n')
117 117 % (numrevs, numlfiles))
118 118 else:
119 119 write(_('verified existence of %d revisions of %d largefiles\n')
120 120 % (numrevs, numlfiles))
121 121
122 122 return int(failed)
123 123
124 124 def _getfile(self, tmpfile, filename, hash):
125 125 '''Fetch one revision of one file from the store and write it
126 126 to tmpfile. Compute the hash of the file on-the-fly as it
127 127 downloads and return the binary hash. Close tmpfile. Raise
128 128 StoreError if unable to download the file (e.g. it does not
129 129 exist in the store).'''
130 130 raise NotImplementedError('abstract method')
131 131
132 132 def _verifyfile(self, cctx, cset, contents, standin, verified):
133 133 '''Perform the actual verification of a file in the store.
134 134 '''
135 135 raise NotImplementedError('abstract method')
136 136
137 137 import localstore, wirestore
138 138
139 139 _storeprovider = {
140 140 'file': [localstore.localstore],
141 141 'http': [wirestore.wirestore],
142 142 'https': [wirestore.wirestore],
143 143 'ssh': [wirestore.wirestore],
144 144 }
145 145
146 146 _scheme_re = re.compile(r'^([a-zA-Z0-9+-.]+)://')
147 147
148 148 # During clone this function is passed the src's ui object
149 149 # but it needs the dest's ui object so it can read out of
150 150 # the config file. Use repo.ui instead.
151 151 def _openstore(repo, remote=None, put=False):
152 152 ui = repo.ui
153 153
154 154 if not remote:
155 155 lfpullsource = getattr(repo, 'lfpullsource', None)
156 156 if lfpullsource:
157 157 path = ui.expandpath(lfpullsource)
158 158 else:
159 159 path = ui.expandpath('default-push', 'default')
160 160
161 161 # ui.expandpath() leaves 'default-push' and 'default' alone if
162 162 # they cannot be expanded: fallback to the empty string,
163 163 # meaning the current directory.
164 164 if path == 'default-push' or path == 'default':
165 165 path = ''
166 166 remote = repo
167 167 else:
168 path, _branches = hg.parseurl(path)
168 169 remote = hg.peer(repo, {}, path)
169 170
170 171 # The path could be a scheme so use Mercurial's normal functionality
171 172 # to resolve the scheme to a repository and use its path
172 173 path = util.safehasattr(remote, 'url') and remote.url() or remote.path
173 174
174 175 match = _scheme_re.match(path)
175 176 if not match: # regular filesystem path
176 177 scheme = 'file'
177 178 else:
178 179 scheme = match.group(1)
179 180
180 181 try:
181 182 storeproviders = _storeprovider[scheme]
182 183 except KeyError:
183 184 raise util.Abort(_('unsupported URL scheme %r') % scheme)
184 185
185 186 for classobj in storeproviders:
186 187 try:
187 188 return classobj(ui, repo, remote)
188 189 except lfutil.storeprotonotcapable:
189 190 pass
190 191
191 192 raise util.Abort(_('%s does not appear to be a largefile store') % path)
@@ -1,2075 +1,2074 b''
1 1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
2 2 $ mkdir "${USERCACHE}"
3 3 $ cat >> $HGRCPATH <<EOF
4 4 > [extensions]
5 5 > largefiles=
6 6 > purge=
7 7 > rebase=
8 8 > transplant=
9 9 > [phases]
10 10 > publish=False
11 11 > [largefiles]
12 12 > minsize=2
13 13 > patterns=glob:**.dat
14 14 > usercache=${USERCACHE}
15 15 > [hooks]
16 16 > precommit=sh -c "echo \\"Invoking status precommit hook\\"; hg status"
17 17 > EOF
18 18
19 19 Create the repo with a couple of revisions of both large and normal
20 20 files.
21 21 Test status and dirstate of largefiles and that summary output is correct.
22 22
23 23 $ hg init a
24 24 $ cd a
25 25 $ mkdir sub
26 26 $ echo normal1 > normal1
27 27 $ echo normal2 > sub/normal2
28 28 $ echo large1 > large1
29 29 $ echo large2 > sub/large2
30 30 $ hg add normal1 sub/normal2
31 31 $ hg add --large large1 sub/large2
32 32 $ hg commit -m "add files"
33 33 Invoking status precommit hook
34 34 A large1
35 35 A normal1
36 36 A sub/large2
37 37 A sub/normal2
38 38 $ touch large1 sub/large2
39 39 $ sleep 1
40 40 $ hg st
41 41 $ hg debugstate --nodates
42 42 n 644 41 .hglf/large1
43 43 n 644 41 .hglf/sub/large2
44 44 n 644 8 normal1
45 45 n 644 8 sub/normal2
46 46 $ hg debugstate --large
47 47 n 644 7 large1
48 48 n 644 7 sub/large2
49 49 $ echo normal11 > normal1
50 50 $ echo normal22 > sub/normal2
51 51 $ echo large11 > large1
52 52 $ echo large22 > sub/large2
53 53 $ hg commit -m "edit files"
54 54 Invoking status precommit hook
55 55 M large1
56 56 M normal1
57 57 M sub/large2
58 58 M sub/normal2
59 59 $ hg sum --large
60 60 parent: 1:ce8896473775 tip
61 61 edit files
62 62 branch: default
63 63 commit: (clean)
64 64 update: (current)
65 65 largefiles: (no remote repo)
66 66
67 67 Commit preserved largefile contents.
68 68
69 69 $ cat normal1
70 70 normal11
71 71 $ cat large1
72 72 large11
73 73 $ cat sub/normal2
74 74 normal22
75 75 $ cat sub/large2
76 76 large22
77 77
78 78 Test status, subdir and unknown files
79 79
80 80 $ echo unknown > sub/unknown
81 81 $ hg st --all
82 82 ? sub/unknown
83 83 C large1
84 84 C normal1
85 85 C sub/large2
86 86 C sub/normal2
87 87 $ hg st --all sub
88 88 ? sub/unknown
89 89 C sub/large2
90 90 C sub/normal2
91 91 $ rm sub/unknown
92 92
93 93 Test messages and exit codes for remove warning cases
94 94
95 95 $ hg remove -A large1
96 96 not removing large1: file still exists
97 97 [1]
98 98 $ echo 'modified' > large1
99 99 $ hg remove large1
100 100 not removing large1: file is modified (use -f to force removal)
101 101 [1]
102 102 $ echo 'new' > normalnew
103 103 $ hg add normalnew
104 104 $ echo 'new' > largenew
105 105 $ hg add --large normalnew
106 106 normalnew already tracked!
107 107 $ hg remove normalnew largenew
108 108 not removing largenew: file is untracked
109 109 not removing normalnew: file has been marked for add (use forget to undo)
110 110 [1]
111 111 $ rm normalnew largenew
112 112 $ hg up -Cq
113 113
114 114 Remove both largefiles and normal files.
115 115
116 116 $ hg remove normal1 large1
117 117 $ hg status large1
118 118 R large1
119 119 $ hg commit -m "remove files"
120 120 Invoking status precommit hook
121 121 R large1
122 122 R normal1
123 123 $ ls
124 124 sub
125 125 $ echo "testlargefile" > large1-test
126 126 $ hg add --large large1-test
127 127 $ hg st
128 128 A large1-test
129 129 $ hg rm large1-test
130 130 not removing large1-test: file has been marked for add (use forget to undo)
131 131 [1]
132 132 $ hg st
133 133 A large1-test
134 134 $ hg forget large1-test
135 135 $ hg st
136 136 ? large1-test
137 137 $ hg remove large1-test
138 138 not removing large1-test: file is untracked
139 139 [1]
140 140 $ hg forget large1-test
141 141 not removing large1-test: file is already untracked
142 142 [1]
143 143 $ rm large1-test
144 144
145 145 Copy both largefiles and normal files (testing that status output is correct).
146 146
147 147 $ hg cp sub/normal2 normal1
148 148 $ hg cp sub/large2 large1
149 149 $ hg commit -m "copy files"
150 150 Invoking status precommit hook
151 151 A large1
152 152 A normal1
153 153 $ cat normal1
154 154 normal22
155 155 $ cat large1
156 156 large22
157 157
158 158 Test moving largefiles and verify that normal files are also unaffected.
159 159
160 160 $ hg mv normal1 normal3
161 161 $ hg mv large1 large3
162 162 $ hg mv sub/normal2 sub/normal4
163 163 $ hg mv sub/large2 sub/large4
164 164 $ hg commit -m "move files"
165 165 Invoking status precommit hook
166 166 A large3
167 167 A normal3
168 168 A sub/large4
169 169 A sub/normal4
170 170 R large1
171 171 R normal1
172 172 R sub/large2
173 173 R sub/normal2
174 174 $ cat normal3
175 175 normal22
176 176 $ cat large3
177 177 large22
178 178 $ cat sub/normal4
179 179 normal22
180 180 $ cat sub/large4
181 181 large22
182 182
183 183 Test copies and moves from a directory other than root (issue3516)
184 184
185 185 $ cd ..
186 186 $ hg init lf_cpmv
187 187 $ cd lf_cpmv
188 188 $ mkdir dira
189 189 $ mkdir dira/dirb
190 190 $ touch dira/dirb/largefile
191 191 $ hg add --large dira/dirb/largefile
192 192 $ hg commit -m "added"
193 193 Invoking status precommit hook
194 194 A dira/dirb/largefile
195 195 $ cd dira
196 196 $ hg cp dirb/largefile foo/largefile
197 197 $ hg ci -m "deep copy"
198 198 Invoking status precommit hook
199 199 A dira/foo/largefile
200 200 $ find . | sort
201 201 .
202 202 ./dirb
203 203 ./dirb/largefile
204 204 ./foo
205 205 ./foo/largefile
206 206 $ hg mv foo/largefile baz/largefile
207 207 $ hg ci -m "moved"
208 208 Invoking status precommit hook
209 209 A dira/baz/largefile
210 210 R dira/foo/largefile
211 211 $ find . | sort
212 212 .
213 213 ./baz
214 214 ./baz/largefile
215 215 ./dirb
216 216 ./dirb/largefile
217 217 ./foo
218 218 $ cd ../../a
219 219
220 220 #if serve
221 221 Test display of largefiles in hgweb
222 222
223 223 $ hg serve -d -p $HGPORT --pid-file ../hg.pid
224 224 $ cat ../hg.pid >> $DAEMON_PIDS
225 225 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/?style=raw'
226 226 200 Script output follows
227 227
228 228
229 229 drwxr-xr-x sub
230 230 -rw-r--r-- 41 large3
231 231 -rw-r--r-- 9 normal3
232 232
233 233
234 234 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT 'file/tip/sub/?style=raw'
235 235 200 Script output follows
236 236
237 237
238 238 -rw-r--r-- 41 large4
239 239 -rw-r--r-- 9 normal4
240 240
241 241
242 242 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
243 243 #endif
244 244
245 245 Test archiving the various revisions. These hit corner cases known with
246 246 archiving.
247 247
248 248 $ hg archive -r 0 ../archive0
249 249 $ hg archive -r 1 ../archive1
250 250 $ hg archive -r 2 ../archive2
251 251 $ hg archive -r 3 ../archive3
252 252 $ hg archive -r 4 ../archive4
253 253 $ cd ../archive0
254 254 $ cat normal1
255 255 normal1
256 256 $ cat large1
257 257 large1
258 258 $ cat sub/normal2
259 259 normal2
260 260 $ cat sub/large2
261 261 large2
262 262 $ cd ../archive1
263 263 $ cat normal1
264 264 normal11
265 265 $ cat large1
266 266 large11
267 267 $ cat sub/normal2
268 268 normal22
269 269 $ cat sub/large2
270 270 large22
271 271 $ cd ../archive2
272 272 $ ls
273 273 sub
274 274 $ cat sub/normal2
275 275 normal22
276 276 $ cat sub/large2
277 277 large22
278 278 $ cd ../archive3
279 279 $ cat normal1
280 280 normal22
281 281 $ cat large1
282 282 large22
283 283 $ cat sub/normal2
284 284 normal22
285 285 $ cat sub/large2
286 286 large22
287 287 $ cd ../archive4
288 288 $ cat normal3
289 289 normal22
290 290 $ cat large3
291 291 large22
292 292 $ cat sub/normal4
293 293 normal22
294 294 $ cat sub/large4
295 295 large22
296 296
297 297 Commit corner case: specify files to commit.
298 298
299 299 $ cd ../a
300 300 $ echo normal3 > normal3
301 301 $ echo large3 > large3
302 302 $ echo normal4 > sub/normal4
303 303 $ echo large4 > sub/large4
304 304 $ hg commit normal3 large3 sub/normal4 sub/large4 -m "edit files again"
305 305 Invoking status precommit hook
306 306 M large3
307 307 M normal3
308 308 M sub/large4
309 309 M sub/normal4
310 310 $ cat normal3
311 311 normal3
312 312 $ cat large3
313 313 large3
314 314 $ cat sub/normal4
315 315 normal4
316 316 $ cat sub/large4
317 317 large4
318 318
319 319 One more commit corner case: commit from a subdirectory.
320 320
321 321 $ cd ../a
322 322 $ echo normal33 > normal3
323 323 $ echo large33 > large3
324 324 $ echo normal44 > sub/normal4
325 325 $ echo large44 > sub/large4
326 326 $ cd sub
327 327 $ hg commit -m "edit files yet again"
328 328 Invoking status precommit hook
329 329 M large3
330 330 M normal3
331 331 M sub/large4
332 332 M sub/normal4
333 333 $ cat ../normal3
334 334 normal33
335 335 $ cat ../large3
336 336 large33
337 337 $ cat normal4
338 338 normal44
339 339 $ cat large4
340 340 large44
341 341
342 342 Committing standins is not allowed.
343 343
344 344 $ cd ..
345 345 $ echo large3 > large3
346 346 $ hg commit .hglf/large3 -m "try to commit standin"
347 347 abort: file ".hglf/large3" is a largefile standin
348 348 (commit the largefile itself instead)
349 349 [255]
350 350
351 351 Corner cases for adding largefiles.
352 352
353 353 $ echo large5 > large5
354 354 $ hg add --large large5
355 355 $ hg add --large large5
356 356 large5 already a largefile
357 357 $ mkdir sub2
358 358 $ echo large6 > sub2/large6
359 359 $ echo large7 > sub2/large7
360 360 $ hg add --large sub2
361 361 adding sub2/large6 as a largefile (glob)
362 362 adding sub2/large7 as a largefile (glob)
363 363 $ hg st
364 364 M large3
365 365 A large5
366 366 A sub2/large6
367 367 A sub2/large7
368 368
369 369 Committing directories containing only largefiles.
370 370
371 371 $ mkdir -p z/y/x/m
372 372 $ touch z/y/x/m/large1
373 373 $ touch z/y/x/large2
374 374 $ hg add --large z/y/x/m/large1 z/y/x/large2
375 375 $ hg commit -m "Subdir with directory only containing largefiles" z
376 376 Invoking status precommit hook
377 377 M large3
378 378 A large5
379 379 A sub2/large6
380 380 A sub2/large7
381 381 A z/y/x/large2
382 382 A z/y/x/m/large1
383 383 $ hg rollback --quiet
384 384 $ touch z/y/x/m/normal
385 385 $ hg add z/y/x/m/normal
386 386 $ hg commit -m "Subdir with mixed contents" z
387 387 Invoking status precommit hook
388 388 M large3
389 389 A large5
390 390 A sub2/large6
391 391 A sub2/large7
392 392 A z/y/x/large2
393 393 A z/y/x/m/large1
394 394 A z/y/x/m/normal
395 395 $ hg st
396 396 M large3
397 397 A large5
398 398 A sub2/large6
399 399 A sub2/large7
400 400 $ hg rollback --quiet
401 401 $ hg revert z/y/x/large2 z/y/x/m/large1
402 402 $ rm z/y/x/large2 z/y/x/m/large1
403 403 $ hg commit -m "Subdir with normal contents" z
404 404 Invoking status precommit hook
405 405 M large3
406 406 A large5
407 407 A sub2/large6
408 408 A sub2/large7
409 409 A z/y/x/m/normal
410 410 $ hg st
411 411 M large3
412 412 A large5
413 413 A sub2/large6
414 414 A sub2/large7
415 415 $ hg rollback --quiet
416 416 $ hg revert --quiet z
417 417 $ hg commit -m "Empty subdir" z
418 418 abort: z: no match under directory!
419 419 [255]
420 420 $ rm -rf z
421 421 $ hg ci -m "standin" .hglf
422 422 abort: file ".hglf" is a largefile standin
423 423 (commit the largefile itself instead)
424 424 [255]
425 425
426 426 Test "hg status" with combination of 'file pattern' and 'directory
427 427 pattern' for largefiles:
428 428
429 429 $ hg status sub2/large6 sub2
430 430 A sub2/large6
431 431 A sub2/large7
432 432
433 433 Config settings (pattern **.dat, minsize 2 MB) are respected.
434 434
435 435 $ echo testdata > test.dat
436 436 $ dd bs=1k count=2k if=/dev/zero of=reallylarge > /dev/null 2> /dev/null
437 437 $ hg add
438 438 adding reallylarge as a largefile
439 439 adding test.dat as a largefile
440 440
441 441 Test that minsize and --lfsize handle float values;
442 442 also tests that --lfsize overrides largefiles.minsize.
443 443 (0.250 MB = 256 kB = 262144 B)
444 444
445 445 $ dd if=/dev/zero of=ratherlarge bs=1024 count=256 > /dev/null 2> /dev/null
446 446 $ dd if=/dev/zero of=medium bs=1024 count=128 > /dev/null 2> /dev/null
447 447 $ hg --config largefiles.minsize=.25 add
448 448 adding ratherlarge as a largefile
449 449 adding medium
450 450 $ hg forget medium
451 451 $ hg --config largefiles.minsize=.25 add --lfsize=.125
452 452 adding medium as a largefile
453 453 $ dd if=/dev/zero of=notlarge bs=1024 count=127 > /dev/null 2> /dev/null
454 454 $ hg --config largefiles.minsize=.25 add --lfsize=.125
455 455 adding notlarge
456 456 $ hg forget notlarge
457 457
458 458 Test forget on largefiles.
459 459
460 460 $ hg forget large3 large5 test.dat reallylarge ratherlarge medium
461 461 $ hg commit -m "add/edit more largefiles"
462 462 Invoking status precommit hook
463 463 A sub2/large6
464 464 A sub2/large7
465 465 R large3
466 466 ? large5
467 467 ? medium
468 468 ? notlarge
469 469 ? ratherlarge
470 470 ? reallylarge
471 471 ? test.dat
472 472 $ hg st
473 473 ? large3
474 474 ? large5
475 475 ? medium
476 476 ? notlarge
477 477 ? ratherlarge
478 478 ? reallylarge
479 479 ? test.dat
480 480
481 481 Purge with largefiles: verify that largefiles are still in the working
482 482 dir after a purge.
483 483
484 484 $ hg purge --all
485 485 $ cat sub/large4
486 486 large44
487 487 $ cat sub2/large6
488 488 large6
489 489 $ cat sub2/large7
490 490 large7
491 491
492 492 Test addremove: verify that files that should be added as largfiles are added as
493 493 such and that already-existing largfiles are not added as normal files by
494 494 accident.
495 495
496 496 $ rm normal3
497 497 $ rm sub/large4
498 498 $ echo "testing addremove with patterns" > testaddremove.dat
499 499 $ echo "normaladdremove" > normaladdremove
500 500 $ hg addremove
501 501 removing sub/large4
502 502 adding testaddremove.dat as a largefile
503 503 removing normal3
504 504 adding normaladdremove
505 505
506 506 Test addremove with -R
507 507
508 508 $ hg up -C
509 509 getting changed largefiles
510 510 1 largefiles updated, 0 removed
511 511 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
512 512 $ rm normal3
513 513 $ rm sub/large4
514 514 $ echo "testing addremove with patterns" > testaddremove.dat
515 515 $ echo "normaladdremove" > normaladdremove
516 516 $ cd ..
517 517 $ hg -R a addremove
518 518 removing sub/large4
519 519 adding a/testaddremove.dat as a largefile (glob)
520 520 removing normal3
521 521 adding normaladdremove
522 522 $ cd a
523 523
524 524 Test 3364
525 525 $ hg clone . ../addrm
526 526 updating to branch default
527 527 getting changed largefiles
528 528 3 largefiles updated, 0 removed
529 529 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
530 530 $ cd ../addrm
531 531 $ cat >> .hg/hgrc <<EOF
532 532 > [hooks]
533 533 > post-commit.stat=sh -c "echo \\"Invoking status postcommit hook\\"; hg status -A"
534 534 > EOF
535 535 $ touch foo
536 536 $ hg add --large foo
537 537 $ hg ci -m "add foo"
538 538 Invoking status precommit hook
539 539 A foo
540 540 Invoking status postcommit hook
541 541 C foo
542 542 C normal3
543 543 C sub/large4
544 544 C sub/normal4
545 545 C sub2/large6
546 546 C sub2/large7
547 547 $ rm foo
548 548 $ hg st
549 549 ! foo
550 550 hmm.. no precommit invoked, but there is a postcommit??
551 551 $ hg ci -m "will not checkin"
552 552 nothing changed
553 553 Invoking status postcommit hook
554 554 ! foo
555 555 C normal3
556 556 C sub/large4
557 557 C sub/normal4
558 558 C sub2/large6
559 559 C sub2/large7
560 560 [1]
561 561 $ hg addremove
562 562 removing foo
563 563 $ hg st
564 564 R foo
565 565 $ hg ci -m "used to say nothing changed"
566 566 Invoking status precommit hook
567 567 R foo
568 568 Invoking status postcommit hook
569 569 C normal3
570 570 C sub/large4
571 571 C sub/normal4
572 572 C sub2/large6
573 573 C sub2/large7
574 574 $ hg st
575 575
576 576 Test 3507 (both normal files and largefiles were a problem)
577 577
578 578 $ touch normal
579 579 $ touch large
580 580 $ hg add normal
581 581 $ hg add --large large
582 582 $ hg ci -m "added"
583 583 Invoking status precommit hook
584 584 A large
585 585 A normal
586 586 Invoking status postcommit hook
587 587 C large
588 588 C normal
589 589 C normal3
590 590 C sub/large4
591 591 C sub/normal4
592 592 C sub2/large6
593 593 C sub2/large7
594 594 $ hg remove normal
595 595 $ hg addremove --traceback
596 596 $ hg ci -m "addremoved normal"
597 597 Invoking status precommit hook
598 598 R normal
599 599 Invoking status postcommit hook
600 600 C large
601 601 C normal3
602 602 C sub/large4
603 603 C sub/normal4
604 604 C sub2/large6
605 605 C sub2/large7
606 606 $ hg up -C '.^'
607 607 getting changed largefiles
608 608 0 largefiles updated, 0 removed
609 609 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
610 610 $ hg remove large
611 611 $ hg addremove --traceback
612 612 $ hg ci -m "removed large"
613 613 Invoking status precommit hook
614 614 R large
615 615 created new head
616 616 Invoking status postcommit hook
617 617 C normal
618 618 C normal3
619 619 C sub/large4
620 620 C sub/normal4
621 621 C sub2/large6
622 622 C sub2/large7
623 623
624 624 Test commit -A (issue 3542)
625 625 $ echo large8 > large8
626 626 $ hg add --large large8
627 627 $ hg ci -Am 'this used to add large8 as normal and commit both'
628 628 Invoking status precommit hook
629 629 A large8
630 630 Invoking status postcommit hook
631 631 C large8
632 632 C normal
633 633 C normal3
634 634 C sub/large4
635 635 C sub/normal4
636 636 C sub2/large6
637 637 C sub2/large7
638 638 $ rm large8
639 639 $ hg ci -Am 'this used to not notice the rm'
640 640 removing large8
641 641 Invoking status precommit hook
642 642 R large8
643 643 Invoking status postcommit hook
644 644 C normal
645 645 C normal3
646 646 C sub/large4
647 647 C sub/normal4
648 648 C sub2/large6
649 649 C sub2/large7
650 650
651 651 Test that a standin can't be added as a large file
652 652
653 653 $ touch large
654 654 $ hg add --large large
655 655 $ hg ci -m "add"
656 656 Invoking status precommit hook
657 657 A large
658 658 Invoking status postcommit hook
659 659 C large
660 660 C normal
661 661 C normal3
662 662 C sub/large4
663 663 C sub/normal4
664 664 C sub2/large6
665 665 C sub2/large7
666 666 $ hg remove large
667 667 $ touch large
668 668 $ hg addremove --config largefiles.patterns=**large --traceback
669 669 adding large as a largefile
670 670
671 671 Test that outgoing --large works (with revsets too)
672 672 $ hg outgoing --rev '.^' --large
673 673 comparing with $TESTTMP/a (glob)
674 674 searching for changes
675 675 changeset: 8:c02fd3b77ec4
676 676 user: test
677 677 date: Thu Jan 01 00:00:00 1970 +0000
678 678 summary: add foo
679 679
680 680 changeset: 9:289dd08c9bbb
681 681 user: test
682 682 date: Thu Jan 01 00:00:00 1970 +0000
683 683 summary: used to say nothing changed
684 684
685 685 changeset: 10:34f23ac6ac12
686 686 user: test
687 687 date: Thu Jan 01 00:00:00 1970 +0000
688 688 summary: added
689 689
690 690 changeset: 12:710c1b2f523c
691 691 parent: 10:34f23ac6ac12
692 692 user: test
693 693 date: Thu Jan 01 00:00:00 1970 +0000
694 694 summary: removed large
695 695
696 696 changeset: 13:0a3e75774479
697 697 user: test
698 698 date: Thu Jan 01 00:00:00 1970 +0000
699 699 summary: this used to add large8 as normal and commit both
700 700
701 701 changeset: 14:84f3d378175c
702 702 user: test
703 703 date: Thu Jan 01 00:00:00 1970 +0000
704 704 summary: this used to not notice the rm
705 705
706 706 searching for changes
707 707 largefiles to upload:
708 708 foo
709 709 large
710 710 large8
711 711
712 712 $ cd ../a
713 713
714 714 Clone a largefiles repo.
715 715
716 716 $ hg clone . ../b
717 717 updating to branch default
718 718 getting changed largefiles
719 719 3 largefiles updated, 0 removed
720 720 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
721 721 $ cd ../b
722 722 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
723 723 7:daea875e9014 add/edit more largefiles
724 724 6:4355d653f84f edit files yet again
725 725 5:9d5af5072dbd edit files again
726 726 4:74c02385b94c move files
727 727 3:9e8fbc4bce62 copy files
728 728 2:51a0ae4d5864 remove files
729 729 1:ce8896473775 edit files
730 730 0:30d30fe6a5be add files
731 731 $ cat normal3
732 732 normal33
733 733 $ cat sub/normal4
734 734 normal44
735 735 $ cat sub/large4
736 736 large44
737 737 $ cat sub2/large6
738 738 large6
739 739 $ cat sub2/large7
740 740 large7
741 741 $ cd ..
742 742 $ hg clone a -r 3 c
743 743 adding changesets
744 744 adding manifests
745 745 adding file changes
746 746 added 4 changesets with 10 changes to 4 files
747 747 updating to branch default
748 748 getting changed largefiles
749 749 2 largefiles updated, 0 removed
750 750 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
751 751 $ cd c
752 752 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
753 753 3:9e8fbc4bce62 copy files
754 754 2:51a0ae4d5864 remove files
755 755 1:ce8896473775 edit files
756 756 0:30d30fe6a5be add files
757 757 $ cat normal1
758 758 normal22
759 759 $ cat large1
760 760 large22
761 761 $ cat sub/normal2
762 762 normal22
763 763 $ cat sub/large2
764 764 large22
765 765
766 766 Old revisions of a clone have correct largefiles content (this also
767 767 tests update).
768 768
769 769 $ hg update -r 1
770 770 getting changed largefiles
771 771 1 largefiles updated, 0 removed
772 772 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
773 773 $ cat large1
774 774 large11
775 775 $ cat sub/large2
776 776 large22
777 777 $ cd ..
778 778
779 779 Test cloning with --all-largefiles flag
780 780
781 781 $ rm "${USERCACHE}"/*
782 782 $ hg clone --all-largefiles a a-backup
783 783 updating to branch default
784 784 getting changed largefiles
785 785 3 largefiles updated, 0 removed
786 786 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
787 787 8 additional largefiles cached
788 788
789 789 $ rm "${USERCACHE}"/*
790 790 $ hg clone --all-largefiles -u 0 a a-clone0
791 791 updating to branch default
792 792 getting changed largefiles
793 793 2 largefiles updated, 0 removed
794 794 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
795 795 9 additional largefiles cached
796 796 $ hg -R a-clone0 sum
797 797 parent: 0:30d30fe6a5be
798 798 add files
799 799 branch: default
800 800 commit: (clean)
801 801 update: 7 new changesets (update)
802 802
803 803 $ rm "${USERCACHE}"/*
804 804 $ hg clone --all-largefiles -u 1 a a-clone1
805 805 updating to branch default
806 806 getting changed largefiles
807 807 2 largefiles updated, 0 removed
808 808 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
809 809 8 additional largefiles cached
810 810 $ hg -R a-clone1 verify --large --lfa --lfc
811 811 checking changesets
812 812 checking manifests
813 813 crosschecking files in changesets and manifests
814 814 checking files
815 815 10 files, 8 changesets, 24 total revisions
816 816 searching 8 changesets for largefiles
817 817 verified contents of 13 revisions of 6 largefiles
818 818 $ hg -R a-clone1 sum
819 819 parent: 1:ce8896473775
820 820 edit files
821 821 branch: default
822 822 commit: (clean)
823 823 update: 6 new changesets (update)
824 824
825 825 $ rm "${USERCACHE}"/*
826 826 $ hg clone --all-largefiles -U a a-clone-u
827 827 11 additional largefiles cached
828 828 $ hg -R a-clone-u sum
829 829 parent: -1:000000000000 (no revision checked out)
830 830 branch: default
831 831 commit: (clean)
832 832 update: 8 new changesets (update)
833 833
834 834 $ mkdir xyz
835 835 $ cd xyz
836 836 $ hg clone ../a
837 837 destination directory: a
838 838 updating to branch default
839 839 getting changed largefiles
840 840 3 largefiles updated, 0 removed
841 841 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
842 842 $ cd ..
843 843
844 844 Ensure base clone command argument validation
845 845
846 846 $ hg clone -U -u 0 a a-clone-failure
847 847 abort: cannot specify both --noupdate and --updaterev
848 848 [255]
849 849
850 850 $ hg clone --all-largefiles a ssh://localhost/a
851 851 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
852 852 [255]
853 853
854 854 Test pulling with --all-largefiles flag. Also test that the largefiles are
855 855 downloaded from 'default' instead of 'default-push' when no source is specified
856 856 (issue3584)
857 857
858 858 $ rm -Rf a-backup
859 859 $ hg clone -r 1 a a-backup
860 860 adding changesets
861 861 adding manifests
862 862 adding file changes
863 863 added 2 changesets with 8 changes to 4 files
864 864 updating to branch default
865 865 getting changed largefiles
866 866 2 largefiles updated, 0 removed
867 867 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
868 868 $ rm "${USERCACHE}"/*
869 869 $ cd a-backup
870 870 $ hg pull --all-largefiles --config paths.default-push=bogus/path
871 871 pulling from $TESTTMP/a (glob)
872 872 searching for changes
873 873 adding changesets
874 874 adding manifests
875 875 adding file changes
876 876 added 6 changesets with 16 changes to 8 files
877 877 (run 'hg update' to get a working copy)
878 878 caching new largefiles
879 879 3 largefiles cached
880 880 3 additional largefiles cached
881 881 $ cd ..
882 882
883 883 Rebasing between two repositories does not revert largefiles to old
884 884 revisions (this was a very bad bug that took a lot of work to fix).
885 885
886 886 $ hg clone a d
887 887 updating to branch default
888 888 getting changed largefiles
889 889 3 largefiles updated, 0 removed
890 890 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
891 891 $ cd b
892 892 $ echo large4-modified > sub/large4
893 893 $ echo normal3-modified > normal3
894 894 $ hg commit -m "modify normal file and largefile in repo b"
895 895 Invoking status precommit hook
896 896 M normal3
897 897 M sub/large4
898 898 $ cd ../d
899 899 $ echo large6-modified > sub2/large6
900 900 $ echo normal4-modified > sub/normal4
901 901 $ hg commit -m "modify normal file largefile in repo d"
902 902 Invoking status precommit hook
903 903 M sub/normal4
904 904 M sub2/large6
905 905 $ cd ..
906 906 $ hg clone d e
907 907 updating to branch default
908 908 getting changed largefiles
909 909 3 largefiles updated, 0 removed
910 910 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
911 911 $ cd d
912 912
913 913 More rebase testing, but also test that the largefiles are downloaded from
914 914 'default' instead of 'default-push' when no source is specified (issue3584).
915 915 The error messages go away if repo 'b' is created with --all-largefiles.
916 916 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
917 917 pulling from $TESTTMP/b (glob)
918 918 searching for changes
919 919 adding changesets
920 920 adding manifests
921 921 adding file changes
922 922 added 1 changesets with 2 changes to 2 files (+1 heads)
923 923 Invoking status precommit hook
924 924 M sub/normal4
925 925 M sub2/large6
926 926 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
927 927 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large3: can't get file locally (glob)
928 928 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large4: can't get file locally (glob)
929 929 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
930 930 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
931 931 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
932 932 error getting id 5f78770c0e77ba4287ad6ef3071c9bf9c379742f from url file:$TESTTMP/b for file large1: can't get file locally (glob)
933 933 error getting id eb7338044dc27f9bc59b8dd5a246b065ead7a9c4 from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
934 934 error getting id 4669e532d5b2c093a78eca010077e708a071bb64 from url file:$TESTTMP/b for file large1: can't get file locally (glob)
935 935 error getting id 1deebade43c8c498a3c8daddac0244dc55d1331d from url file:$TESTTMP/b for file sub/large2: can't get file locally (glob)
936 936 0 additional largefiles cached
937 937 9 largefiles failed to download
938 938 nothing to rebase
939 939 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
940 940 9:598410d3eb9a modify normal file largefile in repo d
941 941 8:a381d2c8c80e modify normal file and largefile in repo b
942 942 7:daea875e9014 add/edit more largefiles
943 943 6:4355d653f84f edit files yet again
944 944 5:9d5af5072dbd edit files again
945 945 4:74c02385b94c move files
946 946 3:9e8fbc4bce62 copy files
947 947 2:51a0ae4d5864 remove files
948 948 1:ce8896473775 edit files
949 949 0:30d30fe6a5be add files
950 950 $ cat normal3
951 951 normal3-modified
952 952 $ cat sub/normal4
953 953 normal4-modified
954 954 $ cat sub/large4
955 955 large4-modified
956 956 $ cat sub2/large6
957 957 large6-modified
958 958 $ cat sub2/large7
959 959 large7
960 960 $ cd ../e
961 961 $ hg pull ../b
962 962 pulling from ../b
963 963 searching for changes
964 964 adding changesets
965 965 adding manifests
966 966 adding file changes
967 967 added 1 changesets with 2 changes to 2 files (+1 heads)
968 968 (run 'hg heads' to see heads, 'hg merge' to merge)
969 969 caching new largefiles
970 970 0 largefiles cached
971 971 $ hg rebase
972 972 Invoking status precommit hook
973 973 M sub/normal4
974 974 M sub2/large6
975 975 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
976 976 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
977 977 9:598410d3eb9a modify normal file largefile in repo d
978 978 8:a381d2c8c80e modify normal file and largefile in repo b
979 979 7:daea875e9014 add/edit more largefiles
980 980 6:4355d653f84f edit files yet again
981 981 5:9d5af5072dbd edit files again
982 982 4:74c02385b94c move files
983 983 3:9e8fbc4bce62 copy files
984 984 2:51a0ae4d5864 remove files
985 985 1:ce8896473775 edit files
986 986 0:30d30fe6a5be add files
987 987 $ cat normal3
988 988 normal3-modified
989 989 $ cat sub/normal4
990 990 normal4-modified
991 991 $ cat sub/large4
992 992 large4-modified
993 993 $ cat sub2/large6
994 994 large6-modified
995 995 $ cat sub2/large7
996 996 large7
997 997
998 998 Log on largefiles
999 999
1000 1000 - same output
1001 1001 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1002 1002 8:a381d2c8c80e modify normal file and largefile in repo b
1003 1003 6:4355d653f84f edit files yet again
1004 1004 5:9d5af5072dbd edit files again
1005 1005 4:74c02385b94c move files
1006 1006 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1007 1007 8:a381d2c8c80e modify normal file and largefile in repo b
1008 1008 6:4355d653f84f edit files yet again
1009 1009 5:9d5af5072dbd edit files again
1010 1010 4:74c02385b94c move files
1011 1011
1012 1012 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1013 1013 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1014 1014 8:a381d2c8c80e modify normal file and largefile in repo b
1015 1015 6:4355d653f84f edit files yet again
1016 1016 5:9d5af5072dbd edit files again
1017 1017 4:74c02385b94c move files
1018 1018 1:ce8896473775 edit files
1019 1019 0:30d30fe6a5be add files
1020 1020 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1021 1021 9:598410d3eb9a modify normal file largefile in repo d
1022 1022 8:a381d2c8c80e modify normal file and largefile in repo b
1023 1023 6:4355d653f84f edit files yet again
1024 1024 5:9d5af5072dbd edit files again
1025 1025 4:74c02385b94c move files
1026 1026 1:ce8896473775 edit files
1027 1027 0:30d30fe6a5be add files
1028 1028
1029 1029 - globbing gives same result
1030 1030 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1031 1031 9:598410d3eb9a modify normal file largefile in repo d
1032 1032 8:a381d2c8c80e modify normal file and largefile in repo b
1033 1033 6:4355d653f84f edit files yet again
1034 1034 5:9d5af5072dbd edit files again
1035 1035 4:74c02385b94c move files
1036 1036 1:ce8896473775 edit files
1037 1037 0:30d30fe6a5be add files
1038 1038
1039 1039 Rollback on largefiles.
1040 1040
1041 1041 $ echo large4-modified-again > sub/large4
1042 1042 $ hg commit -m "Modify large4 again"
1043 1043 Invoking status precommit hook
1044 1044 M sub/large4
1045 1045 $ hg rollback
1046 1046 repository tip rolled back to revision 9 (undo commit)
1047 1047 working directory now based on revision 9
1048 1048 $ hg st
1049 1049 M sub/large4
1050 1050 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1051 1051 9:598410d3eb9a modify normal file largefile in repo d
1052 1052 8:a381d2c8c80e modify normal file and largefile in repo b
1053 1053 7:daea875e9014 add/edit more largefiles
1054 1054 6:4355d653f84f edit files yet again
1055 1055 5:9d5af5072dbd edit files again
1056 1056 4:74c02385b94c move files
1057 1057 3:9e8fbc4bce62 copy files
1058 1058 2:51a0ae4d5864 remove files
1059 1059 1:ce8896473775 edit files
1060 1060 0:30d30fe6a5be add files
1061 1061 $ cat sub/large4
1062 1062 large4-modified-again
1063 1063
1064 1064 "update --check" refuses to update with uncommitted changes.
1065 1065 $ hg update --check 8
1066 1066 abort: uncommitted local changes
1067 1067 [255]
1068 1068
1069 1069 "update --clean" leaves correct largefiles in working copy, even when there is
1070 1070 .orig files from revert in .hglf.
1071 1071
1072 1072 $ echo mistake > sub2/large7
1073 1073 $ hg revert sub2/large7
1074 1074 $ hg -q update --clean -r null
1075 1075 $ hg update --clean
1076 1076 getting changed largefiles
1077 1077 3 largefiles updated, 0 removed
1078 1078 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1079 1079 $ cat normal3
1080 1080 normal3-modified
1081 1081 $ cat sub/normal4
1082 1082 normal4-modified
1083 1083 $ cat sub/large4
1084 1084 large4-modified
1085 1085 $ cat sub2/large6
1086 1086 large6-modified
1087 1087 $ cat sub2/large7
1088 1088 large7
1089 1089 $ cat sub2/large7.orig
1090 1090 mistake
1091 1091 $ cat .hglf/sub2/large7.orig
1092 1092 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1093 1093
1094 1094 demonstrate misfeature: .orig file is overwritten on every update -C,
1095 1095 also when clean:
1096 1096 $ hg update --clean
1097 1097 getting changed largefiles
1098 1098 0 largefiles updated, 0 removed
1099 1099 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1100 1100 $ cat sub2/large7.orig
1101 1101 large7
1102 1102 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1103 1103
1104 1104 Now "update check" is happy.
1105 1105 $ hg update --check 8
1106 1106 getting changed largefiles
1107 1107 1 largefiles updated, 0 removed
1108 1108 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1109 1109 $ hg update --check
1110 1110 getting changed largefiles
1111 1111 1 largefiles updated, 0 removed
1112 1112 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1113 1113
1114 1114 Test removing empty largefiles directories on update
1115 1115 $ test -d sub2 && echo "sub2 exists"
1116 1116 sub2 exists
1117 1117 $ hg update -q null
1118 1118 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1119 1119 [1]
1120 1120 $ hg update -q
1121 1121
1122 1122 Test hg remove removes empty largefiles directories
1123 1123 $ test -d sub2 && echo "sub2 exists"
1124 1124 sub2 exists
1125 1125 $ hg remove sub2/*
1126 1126 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1127 1127 [1]
1128 1128 $ hg revert sub2/large6 sub2/large7
1129 1129
1130 1130 "revert" works on largefiles (and normal files too).
1131 1131 $ echo hack3 >> normal3
1132 1132 $ echo hack4 >> sub/normal4
1133 1133 $ echo hack4 >> sub/large4
1134 1134 $ rm sub2/large6
1135 1135 $ hg revert sub2/large6
1136 1136 $ hg rm sub2/large6
1137 1137 $ echo new >> sub2/large8
1138 1138 $ hg add --large sub2/large8
1139 1139 # XXX we don't really want to report that we're reverting the standin;
1140 1140 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1141 1141 $ hg revert sub
1142 1142 reverting .hglf/sub/large4 (glob)
1143 1143 reverting sub/normal4 (glob)
1144 1144 $ hg status
1145 1145 M normal3
1146 1146 A sub2/large8
1147 1147 R sub2/large6
1148 1148 ? sub/large4.orig
1149 1149 ? sub/normal4.orig
1150 1150 $ cat sub/normal4
1151 1151 normal4-modified
1152 1152 $ cat sub/large4
1153 1153 large4-modified
1154 1154 $ hg revert -a --no-backup
1155 1155 undeleting .hglf/sub2/large6 (glob)
1156 1156 forgetting .hglf/sub2/large8 (glob)
1157 1157 reverting normal3
1158 1158 $ hg status
1159 1159 ? sub/large4.orig
1160 1160 ? sub/normal4.orig
1161 1161 ? sub2/large8
1162 1162 $ cat normal3
1163 1163 normal3-modified
1164 1164 $ cat sub2/large6
1165 1165 large6-modified
1166 1166 $ rm sub/*.orig sub2/large8
1167 1167
1168 1168 revert some files to an older revision
1169 1169 $ hg revert --no-backup -r 8 sub2
1170 1170 reverting .hglf/sub2/large6 (glob)
1171 1171 $ cat sub2/large6
1172 1172 large6
1173 1173 $ hg revert --no-backup -C -r '.^' sub2
1174 1174 reverting .hglf/sub2/large6 (glob)
1175 1175 $ hg revert --no-backup sub2
1176 1176 reverting .hglf/sub2/large6 (glob)
1177 1177 $ hg status
1178 1178
1179 1179 "verify --large" actually verifies largefiles
1180 1180
1181 1181 - Where Do We Come From? What Are We? Where Are We Going?
1182 1182 $ pwd
1183 1183 $TESTTMP/e
1184 1184 $ hg paths
1185 1185 default = $TESTTMP/d
1186 1186
1187 1187 $ hg verify --large
1188 1188 checking changesets
1189 1189 checking manifests
1190 1190 crosschecking files in changesets and manifests
1191 1191 checking files
1192 1192 10 files, 10 changesets, 28 total revisions
1193 1193 searching 1 changesets for largefiles
1194 1194 verified existence of 3 revisions of 3 largefiles
1195 1195
1196 1196 - introduce missing blob in local store repo and make sure that this is caught:
1197 1197 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1198 1198 $ hg verify --large
1199 1199 checking changesets
1200 1200 checking manifests
1201 1201 crosschecking files in changesets and manifests
1202 1202 checking files
1203 1203 10 files, 10 changesets, 28 total revisions
1204 1204 searching 1 changesets for largefiles
1205 1205 changeset 9:598410d3eb9a: sub/large4 missing
1206 1206 (looked for hash e166e74c7303192238d60af5a9c4ce9bef0b7928)
1207 1207 verified existence of 3 revisions of 3 largefiles
1208 1208 [1]
1209 1209
1210 1210 - introduce corruption and make sure that it is caught when checking content:
1211 1211 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1212 1212 $ hg verify -q --large --lfc
1213 1213 searching 1 changesets for largefiles
1214 1214 changeset 9:598410d3eb9a: sub/large4: contents differ
1215 1215 ($TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928:
1216 1216 expected hash e166e74c7303192238d60af5a9c4ce9bef0b7928,
1217 1217 but got 1f19b76d5b3cad1472c87efb42b582c97e040060)
1218 1218 verified contents of 3 revisions of 3 largefiles
1219 1219 [1]
1220 1220
1221 1221 - cleanup
1222 1222 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1223 1223
1224 1224 - verifying all revisions will fail because we didn't clone all largefiles to d:
1225 1225 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1226 1226 $ hg verify -q --large --lfa --lfc
1227 1227 searching 10 changesets for largefiles
1228 1228 changeset 0:30d30fe6a5be: large1 missing
1229 1229 (looked for hash 4669e532d5b2c093a78eca010077e708a071bb64)
1230 1230 changeset 0:30d30fe6a5be: sub/large2 missing
1231 1231 (looked for hash 1deebade43c8c498a3c8daddac0244dc55d1331d)
1232 1232 changeset 1:ce8896473775: large1 missing
1233 1233 (looked for hash 5f78770c0e77ba4287ad6ef3071c9bf9c379742f)
1234 1234 changeset 1:ce8896473775: sub/large2: contents differ
1235 1235 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4:
1236 1236 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1237 1237 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1238 1238 changeset 3:9e8fbc4bce62: large1: contents differ
1239 1239 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4:
1240 1240 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1241 1241 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1242 1242 changeset 4:74c02385b94c: large3: contents differ
1243 1243 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4:
1244 1244 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1245 1245 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1246 1246 changeset 4:74c02385b94c: sub/large4: contents differ
1247 1247 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4:
1248 1248 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1249 1249 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1250 1250 verified contents of 15 revisions of 6 largefiles
1251 1251 [1]
1252 1252
1253 1253 - cleanup
1254 1254 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1255 1255
1256 1256 Merging does not revert to old versions of largefiles and also check
1257 1257 that merging after having pulled from a non-default remote works
1258 1258 correctly.
1259 1259
1260 1260 $ cd ..
1261 1261 $ hg clone -r 7 e temp
1262 1262 adding changesets
1263 1263 adding manifests
1264 1264 adding file changes
1265 1265 added 8 changesets with 24 changes to 10 files
1266 1266 updating to branch default
1267 1267 getting changed largefiles
1268 1268 3 largefiles updated, 0 removed
1269 1269 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1270 1270 $ hg clone temp f
1271 1271 updating to branch default
1272 1272 getting changed largefiles
1273 1273 3 largefiles updated, 0 removed
1274 1274 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1275 1275 # Delete the largefiles in the largefiles system cache so that we have an
1276 1276 # opportunity to test that caching after a pull works.
1277 1277 $ rm "${USERCACHE}"/*
1278 1278 $ cd f
1279 1279 $ echo "large4-merge-test" > sub/large4
1280 1280 $ hg commit -m "Modify large4 to test merge"
1281 1281 Invoking status precommit hook
1282 1282 M sub/large4
1283 1283 $ hg pull ../e
1284 1284 pulling from ../e
1285 1285 searching for changes
1286 1286 adding changesets
1287 1287 adding manifests
1288 1288 adding file changes
1289 1289 added 2 changesets with 4 changes to 4 files (+1 heads)
1290 1290 (run 'hg heads' to see heads, 'hg merge' to merge)
1291 1291 caching new largefiles
1292 1292 2 largefiles cached
1293 1293 $ hg merge
1294 1294 merging sub/large4
1295 1295 largefile sub/large4 has a merge conflict
1296 1296 keep (l)ocal or take (o)ther? l
1297 1297 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1298 1298 (branch merge, don't forget to commit)
1299 1299 getting changed largefiles
1300 1300 1 largefiles updated, 0 removed
1301 1301 $ hg commit -m "Merge repos e and f"
1302 1302 Invoking status precommit hook
1303 1303 M normal3
1304 1304 M sub/normal4
1305 1305 M sub2/large6
1306 1306 $ cat normal3
1307 1307 normal3-modified
1308 1308 $ cat sub/normal4
1309 1309 normal4-modified
1310 1310 $ cat sub/large4
1311 1311 large4-merge-test
1312 1312 $ cat sub2/large6
1313 1313 large6-modified
1314 1314 $ cat sub2/large7
1315 1315 large7
1316 1316
1317 1317 Test status after merging with a branch that introduces a new largefile:
1318 1318
1319 1319 $ echo large > large
1320 1320 $ hg add --large large
1321 1321 $ hg commit -m 'add largefile'
1322 1322 Invoking status precommit hook
1323 1323 A large
1324 1324 $ hg update -q ".^"
1325 1325 $ echo change >> normal3
1326 1326 $ hg commit -m 'some change'
1327 1327 Invoking status precommit hook
1328 1328 M normal3
1329 1329 created new head
1330 1330 $ hg merge
1331 1331 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1332 1332 (branch merge, don't forget to commit)
1333 1333 getting changed largefiles
1334 1334 1 largefiles updated, 0 removed
1335 1335 $ hg status
1336 1336 M large
1337 1337
1338 1338 - make sure update of merge with removed largefiles fails as expected
1339 1339 $ hg rm sub2/large6
1340 1340 $ hg up -r.
1341 1341 abort: outstanding uncommitted merges
1342 1342 [255]
1343 1343
1344 1344 - revert should be able to revert files introduced in a pending merge
1345 1345 $ hg revert --all -r .
1346 1346 removing .hglf/large
1347 1347 undeleting .hglf/sub2/large6
1348 1348
1349 1349 Test that a normal file and a largefile with the same name and path cannot
1350 1350 coexist.
1351 1351
1352 1352 $ rm sub2/large7
1353 1353 $ echo "largeasnormal" > sub2/large7
1354 1354 $ hg add sub2/large7
1355 1355 sub2/large7 already a largefile
1356 1356
1357 1357 Test that transplanting a largefile change works correctly.
1358 1358
1359 1359 $ cd ..
1360 1360 $ hg clone -r 8 d g
1361 1361 adding changesets
1362 1362 adding manifests
1363 1363 adding file changes
1364 1364 added 9 changesets with 26 changes to 10 files
1365 1365 updating to branch default
1366 1366 getting changed largefiles
1367 1367 3 largefiles updated, 0 removed
1368 1368 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1369 1369 $ cd g
1370 1370 $ hg transplant -s ../d 598410d3eb9a
1371 1371 searching for changes
1372 1372 searching for changes
1373 1373 adding changesets
1374 1374 adding manifests
1375 1375 adding file changes
1376 1376 added 1 changesets with 2 changes to 2 files
1377 1377 getting changed largefiles
1378 1378 1 largefiles updated, 0 removed
1379 1379 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1380 1380 9:598410d3eb9a modify normal file largefile in repo d
1381 1381 8:a381d2c8c80e modify normal file and largefile in repo b
1382 1382 7:daea875e9014 add/edit more largefiles
1383 1383 6:4355d653f84f edit files yet again
1384 1384 5:9d5af5072dbd edit files again
1385 1385 4:74c02385b94c move files
1386 1386 3:9e8fbc4bce62 copy files
1387 1387 2:51a0ae4d5864 remove files
1388 1388 1:ce8896473775 edit files
1389 1389 0:30d30fe6a5be add files
1390 1390 $ cat normal3
1391 1391 normal3-modified
1392 1392 $ cat sub/normal4
1393 1393 normal4-modified
1394 1394 $ cat sub/large4
1395 1395 large4-modified
1396 1396 $ cat sub2/large6
1397 1397 large6-modified
1398 1398 $ cat sub2/large7
1399 1399 large7
1400 1400
1401 1401 Cat a largefile
1402 1402 $ hg cat normal3
1403 1403 normal3-modified
1404 1404 $ hg cat sub/large4
1405 1405 large4-modified
1406 1406 $ rm "${USERCACHE}"/*
1407 1407 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1408 1408 $ cat cat.out
1409 1409 large4-modified
1410 1410 $ rm cat.out
1411 1411 $ hg cat -r a381d2c8c80e normal3
1412 1412 normal3-modified
1413 1413 $ hg cat -r '.^' normal3
1414 1414 normal3-modified
1415 1415 $ hg cat -r '.^' sub/large4
1416 1416 large4-modified
1417 1417
1418 1418 Test that renaming a largefile results in correct output for status
1419 1419
1420 1420 $ hg rename sub/large4 large4-renamed
1421 1421 $ hg commit -m "test rename output"
1422 1422 Invoking status precommit hook
1423 1423 A large4-renamed
1424 1424 R sub/large4
1425 1425 $ cat large4-renamed
1426 1426 large4-modified
1427 1427 $ cd sub2
1428 1428 $ hg rename large6 large6-renamed
1429 1429 $ hg st
1430 1430 A sub2/large6-renamed
1431 1431 R sub2/large6
1432 1432 $ cd ..
1433 1433
1434 1434 Test --normal flag
1435 1435
1436 1436 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1437 1437 $ hg add --normal --large new-largefile
1438 1438 abort: --normal cannot be used with --large
1439 1439 [255]
1440 1440 $ hg add --normal new-largefile
1441 1441 new-largefile: up to 69 MB of RAM may be required to manage this file
1442 1442 (use 'hg revert new-largefile' to cancel the pending addition)
1443 1443 $ cd ..
1444 1444
1445 1445 #if serve
1446 1446 vanilla clients not locked out from largefiles servers on vanilla repos
1447 1447 $ mkdir r1
1448 1448 $ cd r1
1449 1449 $ hg init
1450 1450 $ echo c1 > f1
1451 1451 $ hg add f1
1452 1452 $ hg commit -m "m1"
1453 1453 Invoking status precommit hook
1454 1454 A f1
1455 1455 $ cd ..
1456 1456 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1457 1457 $ cat hg.pid >> $DAEMON_PIDS
1458 1458 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1459 1459 requesting all changes
1460 1460 adding changesets
1461 1461 adding manifests
1462 1462 adding file changes
1463 1463 added 1 changesets with 1 changes to 1 files
1464 1464 updating to branch default
1465 1465 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1466 1466
1467 1467 largefiles clients still work with vanilla servers
1468 1468 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1469 1469 $ cat hg.pid >> $DAEMON_PIDS
1470 1470 $ hg clone http://localhost:$HGPORT1 r3
1471 1471 requesting all changes
1472 1472 adding changesets
1473 1473 adding manifests
1474 1474 adding file changes
1475 1475 added 1 changesets with 1 changes to 1 files
1476 1476 updating to branch default
1477 1477 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1478 1478 #endif
1479 1479
1480 1480
1481 1481 vanilla clients locked out from largefiles http repos
1482 1482 $ mkdir r4
1483 1483 $ cd r4
1484 1484 $ hg init
1485 1485 $ echo c1 > f1
1486 1486 $ hg add --large f1
1487 1487 $ hg commit -m "m1"
1488 1488 Invoking status precommit hook
1489 1489 A f1
1490 1490 $ cd ..
1491 1491
1492 1492 largefiles can be pushed locally (issue3583)
1493 1493 $ hg init dest
1494 1494 $ cd r4
1495 1495 $ hg outgoing ../dest
1496 1496 comparing with ../dest
1497 1497 searching for changes
1498 1498 changeset: 0:639881c12b4c
1499 1499 tag: tip
1500 1500 user: test
1501 1501 date: Thu Jan 01 00:00:00 1970 +0000
1502 1502 summary: m1
1503 1503
1504 1504 $ hg push ../dest
1505 1505 pushing to ../dest
1506 1506 searching for changes
1507 1507 searching for changes
1508 1508 adding changesets
1509 1509 adding manifests
1510 1510 adding file changes
1511 1511 added 1 changesets with 1 changes to 1 files
1512 1512
1513 1513 exit code with nothing outgoing (issue3611)
1514 1514 $ hg outgoing ../dest
1515 1515 comparing with ../dest
1516 1516 searching for changes
1517 1517 no changes found
1518 1518 [1]
1519 1519 $ cd ..
1520 1520
1521 1521 #if serve
1522 1522 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1523 1523 $ cat hg.pid >> $DAEMON_PIDS
1524 1524 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1525 1525 abort: remote error:
1526 1526
1527 1527 This repository uses the largefiles extension.
1528 1528
1529 1529 Please enable it in your Mercurial config file.
1530 1530 [255]
1531 1531
1532 1532 used all HGPORTs, kill all daemons
1533 1533 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1534 1534 #endif
1535 1535
1536 1536 vanilla clients locked out from largefiles ssh repos
1537 1537 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1538 1538 abort: remote error:
1539 1539
1540 1540 This repository uses the largefiles extension.
1541 1541
1542 1542 Please enable it in your Mercurial config file.
1543 1543 [255]
1544 1544
1545 1545 #if serve
1546 1546
1547 1547 largefiles clients refuse to push largefiles repos to vanilla servers
1548 1548 $ mkdir r6
1549 1549 $ cd r6
1550 1550 $ hg init
1551 1551 $ echo c1 > f1
1552 1552 $ hg add f1
1553 1553 $ hg commit -m "m1"
1554 1554 Invoking status precommit hook
1555 1555 A f1
1556 1556 $ cat >> .hg/hgrc <<!
1557 1557 > [web]
1558 1558 > push_ssl = false
1559 1559 > allow_push = *
1560 1560 > !
1561 1561 $ cd ..
1562 1562 $ hg clone r6 r7
1563 1563 updating to branch default
1564 1564 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1565 1565 $ cd r7
1566 1566 $ echo c2 > f2
1567 1567 $ hg add --large f2
1568 1568 $ hg commit -m "m2"
1569 1569 Invoking status precommit hook
1570 1570 A f2
1571 1571 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1572 1572 $ cat ../hg.pid >> $DAEMON_PIDS
1573 1573 $ hg push http://localhost:$HGPORT
1574 1574 pushing to http://localhost:$HGPORT/
1575 1575 searching for changes
1576 1576 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1577 1577 [255]
1578 1578 $ cd ..
1579 1579
1580 1580 putlfile errors are shown (issue3123)
1581 1581 Corrupt the cached largefile in r7 and move it out of the servers usercache
1582 1582 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1583 1583 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1584 1584 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1585 1585 $ hg init empty
1586 1586 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1587 1587 > --config 'web.allow_push=*' --config web.push_ssl=False
1588 1588 $ cat hg.pid >> $DAEMON_PIDS
1589 1589 $ hg push -R r7 http://localhost:$HGPORT1
1590 1590 pushing to http://localhost:$HGPORT1/
1591 1591 searching for changes
1592 1592 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1593 1593 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1594 1594 [255]
1595 1595 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1596 1596 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1597 1597 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1598 1598 $ hg push -R r7 http://localhost:$HGPORT1
1599 1599 pushing to http://localhost:$HGPORT1/
1600 1600 searching for changes
1601 1601 searching for changes
1602 1602 remote: adding changesets
1603 1603 remote: adding manifests
1604 1604 remote: adding file changes
1605 1605 remote: added 2 changesets with 2 changes to 2 files
1606 1606 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1607 1607 server side corruption
1608 1608 $ rm -rf empty
1609 1609
1610 1610 Push a largefiles repository to a served empty repository
1611 1611 $ hg init r8
1612 1612 $ echo c3 > r8/f1
1613 1613 $ hg add --large r8/f1 -R r8
1614 1614 $ hg commit -m "m1" -R r8
1615 1615 Invoking status precommit hook
1616 1616 A f1
1617 1617 $ hg init empty
1618 1618 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1619 1619 > --config 'web.allow_push=*' --config web.push_ssl=False
1620 1620 $ cat hg.pid >> $DAEMON_PIDS
1621 1621 $ rm "${USERCACHE}"/*
1622 $ hg push -R r8 http://localhost:$HGPORT2
1622 $ hg push -R r8 http://localhost:$HGPORT2/#default
1623 1623 pushing to http://localhost:$HGPORT2/
1624 1624 searching for changes
1625 1625 searching for changes
1626 1626 remote: adding changesets
1627 1627 remote: adding manifests
1628 1628 remote: adding file changes
1629 1629 remote: added 1 changesets with 1 changes to 1 files
1630 1630 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1631 1631 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1632 1632
1633 1633 Clone over http, no largefiles pulled on clone.
1634 1634
1635 $ hg clone http://localhost:$HGPORT2/ http-clone -U
1636 requesting all changes
1635 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1637 1636 adding changesets
1638 1637 adding manifests
1639 1638 adding file changes
1640 1639 added 1 changesets with 1 changes to 1 files
1641 1640
1642 1641 test 'verify' with remotestore:
1643 1642
1644 1643 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1645 1644 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1646 1645 $ hg -R http-clone verify --large --lfa
1647 1646 checking changesets
1648 1647 checking manifests
1649 1648 crosschecking files in changesets and manifests
1650 1649 checking files
1651 1650 1 files, 1 changesets, 1 total revisions
1652 1651 searching 1 changesets for largefiles
1653 1652 changeset 0:cf03e5bb9936: f1 missing
1654 1653 verified existence of 1 revisions of 1 largefiles
1655 1654 [1]
1656 1655 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1657 1656 $ hg -R http-clone -q verify --large --lfa
1658 1657 searching 1 changesets for largefiles
1659 1658 verified existence of 1 revisions of 1 largefiles
1660 1659
1661 1660 largefiles pulled on update - a largefile missing on the server:
1662 1661 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1663 1662 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1664 1663 getting changed largefiles
1665 1664 abort: remotestore: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 is missing
1666 1665 [255]
1667 1666 $ hg -R http-clone up -Cqr null
1668 1667
1669 1668 largefiles pulled on update - a largefile corrupted on the server:
1670 1669 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1671 1670 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1672 1671 getting changed largefiles
1673 1672 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1674 1673 0 largefiles updated, 0 removed
1675 1674 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1676 1675 $ hg -R http-clone st
1677 1676 ! f1
1678 1677 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1679 1678 $ [ ! -f http-clone/f1 ]
1680 1679 $ [ ! -f http-clone-usercache ]
1681 1680 $ hg -R http-clone verify --large --lfc
1682 1681 checking changesets
1683 1682 checking manifests
1684 1683 crosschecking files in changesets and manifests
1685 1684 checking files
1686 1685 1 files, 1 changesets, 1 total revisions
1687 1686 searching 1 changesets for largefiles
1688 1687 verified contents of 1 revisions of 1 largefiles
1689 1688 $ hg -R http-clone up -Cqr null
1690 1689
1691 1690 largefiles pulled on update - no server side problems:
1692 1691 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1693 1692 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1694 1693 resolving manifests
1695 1694 overwrite: False, partial: False
1696 1695 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1697 1696 .hglf/f1: remote created -> g
1698 1697 updating: .hglf/f1 1/1 files (100.00%)
1699 1698 getting .hglf/f1
1700 1699 getting changed largefiles
1701 1700 using http://localhost:$HGPORT2/
1702 1701 sending capabilities command
1703 1702 getting largefiles: 0/1 lfile (0.00%)
1704 1703 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1705 1704 sending batch command
1706 1705 sending getlfile command
1707 1706 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1708 1707 1 largefiles updated, 0 removed
1709 1708 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1710 1709
1711 1710 $ ls http-clone-usercache/*
1712 1711 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1713 1712
1714 1713 $ rm -rf empty http-clone*
1715 1714
1716 1715 used all HGPORTs, kill all daemons
1717 1716 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1718 1717
1719 1718 #endif
1720 1719
1721 1720
1722 1721 #if unix-permissions
1723 1722
1724 1723 Clone a local repository owned by another user
1725 1724 We have to simulate that here by setting $HOME and removing write permissions
1726 1725 $ ORIGHOME="$HOME"
1727 1726 $ mkdir alice
1728 1727 $ HOME="`pwd`/alice"
1729 1728 $ cd alice
1730 1729 $ hg init pubrepo
1731 1730 $ cd pubrepo
1732 1731 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1733 1732 $ hg add --large a-large-file
1734 1733 $ hg commit -m "Add a large file"
1735 1734 Invoking status precommit hook
1736 1735 A a-large-file
1737 1736 $ cd ..
1738 1737 $ chmod -R a-w pubrepo
1739 1738 $ cd ..
1740 1739 $ mkdir bob
1741 1740 $ HOME="`pwd`/bob"
1742 1741 $ cd bob
1743 1742 $ hg clone --pull ../alice/pubrepo pubrepo
1744 1743 requesting all changes
1745 1744 adding changesets
1746 1745 adding manifests
1747 1746 adding file changes
1748 1747 added 1 changesets with 1 changes to 1 files
1749 1748 updating to branch default
1750 1749 getting changed largefiles
1751 1750 1 largefiles updated, 0 removed
1752 1751 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1753 1752 $ cd ..
1754 1753 $ chmod -R u+w alice/pubrepo
1755 1754 $ HOME="$ORIGHOME"
1756 1755
1757 1756 #endif
1758 1757
1759 1758 #if symlink
1760 1759
1761 1760 Symlink to a large largefile should behave the same as a symlink to a normal file
1762 1761 $ hg init largesymlink
1763 1762 $ cd largesymlink
1764 1763 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1765 1764 $ hg add --large largefile
1766 1765 $ hg commit -m "commit a large file"
1767 1766 Invoking status precommit hook
1768 1767 A largefile
1769 1768 $ ln -s largefile largelink
1770 1769 $ hg add largelink
1771 1770 $ hg commit -m "commit a large symlink"
1772 1771 Invoking status precommit hook
1773 1772 A largelink
1774 1773 $ rm -f largelink
1775 1774 $ hg up >/dev/null
1776 1775 $ test -f largelink
1777 1776 [1]
1778 1777 $ test -L largelink
1779 1778 [1]
1780 1779 $ rm -f largelink # make next part of the test independent of the previous
1781 1780 $ hg up -C >/dev/null
1782 1781 $ test -f largelink
1783 1782 $ test -L largelink
1784 1783 $ cd ..
1785 1784
1786 1785 #endif
1787 1786
1788 1787 test for pattern matching on 'hg status':
1789 1788 to boost performance, largefiles checks whether specified patterns are
1790 1789 related to largefiles in working directory (NOT to STANDIN) or not.
1791 1790
1792 1791 $ hg init statusmatch
1793 1792 $ cd statusmatch
1794 1793
1795 1794 $ mkdir -p a/b/c/d
1796 1795 $ echo normal > a/b/c/d/e.normal.txt
1797 1796 $ hg add a/b/c/d/e.normal.txt
1798 1797 $ echo large > a/b/c/d/e.large.txt
1799 1798 $ hg add --large a/b/c/d/e.large.txt
1800 1799 $ mkdir -p a/b/c/x
1801 1800 $ echo normal > a/b/c/x/y.normal.txt
1802 1801 $ hg add a/b/c/x/y.normal.txt
1803 1802 $ hg commit -m 'add files'
1804 1803 Invoking status precommit hook
1805 1804 A a/b/c/d/e.large.txt
1806 1805 A a/b/c/d/e.normal.txt
1807 1806 A a/b/c/x/y.normal.txt
1808 1807
1809 1808 (1) no pattern: no performance boost
1810 1809 $ hg status -A
1811 1810 C a/b/c/d/e.large.txt
1812 1811 C a/b/c/d/e.normal.txt
1813 1812 C a/b/c/x/y.normal.txt
1814 1813
1815 1814 (2) pattern not related to largefiles: performance boost
1816 1815 $ hg status -A a/b/c/x
1817 1816 C a/b/c/x/y.normal.txt
1818 1817
1819 1818 (3) pattern related to largefiles: no performance boost
1820 1819 $ hg status -A a/b/c/d
1821 1820 C a/b/c/d/e.large.txt
1822 1821 C a/b/c/d/e.normal.txt
1823 1822
1824 1823 (4) pattern related to STANDIN (not to largefiles): performance boost
1825 1824 $ hg status -A .hglf/a
1826 1825 C .hglf/a/b/c/d/e.large.txt
1827 1826
1828 1827 (5) mixed case: no performance boost
1829 1828 $ hg status -A a/b/c/x a/b/c/d
1830 1829 C a/b/c/d/e.large.txt
1831 1830 C a/b/c/d/e.normal.txt
1832 1831 C a/b/c/x/y.normal.txt
1833 1832
1834 1833 verify that largefiles doesn't break filesets
1835 1834
1836 1835 $ hg log --rev . --exclude "set:binary()"
1837 1836 changeset: 0:41bd42f10efa
1838 1837 tag: tip
1839 1838 user: test
1840 1839 date: Thu Jan 01 00:00:00 1970 +0000
1841 1840 summary: add files
1842 1841
1843 1842 verify that large files in subrepos handled properly
1844 1843 $ hg init subrepo
1845 1844 $ echo "subrepo = subrepo" > .hgsub
1846 1845 $ hg add .hgsub
1847 1846 $ hg ci -m "add subrepo"
1848 1847 Invoking status precommit hook
1849 1848 A .hgsub
1850 1849 ? .hgsubstate
1851 1850 $ echo "rev 1" > subrepo/large.txt
1852 1851 $ hg -R subrepo add --large subrepo/large.txt
1853 1852 $ hg sum
1854 1853 parent: 1:8ee150ea2e9c tip
1855 1854 add subrepo
1856 1855 branch: default
1857 1856 commit: 1 subrepos
1858 1857 update: (current)
1859 1858 $ hg st
1860 1859 $ hg st -S
1861 1860 A subrepo/large.txt
1862 1861 $ hg ci -S -m "commit top repo"
1863 1862 committing subrepository subrepo
1864 1863 Invoking status precommit hook
1865 1864 A large.txt
1866 1865 Invoking status precommit hook
1867 1866 M .hgsubstate
1868 1867 # No differences
1869 1868 $ hg st -S
1870 1869 $ hg sum
1871 1870 parent: 2:ce4cd0c527a6 tip
1872 1871 commit top repo
1873 1872 branch: default
1874 1873 commit: (clean)
1875 1874 update: (current)
1876 1875 $ echo "rev 2" > subrepo/large.txt
1877 1876 $ hg st -S
1878 1877 M subrepo/large.txt
1879 1878 $ hg sum
1880 1879 parent: 2:ce4cd0c527a6 tip
1881 1880 commit top repo
1882 1881 branch: default
1883 1882 commit: 1 subrepos
1884 1883 update: (current)
1885 1884 $ hg ci -m "this commit should fail without -S"
1886 1885 abort: uncommitted changes in subrepo subrepo
1887 1886 (use --subrepos for recursive commit)
1888 1887 [255]
1889 1888
1890 1889 Add a normal file to the subrepo, then test archiving
1891 1890
1892 1891 $ echo 'normal file' > subrepo/normal.txt
1893 1892 $ hg -R subrepo add subrepo/normal.txt
1894 1893
1895 1894 Lock in subrepo, otherwise the change isn't archived
1896 1895
1897 1896 $ hg ci -S -m "add normal file to top level"
1898 1897 committing subrepository subrepo
1899 1898 Invoking status precommit hook
1900 1899 M large.txt
1901 1900 A normal.txt
1902 1901 Invoking status precommit hook
1903 1902 M .hgsubstate
1904 1903 $ hg archive -S ../lf_subrepo_archive
1905 1904 $ find ../lf_subrepo_archive | sort
1906 1905 ../lf_subrepo_archive
1907 1906 ../lf_subrepo_archive/.hg_archival.txt
1908 1907 ../lf_subrepo_archive/.hgsub
1909 1908 ../lf_subrepo_archive/.hgsubstate
1910 1909 ../lf_subrepo_archive/a
1911 1910 ../lf_subrepo_archive/a/b
1912 1911 ../lf_subrepo_archive/a/b/c
1913 1912 ../lf_subrepo_archive/a/b/c/d
1914 1913 ../lf_subrepo_archive/a/b/c/d/e.large.txt
1915 1914 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
1916 1915 ../lf_subrepo_archive/a/b/c/x
1917 1916 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
1918 1917 ../lf_subrepo_archive/subrepo
1919 1918 ../lf_subrepo_archive/subrepo/large.txt
1920 1919 ../lf_subrepo_archive/subrepo/normal.txt
1921 1920
1922 1921 Test update with subrepos.
1923 1922
1924 1923 $ hg update 0
1925 1924 getting changed largefiles
1926 1925 0 largefiles updated, 1 removed
1927 1926 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1928 1927 $ hg status -S
1929 1928 $ hg update tip
1930 1929 getting changed largefiles
1931 1930 1 largefiles updated, 0 removed
1932 1931 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1933 1932 $ hg status -S
1934 1933 # modify a large file
1935 1934 $ echo "modified" > subrepo/large.txt
1936 1935 $ hg st -S
1937 1936 M subrepo/large.txt
1938 1937 # update -C should revert the change.
1939 1938 $ hg update -C
1940 1939 getting changed largefiles
1941 1940 1 largefiles updated, 0 removed
1942 1941 getting changed largefiles
1943 1942 0 largefiles updated, 0 removed
1944 1943 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1945 1944 $ hg status -S
1946 1945
1947 1946 Test archiving a revision that references a subrepo that is not yet
1948 1947 cloned (see test-subrepo-recursion.t):
1949 1948
1950 1949 $ hg clone -U . ../empty
1951 1950 $ cd ../empty
1952 1951 $ hg archive --subrepos -r tip ../archive.tar.gz
1953 1952 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
1954 1953 $ cd ..
1955 1954
1956 1955 Test that addremove picks up largefiles prior to the initial commit (issue3541)
1957 1956
1958 1957 $ hg init addrm2
1959 1958 $ cd addrm2
1960 1959 $ touch large.dat
1961 1960 $ touch large2.dat
1962 1961 $ touch normal
1963 1962 $ hg add --large large.dat
1964 1963 $ hg addremove -v
1965 1964 adding large2.dat as a largefile
1966 1965 adding normal
1967 1966
1968 1967 Test that forgetting all largefiles reverts to islfilesrepo() == False
1969 1968 (addremove will add *.dat as normal files now)
1970 1969 $ hg forget large.dat
1971 1970 $ hg forget large2.dat
1972 1971 $ hg addremove -v
1973 1972 adding large.dat
1974 1973 adding large2.dat
1975 1974
1976 1975 Test commit's addremove option prior to the first commit
1977 1976 $ hg forget large.dat
1978 1977 $ hg forget large2.dat
1979 1978 $ hg add --large large.dat
1980 1979 $ hg ci -Am "commit"
1981 1980 adding large2.dat as a largefile
1982 1981 Invoking status precommit hook
1983 1982 A large.dat
1984 1983 A large2.dat
1985 1984 A normal
1986 1985 $ find .hglf | sort
1987 1986 .hglf
1988 1987 .hglf/large.dat
1989 1988 .hglf/large2.dat
1990 1989
1991 1990 $ cd ..
1992 1991
1993 1992 issue3651: summary/outgoing with largefiles shows "no remote repo"
1994 1993 unexpectedly
1995 1994
1996 1995 $ mkdir issue3651
1997 1996 $ cd issue3651
1998 1997
1999 1998 $ hg init src
2000 1999 $ echo a > src/a
2001 2000 $ hg -R src add --large src/a
2002 2001 $ hg -R src commit -m '#0'
2003 2002 Invoking status precommit hook
2004 2003 A a
2005 2004
2006 2005 check messages when no remote repository is specified:
2007 2006 "no remote repo" route for "hg outgoing --large" is not tested here,
2008 2007 because it can't be reproduced easily.
2009 2008
2010 2009 $ hg init clone1
2011 2010 $ hg -R clone1 -q pull src
2012 2011 $ hg -R clone1 -q update
2013 2012 $ hg -R clone1 paths | grep default
2014 2013 [1]
2015 2014
2016 2015 $ hg -R clone1 summary --large
2017 2016 parent: 0:fc0bd45326d3 tip
2018 2017 #0
2019 2018 branch: default
2020 2019 commit: (clean)
2021 2020 update: (current)
2022 2021 largefiles: (no remote repo)
2023 2022
2024 2023 check messages when there is no files to upload:
2025 2024
2026 2025 $ hg -q clone src clone2
2027 2026 $ hg -R clone2 paths | grep default
2028 2027 default = $TESTTMP/issue3651/src (glob)
2029 2028
2030 2029 $ hg -R clone2 summary --large
2031 2030 parent: 0:fc0bd45326d3 tip
2032 2031 #0
2033 2032 branch: default
2034 2033 commit: (clean)
2035 2034 update: (current)
2036 2035 searching for changes
2037 2036 largefiles: (no files to upload)
2038 2037 $ hg -R clone2 outgoing --large
2039 2038 comparing with $TESTTMP/issue3651/src (glob)
2040 2039 searching for changes
2041 2040 no changes found
2042 2041 searching for changes
2043 2042 largefiles: no files to upload
2044 2043 [1]
2045 2044
2046 2045 check messages when there are files to upload:
2047 2046
2048 2047 $ echo b > clone2/b
2049 2048 $ hg -R clone2 add --large clone2/b
2050 2049 $ hg -R clone2 commit -m '#1'
2051 2050 Invoking status precommit hook
2052 2051 A b
2053 2052 $ hg -R clone2 summary --large
2054 2053 parent: 1:1acbe71ce432 tip
2055 2054 #1
2056 2055 branch: default
2057 2056 commit: (clean)
2058 2057 update: (current)
2059 2058 searching for changes
2060 2059 largefiles: 1 to upload
2061 2060 $ hg -R clone2 outgoing --large
2062 2061 comparing with $TESTTMP/issue3651/src (glob)
2063 2062 searching for changes
2064 2063 changeset: 1:1acbe71ce432
2065 2064 tag: tip
2066 2065 user: test
2067 2066 date: Thu Jan 01 00:00:00 1970 +0000
2068 2067 summary: #1
2069 2068
2070 2069 searching for changes
2071 2070 largefiles to upload:
2072 2071 b
2073 2072
2074 2073
2075 2074 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now