From patchwork Wed Jun 21 20:45:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [7, of, 7, bm-refactor, V2] bookmarks: factor method _printer out of for loop in printbookmarks From: Sean Farley X-Patchwork-Id: 21599 Message-Id: <621573af9a0644d6165b.1498077914@1.0.0.127.in-addr.arpa> To: mercurial-devel@mercurial-scm.org Cc: sean@farley.io Date: Wed, 21 Jun 2017 13:45:14 -0700 # HG changeset patch # User Sean Farley # Date 1498004300 25200 # Tue Jun 20 17:18:20 2017 -0700 # Branch bm-refactor # Node ID 621573af9a0644d6165b5ae6c242d069a21b704a # Parent 6c3528df39f51c56c8bd671538fcf570c8171170 bookmarks: factor method _printer out of for loop in printbookmarks This allows even further customization via extensions for printing bookmarks. For example, in hg-git this would allow printing remote refs by just modifying the 'bmarks' parameter instead of reimplementing the old commands.bookmarks method. Furthermore, there is another benefit: now multiple extensions can chain their custom data to bookmark printing. Previously, an extension could have conflicting bookmark output due to which loaded first and overrode commands.bookmarks. Now they can all play nicely together. diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py index 518b362..797e3c1 100644 --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -765,32 +765,43 @@ def addbookmarks(repo, tr, names, rev=No activate(repo, newact) elif cur != tgt and newact == repo._activebookmark: deactivate(repo) marks.recordchange(tr) +def _printer(ui, repo, bmarks, **opts): + """private method to print bookmarks + + Provides a way for extensions to control how bookmarks are printed (e.g. + prepend or postpend names) + """ + fm = ui.formatter('bookmarks', opts) + hexfn = fm.hexfunc + if len(bmarks) == 0 and fm.isplain(): + ui.status(_("no bookmarks set\n")) + for bmark, (n, prefix, label) in sorted(bmarks.iteritems()): + fm.startitem() + if not ui.quiet: + fm.plain(' %s ' % prefix, label=label) + fm.write('bookmark', '%s', bmark, label=label) + pad = " " * (25 - encoding.colwidth(bmark)) + fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s', + repo.changelog.rev(n), hexfn(n), label=label) + fm.data(active=(activebookmarklabel in label)) + fm.plain('\n') + fm.end() + def printbookmarks(ui, repo, **opts): """print bookmarks to a formatter Provides a way for extensions to control how bookmarks are printed. """ - fm = ui.formatter('bookmarks', opts) - hexfn = fm.hexfunc marks = repo._bookmarks - if len(marks) == 0 and fm.isplain(): - ui.status(_("no bookmarks set\n")) + bmarks = {} for bmark, n in sorted(marks.iteritems()): active = repo._activebookmark if bmark == active: prefix, label = '*', activebookmarklabel else: prefix, label = ' ', '' - fm.startitem() - if not ui.quiet: - fm.plain(' %s ' % prefix, label=label) - fm.write('bookmark', '%s', bmark, label=label) - pad = " " * (25 - encoding.colwidth(bmark)) - fm.condwrite(not ui.quiet, 'rev node', pad + ' %d:%s', - repo.changelog.rev(n), hexfn(n), label=label) - fm.data(active=(bmark == active)) - fm.plain('\n') - fm.end() + bmarks[bmark] = (n, prefix, label) + _printer(ui, repo, bmarks, **opts)