Mercurial > hg
comparison mercurial/logcmdutil.py @ 45626:8fe09005ed88
log: move miscellaneous filter/matcher options to walkopts
Maybe this is the most uninteresting patch. I want to remove the dependency
on untyped/unlabeled opts dict at all.
I thought --no-merges and --only-merges could be merged into a single enum
value, but actually they both can be set to filter out everything.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 12 Sep 2020 22:03:53 +0900 |
parents | c11099cc1de4 |
children | 224c786f4fce |
comparison
equal
deleted
inserted
replaced
45625:c11099cc1de4 | 45626:8fe09005ed88 |
---|---|
688 | 688 |
689 # a list of revset expressions to be traversed; if follow, it specifies | 689 # a list of revset expressions to be traversed; if follow, it specifies |
690 # the start revisions | 690 # the start revisions |
691 revspec = attr.ib() # type: List[bytes] | 691 revspec = attr.ib() # type: List[bytes] |
692 | 692 |
693 # miscellaneous queries to filter revisions (see "hg help log" for details) | |
694 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
695 date = attr.ib(default=None) # type: Optional[bytes] | |
696 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
697 no_merges = attr.ib(default=False) # type: bool | |
698 only_merges = attr.ib(default=False) # type: bool | |
699 prune_ancestors = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
700 users = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
701 | |
702 # miscellaneous matcher arguments | |
703 include_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
704 exclude_pats = attr.ib(default=attr.Factory(list)) # type: List[bytes] | |
705 | |
693 # 0: no follow, 1: follow first, 2: follow both parents | 706 # 0: no follow, 1: follow first, 2: follow both parents |
694 follow = attr.ib(default=0) # type: int | 707 follow = attr.ib(default=0) # type: int |
695 | 708 |
696 # do not attempt filelog-based traversal, which may be fast but cannot | 709 # do not attempt filelog-based traversal, which may be fast but cannot |
697 # include revisions where files were removed | 710 # include revisions where files were removed |
716 | 729 |
717 return walkopts( | 730 return walkopts( |
718 pats=pats, | 731 pats=pats, |
719 opts=opts, | 732 opts=opts, |
720 revspec=opts.get(b'rev', []), | 733 revspec=opts.get(b'rev', []), |
734 # branch and only_branch are really aliases and must be handled at | |
735 # the same time | |
736 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []), | |
737 date=opts.get(b'date'), | |
738 keywords=opts.get(b'keyword', []), | |
739 no_merges=bool(opts.get(b'no_merges')), | |
740 only_merges=bool(opts.get(b'only_merges')), | |
741 prune_ancestors=opts.get(b'prune', []), | |
742 users=opts.get(b'user', []), | |
743 include_pats=opts.get(b'include', []), | |
744 exclude_pats=opts.get(b'exclude', []), | |
721 follow=follow, | 745 follow=follow, |
722 force_changelog_traversal=bool(opts.get(b'removed')), | 746 force_changelog_traversal=bool(opts.get(b'removed')), |
723 limit=getlimit(opts), | 747 limit=getlimit(opts), |
724 ) | 748 ) |
725 | 749 |
853 } | 877 } |
854 | 878 |
855 | 879 |
856 def _makerevset(repo, wopts, slowpath): | 880 def _makerevset(repo, wopts, slowpath): |
857 """Return a revset string built from log options and file patterns""" | 881 """Return a revset string built from log options and file patterns""" |
858 opts = dict(wopts.opts) | 882 opts = { |
859 | 883 b'branch': [repo.lookupbranch(b) for b in wopts.branches], |
860 # branch and only_branch are really aliases and must be handled at | 884 b'date': wopts.date, |
861 # the same time | 885 b'keyword': wopts.keywords, |
862 opts[b'branch'] = opts.get(b'branch', []) + opts.get(b'only_branch', []) | 886 b'no_merges': wopts.no_merges, |
863 opts[b'branch'] = [repo.lookupbranch(b) for b in opts[b'branch']] | 887 b'only_merges': wopts.only_merges, |
888 b'prune': wopts.prune_ancestors, | |
889 b'user': wopts.users, | |
890 } | |
864 | 891 |
865 if slowpath: | 892 if slowpath: |
866 # See walkchangerevs() slow path. | 893 # See walkchangerevs() slow path. |
867 # | 894 # |
868 # pats/include/exclude cannot be represented as separate | 895 # pats/include/exclude cannot be represented as separate |
872 # not. Besides, filesets are evaluated against the working | 899 # not. Besides, filesets are evaluated against the working |
873 # directory. | 900 # directory. |
874 matchargs = [b'r:', b'd:relpath'] | 901 matchargs = [b'r:', b'd:relpath'] |
875 for p in wopts.pats: | 902 for p in wopts.pats: |
876 matchargs.append(b'p:' + p) | 903 matchargs.append(b'p:' + p) |
877 for p in opts.get(b'include', []): | 904 for p in wopts.include_pats: |
878 matchargs.append(b'i:' + p) | 905 matchargs.append(b'i:' + p) |
879 for p in opts.get(b'exclude', []): | 906 for p in wopts.exclude_pats: |
880 matchargs.append(b'x:' + p) | 907 matchargs.append(b'x:' + p) |
881 opts[b'_matchfiles'] = matchargs | 908 opts[b'_matchfiles'] = matchargs |
882 elif not wopts.follow: | 909 elif not wopts.follow: |
883 opts[b'_patslog'] = list(wopts.pats) | 910 opts[b'_patslog'] = list(wopts.pats) |
884 | 911 |
885 expr = [] | 912 expr = [] |
886 for op, val in sorted(pycompat.iteritems(opts)): | 913 for op, val in sorted(pycompat.iteritems(opts)): |
887 if not val: | 914 if not val: |
888 continue | |
889 if op not in _opt2logrevset: | |
890 continue | 915 continue |
891 revop, listop = _opt2logrevset[op] | 916 revop, listop = _opt2logrevset[op] |
892 if revop and b'%' not in revop: | 917 if revop and b'%' not in revop: |
893 expr.append(revop) | 918 expr.append(revop) |
894 elif not listop: | 919 elif not listop: |