| # 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. |
| |
| """Unittests for the git_refs.py module.""" |
| |
| import os |
| from pathlib import Path |
| import subprocess |
| |
| import pytest |
| import utils_for_test |
| |
| import git_refs |
| |
| |
| def _run(repo, *args): |
| return subprocess.run( |
| ["git", "-C", repo, *args], |
| stdout=subprocess.PIPE, |
| stderr=subprocess.PIPE, |
| encoding="utf-8", |
| check=True, |
| ).stdout.strip() |
| |
| |
| def _init_repo(tmp_path, reftable=False): |
| repo = os.path.join(tmp_path, "repo") |
| ref_format = "reftable" if reftable else "files" |
| utils_for_test.init_git_tree(repo, ref_format=ref_format) |
| |
| Path(os.path.join(repo, "a")).write_text("1") |
| _run(repo, "add", "a") |
| _run(repo, "commit", "-q", "-m", "init") |
| return repo |
| |
| |
| @pytest.mark.parametrize("reftable", [False, True]) |
| def test_reads_refs(tmp_path, reftable): |
| if reftable and not utils_for_test.supports_reftable(): |
| pytest.skip("reftable not supported") |
| |
| repo = _init_repo(tmp_path, reftable=reftable) |
| gitdir = os.path.join(repo, ".git") |
| refs = git_refs.GitRefs(gitdir) |
| |
| branch = _run(repo, "symbolic-ref", "--short", "HEAD") |
| head = _run(repo, "rev-parse", "HEAD") |
| assert refs.symref("HEAD") == f"refs/heads/{branch}" |
| assert refs.get("HEAD") == head |
| assert refs.get(f"refs/heads/{branch}") == head |
| |
| |
| @pytest.mark.parametrize("reftable", [False, True]) |
| def test_updates_when_refs_change(tmp_path, reftable): |
| if reftable and not utils_for_test.supports_reftable(): |
| pytest.skip("reftable not supported") |
| |
| repo = _init_repo(tmp_path, reftable=reftable) |
| gitdir = os.path.join(repo, ".git") |
| refs = git_refs.GitRefs(gitdir) |
| |
| head = _run(repo, "rev-parse", "HEAD") |
| assert refs.get("refs/heads/topic") == "" |
| _run(repo, "branch", "topic") |
| assert refs.get("refs/heads/topic") == head |
| _run(repo, "branch", "-D", "topic") |
| assert refs.get("refs/heads/topic") == "" |
| |
| |
| @pytest.mark.skipif( |
| not utils_for_test.supports_refs_migrate(), |
| reason="git refs migrate reftable support is required for this test", |
| ) |
| def test_updates_when_storage_backend_toggles(tmp_path): |
| repo = _init_repo(tmp_path, reftable=False) |
| gitdir = os.path.join(repo, ".git") |
| refs = git_refs.GitRefs(gitdir) |
| |
| head = _run(repo, "rev-parse", "HEAD") |
| assert refs.get("refs/heads/reftable-branch") == "" |
| _run(repo, "refs", "migrate", "--ref-format=reftable") |
| _run(repo, "branch", "reftable-branch") |
| assert refs.get("refs/heads/reftable-branch") == head |
| |
| assert refs.get("refs/heads/files-branch") == "" |
| _run(repo, "refs", "migrate", "--ref-format=files") |
| _run(repo, "branch", "files-branch") |
| assert refs.get("refs/heads/files-branch") == head |