0

Mercurial 拡張機能でエラーを処理するための推奨されるアプローチは何ですか? この側面に関するドキュメントはオンラインで見つかりませんでした。

次の例は、Windows シェルで出力してHello world設定errorlevelします。1

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

errorlevelが に設定されているのはなぜ1ですか? になると予想していました0。Python または Mercurialは、このコンテキストでどのように処理Trueしますか? Falsereturn に変更すると がFalse生成されerrorlevel 0ます。

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

Windows 7 と Mercurial 3.4.1 の使用

4

1 に答える 1

0

@command関数では、エラー メッセージを表示するために使用し、整数ui.warn()値を返して終了コードを設定します。

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

ただし、使用しても問題なく、に設定しraise mercurial.error.Abort()ない限りトレースバックは発生しません(デフォルトは)。通常、レイズすると andコンボが発生します (終了コード 255 になります)。ui.tracebackTrueFalseAbort()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型は のサブクラスでありintTrueの値との整数値を持ち1ます。Mercurial は、関数が終了コードを設定する (または終了コード 0 の)整数を返すことを想定しているため、 を返すことで終了コードを に設定します。False0@commandNone1True

私は通常、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 以外の終了コードが特に必要な場合にのみ整数を返します。

于 2016-08-04T09:37:28.210 に答える