diff --git a/jupyterlab_git/git.py b/jupyterlab_git/git.py index a4ae5e9e8..ae6dc2651 100644 --- a/jupyterlab_git/git.py +++ b/jupyterlab_git/git.py @@ -1137,7 +1137,7 @@ async def checkout_branch(self, branchname, path): is_remote_branch = self._is_remote_branch(reference_name) if is_remote_branch: - local_branchname = branchname.split("/")[-1] + local_branchname = "/".join(branchname.split("/")[1:]) cmd = ["git", "checkout", "-B", local_branchname, branchname] else: cmd = ["git", "checkout", branchname] diff --git a/jupyterlab_git/tests/test_branch.py b/jupyterlab_git/tests/test_branch.py index c78d62e66..fbb048602 100644 --- a/jupyterlab_git/tests/test_branch.py +++ b/jupyterlab_git/tests/test_branch.py @@ -174,6 +174,48 @@ async def test_checkout_branch_remoteref_success(): assert {"code": rc, "message": stdout_message} == actual_response +@pytest.mark.asyncio +async def test_checkout_branch_remoteref_success_when_has_slash(): + branch = "origin/test-branch/test" + local_branch = "test-branch/test" + curr_path = str(Path("/bin/test_curr_path")) + stdout_message = "checkout output from git" + stderr_message = "" + rc = 0 + + with patch("jupyterlab_git.git.execute") as mock_execute: + with patch.object( + Git, + "_get_branch_reference", + return_value=maybe_future("refs/remotes/remote_branch"), + ) as mock__get_branch_reference: + # Given + mock_execute.return_value = maybe_future( + (rc, stdout_message, stderr_message) + ) + + # When + actual_response = await Git().checkout_branch( + branchname=branch, path=curr_path + ) + + # Then + mock__get_branch_reference.assert_has_calls([call(branch, curr_path)]) + + cmd = ["git", "checkout", "-B", local_branch, branch] + mock_execute.assert_called_once_with( + cmd, + cwd=str(Path("/bin") / "test_curr_path"), + timeout=20, + env=None, + username=None, + password=None, + is_binary=False, + ) + + assert {"code": rc, "message": stdout_message} == actual_response + + @pytest.mark.asyncio async def test_checkout_branch_headsref_failure(): branch = "test-branch"