mirror of
https://gerrit.googlesource.com/git-repo
synced 2026-05-08 03:49:28 +00:00
3d819e8e3e
Change-Id: I63751042391f5cc3e06af7067bc83d67bd0716dc Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/569441 Tested-by: Mike Frysinger <vapier@google.com> Commit-Queue: Mike Frysinger <vapier@google.com> Reviewed-by: Gavin Mak <gavinmak@google.com>
105 lines
3.1 KiB
Python
105 lines
3.1 KiB
Python
# Copyright (C) 2026 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""Various utility code used by tests.
|
|
|
|
If you want to write a per-test fixture, see conftest.py instead.
|
|
"""
|
|
|
|
import contextlib
|
|
import functools
|
|
from pathlib import Path
|
|
import subprocess
|
|
import tempfile
|
|
from typing import Optional, Union
|
|
|
|
import git_command
|
|
|
|
|
|
THIS_FILE = Path(__file__).resolve()
|
|
THIS_DIR = THIS_FILE.parent
|
|
FIXTURES_DIR = THIS_DIR / "fixtures"
|
|
|
|
|
|
def init_git_tree(
|
|
path: Union[str, Path],
|
|
ref_format: Optional[str] = None,
|
|
) -> None:
|
|
"""Initialize `path` as a new git repo."""
|
|
with contextlib.ExitStack() as stack:
|
|
# Tests need to assume, that main is default branch at init,
|
|
# which is not supported in config until 2.28.
|
|
cmd = ["git"]
|
|
if ref_format:
|
|
cmd += ["-c", f"init.defaultRefFormat={ref_format}"]
|
|
cmd += ["init"]
|
|
|
|
if git_command.git_require((2, 28, 0)):
|
|
cmd += ["--initial-branch=main"]
|
|
else:
|
|
# Use template dir for init.
|
|
templatedir = stack.enter_context(
|
|
tempfile.mkdtemp(prefix="git-template")
|
|
)
|
|
(Path(templatedir) / "HEAD").write_text("ref: refs/heads/main\n")
|
|
cmd += ["--template", templatedir]
|
|
cmd += [path]
|
|
subprocess.run(cmd, check=True)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def TempGitTree():
|
|
"""Create a new empty git checkout for testing."""
|
|
with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir:
|
|
init_git_tree(tempdir)
|
|
yield tempdir
|
|
|
|
|
|
@functools.lru_cache(maxsize=None)
|
|
def supports_reftable() -> bool:
|
|
"""Check if git supports reftable."""
|
|
with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir:
|
|
proc = subprocess.run(
|
|
["git", "-c", "init.defaultRefFormat=reftable", "init"],
|
|
cwd=tempdir,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
check=False,
|
|
)
|
|
return proc.returncode == 0
|
|
|
|
|
|
@functools.lru_cache(maxsize=None)
|
|
def supports_refs_migrate() -> bool:
|
|
"""Check if git supports refs migrate."""
|
|
with tempfile.TemporaryDirectory(prefix="repo-tests") as tempdir:
|
|
subprocess.check_call(
|
|
["git", "-c", "init.defaultRefFormat=files", "init"],
|
|
cwd=tempdir,
|
|
)
|
|
proc = subprocess.run(
|
|
[
|
|
"git",
|
|
"refs",
|
|
"migrate",
|
|
"--ref-format=reftable",
|
|
"--dry-run",
|
|
],
|
|
cwd=tempdir,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
check=False,
|
|
)
|
|
return proc.returncode == 0
|