Mercurial > public > mercurial-scm > hg
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 |