fix: use working clones for git repos
- Create normal working clones for remote repositories - Initialize blank repositories with a main branch - Align pull and branch helpers with unborn HEAD handling - Gate fetch/pull on repositories with a remote Quality gates: vitest repositories-settings-tab (passed); api pytest blocked by missing fastapi in environment
This commit is contained in:
@@ -63,6 +63,13 @@ class TestGitStatus:
|
||||
assert "new.py" in status.untracked
|
||||
|
||||
|
||||
def test_get_current_branch_handles_unborn_main() -> None:
|
||||
with tempfile.TemporaryDirectory() as tmpdir:
|
||||
os.system(f"git init -b main {tmpdir} >/dev/null 2>&1")
|
||||
|
||||
assert get_current_branch(tmpdir) == "main"
|
||||
|
||||
|
||||
class TestBranchOperations:
|
||||
"""Tests for branch management functions."""
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
import pytest
|
||||
from fastapi import HTTPException
|
||||
|
||||
from src.api.git_repositories import _clone_working_repository, _init_working_repository
|
||||
|
||||
|
||||
def test_clone_working_repository_uses_normal_clone() -> None:
|
||||
completed = Mock(returncode=0, stderr="")
|
||||
with patch("src.api.git_repositories.subprocess.run", return_value=completed) as run_mock:
|
||||
_clone_working_repository("git@git.commumedia.org:alice/demo.git", "/tmp/demo.git")
|
||||
|
||||
run_mock.assert_called_once()
|
||||
assert run_mock.call_args.args[0] == ["git", "clone", "git@git.commumedia.org:alice/demo.git", "/tmp/demo.git"]
|
||||
|
||||
|
||||
def test_clone_working_repository_raises_on_failure() -> None:
|
||||
completed = Mock(returncode=128, stderr="fatal: repository not found")
|
||||
with patch("src.api.git_repositories.subprocess.run", return_value=completed):
|
||||
with pytest.raises(HTTPException) as exc_info:
|
||||
_clone_working_repository("git@git.commumedia.org:alice/missing.git", "/tmp/missing.git")
|
||||
|
||||
assert exc_info.value.status_code == 400
|
||||
assert "failed to clone repository" in exc_info.value.detail
|
||||
|
||||
|
||||
def test_init_working_repository_prefers_init_b() -> None:
|
||||
init_b = Mock(returncode=0, stderr="")
|
||||
with patch("src.api.git_repositories.subprocess.run", return_value=init_b) as run_mock:
|
||||
_init_working_repository("/tmp/new-repo")
|
||||
|
||||
assert run_mock.call_args.args[0] == ["git", "init", "-b", "main", "/tmp/new-repo"]
|
||||
|
||||
|
||||
def test_init_working_repository_falls_back_to_symbolic_ref() -> None:
|
||||
init_b = Mock(returncode=1, stderr="unknown switch `b'")
|
||||
init_ok = Mock(returncode=0, stderr="")
|
||||
symbolic_ref = Mock(returncode=0, stderr="")
|
||||
|
||||
with patch("src.api.git_repositories.subprocess.run", side_effect=[init_b, init_ok, symbolic_ref]) as run_mock:
|
||||
_init_working_repository("/tmp/new-repo")
|
||||
|
||||
assert run_mock.call_args_list[0].args[0] == ["git", "init", "-b", "main", "/tmp/new-repo"]
|
||||
assert run_mock.call_args_list[1].args[0] == ["git", "init", "/tmp/new-repo"]
|
||||
assert run_mock.call_args_list[2].args[0] == ["git", "-C", "/tmp/new-repo", "symbolic-ref", "HEAD", "refs/heads/main"]
|
||||
Reference in New Issue
Block a user