diff options
Diffstat (limited to 'tests/endtoend/treebuilder/fakeproject.py')
-rw-r--r-- | tests/endtoend/treebuilder/fakeproject.py | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/tests/endtoend/treebuilder/fakeproject.py b/tests/endtoend/treebuilder/fakeproject.py new file mode 100644 index 0000000..e0a72a9 --- /dev/null +++ b/tests/endtoend/treebuilder/fakeproject.py @@ -0,0 +1,94 @@ +# +# Copyright (C) 2023 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. +# +"""Git repository fakes for use in tests.""" +import textwrap +from pathlib import Path + +from .gitrepo import GitRepo + + +class FakeProject: # pylint: disable=too-few-public-methods + """A collection of git repositories for use in tests. + + This shouldn't be used directly. Use the tree_builder fixture. + + A project contains the three git repos that are used in the Android upstream + mirroring process: + + 1. The true upstream repository. Where the third-party commits their work. + 2. The Android repository. Where Gerrit submits work. + 3. The local repository. This is where work happens before being uploaded to Gerrit. + """ + + def __init__( + self, tree_path: Path, upstream_path: Path, android_mirror_path: Path + ) -> None: + self.local = GitRepo(tree_path) + self.upstream = GitRepo(upstream_path) + self.android_mirror = GitRepo(android_mirror_path) + self._initialize_repo(self.upstream) + + def _initialize_repo(self, repo: GitRepo) -> None: + """Create a git repo and initial commit in the upstream repository.""" + repo.init(branch_name="main") + repo.commit("Initial commit.", allow_empty=True) + + def initial_import(self) -> None: + """Perform the initial import of the upstream repo into the mirror repo. + + These are an approximation of the steps that would be taken for the initial + import as part of go/android3p: + + * A new git repo is created with a single empty commit. That commit is **not** + present in the upstream repo. Android imports begin with unrelated histories. + * The upstream repository is merged into the local tree. + * METADATA, NOTICE, MODULE_LICENSE_*, and OWNERS files are added to the local + tree. We only bother with METADATA for now since that's all the tests need. + """ + self.android_mirror.init() + self.android_mirror.commit("Initial commit.", allow_empty=True) + + upstream_sha = self.upstream.head() + self.android_mirror.fetch(self.upstream) + self.android_mirror.merge( + "FETCH_HEAD", allow_fast_forward=False, allow_unrelated_histories=True + ) + + self.android_mirror.commit( + "Add metadata files.", + update_files={ + "OWNERS": "nobody", + "METADATA": textwrap.dedent( + f"""\ + name: "test" + description: "It's a test." + third_party {{ + license_type: UNENCUMBERED + last_upgrade_date {{ + year: 2023 + month: 12 + day: 1 + }} + identifier {{ + type: "GIT" + value: "{self.upstream.path.as_uri()}" + version: "{upstream_sha}" + }} + }} + """ + ), + }, + ) |