From 78f4dd3138b774dfea9d789d7324b8857f5a1a58 Mon Sep 17 00:00:00 2001 From: Raman Tenneti Date: Mon, 7 Jun 2021 13:27:37 -0700 Subject: [PATCH] superproject: add projects from local manifest to local:: 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 Reviewed-by: Mike Frysinger Reviewed-by: Jonathan Nieder --- docs/manifest-format.md | 3 ++ git_superproject.py | 4 +++ manifest_xml.py | 7 ++++- 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. Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will be loaded in alphabetical order. +Projects from local manifest files are added into +local:: group. + The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported. 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 from git_command import git_require, GitCommand from git_refs import R_HEADS +from manifest_xml import LOCAL_MANIFEST_GROUP_PREFIX _SUPERPROJECT_GIT_NAME = 'superproject.git' _SUPERPROJECT_MANIFEST_NAME = 'superproject_override.xml' @@ -268,6 +269,9 @@ class Superproject(object): path = project.relpath if not path: continue + # Skip the project if it comes from local manifest. + if any(s.startswith(LOCAL_MANIFEST_GROUP_PREFIX) for s in project.groups): + continue commit_id = commit_ids.get(path) if commit_id: 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' LOCAL_MANIFEST_NAME = 'local_manifest.xml' LOCAL_MANIFESTS_DIR_NAME = 'local_manifests' +# Add all projects from local manifest into a group. +LOCAL_MANIFEST_GROUP_PREFIX = 'local:' + # ContactInfo has the self-registered bug url, supplied by the manifest authors. ContactInfo = collections.namedtuple('ContactInfo', 'bugurl') @@ -679,7 +682,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md # Since local manifests are entirely managed by the user, allow # them to point anywhere the user wants. nodes.append(self._ParseManifestXml( - local, self.repodir, restrict_includes=False)) + local, self.repodir, + parent_groups=f'{LOCAL_MANIFEST_GROUP_PREFIX}:{local_file[:-4]}', + restrict_includes=False)) except OSError: pass 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): manifest_path = self._superproject._WriteManfiestFile() self.assertIsNotNone(manifest_path) with open(manifest_path, 'r') as fp: - manifest_xml = fp.read() + manifest_xml_data = fp.read() self.assertEqual( - sort_attributes(manifest_xml), + sort_attributes(manifest_xml_data), '' '' '' @@ -166,9 +166,9 @@ class SuperprojectTestCase(unittest.TestCase): manifest_path = self._superproject.UpdateProjectsRevisionId(projects) self.assertIsNotNone(manifest_path) with open(manifest_path, 'r') as fp: - manifest_xml = fp.read() + manifest_xml_data = fp.read() self.assertEqual( - sort_attributes(manifest_xml), + sort_attributes(manifest_xml_data), '' '' '' @@ -178,6 +178,54 @@ class SuperprojectTestCase(unittest.TestCase): '' '') + def test_superproject_update_project_revision_id_from_local_manifest_group(self): + """Test update of commit ids of a manifest that have local manifest no superproject group.""" + local_group = manifest_xml.LOCAL_MANIFEST_GROUP_PREFIX + ':local' + manifest = self.getXmlManifest(""" + + + + + + + +""") + self.maxDiff = None + self._superproject = git_superproject.Superproject(manifest, self.repodir) + self.assertEqual(len(self._superproject._manifest.projects), 2) + projects = self._superproject._manifest.projects + data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00' + '160000 commit e9d25da64d8d365dbba7c8ee00fe8c4473fe9a06\tbootable/recovery\x00') + with mock.patch.object(self._superproject, '_Init', return_value=True): + with mock.patch.object(self._superproject, '_Fetch', return_value=True): + with mock.patch.object(self._superproject, + '_LsTree', + return_value=data): + # Create temporary directory so that it can write the file. + os.mkdir(self._superproject._superproject_path) + manifest_path = self._superproject.UpdateProjectsRevisionId(projects) + self.assertIsNotNone(manifest_path) + with open(manifest_path, 'r') as fp: + manifest_xml_data = fp.read() + # Verify platform/vendor/x's project revision hasn't changed. + self.assertEqual( + sort_attributes(manifest_xml_data), + '' + '' + '' + '' + '' + '' + '' + '') + if __name__ == '__main__': unittest.main()