# HG changeset patch # User Martin von Zweigbergk # Date 1546157738 28800 # Node ID 8c366af085f48464779a6a166a907a293e71f1dc # Parent ad9ab25231492dbc6cddef60a3dfbb1ffd7f6524 narrow: reuse narrowspec.updateworkingcopy() when narrowing Similar to the previous patch for widening, but here we also need to teach updateworkingcopy() to forcefully delete files that are not recorded in the dirstate as clean. That should be safe because the narrowing command (e.g. `hg tracked --removeinclude`) has already checked that the working copy is clean. Differential Revision: https://phab.mercurial-scm.org/D5511 diff -r ad9ab2523149 -r 8c366af085f4 hgext/narrow/narrowcommands.py --- a/hgext/narrow/narrowcommands.py Fri Dec 21 10:05:37 2018 -0800 +++ b/hgext/narrow/narrowcommands.py Sun Dec 30 00:15:38 2018 -0800 @@ -159,16 +159,6 @@ extensions.wrapfunction(exchange,'_pullbundle2extraprepare', pullbundle2extraprepare) -# This is an extension point for filesystems that need to do something other -# than just blindly unlink the files. It's not clear what arguments would be -# useful, so we're passing in a fair number of them, some of them redundant. -def _narrowcleanupwdir(repo, oldincludes, oldexcludes, newincludes, newexcludes, - oldmatch, newmatch): - for f in repo.dirstate: - if not newmatch(f): - repo.dirstate.drop(f) - repo.wvfs.unlinkpath(f) - def _narrow(ui, repo, remote, commoninc, oldincludes, oldexcludes, newincludes, newexcludes, force): oldmatch = narrowspec.match(repo.root, oldincludes, oldexcludes) @@ -240,19 +230,18 @@ repo.destroying() - with repo.transaction("narrowing"): + with repo.transaction('narrowing'): # Update narrowspec before removing revlogs, so repo won't be # corrupt in case of crash repo.setnarrowpats(newincludes, newexcludes) - narrowspec.copytoworkingcopy(repo) for f in todelete: ui.status(_('deleting %s\n') % f) util.unlinkpath(repo.svfs.join(f)) repo.store.markremoved(f) - _narrowcleanupwdir(repo, oldincludes, oldexcludes, newincludes, - newexcludes, oldmatch, newmatch) + narrowspec.updateworkingcopy(repo, assumeclean=True) + narrowspec.copytoworkingcopy(repo) repo.destroyed() diff -r ad9ab2523149 -r 8c366af085f4 mercurial/narrowspec.py --- a/mercurial/narrowspec.py Fri Dec 21 10:05:37 2018 -0800 +++ b/mercurial/narrowspec.py Sun Dec 30 00:15:38 2018 -0800 @@ -273,7 +273,12 @@ raise error.Abort(_("working copy's narrowspec is stale"), hint=_("run 'hg tracked --update-working-copy'")) -def updateworkingcopy(repo): +def updateworkingcopy(repo, assumeclean=False): + """updates the working copy and dirstate from the store narrowspec + + When assumeclean=True, files that are not known to be clean will also + be deleted. It is then up to the caller to make sure they are clean. + """ oldspec = repo.vfs.tryread(DIRSTATE_FILENAME) newspec = repo.svfs.tryread(FILENAME) @@ -287,11 +292,17 @@ ds = repo.dirstate lookup, status = ds.status(removedmatch, subrepos=[], ignored=False, clean=True, unknown=False) - _deletecleanfiles(repo, status.clean) - trackeddirty = lookup + status.modified + status.added + trackeddirty = status.modified + status.added + clean = status.clean + if assumeclean: + assert not trackeddirty + clean.extend(lookup) + else: + trackeddirty.extend(lookup) + _deletecleanfiles(repo, clean) for f in sorted(trackeddirty): repo.ui.status(_('not deleting possibly dirty file %s\n') % f) - for f in status.clean + trackeddirty: + for f in clean + trackeddirty: ds.drop(f) repo.narrowpats = newincludes, newexcludes