mirror of
https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git
synced 2025-07-13 11:29:46 +03:00
Replace "args.logfd" with "pmb.helpers.logging.logfd" in order to avoid passing "args" to all functions that only use it to write to logfd. This is the first step to get rid of this args-passed-to-all-functions pattern in pmbootstrap.
194 lines
6 KiB
Python
194 lines
6 KiB
Python
# Copyright 2021 Oliver Smith
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
import os
|
|
import sys
|
|
import pytest
|
|
import shutil
|
|
import time
|
|
|
|
import pmb_test # noqa
|
|
import pmb_test.const
|
|
import pmb_test.git
|
|
import pmb.helpers.git
|
|
import pmb.helpers.logging
|
|
import pmb.helpers.run
|
|
|
|
|
|
@pytest.fixture
|
|
def args(request):
|
|
import pmb.parse
|
|
cfg = f"{pmb_test.const.testdata}/channels.cfg"
|
|
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
|
|
args = pmb.parse.arguments()
|
|
args.log = args.work + "/log_testsuite.txt"
|
|
pmb.helpers.logging.init(args)
|
|
request.addfinalizer(pmb.helpers.logging.logfd.close)
|
|
return args
|
|
|
|
|
|
def test_get_path(args):
|
|
func = pmb.helpers.git.get_path
|
|
args.work = "/wrk"
|
|
args.aports = "/tmp/pmaports"
|
|
|
|
assert func(args, "aports_upstream") == "/wrk/cache_git/aports_upstream"
|
|
assert func(args, "pmaports") == "/tmp/pmaports"
|
|
|
|
|
|
def test_can_fast_forward(args, tmpdir):
|
|
tmpdir = str(tmpdir)
|
|
func = pmb.helpers.git.can_fast_forward
|
|
branch_origin = "fake-branch-origin"
|
|
|
|
def run_git(git_args):
|
|
pmb.helpers.run.user(args, ["git"] + git_args, tmpdir, "stdout")
|
|
|
|
# Create test git repo
|
|
run_git(["init", "."])
|
|
run_git(["commit", "--allow-empty", "-m", "commit on master"])
|
|
run_git(["checkout", "-b", branch_origin])
|
|
run_git(["commit", "--allow-empty", "-m", "commit on branch_origin"])
|
|
run_git(["checkout", "master"])
|
|
|
|
# Can fast-forward
|
|
assert func(args, tmpdir, branch_origin) is True
|
|
|
|
# Can't fast-forward
|
|
run_git(["commit", "--allow-empty", "-m", "commit on master #2"])
|
|
assert func(args, tmpdir, branch_origin) is False
|
|
|
|
# Git command fails
|
|
with pytest.raises(RuntimeError) as e:
|
|
func(args, tmpdir, "invalid-branch")
|
|
assert str(e.value).startswith("Unexpected exit code")
|
|
|
|
|
|
def test_clean_worktree(args, tmpdir):
|
|
tmpdir = str(tmpdir)
|
|
func = pmb.helpers.git.clean_worktree
|
|
|
|
def run_git(git_args):
|
|
pmb.helpers.run.user(args, ["git"] + git_args, tmpdir, "stdout")
|
|
|
|
# Create test git repo
|
|
run_git(["init", "."])
|
|
run_git(["commit", "--allow-empty", "-m", "commit on master"])
|
|
|
|
assert func(args, tmpdir) is True
|
|
pmb.helpers.run.user(args, ["touch", "test"], tmpdir)
|
|
assert func(args, tmpdir) is False
|
|
|
|
|
|
def test_get_upstream_remote(args, monkeypatch, tmpdir):
|
|
tmpdir = str(tmpdir)
|
|
func = pmb.helpers.git.get_upstream_remote
|
|
name_repo = "test"
|
|
|
|
# Override get_path()
|
|
def get_path(args, name_repo):
|
|
return tmpdir
|
|
monkeypatch.setattr(pmb.helpers.git, "get_path", get_path)
|
|
|
|
# Override pmb.config.git_repos
|
|
url = "https://postmarketos.org/get-upstream-remote-test.git"
|
|
git_repos = {"test": url}
|
|
monkeypatch.setattr(pmb.config, "git_repos", git_repos)
|
|
|
|
def run_git(git_args):
|
|
pmb.helpers.run.user(args, ["git"] + git_args, tmpdir, "stdout")
|
|
|
|
# Create git repo
|
|
run_git(["init", "."])
|
|
run_git(["commit", "--allow-empty", "-m", "commit on master"])
|
|
|
|
# No upstream remote
|
|
with pytest.raises(RuntimeError) as e:
|
|
func(args, name_repo)
|
|
assert "could not find remote name for URL" in str(e.value)
|
|
|
|
run_git(["remote", "add", "hello", url])
|
|
assert func(args, name_repo) == "hello"
|
|
|
|
|
|
def test_parse_channels_cfg(args):
|
|
exp = {"meta": {"recommended": "edge"},
|
|
"channels": {"edge": {"description": "Rolling release channel",
|
|
"branch_pmaports": "master",
|
|
"branch_aports": "master",
|
|
"mirrordir_alpine": "edge"},
|
|
"v20.05": {"description": "For workgroups",
|
|
"branch_pmaports": "v20.05",
|
|
"branch_aports": "3.11-stable",
|
|
"mirrordir_alpine": "v3.11"},
|
|
"v21.03": {"description": "Second beta release",
|
|
"branch_pmaports": "v21.03",
|
|
"branch_aports": "3.13-stable",
|
|
"mirrordir_alpine": "v3.13"}}}
|
|
assert pmb.helpers.git.parse_channels_cfg(args) == exp
|
|
|
|
|
|
def test_pull_non_existing(args):
|
|
assert pmb.helpers.git.pull(args, "non-existing-repo-name") == 1
|
|
|
|
|
|
def test_pull(args, monkeypatch, tmpdir):
|
|
""" Test pmb.helpers.git.pull """
|
|
path, run_git = pmb_test.git.prepare_tmpdir(args, monkeypatch, tmpdir)
|
|
|
|
# Not on official branch
|
|
func = pmb.helpers.git.pull
|
|
name_repo = "test"
|
|
run_git(["checkout", "-b", "inofficial-branch"])
|
|
assert func(args, name_repo) == -1
|
|
|
|
# Workdir is not clean
|
|
run_git(["checkout", "master"])
|
|
shutil.copy(__file__, path + "/test.py")
|
|
assert func(args, name_repo) == -2
|
|
os.unlink(path + "/test.py")
|
|
|
|
# Tracking different remote
|
|
assert func(args, name_repo) == -3
|
|
|
|
# Let master track origin/master
|
|
run_git(["checkout", "-b", "temp"])
|
|
run_git(["branch", "-D", "master"])
|
|
run_git(["checkout", "-b", "master", "--track", "origin/master"])
|
|
|
|
# Already up to date
|
|
assert func(args, name_repo) == 2
|
|
|
|
# Can't fast-forward
|
|
run_git(["commit", "--allow-empty", "-m", "test"])
|
|
assert func(args, name_repo) == -4
|
|
|
|
# Fast-forward successfully
|
|
run_git(["reset", "--hard", "origin/master"])
|
|
run_git(["commit", "--allow-empty", "-m", "new"], "remote")
|
|
assert func(args, name_repo) == 0
|
|
|
|
|
|
def test_is_outdated(args, tmpdir, monkeypatch):
|
|
func = pmb.helpers.git.is_outdated
|
|
|
|
# Override time.time(): now is "100"
|
|
def fake_time():
|
|
return 100.0
|
|
monkeypatch.setattr(time, "time", fake_time)
|
|
|
|
# Create .git/FETCH_HEAD
|
|
path = str(tmpdir)
|
|
os.mkdir(path + "/.git")
|
|
fetch_head = path + "/.git/FETCH_HEAD"
|
|
open(fetch_head, "w").close()
|
|
|
|
# Set mtime to 90
|
|
os.utime(fetch_head, times=(0, 90))
|
|
|
|
# Outdated (date_outdated: 90)
|
|
monkeypatch.setattr(pmb.config, "git_repo_outdated", 10)
|
|
assert func(args, path) is True
|
|
|
|
# Not outdated (date_outdated: 89)
|
|
monkeypatch.setattr(pmb.config, "git_repo_outdated", 11)
|
|
assert func(args, path) is False
|