##// END OF EJS Templates
heptapod-ci: turn off pipelines for merge request events...
heptapod-ci: turn off pipelines for merge request events These are always duplicated by the external (from the user) push, or internal (from Heptapod itself) push pipeline, so they're entirely redundant.

File last commit:

r49730:6000f5b2 default
r51634:929655c0 stable
Show More
bookflow.py
125 lines | 3.7 KiB | text/x-python | PythonLexer
bookflow: new extension for bookmark-based branching...
r40869 """implements bookmark-based branching (EXPERIMENTAL)
- Disables creation of new branches (config: enable_branches=False).
- Requires an active bookmark on commit (config: require_bookmark=True).
- Doesn't move the active bookmark on update, only on commit.
- Requires '--rev' for moving an existing bookmark.
- Protects special bookmarks (config: protect=@).
flow related commands
:hg book NAME: create a new bookmark
:hg book NAME -r REV: move bookmark to revision (fast-forward)
:hg up|co NAME: switch to bookmark
:hg push -B .: push active bookmark
"""
from mercurial.i18n import _
from mercurial import (
bookmarks,
commands,
error,
extensions,
registrar,
)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 MY_NAME = b'bookflow'
bookflow: new extension for bookmark-based branching...
r40869
configtable = {}
configitem = registrar.configitem(configtable)
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 configitem(MY_NAME, b'protect', [b'@'])
configitem(MY_NAME, b'require-bookmark', True)
configitem(MY_NAME, b'enable-branches', False)
bookflow: new extension for bookmark-based branching...
r40869
cmdtable = {}
command = registrar.command(cmdtable)
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def commit_hook(ui, repo, **kwargs):
active = repo._bookmarks.active
if active:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 if active in ui.configlist(MY_NAME, b'protect'):
bookflow: new extension for bookmark-based branching...
r40869 raise error.Abort(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 _(b'cannot commit, bookmark %s is protected') % active
Augie Fackler
formatting: blacken the codebase...
r43346 )
bookflow: new extension for bookmark-based branching...
r40869 if not cwd_at_bookmark(repo, active):
raise error.Abort(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b'cannot commit, working directory out of sync with active bookmark'
Augie Fackler
formatting: blacken the codebase...
r43346 ),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hint=_(b"run 'hg up %s'") % active,
Augie Fackler
formatting: blacken the codebase...
r43346 )
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 elif ui.configbool(MY_NAME, b'require-bookmark', True):
raise error.Abort(_(b'cannot commit without an active bookmark'))
bookflow: new extension for bookmark-based branching...
r40869 return 0
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def bookmarks_update(orig, repo, parents, node):
if len(parents) == 2:
# called during commit
return orig(repo, parents, node)
else:
# called during update
return False
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def bookmarks_addbookmarks(
Augie Fackler
formatting: blacken the codebase...
r43346 orig, repo, tr, names, rev=None, force=False, inactive=False
):
bookflow: new extension for bookmark-based branching...
r40869 if not rev:
marks = repo._bookmarks
for name in names:
if name in marks:
Augie Fackler
formatting: blacken the codebase...
r43346 raise error.Abort(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"bookmark %s already exists, to move use the --rev option"
Augie Fackler
formatting: blacken the codebase...
r43346 )
% name
)
bookflow: new extension for bookmark-based branching...
r40869 return orig(repo, tr, names, rev, force, inactive)
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def commands_commit(orig, ui, repo, *args, **opts):
commit_hook(ui, repo)
return orig(ui, repo, *args, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def commands_pull(orig, ui, repo, *args, **opts):
rc = orig(ui, repo, *args, **opts)
active = repo._bookmarks.active
if active and not cwd_at_bookmark(repo, active):
Augie Fackler
formatting: blacken the codebase...
r43346 ui.warn(
_(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"working directory out of sync with active bookmark, run "
b"'hg up %s'"
Augie Fackler
formatting: blacken the codebase...
r43346 )
% active
)
bookflow: new extension for bookmark-based branching...
r40869 return rc
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def commands_branch(orig, ui, repo, label=None, **opts):
Augie Fackler
cleanup: remove pointless r-prefixes on single-quoted strings...
r43906 if label and not opts.get('clean') and not opts.get('rev'):
bookflow: new extension for bookmark-based branching...
r40869 raise error.Abort(
Augie Fackler
formatting: blacken the codebase...
r43346 _(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"creating named branches is disabled and you should use bookmarks"
Augie Fackler
formatting: blacken the codebase...
r43346 ),
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 hint=b"see 'hg help bookflow'",
Augie Fackler
formatting: blacken the codebase...
r43346 )
bookflow: new extension for bookmark-based branching...
r40869 return orig(ui, repo, label, **opts)
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def cwd_at_bookmark(repo, mark):
mark_id = repo._bookmarks[mark]
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 cur_id = repo.lookup(b'.')
bookflow: new extension for bookmark-based branching...
r40869 return cur_id == mark_id
Augie Fackler
formatting: blacken the codebase...
r43346
bookflow: new extension for bookmark-based branching...
r40869 def uisetup(ui):
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 extensions.wrapfunction(bookmarks, b'update', bookmarks_update)
extensions.wrapfunction(bookmarks, b'addbookmarks', bookmarks_addbookmarks)
extensions.wrapcommand(commands.table, b'commit', commands_commit)
extensions.wrapcommand(commands.table, b'pull', commands_pull)
if not ui.configbool(MY_NAME, b'enable-branches'):
extensions.wrapcommand(commands.table, b'branch', commands_branch)