blob: 8f80ed6bdf0fa0a3b20d214b8b8127cc09caf2ac [file] [log] [blame]
import subprocess
import pytest
from buildstream import _yaml
from .. import Repo
from .site import HAVE_GIT, GIT, GIT_ENV
# generate_junction()
#
# Generates a junction element with a git repository
#
# Args:
# tmpdir: The tmpdir fixture, for storing the generated git repo
# subproject_path: The path for the subproject, to add to the git repo
# junction_path: The location to store the generated junction element
# store_ref: Whether to store the ref in the junction.bst file
#
# Returns:
# (str): The ref
#
def generate_junction(tmpdir, subproject_path, junction_path, *, store_ref=True, options=None):
# Create a repo to hold the subproject and generate
# a junction element for it
#
repo = _SimpleGit(str(tmpdir))
source_ref = ref = repo.create(subproject_path)
if not store_ref:
source_ref = None
element = {"kind": "junction", "sources": [repo.source_config(ref=source_ref)]}
if options:
element["config"] = {"options": options}
_yaml.roundtrip_dump(element, junction_path)
return ref
# A barebones Git Repo class to use for generating junctions
class _SimpleGit(Repo):
def __init__(self, directory, subdir="repo"):
if not HAVE_GIT:
pytest.skip("git is not available")
super().__init__(directory, subdir)
def create(self, directory):
self.copy_directory(directory, self.repo)
self._run_git("init", ".")
self._run_git("add", ".")
self._run_git("commit", "-m", "Initial commit")
return self.latest_commit()
def latest_commit(self):
return self._run_git("rev-parse", "HEAD", stdout=subprocess.PIPE, universal_newlines=True,).stdout.strip()
def source_config(self, ref=None):
return self.source_config_extra(ref)
def source_config_extra(self, ref=None, checkout_submodules=None):
config = {"kind": "git", "url": "file://" + self.repo, "track": "master"}
if ref is not None:
config["ref"] = ref
if checkout_submodules is not None:
config["checkout-submodules"] = checkout_submodules
return config
def _run_git(self, *args, **kwargs):
argv = [GIT]
argv.extend(args)
if "env" not in kwargs:
kwargs["env"] = dict(GIT_ENV, PWD=self.repo)
kwargs.setdefault("cwd", self.repo)
kwargs.setdefault("check", True)
return subprocess.run(argv, **kwargs) # pylint: disable=subprocess-run-check