githelp.py
1089 lines
| 29.5 KiB
| text/x-python
|
PythonLexer
/ hgext / githelp.py
Gregory Szorc
|
r35732 | # githelp.py - Try to map Git commands to Mercurial equivalents. | ||
# | ||||
# Copyright 2013 Facebook, Inc. | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
"""try mapping git commands to Mercurial commands | ||||
Tries to map a given git command to a Mercurial command: | ||||
$ hg githelp -- git checkout master | ||||
hg update master | ||||
If an unknown command or parameter combination is detected, an error is | ||||
produced. | ||||
""" | ||||
from __future__ import absolute_import | ||||
import getopt | ||||
import re | ||||
from mercurial.i18n import _ | ||||
from mercurial import ( | ||||
Gregory Szorc
|
r36248 | encoding, | ||
Gregory Szorc
|
r35732 | error, | ||
fancyopts, | ||||
registrar, | ||||
Martin von Zweigbergk
|
r37406 | scmutil, | ||
Yuya Nishihara
|
r37138 | ) | ||
from mercurial.utils import ( | ||||
procutil, | ||||
Gregory Szorc
|
r35732 | ) | ||
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for | ||||
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should | ||||
# be specifying the version(s) of Mercurial they are tested with, or | ||||
# leave the attribute unspecified. | ||||
testedwith = 'ships-with-hg-core' | ||||
cmdtable = {} | ||||
command = registrar.command(cmdtable) | ||||
def convert(s): | ||||
if s.startswith("origin/"): | ||||
return s[7:] | ||||
if 'HEAD' in s: | ||||
s = s.replace('HEAD', '.') | ||||
# HEAD~ in git is .~1 in mercurial | ||||
s = re.sub('~$', '~1', s) | ||||
return s | ||||
@command('^githelp|git', [ | ||||
], _('hg githelp')) | ||||
def githelp(ui, repo, *args, **kwargs): | ||||
'''suggests the Mercurial equivalent of the given git command | ||||
Usage: hg githelp -- <git command> | ||||
''' | ||||
if len(args) == 0 or (len(args) == 1 and args[0] =='git'): | ||||
raise error.Abort(_('missing git command - ' | ||||
'usage: hg githelp -- <git command>')) | ||||
if args[0] == 'git': | ||||
args = args[1:] | ||||
cmd = args[0] | ||||
if not cmd in gitcommands: | ||||
Matt Harbison
|
r38132 | raise error.Abort(_("error: unknown git command %s") % (cmd)) | ||
Gregory Szorc
|
r35732 | |||
ui.pager('githelp') | ||||
args = args[1:] | ||||
return gitcommands[cmd](ui, repo, *args, **kwargs) | ||||
def parseoptions(ui, cmdoptions, args): | ||||
cmdoptions = list(cmdoptions) | ||||
opts = {} | ||||
args = list(args) | ||||
while True: | ||||
try: | ||||
args = fancyopts.fancyopts(list(args), cmdoptions, opts, True) | ||||
break | ||||
except getopt.GetoptError as ex: | ||||
flag = None | ||||
if "requires argument" in ex.msg: | ||||
raise | ||||
if ('--' + ex.opt) in ex.msg: | ||||
flag = '--' + ex.opt | ||||
elif ('-' + ex.opt) in ex.msg: | ||||
flag = '-' + ex.opt | ||||
else: | ||||
Matt Harbison
|
r38132 | raise error.Abort(_("unknown option %s") % ex.opt) | ||
Gregory Szorc
|
r35732 | try: | ||
args.remove(flag) | ||||
except Exception: | ||||
Matt Harbison
|
r38160 | msg = _("unknown option '%s' packed with other options") | ||
hint = _("please try passing the option as its own flag: -%s") | ||||
raise error.Abort(msg % ex.opt, hint=hint % ex.opt) | ||||
Gregory Szorc
|
r35732 | |||
ui.warn(_("ignoring unknown option %s\n") % flag) | ||||
args = list([convert(x) for x in args]) | ||||
opts = dict([(k, convert(v)) if isinstance(v, str) else (k, v) | ||||
for k, v in opts.iteritems()]) | ||||
return args, opts | ||||
class Command(object): | ||||
def __init__(self, name): | ||||
self.name = name | ||||
self.args = [] | ||||
self.opts = {} | ||||
Gregory Szorc
|
r36248 | def __bytes__(self): | ||
Gregory Szorc
|
r35732 | cmd = "hg " + self.name | ||
if self.opts: | ||||
for k, values in sorted(self.opts.iteritems()): | ||||
for v in values: | ||||
if v: | ||||
cmd += " %s %s" % (k, v) | ||||
else: | ||||
cmd += " %s" % (k,) | ||||
if self.args: | ||||
cmd += " " | ||||
cmd += " ".join(self.args) | ||||
return cmd | ||||
Gregory Szorc
|
r36248 | __str__ = encoding.strmethod(__bytes__) | ||
Gregory Szorc
|
r35732 | def append(self, value): | ||
self.args.append(value) | ||||
def extend(self, values): | ||||
self.args.extend(values) | ||||
def __setitem__(self, key, value): | ||||
values = self.opts.setdefault(key, []) | ||||
values.append(value) | ||||
def __and__(self, other): | ||||
return AndCommand(self, other) | ||||
class AndCommand(object): | ||||
def __init__(self, left, right): | ||||
self.left = left | ||||
self.right = right | ||||
def __str__(self): | ||||
return "%s && %s" % (self.left, self.right) | ||||
def __and__(self, other): | ||||
return AndCommand(self, other) | ||||
def add(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('A', 'all', None, ''), | ||||
('p', 'patch', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if (opts.get('patch')): | ||||
Gregory Szorc
|
r35733 | ui.status(_("note: Mercurial will commit when complete, " | ||
"as there is no staging area in Mercurial\n\n")) | ||||
cmd = Command('commit --interactive') | ||||
Gregory Szorc
|
r35732 | else: | ||
cmd = Command("add") | ||||
if not opts.get('all'): | ||||
cmd.extend(args) | ||||
else: | ||||
ui.status(_("note: use hg addremove to remove files that have " | ||||
Matt Harbison
|
r38159 | "been deleted\n\n")) | ||
Gregory Szorc
|
r35732 | |||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def am(ui, repo, *args, **kwargs): | ||||
cmdoptions=[ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
Gregory Szorc
|
r35734 | cmd = Command('import') | ||
Gregory Szorc
|
r36248 | ui.status(bytes(cmd), "\n") | ||
Gregory Szorc
|
r35732 | |||
def apply(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('p', 'p', int, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('import --no-commit') | ||||
if (opts.get('p')): | ||||
cmd['-p'] = opts.get('p') | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def bisect(ui, repo, *args, **kwargs): | ||||
Matt Harbison
|
r38159 | ui.status(_("see 'hg help bisect' for how to use bisect\n\n")) | ||
Gregory Szorc
|
r35732 | |||
def blame(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
Gregory Szorc
|
r35735 | cmd = Command('annotate -udl') | ||
Gregory Szorc
|
r35732 | cmd.extend([convert(v) for v in args]) | ||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def branch(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'set-upstream', None, ''), | ||||
('', 'set-upstream-to', '', ''), | ||||
('d', 'delete', None, ''), | ||||
('D', 'delete', None, ''), | ||||
('m', 'move', None, ''), | ||||
('M', 'move', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command("bookmark") | ||||
if opts.get('set_upstream') or opts.get('set_upstream_to'): | ||||
ui.status(_("Mercurial has no concept of upstream branches\n")) | ||||
return | ||||
elif opts.get('delete'): | ||||
cmd = Command("strip") | ||||
for branch in args: | ||||
cmd['-B'] = branch | ||||
else: | ||||
cmd['-B'] = None | ||||
elif opts.get('move'): | ||||
if len(args) > 0: | ||||
if len(args) > 1: | ||||
old = args.pop(0) | ||||
else: | ||||
# shell command to output the active bookmark for the active | ||||
# revision | ||||
old = '`hg log -T"{activebookmark}" -r .`' | ||||
Matt Harbison
|
r38130 | else: | ||
raise error.Abort(_('missing newbranch argument')) | ||||
Gregory Szorc
|
r35732 | new = args[0] | ||
cmd['-m'] = old | ||||
cmd.append(new) | ||||
else: | ||||
if len(args) > 1: | ||||
cmd['-r'] = args[1] | ||||
cmd.append(args[0]) | ||||
elif len(args) == 1: | ||||
cmd.append(args[0]) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def ispath(repo, string): | ||||
""" | ||||
The first argument to git checkout can either be a revision or a path. Let's | ||||
generally assume it's a revision, unless it's obviously a path. There are | ||||
too many ways to spell revisions in git for us to reasonably catch all of | ||||
them, so let's be conservative. | ||||
""" | ||||
Martin von Zweigbergk
|
r37406 | if scmutil.isrevsymbol(repo, string): | ||
Gregory Szorc
|
r35732 | # if it's definitely a revision let's not even check if a file of the | ||
# same name exists. | ||||
return False | ||||
cwd = repo.getcwd() | ||||
if cwd == '': | ||||
repopath = string | ||||
else: | ||||
repopath = cwd + '/' + string | ||||
exists = repo.wvfs.exists(repopath) | ||||
if exists: | ||||
return True | ||||
manifest = repo['.'].manifest() | ||||
didexist = (repopath in manifest) or manifest.hasdir(repopath) | ||||
return didexist | ||||
def checkout(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('b', 'branch', '', ''), | ||||
('B', 'branch', '', ''), | ||||
('f', 'force', None, ''), | ||||
('p', 'patch', None, ''), | ||||
] | ||||
paths = [] | ||||
if '--' in args: | ||||
sepindex = args.index('--') | ||||
paths.extend(args[sepindex + 1:]) | ||||
args = args[:sepindex] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
rev = None | ||||
if args and ispath(repo, args[0]): | ||||
paths = args + paths | ||||
elif args: | ||||
rev = args[0] | ||||
paths = args[1:] + paths | ||||
cmd = Command('update') | ||||
if opts.get('force'): | ||||
if paths or rev: | ||||
cmd['-C'] = None | ||||
if opts.get('patch'): | ||||
cmd = Command('revert') | ||||
cmd['-i'] = None | ||||
if opts.get('branch'): | ||||
if len(args) == 0: | ||||
cmd = Command('bookmark') | ||||
cmd.append(opts.get('branch')) | ||||
else: | ||||
cmd.append(args[0]) | ||||
bookcmd = Command('bookmark') | ||||
bookcmd.append(opts.get('branch')) | ||||
cmd = cmd & bookcmd | ||||
# if there is any path argument supplied, use revert instead of update | ||||
elif len(paths) > 0: | ||||
ui.status(_("note: use --no-backup to avoid creating .orig files\n\n")) | ||||
cmd = Command('revert') | ||||
if opts.get('patch'): | ||||
cmd['-i'] = None | ||||
if rev: | ||||
cmd['-r'] = rev | ||||
cmd.extend(paths) | ||||
elif rev: | ||||
if opts.get('patch'): | ||||
cmd['-r'] = rev | ||||
else: | ||||
cmd.append(rev) | ||||
elif opts.get('force'): | ||||
cmd = Command('revert') | ||||
cmd['--all'] = None | ||||
else: | ||||
Matt Harbison
|
r38132 | raise error.Abort(_("a commit must be specified")) | ||
Gregory Szorc
|
r35732 | |||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def cherrypick(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'continue', None, ''), | ||||
('', 'abort', None, ''), | ||||
('e', 'edit', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('graft') | ||||
if opts.get('edit'): | ||||
cmd['--edit'] = None | ||||
if opts.get('continue'): | ||||
cmd['--continue'] = None | ||||
elif opts.get('abort'): | ||||
Matt Harbison
|
r38159 | ui.status(_("note: hg graft does not have --abort\n\n")) | ||
Gregory Szorc
|
r35732 | return | ||
else: | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def clean(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('d', 'd', None, ''), | ||||
('f', 'force', None, ''), | ||||
('x', 'x', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('purge') | ||||
if opts.get('x'): | ||||
cmd['--all'] = None | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def clone(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'bare', None, ''), | ||||
('n', 'no-checkout', None, ''), | ||||
('b', 'branch', '', ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if len(args) == 0: | ||||
Matt Harbison
|
r38132 | raise error.Abort(_("a repository to clone must be specified")) | ||
Gregory Szorc
|
r35732 | |||
cmd = Command('clone') | ||||
cmd.append(args[0]) | ||||
if len(args) > 1: | ||||
cmd.append(args[1]) | ||||
if opts.get('bare'): | ||||
cmd['-U'] = None | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial does not have bare clones. " | ||
"-U will clone the repo without checking out a commit\n\n")) | ||||
Gregory Szorc
|
r35732 | elif opts.get('no_checkout'): | ||
cmd['-U'] = None | ||||
if opts.get('branch'): | ||||
cocmd = Command("update") | ||||
cocmd.append(opts.get('branch')) | ||||
cmd = cmd & cocmd | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def commit(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('a', 'all', None, ''), | ||||
('m', 'message', '', ''), | ||||
('p', 'patch', None, ''), | ||||
('C', 'reuse-message', '', ''), | ||||
('F', 'file', '', ''), | ||||
('', 'author', '', ''), | ||||
('', 'date', '', ''), | ||||
('', 'amend', None, ''), | ||||
('', 'no-edit', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('commit') | ||||
if opts.get('patch'): | ||||
Gregory Szorc
|
r35736 | cmd = Command('commit --interactive') | ||
Gregory Szorc
|
r35732 | |||
if opts.get('amend'): | ||||
if opts.get('no_edit'): | ||||
cmd = Command('amend') | ||||
else: | ||||
cmd['--amend'] = None | ||||
if opts.get('reuse_message'): | ||||
cmd['-M'] = opts.get('reuse_message') | ||||
if opts.get('message'): | ||||
cmd['-m'] = "'%s'" % (opts.get('message'),) | ||||
if opts.get('all'): | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial doesn't have a staging area, " | ||
"so there is no --all. -A will add and remove files " | ||||
"for you though.\n\n")) | ||||
Gregory Szorc
|
r35732 | |||
if opts.get('file'): | ||||
cmd['-l'] = opts.get('file') | ||||
if opts.get('author'): | ||||
cmd['-u'] = opts.get('author') | ||||
if opts.get('date'): | ||||
cmd['-d'] = opts.get('date') | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def deprecated(ui, repo, *args, **kwargs): | ||||
Yuya Nishihara
|
r38143 | ui.warn(_('this command has been deprecated in the git project, ' | ||
Matt Harbison
|
r38159 | 'thus isn\'t supported by this tool\n\n')) | ||
Gregory Szorc
|
r35732 | |||
def diff(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('a', 'all', None, ''), | ||||
('', 'cached', None, ''), | ||||
('R', 'reverse', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('diff') | ||||
if opts.get('cached'): | ||||
Yuya Nishihara
|
r38143 | ui.status(_('note: Mercurial has no concept of a staging area, ' | ||
Matt Harbison
|
r38159 | 'so --cached does nothing\n\n')) | ||
Gregory Szorc
|
r35732 | |||
if opts.get('reverse'): | ||||
cmd['--reverse'] = None | ||||
for a in list(args): | ||||
args.remove(a) | ||||
try: | ||||
repo.revs(a) | ||||
cmd['-r'] = a | ||||
except Exception: | ||||
cmd.append(a) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def difftool(ui, repo, *args, **kwargs): | ||||
ui.status(_('Mercurial does not enable external difftool by default. You ' | ||||
'need to enable the extdiff extension in your .hgrc file by adding\n' | ||||
'extdiff =\n' | ||||
'to the [extensions] section and then running\n\n' | ||||
'hg extdiff -p <program>\n\n' | ||||
'See \'hg help extdiff\' and \'hg help -e extdiff\' for more ' | ||||
'information.\n')) | ||||
def fetch(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'all', None, ''), | ||||
('f', 'force', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('pull') | ||||
if len(args) > 0: | ||||
cmd.append(args[0]) | ||||
if len(args) > 1: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial doesn't have refspecs. " | ||
"-r can be used to specify which commits you want to " | ||||
"pull. -B can be used to specify which bookmark you " | ||||
"want to pull.\n\n")) | ||||
Gregory Szorc
|
r35732 | for v in args[1:]: | ||
if v in repo._bookmarks: | ||||
cmd['-B'] = v | ||||
else: | ||||
cmd['-r'] = v | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def grep(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('grep') | ||||
# For basic usage, git grep and hg grep are the same. They both have the | ||||
# pattern first, followed by paths. | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def init(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('init') | ||||
if len(args) > 0: | ||||
cmd.append(args[0]) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def log(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'follow', None, ''), | ||||
('', 'decorate', None, ''), | ||||
('n', 'number', '', ''), | ||||
('1', '1', None, ''), | ||||
('', 'pretty', '', ''), | ||||
('', 'format', '', ''), | ||||
('', 'oneline', None, ''), | ||||
('', 'stat', None, ''), | ||||
('', 'graph', None, ''), | ||||
('p', 'patch', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
Yuya Nishihara
|
r38143 | ui.status(_('note: -v prints the entire commit message like Git does. To ' | ||
'print just the first line, drop the -v.\n\n')) | ||||
ui.status(_("note: see hg help revset for information on how to filter " | ||||
Matt Harbison
|
r38159 | "log output\n\n")) | ||
Gregory Szorc
|
r35732 | |||
cmd = Command('log') | ||||
cmd['-v'] = None | ||||
if opts.get('number'): | ||||
cmd['-l'] = opts.get('number') | ||||
if opts.get('1'): | ||||
cmd['-l'] = '1' | ||||
if opts.get('stat'): | ||||
cmd['--stat'] = None | ||||
if opts.get('graph'): | ||||
cmd['-G'] = None | ||||
if opts.get('patch'): | ||||
cmd['-p'] = None | ||||
if opts.get('pretty') or opts.get('format') or opts.get('oneline'): | ||||
format = opts.get('format', '') | ||||
if 'format:' in format: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: --format format:??? equates to Mercurial's " | ||
"--template. See hg help templates for more info.\n\n")) | ||||
Gregory Szorc
|
r35732 | cmd['--template'] = '???' | ||
else: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: --pretty/format/oneline equate to Mercurial's " | ||
"--style or --template. See hg help templates for " | ||||
"more info.\n\n")) | ||||
Gregory Szorc
|
r35732 | cmd['--style'] = '???' | ||
if len(args) > 0: | ||||
if '..' in args[0]: | ||||
since, until = args[0].split('..') | ||||
cmd['-r'] = "'%s::%s'" % (since, until) | ||||
del args[0] | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def lsfiles(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('c', 'cached', None, ''), | ||||
('d', 'deleted', None, ''), | ||||
('m', 'modified', None, ''), | ||||
('o', 'others', None, ''), | ||||
('i', 'ignored', None, ''), | ||||
('s', 'stage', None, ''), | ||||
('z', '_zero', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if (opts.get('modified') or opts.get('deleted') | ||||
or opts.get('others') or opts.get('ignored')): | ||||
cmd = Command('status') | ||||
if opts.get('deleted'): | ||||
cmd['-d'] = None | ||||
if opts.get('modified'): | ||||
cmd['-m'] = None | ||||
if opts.get('others'): | ||||
cmd['-o'] = None | ||||
if opts.get('ignored'): | ||||
cmd['-i'] = None | ||||
else: | ||||
cmd = Command('files') | ||||
if opts.get('stage'): | ||||
ui.status(_("note: Mercurial doesn't have a staging area, ignoring " | ||||
"--stage\n")) | ||||
if opts.get('_zero'): | ||||
cmd['-0'] = None | ||||
cmd.append('.') | ||||
for include in args: | ||||
Yuya Nishihara
|
r37138 | cmd['-I'] = procutil.shellquote(include) | ||
Gregory Szorc
|
r35732 | |||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def merge(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('merge') | ||||
if len(args) > 0: | ||||
cmd.append(args[len(args) - 1]) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def mergebase(ui, repo, *args, **kwargs): | ||||
cmdoptions = [] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if len(args) != 2: | ||||
args = ['A', 'B'] | ||||
cmd = Command("log -T '{node}\\n' -r 'ancestor(%s,%s)'" | ||||
% (args[0], args[1])) | ||||
Matt Harbison
|
r38159 | ui.status(_('note: ancestors() is part of the revset language\n'), | ||
Matt Harbison
|
r38134 | _("(learn more about revsets with 'hg help revsets')\n\n")) | ||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def mergetool(ui, repo, *args, **kwargs): | ||||
cmdoptions = [] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command("resolve") | ||||
if len(args) == 0: | ||||
cmd['--all'] = None | ||||
cmd.extend(args) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def mv(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('f', 'force', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('mv') | ||||
cmd.extend(args) | ||||
if opts.get('force'): | ||||
cmd['-f'] = None | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def pull(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'all', None, ''), | ||||
('f', 'force', None, ''), | ||||
('r', 'rebase', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('pull') | ||||
cmd['--rebase'] = None | ||||
if len(args) > 0: | ||||
cmd.append(args[0]) | ||||
if len(args) > 1: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial doesn't have refspecs. " | ||
"-r can be used to specify which commits you want to " | ||||
"pull. -B can be used to specify which bookmark you " | ||||
"want to pull.\n\n")) | ||||
Gregory Szorc
|
r35732 | for v in args[1:]: | ||
if v in repo._bookmarks: | ||||
cmd['-B'] = v | ||||
else: | ||||
cmd['-r'] = v | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def push(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'all', None, ''), | ||||
('f', 'force', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('push') | ||||
if len(args) > 0: | ||||
cmd.append(args[0]) | ||||
if len(args) > 1: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial doesn't have refspecs. " | ||
"-r can be used to specify which commits you want " | ||||
"to push. -B can be used to specify which bookmark " | ||||
"you want to push.\n\n")) | ||||
Gregory Szorc
|
r35732 | for v in args[1:]: | ||
if v in repo._bookmarks: | ||||
cmd['-B'] = v | ||||
else: | ||||
cmd['-r'] = v | ||||
if opts.get('force'): | ||||
cmd['-f'] = None | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def rebase(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'all', None, ''), | ||||
('i', 'interactive', None, ''), | ||||
('', 'onto', '', ''), | ||||
('', 'abort', None, ''), | ||||
('', 'continue', None, ''), | ||||
('', 'skip', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if opts.get('interactive'): | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: hg histedit does not perform a rebase. " | ||
"It just edits history.\n\n")) | ||||
Gregory Szorc
|
r35732 | cmd = Command('histedit') | ||
if len(args) > 0: | ||||
ui.status(_("also note: 'hg histedit' will automatically detect" | ||||
Matt Harbison
|
r38159 | " your stack, so no second argument is necessary\n\n")) | ||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | return | ||
if opts.get('skip'): | ||||
cmd = Command('revert --all -r .') | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
cmd = Command('rebase') | ||||
if opts.get('continue') or opts.get('skip'): | ||||
cmd['--continue'] = None | ||||
if opts.get('abort'): | ||||
cmd['--abort'] = None | ||||
if opts.get('onto'): | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: if you're trying to lift a commit off one branch, " | ||
"try hg rebase -d <destination commit> -s <commit to be " | ||||
"lifted>\n\n")) | ||||
Gregory Szorc
|
r35732 | cmd['-d'] = convert(opts.get('onto')) | ||
if len(args) < 2: | ||||
Matt Harbison
|
r38134 | raise error.Abort(_("expected format: git rebase --onto X Y Z")) | ||
Gregory Szorc
|
r35732 | cmd['-s'] = "'::%s - ::%s'" % (convert(args[1]), convert(args[0])) | ||
else: | ||||
if len(args) == 1: | ||||
cmd['-d'] = convert(args[0]) | ||||
elif len(args) == 2: | ||||
cmd['-d'] = convert(args[0]) | ||||
cmd['-b'] = convert(args[1]) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def reflog(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'all', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('journal') | ||||
if opts.get('all'): | ||||
cmd['--all'] = None | ||||
if len(args) > 0: | ||||
cmd.append(args[0]) | ||||
Gregory Szorc
|
r36248 | ui.status(bytes(cmd), "\n\n") | ||
Gregory Szorc
|
r35732 | ui.status(_("note: in hg commits can be deleted from repo but we always" | ||
Matt Harbison
|
r38159 | " have backups\n")) | ||
Gregory Szorc
|
r35732 | |||
def reset(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'soft', None, ''), | ||||
('', 'hard', None, ''), | ||||
('', 'mixed', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
commit = convert(args[0] if len(args) > 0 else '.') | ||||
hard = opts.get('hard') | ||||
if opts.get('mixed'): | ||||
Matt Harbison
|
r38134 | ui.status(_('note: --mixed has no meaning since Mercurial has no ' | ||
Gregory Szorc
|
r35738 | 'staging area\n\n')) | ||
if opts.get('soft'): | ||||
Matt Harbison
|
r38134 | ui.status(_('note: --soft has no meaning since Mercurial has no ' | ||
Gregory Szorc
|
r35732 | 'staging area\n\n')) | ||
Gregory Szorc
|
r35738 | cmd = Command('update') | ||
Gregory Szorc
|
r35732 | if hard: | ||
cmd.append('--clean') | ||||
Gregory Szorc
|
r35738 | |||
Gregory Szorc
|
r35732 | cmd.append(commit) | ||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def revert(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if len(args) > 1: | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: hg backout doesn't support multiple commits at " | ||
Gregory Szorc
|
r35732 | "once\n\n")) | ||
cmd = Command('backout') | ||||
if args: | ||||
cmd.append(args[0]) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def revparse(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'show-cdup', None, ''), | ||||
('', 'show-toplevel', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if opts.get('show_cdup') or opts.get('show_toplevel'): | ||||
cmd = Command('root') | ||||
if opts.get('show_cdup'): | ||||
ui.status(_("note: hg root prints the root of the repository\n\n")) | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | else: | ||
ui.status(_("note: see hg help revset for how to refer to commits\n")) | ||||
def rm(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('f', 'force', None, ''), | ||||
('n', 'dry-run', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('rm') | ||||
cmd.extend(args) | ||||
if opts.get('force'): | ||||
cmd['-f'] = None | ||||
if opts.get('dry_run'): | ||||
cmd['-n'] = None | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def show(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'name-status', None, ''), | ||||
('', 'pretty', '', ''), | ||||
('U', 'unified', int, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if opts.get('name_status'): | ||||
if opts.get('pretty') == 'format:': | ||||
Gregory Szorc
|
r35739 | cmd = Command('status') | ||
cmd['--change'] = '.' | ||||
Gregory Szorc
|
r35732 | else: | ||
cmd = Command('log') | ||||
cmd.append('--style status') | ||||
Gregory Szorc
|
r35739 | cmd.append('-r .') | ||
Gregory Szorc
|
r35732 | elif len(args) > 0: | ||
if ispath(repo, args[0]): | ||||
Gregory Szorc
|
r35739 | cmd = Command('cat') | ||
else: | ||||
cmd = Command('export') | ||||
Gregory Szorc
|
r35732 | cmd.extend(args) | ||
if opts.get('unified'): | ||||
cmd.append('--config diff.unified=%d' % (opts['unified'],)) | ||||
elif opts.get('unified'): | ||||
Gregory Szorc
|
r35739 | cmd = Command('export') | ||
Gregory Szorc
|
r35732 | cmd.append('--config diff.unified=%d' % (opts['unified'],)) | ||
Gregory Szorc
|
r35739 | else: | ||
cmd = Command('export') | ||||
Gregory Szorc
|
r35732 | |||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def stash(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('shelve') | ||||
action = args[0] if len(args) > 0 else None | ||||
if action == 'list': | ||||
cmd['-l'] = None | ||||
elif action == 'drop': | ||||
cmd['-d'] = None | ||||
if len(args) > 1: | ||||
cmd.append(args[1]) | ||||
else: | ||||
cmd.append('<shelve name>') | ||||
elif action == 'pop' or action == 'apply': | ||||
cmd = Command('unshelve') | ||||
if len(args) > 1: | ||||
cmd.append(args[1]) | ||||
if action == 'apply': | ||||
cmd['--keep'] = None | ||||
elif (action == 'branch' or action == 'show' or action == 'clear' | ||||
or action == 'create'): | ||||
Yuya Nishihara
|
r38143 | ui.status(_("note: Mercurial doesn't have equivalents to the " | ||
Matt Harbison
|
r38159 | "git stash branch, show, clear, or create actions\n\n")) | ||
Gregory Szorc
|
r35732 | return | ||
else: | ||||
if len(args) > 0: | ||||
if args[0] != 'save': | ||||
cmd['--name'] = args[0] | ||||
elif len(args) > 1: | ||||
cmd['--name'] = args[1] | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def status(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('', 'ignored', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('status') | ||||
cmd.extend(args) | ||||
if opts.get('ignored'): | ||||
cmd['-i'] = None | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def svn(ui, repo, *args, **kwargs): | ||||
Matt Harbison
|
r38130 | if not args: | ||
raise error.Abort(_('missing svn command')) | ||||
Gregory Szorc
|
r35732 | svncmd = args[0] | ||
Matt Harbison
|
r38133 | if svncmd not in gitsvncommands: | ||
Matt Harbison
|
r38131 | raise error.Abort(_('unknown git svn command "%s"') % (svncmd)) | ||
Gregory Szorc
|
r35732 | |||
args = args[1:] | ||||
return gitsvncommands[svncmd](ui, repo, *args, **kwargs) | ||||
def svndcommit(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('push') | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def svnfetch(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
cmd = Command('pull') | ||||
cmd.append('default-push') | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def svnfindrev(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
Matt Harbison
|
r38130 | if not args: | ||
raise error.Abort(_('missing find-rev argument')) | ||||
Gregory Szorc
|
r35732 | cmd = Command('log') | ||
cmd['-r'] = args[0] | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def svnrebase(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('l', 'local', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
pullcmd = Command('pull') | ||||
pullcmd.append('default-push') | ||||
rebasecmd = Command('rebase') | ||||
rebasecmd.append('tip') | ||||
cmd = pullcmd & rebasecmd | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
def tag(ui, repo, *args, **kwargs): | ||||
cmdoptions = [ | ||||
('f', 'force', None, ''), | ||||
('l', 'list', None, ''), | ||||
('d', 'delete', None, ''), | ||||
] | ||||
args, opts = parseoptions(ui, cmdoptions, args) | ||||
if opts.get('list'): | ||||
cmd = Command('tags') | ||||
else: | ||||
cmd = Command('tag') | ||||
Matt Harbison
|
r38130 | |||
if not args: | ||||
raise error.Abort(_('missing tag argument')) | ||||
Gregory Szorc
|
r35732 | cmd.append(args[0]) | ||
if len(args) > 1: | ||||
cmd['-r'] = args[1] | ||||
if opts.get('delete'): | ||||
cmd['--remove'] = None | ||||
if opts.get('force'): | ||||
cmd['-f'] = None | ||||
Gregory Szorc
|
r36248 | ui.status((bytes(cmd)), "\n") | ||
Gregory Szorc
|
r35732 | |||
gitcommands = { | ||||
'add': add, | ||||
'am': am, | ||||
'apply': apply, | ||||
'bisect': bisect, | ||||
'blame': blame, | ||||
'branch': branch, | ||||
'checkout': checkout, | ||||
'cherry-pick': cherrypick, | ||||
'clean': clean, | ||||
'clone': clone, | ||||
'commit': commit, | ||||
'diff': diff, | ||||
'difftool': difftool, | ||||
'fetch': fetch, | ||||
'grep': grep, | ||||
'init': init, | ||||
'log': log, | ||||
'ls-files': lsfiles, | ||||
'merge': merge, | ||||
'merge-base': mergebase, | ||||
'mergetool': mergetool, | ||||
'mv': mv, | ||||
'pull': pull, | ||||
'push': push, | ||||
'rebase': rebase, | ||||
'reflog': reflog, | ||||
'reset': reset, | ||||
'revert': revert, | ||||
'rev-parse': revparse, | ||||
'rm': rm, | ||||
'show': show, | ||||
'stash': stash, | ||||
'status': status, | ||||
'svn': svn, | ||||
'tag': tag, | ||||
'whatchanged': deprecated, | ||||
} | ||||
gitsvncommands = { | ||||
'dcommit': svndcommit, | ||||
'fetch': svnfetch, | ||||
'find-rev': svnfindrev, | ||||
'rebase': svnrebase, | ||||
} | ||||