comparison mercurial/cmdutil.py @ 35683:ea3320015d54

log: remove dead code to follow descendants if ascending revisions specified It's been disabled since 8b4b9ee6001a "log: make -fr show complete history from the given revs" 2015-02-06, and we've got no bug report regarding this exact behavior. For details what the heck "followdescendants" is, please see the issue comment: https://bz.mercurial-scm.org/show_bug.cgi?id=4959#c72 "'rev(%d)' % startrev" can be replaced with '.' since revs are 'reversed(:.)'.
author Yuya Nishihara <yuya@tcha.org>
date Sun, 10 Dec 2017 18:22:06 +0900
parents 8273c1a47282
children 1c929b4942a3
comparison
equal deleted inserted replaced
35682:8273c1a47282 35683:ea3320015d54
2357 _opt2logrevset = { 2357 _opt2logrevset = {
2358 'no_merges': ('not merge()', None), 2358 'no_merges': ('not merge()', None),
2359 'only_merges': ('merge()', None), 2359 'only_merges': ('merge()', None),
2360 '_ancestors': ('ancestors(%r)', None), 2360 '_ancestors': ('ancestors(%r)', None),
2361 '_fancestors': ('_firstancestors(%r)', None), 2361 '_fancestors': ('_firstancestors(%r)', None),
2362 '_descendants': ('descendants(%r)', None),
2363 '_fdescendants': ('_firstdescendants(%r)', None),
2364 '_matchfiles': (None, '_matchfiles(%ps)'), 2362 '_matchfiles': (None, '_matchfiles(%ps)'),
2365 'date': ('date(%s)', None), 2363 'date': ('date(%s)', None),
2366 'branch': ('branch(%s)', '%lr'), 2364 'branch': ('branch(%s)', '%lr'),
2367 '_patslog': ('filelog(%s)', '%lr'), 2365 '_patslog': ('filelog(%s)', '%lr'),
2368 '_patsfollow': ('follow(%s)', '%lr'), 2366 '_patsfollow': ('follow(%s)', '%lr'),
2370 'keyword': ('keyword(%s)', '%lr'), 2368 'keyword': ('keyword(%s)', '%lr'),
2371 'prune': ('ancestors(%s)', 'not %lr'), 2369 'prune': ('ancestors(%s)', 'not %lr'),
2372 'user': ('user(%s)', '%lr'), 2370 'user': ('user(%s)', '%lr'),
2373 } 2371 }
2374 2372
2375 def _makelogrevset(repo, pats, opts, revs): 2373 def _makelogrevset(repo, pats, opts):
2376 """Return (expr, filematcher) where expr is a revset string built 2374 """Return (expr, filematcher) where expr is a revset string built
2377 from log options and file patterns or None. If --stat or --patch 2375 from log options and file patterns or None. If --stat or --patch
2378 are not passed filematcher is None. Otherwise it is a callable 2376 are not passed filematcher is None. Otherwise it is a callable
2379 taking a revision number and returning a match objects filtering 2377 taking a revision number and returning a match objects filtering
2380 the files to be detailed when displaying the revision. 2378 the files to be detailed when displaying the revision.
2384 follow = opts.get('follow') or opts.get('follow_first') 2382 follow = opts.get('follow') or opts.get('follow_first')
2385 if opts.get('follow_first'): 2383 if opts.get('follow_first'):
2386 followfirst = 1 2384 followfirst = 1
2387 else: 2385 else:
2388 followfirst = 0 2386 followfirst = 0
2389 # --follow with FILE behavior depends on revs...
2390 it = iter(revs)
2391 startrev = next(it)
2392 followdescendants = startrev < next(it, startrev)
2393 2387
2394 # branch and only_branch are really aliases and must be handled at 2388 # branch and only_branch are really aliases and must be handled at
2395 # the same time 2389 # the same time
2396 opts['branch'] = opts.get('branch', []) + opts.get('only_branch', []) 2390 opts['branch'] = opts.get('branch', []) + opts.get('only_branch', [])
2397 opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']] 2391 opts['branch'] = [repo.lookupbranch(b) for b in opts['branch']]
2432 break 2426 break
2433 else: 2427 else:
2434 slowpath = False 2428 slowpath = False
2435 2429
2436 fpats = ('_patsfollow', '_patsfollowfirst') 2430 fpats = ('_patsfollow', '_patsfollowfirst')
2437 fnopats = (('_ancestors', '_fancestors'), 2431 fnopats = ('_ancestors', '_fancestors')
2438 ('_descendants', '_fdescendants')) 2432
2439 if slowpath: 2433 if slowpath:
2440 # See walkchangerevs() slow path. 2434 # See walkchangerevs() slow path.
2441 # 2435 #
2442 # pats/include/exclude cannot be represented as separate 2436 # pats/include/exclude cannot be represented as separate
2443 # revset expressions as their filtering logic applies at file 2437 # revset expressions as their filtering logic applies at file
2452 matchargs.append('i:' + p) 2446 matchargs.append('i:' + p)
2453 for p in opts.get('exclude', []): 2447 for p in opts.get('exclude', []):
2454 matchargs.append('x:' + p) 2448 matchargs.append('x:' + p)
2455 opts['_matchfiles'] = matchargs 2449 opts['_matchfiles'] = matchargs
2456 if follow: 2450 if follow:
2457 opts[fnopats[0][followfirst]] = '.' 2451 opts[fnopats[followfirst]] = '.'
2458 else: 2452 else:
2459 if follow: 2453 if follow:
2460 if pats: 2454 if pats:
2461 # follow() revset interprets its file argument as a 2455 # follow() revset interprets its file argument as a
2462 # manifest entry, so use match.files(), not pats. 2456 # manifest entry, so use match.files(), not pats.
2463 opts[fpats[followfirst]] = list(match.files()) 2457 opts[fpats[followfirst]] = list(match.files())
2464 else: 2458 else:
2465 op = fnopats[followdescendants][followfirst] 2459 op = fnopats[followfirst]
2466 opts[op] = 'rev(%d)' % startrev 2460 opts[op] = '.'
2467 else: 2461 else:
2468 opts['_patslog'] = list(pats) 2462 opts['_patslog'] = list(pats)
2469 2463
2470 filematcher = None 2464 filematcher = None
2471 if opts.get('patch') or opts.get('stat'): 2465 if opts.get('patch') or opts.get('stat'):
2503 else: 2497 else:
2504 expr = None 2498 expr = None
2505 return expr, filematcher 2499 return expr, filematcher
2506 2500
2507 def _logrevs(repo, opts): 2501 def _logrevs(repo, opts):
2508 # Default --rev value depends on --follow but --follow behavior
2509 # depends on revisions resolved from --rev...
2510 follow = opts.get('follow') or opts.get('follow_first') 2502 follow = opts.get('follow') or opts.get('follow_first')
2511 if opts.get('rev'): 2503 if opts.get('rev'):
2512 revs = scmutil.revrange(repo, opts['rev']) 2504 revs = scmutil.revrange(repo, opts['rev'])
2513 elif follow and repo.dirstate.p1() == nullid: 2505 elif follow and repo.dirstate.p1() == nullid:
2514 revs = smartset.baseset() 2506 revs = smartset.baseset()
2528 """ 2520 """
2529 limit = loglimit(opts) 2521 limit = loglimit(opts)
2530 revs = _logrevs(repo, opts) 2522 revs = _logrevs(repo, opts)
2531 if not revs: 2523 if not revs:
2532 return smartset.baseset(), None 2524 return smartset.baseset(), None
2533 expr, filematcher = _makelogrevset(repo, pats, opts, revs) 2525 expr, filematcher = _makelogrevset(repo, pats, opts)
2534 if opts.get('graph') and opts.get('rev'): 2526 if opts.get('graph') and opts.get('rev'):
2535 # User-specified revs might be unsorted, but don't sort before 2527 # User-specified revs might be unsorted, but don't sort before
2536 # _makelogrevset because it might depend on the order of revs 2528 # _makelogrevset because it might depend on the order of revs
2537 if not (revs.isdescending() or revs.istopo()): 2529 if not (revs.isdescending() or revs.istopo()):
2538 revs.sort(reverse=True) 2530 revs.sort(reverse=True)