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) |
693 # miscellaneous queries to filter revisions (see "hg help log" for details) |
|
694 bookmarks = attr.ib(default=attr.Factory(list)) # type: List[bytes] |
694 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes] |
695 branches = attr.ib(default=attr.Factory(list)) # type: List[bytes] |
695 date = attr.ib(default=None) # type: Optional[bytes] |
696 date = attr.ib(default=None) # type: Optional[bytes] |
696 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes] |
697 keywords = attr.ib(default=attr.Factory(list)) # type: List[bytes] |
697 no_merges = attr.ib(default=False) # type: bool |
698 no_merges = attr.ib(default=False) # type: bool |
698 only_merges = attr.ib(default=False) # type: bool |
699 only_merges = attr.ib(default=False) # type: bool |
744 |
745 |
745 return walkopts( |
746 return walkopts( |
746 pats=pats, |
747 pats=pats, |
747 opts=opts, |
748 opts=opts, |
748 revspec=opts.get(b'rev', []), |
749 revspec=opts.get(b'rev', []), |
|
750 bookmarks=opts.get(b'bookmark', []), |
749 # branch and only_branch are really aliases and must be handled at |
751 # branch and only_branch are really aliases and must be handled at |
750 # the same time |
752 # the same time |
751 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []), |
753 branches=opts.get(b'branch', []) + opts.get(b'only_branch', []), |
752 date=opts.get(b'date'), |
754 date=opts.get(b'date'), |
753 keywords=opts.get(b'keyword', []), |
755 keywords=opts.get(b'keyword', []), |
935 else: |
937 else: |
936 if revop: |
938 if revop: |
937 val = [revsetlang.formatspec(revop, v) for v in val] |
939 val = [revsetlang.formatspec(revop, v) for v in val] |
938 expr.append(revsetlang.formatspec(listop, val)) |
940 expr.append(revsetlang.formatspec(listop, val)) |
939 |
941 |
|
942 if wopts.bookmarks: |
|
943 expr.append( |
|
944 revsetlang.formatspec( |
|
945 b'%lr', |
|
946 [scmutil.format_bookmark_revspec(v) for v in wopts.bookmarks], |
|
947 ) |
|
948 ) |
|
949 |
940 if expr: |
950 if expr: |
941 expr = b'(' + b' and '.join(expr) + b')' |
951 expr = b'(' + b' and '.join(expr) + b')' |
942 else: |
952 else: |
943 expr = None |
953 expr = None |
944 return expr |
954 return expr |
1018 revs, filematcher = makewalker(repo, wopts) |
1028 revs, filematcher = makewalker(repo, wopts) |
1019 if not revs: |
1029 if not revs: |
1020 return revs, None |
1030 return revs, None |
1021 differ = changesetdiffer() |
1031 differ = changesetdiffer() |
1022 differ._makefilematcher = filematcher |
1032 differ._makefilematcher = filematcher |
1023 return revs, differ |
|
1024 |
|
1025 |
|
1026 def get_bookmark_revs(repo, bookmark, walk_opts): |
|
1027 # type: (Any, bookmark, walk_opts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]] |
|
1028 """Return (revs, differ) where revs is a smartset |
|
1029 |
|
1030 differ is a changesetdiffer with pre-configured file matcher. |
|
1031 """ |
|
1032 revs, filematcher = makewalker(repo, walk_opts) |
|
1033 if not revs: |
|
1034 return revs, None |
|
1035 differ = changesetdiffer() |
|
1036 differ._makefilematcher = filematcher |
|
1037 |
|
1038 if bookmark: |
|
1039 if bookmark not in repo._bookmarks: |
|
1040 raise error.Abort(_(b"bookmark '%s' not found") % bookmark) |
|
1041 revs = scmutil.bookmarkrevs(repo, bookmark) |
|
1042 |
|
1043 return revs, differ |
1033 return revs, differ |
1044 |
1034 |
1045 |
1035 |
1046 def _parselinerangeopt(repo, opts): |
1036 def _parselinerangeopt(repo, opts): |
1047 """Parse --line-range log option and return a list of tuples (filename, |
1037 """Parse --line-range log option and return a list of tuples (filename, |