Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 21 additions & 9 deletions jupyterlab_git/git.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,6 +486,13 @@ def remove_cell_ids(nb):

return {"base": prev_nb, "diff": thediff}

async def _is_first_commit(self, path: str) -> bool:
"""Return True if repo has no commits yet."""
code, _, _ = await self.__execute(
["git", "rev-parse", "--verify", "HEAD"], cwd=path
)
return code != 0

async def status(self, path: str) -> dict:
"""
Execute git status command & return the result.
Expand All @@ -501,14 +508,19 @@ async def status(self, path: str) -> dict:
}

# Add attribute `is_binary`
command = [ # Compare stage to an empty tree see `_is_binary`
"git",
"diff",
"--numstat",
"-z",
"--cached",
"4b825dc642cb6eb9a060e54bf8d69288fbee4904",
]
first_commit = await self._is_first_commit(path)
if first_commit:
# only first commit has to compare to an empty tree
command = [ # Compare stage to an empty tree see `_is_binary`
"git",
"diff",
"--numstat",
"-z",
"--cached",
"4b825dc642cb6eb9a060e54bf8d69288fbee4904",
]
else:
command = ["git", "diff", "--numstat", "-z", "--cached"]
text_code, text_output, _ = await self.__execute(command, cwd=path)

are_binary = dict()
Expand Down Expand Up @@ -1137,7 +1149,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]
Expand Down
42 changes: 42 additions & 0 deletions jupyterlab_git/tests/test_branch.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down