mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
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>
This commit is contained in:
parent
fc7aa90623
commit
78f4dd3138
@ -485,6 +485,9 @@ these extra projects.
|
|||||||
Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will
|
Manifest files stored in `$TOP_DIR/.repo/local_manifests/*.xml` will
|
||||||
be loaded in alphabetical order.
|
be loaded in alphabetical order.
|
||||||
|
|
||||||
|
Projects from local manifest files are added into
|
||||||
|
local::<local manifest filename> group.
|
||||||
|
|
||||||
The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported.
|
The legacy `$TOP_DIR/.repo/local_manifest.xml` path is no longer supported.
|
||||||
|
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ import sys
|
|||||||
|
|
||||||
from git_command import git_require, GitCommand
|
from git_command import git_require, GitCommand
|
||||||
from git_refs import R_HEADS
|
from git_refs import R_HEADS
|
||||||
|
from manifest_xml import LOCAL_MANIFEST_GROUP_PREFIX
|
||||||
|
|
||||||
_SUPERPROJECT_GIT_NAME = 'superproject.git'
|
_SUPERPROJECT_GIT_NAME = 'superproject.git'
|
||||||
_SUPERPROJECT_MANIFEST_NAME = 'superproject_override.xml'
|
_SUPERPROJECT_MANIFEST_NAME = 'superproject_override.xml'
|
||||||
@ -268,6 +269,9 @@ class Superproject(object):
|
|||||||
path = project.relpath
|
path = project.relpath
|
||||||
if not path:
|
if not path:
|
||||||
continue
|
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)
|
commit_id = commit_ids.get(path)
|
||||||
if commit_id:
|
if commit_id:
|
||||||
project.SetRevisionId(commit_id)
|
project.SetRevisionId(commit_id)
|
||||||
|
@ -34,6 +34,9 @@ MANIFEST_FILE_NAME = 'manifest.xml'
|
|||||||
LOCAL_MANIFEST_NAME = 'local_manifest.xml'
|
LOCAL_MANIFEST_NAME = 'local_manifest.xml'
|
||||||
LOCAL_MANIFESTS_DIR_NAME = 'local_manifests'
|
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 has the self-registered bug url, supplied by the manifest authors.
|
||||||
ContactInfo = collections.namedtuple('ContactInfo', 'bugurl')
|
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
|
# Since local manifests are entirely managed by the user, allow
|
||||||
# them to point anywhere the user wants.
|
# them to point anywhere the user wants.
|
||||||
nodes.append(self._ParseManifestXml(
|
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:
|
except OSError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -139,9 +139,9 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
manifest_path = self._superproject._WriteManfiestFile()
|
manifest_path = self._superproject._WriteManfiestFile()
|
||||||
self.assertIsNotNone(manifest_path)
|
self.assertIsNotNone(manifest_path)
|
||||||
with open(manifest_path, 'r') as fp:
|
with open(manifest_path, 'r') as fp:
|
||||||
manifest_xml = fp.read()
|
manifest_xml_data = fp.read()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
sort_attributes(manifest_xml),
|
sort_attributes(manifest_xml_data),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote fetch="http://localhost" name="default-remote"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
@ -166,9 +166,9 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
manifest_path = self._superproject.UpdateProjectsRevisionId(projects)
|
manifest_path = self._superproject.UpdateProjectsRevisionId(projects)
|
||||||
self.assertIsNotNone(manifest_path)
|
self.assertIsNotNone(manifest_path)
|
||||||
with open(manifest_path, 'r') as fp:
|
with open(manifest_path, 'r') as fp:
|
||||||
manifest_xml = fp.read()
|
manifest_xml_data = fp.read()
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
sort_attributes(manifest_xml),
|
sort_attributes(manifest_xml_data),
|
||||||
'<?xml version="1.0" ?><manifest>'
|
'<?xml version="1.0" ?><manifest>'
|
||||||
'<remote fetch="http://localhost" name="default-remote"/>'
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
'<default remote="default-remote" revision="refs/heads/main"/>'
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
@ -178,6 +178,54 @@ class SuperprojectTestCase(unittest.TestCase):
|
|||||||
'<superproject name="superproject"/>'
|
'<superproject name="superproject"/>'
|
||||||
'</manifest>')
|
'</manifest>')
|
||||||
|
|
||||||
|
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("""
|
||||||
|
<manifest>
|
||||||
|
<remote name="default-remote" fetch="http://localhost" />
|
||||||
|
<remote name="goog" fetch="http://localhost2" />
|
||||||
|
<default remote="default-remote" revision="refs/heads/main" />
|
||||||
|
<superproject name="superproject"/>
|
||||||
|
<project path="vendor/x" name="platform/vendor/x" remote="goog"
|
||||||
|
groups=\"""" + local_group + """
|
||||||
|
" revision="master-with-vendor" clone-depth="1" />
|
||||||
|
<project path="art" name="platform/art" groups="notdefault,platform-""" + self.platform + """
|
||||||
|
" /></manifest>
|
||||||
|
""")
|
||||||
|
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),
|
||||||
|
'<?xml version="1.0" ?><manifest>'
|
||||||
|
'<remote fetch="http://localhost" name="default-remote"/>'
|
||||||
|
'<remote fetch="http://localhost2" name="goog"/>'
|
||||||
|
'<default remote="default-remote" revision="refs/heads/main"/>'
|
||||||
|
'<project groups="notdefault,platform-' + self.platform + '" '
|
||||||
|
'name="platform/art" path="art" '
|
||||||
|
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>'
|
||||||
|
'<project clone-depth="1" groups="' + local_group + '" '
|
||||||
|
'name="platform/vendor/x" path="vendor/x" remote="goog" '
|
||||||
|
'revision="master-with-vendor"/>'
|
||||||
|
'<superproject name="superproject"/>'
|
||||||
|
'</manifest>')
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
Loading…
Reference in New Issue
Block a user