##// END OF EJS Templates
largefiles: inline _updatelfile, prepare for further refactorings
Mads Kiilerich -
r20062:452f6873 stable
parent child Browse files
Show More
@@ -444,13 +444,63 b' def updatelfiles(ui, repo, filelist=None'
444 cachelfiles(ui, repo, None, lfiles)
444 cachelfiles(ui, repo, None, lfiles)
445
445
446 updated, removed = 0, 0
446 updated, removed = 0, 0
447 for f in lfiles:
447 for lfile in lfiles:
448 i = _updatelfile(repo, lfdirstate, f)
448 # updates a single largefile and copies the state of its standin from
449 if i:
449 # the repository's dirstate to its state in the lfdirstate.
450 if i > 0:
450 abslfile = repo.wjoin(lfile)
451 updated += i
451 absstandin = repo.wjoin(lfutil.standin(lfile))
452 if os.path.exists(absstandin):
453 if (os.path.exists(absstandin + '.orig') and
454 os.path.exists(abslfile)):
455 shutil.copyfile(abslfile, abslfile + '.orig')
456 update1 = 0
457 expecthash = lfutil.readstandin(repo, lfile)
458 if (expecthash != '' and
459 (not os.path.exists(abslfile) or
460 expecthash != lfutil.hashfile(abslfile))):
461 if not lfutil.copyfromcache(repo, expecthash, lfile):
462 # use normallookup() to allocate entry in largefiles
463 # dirstate, because lack of it misleads
464 # lfilesrepo.status() into recognition that such cache
465 # missing files are REMOVED.
466 if lfile not in repo[None]: # not switched to normal
467 util.unlinkpath(abslfile, ignoremissing=True)
468 lfdirstate.normallookup(lfile)
469 continue # don't try to set the mode
470 else:
471 # Synchronize largefile dirstate to the last modified
472 # time of the file
473 lfdirstate.normal(lfile)
474 update1 = 1
475 mode = os.stat(absstandin).st_mode
476 if mode != os.stat(abslfile).st_mode:
477 os.chmod(abslfile, mode)
478 update1 = 1
479 updated += update1
480 else:
481 # Remove lfiles for which the standin is deleted, unless the
482 # lfile is added to the repository again. This happens when a
483 # largefile is converted back to a normal file: the standin
484 # disappears, but a new (normal) file appears as the lfile.
485 if (os.path.exists(abslfile) and
486 repo.dirstate.normalize(lfile) not in repo[None]):
487 util.unlinkpath(abslfile)
488 removed += 1
489 state = repo.dirstate[lfutil.standin(lfile)]
490 if state == 'n':
491 # When rebasing, we need to synchronize the standin and the
492 # largefile, because otherwise the largefile will get reverted.
493 # But for commit's sake, we have to mark the file as unclean.
494 if getattr(repo, "_isrebasing", False):
495 lfdirstate.normallookup(lfile)
452 else:
496 else:
453 removed -= i
497 lfdirstate.normal(lfile)
498 elif state == 'r':
499 lfdirstate.remove(lfile)
500 elif state == 'a':
501 lfdirstate.add(lfile)
502 elif state == '?':
503 lfdirstate.drop(lfile)
454
504
455 lfdirstate.write()
505 lfdirstate.write()
456 if printmessage and lfiles:
506 if printmessage and lfiles:
@@ -459,66 +509,6 b' def updatelfiles(ui, repo, filelist=None'
459 finally:
509 finally:
460 wlock.release()
510 wlock.release()
461
511
462 def _updatelfile(repo, lfdirstate, lfile):
463 '''updates a single largefile and copies the state of its standin from
464 the repository's dirstate to its state in the lfdirstate.
465
466 returns 1 if the file was modified, -1 if the file was removed, 0 if the
467 file was unchanged, and None if the needed largefile was missing from the
468 cache.'''
469 ret = 0
470 abslfile = repo.wjoin(lfile)
471 absstandin = repo.wjoin(lfutil.standin(lfile))
472 if os.path.exists(absstandin):
473 if os.path.exists(absstandin + '.orig') and os.path.exists(abslfile):
474 shutil.copyfile(abslfile, abslfile + '.orig')
475 expecthash = lfutil.readstandin(repo, lfile)
476 if (expecthash != '' and
477 (not os.path.exists(abslfile) or
478 expecthash != lfutil.hashfile(abslfile))):
479 if not lfutil.copyfromcache(repo, expecthash, lfile):
480 # use normallookup() to allocate entry in largefiles dirstate,
481 # because lack of it misleads lfilesrepo.status() into
482 # recognition that such cache missing files are REMOVED.
483 if lfile not in repo[None]: # not switched to normal file
484 util.unlinkpath(abslfile, ignoremissing=True)
485 lfdirstate.normallookup(lfile)
486 return None # don't try to set the mode
487 else:
488 # Synchronize largefile dirstate to the last modified time of
489 # the file
490 lfdirstate.normal(lfile)
491 ret = 1
492 mode = os.stat(absstandin).st_mode
493 if mode != os.stat(abslfile).st_mode:
494 os.chmod(abslfile, mode)
495 ret = 1
496 else:
497 # Remove lfiles for which the standin is deleted, unless the
498 # lfile is added to the repository again. This happens when a
499 # largefile is converted back to a normal file: the standin
500 # disappears, but a new (normal) file appears as the lfile.
501 if (os.path.exists(abslfile) and
502 repo.dirstate.normalize(lfile) not in repo[None]):
503 util.unlinkpath(abslfile)
504 ret = -1
505 state = repo.dirstate[lfutil.standin(lfile)]
506 if state == 'n':
507 # When rebasing, we need to synchronize the standin and the largefile,
508 # because otherwise the largefile will get reverted. But for commit's
509 # sake, we have to mark the file as unclean.
510 if getattr(repo, "_isrebasing", False):
511 lfdirstate.normallookup(lfile)
512 else:
513 lfdirstate.normal(lfile)
514 elif state == 'r':
515 lfdirstate.remove(lfile)
516 elif state == 'a':
517 lfdirstate.add(lfile)
518 elif state == '?':
519 lfdirstate.drop(lfile)
520 return ret
521
522 def lfpull(ui, repo, source="default", **opts):
512 def lfpull(ui, repo, source="default", **opts):
523 """pull largefiles for the specified revisions from the specified source
513 """pull largefiles for the specified revisions from the specified source
524
514
General Comments 0
You need to be logged in to leave comments. Login now