Mercurial > public > mercurial-scm > hg
diff mercurial/dirstatemap.py @ 48059:5d68c4eedd66
dirstate: move parent state handling in the dirstatemap
This involves dirstatemap data mostly. Moving this one level down will remove
the needs for the dirstatemap to expose some of its internals.
This will help us to simplify more code further.
Differential Revision: https://phab.mercurial-scm.org/D11505
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 22 Sep 2021 15:17:12 +0200 |
parents | cd13d3c2ad2e |
children | a660d8a53267 |
line wrap: on
line diff
--- a/mercurial/dirstatemap.py Wed Sep 22 09:46:37 2021 +0200 +++ b/mercurial/dirstatemap.py Wed Sep 22 15:17:12 2021 +0200 @@ -428,9 +428,40 @@ return self._parents - def setparents(self, p1, p2): + def setparents(self, p1, p2, fold_p2=False): self._parents = (p1, p2) self._dirtyparents = True + copies = {} + if fold_p2: + candidatefiles = self.non_normal_or_other_parent_paths() + + for f in candidatefiles: + s = self.get(f) + if s is None: + continue + + # Discard "merged" markers when moving away from a merge state + if s.merged: + source = self.copymap.get(f) + if source: + copies[f] = source + self.reset_state( + f, + wc_tracked=True, + p1_tracked=True, + possibly_dirty=True, + ) + # Also fix up otherparent markers + elif s.from_p2: + source = self.copymap.get(f) + if source: + copies[f] = source + self.reset_state( + f, + p1_tracked=False, + wc_tracked=True, + ) + return copies def read(self): # ignore HG_PENDING because identity is used only for writing @@ -769,9 +800,40 @@ # File doesn't exist, so the current state is empty return b'' - def setparents(self, p1, p2): + def setparents(self, p1, p2, fold_p2=False): self._parents = (p1, p2) self._dirtyparents = True + copies = {} + if fold_p2: + candidatefiles = self.non_normal_or_other_parent_paths() + + for f in candidatefiles: + s = self.get(f) + if s is None: + continue + + # Discard "merged" markers when moving away from a merge state + if s.merged: + source = self.copymap.get(f) + if source: + copies[f] = source + self.reset_state( + f, + wc_tracked=True, + p1_tracked=True, + possibly_dirty=True, + ) + # Also fix up otherparent markers + elif s.from_p2: + source = self.copymap.get(f) + if source: + copies[f] = source + self.reset_state( + f, + p1_tracked=False, + wc_tracked=True, + ) + return copies def parents(self): if not self._parents: