2022-01-02 21:38:21 +00:00
|
|
|
# Copyright 2022 Oliver Smith
|
2020-02-20 20:07:28 +00:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
2019-12-27 22:13:28 +00:00
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
import pytest
|
2020-01-06 05:39:57 +00:00
|
|
|
import shutil
|
2020-02-12 21:44:26 +00:00
|
|
|
import time
|
2019-12-27 22:13:28 +00:00
|
|
|
|
2020-02-20 19:14:38 +00:00
|
|
|
import pmb_test # noqa
|
2020-02-27 22:04:38 +00:00
|
|
|
import pmb_test.const
|
2020-02-21 15:47:00 +00:00
|
|
|
import pmb_test.git
|
2019-12-27 22:13:28 +00:00
|
|
|
import pmb.helpers.git
|
|
|
|
import pmb.helpers.logging
|
2020-01-06 05:39:57 +00:00
|
|
|
import pmb.helpers.run
|
2019-12-27 22:13:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def args(request):
|
|
|
|
import pmb.parse
|
2020-02-27 22:04:38 +00:00
|
|
|
cfg = f"{pmb_test.const.testdata}/channels.cfg"
|
|
|
|
sys.argv = ["pmbootstrap.py", "--config-channels", cfg, "init"]
|
2019-12-27 22:13:28 +00:00
|
|
|
args = pmb.parse.arguments()
|
|
|
|
args.log = args.work + "/log_testsuite.txt"
|
|
|
|
pmb.helpers.logging.init(args)
|
2021-09-20 10:00:13 +00:00
|
|
|
request.addfinalizer(pmb.helpers.logging.logfd.close)
|
2019-12-27 22:13:28 +00:00
|
|
|
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"
|
2020-01-06 05:39:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
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"
|
|
|
|
|
|
|
|
|
2020-02-27 22:04:38 +00:00
|
|
|
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"},
|
2021-03-02 18:47:58 +00:00
|
|
|
"v20.05": {"description": "For workgroups",
|
2020-02-27 22:04:38 +00:00
|
|
|
"branch_pmaports": "v20.05",
|
|
|
|
"branch_aports": "3.11-stable",
|
2021-03-02 18:47:58 +00:00
|
|
|
"mirrordir_alpine": "v3.11"},
|
|
|
|
"v21.03": {"description": "Second beta release",
|
|
|
|
"branch_pmaports": "v21.03",
|
|
|
|
"branch_aports": "3.13-stable",
|
|
|
|
"mirrordir_alpine": "v3.13"}}}
|
2020-02-27 22:04:38 +00:00
|
|
|
assert pmb.helpers.git.parse_channels_cfg(args) == exp
|
|
|
|
|
|
|
|
|
2020-01-06 05:39:57 +00:00
|
|
|
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 """
|
2020-02-21 15:47:00 +00:00
|
|
|
path, run_git = pmb_test.git.prepare_tmpdir(args, monkeypatch, tmpdir)
|
2020-01-06 05:39:57 +00:00
|
|
|
|
|
|
|
# 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"])
|
2020-02-21 15:47:00 +00:00
|
|
|
shutil.copy(__file__, path + "/test.py")
|
2020-01-06 05:39:57 +00:00
|
|
|
assert func(args, name_repo) == -2
|
2020-02-21 15:47:00 +00:00
|
|
|
os.unlink(path + "/test.py")
|
2020-01-06 05:39:57 +00:00
|
|
|
|
|
|
|
# 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"])
|
2020-02-21 15:47:00 +00:00
|
|
|
run_git(["commit", "--allow-empty", "-m", "new"], "remote")
|
2020-01-06 05:39:57 +00:00
|
|
|
assert func(args, name_repo) == 0
|
2020-02-12 21:44:26 +00:00
|
|
|
|
|
|
|
|
2021-10-16 16:15:54 +00:00
|
|
|
def test_is_outdated(tmpdir, monkeypatch):
|
2020-02-12 21:44:26 +00:00
|
|
|
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)
|
2021-10-16 16:15:54 +00:00
|
|
|
assert func(path) is True
|
2020-02-12 21:44:26 +00:00
|
|
|
|
|
|
|
# Not outdated (date_outdated: 89)
|
|
|
|
monkeypatch.setattr(pmb.config, "git_repo_outdated", 11)
|
2021-10-16 16:15:54 +00:00
|
|
|
assert func(path) is False
|