| # Copyright (c) 2024 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| from __future__ import annotations |
| |
| import os |
| import sys |
| import threading |
| from typing import Iterable |
| |
| from unittest import mock |
| import unittest |
| |
| # This is to be able to import scm from the root of the repo. |
| sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
| |
| import scm |
| |
| |
| def GIT( |
| test: unittest.TestCase, |
| *, |
| branchref: str | None = None, |
| system_config: dict[str, list[str]] | None = None |
| ) -> Iterable[tuple[str, list[str]]]: |
| """Installs fakes/mocks for scm.GIT so that: |
| |
| * GetBranch will just return a fake branchname starting with the value of |
| branchref. |
| * git_new_branch.create_new_branch will be mocked to update the value |
| returned by GetBranch. |
| |
| If provided, `system_config` allows you to set the 'system' scoped |
| git-config which will be visible as the immutable base configuration layer |
| for all git config scopes. |
| |
| NOTE: The dependency on git_new_branch.create_new_branch seems pretty |
| circular - this functionality should probably move to scm.GIT? |
| """ |
| _branchref = [branchref or 'refs/heads/main'] |
| |
| global_lock = threading.Lock() |
| global_state = {} |
| |
| def _newBranch(branchref): |
| _branchref[0] = branchref |
| |
| patches: list[mock._patch] = [ |
| mock.patch('scm.GIT._new_config_state', |
| side_effect=lambda _: scm.GitConfigStateTest( |
| global_lock, global_state, system_state=system_config)), |
| mock.patch('scm.GIT.GetBranchRef', side_effect=lambda _: _branchref[0]), |
| mock.patch('git_new_branch.create_new_branch', side_effect=_newBranch) |
| ] |
| |
| for p in patches: |
| p.start() |
| test.addCleanup(p.stop) |
| |
| test.addCleanup(scm.GIT.drop_config_cache) |
| |
| return global_state.items() |