comparison mercurial/commands.py @ 3951:cb66641cdee3

grep: remove count handling, simplify, fix issue337
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Fri, 22 Dec 2006 22:51:39 +0100
parents 3d3007064a17
children 356e20d46b34
comparison
equal deleted inserted replaced
3950:3d3007064a17 3951:cb66641cdee3
1147 for i in xrange(blo, bhi): 1147 for i in xrange(blo, bhi):
1148 yield ('+', b[i]) 1148 yield ('+', b[i])
1149 1149
1150 prev = {} 1150 prev = {}
1151 def display(fn, rev, states, prevstates): 1151 def display(fn, rev, states, prevstates):
1152 counts = {'-': 0, '+': 0} 1152 found = False
1153 filerevmatches = {} 1153 filerevmatches = {}
1154 if not opts['all']: 1154 r = prev.get(fn, -1)
1155 a, b, r = prevstates, states, rev 1155 if opts['all']:
1156 iter = difflinestates(states, prevstates)
1156 else: 1157 else:
1157 a, b, r = states, prevstates, prev.get(fn, -1) 1158 iter = [('', l) for l in prevstates]
1158 for change, l in difflinestates(a, b): 1159 for change, l in iter:
1159 cols = [fn, str(r)] 1160 cols = [fn, str(r)]
1160 if opts['line_number']: 1161 if opts['line_number']:
1161 cols.append(str(l.linenum)) 1162 cols.append(str(l.linenum))
1162 if opts['all']: 1163 if opts['all']:
1163 cols.append(change) 1164 cols.append(change)
1169 continue 1170 continue
1170 filerevmatches[c] = 1 1171 filerevmatches[c] = 1
1171 else: 1172 else:
1172 cols.append(l.line) 1173 cols.append(l.line)
1173 ui.write(sep.join(cols), eol) 1174 ui.write(sep.join(cols), eol)
1174 counts[change] += 1 1175 found = True
1175 return counts['+'], counts['-'] 1176 return found
1176 1177
1177 fstate = {} 1178 fstate = {}
1178 skip = {} 1179 skip = {}
1179 get = util.cachefunc(lambda r: repo.changectx(r).changeset()) 1180 get = util.cachefunc(lambda r: repo.changectx(r).changeset())
1180 changeiter, matchfn = cmdutil.walkchangerevs(ui, repo, pats, get, opts) 1181 changeiter, matchfn = cmdutil.walkchangerevs(ui, repo, pats, get, opts)
1181 count = 0 1182 found = False
1182 follow = opts.get('follow') 1183 follow = opts.get('follow')
1183 for st, rev, fns in changeiter: 1184 for st, rev, fns in changeiter:
1184 if st == 'window': 1185 if st == 'window':
1185 matches.clear() 1186 matches.clear()
1186 elif st == 'add': 1187 elif st == 'add':
1205 copy = copies.get(rev, {}).get(fn) 1206 copy = copies.get(rev, {}).get(fn)
1206 if fn in skip: 1207 if fn in skip:
1207 if copy: 1208 if copy:
1208 skip[copy] = True 1209 skip[copy] = True
1209 continue 1210 continue
1210 if not opts['all'] or fstate[fn]: 1211 if fn in prev or fstate[fn]:
1211 pos, neg = display(fn, rev, m, fstate[fn]) 1212 r = display(fn, rev, m, fstate[fn])
1212 count += pos + neg 1213 found = found or r
1213 if pos and not opts['all']: 1214 if r and not opts['all']:
1214 skip[fn] = True 1215 skip[fn] = True
1215 if copy: 1216 if copy:
1216 skip[copy] = True 1217 skip[copy] = True
1217 fstate[fn] = m 1218 fstate[fn] = m
1218 if copy: 1219 if copy:
1223 fstate.sort() 1224 fstate.sort()
1224 for fn, state in fstate: 1225 for fn, state in fstate:
1225 if fn in skip: 1226 if fn in skip:
1226 continue 1227 continue
1227 if fn not in copies.get(prev[fn], {}): 1228 if fn not in copies.get(prev[fn], {}):
1228 display(fn, rev, {}, state) 1229 found = display(fn, rev, {}, state) or found
1229 return (count == 0 and 1) or 0 1230 return (not found and 1) or 0
1230 1231
1231 def heads(ui, repo, **opts): 1232 def heads(ui, repo, **opts):
1232 """show current repository heads 1233 """show current repository heads
1233 1234
1234 Show all repository head changesets. 1235 Show all repository head changesets.