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]')), |