diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -699,8 +699,28 @@ def _earlygetopt(aliases, args): 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 --git a/tests/test-dispatch.t b/tests/test-dispatch.t --- a/tests/test-dispatch.t +++ b/tests/test-dispatch.t @@ -42,6 +42,15 @@ Missing parameter for early option: 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