summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py70
1 files changed, 50 insertions, 20 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index f1d3edaa..c5f3bcc9 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -215,8 +215,9 @@ class XmlManifest(object):
215 root.appendChild(doc.createTextNode('')) 215 root.appendChild(doc.createTextNode(''))
216 216
217 def output_projects(parent, parent_node, projects): 217 def output_projects(parent, parent_node, projects):
218 for p in projects: 218 for project_name in projects:
219 output_project(parent, parent_node, self.projects[p]) 219 for project in self._projects[project_name]:
220 output_project(parent, parent_node, project)
220 221
221 def output_project(parent, parent_node, p): 222 def output_project(parent, parent_node, p):
222 if not p.MatchesGroups(groups): 223 if not p.MatchesGroups(groups):
@@ -235,7 +236,7 @@ class XmlManifest(object):
235 e.setAttribute('path', relpath) 236 e.setAttribute('path', relpath)
236 remoteName = None 237 remoteName = None
237 if d.remote: 238 if d.remote:
238 remoteName = d.remote.remoteAlias or d.remote.name 239 remoteName = d.remote.remoteAlias or d.remote.name
239 if not d.remote or p.remote.name != remoteName: 240 if not d.remote or p.remote.name != remoteName:
240 e.setAttribute('remote', p.remote.name) 241 e.setAttribute('remote', p.remote.name)
241 if peg_rev: 242 if peg_rev:
@@ -277,13 +278,11 @@ class XmlManifest(object):
277 e.setAttribute('sync-s', 'true') 278 e.setAttribute('sync-s', 'true')
278 279
279 if p.subprojects: 280 if p.subprojects:
280 sort_projects = list(sorted([subp.name for subp in p.subprojects])) 281 subprojects = set(subp.name for subp in p.subprojects)
281 output_projects(p, e, sort_projects) 282 output_projects(p, e, list(sorted(subprojects)))
282 283
283 sort_projects = list(sorted([key for key, value in self.projects.items() 284 projects = set(p.name for p in self._paths.values() if not p.parent)
284 if not value.parent])) 285 output_projects(None, root, list(sorted(projects)))
285 sort_projects.sort()
286 output_projects(None, root, sort_projects)
287 286
288 if self._repo_hooks_project: 287 if self._repo_hooks_project:
289 root.appendChild(doc.createTextNode('')) 288 root.appendChild(doc.createTextNode(''))
@@ -296,9 +295,14 @@ class XmlManifest(object):
296 doc.writexml(fd, '', ' ', '\n', 'UTF-8') 295 doc.writexml(fd, '', ' ', '\n', 'UTF-8')
297 296
298 @property 297 @property
298 def paths(self):
299 self._Load()
300 return self._paths
301
302 @property
299 def projects(self): 303 def projects(self):
300 self._Load() 304 self._Load()
301 return self._projects 305 return self._paths.values()
302 306
303 @property 307 @property
304 def remotes(self): 308 def remotes(self):
@@ -329,9 +333,14 @@ class XmlManifest(object):
329 def IsMirror(self): 333 def IsMirror(self):
330 return self.manifestProject.config.GetBoolean('repo.mirror') 334 return self.manifestProject.config.GetBoolean('repo.mirror')
331 335
336 @property
337 def IsArchive(self):
338 return self.manifestProject.config.GetBoolean('repo.archive')
339
332 def _Unload(self): 340 def _Unload(self):
333 self._loaded = False 341 self._loaded = False
334 self._projects = {} 342 self._projects = {}
343 self._paths = {}
335 self._remotes = {} 344 self._remotes = {}
336 self._default = None 345 self._default = None
337 self._repo_hooks_project = None 346 self._repo_hooks_project = None
@@ -463,11 +472,17 @@ class XmlManifest(object):
463 self._manifest_server = url 472 self._manifest_server = url
464 473
465 def recursively_add_projects(project): 474 def recursively_add_projects(project):
466 if self._projects.get(project.name): 475 projects = self._projects.setdefault(project.name, [])
476 if project.relpath is None:
467 raise ManifestParseError( 477 raise ManifestParseError(
468 'duplicate project %s in %s' % 478 'missing path for %s in %s' %
469 (project.name, self.manifestFile)) 479 (project.name, self.manifestFile))
470 self._projects[project.name] = project 480 if project.relpath in self._paths:
481 raise ManifestParseError(
482 'duplicate path %s in %s' %
483 (project.relpath, self.manifestFile))
484 self._paths[project.relpath] = project
485 projects.append(project)
471 for subproject in project.subprojects: 486 for subproject in project.subprojects:
472 recursively_add_projects(subproject) 487 recursively_add_projects(subproject)
473 488
@@ -488,12 +503,18 @@ class XmlManifest(object):
488 503
489 # Store a reference to the Project. 504 # Store a reference to the Project.
490 try: 505 try:
491 self._repo_hooks_project = self._projects[repo_hooks_project] 506 repo_hooks_projects = self._projects[repo_hooks_project]
492 except KeyError: 507 except KeyError:
493 raise ManifestParseError( 508 raise ManifestParseError(
494 'project %s not found for repo-hooks' % 509 'project %s not found for repo-hooks' %
495 (repo_hooks_project)) 510 (repo_hooks_project))
496 511
512 if len(repo_hooks_projects) != 1:
513 raise ManifestParseError(
514 'internal error parsing repo-hooks in %s' %
515 (self.manifestFile))
516 self._repo_hooks_project = repo_hooks_projects[0]
517
497 # Store the enabled hooks in the Project object. 518 # Store the enabled hooks in the Project object.
498 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks 519 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks
499 if node.nodeName == 'remove-project': 520 if node.nodeName == 'remove-project':
@@ -540,11 +561,12 @@ class XmlManifest(object):
540 name = name, 561 name = name,
541 remote = remote.ToRemoteSpec(name), 562 remote = remote.ToRemoteSpec(name),
542 gitdir = gitdir, 563 gitdir = gitdir,
564 objdir = gitdir,
543 worktree = None, 565 worktree = None,
544 relpath = None, 566 relpath = None,
545 revisionExpr = m.revisionExpr, 567 revisionExpr = m.revisionExpr,
546 revisionId = None) 568 revisionId = None)
547 self._projects[project.name] = project 569 self._projects[project.name] = [project]
548 570
549 def _ParseRemote(self, node): 571 def _ParseRemote(self, node):
550 """ 572 """
@@ -704,9 +726,10 @@ class XmlManifest(object):
704 groups = [x for x in re.split(r'[,\s]+', groups) if x] 726 groups = [x for x in re.split(r'[,\s]+', groups) if x]
705 727
706 if parent is None: 728 if parent is None:
707 relpath, worktree, gitdir = self.GetProjectPaths(name, path) 729 relpath, worktree, gitdir, objdir = self.GetProjectPaths(name, path)
708 else: 730 else:
709 relpath, worktree, gitdir = self.GetSubprojectPaths(parent, path) 731 relpath, worktree, gitdir, objdir = \
732 self.GetSubprojectPaths(parent, name, path)
710 733
711 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath] 734 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath]
712 groups.extend(set(default_groups).difference(groups)) 735 groups.extend(set(default_groups).difference(groups))
@@ -719,6 +742,7 @@ class XmlManifest(object):
719 name = name, 742 name = name,
720 remote = remote.ToRemoteSpec(name), 743 remote = remote.ToRemoteSpec(name),
721 gitdir = gitdir, 744 gitdir = gitdir,
745 objdir = objdir,
722 worktree = worktree, 746 worktree = worktree,
723 relpath = relpath, 747 relpath = relpath,
724 revisionExpr = revisionExpr, 748 revisionExpr = revisionExpr,
@@ -747,10 +771,15 @@ class XmlManifest(object):
747 if self.IsMirror: 771 if self.IsMirror:
748 worktree = None 772 worktree = None
749 gitdir = os.path.join(self.topdir, '%s.git' % name) 773 gitdir = os.path.join(self.topdir, '%s.git' % name)
774 objdir = gitdir
750 else: 775 else:
751 worktree = os.path.join(self.topdir, path).replace('\\', '/') 776 worktree = os.path.join(self.topdir, path).replace('\\', '/')
752 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path) 777 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path)
753 return relpath, worktree, gitdir 778 objdir = os.path.join(self.repodir, 'project-objects', '%s.git' % name)
779 return relpath, worktree, gitdir, objdir
780
781 def GetProjectsWithName(self, name):
782 return self._projects.get(name, [])
754 783
755 def GetSubprojectName(self, parent, submodule_path): 784 def GetSubprojectName(self, parent, submodule_path):
756 return os.path.join(parent.name, submodule_path) 785 return os.path.join(parent.name, submodule_path)
@@ -761,14 +790,15 @@ class XmlManifest(object):
761 def _UnjoinRelpath(self, parent_relpath, relpath): 790 def _UnjoinRelpath(self, parent_relpath, relpath):
762 return os.path.relpath(relpath, parent_relpath) 791 return os.path.relpath(relpath, parent_relpath)
763 792
764 def GetSubprojectPaths(self, parent, path): 793 def GetSubprojectPaths(self, parent, name, path):
765 relpath = self._JoinRelpath(parent.relpath, path) 794 relpath = self._JoinRelpath(parent.relpath, path)
766 gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path) 795 gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path)
796 objdir = os.path.join(parent.gitdir, 'subproject-objects', '%s.git' % name)
767 if self.IsMirror: 797 if self.IsMirror:
768 worktree = None 798 worktree = None
769 else: 799 else:
770 worktree = os.path.join(parent.worktree, path).replace('\\', '/') 800 worktree = os.path.join(parent.worktree, path).replace('\\', '/')
771 return relpath, worktree, gitdir 801 return relpath, worktree, gitdir, objdir
772 802
773 def _ParseCopyFile(self, project, node): 803 def _ParseCopyFile(self, project, node):
774 src = self._reqatt(node, 'src') 804 src = self._reqatt(node, 'src')