515 |
515 |
516 if filelist is not None: |
516 if filelist is not None: |
517 filelist = set(filelist) |
517 filelist = set(filelist) |
518 lfiles = [f for f in lfiles if f in filelist] |
518 lfiles = [f for f in lfiles if f in filelist] |
519 |
519 |
520 with lfdirstate.changing_parents(repo): |
520 update = {} |
521 update = {} |
521 dropped = set() |
522 dropped = set() |
522 updated, removed = 0, 0 |
523 updated, removed = 0, 0 |
523 wvfs = repo.wvfs |
524 wvfs = repo.wvfs |
524 wctx = repo[None] |
525 wctx = repo[None] |
525 for lfile in lfiles: |
526 for lfile in lfiles: |
526 lfileorig = os.path.relpath( |
527 lfileorig = os.path.relpath( |
527 scmutil.backuppath(ui, repo, lfile), start=repo.root |
528 scmutil.backuppath(ui, repo, lfile), start=repo.root |
528 ) |
529 ) |
529 standin = lfutil.standin(lfile) |
530 standin = lfutil.standin(lfile) |
530 standinorig = os.path.relpath( |
531 standinorig = os.path.relpath( |
531 scmutil.backuppath(ui, repo, standin), start=repo.root |
532 scmutil.backuppath(ui, repo, standin), start=repo.root |
532 ) |
533 ) |
533 if wvfs.exists(standin): |
534 if wvfs.exists(standin): |
534 if wvfs.exists(standinorig) and wvfs.exists(lfile): |
535 if wvfs.exists(standinorig) and wvfs.exists(lfile): |
535 shutil.copyfile(wvfs.join(lfile), wvfs.join(lfileorig)) |
536 shutil.copyfile(wvfs.join(lfile), wvfs.join(lfileorig)) |
536 wvfs.unlinkpath(standinorig) |
537 wvfs.unlinkpath(standinorig) |
537 expecthash = lfutil.readasstandin(wctx[standin]) |
538 expecthash = lfutil.readasstandin(wctx[standin]) |
538 if expecthash != b'': |
539 if expecthash != b'': |
539 if lfile not in wctx: # not switched to normal file |
540 if lfile not in wctx: # not switched to normal file |
540 if repo.dirstate.get_entry(standin).any_tracked: |
541 if repo.dirstate.get_entry(standin).any_tracked: |
541 wvfs.unlinkpath(lfile, ignoremissing=True) |
542 wvfs.unlinkpath(lfile, ignoremissing=True) |
542 else: |
543 else: |
543 dropped.add(lfile) |
544 dropped.add(lfile) |
544 |
545 |
545 # allocate an entry in largefiles dirstate to prevent |
546 # allocate an entry in largefiles dirstate to prevent |
546 # lfilesrepo.status() from reporting missing files as |
547 # lfilesrepo.status() from reporting missing files as |
547 # removed. |
548 # removed. |
548 lfdirstate.hacky_extension_update_file( |
549 lfdirstate.hacky_extension_update_file( |
549 lfile, |
550 lfile, |
550 p1_tracked=True, |
551 p1_tracked=True, |
551 wc_tracked=True, |
552 wc_tracked=True, |
552 possibly_dirty=True, |
553 possibly_dirty=True, |
553 ) |
554 ) |
554 update[lfile] = expecthash |
555 update[lfile] = expecthash |
555 else: |
556 else: |
556 # Remove lfiles for which the standin is deleted, unless the |
557 # Remove lfiles for which the standin is deleted, unless the |
557 # lfile is added to the repository again. This happens when a |
558 # lfile is added to the repository again. This happens when a |
558 # largefile is converted back to a normal file: the standin |
559 # largefile is converted back to a normal file: the standin |
559 # disappears, but a new (normal) file appears as the lfile. |
560 # disappears, but a new (normal) file appears as the lfile. |
560 if ( |
561 if ( |
561 wvfs.exists(lfile) |
562 wvfs.exists(lfile) |
562 and repo.dirstate.normalize(lfile) not in wctx |
563 and repo.dirstate.normalize(lfile) not in wctx |
563 ): |
564 ): |
564 wvfs.unlinkpath(lfile) |
565 wvfs.unlinkpath(lfile) |
565 removed += 1 |
566 removed += 1 |
|
567 |
566 |
568 # largefile processing might be slow and be interrupted - be prepared |
567 # largefile processing might be slow and be interrupted - be prepared |
569 lfdirstate.write(repo.currenttransaction()) |
568 lfdirstate.write(repo.currenttransaction()) |
570 |
569 |
571 if lfiles: |
570 if lfiles: |