Patchwork D9341: log: add bookmark option to "hg log"

login
register
mail settings
Submitter phabricator
Date Nov. 18, 2020, 10:59 p.m.
Message ID <differential-rev-PHID-DREV-mkwez5usxv6qxfhsrvan-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47618/
State Superseded
Headers show

Comments

phabricator - Nov. 18, 2020, 10:59 p.m.
sebhtml created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Before pushing a bookmark with "hg push origin -B 'my-topic'", it is useful to inspect
  the list of commits that are ancestors of the bookmark.
  
  By relying on scmutil.bookmarkrevs(), "hg log -B topic" has the same bookmark semantics
  found in other commands like hg export, hg email, hg strip.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9341

AFFECTED FILES
  mercurial/commands.py
  mercurial/logcmdutil.py
  tests/test-completion.t
  tests/test-log-bookmark.t

CHANGE DETAILS




To: sebhtml, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-log-bookmark.t b/tests/test-log-bookmark.t
new file mode 100644
--- /dev/null
+++ b/tests/test-log-bookmark.t
@@ -0,0 +1,127 @@ 
+Test 'hg log' with a bookmark
+
+
+Create the repository
+
+  $ hg init Test-D8973
+  $ cd Test-D8973
+  $ echo "bar" > foo.txt
+  $ hg add foo.txt
+  $ hg commit -m "Add foo in 'default'"
+
+
+Add a bookmark for topic X
+
+  $ hg branch -f sebhtml
+  marked working directory as branch sebhtml
+  (branches are permanent and global, did you want a bookmark?)
+
+  $ hg bookmark sebhtml/99991-topic-X
+  $ hg up sebhtml/99991-topic-X
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ echo "X" > x.txt
+  $ hg add x.txt
+  $ hg commit -m "Add x.txt in 'sebhtml/99991-topic-X'"
+
+  $ hg log -B sebhtml/99991-topic-X
+  changeset:   1:29f39dea9bf9
+  branch:      sebhtml
+  bookmark:    sebhtml/99991-topic-X
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Add x.txt in 'sebhtml/99991-topic-X'
+  
+
+Add a bookmark for topic Y
+
+  $ hg update default
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (leaving bookmark sebhtml/99991-topic-X)
+
+  $ echo "Y" > y.txt
+  $ hg add y.txt
+  $ hg branch -f sebhtml
+  marked working directory as branch sebhtml
+  $ hg bookmark sebhtml/99992-topic-Y
+  $ hg up sebhtml/99992-topic-Y
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  $ hg commit -m "Add y.txt in 'sebhtml/99992-topic-Y'"
+  created new head
+
+  $ hg log -B sebhtml/99992-topic-Y
+  changeset:   2:11df7969cf8d
+  branch:      sebhtml
+  bookmark:    sebhtml/99992-topic-Y
+  tag:         tip
+  parent:      0:eaea25376a59
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Add y.txt in 'sebhtml/99992-topic-Y'
+  
+
+The log of topic Y does not interfere with the log of topic X
+
+  $ hg log -B sebhtml/99991-topic-X
+  changeset:   1:29f39dea9bf9
+  branch:      sebhtml
+  bookmark:    sebhtml/99991-topic-X
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Add x.txt in 'sebhtml/99991-topic-X'
+  
+
+Merge topics Y and X in the default branch
+
+  $ hg update default
+  0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+  (leaving bookmark sebhtml/99992-topic-Y)
+
+  $ hg bookmark
+     sebhtml/99991-topic-X     1:29f39dea9bf9
+     sebhtml/99992-topic-Y     2:11df7969cf8d
+
+  $ hg merge sebhtml/99992-topic-Y
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+
+  $ hg commit -m "Merge branch 'sebhtml/99992-topic-Y' into 'default'"
+
+  $ hg update default
+  0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+  $ hg merge sebhtml/99991-topic-X
+  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+  (branch merge, don't forget to commit)
+
+  $ hg commit -m "Merge branch 'sebhtml/99991-topic-X' into 'default'"
+
+
+Check the log of topic X, topic Y, and default branch
+
+  $ hg log -B sebhtml/99992-topic-Y
+
+  $ hg log -B sebhtml/99991-topic-X
+
+  $ hg log -b default
+  changeset:   4:c26ba8c1e1cb
+  tag:         tip
+  parent:      3:2189f3fb90d6
+  parent:      1:29f39dea9bf9
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Merge branch 'sebhtml/99991-topic-X' into 'default'
+  
+  changeset:   3:2189f3fb90d6
+  parent:      0:eaea25376a59
+  parent:      2:11df7969cf8d
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Merge branch 'sebhtml/99992-topic-Y' into 'default'
+  
+  changeset:   0:eaea25376a59
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     Add foo in 'default'
+  
diff --git a/tests/test-completion.t b/tests/test-completion.t
--- a/tests/test-completion.t
+++ b/tests/test-completion.t
@@ -344,7 +344,7 @@ 
   incoming: force, newest-first, bundle, rev, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
   init: ssh, remotecmd, insecure
   locate: rev, print0, fullpath, include, exclude
-  log: follow, follow-first, date, copies, keyword, rev, line-range, removed, only-merges, user, only-branch, branch, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude
+  log: follow, follow-first, date, copies, keyword, rev, line-range, removed, only-merges, user, only-branch, branch, bookmark, prune, patch, git, limit, no-merges, stat, graph, style, template, include, exclude
   manifest: rev, all, template
   merge: force, rev, preview, abort, tool
   outgoing: force, rev, newest-first, bookmarks, branch, patch, git, limit, no-merges, stat, graph, style, template, ssh, remotecmd, insecure, subrepos
diff --git a/mercurial/logcmdutil.py b/mercurial/logcmdutil.py
--- a/mercurial/logcmdutil.py
+++ b/mercurial/logcmdutil.py
@@ -1023,6 +1023,24 @@ 
     differ._makefilematcher = filematcher
     return revs, differ
 
+def get_bookmark_revs(repo, bookmark, walk_opts):
+    # type: (Any, bookmark, walk_opts) -> Tuple[smartset.abstractsmartset, Optional[changesetdiffer]]
+    """Return (revs, differ) where revs is a smartset
+
+    differ is a changesetdiffer with pre-configured file matcher.
+    """
+    revs, filematcher = makewalker(repo, walk_opts)
+    if not revs:
+        return revs, None
+    differ = changesetdiffer()
+    differ._makefilematcher = filematcher
+
+    if bookmark:
+        if bookmark not in repo._bookmarks:
+            raise error.Abort(_(b"bookmark '%s' not found") % bookmark)
+        revs = scmutil.bookmarkrevs(repo, bookmark)
+
+    return revs, differ
 
 def _parselinerangeopt(repo, opts):
     """Parse --line-range log option and return a list of tuples (filename,
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4456,6 +4456,12 @@ 
             _(b'BRANCH'),
         ),
         (
+            b'B',
+            b'bookmark',
+            [],
+            _(b"show changesets within the given bookmark"),
+            _(b'BOOKMARK')),
+        (
             b'P',
             b'prune',
             [],
@@ -4613,14 +4619,21 @@ 
         )
 
     repo = scmutil.unhidehashlikerevs(repo, opts.get(b'rev'), b'nowarn')
+    walk_opts = logcmdutil.parseopts(ui, pats, opts)
     revs, differ = logcmdutil.getrevs(
-        repo, logcmdutil.parseopts(ui, pats, opts)
+        repo, walk_opts
     )
     if linerange:
         # TODO: should follow file history from logcmdutil._initialrevs(),
         # then filter the result by logcmdutil._makerevset() and --limit
         revs, differ = logcmdutil.getlinerangerevs(repo, revs, opts)
 
+    if opts.get(b'bookmark'):
+        cmdutil.check_at_most_one_arg(opts, b'rev', b'bookmark')
+        bookmarks = opts.get(b'bookmark')
+        bookmark = bookmarks[0]
+        revs, differ = logcmdutil.get_bookmark_revs(repo, bookmark, walk_opts)
+
     getcopies = None
     if opts.get(b'copies'):
         endrev = None