comparison mercurial/commands.py @ 2886:9826af4841ef

Test for log --prune.
author Brendan Cully <brendan@kublai.com>
date Mon, 14 Aug 2006 10:27:02 -0700
parents c2932ad5476a
children 8b02af865990
comparison
equal deleted inserted replaced
2885:26c37ebda1bb 2886:9826af4841ef
181 matches = filter(matchfn, changefiles) 181 matches = filter(matchfn, changefiles)
182 if matches: 182 if matches:
183 fncache[rev] = matches 183 fncache[rev] = matches
184 wanted[rev] = 1 184 wanted[rev] = 1
185 185
186 class followfilter:
187 def __init__(self, onlyfirst=False):
188 self.startrev = -1
189 self.roots = []
190 self.onlyfirst = onlyfirst
191
192 def match(self, rev):
193 def realparents(rev):
194 if self.onlyfirst:
195 return repo.changelog.parentrevs(rev)[0:1]
196 else:
197 return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
198
199 if self.startrev == -1:
200 self.startrev = rev
201 return True
202
203 if rev > self.startrev:
204 # forward: all descendants
205 if not self.roots:
206 self.roots.append(self.startrev)
207 for parent in realparents(rev):
208 if parent in self.roots:
209 self.roots.append(rev)
210 return True
211 else:
212 # backwards: all parents
213 if not self.roots:
214 self.roots.extend(realparents(self.startrev))
215 if rev in self.roots:
216 self.roots.remove(rev)
217 self.roots.extend(realparents(rev))
218 return True
219
220 return False
221
222 # it might be worthwhile to do this in the iterator if the rev range
223 # is descending and the prune args are all within that range
224 for rev in opts.get('prune'):
225 rev = repo.changelog.rev(repo.lookup(rev))
226 ff = followfilter()
227 stop = min(revs[0], revs[-1])
228 for x in range(rev, stop-1, -1):
229 if ff.match(x) and wanted.has_key(x):
230 del wanted[x]
231
186 def iterate(): 232 def iterate():
187 class followfilter:
188 def __init__(self, onlyfirst=False):
189 self.startrev = -1
190 self.roots = []
191 self.onlyfirst = onlyfirst
192
193 def match(self, rev):
194 def realparents(rev):
195 if self.onlyfirst:
196 return repo.changelog.parentrevs(rev)[0:1]
197 else:
198 return filter(lambda x: x != -1, repo.changelog.parentrevs(rev))
199
200 if self.startrev == -1:
201 self.startrev = rev
202 return True
203
204 if rev > self.startrev:
205 # forward: all descendants
206 if not self.roots:
207 self.roots.append(self.startrev)
208 for parent in realparents(rev):
209 if parent in self.roots:
210 self.roots.append(rev)
211 return True
212 else:
213 # backwards: all parents
214 if not self.roots:
215 self.roots.extend(realparents(self.startrev))
216 if rev in self.roots:
217 self.roots.remove(rev)
218 self.roots.extend(realparents(rev))
219 return True
220
221 return False
222
223 if follow and not files: 233 if follow and not files:
224 ff = followfilter(onlyfirst=opts.get('follow_first')) 234 ff = followfilter(onlyfirst=opts.get('follow_first'))
225 def want(rev): 235 def want(rev):
226 if rev not in wanted: 236 if ff.match(rev) and rev in wanted:
227 return False 237 return True
228 return ff.match(rev) 238 return False
229 else: 239 else:
230 def want(rev): 240 def want(rev):
231 return rev in wanted 241 return rev in wanted
232 242
233 for i, window in increasing_windows(0, len(revs)): 243 for i, window in increasing_windows(0, len(revs)):
2964 ('r', 'rev', [], _('show the specified revision or range')), 2974 ('r', 'rev', [], _('show the specified revision or range')),
2965 ('M', 'no-merges', None, _('do not show merges')), 2975 ('M', 'no-merges', None, _('do not show merges')),
2966 ('', 'style', '', _('display using template map file')), 2976 ('', 'style', '', _('display using template map file')),
2967 ('m', 'only-merges', None, _('show only merges')), 2977 ('m', 'only-merges', None, _('show only merges')),
2968 ('p', 'patch', None, _('show patch')), 2978 ('p', 'patch', None, _('show patch')),
2979 ('P', 'prune', [], _('do not display revision or any of its ancestors')),
2969 ('', 'template', '', _('display with template')), 2980 ('', 'template', '', _('display with template')),
2970 ('I', 'include', [], _('include names matching the given patterns')), 2981 ('I', 'include', [], _('include names matching the given patterns')),
2971 ('X', 'exclude', [], _('exclude names matching the given patterns'))], 2982 ('X', 'exclude', [], _('exclude names matching the given patterns'))],
2972 _('hg log [OPTION]... [FILE]')), 2983 _('hg log [OPTION]... [FILE]')),
2973 "manifest": (manifest, [], _('hg manifest [REV]')), 2984 "manifest": (manifest, [], _('hg manifest [REV]')),