comparison mercurial/context.py @ 23755:d43948a910a5

context: use manifest.diff() to compute most of status We can do a little tiny bit better by enhancing manifest.diff to optionally include files that are in both sides. This will be done in a followup patch.
author Augie Fackler <augie@google.com>
date Mon, 15 Dec 2014 15:33:55 -0500
parents ccbaa2ed11a4
children b5346480a490
comparison
equal deleted inserted replaced
23754:ed645dc672e5 23755:d43948a910a5
133 if self.rev() is not None and self.rev() < other.rev(): 133 if self.rev() is not None and self.rev() < other.rev():
134 self.manifest() 134 self.manifest()
135 mf1 = other._manifestmatches(match, s) 135 mf1 = other._manifestmatches(match, s)
136 mf2 = self._manifestmatches(match, s) 136 mf2 = self._manifestmatches(match, s)
137 137
138 modified, added, clean = [], [], [] 138 modified, added = [], []
139 removed = []
140 clean = set()
139 deleted, unknown, ignored = s.deleted, s.unknown, s.ignored 141 deleted, unknown, ignored = s.deleted, s.unknown, s.ignored
140 deletedset = set(deleted) 142 deletedset = set(deleted)
141 withflags = mf1.withflags() | mf2.withflags() 143 d = mf1.diff(mf2)
142 for fn, mf2node in mf2.iteritems(): 144 for fn, ((node1, flag1), (node2, flag2)) in d.iteritems():
143 if fn in deletedset: 145 if fn in deletedset:
144 continue 146 continue
145 if fn in mf1: 147 if node1 is None:
146 if ((fn in withflags and mf1.flags(fn) != mf2.flags(fn)) or 148 added.append(fn)
147 (mf1[fn] != mf2node and 149 elif node2 is None:
148 (mf2node != _newnode or self[fn].cmp(other[fn])))): 150 removed.append(fn)
149 modified.append(fn) 151 elif node2 != _newnode:
150 elif listclean: 152 # The file was not a new file in mf2, so an entry
151 clean.append(fn) 153 # from diff is really a difference.
152 del mf1[fn] 154 modified.append(fn)
155 elif self[fn].cmp(other[fn]):
156 # node2 was newnode, but the working file doesn't
157 # match the one in mf1.
158 modified.append(fn)
153 else: 159 else:
154 added.append(fn) 160 clean.add(fn)
155 removed = mf1.keys() 161 if listclean:
162 nondiff = (set(mf1) | set(mf2)) - set(d)
163 clean = list((clean | nondiff) - deletedset)
164 else:
165 clean = []
166
156 if removed: 167 if removed:
157 # need to filter files if they are already reported as removed 168 # need to filter files if they are already reported as removed
158 unknown = [fn for fn in unknown if fn not in mf1] 169 unknown = [fn for fn in unknown if fn not in mf1]
159 ignored = [fn for fn in ignored if fn not in mf1] 170 ignored = [fn for fn in ignored if fn not in mf1]
160 # if they're deleted, don't report them as removed 171 # if they're deleted, don't report them as removed