diff --git a/src/debugpy/server/cli.py b/src/debugpy/server/cli.py index 098b84a1..57ece638 100644 --- a/src/debugpy/server/cli.py +++ b/src/debugpy/server/cli.py @@ -190,8 +190,18 @@ switches = [ ] # fmt: on +# Consume all the args from argv +def consume_argv(): + while len(sys.argv) >= 2: + value = sys.argv[1] + del sys.argv[1] + yield value + # Consume all the args from a given list def consume_args(args: list): + if (args == sys.argv): + return consume_argv() + while len(args) >= 1: value = args[0] del args[0] @@ -205,7 +215,7 @@ def parse_args(): seen = set() parse_args_from_command_line(seen) - parse_args_from_environment(seen) + #parse_args_from_environment(seen) #print("options:", file=sys.stderr) #print(options.__dict__, file=sys.stderr) @@ -225,7 +235,7 @@ def parse_args(): assert options.address is not None def parse_args_from_command_line(seen: set): - parse_args_helper(sys.argv[1:], seen) + parse_args_helper(sys.argv, seen) def parse_args_from_environment(seenFromCommandLine: set): args = os.environ.get("DEBUGPY_EXTRA_ARGV") diff --git a/tests/debugpy/server/test_cli.py b/tests/debugpy/server/test_cli.py index dea5324b..26cad791 100644 --- a/tests/debugpy/server/test_cli.py +++ b/tests/debugpy/server/test_cli.py @@ -77,10 +77,12 @@ def cli(pyfile): @pytest.mark.parametrize("mode", ["listen", "connect"]) @pytest.mark.parametrize("address", ["8888", "localhost:8888"]) @pytest.mark.parametrize("wait_for_client", ["", "wait_for_client"]) -def test_targets(cli, target_kind, mode, address, wait_for_client): +@pytest.mark.parametrize("script_args", ["", "script_args"]) +def test_targets(cli, target_kind, mode, address, wait_for_client, script_args): expected_options = { "mode": mode, "target_kind": target_kind, + "wait_for_client": False } args = ["--" + mode, address] @@ -108,7 +110,25 @@ def test_targets(cli, target_kind, mode, address, wait_for_client): pytest.fail(target_kind) expected_options["target"] = target + if script_args: + script_args = [ + "ham", + "--listen", + "--wait-for-client", + "-y", + "spam", + "--", + "--connect", + "-c", + "--something", + "-m", + ] + args += script_args + else: + script_args = [] + argv, options = cli(args) + assert argv == script_args assert options == some.dict.containing(expected_options) @pytest.mark.parametrize("value", [True, False]) @@ -189,12 +209,20 @@ def test_read_switches_from_environment(cli): assert options["target"] == "spam.py" # Test that command line switches override environment variables -@mock.patch.dict(os.environ, {"DEBUGPY_EXTRA_ARGV": "--connect 5678"}) def test_override_environment_switch(cli): args = ["--connect", "8888", "spam.py"] - _, options = cli(args) + with mock.patch.dict(os.environ, {"DEBUGPY_EXTRA_ARGV": "--connect 5678"}): + _, options = cli(args) - assert options["mode"] == "connect" - assert options["address"] == ("127.0.0.1", 8888) + assert options["mode"] == "connect" + assert options["address"] == ("127.0.0.1", 8888) + assert options["target"] == "spam.py" + +# Test that script args (passed to target) are preserved +def test_script_args(cli): + args = ["--listen", "8888", "spam.py", "arg1", "arg2"] + argv, options = cli(args) + + assert argv == ["--listen", "8888", "spam.py", "arg1", "arg2"] assert options["target"] == "spam.py" \ No newline at end of file