summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaMont Jones <lamontjones@google.com>2022-04-07 18:14:46 +0000
committerLaMont Jones <lamontjones@google.com>2022-04-12 15:46:23 +0000
commitd56e2eb4216827284220fcc35af42e60b4faaea6 (patch)
tree886d25de764ce3abe6978b639d1a715e2e7b6277
parentd52ca421d52c75837d1614ec54549569f354b7ec (diff)
downloadgit-repo-2.23.tar.gz
manifest_xml: use Superproject to hold XML contentv2.23
Always create Superproject when there is a <superproject> tag, and have it hold the XML content, similar to how other manifest elements are handled. This also adds SetQuiet and SetPrintMessages to Superproject consistent with manifest.SetUseLocalManifests. Change-Id: I522bf3da542006575799f0640c67f7052704f266 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/334641 Reviewed-by: Mike Frysinger <vapier@google.com> Reviewed-by: Raman Tenneti <rtenneti@google.com> Tested-by: LaMont Jones <lamontjones@google.com>
-rw-r--r--git_superproject.py69
-rw-r--r--manifest_xml.py47
-rw-r--r--project.py1
-rw-r--r--subcmds/init.py1
-rw-r--r--subcmds/sync.py11
-rw-r--r--tests/test_git_superproject.py63
-rw-r--r--tests/test_manifest_xml.py50
7 files changed, 125 insertions, 117 deletions
diff --git a/git_superproject.py b/git_superproject.py
index f4dbb27b..9f585e5d 100644
--- a/git_superproject.py
+++ b/git_superproject.py
@@ -71,42 +71,50 @@ class Superproject(object):
71 lookup of commit ids for all projects. It contains _project_commit_ids which 71 lookup of commit ids for all projects. It contains _project_commit_ids which
72 is a dictionary with project/commit id entries. 72 is a dictionary with project/commit id entries.
73 """ 73 """
74 def __init__(self, manifest, repodir, git_event_log, 74 def __init__(self, manifest, name, remote, revision,
75 superproject_dir='exp-superproject', quiet=False, print_messages=False): 75 superproject_dir='exp-superproject'):
76 """Initializes superproject. 76 """Initializes superproject.
77 77
78 Args: 78 Args:
79 manifest: A Manifest object that is to be written to a file. 79 manifest: A Manifest object that is to be written to a file.
80 repodir: Path to the .repo/ dir for holding all internal checkout state. 80 name: The unique name of the superproject
81 It must be in the top directory of the repo client checkout. 81 remote: The RemoteSpec for the remote.
82 git_event_log: A git trace2 event log to log events. 82 revision: The name of the git branch to track.
83 superproject_dir: Relative path under |repodir| to checkout superproject. 83 superproject_dir: Relative path under |manifest.subdir| to checkout
84 quiet: If True then only print the progress messages. 84 superproject.
85 print_messages: if True then print error/warning messages.
86 """ 85 """
87 self._project_commit_ids = None 86 self._project_commit_ids = None
88 self._manifest = manifest 87 self._manifest = manifest
89 self._git_event_log = git_event_log 88 self.name = name
90 self._quiet = quiet 89 self.remote = remote
91 self._print_messages = print_messages 90 self.revision = self._branch = revision
92 self._branch = manifest.branch 91 self._repodir = manifest.repodir
93 self._repodir = os.path.abspath(repodir)
94 self._superproject_dir = superproject_dir 92 self._superproject_dir = superproject_dir
95 self._superproject_path = manifest.SubmanifestInfoDir(manifest.path_prefix, 93 self._superproject_path = manifest.SubmanifestInfoDir(manifest.path_prefix,
96 superproject_dir) 94 superproject_dir)
97 self._manifest_path = os.path.join(self._superproject_path, 95 self._manifest_path = os.path.join(self._superproject_path,
98 _SUPERPROJECT_MANIFEST_NAME) 96 _SUPERPROJECT_MANIFEST_NAME)
99 git_name = '' 97 git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-'
100 if self._manifest.superproject: 98 self._remote_url = remote.url
101 remote = self._manifest.superproject['remote']
102 git_name = hashlib.md5(remote.name.encode('utf8')).hexdigest() + '-'
103 self._branch = self._manifest.superproject['revision']
104 self._remote_url = remote.url
105 else:
106 self._remote_url = None
107 self._work_git_name = git_name + _SUPERPROJECT_GIT_NAME 99 self._work_git_name = git_name + _SUPERPROJECT_GIT_NAME
108 self._work_git = os.path.join(self._superproject_path, self._work_git_name) 100 self._work_git = os.path.join(self._superproject_path, self._work_git_name)
109 101
102 # The following are command arguemnts, rather then superproject attributes,
103 # and where included here originally. They should eventually become
104 # arguments that are passed down from the public methods, instead of being
105 # treated as attributes.
106 self._git_event_log = None
107 self._quiet = False
108 self._print_messages = False
109
110 def SetQuiet(self, value):
111 """Set the _quiet attribute."""
112 self._quiet = value
113
114 def SetPrintMessages(self, value):
115 """Set the _print_messages attribute."""
116 self._print_messages = value
117
110 @property 118 @property
111 def project_commit_ids(self): 119 def project_commit_ids(self):
112 """Returns a dictionary of projects and their commit ids.""" 120 """Returns a dictionary of projects and their commit ids."""
@@ -215,12 +223,16 @@ class Superproject(object):
215 f'return code: {retval}, stderr: {p.stderr}') 223 f'return code: {retval}, stderr: {p.stderr}')
216 return data 224 return data
217 225
218 def Sync(self): 226 def Sync(self, git_event_log):
219 """Gets a local copy of a superproject for the manifest. 227 """Gets a local copy of a superproject for the manifest.
220 228
229 Args:
230 git_event_log: an EventLog, for git tracing.
231
221 Returns: 232 Returns:
222 SyncResult 233 SyncResult
223 """ 234 """
235 self._git_event_log = git_event_log
224 if not self._manifest.superproject: 236 if not self._manifest.superproject:
225 self._LogWarning(f'superproject tag is not defined in manifest: ' 237 self._LogWarning(f'superproject tag is not defined in manifest: '
226 f'{self._manifest.manifestFile}') 238 f'{self._manifest.manifestFile}')
@@ -248,7 +260,7 @@ class Superproject(object):
248 Returns: 260 Returns:
249 CommitIdsResult 261 CommitIdsResult
250 """ 262 """
251 sync_result = self.Sync() 263 sync_result = self.Sync(self._git_event_log)
252 if not sync_result.success: 264 if not sync_result.success:
253 return CommitIdsResult(None, sync_result.fatal) 265 return CommitIdsResult(None, sync_result.fatal)
254 266
@@ -313,7 +325,7 @@ class Superproject(object):
313 # Skip the project if it comes from the local manifest. 325 # Skip the project if it comes from the local manifest.
314 return project.manifest.IsFromLocalManifest(project) 326 return project.manifest.IsFromLocalManifest(project)
315 327
316 def UpdateProjectsRevisionId(self, projects): 328 def UpdateProjectsRevisionId(self, projects, git_event_log):
317 """Update revisionId of every project in projects with the commit id. 329 """Update revisionId of every project in projects with the commit id.
318 330
319 Args: 331 Args:
@@ -322,6 +334,7 @@ class Superproject(object):
322 Returns: 334 Returns:
323 UpdateProjectsResult 335 UpdateProjectsResult
324 """ 336 """
337 self._git_event_log = git_event_log
325 commit_ids_result = self._GetAllProjectsCommitIds() 338 commit_ids_result = self._GetAllProjectsCommitIds()
326 commit_ids = commit_ids_result.commit_ids 339 commit_ids = commit_ids_result.commit_ids
327 if not commit_ids: 340 if not commit_ids:
@@ -397,7 +410,7 @@ def _UseSuperprojectFromConfiguration():
397 410
398def PrintMessages(opt, manifest): 411def PrintMessages(opt, manifest):
399 """Returns a boolean if error/warning messages are to be printed.""" 412 """Returns a boolean if error/warning messages are to be printed."""
400 return opt.use_superproject is not None or manifest.superproject 413 return opt.use_superproject is not None or bool(manifest.superproject)
401 414
402 415
403def UseSuperproject(opt, manifest): 416def UseSuperproject(opt, manifest):
@@ -409,7 +422,7 @@ def UseSuperproject(opt, manifest):
409 client_value = manifest.manifestProject.use_superproject 422 client_value = manifest.manifestProject.use_superproject
410 if client_value is not None: 423 if client_value is not None:
411 return client_value 424 return client_value
412 else: 425 elif manifest.superproject:
413 if not manifest.superproject:
414 return False
415 return _UseSuperprojectFromConfiguration() 426 return _UseSuperprojectFromConfiguration()
427 else:
428 return False
diff --git a/manifest_xml.py b/manifest_xml.py
index 8718dc54..7d19d63e 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -24,6 +24,7 @@ import urllib.parse
24import gitc_utils 24import gitc_utils
25from git_config import GitConfig, IsId 25from git_config import GitConfig, IsId
26from git_refs import R_HEADS, HEAD 26from git_refs import R_HEADS, HEAD
27from git_superproject import Superproject
27import platform_utils 28import platform_utils
28from project import (Annotation, RemoteSpec, Project, RepoProject, 29from project import (Annotation, RemoteSpec, Project, RepoProject,
29 ManifestProject) 30 ManifestProject)
@@ -670,17 +671,17 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
670 if self._superproject: 671 if self._superproject:
671 root.appendChild(doc.createTextNode('')) 672 root.appendChild(doc.createTextNode(''))
672 e = doc.createElement('superproject') 673 e = doc.createElement('superproject')
673 e.setAttribute('name', self._superproject['name']) 674 e.setAttribute('name', self._superproject.name)
674 remoteName = None 675 remoteName = None
675 if d.remote: 676 if d.remote:
676 remoteName = d.remote.name 677 remoteName = d.remote.name
677 remote = self._superproject.get('remote') 678 remote = self._superproject.remote
678 if not d.remote or remote.orig_name != remoteName: 679 if not d.remote or remote.orig_name != remoteName:
679 remoteName = remote.orig_name 680 remoteName = remote.orig_name
680 e.setAttribute('remote', remoteName) 681 e.setAttribute('remote', remoteName)
681 revision = remote.revision or d.revisionExpr 682 revision = remote.revision or d.revisionExpr
682 if not revision or revision != self._superproject['revision']: 683 if not revision or revision != self._superproject.revision:
683 e.setAttribute('revision', self._superproject['revision']) 684 e.setAttribute('revision', self._superproject.revision)
684 root.appendChild(e) 685 root.appendChild(e)
685 686
686 if self._contactinfo.bugurl != Wrapper().BUG_URL: 687 if self._contactinfo.bugurl != Wrapper().BUG_URL:
@@ -984,7 +985,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
984 self._default = None 985 self._default = None
985 self._submanifests = {} 986 self._submanifests = {}
986 self._repo_hooks_project = None 987 self._repo_hooks_project = None
987 self._superproject = {} 988 self._superproject = None
988 self._contactinfo = ContactInfo(Wrapper().BUG_URL) 989 self._contactinfo = ContactInfo(Wrapper().BUG_URL)
989 self._notice = None 990 self._notice = None
990 self.branch = None 991 self.branch = None
@@ -1052,20 +1053,19 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1052 1053
1053 # Now that we have loaded this manifest, load any submanifest manifests 1054 # Now that we have loaded this manifest, load any submanifest manifests
1054 # as well. We need to do this after self._loaded is set to avoid looping. 1055 # as well. We need to do this after self._loaded is set to avoid looping.
1055 if self._outer_client: 1056 for name in self._submanifests:
1056 for name in self._submanifests: 1057 tree = self._submanifests[name]
1057 tree = self._submanifests[name] 1058 spec = tree.ToSubmanifestSpec(self)
1058 spec = tree.ToSubmanifestSpec(self) 1059 present = os.path.exists(os.path.join(self.subdir, MANIFEST_FILE_NAME))
1059 present = os.path.exists(os.path.join(self.subdir, MANIFEST_FILE_NAME)) 1060 if present and tree.present and not tree.repo_client:
1060 if present and tree.present and not tree.repo_client: 1061 if initial_client and initial_client.topdir == self.topdir:
1061 if initial_client and initial_client.topdir == self.topdir: 1062 tree.repo_client = self
1062 tree.repo_client = self 1063 tree.present = present
1063 tree.present = present 1064 elif not os.path.exists(self.subdir):
1064 elif not os.path.exists(self.subdir): 1065 tree.present = False
1065 tree.present = False 1066 if present and tree.present:
1066 if present and tree.present: 1067 tree.repo_client._Load(initial_client=initial_client,
1067 tree.repo_client._Load(initial_client=initial_client, 1068 submanifest_depth=submanifest_depth + 1)
1068 submanifest_depth=submanifest_depth + 1)
1069 1069
1070 def _ParseManifestXml(self, path, include_root, parent_groups='', 1070 def _ParseManifestXml(self, path, include_root, parent_groups='',
1071 restrict_includes=True): 1071 restrict_includes=True):
@@ -1267,11 +1267,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1267 if node.nodeName == 'superproject': 1267 if node.nodeName == 'superproject':
1268 name = self._reqatt(node, 'name') 1268 name = self._reqatt(node, 'name')
1269 # There can only be one superproject. 1269 # There can only be one superproject.
1270 if self._superproject.get('name'): 1270 if self._superproject:
1271 raise ManifestParseError( 1271 raise ManifestParseError(
1272 'duplicate superproject in %s' % 1272 'duplicate superproject in %s' %
1273 (self.manifestFile)) 1273 (self.manifestFile))
1274 self._superproject['name'] = name
1275 remote_name = node.getAttribute('remote') 1274 remote_name = node.getAttribute('remote')
1276 if not remote_name: 1275 if not remote_name:
1277 remote = self._default.remote 1276 remote = self._default.remote
@@ -1280,14 +1279,16 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1280 if remote is None: 1279 if remote is None:
1281 raise ManifestParseError("no remote for superproject %s within %s" % 1280 raise ManifestParseError("no remote for superproject %s within %s" %
1282 (name, self.manifestFile)) 1281 (name, self.manifestFile))
1283 self._superproject['remote'] = remote.ToRemoteSpec(name)
1284 revision = node.getAttribute('revision') or remote.revision 1282 revision = node.getAttribute('revision') or remote.revision
1285 if not revision: 1283 if not revision:
1286 revision = self._default.revisionExpr 1284 revision = self._default.revisionExpr
1287 if not revision: 1285 if not revision:
1288 raise ManifestParseError('no revision for superproject %s within %s' % 1286 raise ManifestParseError('no revision for superproject %s within %s' %
1289 (name, self.manifestFile)) 1287 (name, self.manifestFile))
1290 self._superproject['revision'] = revision 1288 self._superproject = Superproject(self,
1289 name=name,
1290 remote=remote.ToRemoteSpec(name),
1291 revision=revision)
1291 if node.nodeName == 'contactinfo': 1292 if node.nodeName == 'contactinfo':
1292 bugurl = self._reqatt(node, 'bugurl') 1293 bugurl = self._reqatt(node, 'bugurl')
1293 # This element can be repeated, later entries will clobber earlier ones. 1294 # This element can be repeated, later entries will clobber earlier ones.
diff --git a/project.py b/project.py
index b8d834aa..5ed103b9 100644
--- a/project.py
+++ b/project.py
@@ -36,7 +36,6 @@ from git_trace2_event_log import EventLog
36from error import GitError, UploadError, DownloadError 36from error import GitError, UploadError, DownloadError
37from error import ManifestInvalidRevisionError, ManifestInvalidPathError 37from error import ManifestInvalidRevisionError, ManifestInvalidPathError
38from error import NoManifestException, ManifestParseError 38from error import NoManifestException, ManifestParseError
39from git_superproject import Superproject
40import platform_utils 39import platform_utils
41import progress 40import progress
42from repo_trace import IsTrace, Trace 41from repo_trace import IsTrace, Trace
diff --git a/subcmds/init.py b/subcmds/init.py
index 65b63efd..99f30dce 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -25,7 +25,6 @@ from project import SyncBuffer
25from git_config import GitConfig 25from git_config import GitConfig
26from git_command import git_require, MIN_GIT_VERSION_SOFT, MIN_GIT_VERSION_HARD 26from git_command import git_require, MIN_GIT_VERSION_SOFT, MIN_GIT_VERSION_HARD
27import fetch 27import fetch
28import git_superproject
29import platform_utils 28import platform_utils
30from wrapper import Wrapper 29from wrapper import Wrapper
31 30
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 9e783205..4d0a5ec6 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -304,12 +304,10 @@ later is required to fix a server side protocol bug.
304 Returns: 304 Returns:
305 Returns path to the overriding manifest file instead of None. 305 Returns path to the overriding manifest file instead of None.
306 """ 306 """
307 superproject = self.manifest.superproject
308 superproject.SetQuiet(opt.quiet)
307 print_messages = git_superproject.PrintMessages(opt, self.manifest) 309 print_messages = git_superproject.PrintMessages(opt, self.manifest)
308 superproject = git_superproject.Superproject(self.manifest, 310 superproject.SetPrintMessages(print_messages)
309 self.repodir,
310 self.git_event_log,
311 quiet=opt.quiet,
312 print_messages=print_messages)
313 if opt.local_only: 311 if opt.local_only:
314 manifest_path = superproject.manifest_path 312 manifest_path = superproject.manifest_path
315 if manifest_path: 313 if manifest_path:
@@ -319,7 +317,8 @@ later is required to fix a server side protocol bug.
319 all_projects = self.GetProjects(args, 317 all_projects = self.GetProjects(args,
320 missing_ok=True, 318 missing_ok=True,
321 submodules_ok=opt.fetch_submodules) 319 submodules_ok=opt.fetch_submodules)
322 update_result = superproject.UpdateProjectsRevisionId(all_projects) 320 update_result = superproject.UpdateProjectsRevisionId(
321 all_projects, git_event_log=self.git_event_log)
323 manifest_path = update_result.manifest_path 322 manifest_path = update_result.manifest_path
324 superproject_logging_data['updatedrevisionid'] = bool(manifest_path) 323 superproject_logging_data['updatedrevisionid'] = bool(manifest_path)
325 if manifest_path: 324 if manifest_path:
diff --git a/tests/test_git_superproject.py b/tests/test_git_superproject.py
index a24fc7f0..1e7b1201 100644
--- a/tests/test_git_superproject.py
+++ b/tests/test_git_superproject.py
@@ -68,8 +68,10 @@ class SuperprojectTestCase(unittest.TestCase):
68 <project path="art" name="platform/art" groups="notdefault,platform-""" + self.platform + """ 68 <project path="art" name="platform/art" groups="notdefault,platform-""" + self.platform + """
69 " /></manifest> 69 " /></manifest>
70""") 70""")
71 self._superproject = git_superproject.Superproject(manifest, self.repodir, 71 self._superproject = git_superproject.Superproject(
72 self.git_event_log) 72 manifest, name='superproject',
73 remote=manifest.remotes.get('default-remote').ToRemoteSpec('superproject'),
74 revision='refs/heads/main')
73 75
74 def tearDown(self): 76 def tearDown(self):
75 """Tear down superproject every time.""" 77 """Tear down superproject every time."""
@@ -125,12 +127,7 @@ class SuperprojectTestCase(unittest.TestCase):
125<manifest> 127<manifest>
126</manifest> 128</manifest>
127""") 129""")
128 superproject = git_superproject.Superproject(manifest, self.repodir, self.git_event_log) 130 self.assertIsNone(manifest.superproject)
129 # Test that exit condition is false when there is no superproject tag.
130 sync_result = superproject.Sync()
131 self.assertFalse(sync_result.success)
132 self.assertFalse(sync_result.fatal)
133 self.verifyErrorEvent()
134 131
135 def test_superproject_get_superproject_invalid_url(self): 132 def test_superproject_get_superproject_invalid_url(self):
136 """Test with an invalid url.""" 133 """Test with an invalid url."""
@@ -141,8 +138,11 @@ class SuperprojectTestCase(unittest.TestCase):
141 <superproject name="superproject"/> 138 <superproject name="superproject"/>
142</manifest> 139</manifest>
143""") 140""")
144 superproject = git_superproject.Superproject(manifest, self.repodir, self.git_event_log) 141 superproject = git_superproject.Superproject(
145 sync_result = superproject.Sync() 142 manifest, name='superproject',
143 remote=manifest.remotes.get('test-remote').ToRemoteSpec('superproject'),
144 revision='refs/heads/main')
145 sync_result = superproject.Sync(self.git_event_log)
146 self.assertFalse(sync_result.success) 146 self.assertFalse(sync_result.success)
147 self.assertTrue(sync_result.fatal) 147 self.assertTrue(sync_result.fatal)
148 148
@@ -155,17 +155,19 @@ class SuperprojectTestCase(unittest.TestCase):
155 <superproject name="superproject"/> 155 <superproject name="superproject"/>
156</manifest> 156</manifest>
157""") 157""")
158 self._superproject = git_superproject.Superproject(manifest, self.repodir, 158 self._superproject = git_superproject.Superproject(
159 self.git_event_log) 159 manifest, name='superproject',
160 remote=manifest.remotes.get('test-remote').ToRemoteSpec('superproject'),
161 revision='refs/heads/main')
160 with mock.patch.object(self._superproject, '_branch', 'junk'): 162 with mock.patch.object(self._superproject, '_branch', 'junk'):
161 sync_result = self._superproject.Sync() 163 sync_result = self._superproject.Sync(self.git_event_log)
162 self.assertFalse(sync_result.success) 164 self.assertFalse(sync_result.success)
163 self.assertTrue(sync_result.fatal) 165 self.assertTrue(sync_result.fatal)
164 166
165 def test_superproject_get_superproject_mock_init(self): 167 def test_superproject_get_superproject_mock_init(self):
166 """Test with _Init failing.""" 168 """Test with _Init failing."""
167 with mock.patch.object(self._superproject, '_Init', return_value=False): 169 with mock.patch.object(self._superproject, '_Init', return_value=False):
168 sync_result = self._superproject.Sync() 170 sync_result = self._superproject.Sync(self.git_event_log)
169 self.assertFalse(sync_result.success) 171 self.assertFalse(sync_result.success)
170 self.assertTrue(sync_result.fatal) 172 self.assertTrue(sync_result.fatal)
171 173
@@ -174,7 +176,7 @@ class SuperprojectTestCase(unittest.TestCase):
174 with mock.patch.object(self._superproject, '_Init', return_value=True): 176 with mock.patch.object(self._superproject, '_Init', return_value=True):
175 os.mkdir(self._superproject._superproject_path) 177 os.mkdir(self._superproject._superproject_path)
176 with mock.patch.object(self._superproject, '_Fetch', return_value=False): 178 with mock.patch.object(self._superproject, '_Fetch', return_value=False):
177 sync_result = self._superproject.Sync() 179 sync_result = self._superproject.Sync(self.git_event_log)
178 self.assertFalse(sync_result.success) 180 self.assertFalse(sync_result.success)
179 self.assertTrue(sync_result.fatal) 181 self.assertTrue(sync_result.fatal)
180 182
@@ -230,7 +232,7 @@ class SuperprojectTestCase(unittest.TestCase):
230 return_value=data): 232 return_value=data):
231 # Create temporary directory so that it can write the file. 233 # Create temporary directory so that it can write the file.
232 os.mkdir(self._superproject._superproject_path) 234 os.mkdir(self._superproject._superproject_path)
233 update_result = self._superproject.UpdateProjectsRevisionId(projects) 235 update_result = self._superproject.UpdateProjectsRevisionId(projects, self.git_event_log)
234 self.assertIsNotNone(update_result.manifest_path) 236 self.assertIsNotNone(update_result.manifest_path)
235 self.assertFalse(update_result.fatal) 237 self.assertFalse(update_result.fatal)
236 with open(update_result.manifest_path, 'r') as fp: 238 with open(update_result.manifest_path, 'r') as fp:
@@ -256,22 +258,13 @@ class SuperprojectTestCase(unittest.TestCase):
256</manifest> 258</manifest>
257""") 259""")
258 self.maxDiff = None 260 self.maxDiff = None
259 self._superproject = git_superproject.Superproject(manifest, self.repodir, 261 self.assertIsNone(manifest.superproject)
260 self.git_event_log)
261 self.assertEqual(len(self._superproject._manifest.projects), 1)
262 projects = self._superproject._manifest.projects
263 project = projects[0]
264 project.SetRevisionId('ABCDEF')
265 update_result = self._superproject.UpdateProjectsRevisionId(projects)
266 self.assertIsNone(update_result.manifest_path)
267 self.assertFalse(update_result.fatal)
268 self.verifyErrorEvent()
269 self.assertEqual( 262 self.assertEqual(
270 sort_attributes(manifest.ToXml().toxml()), 263 sort_attributes(manifest.ToXml().toxml()),
271 '<?xml version="1.0" ?><manifest>' 264 '<?xml version="1.0" ?><manifest>'
272 '<remote fetch="http://localhost" name="default-remote"/>' 265 '<remote fetch="http://localhost" name="default-remote"/>'
273 '<default remote="default-remote" revision="refs/heads/main"/>' 266 '<default remote="default-remote" revision="refs/heads/main"/>'
274 '<project name="test-name" revision="ABCDEF" upstream="refs/heads/main"/>' 267 '<project name="test-name"/>'
275 '</manifest>') 268 '</manifest>')
276 269
277 def test_superproject_update_project_revision_id_from_local_manifest_group(self): 270 def test_superproject_update_project_revision_id_from_local_manifest_group(self):
@@ -290,8 +283,10 @@ class SuperprojectTestCase(unittest.TestCase):
290 " /></manifest> 283 " /></manifest>
291""") 284""")
292 self.maxDiff = None 285 self.maxDiff = None
293 self._superproject = git_superproject.Superproject(manifest, self.repodir, 286 self._superproject = git_superproject.Superproject(
294 self.git_event_log) 287 manifest, name='superproject',
288 remote=manifest.remotes.get('default-remote').ToRemoteSpec('superproject'),
289 revision='refs/heads/main')
295 self.assertEqual(len(self._superproject._manifest.projects), 2) 290 self.assertEqual(len(self._superproject._manifest.projects), 2)
296 projects = self._superproject._manifest.projects 291 projects = self._superproject._manifest.projects
297 data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00') 292 data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00')
@@ -302,7 +297,7 @@ class SuperprojectTestCase(unittest.TestCase):
302 return_value=data): 297 return_value=data):
303 # Create temporary directory so that it can write the file. 298 # Create temporary directory so that it can write the file.
304 os.mkdir(self._superproject._superproject_path) 299 os.mkdir(self._superproject._superproject_path)
305 update_result = self._superproject.UpdateProjectsRevisionId(projects) 300 update_result = self._superproject.UpdateProjectsRevisionId(projects, self.git_event_log)
306 self.assertIsNotNone(update_result.manifest_path) 301 self.assertIsNotNone(update_result.manifest_path)
307 self.assertFalse(update_result.fatal) 302 self.assertFalse(update_result.fatal)
308 with open(update_result.manifest_path, 'r') as fp: 303 with open(update_result.manifest_path, 'r') as fp:
@@ -337,8 +332,10 @@ class SuperprojectTestCase(unittest.TestCase):
337 " /></manifest> 332 " /></manifest>
338""") 333""")
339 self.maxDiff = None 334 self.maxDiff = None
340 self._superproject = git_superproject.Superproject(manifest, self.repodir, 335 self._superproject = git_superproject.Superproject(
341 self.git_event_log) 336 manifest, name='superproject',
337 remote=manifest.remotes.get('default-remote').ToRemoteSpec('superproject'),
338 revision='refs/heads/main')
342 self.assertEqual(len(self._superproject._manifest.projects), 3) 339 self.assertEqual(len(self._superproject._manifest.projects), 3)
343 projects = self._superproject._manifest.projects 340 projects = self._superproject._manifest.projects
344 data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00' 341 data = ('160000 commit 2c2724cb36cd5a9cec6c852c681efc3b7c6b86ea\tart\x00'
@@ -350,7 +347,7 @@ class SuperprojectTestCase(unittest.TestCase):
350 return_value=data): 347 return_value=data):
351 # Create temporary directory so that it can write the file. 348 # Create temporary directory so that it can write the file.
352 os.mkdir(self._superproject._superproject_path) 349 os.mkdir(self._superproject._superproject_path)
353 update_result = self._superproject.UpdateProjectsRevisionId(projects) 350 update_result = self._superproject.UpdateProjectsRevisionId(projects, self.git_event_log)
354 self.assertIsNotNone(update_result.manifest_path) 351 self.assertIsNotNone(update_result.manifest_path)
355 self.assertFalse(update_result.fatal) 352 self.assertFalse(update_result.fatal)
356 with open(update_result.manifest_path, 'r') as fp: 353 with open(update_result.manifest_path, 'r') as fp:
diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py
index cb3eb855..ede41547 100644
--- a/tests/test_manifest_xml.py
+++ b/tests/test_manifest_xml.py
@@ -289,8 +289,8 @@ class XmlManifestTests(ManifestParseTestCase):
289 <x-custom-tag>X tags are always ignored</x-custom-tag> 289 <x-custom-tag>X tags are always ignored</x-custom-tag>
290</manifest> 290</manifest>
291""") 291""")
292 self.assertEqual(manifest.superproject['name'], 'superproject') 292 self.assertEqual(manifest.superproject.name, 'superproject')
293 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 293 self.assertEqual(manifest.superproject.remote.name, 'test-remote')
294 self.assertEqual( 294 self.assertEqual(
295 sort_attributes(manifest.ToXml().toxml()), 295 sort_attributes(manifest.ToXml().toxml()),
296 '<?xml version="1.0" ?><manifest>' 296 '<?xml version="1.0" ?><manifest>'
@@ -569,10 +569,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
569 <superproject name="superproject"/> 569 <superproject name="superproject"/>
570</manifest> 570</manifest>
571""") 571""")
572 self.assertEqual(manifest.superproject['name'], 'superproject') 572 self.assertEqual(manifest.superproject.name, 'superproject')
573 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 573 self.assertEqual(manifest.superproject.remote.name, 'test-remote')
574 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') 574 self.assertEqual(manifest.superproject.remote.url, 'http://localhost/superproject')
575 self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') 575 self.assertEqual(manifest.superproject.revision, 'refs/heads/main')
576 self.assertEqual( 576 self.assertEqual(
577 sort_attributes(manifest.ToXml().toxml()), 577 sort_attributes(manifest.ToXml().toxml()),
578 '<?xml version="1.0" ?><manifest>' 578 '<?xml version="1.0" ?><manifest>'
@@ -591,10 +591,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
591 <superproject name="superproject" revision="refs/heads/stable" /> 591 <superproject name="superproject" revision="refs/heads/stable" />
592</manifest> 592</manifest>
593""") 593""")
594 self.assertEqual(manifest.superproject['name'], 'superproject') 594 self.assertEqual(manifest.superproject.name, 'superproject')
595 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 595 self.assertEqual(manifest.superproject.remote.name, 'test-remote')
596 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') 596 self.assertEqual(manifest.superproject.remote.url, 'http://localhost/superproject')
597 self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') 597 self.assertEqual(manifest.superproject.revision, 'refs/heads/stable')
598 self.assertEqual( 598 self.assertEqual(
599 sort_attributes(manifest.ToXml().toxml()), 599 sort_attributes(manifest.ToXml().toxml()),
600 '<?xml version="1.0" ?><manifest>' 600 '<?xml version="1.0" ?><manifest>'
@@ -613,10 +613,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
613 <superproject name="superproject" revision="refs/heads/stable" /> 613 <superproject name="superproject" revision="refs/heads/stable" />
614</manifest> 614</manifest>
615""") 615""")
616 self.assertEqual(manifest.superproject['name'], 'superproject') 616 self.assertEqual(manifest.superproject.name, 'superproject')
617 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 617 self.assertEqual(manifest.superproject.remote.name, 'test-remote')
618 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') 618 self.assertEqual(manifest.superproject.remote.url, 'http://localhost/superproject')
619 self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') 619 self.assertEqual(manifest.superproject.revision, 'refs/heads/stable')
620 self.assertEqual( 620 self.assertEqual(
621 sort_attributes(manifest.ToXml().toxml()), 621 sort_attributes(manifest.ToXml().toxml()),
622 '<?xml version="1.0" ?><manifest>' 622 '<?xml version="1.0" ?><manifest>'
@@ -635,10 +635,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
635 <superproject name="superproject" revision="refs/heads/stable" /> 635 <superproject name="superproject" revision="refs/heads/stable" />
636</manifest> 636</manifest>
637""") 637""")
638 self.assertEqual(manifest.superproject['name'], 'superproject') 638 self.assertEqual(manifest.superproject.name, 'superproject')
639 self.assertEqual(manifest.superproject['remote'].name, 'test-remote') 639 self.assertEqual(manifest.superproject.remote.name, 'test-remote')
640 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/superproject') 640 self.assertEqual(manifest.superproject.remote.url, 'http://localhost/superproject')
641 self.assertEqual(manifest.superproject['revision'], 'refs/heads/stable') 641 self.assertEqual(manifest.superproject.revision, 'refs/heads/stable')
642 self.assertEqual( 642 self.assertEqual(
643 sort_attributes(manifest.ToXml().toxml()), 643 sort_attributes(manifest.ToXml().toxml()),
644 '<?xml version="1.0" ?><manifest>' 644 '<?xml version="1.0" ?><manifest>'
@@ -657,10 +657,10 @@ class SuperProjectElementTests(ManifestParseTestCase):
657 <superproject name="platform/superproject" remote="superproject-remote"/> 657 <superproject name="platform/superproject" remote="superproject-remote"/>
658</manifest> 658</manifest>
659""") 659""")
660 self.assertEqual(manifest.superproject['name'], 'platform/superproject') 660 self.assertEqual(manifest.superproject.name, 'platform/superproject')
661 self.assertEqual(manifest.superproject['remote'].name, 'superproject-remote') 661 self.assertEqual(manifest.superproject.remote.name, 'superproject-remote')
662 self.assertEqual(manifest.superproject['remote'].url, 'http://localhost/platform/superproject') 662 self.assertEqual(manifest.superproject.remote.url, 'http://localhost/platform/superproject')
663 self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') 663 self.assertEqual(manifest.superproject.revision, 'refs/heads/main')
664 self.assertEqual( 664 self.assertEqual(
665 sort_attributes(manifest.ToXml().toxml()), 665 sort_attributes(manifest.ToXml().toxml()),
666 '<?xml version="1.0" ?><manifest>' 666 '<?xml version="1.0" ?><manifest>'
@@ -679,9 +679,9 @@ class SuperProjectElementTests(ManifestParseTestCase):
679 <superproject name="superproject" remote="default-remote"/> 679 <superproject name="superproject" remote="default-remote"/>
680</manifest> 680</manifest>
681""") 681""")
682 self.assertEqual(manifest.superproject['name'], 'superproject') 682 self.assertEqual(manifest.superproject.name, 'superproject')
683 self.assertEqual(manifest.superproject['remote'].name, 'default-remote') 683 self.assertEqual(manifest.superproject.remote.name, 'default-remote')
684 self.assertEqual(manifest.superproject['revision'], 'refs/heads/main') 684 self.assertEqual(manifest.superproject.revision, 'refs/heads/main')
685 self.assertEqual( 685 self.assertEqual(
686 sort_attributes(manifest.ToXml().toxml()), 686 sort_attributes(manifest.ToXml().toxml()),
687 '<?xml version="1.0" ?><manifest>' 687 '<?xml version="1.0" ?><manifest>'