forked from Mirror/pmbootstrap
Translate the pmaports channels "stable" to "v20.05" and "stable-next" to "v21.03", so these have the same channel name as the pmaports.git branch name. The original plan was to switch the "stable" channel from the "v20.05" branch to the "v21.03" branch when the release is done. However, now that we are close to that, I'm realizing that this would not be useful. It would lead to conflicts in the dir with locally built packages (default: ~/.local/var/pmbootstrap/packages/$CHANNEL). And it would make it awkward to go back to a previous branch (we may name it old-stable for the time being, but what after that, old-old-stable?).
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(args.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
|