summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/manifest-format.md3
-rw-r--r--git_superproject.py4
-rw-r--r--manifest_xml.py7
-rw-r--r--tests/test_git_superproject.py56
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.
485Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will 485Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will
486be loaded in alphabetical order. 486be loaded in alphabetical order.
487 487
488Projects from local manifest files are added into
489local::<local manifest filename> group.
490
488The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported. 491The 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
29from git_command import git_require, GitCommand 29from git_command import git_require, GitCommand
30from git_refs import R_HEADS 30from git_refs import R_HEADS
31from 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'
34LOCAL_MANIFEST_NAME = 'local_manifest.xml' 34LOCAL_MANIFEST_NAME = 'local_manifest.xml'
35LOCAL_MANIFESTS_DIR_NAME = 'local_manifests' 35LOCAL_MANIFESTS_DIR_NAME = 'local_manifests'
36 36
37# Add all projects from local manifest into a group.
38LOCAL_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.
38ContactInfo = collections.namedtuple('ContactInfo', 'bugurl') 41ContactInfo = 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
182if __name__ == '__main__': 230if __name__ == '__main__':
183 unittest.main() 231 unittest.main()