bookflow.py
126 lines
| 3.7 KiB
| text/x-python
|
PythonLexer
/ hgext / bookflow.py
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 __future__ import absolute_import | ||||
from mercurial.i18n import _ | ||||
from mercurial import ( | ||||
bookmarks, | ||||
commands, | ||||
error, | ||||
extensions, | ||||
registrar, | ||||
) | ||||
Augie Fackler
|
r43347 | MY_NAME = b'bookflow' | ||
r40869 | ||||
configtable = {} | ||||
configitem = registrar.configitem(configtable) | ||||
Augie Fackler
|
r43347 | configitem(MY_NAME, b'protect', [b'@']) | ||
configitem(MY_NAME, b'require-bookmark', True) | ||||
configitem(MY_NAME, b'enable-branches', False) | ||||
r40869 | ||||
cmdtable = {} | ||||
command = registrar.command(cmdtable) | ||||
Augie Fackler
|
r43346 | |||
r40869 | def commit_hook(ui, repo, **kwargs): | |||
active = repo._bookmarks.active | ||||
if active: | ||||
Augie Fackler
|
r43347 | if active in ui.configlist(MY_NAME, b'protect'): | ||
r40869 | raise error.Abort( | |||
Augie Fackler
|
r43347 | _(b'cannot commit, bookmark %s is protected') % active | ||
Augie Fackler
|
r43346 | ) | ||
r40869 | if not cwd_at_bookmark(repo, active): | |||
raise error.Abort( | ||||
Augie Fackler
|
r43346 | _( | ||
Augie Fackler
|
r43347 | b'cannot commit, working directory out of sync with active bookmark' | ||
Augie Fackler
|
r43346 | ), | ||
Augie Fackler
|
r43347 | hint=_(b"run 'hg up %s'") % active, | ||
Augie Fackler
|
r43346 | ) | ||
Augie Fackler
|
r43347 | elif ui.configbool(MY_NAME, b'require-bookmark', True): | ||
raise error.Abort(_(b'cannot commit without an active bookmark')) | ||||
r40869 | return 0 | |||
Augie Fackler
|
r43346 | |||
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
|
r43346 | |||
r40869 | def bookmarks_addbookmarks( | |||
Augie Fackler
|
r43346 | orig, repo, tr, names, rev=None, force=False, inactive=False | ||
): | ||||
r40869 | if not rev: | |||
marks = repo._bookmarks | ||||
for name in names: | ||||
if name in marks: | ||||
Augie Fackler
|
r43346 | raise error.Abort( | ||
_( | ||||
Augie Fackler
|
r43347 | b"bookmark %s already exists, to move use the --rev option" | ||
Augie Fackler
|
r43346 | ) | ||
% name | ||||
) | ||||
r40869 | return orig(repo, tr, names, rev, force, inactive) | |||
Augie Fackler
|
r43346 | |||
r40869 | def commands_commit(orig, ui, repo, *args, **opts): | |||
commit_hook(ui, repo) | ||||
return orig(ui, repo, *args, **opts) | ||||
Augie Fackler
|
r43346 | |||
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
|
r43346 | ui.warn( | ||
_( | ||||
Augie Fackler
|
r43347 | b"working directory out of sync with active bookmark, run " | ||
b"'hg up %s'" | ||||
Augie Fackler
|
r43346 | ) | ||
% active | ||||
) | ||||
r40869 | return rc | |||
Augie Fackler
|
r43346 | |||
r40869 | def commands_branch(orig, ui, repo, label=None, **opts): | |||
if label and not opts.get(r'clean') and not opts.get(r'rev'): | ||||
raise error.Abort( | ||||
Augie Fackler
|
r43346 | _( | ||
Augie Fackler
|
r43347 | b"creating named branches is disabled and you should use bookmarks" | ||
Augie Fackler
|
r43346 | ), | ||
Augie Fackler
|
r43347 | hint=b"see 'hg help bookflow'", | ||
Augie Fackler
|
r43346 | ) | ||
r40869 | return orig(ui, repo, label, **opts) | |||
Augie Fackler
|
r43346 | |||
r40869 | def cwd_at_bookmark(repo, mark): | |||
mark_id = repo._bookmarks[mark] | ||||
Augie Fackler
|
r43347 | cur_id = repo.lookup(b'.') | ||
r40869 | return cur_id == mark_id | |||
Augie Fackler
|
r43346 | |||
r40869 | def uisetup(ui): | |||
Augie Fackler
|
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) | ||||