comparison mercurial/metadata.py @ 45659:a475db79d84d

changing-files: add a "salvaged" set to track file that were not removed We need this set for the copy tracing algorithm. See documentation for details about this set. Differential Revision: https://phab.mercurial-scm.org/D9118
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 14 Sep 2020 23:46:21 +0200
parents 9003e6524f78
children e66db30f95a8
comparison
equal deleted inserted replaced
45658:6569b2371240 45659:a475db79d84d
29 Actions performed on files are gathered into 3 sets: 29 Actions performed on files are gathered into 3 sets:
30 30
31 - added: files actively added in the changeset. 31 - added: files actively added in the changeset.
32 - merged: files whose history got merged 32 - merged: files whose history got merged
33 - removed: files removed in the revision 33 - removed: files removed in the revision
34 - salvaged: files that might have been deleted by a merge but were not
34 - touched: files affected by the merge 35 - touched: files affected by the merge
35 36
36 and copies information is held by 2 mappings 37 and copies information is held by 2 mappings
37 38
38 - copied_from_p1: {"<new-name>": "<source-name-in-p1>"} mapping for copies 39 - copied_from_p1: {"<new-name>": "<source-name-in-p1>"} mapping for copies
45 self, 46 self,
46 touched=None, 47 touched=None,
47 added=None, 48 added=None,
48 removed=None, 49 removed=None,
49 merged=None, 50 merged=None,
51 salvaged=None,
50 p1_copies=None, 52 p1_copies=None,
51 p2_copies=None, 53 p2_copies=None,
52 ): 54 ):
53 self._added = set(() if added is None else added) 55 self._added = set(() if added is None else added)
54 self._merged = set(() if merged is None else merged) 56 self._merged = set(() if merged is None else merged)
55 self._removed = set(() if removed is None else removed) 57 self._removed = set(() if removed is None else removed)
56 self._touched = set(() if touched is None else touched) 58 self._touched = set(() if touched is None else touched)
59 self._salvaged = set(() if salvaged is None else salvaged)
57 self._touched.update(self._added) 60 self._touched.update(self._added)
58 self._touched.update(self._merged) 61 self._touched.update(self._merged)
59 self._touched.update(self._removed) 62 self._touched.update(self._removed)
60 self._p1_copies = dict(() if p1_copies is None else p1_copies) 63 self._p1_copies = dict(() if p1_copies is None else p1_copies)
61 self._p2_copies = dict(() if p2_copies is None else p2_copies) 64 self._p2_copies = dict(() if p2_copies is None else p2_copies)
63 def __eq__(self, other): 66 def __eq__(self, other):
64 return ( 67 return (
65 self.added == other.added 68 self.added == other.added
66 and self.merged == other.merged 69 and self.merged == other.merged
67 and self.removed == other.removed 70 and self.removed == other.removed
71 and self.salvaged == other.salvaged
68 and self.touched == other.touched 72 and self.touched == other.touched
69 and self.copied_from_p1 == other.copied_from_p1 73 and self.copied_from_p1 == other.copied_from_p1
70 and self.copied_from_p2 == other.copied_from_p2 74 and self.copied_from_p2 == other.copied_from_p2
71 ) 75 )
72 76
156 self.mark_touched(filename) 160 self.mark_touched(filename)
157 161
158 def update_removed(self, filenames): 162 def update_removed(self, filenames):
159 for f in filenames: 163 for f in filenames:
160 self.mark_removed(f) 164 self.mark_removed(f)
165
166 @util.propertycache
167 def salvaged(self):
168 """files that might have been deleted by a merge, but still exists.
169
170 During a merge, the manifest merging might select some files for
171 removal, or for a removed/changed conflict. If at commit time the file
172 still exists, its removal was "reverted" and the file is "salvaged"
173 """
174 return frozenset(self._salvaged)
175
176 def mark_salvaged(self, filename):
177 if "salvaged" in vars(self):
178 del self.salvaged
179 self._salvaged.add(filename)
180 self.mark_touched(filename)
181
182 def update_salvaged(self, filenames):
183 for f in filenames:
184 self.mark_salvaged(f)
161 185
162 @util.propertycache 186 @util.propertycache
163 def touched(self): 187 def touched(self):
164 """files either actively modified, added or removed""" 188 """files either actively modified, added or removed"""
165 return frozenset(self._touched) 189 return frozenset(self._touched)