summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py64
1 files changed, 45 insertions, 19 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index 785976bc..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):
@@ -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):
@@ -336,6 +340,7 @@ class XmlManifest(object):
336 def _Unload(self): 340 def _Unload(self):
337 self._loaded = False 341 self._loaded = False
338 self._projects = {} 342 self._projects = {}
343 self._paths = {}
339 self._remotes = {} 344 self._remotes = {}
340 self._default = None 345 self._default = None
341 self._repo_hooks_project = None 346 self._repo_hooks_project = None
@@ -467,11 +472,17 @@ class XmlManifest(object):
467 self._manifest_server = url 472 self._manifest_server = url
468 473
469 def recursively_add_projects(project): 474 def recursively_add_projects(project):
470 if self._projects.get(project.name): 475 projects = self._projects.setdefault(project.name, [])
476 if project.relpath is None:
471 raise ManifestParseError( 477 raise ManifestParseError(
472 'duplicate project %s in %s' % 478 'missing path for %s in %s' %
473 (project.name, self.manifestFile)) 479 (project.name, self.manifestFile))
474 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)
475 for subproject in project.subprojects: 486 for subproject in project.subprojects:
476 recursively_add_projects(subproject) 487 recursively_add_projects(subproject)
477 488
@@ -492,12 +503,18 @@ class XmlManifest(object):
492 503
493 # Store a reference to the Project. 504 # Store a reference to the Project.
494 try: 505 try:
495 self._repo_hooks_project = self._projects[repo_hooks_project] 506 repo_hooks_projects = self._projects[repo_hooks_project]
496 except KeyError: 507 except KeyError:
497 raise ManifestParseError( 508 raise ManifestParseError(
498 'project %s not found for repo-hooks' % 509 'project %s not found for repo-hooks' %
499 (repo_hooks_project)) 510 (repo_hooks_project))
500 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
501 # Store the enabled hooks in the Project object. 518 # Store the enabled hooks in the Project object.
502 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks 519 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks
503 if node.nodeName == 'remove-project': 520 if node.nodeName == 'remove-project':
@@ -544,11 +561,12 @@ class XmlManifest(object):
544 name = name, 561 name = name,
545 remote = remote.ToRemoteSpec(name), 562 remote = remote.ToRemoteSpec(name),
546 gitdir = gitdir, 563 gitdir = gitdir,
564 objdir = gitdir,
547 worktree = None, 565 worktree = None,
548 relpath = None, 566 relpath = None,
549 revisionExpr = m.revisionExpr, 567 revisionExpr = m.revisionExpr,
550 revisionId = None) 568 revisionId = None)
551 self._projects[project.name] = project 569 self._projects[project.name] = [project]
552 570
553 def _ParseRemote(self, node): 571 def _ParseRemote(self, node):
554 """ 572 """
@@ -708,9 +726,10 @@ class XmlManifest(object):
708 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]
709 727
710 if parent is None: 728 if parent is None:
711 relpath, worktree, gitdir = self.GetProjectPaths(name, path) 729 relpath, worktree, gitdir, objdir = self.GetProjectPaths(name, path)
712 else: 730 else:
713 relpath, worktree, gitdir = self.GetSubprojectPaths(parent, path) 731 relpath, worktree, gitdir, objdir = \
732 self.GetSubprojectPaths(parent, name, path)
714 733
715 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath] 734 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath]
716 groups.extend(set(default_groups).difference(groups)) 735 groups.extend(set(default_groups).difference(groups))
@@ -723,6 +742,7 @@ class XmlManifest(object):
723 name = name, 742 name = name,
724 remote = remote.ToRemoteSpec(name), 743 remote = remote.ToRemoteSpec(name),
725 gitdir = gitdir, 744 gitdir = gitdir,
745 objdir = objdir,
726 worktree = worktree, 746 worktree = worktree,
727 relpath = relpath, 747 relpath = relpath,
728 revisionExpr = revisionExpr, 748 revisionExpr = revisionExpr,
@@ -751,10 +771,15 @@ class XmlManifest(object):
751 if self.IsMirror: 771 if self.IsMirror:
752 worktree = None 772 worktree = None
753 gitdir = os.path.join(self.topdir, '%s.git' % name) 773 gitdir = os.path.join(self.topdir, '%s.git' % name)
774 objdir = gitdir
754 else: 775 else:
755 worktree = os.path.join(self.topdir, path).replace('\\', '/') 776 worktree = os.path.join(self.topdir, path).replace('\\', '/')
756 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path) 777 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path)
757 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, [])
758 783
759 def GetSubprojectName(self, parent, submodule_path): 784 def GetSubprojectName(self, parent, submodule_path):
760 return os.path.join(parent.name, submodule_path) 785 return os.path.join(parent.name, submodule_path)
@@ -765,14 +790,15 @@ class XmlManifest(object):
765 def _UnjoinRelpath(self, parent_relpath, relpath): 790 def _UnjoinRelpath(self, parent_relpath, relpath):
766 return os.path.relpath(relpath, parent_relpath) 791 return os.path.relpath(relpath, parent_relpath)
767 792
768 def GetSubprojectPaths(self, parent, path): 793 def GetSubprojectPaths(self, parent, name, path):
769 relpath = self._JoinRelpath(parent.relpath, path) 794 relpath = self._JoinRelpath(parent.relpath, path)
770 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)
771 if self.IsMirror: 797 if self.IsMirror:
772 worktree = None 798 worktree = None
773 else: 799 else:
774 worktree = os.path.join(parent.worktree, path).replace('\\', '/') 800 worktree = os.path.join(parent.worktree, path).replace('\\', '/')
775 return relpath, worktree, gitdir 801 return relpath, worktree, gitdir, objdir
776 802
777 def _ParseCopyFile(self, project, node): 803 def _ParseCopyFile(self, project, node):
778 src = self._reqatt(node, 'src') 804 src = self._reqatt(node, 'src')