##// END OF EJS Templates
largefiles: fix download of largefiles from an empty list of changesets...
Mads Kiilerich -
r18722:f0aa8bbf stable
parent child Browse files
Show More
@@ -1,570 +1,571
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 '''High-level command function for lfconvert, plus the cmdtable.'''
10 10
11 11 import os
12 12 import shutil
13 13
14 14 from mercurial import util, match as match_, hg, node, context, error, \
15 15 cmdutil, scmutil, commands
16 16 from mercurial.i18n import _
17 17 from mercurial.lock import release
18 18
19 19 import lfutil
20 20 import basestore
21 21
22 22 # -- Commands ----------------------------------------------------------
23 23
24 24 def lfconvert(ui, src, dest, *pats, **opts):
25 25 '''convert a normal repository to a largefiles repository
26 26
27 27 Convert repository SOURCE to a new repository DEST, identical to
28 28 SOURCE except that certain files will be converted as largefiles:
29 29 specifically, any file that matches any PATTERN *or* whose size is
30 30 above the minimum size threshold is converted as a largefile. The
31 31 size used to determine whether or not to track a file as a
32 32 largefile is the size of the first version of the file. The
33 33 minimum size can be specified either with --size or in
34 34 configuration as ``largefiles.size``.
35 35
36 36 After running this command you will need to make sure that
37 37 largefiles is enabled anywhere you intend to push the new
38 38 repository.
39 39
40 40 Use --to-normal to convert largefiles back to normal files; after
41 41 this, the DEST repository can be used without largefiles at all.'''
42 42
43 43 if opts['to_normal']:
44 44 tolfile = False
45 45 else:
46 46 tolfile = True
47 47 size = lfutil.getminsize(ui, True, opts.get('size'), default=None)
48 48
49 49 if not hg.islocal(src):
50 50 raise util.Abort(_('%s is not a local Mercurial repo') % src)
51 51 if not hg.islocal(dest):
52 52 raise util.Abort(_('%s is not a local Mercurial repo') % dest)
53 53
54 54 rsrc = hg.repository(ui, src)
55 55 ui.status(_('initializing destination %s\n') % dest)
56 56 rdst = hg.repository(ui, dest, create=True)
57 57
58 58 success = False
59 59 dstwlock = dstlock = None
60 60 try:
61 61 # Lock destination to prevent modification while it is converted to.
62 62 # Don't need to lock src because we are just reading from its history
63 63 # which can't change.
64 64 dstwlock = rdst.wlock()
65 65 dstlock = rdst.lock()
66 66
67 67 # Get a list of all changesets in the source. The easy way to do this
68 68 # is to simply walk the changelog, using changelog.nodesbetween().
69 69 # Take a look at mercurial/revlog.py:639 for more details.
70 70 # Use a generator instead of a list to decrease memory usage
71 71 ctxs = (rsrc[ctx] for ctx in rsrc.changelog.nodesbetween(None,
72 72 rsrc.heads())[0])
73 73 revmap = {node.nullid: node.nullid}
74 74 if tolfile:
75 75 lfiles = set()
76 76 normalfiles = set()
77 77 if not pats:
78 78 pats = ui.configlist(lfutil.longname, 'patterns', default=[])
79 79 if pats:
80 80 matcher = match_.match(rsrc.root, '', list(pats))
81 81 else:
82 82 matcher = None
83 83
84 84 lfiletohash = {}
85 85 for ctx in ctxs:
86 86 ui.progress(_('converting revisions'), ctx.rev(),
87 87 unit=_('revision'), total=rsrc['tip'].rev())
88 88 _lfconvert_addchangeset(rsrc, rdst, ctx, revmap,
89 89 lfiles, normalfiles, matcher, size, lfiletohash)
90 90 ui.progress(_('converting revisions'), None)
91 91
92 92 if os.path.exists(rdst.wjoin(lfutil.shortname)):
93 93 shutil.rmtree(rdst.wjoin(lfutil.shortname))
94 94
95 95 for f in lfiletohash.keys():
96 96 if os.path.isfile(rdst.wjoin(f)):
97 97 os.unlink(rdst.wjoin(f))
98 98 try:
99 99 os.removedirs(os.path.dirname(rdst.wjoin(f)))
100 100 except OSError:
101 101 pass
102 102
103 103 # If there were any files converted to largefiles, add largefiles
104 104 # to the destination repository's requirements.
105 105 if lfiles:
106 106 rdst.requirements.add('largefiles')
107 107 rdst._writerequirements()
108 108 else:
109 109 for ctx in ctxs:
110 110 ui.progress(_('converting revisions'), ctx.rev(),
111 111 unit=_('revision'), total=rsrc['tip'].rev())
112 112 _addchangeset(ui, rsrc, rdst, ctx, revmap)
113 113
114 114 ui.progress(_('converting revisions'), None)
115 115 success = True
116 116 finally:
117 117 rdst.dirstate.clear()
118 118 release(dstlock, dstwlock)
119 119 if not success:
120 120 # we failed, remove the new directory
121 121 shutil.rmtree(rdst.root)
122 122
123 123 def _addchangeset(ui, rsrc, rdst, ctx, revmap):
124 124 # Convert src parents to dst parents
125 125 parents = _convertparents(ctx, revmap)
126 126
127 127 # Generate list of changed files
128 128 files = _getchangedfiles(ctx, parents)
129 129
130 130 def getfilectx(repo, memctx, f):
131 131 if lfutil.standin(f) in files:
132 132 # if the file isn't in the manifest then it was removed
133 133 # or renamed, raise IOError to indicate this
134 134 try:
135 135 fctx = ctx.filectx(lfutil.standin(f))
136 136 except error.LookupError:
137 137 raise IOError
138 138 renamed = fctx.renamed()
139 139 if renamed:
140 140 renamed = lfutil.splitstandin(renamed[0])
141 141
142 142 hash = fctx.data().strip()
143 143 path = lfutil.findfile(rsrc, hash)
144 144
145 145 # If one file is missing, likely all files from this rev are
146 146 if path is None:
147 147 cachelfiles(ui, rsrc, ctx.node())
148 148 path = lfutil.findfile(rsrc, hash)
149 149
150 150 if path is None:
151 151 raise util.Abort(
152 152 _("missing largefile \'%s\' from revision %s")
153 153 % (f, node.hex(ctx.node())))
154 154
155 155 data = ''
156 156 fd = None
157 157 try:
158 158 fd = open(path, 'rb')
159 159 data = fd.read()
160 160 finally:
161 161 if fd:
162 162 fd.close()
163 163 return context.memfilectx(f, data, 'l' in fctx.flags(),
164 164 'x' in fctx.flags(), renamed)
165 165 else:
166 166 return _getnormalcontext(repo.ui, ctx, f, revmap)
167 167
168 168 dstfiles = []
169 169 for file in files:
170 170 if lfutil.isstandin(file):
171 171 dstfiles.append(lfutil.splitstandin(file))
172 172 else:
173 173 dstfiles.append(file)
174 174 # Commit
175 175 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
176 176
177 177 def _lfconvert_addchangeset(rsrc, rdst, ctx, revmap, lfiles, normalfiles,
178 178 matcher, size, lfiletohash):
179 179 # Convert src parents to dst parents
180 180 parents = _convertparents(ctx, revmap)
181 181
182 182 # Generate list of changed files
183 183 files = _getchangedfiles(ctx, parents)
184 184
185 185 dstfiles = []
186 186 for f in files:
187 187 if f not in lfiles and f not in normalfiles:
188 188 islfile = _islfile(f, ctx, matcher, size)
189 189 # If this file was renamed or copied then copy
190 190 # the largefile-ness of its predecessor
191 191 if f in ctx.manifest():
192 192 fctx = ctx.filectx(f)
193 193 renamed = fctx.renamed()
194 194 renamedlfile = renamed and renamed[0] in lfiles
195 195 islfile |= renamedlfile
196 196 if 'l' in fctx.flags():
197 197 if renamedlfile:
198 198 raise util.Abort(
199 199 _('renamed/copied largefile %s becomes symlink')
200 200 % f)
201 201 islfile = False
202 202 if islfile:
203 203 lfiles.add(f)
204 204 else:
205 205 normalfiles.add(f)
206 206
207 207 if f in lfiles:
208 208 dstfiles.append(lfutil.standin(f))
209 209 # largefile in manifest if it has not been removed/renamed
210 210 if f in ctx.manifest():
211 211 fctx = ctx.filectx(f)
212 212 if 'l' in fctx.flags():
213 213 renamed = fctx.renamed()
214 214 if renamed and renamed[0] in lfiles:
215 215 raise util.Abort(_('largefile %s becomes symlink') % f)
216 216
217 217 # largefile was modified, update standins
218 218 fullpath = rdst.wjoin(f)
219 219 util.makedirs(os.path.dirname(fullpath))
220 220 m = util.sha1('')
221 221 m.update(ctx[f].data())
222 222 hash = m.hexdigest()
223 223 if f not in lfiletohash or lfiletohash[f] != hash:
224 224 try:
225 225 fd = open(fullpath, 'wb')
226 226 fd.write(ctx[f].data())
227 227 finally:
228 228 if fd:
229 229 fd.close()
230 230 executable = 'x' in ctx[f].flags()
231 231 os.chmod(fullpath, lfutil.getmode(executable))
232 232 lfutil.writestandin(rdst, lfutil.standin(f), hash,
233 233 executable)
234 234 lfiletohash[f] = hash
235 235 else:
236 236 # normal file
237 237 dstfiles.append(f)
238 238
239 239 def getfilectx(repo, memctx, f):
240 240 if lfutil.isstandin(f):
241 241 # if the file isn't in the manifest then it was removed
242 242 # or renamed, raise IOError to indicate this
243 243 srcfname = lfutil.splitstandin(f)
244 244 try:
245 245 fctx = ctx.filectx(srcfname)
246 246 except error.LookupError:
247 247 raise IOError
248 248 renamed = fctx.renamed()
249 249 if renamed:
250 250 # standin is always a largefile because largefile-ness
251 251 # doesn't change after rename or copy
252 252 renamed = lfutil.standin(renamed[0])
253 253
254 254 return context.memfilectx(f, lfiletohash[srcfname] + '\n', 'l' in
255 255 fctx.flags(), 'x' in fctx.flags(), renamed)
256 256 else:
257 257 return _getnormalcontext(repo.ui, ctx, f, revmap)
258 258
259 259 # Commit
260 260 _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap)
261 261
262 262 def _commitcontext(rdst, parents, ctx, dstfiles, getfilectx, revmap):
263 263 mctx = context.memctx(rdst, parents, ctx.description(), dstfiles,
264 264 getfilectx, ctx.user(), ctx.date(), ctx.extra())
265 265 ret = rdst.commitctx(mctx)
266 266 rdst.setparents(ret)
267 267 revmap[ctx.node()] = rdst.changelog.tip()
268 268
269 269 # Generate list of changed files
270 270 def _getchangedfiles(ctx, parents):
271 271 files = set(ctx.files())
272 272 if node.nullid not in parents:
273 273 mc = ctx.manifest()
274 274 mp1 = ctx.parents()[0].manifest()
275 275 mp2 = ctx.parents()[1].manifest()
276 276 files |= (set(mp1) | set(mp2)) - set(mc)
277 277 for f in mc:
278 278 if mc[f] != mp1.get(f, None) or mc[f] != mp2.get(f, None):
279 279 files.add(f)
280 280 return files
281 281
282 282 # Convert src parents to dst parents
283 283 def _convertparents(ctx, revmap):
284 284 parents = []
285 285 for p in ctx.parents():
286 286 parents.append(revmap[p.node()])
287 287 while len(parents) < 2:
288 288 parents.append(node.nullid)
289 289 return parents
290 290
291 291 # Get memfilectx for a normal file
292 292 def _getnormalcontext(ui, ctx, f, revmap):
293 293 try:
294 294 fctx = ctx.filectx(f)
295 295 except error.LookupError:
296 296 raise IOError
297 297 renamed = fctx.renamed()
298 298 if renamed:
299 299 renamed = renamed[0]
300 300
301 301 data = fctx.data()
302 302 if f == '.hgtags':
303 303 data = _converttags (ui, revmap, data)
304 304 return context.memfilectx(f, data, 'l' in fctx.flags(),
305 305 'x' in fctx.flags(), renamed)
306 306
307 307 # Remap tag data using a revision map
308 308 def _converttags(ui, revmap, data):
309 309 newdata = []
310 310 for line in data.splitlines():
311 311 try:
312 312 id, name = line.split(' ', 1)
313 313 except ValueError:
314 314 ui.warn(_('skipping incorrectly formatted tag %s\n'
315 315 % line))
316 316 continue
317 317 try:
318 318 newid = node.bin(id)
319 319 except TypeError:
320 320 ui.warn(_('skipping incorrectly formatted id %s\n'
321 321 % id))
322 322 continue
323 323 try:
324 324 newdata.append('%s %s\n' % (node.hex(revmap[newid]),
325 325 name))
326 326 except KeyError:
327 327 ui.warn(_('no mapping for id %s\n') % id)
328 328 continue
329 329 return ''.join(newdata)
330 330
331 331 def _islfile(file, ctx, matcher, size):
332 332 '''Return true if file should be considered a largefile, i.e.
333 333 matcher matches it or it is larger than size.'''
334 334 # never store special .hg* files as largefiles
335 335 if file == '.hgtags' or file == '.hgignore' or file == '.hgsigs':
336 336 return False
337 337 if matcher and matcher(file):
338 338 return True
339 339 try:
340 340 return ctx.filectx(file).size() >= size * 1024 * 1024
341 341 except error.LookupError:
342 342 return False
343 343
344 344 def uploadlfiles(ui, rsrc, rdst, files):
345 345 '''upload largefiles to the central store'''
346 346
347 347 if not files:
348 348 return
349 349
350 350 store = basestore._openstore(rsrc, rdst, put=True)
351 351
352 352 at = 0
353 353 ui.debug("sending statlfile command for %d largefiles\n" % len(files))
354 354 retval = store.exists(files)
355 355 files = filter(lambda h: not retval[h], files)
356 356 ui.debug("%d largefiles need to be uploaded\n" % len(files))
357 357
358 358 for hash in files:
359 359 ui.progress(_('uploading largefiles'), at, unit='largefile',
360 360 total=len(files))
361 361 source = lfutil.findfile(rsrc, hash)
362 362 if not source:
363 363 raise util.Abort(_('largefile %s missing from store'
364 364 ' (needs to be uploaded)') % hash)
365 365 # XXX check for errors here
366 366 store.put(source, hash)
367 367 at += 1
368 368 ui.progress(_('uploading largefiles'), None)
369 369
370 370 def verifylfiles(ui, repo, all=False, contents=False):
371 371 '''Verify that every big file revision in the current changeset
372 372 exists in the central store. With --contents, also verify that
373 373 the contents of each big file revision are correct (SHA-1 hash
374 374 matches the revision ID). With --all, check every changeset in
375 375 this repository.'''
376 376 if all:
377 377 # Pass a list to the function rather than an iterator because we know a
378 378 # list will work.
379 379 revs = range(len(repo))
380 380 else:
381 381 revs = ['.']
382 382
383 383 store = basestore._openstore(repo)
384 384 return store.verify(revs, contents=contents)
385 385
386 386 def debugdirstate(ui, repo):
387 387 '''Show basic information for the largefiles dirstate'''
388 388 lfdirstate = lfutil.openlfdirstate(ui, repo)
389 389 for file_, ent in sorted(lfdirstate._map.iteritems()):
390 390 mode = '%3o' % (ent[1] & 0777 & ~util.umask)
391 391 ui.write("%c %s %10d %s\n" % (ent[0], mode, ent[2], file_))
392 392
393 393 def cachelfiles(ui, repo, node, filelist=None):
394 394 '''cachelfiles ensures that all largefiles needed by the specified revision
395 395 are present in the repository's largefile cache.
396 396
397 397 returns a tuple (cached, missing). cached is the list of files downloaded
398 398 by this operation; missing is the list of files that were needed but could
399 399 not be found.'''
400 400 lfiles = lfutil.listlfiles(repo, node)
401 401 if filelist:
402 402 lfiles = set(lfiles) & set(filelist)
403 403 toget = []
404 404
405 405 for lfile in lfiles:
406 406 # If we are mid-merge, then we have to trust the standin that is in the
407 407 # working copy to have the correct hashvalue. This is because the
408 408 # original hg.merge() already updated the standin as part of the normal
409 409 # merge process -- we just have to update the largefile to match.
410 410 if (getattr(repo, "_ismerging", False) and
411 411 os.path.exists(repo.wjoin(lfutil.standin(lfile)))):
412 412 expectedhash = lfutil.readstandin(repo, lfile)
413 413 else:
414 414 expectedhash = repo[node][lfutil.standin(lfile)].data().strip()
415 415
416 416 # if it exists and its hash matches, it might have been locally
417 417 # modified before updating and the user chose 'local'. in this case,
418 418 # it will not be in any store, so don't look for it.
419 419 if ((not os.path.exists(repo.wjoin(lfile)) or
420 420 expectedhash != lfutil.hashfile(repo.wjoin(lfile))) and
421 421 not lfutil.findfile(repo, expectedhash)):
422 422 toget.append((lfile, expectedhash))
423 423
424 424 if toget:
425 425 store = basestore._openstore(repo)
426 426 ret = store.get(toget)
427 427 return ret
428 428
429 429 return ([], [])
430 430
431 431 def downloadlfiles(ui, repo, rev=None):
432 432 matchfn = scmutil.match(repo[None],
433 433 [repo.wjoin(lfutil.shortname)], {})
434 434 def prepare(ctx, fns):
435 435 pass
436 436 totalsuccess = 0
437 437 totalmissing = 0
438 for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
439 prepare):
440 success, missing = cachelfiles(ui, repo, ctx.node())
441 totalsuccess += len(success)
442 totalmissing += len(missing)
438 if rev != []: # walkchangerevs on empty list would return all revs
439 for ctx in cmdutil.walkchangerevs(repo, matchfn, {'rev' : rev},
440 prepare):
441 success, missing = cachelfiles(ui, repo, ctx.node())
442 totalsuccess += len(success)
443 totalmissing += len(missing)
443 444 ui.status(_("%d additional largefiles cached\n") % totalsuccess)
444 445 if totalmissing > 0:
445 446 ui.status(_("%d largefiles failed to download\n") % totalmissing)
446 447 return totalsuccess, totalmissing
447 448
448 449 def updatelfiles(ui, repo, filelist=None, printmessage=True):
449 450 wlock = repo.wlock()
450 451 try:
451 452 lfdirstate = lfutil.openlfdirstate(ui, repo)
452 453 lfiles = set(lfutil.listlfiles(repo)) | set(lfdirstate)
453 454
454 455 if filelist is not None:
455 456 lfiles = [f for f in lfiles if f in filelist]
456 457
457 458 printed = False
458 459 if printmessage and lfiles:
459 460 ui.status(_('getting changed largefiles\n'))
460 461 printed = True
461 462 cachelfiles(ui, repo, '.', lfiles)
462 463
463 464 updated, removed = 0, 0
464 465 for f in lfiles:
465 466 i = _updatelfile(repo, lfdirstate, f)
466 467 if i:
467 468 if i > 0:
468 469 updated += i
469 470 else:
470 471 removed -= i
471 472 if printmessage and (removed or updated) and not printed:
472 473 ui.status(_('getting changed largefiles\n'))
473 474 printed = True
474 475
475 476 lfdirstate.write()
476 477 if printed and printmessage:
477 478 ui.status(_('%d largefiles updated, %d removed\n') % (updated,
478 479 removed))
479 480 finally:
480 481 wlock.release()
481 482
482 483 def _updatelfile(repo, lfdirstate, lfile):
483 484 '''updates a single largefile and copies the state of its standin from
484 485 the repository's dirstate to its state in the lfdirstate.
485 486
486 487 returns 1 if the file was modified, -1 if the file was removed, 0 if the
487 488 file was unchanged, and None if the needed largefile was missing from the
488 489 cache.'''
489 490 ret = 0
490 491 abslfile = repo.wjoin(lfile)
491 492 absstandin = repo.wjoin(lfutil.standin(lfile))
492 493 if os.path.exists(absstandin):
493 494 if os.path.exists(absstandin + '.orig') and os.path.exists(abslfile):
494 495 shutil.copyfile(abslfile, abslfile + '.orig')
495 496 expecthash = lfutil.readstandin(repo, lfile)
496 497 if (expecthash != '' and
497 498 (not os.path.exists(abslfile) or
498 499 expecthash != lfutil.hashfile(abslfile))):
499 500 if not lfutil.copyfromcache(repo, expecthash, lfile):
500 501 # use normallookup() to allocate entry in largefiles dirstate,
501 502 # because lack of it misleads lfilesrepo.status() into
502 503 # recognition that such cache missing files are REMOVED.
503 504 lfdirstate.normallookup(lfile)
504 505 return None # don't try to set the mode
505 506 else:
506 507 # Synchronize largefile dirstate to the last modified time of
507 508 # the file
508 509 lfdirstate.normal(lfile)
509 510 ret = 1
510 511 mode = os.stat(absstandin).st_mode
511 512 if mode != os.stat(abslfile).st_mode:
512 513 os.chmod(abslfile, mode)
513 514 ret = 1
514 515 else:
515 516 # Remove lfiles for which the standin is deleted, unless the
516 517 # lfile is added to the repository again. This happens when a
517 518 # largefile is converted back to a normal file: the standin
518 519 # disappears, but a new (normal) file appears as the lfile.
519 520 if os.path.exists(abslfile) and lfile not in repo[None]:
520 521 util.unlinkpath(abslfile)
521 522 ret = -1
522 523 state = repo.dirstate[lfutil.standin(lfile)]
523 524 if state == 'n':
524 525 # When rebasing, we need to synchronize the standin and the largefile,
525 526 # because otherwise the largefile will get reverted. But for commit's
526 527 # sake, we have to mark the file as unclean.
527 528 if getattr(repo, "_isrebasing", False):
528 529 lfdirstate.normallookup(lfile)
529 530 else:
530 531 lfdirstate.normal(lfile)
531 532 elif state == 'r':
532 533 lfdirstate.remove(lfile)
533 534 elif state == 'a':
534 535 lfdirstate.add(lfile)
535 536 elif state == '?':
536 537 lfdirstate.drop(lfile)
537 538 return ret
538 539
539 540 def catlfile(repo, lfile, rev, filename):
540 541 hash = lfutil.readstandin(repo, lfile, rev)
541 542 if not lfutil.inusercache(repo.ui, hash):
542 543 store = basestore._openstore(repo)
543 544 success, missing = store.get([(lfile, hash)])
544 545 if len(success) != 1:
545 546 raise util.Abort(
546 547 _('largefile %s is not in cache and could not be downloaded')
547 548 % lfile)
548 549 path = lfutil.usercachepath(repo.ui, hash)
549 550 fpout = cmdutil.makefileobj(repo, filename)
550 551 fpin = open(path, "rb")
551 552 fpout.write(fpin.read())
552 553 fpout.close()
553 554 fpin.close()
554 555 return 0
555 556
556 557 # -- hg commands declarations ------------------------------------------------
557 558
558 559 cmdtable = {
559 560 'lfconvert': (lfconvert,
560 561 [('s', 'size', '',
561 562 _('minimum size (MB) for files to be converted '
562 563 'as largefiles'),
563 564 'SIZE'),
564 565 ('', 'to-normal', False,
565 566 _('convert from a largefiles repo to a normal repo')),
566 567 ],
567 568 _('hg lfconvert SOURCE DEST [FILE ...]')),
568 569 }
569 570
570 571 commands.inferrepo += " lfconvert"
@@ -1,2115 +1,2125
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 Show computed destination directory:
835 835
836 836 $ mkdir xyz
837 837 $ cd xyz
838 838 $ hg clone ../a
839 839 destination directory: a
840 840 updating to branch default
841 841 getting changed largefiles
842 842 3 largefiles updated, 0 removed
843 843 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
844 844 $ cd ..
845 845
846 846 Clone URL without path:
847 847
848 848 $ hg clone file://
849 849 abort: repository / not found!
850 850 [255]
851 851
852 852 Ensure base clone command argument validation
853 853
854 854 $ hg clone -U -u 0 a a-clone-failure
855 855 abort: cannot specify both --noupdate and --updaterev
856 856 [255]
857 857
858 858 $ hg clone --all-largefiles a ssh://localhost/a
859 859 abort: --all-largefiles is incompatible with non-local destination ssh://localhost/a
860 860 [255]
861 861
862 862 Test pulling with --all-largefiles flag. Also test that the largefiles are
863 863 downloaded from 'default' instead of 'default-push' when no source is specified
864 864 (issue3584)
865 865
866 866 $ rm -Rf a-backup
867 867 $ hg clone -r 1 a a-backup
868 868 adding changesets
869 869 adding manifests
870 870 adding file changes
871 871 added 2 changesets with 8 changes to 4 files
872 872 updating to branch default
873 873 getting changed largefiles
874 874 2 largefiles updated, 0 removed
875 875 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
876 876 $ rm "${USERCACHE}"/*
877 877 $ cd a-backup
878 878 $ hg pull --all-largefiles --config paths.default-push=bogus/path
879 879 pulling from $TESTTMP/a (glob)
880 880 searching for changes
881 881 adding changesets
882 882 adding manifests
883 883 adding file changes
884 884 added 6 changesets with 16 changes to 8 files
885 885 (run 'hg update' to get a working copy)
886 886 caching new largefiles
887 887 3 largefiles cached
888 888 3 additional largefiles cached
889 889 $ cd ..
890 890
891 891 Rebasing between two repositories does not revert largefiles to old
892 892 revisions (this was a very bad bug that took a lot of work to fix).
893 893
894 894 $ hg clone a d
895 895 updating to branch default
896 896 getting changed largefiles
897 897 3 largefiles updated, 0 removed
898 898 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
899 899 $ cd b
900 900 $ echo large4-modified > sub/large4
901 901 $ echo normal3-modified > normal3
902 902 $ hg commit -m "modify normal file and largefile in repo b"
903 903 Invoking status precommit hook
904 904 M normal3
905 905 M sub/large4
906 906 $ cd ../d
907 907 $ echo large6-modified > sub2/large6
908 908 $ echo normal4-modified > sub/normal4
909 909 $ hg commit -m "modify normal file largefile in repo d"
910 910 Invoking status precommit hook
911 911 M sub/normal4
912 912 M sub2/large6
913 913 $ cd ..
914 914 $ hg clone d e
915 915 updating to branch default
916 916 getting changed largefiles
917 917 3 largefiles updated, 0 removed
918 918 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
919 919 $ cd d
920 920
921 921 More rebase testing, but also test that the largefiles are downloaded from
922 922 'default-push' when no source is specified (issue3584). (The largefile from the
923 923 pulled revision is however not downloaded but found in the local cache.)
924 924 Largefiles are fetched for the new pulled revision, not for existing revisions,
925 925 rebased or not.
926 926
927 927 $ [ ! -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
928 928 $ hg pull --rebase --all-largefiles --config paths.default-push=bogus/path --config paths.default=../b
929 929 pulling from $TESTTMP/b (glob)
930 930 searching for changes
931 931 adding changesets
932 932 adding manifests
933 933 adding file changes
934 934 added 1 changesets with 2 changes to 2 files (+1 heads)
935 935 Invoking status precommit hook
936 936 M sub/normal4
937 937 M sub2/large6
938 938 saved backup bundle to $TESTTMP/d/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
939 939 0 additional largefiles cached
940 940 nothing to rebase
941 941 $ [ -f .hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 ]
942 942 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
943 943 9:598410d3eb9a modify normal file largefile in repo d
944 944 8:a381d2c8c80e modify normal file and largefile in repo b
945 945 7:daea875e9014 add/edit more largefiles
946 946 6:4355d653f84f edit files yet again
947 947 5:9d5af5072dbd edit files again
948 948 4:74c02385b94c move files
949 949 3:9e8fbc4bce62 copy files
950 950 2:51a0ae4d5864 remove files
951 951 1:ce8896473775 edit files
952 952 0:30d30fe6a5be add files
953 953 $ cat normal3
954 954 normal3-modified
955 955 $ cat sub/normal4
956 956 normal4-modified
957 957 $ cat sub/large4
958 958 large4-modified
959 959 $ cat sub2/large6
960 960 large6-modified
961 961 $ cat sub2/large7
962 962 large7
963 963 $ cd ../e
964 964 $ hg pull ../b
965 965 pulling from ../b
966 966 searching for changes
967 967 adding changesets
968 968 adding manifests
969 969 adding file changes
970 970 added 1 changesets with 2 changes to 2 files (+1 heads)
971 971 (run 'hg heads' to see heads, 'hg merge' to merge)
972 972 caching new largefiles
973 973 0 largefiles cached
974 974 $ hg rebase
975 975 Invoking status precommit hook
976 976 M sub/normal4
977 977 M sub2/large6
978 978 saved backup bundle to $TESTTMP/e/.hg/strip-backup/f574fb32bb45-backup.hg (glob)
979 979 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
980 980 9:598410d3eb9a modify normal file largefile in repo d
981 981 8:a381d2c8c80e modify normal file and largefile in repo b
982 982 7:daea875e9014 add/edit more largefiles
983 983 6:4355d653f84f edit files yet again
984 984 5:9d5af5072dbd edit files again
985 985 4:74c02385b94c move files
986 986 3:9e8fbc4bce62 copy files
987 987 2:51a0ae4d5864 remove files
988 988 1:ce8896473775 edit files
989 989 0:30d30fe6a5be add files
990 990 $ cat normal3
991 991 normal3-modified
992 992 $ cat sub/normal4
993 993 normal4-modified
994 994 $ cat sub/large4
995 995 large4-modified
996 996 $ cat sub2/large6
997 997 large6-modified
998 998 $ cat sub2/large7
999 999 large7
1000 1000
1001 1001 Log on largefiles
1002 1002
1003 1003 - same output
1004 1004 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub/large4
1005 1005 8:a381d2c8c80e modify normal file and largefile in repo b
1006 1006 6:4355d653f84f edit files yet again
1007 1007 5:9d5af5072dbd edit files again
1008 1008 4:74c02385b94c move files
1009 1009 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub/large4
1010 1010 8:a381d2c8c80e modify normal file and largefile in repo b
1011 1011 6:4355d653f84f edit files yet again
1012 1012 5:9d5af5072dbd edit files again
1013 1013 4:74c02385b94c move files
1014 1014
1015 1015 - .hglf only matches largefiles, without .hglf it matches 9 bco sub/normal
1016 1016 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' .hglf/sub
1017 1017 8:a381d2c8c80e modify normal file and largefile in repo b
1018 1018 6:4355d653f84f edit files yet again
1019 1019 5:9d5af5072dbd edit files again
1020 1020 4:74c02385b94c move files
1021 1021 1:ce8896473775 edit files
1022 1022 0:30d30fe6a5be add files
1023 1023 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' sub
1024 1024 9:598410d3eb9a modify normal file largefile in repo d
1025 1025 8:a381d2c8c80e modify normal file and largefile in repo b
1026 1026 6:4355d653f84f edit files yet again
1027 1027 5:9d5af5072dbd edit files again
1028 1028 4:74c02385b94c move files
1029 1029 1:ce8896473775 edit files
1030 1030 0:30d30fe6a5be add files
1031 1031
1032 1032 - globbing gives same result
1033 1033 $ hg log --template '{rev}:{node|short} {desc|firstline}\n' 'glob:sub/*'
1034 1034 9:598410d3eb9a modify normal file largefile in repo d
1035 1035 8:a381d2c8c80e modify normal file and largefile in repo b
1036 1036 6:4355d653f84f edit files yet again
1037 1037 5:9d5af5072dbd edit files again
1038 1038 4:74c02385b94c move files
1039 1039 1:ce8896473775 edit files
1040 1040 0:30d30fe6a5be add files
1041 1041
1042 1042 Rollback on largefiles.
1043 1043
1044 1044 $ echo large4-modified-again > sub/large4
1045 1045 $ hg commit -m "Modify large4 again"
1046 1046 Invoking status precommit hook
1047 1047 M sub/large4
1048 1048 $ hg rollback
1049 1049 repository tip rolled back to revision 9 (undo commit)
1050 1050 working directory now based on revision 9
1051 1051 $ hg st
1052 1052 M sub/large4
1053 1053 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1054 1054 9:598410d3eb9a modify normal file largefile in repo d
1055 1055 8:a381d2c8c80e modify normal file and largefile in repo b
1056 1056 7:daea875e9014 add/edit more largefiles
1057 1057 6:4355d653f84f edit files yet again
1058 1058 5:9d5af5072dbd edit files again
1059 1059 4:74c02385b94c move files
1060 1060 3:9e8fbc4bce62 copy files
1061 1061 2:51a0ae4d5864 remove files
1062 1062 1:ce8896473775 edit files
1063 1063 0:30d30fe6a5be add files
1064 1064 $ cat sub/large4
1065 1065 large4-modified-again
1066 1066
1067 1067 "update --check" refuses to update with uncommitted changes.
1068 1068 $ hg update --check 8
1069 1069 abort: uncommitted local changes
1070 1070 [255]
1071 1071
1072 1072 "update --clean" leaves correct largefiles in working copy, even when there is
1073 1073 .orig files from revert in .hglf.
1074 1074
1075 1075 $ echo mistake > sub2/large7
1076 1076 $ hg revert sub2/large7
1077 1077 $ hg -q update --clean -r null
1078 1078 $ hg update --clean
1079 1079 getting changed largefiles
1080 1080 3 largefiles updated, 0 removed
1081 1081 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1082 1082 $ cat normal3
1083 1083 normal3-modified
1084 1084 $ cat sub/normal4
1085 1085 normal4-modified
1086 1086 $ cat sub/large4
1087 1087 large4-modified
1088 1088 $ cat sub2/large6
1089 1089 large6-modified
1090 1090 $ cat sub2/large7
1091 1091 large7
1092 1092 $ cat sub2/large7.orig
1093 1093 mistake
1094 1094 $ cat .hglf/sub2/large7.orig
1095 1095 9dbfb2c79b1c40981b258c3efa1b10b03f18ad31
1096 1096
1097 1097 demonstrate misfeature: .orig file is overwritten on every update -C,
1098 1098 also when clean:
1099 1099 $ hg update --clean
1100 1100 getting changed largefiles
1101 1101 0 largefiles updated, 0 removed
1102 1102 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1103 1103 $ cat sub2/large7.orig
1104 1104 large7
1105 1105 $ rm sub2/large7.orig .hglf/sub2/large7.orig
1106 1106
1107 1107 Now "update check" is happy.
1108 1108 $ hg update --check 8
1109 1109 getting changed largefiles
1110 1110 1 largefiles updated, 0 removed
1111 1111 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1112 1112 $ hg update --check
1113 1113 getting changed largefiles
1114 1114 1 largefiles updated, 0 removed
1115 1115 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1116 1116
1117 1117 Test removing empty largefiles directories on update
1118 1118 $ test -d sub2 && echo "sub2 exists"
1119 1119 sub2 exists
1120 1120 $ hg update -q null
1121 1121 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1122 1122 [1]
1123 1123 $ hg update -q
1124 1124
1125 1125 Test hg remove removes empty largefiles directories
1126 1126 $ test -d sub2 && echo "sub2 exists"
1127 1127 sub2 exists
1128 1128 $ hg remove sub2/*
1129 1129 $ test -d sub2 && echo "error: sub2 should not exist anymore"
1130 1130 [1]
1131 1131 $ hg revert sub2/large6 sub2/large7
1132 1132
1133 1133 "revert" works on largefiles (and normal files too).
1134 1134 $ echo hack3 >> normal3
1135 1135 $ echo hack4 >> sub/normal4
1136 1136 $ echo hack4 >> sub/large4
1137 1137 $ rm sub2/large6
1138 1138 $ hg revert sub2/large6
1139 1139 $ hg rm sub2/large6
1140 1140 $ echo new >> sub2/large8
1141 1141 $ hg add --large sub2/large8
1142 1142 # XXX we don't really want to report that we're reverting the standin;
1143 1143 # that's just an implementation detail. But I don't see an obvious fix. ;-(
1144 1144 $ hg revert sub
1145 1145 reverting .hglf/sub/large4 (glob)
1146 1146 reverting sub/normal4 (glob)
1147 1147 $ hg status
1148 1148 M normal3
1149 1149 A sub2/large8
1150 1150 R sub2/large6
1151 1151 ? sub/large4.orig
1152 1152 ? sub/normal4.orig
1153 1153 $ cat sub/normal4
1154 1154 normal4-modified
1155 1155 $ cat sub/large4
1156 1156 large4-modified
1157 1157 $ hg revert -a --no-backup
1158 1158 undeleting .hglf/sub2/large6 (glob)
1159 1159 forgetting .hglf/sub2/large8 (glob)
1160 1160 reverting normal3
1161 1161 $ hg status
1162 1162 ? sub/large4.orig
1163 1163 ? sub/normal4.orig
1164 1164 ? sub2/large8
1165 1165 $ cat normal3
1166 1166 normal3-modified
1167 1167 $ cat sub2/large6
1168 1168 large6-modified
1169 1169 $ rm sub/*.orig sub2/large8
1170 1170
1171 1171 revert some files to an older revision
1172 1172 $ hg revert --no-backup -r 8 sub2
1173 1173 reverting .hglf/sub2/large6 (glob)
1174 1174 $ cat sub2/large6
1175 1175 large6
1176 1176 $ hg revert --no-backup -C -r '.^' sub2
1177 1177 reverting .hglf/sub2/large6 (glob)
1178 1178 $ hg revert --no-backup sub2
1179 1179 reverting .hglf/sub2/large6 (glob)
1180 1180 $ hg status
1181 1181
1182 1182 "verify --large" actually verifies largefiles
1183 1183
1184 1184 - Where Do We Come From? What Are We? Where Are We Going?
1185 1185 $ pwd
1186 1186 $TESTTMP/e
1187 1187 $ hg paths
1188 1188 default = $TESTTMP/d (glob)
1189 1189
1190 1190 $ hg verify --large
1191 1191 checking changesets
1192 1192 checking manifests
1193 1193 crosschecking files in changesets and manifests
1194 1194 checking files
1195 1195 10 files, 10 changesets, 28 total revisions
1196 1196 searching 1 changesets for largefiles
1197 1197 verified existence of 3 revisions of 3 largefiles
1198 1198
1199 1199 - introduce missing blob in local store repo and make sure that this is caught:
1200 1200 $ mv $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928 .
1201 1201 $ hg verify --large
1202 1202 checking changesets
1203 1203 checking manifests
1204 1204 crosschecking files in changesets and manifests
1205 1205 checking files
1206 1206 10 files, 10 changesets, 28 total revisions
1207 1207 searching 1 changesets for largefiles
1208 1208 changeset 9:598410d3eb9a: sub/large4 missing
1209 1209 (looked for hash e166e74c7303192238d60af5a9c4ce9bef0b7928)
1210 1210 verified existence of 3 revisions of 3 largefiles
1211 1211 [1]
1212 1212
1213 1213 - introduce corruption and make sure that it is caught when checking content:
1214 1214 $ echo '5 cents' > $TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928
1215 1215 $ hg verify -q --large --lfc
1216 1216 searching 1 changesets for largefiles
1217 1217 changeset 9:598410d3eb9a: sub/large4: contents differ
1218 1218 ($TESTTMP/d/.hg/largefiles/e166e74c7303192238d60af5a9c4ce9bef0b7928: (glob)
1219 1219 expected hash e166e74c7303192238d60af5a9c4ce9bef0b7928,
1220 1220 but got 1f19b76d5b3cad1472c87efb42b582c97e040060)
1221 1221 verified contents of 3 revisions of 3 largefiles
1222 1222 [1]
1223 1223
1224 1224 - cleanup
1225 1225 $ mv e166e74c7303192238d60af5a9c4ce9bef0b7928 $TESTTMP/d/.hg/largefiles/
1226 1226
1227 1227 - verifying all revisions will fail because we didn't clone all largefiles to d:
1228 1228 $ echo 'T-shirt' > $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1229 1229 $ hg verify -q --large --lfa --lfc
1230 1230 searching 10 changesets for largefiles
1231 1231 changeset 0:30d30fe6a5be: large1 missing
1232 1232 (looked for hash 4669e532d5b2c093a78eca010077e708a071bb64)
1233 1233 changeset 0:30d30fe6a5be: sub/large2 missing
1234 1234 (looked for hash 1deebade43c8c498a3c8daddac0244dc55d1331d)
1235 1235 changeset 1:ce8896473775: large1 missing
1236 1236 (looked for hash 5f78770c0e77ba4287ad6ef3071c9bf9c379742f)
1237 1237 changeset 1:ce8896473775: sub/large2: contents differ
1238 1238 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4: (glob)
1239 1239 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1240 1240 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1241 1241 changeset 3:9e8fbc4bce62: large1: contents differ
1242 1242 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4: (glob)
1243 1243 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1244 1244 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1245 1245 changeset 4:74c02385b94c: large3: contents differ
1246 1246 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4: (glob)
1247 1247 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1248 1248 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1249 1249 changeset 4:74c02385b94c: sub/large4: contents differ
1250 1250 ($TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4: (glob)
1251 1251 expected hash eb7338044dc27f9bc59b8dd5a246b065ead7a9c4,
1252 1252 but got cfef678f24d3e339944138ecdd8fd85ca21d820f)
1253 1253 changeset 5:9d5af5072dbd: large3 missing
1254 1254 (looked for hash baaf12afde9d8d67f25dab6dced0d2bf77dba47c)
1255 1255 changeset 5:9d5af5072dbd: sub/large4 missing
1256 1256 (looked for hash aeb2210d19f02886dde00dac279729a48471e2f9)
1257 1257 changeset 6:4355d653f84f: large3 missing
1258 1258 (looked for hash 7838695e10da2bb75ac1156565f40a2595fa2fa0)
1259 1259 verified contents of 15 revisions of 6 largefiles
1260 1260 [1]
1261 1261
1262 1262 - cleanup
1263 1263 $ rm $TESTTMP/d/.hg/largefiles/eb7338044dc27f9bc59b8dd5a246b065ead7a9c4
1264 1264
1265 Pulling 0 revisions with --all-largefiles should not fetch for all revisions
1266
1267 $ hg pull --all-largefiles
1268 pulling from $TESTTMP/d (glob)
1269 searching for changes
1270 no changes found
1271 caching new largefiles
1272 0 largefiles cached
1273 0 additional largefiles cached
1274
1265 1275 Merging does not revert to old versions of largefiles and also check
1266 1276 that merging after having pulled from a non-default remote works
1267 1277 correctly.
1268 1278
1269 1279 $ cd ..
1270 1280 $ hg clone -r 7 e temp
1271 1281 adding changesets
1272 1282 adding manifests
1273 1283 adding file changes
1274 1284 added 8 changesets with 24 changes to 10 files
1275 1285 updating to branch default
1276 1286 getting changed largefiles
1277 1287 3 largefiles updated, 0 removed
1278 1288 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1279 1289 $ hg clone temp f
1280 1290 updating to branch default
1281 1291 getting changed largefiles
1282 1292 3 largefiles updated, 0 removed
1283 1293 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1284 1294 # Delete the largefiles in the largefiles system cache so that we have an
1285 1295 # opportunity to test that caching after a pull works.
1286 1296 $ rm "${USERCACHE}"/*
1287 1297 $ cd f
1288 1298 $ echo "large4-merge-test" > sub/large4
1289 1299 $ hg commit -m "Modify large4 to test merge"
1290 1300 Invoking status precommit hook
1291 1301 M sub/large4
1292 1302 $ hg pull ../e
1293 1303 pulling from ../e
1294 1304 searching for changes
1295 1305 adding changesets
1296 1306 adding manifests
1297 1307 adding file changes
1298 1308 added 2 changesets with 4 changes to 4 files (+1 heads)
1299 1309 (run 'hg heads' to see heads, 'hg merge' to merge)
1300 1310 caching new largefiles
1301 1311 2 largefiles cached
1302 1312 $ hg merge
1303 1313 merging sub/large4
1304 1314 largefile sub/large4 has a merge conflict
1305 1315 keep (l)ocal or take (o)ther? l
1306 1316 3 files updated, 1 files merged, 0 files removed, 0 files unresolved
1307 1317 (branch merge, don't forget to commit)
1308 1318 getting changed largefiles
1309 1319 1 largefiles updated, 0 removed
1310 1320 $ hg commit -m "Merge repos e and f"
1311 1321 Invoking status precommit hook
1312 1322 M normal3
1313 1323 M sub/normal4
1314 1324 M sub2/large6
1315 1325 $ cat normal3
1316 1326 normal3-modified
1317 1327 $ cat sub/normal4
1318 1328 normal4-modified
1319 1329 $ cat sub/large4
1320 1330 large4-merge-test
1321 1331 $ cat sub2/large6
1322 1332 large6-modified
1323 1333 $ cat sub2/large7
1324 1334 large7
1325 1335
1326 1336 Test status after merging with a branch that introduces a new largefile:
1327 1337
1328 1338 $ echo large > large
1329 1339 $ hg add --large large
1330 1340 $ hg commit -m 'add largefile'
1331 1341 Invoking status precommit hook
1332 1342 A large
1333 1343 $ hg update -q ".^"
1334 1344 $ echo change >> normal3
1335 1345 $ hg commit -m 'some change'
1336 1346 Invoking status precommit hook
1337 1347 M normal3
1338 1348 created new head
1339 1349 $ hg merge
1340 1350 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1341 1351 (branch merge, don't forget to commit)
1342 1352 getting changed largefiles
1343 1353 1 largefiles updated, 0 removed
1344 1354 $ hg status
1345 1355 M large
1346 1356
1347 1357 - make sure update of merge with removed largefiles fails as expected
1348 1358 $ hg rm sub2/large6
1349 1359 $ hg up -r.
1350 1360 abort: outstanding uncommitted merges
1351 1361 [255]
1352 1362
1353 1363 - revert should be able to revert files introduced in a pending merge
1354 1364 $ hg revert --all -r .
1355 1365 removing .hglf/large (glob)
1356 1366 undeleting .hglf/sub2/large6 (glob)
1357 1367
1358 1368 Test that a normal file and a largefile with the same name and path cannot
1359 1369 coexist.
1360 1370
1361 1371 $ rm sub2/large7
1362 1372 $ echo "largeasnormal" > sub2/large7
1363 1373 $ hg add sub2/large7
1364 1374 sub2/large7 already a largefile
1365 1375
1366 1376 Test that transplanting a largefile change works correctly.
1367 1377
1368 1378 $ cd ..
1369 1379 $ hg clone -r 8 d g
1370 1380 adding changesets
1371 1381 adding manifests
1372 1382 adding file changes
1373 1383 added 9 changesets with 26 changes to 10 files
1374 1384 updating to branch default
1375 1385 getting changed largefiles
1376 1386 3 largefiles updated, 0 removed
1377 1387 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1378 1388 $ cd g
1379 1389 $ hg transplant -s ../d 598410d3eb9a
1380 1390 searching for changes
1381 1391 searching for changes
1382 1392 adding changesets
1383 1393 adding manifests
1384 1394 adding file changes
1385 1395 added 1 changesets with 2 changes to 2 files
1386 1396 getting changed largefiles
1387 1397 1 largefiles updated, 0 removed
1388 1398 $ hg log --template '{rev}:{node|short} {desc|firstline}\n'
1389 1399 9:598410d3eb9a modify normal file largefile in repo d
1390 1400 8:a381d2c8c80e modify normal file and largefile in repo b
1391 1401 7:daea875e9014 add/edit more largefiles
1392 1402 6:4355d653f84f edit files yet again
1393 1403 5:9d5af5072dbd edit files again
1394 1404 4:74c02385b94c move files
1395 1405 3:9e8fbc4bce62 copy files
1396 1406 2:51a0ae4d5864 remove files
1397 1407 1:ce8896473775 edit files
1398 1408 0:30d30fe6a5be add files
1399 1409 $ cat normal3
1400 1410 normal3-modified
1401 1411 $ cat sub/normal4
1402 1412 normal4-modified
1403 1413 $ cat sub/large4
1404 1414 large4-modified
1405 1415 $ cat sub2/large6
1406 1416 large6-modified
1407 1417 $ cat sub2/large7
1408 1418 large7
1409 1419
1410 1420 Cat a largefile
1411 1421 $ hg cat normal3
1412 1422 normal3-modified
1413 1423 $ hg cat sub/large4
1414 1424 large4-modified
1415 1425 $ rm "${USERCACHE}"/*
1416 1426 $ hg cat -r a381d2c8c80e -o cat.out sub/large4
1417 1427 $ cat cat.out
1418 1428 large4-modified
1419 1429 $ rm cat.out
1420 1430 $ hg cat -r a381d2c8c80e normal3
1421 1431 normal3-modified
1422 1432 $ hg cat -r '.^' normal3
1423 1433 normal3-modified
1424 1434 $ hg cat -r '.^' sub/large4 doesntexist
1425 1435 large4-modified
1426 1436 doesntexist: no such file in rev a381d2c8c80e
1427 1437 [1]
1428 1438
1429 1439 Test that renaming a largefile results in correct output for status
1430 1440
1431 1441 $ hg rename sub/large4 large4-renamed
1432 1442 $ hg commit -m "test rename output"
1433 1443 Invoking status precommit hook
1434 1444 A large4-renamed
1435 1445 R sub/large4
1436 1446 $ cat large4-renamed
1437 1447 large4-modified
1438 1448 $ cd sub2
1439 1449 $ hg rename large6 large6-renamed
1440 1450 $ hg st
1441 1451 A sub2/large6-renamed
1442 1452 R sub2/large6
1443 1453 $ cd ..
1444 1454
1445 1455 Test --normal flag
1446 1456
1447 1457 $ dd if=/dev/zero bs=2k count=11k > new-largefile 2> /dev/null
1448 1458 $ hg add --normal --large new-largefile
1449 1459 abort: --normal cannot be used with --large
1450 1460 [255]
1451 1461 $ hg add --normal new-largefile
1452 1462 new-largefile: up to 69 MB of RAM may be required to manage this file
1453 1463 (use 'hg revert new-largefile' to cancel the pending addition)
1454 1464 $ cd ..
1455 1465
1456 1466 #if serve
1457 1467 vanilla clients not locked out from largefiles servers on vanilla repos
1458 1468 $ mkdir r1
1459 1469 $ cd r1
1460 1470 $ hg init
1461 1471 $ echo c1 > f1
1462 1472 $ hg add f1
1463 1473 $ hg commit -m "m1"
1464 1474 Invoking status precommit hook
1465 1475 A f1
1466 1476 $ cd ..
1467 1477 $ hg serve -R r1 -d -p $HGPORT --pid-file hg.pid
1468 1478 $ cat hg.pid >> $DAEMON_PIDS
1469 1479 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT r2
1470 1480 requesting all changes
1471 1481 adding changesets
1472 1482 adding manifests
1473 1483 adding file changes
1474 1484 added 1 changesets with 1 changes to 1 files
1475 1485 updating to branch default
1476 1486 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1477 1487
1478 1488 largefiles clients still work with vanilla servers
1479 1489 $ hg --config extensions.largefiles=! serve -R r1 -d -p $HGPORT1 --pid-file hg.pid
1480 1490 $ cat hg.pid >> $DAEMON_PIDS
1481 1491 $ hg clone http://localhost:$HGPORT1 r3
1482 1492 requesting all changes
1483 1493 adding changesets
1484 1494 adding manifests
1485 1495 adding file changes
1486 1496 added 1 changesets with 1 changes to 1 files
1487 1497 updating to branch default
1488 1498 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1489 1499 #endif
1490 1500
1491 1501
1492 1502 vanilla clients locked out from largefiles http repos
1493 1503 $ mkdir r4
1494 1504 $ cd r4
1495 1505 $ hg init
1496 1506 $ echo c1 > f1
1497 1507 $ hg add --large f1
1498 1508 $ hg commit -m "m1"
1499 1509 Invoking status precommit hook
1500 1510 A f1
1501 1511 $ cd ..
1502 1512
1503 1513 largefiles can be pushed locally (issue3583)
1504 1514 $ hg init dest
1505 1515 $ cd r4
1506 1516 $ hg outgoing ../dest
1507 1517 comparing with ../dest
1508 1518 searching for changes
1509 1519 changeset: 0:639881c12b4c
1510 1520 tag: tip
1511 1521 user: test
1512 1522 date: Thu Jan 01 00:00:00 1970 +0000
1513 1523 summary: m1
1514 1524
1515 1525 $ hg push ../dest
1516 1526 pushing to ../dest
1517 1527 searching for changes
1518 1528 searching for changes
1519 1529 adding changesets
1520 1530 adding manifests
1521 1531 adding file changes
1522 1532 added 1 changesets with 1 changes to 1 files
1523 1533
1524 1534 exit code with nothing outgoing (issue3611)
1525 1535 $ hg outgoing ../dest
1526 1536 comparing with ../dest
1527 1537 searching for changes
1528 1538 no changes found
1529 1539 [1]
1530 1540 $ cd ..
1531 1541
1532 1542 #if serve
1533 1543 $ hg serve -R r4 -d -p $HGPORT2 --pid-file hg.pid
1534 1544 $ cat hg.pid >> $DAEMON_PIDS
1535 1545 $ hg --config extensions.largefiles=! clone http://localhost:$HGPORT2 r5
1536 1546 abort: remote error:
1537 1547
1538 1548 This repository uses the largefiles extension.
1539 1549
1540 1550 Please enable it in your Mercurial config file.
1541 1551 [255]
1542 1552
1543 1553 used all HGPORTs, kill all daemons
1544 1554 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1545 1555 #endif
1546 1556
1547 1557 vanilla clients locked out from largefiles ssh repos
1548 1558 $ hg --config extensions.largefiles=! clone -e "python \"$TESTDIR/dummyssh\"" ssh://user@dummy/r4 r5
1549 1559 abort: remote error:
1550 1560
1551 1561 This repository uses the largefiles extension.
1552 1562
1553 1563 Please enable it in your Mercurial config file.
1554 1564 [255]
1555 1565
1556 1566 #if serve
1557 1567
1558 1568 largefiles clients refuse to push largefiles repos to vanilla servers
1559 1569 $ mkdir r6
1560 1570 $ cd r6
1561 1571 $ hg init
1562 1572 $ echo c1 > f1
1563 1573 $ hg add f1
1564 1574 $ hg commit -m "m1"
1565 1575 Invoking status precommit hook
1566 1576 A f1
1567 1577 $ cat >> .hg/hgrc <<!
1568 1578 > [web]
1569 1579 > push_ssl = false
1570 1580 > allow_push = *
1571 1581 > !
1572 1582 $ cd ..
1573 1583 $ hg clone r6 r7
1574 1584 updating to branch default
1575 1585 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1576 1586 $ cd r7
1577 1587 $ echo c2 > f2
1578 1588 $ hg add --large f2
1579 1589 $ hg commit -m "m2"
1580 1590 Invoking status precommit hook
1581 1591 A f2
1582 1592 $ hg --config extensions.largefiles=! -R ../r6 serve -d -p $HGPORT --pid-file ../hg.pid
1583 1593 $ cat ../hg.pid >> $DAEMON_PIDS
1584 1594 $ hg push http://localhost:$HGPORT
1585 1595 pushing to http://localhost:$HGPORT/
1586 1596 searching for changes
1587 1597 abort: http://localhost:$HGPORT/ does not appear to be a largefile store
1588 1598 [255]
1589 1599 $ cd ..
1590 1600
1591 1601 putlfile errors are shown (issue3123)
1592 1602 Corrupt the cached largefile in r7 and move it out of the servers usercache
1593 1603 $ mv r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 .
1594 1604 $ echo 'client side corruption' > r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1595 1605 $ rm "$USERCACHE/4cdac4d8b084d0b599525cf732437fb337d422a8"
1596 1606 $ hg init empty
1597 1607 $ hg serve -R empty -d -p $HGPORT1 --pid-file hg.pid \
1598 1608 > --config 'web.allow_push=*' --config web.push_ssl=False
1599 1609 $ cat hg.pid >> $DAEMON_PIDS
1600 1610 $ hg push -R r7 http://localhost:$HGPORT1
1601 1611 pushing to http://localhost:$HGPORT1/
1602 1612 searching for changes
1603 1613 remote: largefiles: failed to put 4cdac4d8b084d0b599525cf732437fb337d422a8 into store: largefile contents do not match hash
1604 1614 abort: remotestore: could not put $TESTTMP/r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8 to remote store http://localhost:$HGPORT1/ (glob)
1605 1615 [255]
1606 1616 $ mv 4cdac4d8b084d0b599525cf732437fb337d422a8 r7/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1607 1617 Push of file that exists on server but is corrupted - magic healing would be nice ... but too magic
1608 1618 $ echo "server side corruption" > empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1609 1619 $ hg push -R r7 http://localhost:$HGPORT1
1610 1620 pushing to http://localhost:$HGPORT1/
1611 1621 searching for changes
1612 1622 searching for changes
1613 1623 remote: adding changesets
1614 1624 remote: adding manifests
1615 1625 remote: adding file changes
1616 1626 remote: added 2 changesets with 2 changes to 2 files
1617 1627 $ cat empty/.hg/largefiles/4cdac4d8b084d0b599525cf732437fb337d422a8
1618 1628 server side corruption
1619 1629 $ rm -rf empty
1620 1630
1621 1631 Push a largefiles repository to a served empty repository
1622 1632 $ hg init r8
1623 1633 $ echo c3 > r8/f1
1624 1634 $ hg add --large r8/f1 -R r8
1625 1635 $ hg commit -m "m1" -R r8
1626 1636 Invoking status precommit hook
1627 1637 A f1
1628 1638 $ hg init empty
1629 1639 $ hg serve -R empty -d -p $HGPORT2 --pid-file hg.pid \
1630 1640 > --config 'web.allow_push=*' --config web.push_ssl=False
1631 1641 $ cat hg.pid >> $DAEMON_PIDS
1632 1642 $ rm "${USERCACHE}"/*
1633 1643 $ hg push -R r8 http://localhost:$HGPORT2/#default
1634 1644 pushing to http://localhost:$HGPORT2/
1635 1645 searching for changes
1636 1646 searching for changes
1637 1647 remote: adding changesets
1638 1648 remote: adding manifests
1639 1649 remote: adding file changes
1640 1650 remote: added 1 changesets with 1 changes to 1 files
1641 1651 $ [ -f "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1642 1652 $ [ -f empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1643 1653
1644 1654 Clone over http, no largefiles pulled on clone.
1645 1655
1646 1656 $ hg clone http://localhost:$HGPORT2/#default http-clone -U
1647 1657 adding changesets
1648 1658 adding manifests
1649 1659 adding file changes
1650 1660 added 1 changesets with 1 changes to 1 files
1651 1661
1652 1662 test 'verify' with remotestore:
1653 1663
1654 1664 $ rm "${USERCACHE}"/02a439e5c31c526465ab1a0ca1f431f76b827b90
1655 1665 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1656 1666 $ hg -R http-clone verify --large --lfa
1657 1667 checking changesets
1658 1668 checking manifests
1659 1669 crosschecking files in changesets and manifests
1660 1670 checking files
1661 1671 1 files, 1 changesets, 1 total revisions
1662 1672 searching 1 changesets for largefiles
1663 1673 changeset 0:cf03e5bb9936: f1 missing
1664 1674 verified existence of 1 revisions of 1 largefiles
1665 1675 [1]
1666 1676 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1667 1677 $ hg -R http-clone -q verify --large --lfa
1668 1678 searching 1 changesets for largefiles
1669 1679 verified existence of 1 revisions of 1 largefiles
1670 1680
1671 1681 largefiles pulled on update - a largefile missing on the server:
1672 1682 $ mv empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 .
1673 1683 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1674 1684 getting changed largefiles
1675 1685 abort: remotestore: largefile 02a439e5c31c526465ab1a0ca1f431f76b827b90 is missing
1676 1686 [255]
1677 1687 $ hg -R http-clone up -Cqr null
1678 1688
1679 1689 largefiles pulled on update - a largefile corrupted on the server:
1680 1690 $ echo corruption > empty/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90
1681 1691 $ hg -R http-clone up --config largefiles.usercache=http-clone-usercache
1682 1692 getting changed largefiles
1683 1693 f1: data corruption (expected 02a439e5c31c526465ab1a0ca1f431f76b827b90, got 6a7bb2556144babe3899b25e5428123735bb1e27)
1684 1694 0 largefiles updated, 0 removed
1685 1695 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1686 1696 $ hg -R http-clone st
1687 1697 ! f1
1688 1698 $ [ ! -f http-clone/.hg/largefiles/02a439e5c31c526465ab1a0ca1f431f76b827b90 ]
1689 1699 $ [ ! -f http-clone/f1 ]
1690 1700 $ [ ! -f http-clone-usercache ]
1691 1701 $ hg -R http-clone verify --large --lfc
1692 1702 checking changesets
1693 1703 checking manifests
1694 1704 crosschecking files in changesets and manifests
1695 1705 checking files
1696 1706 1 files, 1 changesets, 1 total revisions
1697 1707 searching 1 changesets for largefiles
1698 1708 verified contents of 1 revisions of 1 largefiles
1699 1709 $ hg -R http-clone up -Cqr null
1700 1710
1701 1711 largefiles pulled on update - no server side problems:
1702 1712 $ mv 02a439e5c31c526465ab1a0ca1f431f76b827b90 empty/.hg/largefiles/
1703 1713 $ hg -R http-clone --debug up --config largefiles.usercache=http-clone-usercache
1704 1714 resolving manifests
1705 1715 overwrite: False, partial: False
1706 1716 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1707 1717 .hglf/f1: remote created -> g
1708 1718 updating: .hglf/f1 1/1 files (100.00%)
1709 1719 getting .hglf/f1
1710 1720 getting changed largefiles
1711 1721 using http://localhost:$HGPORT2/
1712 1722 sending capabilities command
1713 1723 getting largefiles: 0/1 lfile (0.00%)
1714 1724 getting f1:02a439e5c31c526465ab1a0ca1f431f76b827b90
1715 1725 sending batch command
1716 1726 sending getlfile command
1717 1727 found 02a439e5c31c526465ab1a0ca1f431f76b827b90 in store
1718 1728 1 largefiles updated, 0 removed
1719 1729 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1720 1730
1721 1731 $ ls http-clone-usercache/*
1722 1732 http-clone-usercache/02a439e5c31c526465ab1a0ca1f431f76b827b90
1723 1733
1724 1734 $ rm -rf empty http-clone*
1725 1735
1726 1736 used all HGPORTs, kill all daemons
1727 1737 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1728 1738
1729 1739 #endif
1730 1740
1731 1741
1732 1742 #if unix-permissions
1733 1743
1734 1744 Clone a local repository owned by another user
1735 1745 We have to simulate that here by setting $HOME and removing write permissions
1736 1746 $ ORIGHOME="$HOME"
1737 1747 $ mkdir alice
1738 1748 $ HOME="`pwd`/alice"
1739 1749 $ cd alice
1740 1750 $ hg init pubrepo
1741 1751 $ cd pubrepo
1742 1752 $ dd if=/dev/zero bs=1k count=11k > a-large-file 2> /dev/null
1743 1753 $ hg add --large a-large-file
1744 1754 $ hg commit -m "Add a large file"
1745 1755 Invoking status precommit hook
1746 1756 A a-large-file
1747 1757 $ cd ..
1748 1758 $ chmod -R a-w pubrepo
1749 1759 $ cd ..
1750 1760 $ mkdir bob
1751 1761 $ HOME="`pwd`/bob"
1752 1762 $ cd bob
1753 1763 $ hg clone --pull ../alice/pubrepo pubrepo
1754 1764 requesting all changes
1755 1765 adding changesets
1756 1766 adding manifests
1757 1767 adding file changes
1758 1768 added 1 changesets with 1 changes to 1 files
1759 1769 updating to branch default
1760 1770 getting changed largefiles
1761 1771 1 largefiles updated, 0 removed
1762 1772 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1763 1773 $ cd ..
1764 1774 $ chmod -R u+w alice/pubrepo
1765 1775 $ HOME="$ORIGHOME"
1766 1776
1767 1777 #endif
1768 1778
1769 1779 #if symlink
1770 1780
1771 1781 Symlink to a large largefile should behave the same as a symlink to a normal file
1772 1782 $ hg init largesymlink
1773 1783 $ cd largesymlink
1774 1784 $ dd if=/dev/zero bs=1k count=10k of=largefile 2>/dev/null
1775 1785 $ hg add --large largefile
1776 1786 $ hg commit -m "commit a large file"
1777 1787 Invoking status precommit hook
1778 1788 A largefile
1779 1789 $ ln -s largefile largelink
1780 1790 $ hg add largelink
1781 1791 $ hg commit -m "commit a large symlink"
1782 1792 Invoking status precommit hook
1783 1793 A largelink
1784 1794 $ rm -f largelink
1785 1795 $ hg up >/dev/null
1786 1796 $ test -f largelink
1787 1797 [1]
1788 1798 $ test -L largelink
1789 1799 [1]
1790 1800 $ rm -f largelink # make next part of the test independent of the previous
1791 1801 $ hg up -C >/dev/null
1792 1802 $ test -f largelink
1793 1803 $ test -L largelink
1794 1804 $ cd ..
1795 1805
1796 1806 #endif
1797 1807
1798 1808 test for pattern matching on 'hg status':
1799 1809 to boost performance, largefiles checks whether specified patterns are
1800 1810 related to largefiles in working directory (NOT to STANDIN) or not.
1801 1811
1802 1812 $ hg init statusmatch
1803 1813 $ cd statusmatch
1804 1814
1805 1815 $ mkdir -p a/b/c/d
1806 1816 $ echo normal > a/b/c/d/e.normal.txt
1807 1817 $ hg add a/b/c/d/e.normal.txt
1808 1818 $ echo large > a/b/c/d/e.large.txt
1809 1819 $ hg add --large a/b/c/d/e.large.txt
1810 1820 $ mkdir -p a/b/c/x
1811 1821 $ echo normal > a/b/c/x/y.normal.txt
1812 1822 $ hg add a/b/c/x/y.normal.txt
1813 1823 $ hg commit -m 'add files'
1814 1824 Invoking status precommit hook
1815 1825 A a/b/c/d/e.large.txt
1816 1826 A a/b/c/d/e.normal.txt
1817 1827 A a/b/c/x/y.normal.txt
1818 1828
1819 1829 (1) no pattern: no performance boost
1820 1830 $ hg status -A
1821 1831 C a/b/c/d/e.large.txt
1822 1832 C a/b/c/d/e.normal.txt
1823 1833 C a/b/c/x/y.normal.txt
1824 1834
1825 1835 (2) pattern not related to largefiles: performance boost
1826 1836 $ hg status -A a/b/c/x
1827 1837 C a/b/c/x/y.normal.txt
1828 1838
1829 1839 (3) pattern related to largefiles: no performance boost
1830 1840 $ hg status -A a/b/c/d
1831 1841 C a/b/c/d/e.large.txt
1832 1842 C a/b/c/d/e.normal.txt
1833 1843
1834 1844 (4) pattern related to STANDIN (not to largefiles): performance boost
1835 1845 $ hg status -A .hglf/a
1836 1846 C .hglf/a/b/c/d/e.large.txt
1837 1847
1838 1848 (5) mixed case: no performance boost
1839 1849 $ hg status -A a/b/c/x a/b/c/d
1840 1850 C a/b/c/d/e.large.txt
1841 1851 C a/b/c/d/e.normal.txt
1842 1852 C a/b/c/x/y.normal.txt
1843 1853
1844 1854 verify that largefiles doesn't break filesets
1845 1855
1846 1856 $ hg log --rev . --exclude "set:binary()"
1847 1857 changeset: 0:41bd42f10efa
1848 1858 tag: tip
1849 1859 user: test
1850 1860 date: Thu Jan 01 00:00:00 1970 +0000
1851 1861 summary: add files
1852 1862
1853 1863 verify that large files in subrepos handled properly
1854 1864 $ hg init subrepo
1855 1865 $ echo "subrepo = subrepo" > .hgsub
1856 1866 $ hg add .hgsub
1857 1867 $ hg ci -m "add subrepo"
1858 1868 Invoking status precommit hook
1859 1869 A .hgsub
1860 1870 ? .hgsubstate
1861 1871 $ echo "rev 1" > subrepo/large.txt
1862 1872 $ hg -R subrepo add --large subrepo/large.txt
1863 1873 $ hg sum
1864 1874 parent: 1:8ee150ea2e9c tip
1865 1875 add subrepo
1866 1876 branch: default
1867 1877 commit: 1 subrepos
1868 1878 update: (current)
1869 1879 $ hg st
1870 1880 $ hg st -S
1871 1881 A subrepo/large.txt
1872 1882 $ hg ci -S -m "commit top repo"
1873 1883 committing subrepository subrepo
1874 1884 Invoking status precommit hook
1875 1885 A large.txt
1876 1886 Invoking status precommit hook
1877 1887 M .hgsubstate
1878 1888 # No differences
1879 1889 $ hg st -S
1880 1890 $ hg sum
1881 1891 parent: 2:ce4cd0c527a6 tip
1882 1892 commit top repo
1883 1893 branch: default
1884 1894 commit: (clean)
1885 1895 update: (current)
1886 1896 $ echo "rev 2" > subrepo/large.txt
1887 1897 $ hg st -S
1888 1898 M subrepo/large.txt
1889 1899 $ hg sum
1890 1900 parent: 2:ce4cd0c527a6 tip
1891 1901 commit top repo
1892 1902 branch: default
1893 1903 commit: 1 subrepos
1894 1904 update: (current)
1895 1905 $ hg ci -m "this commit should fail without -S"
1896 1906 abort: uncommitted changes in subrepo subrepo
1897 1907 (use --subrepos for recursive commit)
1898 1908 [255]
1899 1909
1900 1910 Add a normal file to the subrepo, then test archiving
1901 1911
1902 1912 $ echo 'normal file' > subrepo/normal.txt
1903 1913 $ hg -R subrepo add subrepo/normal.txt
1904 1914
1905 1915 Lock in subrepo, otherwise the change isn't archived
1906 1916
1907 1917 $ hg ci -S -m "add normal file to top level"
1908 1918 committing subrepository subrepo
1909 1919 Invoking status precommit hook
1910 1920 M large.txt
1911 1921 A normal.txt
1912 1922 Invoking status precommit hook
1913 1923 M .hgsubstate
1914 1924 $ hg archive -S ../lf_subrepo_archive
1915 1925 $ find ../lf_subrepo_archive | sort
1916 1926 ../lf_subrepo_archive
1917 1927 ../lf_subrepo_archive/.hg_archival.txt
1918 1928 ../lf_subrepo_archive/.hgsub
1919 1929 ../lf_subrepo_archive/.hgsubstate
1920 1930 ../lf_subrepo_archive/a
1921 1931 ../lf_subrepo_archive/a/b
1922 1932 ../lf_subrepo_archive/a/b/c
1923 1933 ../lf_subrepo_archive/a/b/c/d
1924 1934 ../lf_subrepo_archive/a/b/c/d/e.large.txt
1925 1935 ../lf_subrepo_archive/a/b/c/d/e.normal.txt
1926 1936 ../lf_subrepo_archive/a/b/c/x
1927 1937 ../lf_subrepo_archive/a/b/c/x/y.normal.txt
1928 1938 ../lf_subrepo_archive/subrepo
1929 1939 ../lf_subrepo_archive/subrepo/large.txt
1930 1940 ../lf_subrepo_archive/subrepo/normal.txt
1931 1941
1932 1942 Test update with subrepos.
1933 1943
1934 1944 $ hg update 0
1935 1945 getting changed largefiles
1936 1946 0 largefiles updated, 1 removed
1937 1947 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1938 1948 $ hg status -S
1939 1949 $ hg update tip
1940 1950 getting changed largefiles
1941 1951 1 largefiles updated, 0 removed
1942 1952 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1943 1953 $ hg status -S
1944 1954 # modify a large file
1945 1955 $ echo "modified" > subrepo/large.txt
1946 1956 $ hg st -S
1947 1957 M subrepo/large.txt
1948 1958 # update -C should revert the change.
1949 1959 $ hg update -C
1950 1960 getting changed largefiles
1951 1961 1 largefiles updated, 0 removed
1952 1962 getting changed largefiles
1953 1963 0 largefiles updated, 0 removed
1954 1964 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1955 1965 $ hg status -S
1956 1966
1957 1967 Test archiving a revision that references a subrepo that is not yet
1958 1968 cloned (see test-subrepo-recursion.t):
1959 1969
1960 1970 $ hg clone -U . ../empty
1961 1971 $ cd ../empty
1962 1972 $ hg archive --subrepos -r tip ../archive.tar.gz
1963 1973 cloning subrepo subrepo from $TESTTMP/statusmatch/subrepo
1964 1974 $ cd ..
1965 1975
1966 1976 Test that addremove picks up largefiles prior to the initial commit (issue3541)
1967 1977
1968 1978 $ hg init addrm2
1969 1979 $ cd addrm2
1970 1980 $ touch large.dat
1971 1981 $ touch large2.dat
1972 1982 $ touch normal
1973 1983 $ hg add --large large.dat
1974 1984 $ hg addremove -v
1975 1985 adding large2.dat as a largefile
1976 1986 adding normal
1977 1987
1978 1988 Test that forgetting all largefiles reverts to islfilesrepo() == False
1979 1989 (addremove will add *.dat as normal files now)
1980 1990 $ hg forget large.dat
1981 1991 $ hg forget large2.dat
1982 1992 $ hg addremove -v
1983 1993 adding large.dat
1984 1994 adding large2.dat
1985 1995
1986 1996 Test commit's addremove option prior to the first commit
1987 1997 $ hg forget large.dat
1988 1998 $ hg forget large2.dat
1989 1999 $ hg add --large large.dat
1990 2000 $ hg ci -Am "commit"
1991 2001 adding large2.dat as a largefile
1992 2002 Invoking status precommit hook
1993 2003 A large.dat
1994 2004 A large2.dat
1995 2005 A normal
1996 2006 $ find .hglf | sort
1997 2007 .hglf
1998 2008 .hglf/large.dat
1999 2009 .hglf/large2.dat
2000 2010
2001 2011 Test actions on largefiles using relative paths from subdir
2002 2012
2003 2013 $ mkdir sub
2004 2014 $ cd sub
2005 2015 $ echo anotherlarge > anotherlarge
2006 2016 $ hg add --large anotherlarge
2007 2017 $ hg st
2008 2018 A sub/anotherlarge
2009 2019 $ hg st anotherlarge
2010 2020 A anotherlarge
2011 2021 $ hg commit -m anotherlarge anotherlarge
2012 2022 Invoking status precommit hook
2013 2023 A sub/anotherlarge
2014 2024 $ hg log anotherlarge
2015 2025 changeset: 1:9627a577c5e9
2016 2026 tag: tip
2017 2027 user: test
2018 2028 date: Thu Jan 01 00:00:00 1970 +0000
2019 2029 summary: anotherlarge
2020 2030
2021 2031 $ echo more >> anotherlarge
2022 2032 $ hg st .
2023 2033 M anotherlarge
2024 2034 $ hg cat anotherlarge
2025 2035 anotherlarge
2026 2036 $ hg revert anotherlarge
2027 2037 $ hg st
2028 2038 ? sub/anotherlarge.orig
2029 2039 $ cd ..
2030 2040
2031 2041 $ cd ..
2032 2042
2033 2043 issue3651: summary/outgoing with largefiles shows "no remote repo"
2034 2044 unexpectedly
2035 2045
2036 2046 $ mkdir issue3651
2037 2047 $ cd issue3651
2038 2048
2039 2049 $ hg init src
2040 2050 $ echo a > src/a
2041 2051 $ hg -R src add --large src/a
2042 2052 $ hg -R src commit -m '#0'
2043 2053 Invoking status precommit hook
2044 2054 A a
2045 2055
2046 2056 check messages when no remote repository is specified:
2047 2057 "no remote repo" route for "hg outgoing --large" is not tested here,
2048 2058 because it can't be reproduced easily.
2049 2059
2050 2060 $ hg init clone1
2051 2061 $ hg -R clone1 -q pull src
2052 2062 $ hg -R clone1 -q update
2053 2063 $ hg -R clone1 paths | grep default
2054 2064 [1]
2055 2065
2056 2066 $ hg -R clone1 summary --large
2057 2067 parent: 0:fc0bd45326d3 tip
2058 2068 #0
2059 2069 branch: default
2060 2070 commit: (clean)
2061 2071 update: (current)
2062 2072 largefiles: (no remote repo)
2063 2073
2064 2074 check messages when there is no files to upload:
2065 2075
2066 2076 $ hg -q clone src clone2
2067 2077 $ hg -R clone2 paths | grep default
2068 2078 default = $TESTTMP/issue3651/src (glob)
2069 2079
2070 2080 $ hg -R clone2 summary --large
2071 2081 parent: 0:fc0bd45326d3 tip
2072 2082 #0
2073 2083 branch: default
2074 2084 commit: (clean)
2075 2085 update: (current)
2076 2086 searching for changes
2077 2087 largefiles: (no files to upload)
2078 2088 $ hg -R clone2 outgoing --large
2079 2089 comparing with $TESTTMP/issue3651/src (glob)
2080 2090 searching for changes
2081 2091 no changes found
2082 2092 searching for changes
2083 2093 largefiles: no files to upload
2084 2094 [1]
2085 2095
2086 2096 check messages when there are files to upload:
2087 2097
2088 2098 $ echo b > clone2/b
2089 2099 $ hg -R clone2 add --large clone2/b
2090 2100 $ hg -R clone2 commit -m '#1'
2091 2101 Invoking status precommit hook
2092 2102 A b
2093 2103 $ hg -R clone2 summary --large
2094 2104 parent: 1:1acbe71ce432 tip
2095 2105 #1
2096 2106 branch: default
2097 2107 commit: (clean)
2098 2108 update: (current)
2099 2109 searching for changes
2100 2110 largefiles: 1 to upload
2101 2111 $ hg -R clone2 outgoing --large
2102 2112 comparing with $TESTTMP/issue3651/src (glob)
2103 2113 searching for changes
2104 2114 changeset: 1:1acbe71ce432
2105 2115 tag: tip
2106 2116 user: test
2107 2117 date: Thu Jan 01 00:00:00 1970 +0000
2108 2118 summary: #1
2109 2119
2110 2120 searching for changes
2111 2121 largefiles to upload:
2112 2122 b
2113 2123
2114 2124
2115 2125 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now