2016-08-04 21 views
0

Mercurial拡張機能でエラーを処理するために推奨される方法は何ですか?私たちはオンラインでこの側面のドキュメントを見つけることができませんでした。Mercurial拡張機能でエラーを処理する方法

次の例では、Hello worldと表示され、errorlevel1がWindowsシェルに設定されます。

@command('print-parents', [('','', None, '')], '') 
def printparents(ui, repo, node, **opts): 
    print "Hello world" 
    return True 

なぜ1からerrorlevelセットですか?我々はそれが0であると予想した。このコンテキストでPythonまたはMercurialはどのようにTrueFalseを扱いますか? Falseを返すように変更すると、errorlevel0が生成されます。

raise error.Abort(..)の例をいくつか見てきましたが、これは非常に冗長なコールスタックを出力しますが、これは必要ではありません。簡単なテキストメッセージと正しいerrorlevelが必要です。

if something_is_wrong: 
    ui.warn(_('Something is wrong, please correct this')) 
    return 1 

しかし:終了コードを設定する整数値を返し、その後、エラーメッセージを表示するui.warn()を使用し、@command関数の窓7とのMercurial 3.4.1

+0

なぜコマンドが「True」を返すのですか? '@ command'の戻り値は終了コードとして解釈され、Pythonでは' True == 1'と解釈されます。 –

答えて

0

を使用

raise mercurial.error.Abort()を使用すると、ui.tracebackTrue(デフォルトはFalse)に設定されていない限り、トレースバックは発生しません。 Abort()を上げると、通常(255終了コードになり)ui.warn('abort: ' + msg_from_exception)return -1コンボになり:私は明示的にトレースバックを有効にする必要がありました

$ cat demo.py 
from mercurial import cmdutil, error 

cmdtable = {} 
command = cmdutil.command(cmdtable) 

@command('demo1', [], '') 
def demo1(ui, repo, *args, **opts): 
    ui.warn('Error message written directly to ui.warn') 
    return 1 

@command('demo2', [], '') 
def demo2(ui, repo, *args, **opts): 
    raise error.Abort('Error message raised with Abort') 

$ hg --config extensions.demo=`pwd`/demo.py demo1 
Error message written directly to ui.warn 
$ echo $? 
1 
$ hg --config extensions.demo=`pwd`/demo.py demo2 
abort: Error message raised with Abort 
$? 
255 
$ hg --config extensions.demo=`pwd`/demo.py --config ui.traceback=true demo2 
Traceback (most recent call last): 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 204, in _runcatch 
    return _dispatch(req) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 880, in _dispatch 
    cmdpats, cmdoptions) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure 
    return func(*(args + a), **kw) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/fastmanifest/cachemanager.py", line 318, in runcommandtrigger 
    result = orig(*args, **kwargs) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure 
    return func(*(args + a), **kw) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/fastmanifest/__init__.py", line 174, in _logonexit 
    r = orig(ui, repo, cmd, fullargs, *args) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure 
    return func(*(args + a), **kw) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/journal.py", line 79, in runcommand 
    return orig(lui, repo, cmd, fullargs, *args) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 637, in runcommand 
    ret = _runcommand(ui, options, cmd, d) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure 
    return func(*(args + a), **kw) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/pager.py", line 160, in pagecmd 
    return orig(ui, options, cmd, cmdfunc) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/extensions.py", line 210, in closure 
    return func(*(args + a), **kw) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/hgext/color.py", line 503, in colorcmd 
    return orig(ui_, opts, cmd, cmdfunc) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 1010, in _runcommand 
    return checkargs() 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 971, in checkargs 
    return cmdfunc() 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/dispatch.py", line 877, in <lambda> 
    d = lambda: util.checksignature(func)(ui, *args, **cmdoptions) 
    File "/opt/facebook/hg/lib/python2.7/site-packages/mercurial/util.py", line 1036, in check 
    return func(*args, **kwargs) 
    File "/tmp/demo/demo.py", line 13, in demo2 
    raise error.Abort('Error message raised with Abort') 
Abort: Error message raised with Abort 
abort: Error message raised with Abort 

注意! Pythonで

boolタイプはintのサブクラスであり、そしてTrue1の値を有し、False0の整数値を有します。 Mercurialは、@command関数が終了コード(または終了コード0の場合はNone)を設定する整数を返すと予想しているため、Trueを返して終了コードを1に設定します。

一般に、mercurial.commandsモジュールとさまざまなhgext拡張モジュールを調べて、他の人が特定の問題をどのように解決したかを確認します。 hg grepコマンドは、例えば、エラーを処理する。この例が含まれています

try: 
    regexp = util.re.compile(pattern, reflags) 
except re.error as inst: 
    ui.warn(_("grep: invalid match pattern: %s\n") % inst) 
    return 1 

hg addremoveコードがerror.Abort()を発生させながら:

try: 
    sim = float(opts.get('similarity') or 100) 
except ValueError: 
    raise error.Abort(_('similarity must be a number')) 

私はコマンドエラーのためerror.Abort()、およびui.warn()プラス帰国を使用したいです255以外の終了コードが必要な場合にのみ、整数を返します。

+0

非常に良い説明、ありがとう:-) – Lars

関連する問題