git fetch + tests
Signed-off-by: Václav Valíček <valicek1994@gmail.com>
This commit is contained in:
parent
7689572edb
commit
54ed1ded30
|
@ -95,6 +95,7 @@ class RepoTool:
|
||||||
_initialized: bool = False
|
_initialized: bool = False
|
||||||
_bare: bool = False
|
_bare: bool = False
|
||||||
_path: str = ""
|
_path: str = ""
|
||||||
|
_last_fetch_data = []
|
||||||
|
|
||||||
def __init__(self, path: str):
|
def __init__(self, path: str):
|
||||||
log.info(f"Initializing repository at {path}")
|
log.info(f"Initializing repository at {path}")
|
||||||
|
@ -121,6 +122,16 @@ class RepoTool:
|
||||||
def path(self) -> str:
|
def path(self) -> str:
|
||||||
return self._path
|
return self._path
|
||||||
|
|
||||||
|
def __check_initialized(self):
|
||||||
|
def inner(*args):
|
||||||
|
fake_self: RepoTool = args[0]
|
||||||
|
if not fake_self._initialized:
|
||||||
|
log.critical(f"Repo {fake_self.path} is not initialized!")
|
||||||
|
return False
|
||||||
|
return self(*args)
|
||||||
|
|
||||||
|
return inner
|
||||||
|
|
||||||
def clone(self, url: str) -> bool:
|
def clone(self, url: str) -> bool:
|
||||||
if self._initialized:
|
if self._initialized:
|
||||||
log.warning(f"Trying to clone to initialized repository!")
|
log.warning(f"Trying to clone to initialized repository!")
|
||||||
|
@ -132,3 +143,21 @@ class RepoTool:
|
||||||
self._bare = self._repo.bare
|
self._bare = self._repo.bare
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@__check_initialized
|
||||||
|
def fetch(self) -> bool:
|
||||||
|
log.info("Fetching repo state")
|
||||||
|
if not len(self._repo.remotes):
|
||||||
|
log.warning(f"Repo: {self._path} does not contain any remotes!")
|
||||||
|
return False
|
||||||
|
# fetch all remotes
|
||||||
|
remote = self._repo.remotes[0]
|
||||||
|
log.debug(f"Fetching remote: {remote.name} url: {next(remote.urls)}")
|
||||||
|
self._last_fetch_data = remote.fetch(
|
||||||
|
"+refs/heads/*:refs/heads/*",
|
||||||
|
progress = GitRemoteProgress(),
|
||||||
|
kill_after_timeout = 60,
|
||||||
|
prune = True
|
||||||
|
)
|
||||||
|
log.debug("Fetch finished!")
|
||||||
|
return True
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
import git
|
||||||
import pytest
|
import pytest
|
||||||
from cloner_test_fixtures import support_data_path
|
from cloner_test_fixtures import support_data_path
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
@ -67,6 +69,15 @@ def test_clone_initialized_repo(tmp_path, caplog, support_data_path):
|
||||||
assert r.message == "Trying to clone to initialized repository!"
|
assert r.message == "Trying to clone to initialized repository!"
|
||||||
|
|
||||||
|
|
||||||
|
def test_check_initialized(tmp_path, monkeypatch, caplog):
|
||||||
|
# hard testing directly, testing via fetch
|
||||||
|
rt = RepoTool(tmp_path.as_posix())
|
||||||
|
assert not rt.initialized
|
||||||
|
assert not rt.fetch()
|
||||||
|
assert caplog.records[1].levelname == "CRITICAL"
|
||||||
|
assert caplog.records[1].message == f"Repo {tmp_path.as_posix()} is not initialized!"
|
||||||
|
|
||||||
|
|
||||||
def test_clone_okay(tmp_path, caplog, support_data_path):
|
def test_clone_okay(tmp_path, caplog, support_data_path):
|
||||||
rt = RepoTool(tmp_path.as_posix())
|
rt = RepoTool(tmp_path.as_posix())
|
||||||
assert not rt.initialized
|
assert not rt.initialized
|
||||||
|
@ -105,3 +116,46 @@ def test_clone_okay(tmp_path, caplog, support_data_path):
|
||||||
assert compressing_cnt >= 2
|
assert compressing_cnt >= 2
|
||||||
assert receiving_cnt >= 2
|
assert receiving_cnt >= 2
|
||||||
assert resolving_cnt >= 2
|
assert resolving_cnt >= 2
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_uninitialized(tmp_path, caplog):
|
||||||
|
repo_a = tmp_path.joinpath("A.git")
|
||||||
|
repo_b = tmp_path.joinpath("B.git")
|
||||||
|
|
||||||
|
repo_a.mkdir()
|
||||||
|
rt = RepoTool(repo_a.as_posix())
|
||||||
|
assert not rt.initialized
|
||||||
|
assert not rt.fetch()
|
||||||
|
|
||||||
|
assert f"Repo {repo_a.as_posix()} is not initialized!"
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_no_remotes(tmp_path, caplog):
|
||||||
|
repo_a = tmp_path.joinpath("A.git")
|
||||||
|
|
||||||
|
git.Repo().init(repo_a.as_posix())
|
||||||
|
|
||||||
|
rt = RepoTool(repo_a.as_posix())
|
||||||
|
assert not rt.fetch()
|
||||||
|
assert caplog.records[0].levelname == "WARNING"
|
||||||
|
assert caplog.records[0].message == f"Repo: {repo_a.as_posix()} does not contain any remotes!"
|
||||||
|
|
||||||
|
|
||||||
|
def test_fetch_ok(tmp_path):
|
||||||
|
repo_a = tmp_path.joinpath("A.git")
|
||||||
|
repo_b = tmp_path.joinpath("B.git")
|
||||||
|
|
||||||
|
r = git.Repo().init(repo_a.as_posix())
|
||||||
|
|
||||||
|
rt = RepoTool(repo_b.as_posix())
|
||||||
|
assert rt.clone(repo_a.as_uri())
|
||||||
|
|
||||||
|
# new file
|
||||||
|
repo_a.joinpath(".gitignore").touch()
|
||||||
|
# commit it
|
||||||
|
r.git.add(".gitignore")
|
||||||
|
r.git.commit(message = "Test Commit", author = "Tester <test@a.b>")
|
||||||
|
hash = r.commit("master").hexsha
|
||||||
|
|
||||||
|
assert rt.fetch()
|
||||||
|
assert rt._repo.commit(hash)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user