superproject: pass groups to ToXml method.

Added the following methods to XmlManifest class.
+ GetDefaultGroupsStr() - return 'default,platform-' + platform.system().lower()
+ GetGroupsStr() - Same as gitc_utils.py's _manifest_groups func.

+ Replaced gitc_utils.py's_manifest_groups calls with GetGroupsStr.
+ Used the above methods to get groups in command.py::GetProjects
  and part of init.py.

TODO: clean up these funcs to take structured group data more instead
      of passing strings around everywhere that need parsing.

Tested the code with the following commands.

$ ./run_tests -v

Tested the sync code by using repo_dev alias and pointing to this CL
and verified prebuilts/fullsdk-linux directory has all the folders.

Tested repo init and repo sync with --use-superproject and without
--use-superproject argument.

$ repo_dev init -u sso://android.git.corp.google.com/platform/manifest -b androidx-main  --partial-clone --clone-filter=blob:limit=10M --repo-rev=main --use-superproject

$ repo_dev sync -c -j32

Bug: [google internal] b/181804931
Bug: https://crbug.com/gerrit/13707
Change-Id: Ia98585cbfa3a1449710655af55d56241794242b6
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/299422
Reviewed-by: Jonathan Nieder <jrn@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Raman Tenneti <rtenneti@google.com>
This commit is contained in:
Raman Tenneti 2021-03-09 15:19:06 -08:00
parent 9888accb0c
commit 080877e413
7 changed files with 31 additions and 27 deletions

View File

@ -178,9 +178,7 @@ class Command(object):
mp = manifest.manifestProject mp = manifest.manifestProject
if not groups: if not groups:
groups = mp.config.GetString('manifest.groups') groups = manifest.GetGroupsStr()
if not groups:
groups = 'default,platform-' + platform.system().lower()
groups = [x for x in re.split(r'[,\s]+', groups) if x] groups = [x for x in re.split(r'[,\s]+', groups) if x]
if not args: if not args:

View File

@ -235,7 +235,7 @@ class Superproject(object):
self._superproject_path, self._superproject_path,
file=sys.stderr) file=sys.stderr)
return None return None
manifest_str = self._manifest.ToXml().toxml() manifest_str = self._manifest.ToXml(groups=self._manifest.GetGroupsStr()).toxml()
manifest_path = self._manifest_path manifest_path = self._manifest_path
try: try:
with open(manifest_path, 'w', encoding='utf-8') as fp: with open(manifest_path, 'w', encoding='utf-8') as fp:

View File

@ -77,22 +77,6 @@ def _set_project_revisions(projects):
project.revisionExpr = revisionExpr project.revisionExpr = revisionExpr
def _manifest_groups(manifest):
"""Returns the manifest group string that should be synced
This is the same logic used by Command.GetProjects(), which is used during
repo sync
Args:
manifest: The XmlManifest object
"""
mp = manifest.manifestProject
groups = mp.config.GetString('manifest.groups')
if not groups:
groups = 'default,platform-' + platform.system().lower()
return groups
def generate_gitc_manifest(gitc_manifest, manifest, paths=None): def generate_gitc_manifest(gitc_manifest, manifest, paths=None):
"""Generate a manifest for shafsd to use for this GITC client. """Generate a manifest for shafsd to use for this GITC client.
@ -107,7 +91,7 @@ def generate_gitc_manifest(gitc_manifest, manifest, paths=None):
if paths is None: if paths is None:
paths = list(manifest.paths.keys()) paths = list(manifest.paths.keys())
groups = [x for x in re.split(r'[,\s]+', _manifest_groups(manifest)) if x] groups = [x for x in re.split(r'[,\s]+', manifest.GetGroupsStr()) if x]
# Convert the paths to projects, and filter them to the matched groups. # Convert the paths to projects, and filter them to the matched groups.
projects = [manifest.paths[p] for p in paths] projects = [manifest.paths[p] for p in paths]
@ -166,7 +150,7 @@ def save_manifest(manifest, client_dir=None):
else: else:
manifest_file = os.path.join(client_dir, '.manifest') manifest_file = os.path.join(client_dir, '.manifest')
with open(manifest_file, 'w') as f: with open(manifest_file, 'w') as f:
manifest.Save(f, groups=_manifest_groups(manifest)) manifest.Save(f, groups=manifest.GetGroupsStr())
# TODO(sbasi/jorg): Come up with a solution to remove the sleep below. # TODO(sbasi/jorg): Come up with a solution to remove the sleep below.
# Give the GITC filesystem time to register the manifest changes. # Give the GITC filesystem time to register the manifest changes.
time.sleep(3) time.sleep(3)

View File

