From d2663616767ebff63e1d5d2a7a7a7764f2744125 Mon Sep 17 00:00:00 2001 From: Rich Chiodo Date: Thu, 9 Jan 2025 14:32:39 -0800 Subject: [PATCH] Allow relative paths in the 'remotePath' for a launch.json (#1803) * Allow relative paths and add more logging for path issues * Revert "Allow relative paths and add more logging for path issues" This reverts commit a3956e4753fc779a9dcfbb3c0bd3e04273dc5213. * Allow relative paths and add more logging for path issues * Add case test * Missed some spots * Invalid variable name * Func doesn't return tuple --- .../_vendored/pydevd/pydevd_file_utils.py | 16 ++++++++++++++++ .../tests_python/test_convert_utilities.py | 15 ++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/debugpy/_vendored/pydevd/pydevd_file_utils.py b/src/debugpy/_vendored/pydevd/pydevd_file_utils.py index b9fbe4d2..390f903c 100644 --- a/src/debugpy/_vendored/pydevd/pydevd_file_utils.py +++ b/src/debugpy/_vendored/pydevd/pydevd_file_utils.py @@ -653,6 +653,12 @@ def _fix_path(path, sep, add_end_sep=False): if sep != "/": path = path.replace("/", sep) + + if path.startswith("."): + # We need the full path if this relative because all comparisons below + # check if the path is substring of another + path = os.path.realpath(path) + return path @@ -747,6 +753,16 @@ def setup_client_server_paths(paths): initial_paths_with_end_sep.append((path0, path1)) paths_from_eclipse_to_python_with_end_sep.append((_normcase_from_client(path0), normcase(path1))) + if DEBUG_CLIENT_SERVER_TRANSLATION: + pydev_log.critical( + "pydev debugger: paths_from_eclipse_to_python %s", + ", ".join( + [ + '"%s=>%s"' % (x[0], x[1]) + for x in paths_from_eclipse_to_python + ] + ), + ) # Fix things so that we always match the versions with a slash in the end first. initial_paths = initial_paths_with_end_sep + initial_paths paths_from_eclipse_to_python = paths_from_eclipse_to_python_with_end_sep + paths_from_eclipse_to_python diff --git a/src/debugpy/_vendored/pydevd/tests_python/test_convert_utilities.py b/src/debugpy/_vendored/pydevd/tests_python/test_convert_utilities.py index 4dbac3b3..fd640ab8 100644 --- a/src/debugpy/_vendored/pydevd/tests_python/test_convert_utilities.py +++ b/src/debugpy/_vendored/pydevd/tests_python/test_convert_utilities.py @@ -150,16 +150,25 @@ def test_source_reference(tmpdir): # Client on windows and server on unix pydevd_file_utils.set_ide_os("WINDOWS") - pydevd_file_utils.setup_client_server_paths([("c:\\foo", "/bar")]) + pydevd_file_utils.setup_client_server_paths([("C:\\foo", "/bar")]) - assert pydevd_file_utils.map_file_to_client("/bar/my") == ("c:\\foo\\my", True) - assert pydevd_file_utils.get_client_filename_source_reference("c:\\foo\\my") == 0 + assert pydevd_file_utils.map_file_to_client("/bar/my") == ("C:\\foo\\my", True) + assert pydevd_file_utils.get_client_filename_source_reference("C:\\foo\\my") == 0 assert pydevd_file_utils.map_file_to_client("/another/my") == ("\\another\\my", False) source_reference = pydevd_file_utils.get_client_filename_source_reference("\\another\\my") assert source_reference != 0 assert pydevd_file_utils.get_server_filename_from_source_reference(source_reference) == "/another/my" + # Allow relative paths in the server path + pydevd_file_utils.setup_client_server_paths([("C:\\foo", "./bar")]) + root = os.getcwd() + server_path = os.path.join(root, "bar/my") + + assert pydevd_file_utils.map_file_to_client(server_path) == ("C:\\foo\\my", True) + assert pydevd_file_utils.get_client_filename_source_reference("C:\\foo\\my") == 0 + assert pydevd_file_utils.map_file_to_server("c:\\foo\\my") == server_path + @pytest.mark.skipif(sys.platform != "win32", reason="Windows-only test.") def test_translate_only_drive():