# HG changeset patch # User Yuya Nishihara # Date 1510320446 -32400 # Node ID e16f68c4abe33751568bafc8239566edca31867b # Parent 7f8f9f0369cafbd1ead63dfbb50f7f5e28d1a5e5 dispatch: stop parsing of early boolean option at "--" diff -r 7f8f9f0369ca -r e16f68c4abe3 mercurial/dispatch.py --- a/mercurial/dispatch.py Fri Nov 10 22:22:39 2017 +0900 +++ b/mercurial/dispatch.py Fri Nov 10 22:27:26 2017 +0900 @@ -699,8 +699,28 @@ return values def _earlyreqoptbool(req, name, aliases): - assert len(aliases) == 1 - return aliases[0] in req.args + """Peek a boolean option without using a full options table + + >>> req = request([b'x', b'--debugger']) + >>> _earlyreqoptbool(req, b'debugger', [b'--debugger']) + True + + >>> req = request([b'x', b'--', b'--debugger']) + >>> _earlyreqoptbool(req, b'debugger', [b'--debugger']) + False + """ + try: + argcount = req.args.index("--") + except ValueError: + argcount = len(req.args) + value = False + pos = 0 + while pos < argcount: + arg = req.args[pos] + if arg in aliases: + value = True + pos += 1 + return value def runcommand(lui, repo, cmd, fullargs, ui, options, d, cmdpats, cmdoptions): # run pre-hook, and abort if it fails diff -r 7f8f9f0369ca -r e16f68c4abe3 tests/test-dispatch.t --- a/tests/test-dispatch.t Fri Nov 10 22:22:39 2017 +0900 +++ b/tests/test-dispatch.t Fri Nov 10 22:27:26 2017 +0900 @@ -42,6 +42,15 @@ hg log [OPTION]... [FILE] (use 'hg log -h' to show more help) +Parsing of early options should stop at "--": + + $ hg cat -- --config=hooks.pre-cat=false + --config=hooks.pre-cat=false: no such file in rev cb9a9f314b8b + [1] + $ hg cat -- --debugger + --debugger: no such file in rev cb9a9f314b8b + [1] + [defaults] $ hg cat a