# HG changeset patch # User Pierre-Yves David # Date 1674668780 -3600 # Node ID c166b212bdeeaaf7ed2ced4c90742c89a450f065 # Parent 376395868b7b96ba3549f833b2d7b3cba590325b dirstate: pass the repo to the `changeparent` method If we want the context to be responsible for writing (and we want it), we need to have access to a localrepository object. So we now requires a localrepository object as an argument to this context manager. diff -r 376395868b7b -r c166b212bdee hgext/absorb.py --- a/hgext/absorb.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/absorb.py Wed Jan 25 18:46:20 2023 +0100 @@ -881,7 +881,7 @@ dirstate._fsmonitorstate.invalidate = noop try: - with dirstate.parentchange(): + with dirstate.parentchange(self.repo): dirstate.rebuild(ctx.node(), ctx.manifest(), self.paths) finally: restore() diff -r 376395868b7b -r c166b212bdee hgext/fix.py --- a/hgext/fix.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/fix.py Wed Jan 25 18:46:20 2023 +0100 @@ -776,7 +776,7 @@ newp1 = replacements.get(oldp1, oldp1) if newp1 != oldp1: assert repo.dirstate.p2() == nullid - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, repo[newp1]) diff -r 376395868b7b -r c166b212bdee hgext/git/dirstate.py --- a/hgext/git/dirstate.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/git/dirstate.py Wed Jan 25 18:46:20 2023 +0100 @@ -384,7 +384,7 @@ pass @contextlib.contextmanager - def parentchange(self): + def parentchange(self, repo): # TODO: track this maybe? yield diff -r 376395868b7b -r c166b212bdee hgext/keyword.py --- a/hgext/keyword.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/keyword.py Wed Jan 25 18:46:20 2023 +0100 @@ -696,7 +696,7 @@ kwt = getattr(repo, '_keywordkwt', None) if kwt is None: return orig(ui, repo, old, extra, pats, opts) - with repo.wlock(), repo.dirstate.parentchange(): + with repo.wlock(), repo.dirstate.parentchange(repo): kwt.postcommit = True newid = orig(ui, repo, old, extra, pats, opts) if newid != old.node(): @@ -762,7 +762,7 @@ if ctx != recctx: modified, added = _preselect(wstatus, recctx.files()) kwt.restrict = False - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): kwt.overwrite(recctx, modified, False, True) kwt.overwrite(recctx, added, False, True, True) kwt.restrict = True diff -r 376395868b7b -r c166b212bdee hgext/largefiles/lfcommands.py --- a/hgext/largefiles/lfcommands.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/largefiles/lfcommands.py Wed Jan 25 18:46:20 2023 +0100 @@ -517,7 +517,7 @@ filelist = set(filelist) lfiles = [f for f in lfiles if f in filelist] - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): update = {} dropped = set() updated, removed = 0, 0 @@ -580,7 +580,7 @@ statuswriter(_(b'getting changed largefiles\n')) cachelfiles(ui, repo, None, lfiles) - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): for lfile in lfiles: update1 = 0 diff -r 376395868b7b -r c166b212bdee hgext/largefiles/lfutil.py --- a/hgext/largefiles/lfutil.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/largefiles/lfutil.py Wed Jan 25 18:46:20 2023 +0100 @@ -231,7 +231,7 @@ if len(standins) > 0: vfs.makedirs(lfstoredir) - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): for standin in standins: lfile = splitstandin(standin) lfdirstate.update_file( @@ -581,7 +581,7 @@ repo = ctx.repo() lfdirstate = openlfdirstate(repo.ui, repo) - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): orig(node) # ATTENTION: "ctx.files()" may differ from "repo[node].files()" diff -r 376395868b7b -r c166b212bdee hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/largefiles/overrides.py Wed Jan 25 18:46:20 2023 +0100 @@ -660,7 +660,7 @@ def mergerecordupdates(orig, repo, actions, branchmerge, getfiledata): if MERGE_ACTION_LARGEFILE_MARK_REMOVED in actions: lfdirstate = lfutil.openlfdirstate(repo.ui, repo) - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): for lfile, args, msg in actions[ MERGE_ACTION_LARGEFILE_MARK_REMOVED ]: @@ -1800,7 +1800,7 @@ raise error.ProgrammingError( b'largefiles is not compatible with in-memory merge' ) - with lfdirstate.parentchange(): + with lfdirstate.parentchange(repo): result = orig(repo, node, branchmerge, force, *args, **kwargs) newstandins = lfutil.getstandinsstate(repo) diff -r 376395868b7b -r c166b212bdee hgext/mq.py --- a/hgext/mq.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/mq.py Wed Jan 25 18:46:20 2023 +0100 @@ -1082,7 +1082,7 @@ if merge and files: # Mark as removed/merged and update dirstate parent info - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): for f in files: repo.dirstate.update_file_p1(f, p1_tracked=True) p1 = repo.dirstate.p1() @@ -1830,7 +1830,7 @@ if keepchanges and tobackup: raise error.Abort(_(b"local changes found, qrefresh first")) self.backup(repo, tobackup) - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): for f in a: repo.wvfs.unlinkpath(f, ignoremissing=True) repo.dirstate.update_file( @@ -1988,7 +1988,7 @@ bmlist = repo[top].bookmarks() - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): # XXX do we actually need the dirstateguard dsguard = None try: diff -r 376395868b7b -r c166b212bdee hgext/narrow/narrowcommands.py --- a/hgext/narrow/narrowcommands.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/narrow/narrowcommands.py Wed Jan 25 18:46:20 2023 +0100 @@ -320,7 +320,7 @@ repo.store.markremoved(f) ui.status(_(b'deleting unwanted files from working copy\n')) - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): narrowspec.updateworkingcopy(repo, assumeclean=True) narrowspec.copytoworkingcopy(repo) @@ -380,7 +380,7 @@ if ellipsesremote: ds = repo.dirstate p1, p2 = ds.p1(), ds.p2() - with ds.parentchange(): + with ds.parentchange(repo): ds.setparents(repo.nullid, repo.nullid) if isoldellipses: with wrappedextraprepare: @@ -419,10 +419,10 @@ bundle2.processbundle(repo, bundle, op=op, remote=remote) if ellipsesremote: - with ds.parentchange(): + with ds.parentchange(repo): ds.setparents(p1, p2) - with repo.transaction(b'widening'), repo.dirstate.parentchange(): + with repo.transaction(b'widening'), repo.dirstate.parentchange(repo): repo.setnewnarrowpats() narrowspec.updateworkingcopy(repo) narrowspec.copytoworkingcopy(repo) @@ -591,7 +591,7 @@ if update_working_copy: with repo.wlock(), repo.lock(), repo.transaction( b'narrow-wc' - ), repo.dirstate.parentchange(): + ), repo.dirstate.parentchange(repo): narrowspec.updateworkingcopy(repo) narrowspec.copytoworkingcopy(repo) return 0 diff -r 376395868b7b -r c166b212bdee hgext/split.py --- a/hgext/split.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/split.py Wed Jan 25 18:46:20 2023 +0100 @@ -134,7 +134,7 @@ # Set working parent to ctx.p1(), and keep working copy as ctx's content if ctx.node() != repo.dirstate.p1(): hg.clean(repo, ctx.node(), show_stats=False) - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, ctx.p1()) # Any modified, added, removed, deleted result means split is incomplete diff -r 376395868b7b -r c166b212bdee hgext/uncommit.py --- a/hgext/uncommit.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/uncommit.py Wed Jan 25 18:46:20 2023 +0100 @@ -236,7 +236,7 @@ # Fully removed the old commit mapping[old.node()] = () - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, repo[newid], match) scmutil.cleanupnodes(repo, mapping, b'uncommit', fixphase=True) @@ -317,7 +317,7 @@ newpredctx = repo[newprednode] dirstate = repo.dirstate - with dirstate.parentchange(): + with dirstate.parentchange(repo): scmutil.movedirstate(repo, newpredctx) mapping = {curctx.node(): (newprednode,)} diff -r 376395868b7b -r c166b212bdee hgext/win32text.py --- a/hgext/win32text.py Tue Dec 13 10:00:04 2022 +0100 +++ b/hgext/win32text.py Wed Jan 25 18:46:20 2023 +0100 @@ -216,7 +216,7 @@ def wrap_revert(orig, repo, ctx, names, uipathfn, actions, *args, **kwargs): # reset dirstate cache for file we touch ds = repo.dirstate - with ds.parentchange(): + with ds.parentchange(repo): for filename in actions[b'revert'][0]: entry = ds.get_entry(filename) if entry is not None: diff -r 376395868b7b -r c166b212bdee mercurial/cmdutil.py --- a/mercurial/cmdutil.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/cmdutil.py Wed Jan 25 18:46:20 2023 +0100 @@ -638,7 +638,7 @@ # already called within a `pendingchange`, However we # are taking a shortcut here in order to be able to # quickly deprecated the older API. - with dirstate.parentchange(): + with dirstate.parentchange(repo): dirstate.update_file( realname, p1_tracked=True, @@ -1532,7 +1532,7 @@ new_node = mem_ctx.commit() if repo.dirstate.p1() == ctx.node(): - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, repo[new_node]) replacements = {ctx.node(): [new_node]} scmutil.cleanupnodes( @@ -1625,7 +1625,7 @@ new_node = mem_ctx.commit() if repo.dirstate.p1() == ctx.node(): - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, repo[new_node]) replacements = {ctx.node(): [new_node]} scmutil.cleanupnodes(repo, replacements, b'copy', fixphase=True) @@ -3024,7 +3024,7 @@ newid = repo.commitctx(new) ms.reset() - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): # Reroute the working copy parent to the new changeset repo.setparents(newid, repo.nullid) diff -r 376395868b7b -r c166b212bdee mercurial/commands.py --- a/mercurial/commands.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/commands.py Wed Jan 25 18:46:20 2023 +0100 @@ -6264,7 +6264,7 @@ # # All this should eventually happens, but in the mean time, we use this # context manager slightly out of the context it should be. - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): mergestatemod.recordupdates(repo, ms.actions(), branchmerge, None) if not didwork and pats: diff -r 376395868b7b -r c166b212bdee mercurial/context.py --- a/mercurial/context.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/context.py Wed Jan 25 18:46:20 2023 +0100 @@ -1595,7 +1595,7 @@ if p2node is None: p2node = self._repo.nodeconstants.nullid dirstate = self._repo.dirstate - with dirstate.parentchange(): + with dirstate.parentchange(self._repo): copies = dirstate.setparents(p1node, p2node) pctx = self._repo[p1node] if copies: @@ -2050,7 +2050,7 @@ return sorted(f for f in ds.matches(match) if ds.get_entry(f).tracked) def markcommitted(self, node): - with self._repo.dirstate.parentchange(): + with self._repo.dirstate.parentchange(self._repo): for f in self.modified() + self.added(): self._repo.dirstate.update_file( f, p1_tracked=True, wc_tracked=True diff -r 376395868b7b -r c166b212bdee mercurial/dirstate.py --- a/mercurial/dirstate.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/dirstate.py Wed Jan 25 18:46:20 2023 +0100 @@ -151,7 +151,7 @@ self._pl @contextlib.contextmanager - def parentchange(self): + def parentchange(self, repo): """Context manager for handling dirstate parents. If an exception occurs in the scope of the context manager, @@ -523,7 +523,7 @@ rewriting operation. It should not be called during a merge (p2 != nullid) and only within - a `with dirstate.parentchange():` context. + a `with dirstate.parentchange(repo):` context. """ if self.in_merge: msg = b'update_file_reference should not be called when merging' diff -r 376395868b7b -r c166b212bdee mercurial/interfaces/dirstate.py --- a/mercurial/interfaces/dirstate.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/interfaces/dirstate.py Wed Jan 25 18:46:20 2023 +0100 @@ -35,7 +35,7 @@ _checkexec = interfaceutil.Attribute("""Callable for checking exec bits.""") @contextlib.contextmanager - def parentchange(): + def parentchange(repo): """Context manager for handling dirstate parents. If an exception occurs in the scope of the context manager, diff -r 376395868b7b -r c166b212bdee mercurial/merge.py --- a/mercurial/merge.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/merge.py Wed Jan 25 18:46:20 2023 +0100 @@ -2155,7 +2155,7 @@ assert len(getfiledata) == ( mresult.len((mergestatemod.ACTION_GET,)) if wantfiledata else 0 ) - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): ### Filter Filedata # # We gathered "cache" information for the clean file while @@ -2377,7 +2377,7 @@ # fix up dirstate for copies and renames copies.graftcopies(wctx, ctx, base) else: - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): repo.setparents(pctx.node(), pother) repo.dirstate.write(repo.currenttransaction()) # fix up dirstate for copies and renames diff -r 376395868b7b -r c166b212bdee mercurial/shelve.py --- a/mercurial/shelve.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/shelve.py Wed Jan 25 18:46:20 2023 +0100 @@ -637,7 +637,7 @@ ui.status(_(b'shelved as %s\n') % name) if opts[b'keep']: - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): scmutil.movedirstate(repo, parent, match) else: hg.update(repo, parent.node()) @@ -862,14 +862,14 @@ shelvectx = repo[state.parents[1]] pendingctx = state.pendingctx - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): repo.setparents(state.pendingctx.node(), repo.nullid) repo.dirstate.write(repo.currenttransaction()) targetphase = _target_phase(repo) overrides = {(b'phases', b'new-commit'): targetphase} with repo.ui.configoverride(overrides, b'unshelve'): - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): repo.setparents(state.parents[0], repo.nullid) newnode, ispartialunshelve = _createunshelvectx( ui, repo, shelvectx, basename, interactive, opts @@ -1068,7 +1068,7 @@ ) raise error.ConflictResolutionRequired(b'unshelve') - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): repo.setparents(tmpwctx.node(), repo.nullid) newnode, ispartialunshelve = _createunshelvectx( ui, repo, shelvectx, basename, interactive, opts diff -r 376395868b7b -r c166b212bdee mercurial/sparse.py --- a/mercurial/sparse.py Tue Dec 13 10:00:04 2022 +0100 +++ b/mercurial/sparse.py Wed Jan 25 18:46:20 2023 +0100 @@ -451,7 +451,7 @@ message, ) - with repo.dirstate.parentchange(): + with repo.dirstate.parentchange(repo): mergemod.applyupdates( repo, tmresult, @@ -655,7 +655,7 @@ The remaining sparse config only has profiles, if defined. The working directory is refreshed, as needed. """ - with repo.wlock(), repo.dirstate.parentchange(): + with repo.wlock(), repo.dirstate.parentchange(repo): raw = repo.vfs.tryread(b'sparse') includes, excludes, profiles = parseconfig(repo.ui, raw, b'sparse') @@ -671,7 +671,7 @@ The updated sparse config is written out and the working directory is refreshed, as needed. """ - with repo.wlock(), repo.dirstate.parentchange(): + with repo.wlock(), repo.dirstate.parentchange(repo): # read current configuration raw = repo.vfs.tryread(b'sparse') includes, excludes, profiles = parseconfig(repo.ui, raw, b'sparse') @@ -730,7 +730,7 @@ The new config is written out and a working directory refresh is performed. """ - with repo.wlock(), repo.lock(), repo.dirstate.parentchange(): + with repo.wlock(), repo.lock(), repo.dirstate.parentchange(repo): raw = repo.vfs.tryread(b'sparse') oldinclude, oldexclude, oldprofiles = parseconfig( repo.ui, raw, b'sparse' diff -r 376395868b7b -r c166b212bdee tests/test-narrow-expanddirstate.t --- a/tests/test-narrow-expanddirstate.t Tue Dec 13 10:00:04 2022 +0100 +++ b/tests/test-narrow-expanddirstate.t Wed Jan 25 18:46:20 2023 +0100 @@ -74,7 +74,7 @@ > narrowspec.copytoworkingcopy(repo) > newmatcher = narrowspec.match(repo.root, includes, excludes) > added = matchmod.differencematcher(newmatcher, currentmatcher) - > with repo.dirstate.parentchange(): + > with repo.dirstate.parentchange(repo): > for f in repo[b'.'].manifest().walk(added): > repo.dirstate.update_file( > f, diff -r 376395868b7b -r c166b212bdee tests/test-rebuildstate.t --- a/tests/test-rebuildstate.t Tue Dec 13 10:00:04 2022 +0100 +++ b/tests/test-rebuildstate.t Wed Jan 25 18:46:20 2023 +0100 @@ -17,7 +17,7 @@ > try: > for file in pats: > if opts.get('normal_lookup'): - > with repo.dirstate.parentchange(): + > with repo.dirstate.parentchange(repo): > repo.dirstate.update_file( > file, > p1_tracked=True,