diff options
| author | Raman Tenneti <rtenneti@google.com> | 2021-06-07 13:27:37 -0700 |
|---|---|---|
| committer | Raman Tenneti <rtenneti@google.com> | 2021-06-10 00:16:36 +0000 |
| commit | 78f4dd3138b774dfea9d789d7324b8857f5a1a58 (patch) | |
| tree | 5ca78aed7acc28c17d1d763fc26b7c04a9129983 | |
| parent | fc7aa90623e9dc08d81f1c62232e3e885c64559b (diff) | |
| download | git-repo-78f4dd3138b774dfea9d789d7324b8857f5a1a58.tar.gz | |
superproject: add projects from local manifest to local::<filename> group.
With repo sync --use-superproject, don't update the commit ids of every project
that comes from local manifest.
Tested the code with the following commands.
$ ./run_tests -v
+ Test with local.xml
1. repo init --use-superproject -u persistent-https://googleplex-android.git.corp.google.com/a/platform/manifest
2. cd .repo
cp -r /google/src/head/depot/google3/wireless/android/build_tools/translations/pipeline/local_manifests local_manifests
cd ..
local$ time repo_dev sync --use-superproject
NOTICE: --use-superproject is in beta; report any issues to the address described in `repo version`
.../local/.repo/exp-superproject/feb2c2847da5e274f3d530d5ab438af8-superproject.git: Initial setup for superproject completed.
...
Bug: [google internal] b/189360443
Bug: [google internal] b/189139268
Bug: https://crbug.com/gerrit/14499
Change-Id: Ideaf268c294e9b500b2b9726ffbd733dd8d63004
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/308822
Tested-by: Raman Tenneti <rtenneti@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Reviewed-by: Jonathan Nieder <jrn@google.com>
| -rw-r--r-- | docs/manifest-format.md | 3 | ||||
| -rw-r--r-- | git_superproject.py | 4 | ||||
| -rw-r--r-- | manifest_xml.py | 7 | ||||
| -rw-r--r-- | tests/test_git_superproject.py | 56 |
4 files changed, 65 insertions, 5 deletions
diff --git a/docs/manifest-format.md b/docs/manifest-format.md index 0752a8cd..45fd615e 100644 --- a/docs/manifest-format.md +++ b/docs/manifest-format.md | |||
| @@ -485,6 +485,9 @@ these extra projects. | |||
| 485 | Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will | 485 | Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will |
| 486 | be loaded in alphabetical order. | 486 | be loaded in alphabetical order. |
| 487 | 487 | ||
| 488 | Projects from local manifest files are added into | ||
| 489 | local::<local manifest filename> group. | ||
| 490 | |||
| 488 | The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported. | 491 | The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported. |
| 489 | 492 | ||
| 490 | 493 | ||
diff --git a/git_superproject.py b/git_superproject.py index dad6a3de..3c4144dd 100644 --- a/git_superproject.py +++ b/git_superproject.py | |||
| @@ -28,6 +28,7 @@ import sys | |||
| 28 | 28 | ||
| 29 | from git_command import git_require, GitCommand | 29 | from git_command import git_require, GitCommand |
| 30 | from git_refs import R_HEADS | 30 | from git_refs import R_HEADS |
| 31 | from manifest_xml import LOCAL_MANIFEST_GROUP_PREFIX | ||
| 31 | 32 | ||
| 32 | _SUPERPROJECT_GIT_NAME = 'superproject.git' | 33 | _SUPERPROJECT_GIT_NAME = 'superproject.git' |
| 33 | _SUPERPROJECT_MANIFEST_NAME = 'superproject_override.xml' | 34 | _SUPERPROJECT_MANIFEST_NAME = 'superproject_override.xml' |
| @@ -268,6 +269,9 @@ class Superproject(object): | |||
| 268 | path = project.relpath | 269 | path = project.relpath |
| 269 | if not path: | 270 | if not path: |
| 270 | continue | 271 | continue |
| 272 | # Skip the project if it comes from local manifest. | ||
| 273 | if any(s.startswith(LOCAL_MANIFEST_GROUP_PREFIX) for s in project.groups): | ||
| 274 | continue | ||
| 271 | commit_id = commit_ids.get(path) | 275 | commit_id = commit_ids.get(path) |
| 272 | if commit_id: | 276 | if commit_id: |
| 273 | project.SetRevisionId(commit_id) | 277 | project.SetRevisionId(commit_id) |
diff --git a/manifest_xml.py b/manifest_xml.py index 9cbdcd18..30e96584 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -34,6 +34,9 @@ MANIFEST_FILE_NAME = 'manifest.xml' | |||
| 34 | LOCAL_MANIFEST_NAME = 'local_manifest.xml' | 34 | LOCAL_MANIFEST_NAME = 'local_manifest.xml' |
| 35 | LOCAL_MANIFESTS_DIR_NAME = 'local_manifests' | 35 | LOCAL_MANIFESTS_DIR_NAME = 'local_manifests' |
| 36 | 36 | ||
| 37 | # Add all projects from local manifest into a group. | ||
| 38 | LOCAL_MANIFEST_GROUP_PREFIX = 'local:' | ||
| 39 | |||
| 37 | # ContactInfo has the self-registered bug url, supplied by the manifest authors. | 40 | # ContactInfo has the self-registered bug url, supplied by the manifest authors. |
| 38 | ContactInfo = collections.namedtuple('ContactInfo', 'bugurl') | 41 | ContactInfo = collections.namedtuple('ContactInfo', 'bugurl') |
| 39 | 42 | ||
| @@ -679,7 +682,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md | |||
| 679 | # Since local manifests are entirely managed by the user, allow | 682 | # Since local manifests are entirely managed by the user, allow |
| 680 | # them to point anywhere the user wants. | 683 | # them to point anywhere the user wants. |
| 681 | nodes.append(self._ParseManifestXml( | 684 | nodes.append(self._ParseManifestXml( |
| 682 | local, self.repodir, restrict_includes=False)) | 685 | local, self.repodir, |
| 686 | parent_groups=f'{LOCAL_MANIFEST_GROUP_PREFIX}:{local_file[:-4]}', | ||
| 687 | restrict_includes=False)) | ||
| 683 | except OSError: | 688 | except OSError: |
| 684 | pass | 689 | pass |
| 685 | 690 | ||
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py index 707f7dab..ba61a3d1 100644 --- a/tests/test_git_superproject.py +++ b/tests/test_git_superproject.py | |||
| @@ -139,9 +139,9 @@ class SuperprojectTestCase(unittest.TestCase): | |||
| 139 | manifest_path = self._superproject._WriteManfiestFile() | 139 | manifest_path = self._superproject._WriteManfiestFile() |
| 140 | self.assertIsNotNone(manifest_path) | 140 | self.assertIsNotNone(manifest_path) |
| 141 | with open(manifest_path, 'r') as fp: | 141 | with open(manifest_path, 'r') as fp: |
| 142 | manifest_xml = fp.read() | 142 | manifest_xml_data = fp.read() |
| 143 | self.assertEqual( | 143 | self.assertEqual( |
| 144 | sort_attributes(manifest_xml), | 144 | sort_attributes(manifest_xml_data), |
| 145 | '<?xml version="1.0" ?><manifest>' | 145 | '<?xml version="1.0" ?><manifest>' |
| 146 | '<remote fetch="http://localhost" name="default-remote"/>' | 146 | '<remote fetch="http://localhost" name="default-remote"/>' |
| 147 | '<default remote="default-remote" revision="refs/heads/main"/>' | 147 | '<default remote="default-remote" revision="refs/heads/main"/>' |
| @@ -166,9 +166,9 @@ class SuperprojectTestCase(unittest.TestCase): | |||
| 166 | manifest_path = self._superproject.UpdateProjectsRevisionId(projects) | 166 | manifest_path = self._superproject.UpdateProjectsRevisionId(projects) |
| 167 | self.assertIsNotNone(manifest_path) | 167 | self.assertIsNotNone(manifest_path) |
| 168 | with open(manifest_path, 'r') as fp: | 168 | with open(manifest_path, 'r') as fp: |
| 169 | manifest_xml = fp.read() | 169 | manifest_xml_data = fp.read() |
| 170 | self.assertEqual( | 170 | self.assertEqual( |
| 171 | sort_attributes(manifest_xml), | 171 | sort_attributes(manifest_xml_data), |
| 172 | '<?xml version="1.0" ?><manifest>' | 172 | '<?xml version="1.0" ?><manifest>' |
| 173 | '<remote fetch="http://localhost" name="default-remote"/>' | 173 | '<remote fetch="http://localhost" name="default-remote"/>' |
| 174 | '<default remote="default-remote" revision="refs/heads/main"/>' | 174 | '<default remote="default-remote" revision="refs/heads/main"/>' |
| @@ -178,6 +178,54 @@ class SuperprojectTestCase(unittest.TestCase): | |||
| 178 | '<superproject name="superproject"/>' | 178 | '<superproject name="superproject"/>' |
| 179 | '</manifest>') | 179 | '</manifest>') |
| 180 | 180 | ||
| 181 | def test_superproject_update_project_revision_id_from_local_manifest_group(self): | ||
| 182 | """Test update of commit ids of a manifest that have local manifest no superproject group.""" | ||
| 183 | local_group = manifest_xml.LOCAL_MANIFEST_GROUP_PREFIX + ':local' | ||
| 184 | manifest = self.getXmlManifest(""" | ||
| 185 | <manifest> | ||
| 186 | <remote name="default-remote" fetch="http://localhost" /> | ||
| 187 | <remote name="goog" fetch="http://localhost2" /> | ||
| 188 | <default remote="default-remote" revision="refs/heads/main" /> | ||
| 189 | <superproject name="superproject"/> | ||
| 190 | <project path="vendor/x" name="platform/vendor/x" remote="goog" | ||
| 191 | groups=\"""" + local_group + """ | ||
| 192 | " revision="master-with-vendor" clone-depth="1" /> | ||
| 193 | <project path="art" name="platform/art" groups="notdefault,platform-""" + self.platform + """ | ||
| 194 | " /></manifest> | ||
| 195 | """) | ||
| 196 | self.maxDiff = None | ||
| 197 | self._superproject = git_superproject.Superproject(manifest, self.repodir) | ||
| 198 | self.assertEqual(len(self._superproject._manifest.projects), 2) | ||
| 199 | projects = self._superproject._manifest.projects | ||
| 200 | data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00' | ||
| 201 | '160000 commit e9d25da64d8d365dbba7c8ee00fe8c4473fe9a06\tbootable/recovery\x00') | ||
| 202 | with mock.patch.object(self._superproject, '_Init', return_value=True): | ||
| 203 | with mock.patch.object(self._superproject, '_Fetch', return_value=True): | ||
| 204 | with mock.patch.object(self._superproject, | ||
| 205 | '_LsTree', | ||
| 206 | return_value=data): | ||
| 207 | # Create temporary directory so that it can write the file. | ||
| 208 | os.mkdir(self._superproject._superproject_path) | ||
| 209 | manifest_path = self._superproject.UpdateProjectsRevisionId(projects) | ||
| 210 | self.assertIsNotNone(manifest_path) | ||
| 211 | with open(manifest_path, 'r') as fp: | ||
| 212 | manifest_xml_data = fp.read() | ||
| 213 | # Verify platform/vendor/x's project revision hasn't changed. | ||
| 214 | self.assertEqual( | ||
| 215 | sort_attributes(manifest_xml_data), | ||
| 216 | '<?xml version="1.0" ?><manifest>' | ||
| 217 | '<remote fetch="http://localhost" name="default-remote"/>' | ||
| 218 | '<remote fetch="http://localhost2" name="goog"/>' | ||
| 219 | '<default remote="default-remote" revision="refs/heads/main"/>' | ||
| 220 | '<project groups="notdefault,platform-' + self.platform + '" ' | ||
| 221 | 'name="platform/art" path="art" ' | ||
| 222 | 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>' | ||
| 223 | '<project clone-depth="1" groups="' + local_group + '" ' | ||
| 224 | 'name="platform/vendor/x" path="vendor/x" remote="goog" ' | ||
| 225 | 'revision="master-with-vendor"/>' | ||
| 226 | '<superproject name="superproject"/>' | ||
| 227 | '</manifest>') | ||
| 228 | |||
| 181 | 229 | ||
| 182 | if __name__ == '__main__': | 230 | if __name__ == '__main__': |
| 183 | unittest.main() | 231 | unittest.main() |