@ -14,6 +14,7 @@
import itertools import itertools
import os import os
import platform
import re import re
import sys import sys
import xml.dom.minidom import xml.dom.minidom
@ -604,6 +605,17 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
def HasSubmodules(self): def HasSubmodules(self):
return self.manifestProject.config.GetBoolean('repo.submodules') return self.manifestProject.config.GetBoolean('repo.submodules')
def GetDefaultGroupsStr(self):
"""Returns the default group string for the platform."""
return 'default,platform-' + platform.system().lower()
def GetGroupsStr(self):
"""Returns the manifest group string that should be synced."""
groups = self.manifestProject.config.GetString('manifest.groups')
if not groups:
groups = self.GetDefaultGroupsStr()
return groups
def _Unload(self): def _Unload(self):
self._loaded = False self._loaded = False
self._projects = {} self._projects = {}

View File

@ -267,7 +267,7 @@ to update the working directory files.
groups = [x for x in groups if x] groups = [x for x in groups if x]
groupstr = ','.join(groups) groupstr = ','.join(groups)
if opt.platform == 'auto' and groupstr == 'default,platform-' + platform.system().lower(): if opt.platform == 'auto' and groupstr == self.manifest.GetDefaultGroupsStr():
groupstr = None groupstr = None
m.config.SetString('manifest.groups', groupstr) m.config.SetString('manifest.groups', groupstr)

View File

@ -15,6 +15,7 @@
"""Unittests for the git_superproject.py module.""" """Unittests for the git_superproject.py module."""
import os import os
import platform
import tempfile import tempfile
import unittest import unittest
from unittest import mock from unittest import mock
@ -34,6 +35,7 @@ class SuperprojectTestCase(unittest.TestCase):
self.manifest_file = os.path.join( self.manifest_file = os.path.join(
self.repodir, manifest_xml.MANIFEST_FILE_NAME) self.repodir, manifest_xml.MANIFEST_FILE_NAME)
os.mkdir(self.repodir) os.mkdir(self.repodir)
self.platform = platform.system().lower()
# The manifest parsing really wants a git repo currently. # The manifest parsing really wants a git repo currently.
gitdir = os.path.join(self.repodir, 'manifests.git') gitdir = os.path.join(self.repodir, 'manifests.git')
@ -48,8 +50,8 @@ class SuperprojectTestCase(unittest.TestCase):
<remote name="default-remote" fetch="http://localhost" /> <remote name="default-remote" fetch="http://localhost" />
<default remote="default-remote" revision="refs/heads/main" /> <default remote="default-remote" revision="refs/heads/main" />
<superproject name="superproject"/> <superproject name="superproject"/>
<project path="art" name="platform/art" /> <project path="art" name="platform/art" groups="notdefault,platform-""" + self.platform + """
</manifest> " /></manifest>
""") """)
self._superproject = git_superproject.Superproject(manifest, self.repodir) self._superproject = git_superproject.Superproject(manifest, self.repodir)
@ -142,7 +144,8 @@ class SuperprojectTestCase(unittest.TestCase):
'<?xml version="1.0" ?><manifest>' + '<?xml version="1.0" ?><manifest>' +
'<remote name="default-remote" fetch="http://localhost"/>' + '<remote name="default-remote" fetch="http://localhost"/>' +
'<default remote="default-remote" revision="refs/heads/main"/>' + '<default remote="default-remote" revision="refs/heads/main"/>' +
'<project name="platform/art" path="art" revision="ABCDEF"/>' + '<project name="platform/art" path="art" revision="ABCDEF" ' +
'groups="notdefault,platform-' + self.platform + '"/>' +
'<superproject name="superproject"/>' + '<superproject name="superproject"/>' +
'</manifest>') '</manifest>')
@ -169,7 +172,8 @@ class SuperprojectTestCase(unittest.TestCase):
'<remote name="default-remote" fetch="http://localhost"/>' + '<remote name="default-remote" fetch="http://localhost"/>' +
'<default remote="default-remote" revision="refs/heads/main"/>' + '<default remote="default-remote" revision="refs/heads/main"/>' +
'<project name="platform/art" path="art" ' + '<project name="platform/art" path="art" ' +
'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea"/>' + 'revision="2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea" ' +
'groups="notdefault,platform-' + self.platform + '"/>' +
'<superproject name="superproject"/>' + '<superproject name="superproject"/>' +
'</manifest>') '</manifest>')

View File

@ -15,6 +15,7 @@
"""Unittests for the manifest_xml.py module.""" """Unittests for the manifest_xml.py module."""
import os import os
import platform
import shutil import shutil
import tempfile import tempfile
import unittest import unittest
@ -377,6 +378,11 @@ class ProjectElementTests(ManifestParseTestCase):
self.assertCountEqual( self.assertCountEqual(
result['extras'], result['extras'],
['g1', 'g2', 'g1', 'name:extras', 'all', 'path:path']) ['g1', 'g2', 'g1', 'name:extras', 'all', 'path:path'])
groupstr = 'default,platform-' + platform.system().lower()
self.assertEqual(groupstr, manifest.GetGroupsStr())
groupstr = 'g1,g2,g1'
manifest.manifestProject.config.SetString('manifest.groups', groupstr)
self.assertEqual(groupstr, manifest.GetGroupsStr())
def test_set_revision_id(self): def test_set_revision_id(self):
"""Check setting of project's revisionId.""" """Check setting of project's revisionId."""