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 bdbb1d40..647e89f9 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -209,8 +209,9 @@ class XmlManifest(object):
209 root.appendChild(doc.createTextNode('')) 209 root.appendChild(doc.createTextNode(''))
210 210
211 def output_projects(parent, parent_node, projects): 211 def output_projects(parent, parent_node, projects):
212 for p in projects: 212 for project_name in projects:
213 output_project(parent, parent_node, self.projects[p]) 213 for project in self._projects[project_name]:
214 output_project(parent, parent_node, project)
214 215
215 def output_project(parent, parent_node, p): 216 def output_project(parent, parent_node, p):
216 if not p.MatchesGroups(groups): 217 if not p.MatchesGroups(groups):
@@ -269,13 +270,11 @@ class XmlManifest(object):
269 e.setAttribute('sync-s', 'true') 270 e.setAttribute('sync-s', 'true')
270 271
271 if p.subprojects: 272 if p.subprojects:
272 sort_projects = list(sorted([subp.name for subp in p.subprojects])) 273 subprojects = set(subp.name for subp in p.subprojects)
273 output_projects(p, e, sort_projects) 274 output_projects(p, e, list(sorted(subprojects)))
274 275
275 sort_projects = list(sorted([key for key, value in self.projects.items() 276 projects = set(p.name for p in self._paths.values() if not p.parent)
276 if not value.parent])) 277 output_projects(None, root, list(sorted(projects)))
277 sort_projects.sort()
278 output_projects(None, root, sort_projects)
279 278
280 if self._repo_hooks_project: 279 if self._repo_hooks_project:
281 root.appendChild(doc.createTextNode('')) 280 root.appendChild(doc.createTextNode(''))
@@ -288,9 +287,14 @@ class XmlManifest(object):
288 doc.writexml(fd, '', ' ', '\n', 'UTF-8') 287 doc.writexml(fd, '', ' ', '\n', 'UTF-8')
289 288
290 @property 289 @property
290 def paths(self):
291 self._Load()
292 return self._paths
293
294 @property
291 def projects(self): 295 def projects(self):
292 self._Load() 296 self._Load()
293 return self._projects 297 return self._paths.values()
294 298
295 @property 299 @property
296 def remotes(self): 300 def remotes(self):
@@ -324,6 +328,7 @@ class XmlManifest(object):
324 def _Unload(self): 328 def _Unload(self):
325 self._loaded = False 329 self._loaded = False
326 self._projects = {} 330 self._projects = {}
331 self._paths = {}
327 self._remotes = {} 332 self._remotes = {}
328 self._default = None 333 self._default = None
329 self._repo_hooks_project = None 334 self._repo_hooks_project = None
@@ -453,11 +458,17 @@ class XmlManifest(object):
453 self._manifest_server = url 458 self._manifest_server = url
454 459
455 def recursively_add_projects(project): 460 def recursively_add_projects(project):
456 if self._projects.get(project.name): 461 projects = self._projects.setdefault(project.name, [])
462 if project.relpath is None:
457 raise ManifestParseError( 463 raise ManifestParseError(
458 'duplicate project %s in %s' % 464 'missing path for %s in %s' %
459 (project.name, self.manifestFile)) 465 (project.name, self.manifestFile))
460 self._projects[project.name] = project 466 if project.relpath in self._paths:
467 raise ManifestParseError(
468 'duplicate path %s in %s' %
469 (project.relpath, self.manifestFile))
470 self._paths[project.relpath] = project
471 projects.append(project)
461 for subproject in project.subprojects: 472 for subproject in project.subprojects:
462 recursively_add_projects(subproject) 473 recursively_add_projects(subproject)
463 474
@@ -478,12 +489,18 @@ class XmlManifest(object):
478 489
479 # Store a reference to the Project. 490 # Store a reference to the Project.
480 try: 491 try:
481 self._repo_hooks_project = self._projects[repo_hooks_project] 492 repo_hooks_projects = self._projects[repo_hooks_project]
482 except KeyError: 493 except KeyError:
483 raise ManifestParseError( 494 raise ManifestParseError(
484 'project %s not found for repo-hooks' % 495 'project %s not found for repo-hooks' %
485 (repo_hooks_project)) 496 (repo_hooks_project))
486 497
498 if len(repo_hooks_projects) != 1:
499 raise ManifestParseError(
500 'internal error parsing repo-hooks in %s' %
501 (self.manifestFile))
502 self._repo_hooks_project = repo_hooks_projects[0]
503
487 # Store the enabled hooks in the Project object. 504 # Store the enabled hooks in the Project object.
488 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks 505 self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks
489 if node.nodeName == 'remove-project': 506 if node.nodeName == 'remove-project':
@@ -530,11 +547,12 @@ class XmlManifest(object):
530 name = name, 547 name = name,
531 remote = remote.ToRemoteSpec(name), 548 remote = remote.ToRemoteSpec(name),
532 gitdir = gitdir, 549 gitdir = gitdir,
550 objdir = gitdir,
533 worktree = None, 551 worktree = None,
534 relpath = None, 552 relpath = None,
535 revisionExpr = m.revisionExpr, 553 revisionExpr = m.revisionExpr,
536 revisionId = None) 554 revisionId = None)
537 self._projects[project.name] = project 555 self._projects[project.name] = [project]
538 556
539 def _ParseRemote(self, node): 557 def _ParseRemote(self, node):
540 """ 558 """
@@ -694,9 +712,10 @@ class XmlManifest(object):
694 groups = [x for x in re.split(r'[,\s]+', groups) if x] 712 groups = [x for x in re.split(r'[,\s]+', groups) if x]
695 713
696 if parent is None: 714 if parent is None:
697 relpath, worktree, gitdir = self.GetProjectPaths(name, path) 715 relpath, worktree, gitdir, objdir = self.GetProjectPaths(name, path)
698 else: 716 else:
699 relpath, worktree, gitdir = self.GetSubprojectPaths(parent, path) 717 relpath, worktree, gitdir, objdir = \
718 self.GetSubprojectPaths(parent, name, path)
700 719
701 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath] 720 default_groups = ['all', 'name:%s' % name, 'path:%s' % relpath]
702 groups.extend(set(default_groups).difference(groups)) 721 groups.extend(set(default_groups).difference(groups))
@@ -709,6 +728,7 @@ class XmlManifest(object):
709 name = name, 728 name = name,
710 remote = remote.ToRemoteSpec(name), 729 remote = remote.ToRemoteSpec(name),
711 gitdir = gitdir, 730 gitdir = gitdir,
731 objdir = objdir,
712 worktree = worktree, 732 worktree = worktree,
713 relpath = relpath, 733 relpath = relpath,
714 revisionExpr = revisionExpr, 734 revisionExpr = revisionExpr,
@@ -737,10 +757,15 @@ class XmlManifest(object):
737 if self.IsMirror: 757 if self.IsMirror:
738 worktree = None 758 worktree = None
739 gitdir = os.path.join(self.topdir, '%s.git' % name) 759 gitdir = os.path.join(self.topdir, '%s.git' % name)
760 objdir = gitdir
740 else: 761 else:
741 worktree = os.path.join(self.topdir, path).replace('\\', '/') 762 worktree = os.path.join(self.topdir, path).replace('\\', '/')
742 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path) 763 gitdir = os.path.join(self.repodir, 'projects', '%s.git' % path)
743 return relpath, worktree, gitdir 764 objdir = os.path.join(self.repodir, 'project-objects', '%s.git' % name)
765 return relpath, worktree, gitdir, objdir
766
767 def GetProjectsWithName(self, name):
768 return self._projects.get(name, [])
744 769
745 def GetSubprojectName(self, parent, submodule_path): 770 def GetSubprojectName(self, parent, submodule_path):
746 return os.path.join(parent.name, submodule_path) 771 return os.path.join(parent.name, submodule_path)
@@ -751,14 +776,15 @@ class XmlManifest(object):
751 def _UnjoinRelpath(self, parent_relpath, relpath): 776 def _UnjoinRelpath(self, parent_relpath, relpath):
752 return os.path.relpath(relpath, parent_relpath) 777 return os.path.relpath(relpath, parent_relpath)
753 778
754 def GetSubprojectPaths(self, parent, path): 779 def GetSubprojectPaths(self, parent, name, path):
755 relpath = self._JoinRelpath(parent.relpath, path) 780 relpath = self._JoinRelpath(parent.relpath, path)
756 gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path) 781 gitdir = os.path.join(parent.gitdir, 'subprojects', '%s.git' % path)
782 objdir = os.path.join(parent.gitdir, 'subproject-objects', '%s.git' % name)
757 if self.IsMirror: 783 if self.IsMirror:
758 worktree = None 784 worktree = None
759 else: 785 else:
760 worktree = os.path.join(parent.worktree, path).replace('\\', '/') 786 worktree = os.path.join(parent.worktree, path).replace('\\', '/')
761 return relpath, worktree, gitdir 787 return relpath, worktree, gitdir, objdir
762 788
763 def _ParseCopyFile(self, project, node): 789 def _ParseCopyFile(self, project, node):
764 src = self._reqatt(node, 'src') 790 src = self._reqatt(node, 'src')