##// END OF EJS Templates
walkchangerevs: move 'add' to callback...
Matt Mackall -
r9662:f3d60543 default
parent child Browse files
Show More
@@ -54,13 +54,10 b' def countrate(ui, repo, amap, *pats, **o'
54 54 df = util.matchdate(opts['date'])
55 55
56 56 m = cmdutil.match(repo, pats, opts)
57 for st, ctx, fns in cmdutil.walkchangerevs(ui, repo, m, opts):
58 if not st == 'add':
59 continue
60
57 def prep(ctx, fns):
61 58 rev = ctx.rev()
62 59 if df and not df(ctx.date()[0]): # doesn't match date format
63 continue
60 return
64 61
65 62 key = getkey(ctx)
66 63 key = amap.get(key, key) # alias remap
@@ -70,7 +67,7 b' def countrate(ui, repo, amap, *pats, **o'
70 67 parents = ctx.parents()
71 68 if len(parents) > 1:
72 69 ui.note(_('Revision %d is a merge, ignoring...\n') % (rev,))
73 continue
70 return
74 71
75 72 ctx1 = parents[0]
76 73 lines = changedlines(ui, repo, ctx1, ctx, fns)
@@ -84,6 +81,9 b' def countrate(ui, repo, amap, *pats, **o'
84 81 ui.write("\r" + _("generating stats: %d%%") % pct)
85 82 sys.stdout.flush()
86 83
84 for ctx in cmdutil.walkchangerevs(ui, repo, m, opts, prep):
85 continue
86
87 87 if opts.get('progress'):
88 88 ui.write("\r")
89 89 sys.stdout.flush()
@@ -1023,23 +1023,24 b' def show_changeset(ui, repo, opts, buffe'
1023 1023 def finddate(ui, repo, date):
1024 1024 """Find the tipmost changeset that matches the given date spec"""
1025 1025 df = util.matchdate(date)
1026 get = util.cachefunc(lambda r: repo[r])
1027 1026 m = matchall(repo)
1028 1027 results = {}
1029 for st, rev, fns in walkchangerevs(ui, repo, m, get, {'rev':None}):
1030 if st == 'add':
1031 d = get(rev).date()
1032 if df(d[0]):
1033 results[rev] = d
1034 elif st == 'iter':
1035 if rev in results:
1036 ui.status(_("Found revision %s from %s\n") %
1037 (rev, util.datestr(results[rev])))
1038 return str(rev)
1028
1029 def prep(ctx, fns):
1030 d = ctx.date()
1031 if df(d[0]):
1032 results[rev] = d
1033
1034 for ctx in walkchangerevs(ui, repo, m, {'rev':None}, prep):
1035 rev = ctx.rev()
1036 if rev in results:
1037 ui.status(_("Found revision %s from %s\n") %
1038 (rev, util.datestr(results[rev])))
1039 return str(rev)
1039 1040
1040 1041 raise util.Abort(_("revision matching date not found"))
1041 1042
1042 def walkchangerevs(ui, repo, match, opts):
1043 def walkchangerevs(ui, repo, match, opts, prepare):
1043 1044 '''Iterate over files and the revs in which they changed.
1044 1045
1045 1046 Callers most commonly need to iterate backwards over the history
@@ -1050,15 +1051,9 b' def walkchangerevs(ui, repo, match, opts'
1050 1051 window, we first walk forwards to gather data, then in the desired
1051 1052 order (usually backwards) to display it.
1052 1053
1053 This function returns an iterator. The iterator yields 3-tuples.
1054 They will be of one of the following forms:
1055
1056 "add", rev, fns: out-of-order traversal of the given filenames
1057 fns, which changed during revision rev - use to gather data for
1058 possible display
1059
1060 "iter", rev, None: in-order traversal of the revs earlier iterated
1061 over with "add" - use to display data'''
1054 This function returns an iterator yielding contexts. Before
1055 yielding each context, the iterator will first call the prepare
1056 function on each context in the window in forward order.'''
1062 1057
1063 1058 def increasing_windows(start, end, windowsize=8, sizelimit=512):
1064 1059 if start < end:
@@ -1225,9 +1220,9 b' def walkchangerevs(ui, repo, match, opts'
1225 1220 if match(f):
1226 1221 yield f
1227 1222 fns = fns_generator()
1228 yield 'add', ctx, fns
1223 prepare(ctx, fns)
1229 1224 for rev in nrevs:
1230 yield 'iter', change(rev), None
1225 yield change(rev)
1231 1226 return iterate()
1232 1227
1233 1228 def commit(ui, repo, commitfunc, pats, opts):
@@ -1302,61 +1302,62 b' def grep(ui, repo, pattern, *pats, **opt'
1302 1302 matchfn = cmdutil.match(repo, pats, opts)
1303 1303 found = False
1304 1304 follow = opts.get('follow')
1305 for st, ctx, fns in cmdutil.walkchangerevs(ui, repo, matchfn, opts):
1306 if st == 'add':
1307 rev = ctx.rev()
1308 pctx = ctx.parents()[0]
1309 parent = pctx.rev()
1310 matches.setdefault(rev, {})
1311 matches.setdefault(parent, {})
1312 files = revfiles.setdefault(rev, [])
1313 for fn in fns:
1314 flog = getfile(fn)
1305
1306 def prep(ctx, fns):
1307 rev = ctx.rev()
1308 pctx = ctx.parents()[0]
1309 parent = pctx.rev()
1310 matches.setdefault(rev, {})
1311 matches.setdefault(parent, {})
1312 files = revfiles.setdefault(rev, [])
1313 for fn in fns:
1314 flog = getfile(fn)
1315 try:
1316 fnode = ctx.filenode(fn)
1317 except error.LookupError:
1318 continue
1319
1320 copied = flog.renamed(fnode)
1321 copy = follow and copied and copied[0]
1322 if copy:
1323 copies.setdefault(rev, {})[fn] = copy
1324 if fn in skip:
1325 if copy:
1326 skip[copy] = True
1327 continue
1328 files.append(fn)
1329
1330 if fn not in matches[rev]:
1331 grepbody(fn, rev, flog.read(fnode))
1332
1333 pfn = copy or fn
1334 if pfn not in matches[parent]:
1315 1335 try:
1316 fnode = ctx.filenode(fn)
1336 fnode = pctx.filenode(pfn)
1337 grepbody(pfn, parent, flog.read(fnode))
1317 1338 except error.LookupError:
1318 continue
1319
1320 copied = flog.renamed(fnode)
1321 copy = follow and copied and copied[0]
1339 pass
1340
1341 for ctx in cmdutil.walkchangerevs(ui, repo, matchfn, opts, prep):
1342 rev = ctx.rev()
1343 parent = ctx.parents()[0].rev()
1344 for fn in sorted(revfiles.get(rev, [])):
1345 states = matches[rev][fn]
1346 copy = copies.get(rev, {}).get(fn)
1347 if fn in skip:
1322 1348 if copy:
1323 copies.setdefault(rev, {})[fn] = copy
1324 if fn in skip:
1349 skip[copy] = True
1350 continue
1351 pstates = matches.get(parent, {}).get(copy or fn, [])
1352 if pstates or states:
1353 r = display(fn, ctx, pstates, states)
1354 found = found or r
1355 if r and not opts.get('all'):
1356 skip[fn] = True
1325 1357 if copy:
1326 1358 skip[copy] = True
1327 continue
1328 files.append(fn)
1329
1330 if fn not in matches[rev]:
1331 grepbody(fn, rev, flog.read(fnode))
1332
1333 pfn = copy or fn
1334 if pfn not in matches[parent]:
1335 try:
1336 fnode = pctx.filenode(pfn)
1337 grepbody(pfn, parent, flog.read(fnode))
1338 except error.LookupError:
1339 pass
1340 elif st == 'iter':
1341 rev = ctx.rev()
1342 parent = ctx.parents()[0].rev()
1343 for fn in sorted(revfiles.get(rev, [])):
1344 states = matches[rev][fn]
1345 copy = copies.get(rev, {}).get(fn)
1346 if fn in skip:
1347 if copy:
1348 skip[copy] = True
1349 continue
1350 pstates = matches.get(parent, {}).get(copy or fn, [])
1351 if pstates or states:
1352 r = display(fn, ctx, pstates, states)
1353 found = found or r
1354 if r and not opts.get('all'):
1355 skip[fn] = True
1356 if copy:
1357 skip[copy] = True
1358 del matches[rev]
1359 del revfiles[rev]
1359 del matches[rev]
1360 del revfiles[rev]
1360 1361
1361 1362 def heads(ui, repo, *branchrevs, **opts):
1362 1363 """show current repository heads or show branch heads
@@ -2037,50 +2038,46 b' def log(ui, repo, *pats, **opts):'
2037 2038 only_branches = opts.get('only_branch')
2038 2039
2039 2040 displayer = cmdutil.show_changeset(ui, repo, opts, True, matchfn)
2040 for st, ctx, fns in cmdutil.walkchangerevs(ui, repo, matchfn, opts):
2041 def prep(ctx, fns):
2041 2042 rev = ctx.rev()
2042 if st == 'add':
2043 parents = [p for p in repo.changelog.parentrevs(rev)
2044 if p != nullrev]
2045 if opts.get('no_merges') and len(parents) == 2:
2046 continue
2047 if opts.get('only_merges') and len(parents) != 2:
2048 continue
2049
2050 if only_branches and ctx.branch() not in only_branches:
2051 continue
2052
2053 if df and not df(ctx.date()[0]):
2054 continue
2055
2056 if opts.get('keyword'):
2057 miss = 0
2058 for k in [kw.lower() for kw in opts['keyword']]:
2059 if not (k in ctx.user().lower() or
2060 k in ctx.description().lower() or
2061 k in " ".join(ctx.files()).lower()):
2062 miss = 1
2063 break
2064 if miss:
2065 continue
2066
2067 if opts['user']:
2068 if not [k for k in opts['user'] if k in ctx.user()]:
2069 continue
2070
2071 copies = []
2072 if opts.get('copies') and rev:
2073 for fn in ctx.files():
2074 rename = getrenamed(fn, rev)
2075 if rename:
2076 copies.append((fn, rename[0]))
2077
2078 displayer.show(ctx, copies=copies)
2079
2080 elif st == 'iter':
2081 if count == limit: break
2082
2083 if displayer.flush(rev):
2043 parents = [p for p in repo.changelog.parentrevs(rev)
2044 if p != nullrev]
2045 if opts.get('no_merges') and len(parents) == 2:
2046 return
2047 if opts.get('only_merges') and len(parents) != 2:
2048 return
2049 if only_branches and ctx.branch() not in only_branches:
2050 return
2051 if df and not df(ctx.date()[0]):
2052 return
2053
2054 if opts.get('keyword'):
2055 miss = 0
2056 for k in [kw.lower() for kw in opts['keyword']]:
2057 if not (k in ctx.user().lower() or
2058 k in ctx.description().lower() or
2059 k in " ".join(ctx.files()).lower()):
2060 miss = 1
2061 break
2062 if miss:
2063 return
2064
2065 if opts['user']:
2066 if not [k for k in opts['user'] if k in ctx.user()]:
2067 return
2068
2069 copies = []
2070 if opts.get('copies') and rev:
2071 for fn in ctx.files():
2072 rename = getrenamed(fn, rev)
2073 if rename:
2074 copies.append((fn, rename[0]))
2075
2076 displayer.show(ctx, copies=copies)
2077
2078 for ctx in cmdutil.walkchangerevs(ui, repo, matchfn, opts, prep):
2079 if count != limit:
2080 if displayer.flush(ctx.rev()):
2084 2081 count += 1
2085 2082
2086 2083 def manifest(ui, repo, node=None, rev=None):
General Comments 0
You need to be logged in to leave comments. Login now