diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt index 2b49d46..5c014d6 100644 --- a/docs/manifest-format.txt +++ b/docs/manifest-format.txt @@ -20,7 +20,10 @@ A manifest XML file (e.g. 'default.xml') roughly conforms to the following DTD: + @@ -37,6 +40,13 @@ following DTD: + + + + + + + ]> A description of the elements and their attributes follows. @@ -74,6 +84,18 @@ Only permitted when the remote element is nested inside of a project element (see below). If not given, defaults to the name supplied in the project's name attribute. +Element add-remote +------------------ + +Adds a remote to an existing project, whose name is given by the +to-project attribute. This is functionally equivalent to nesting +a remote element under the project, but has the advantage that it +can be specified in the uesr's `local_manifest.xml` to add a remote +to a project declared by the normal manifest. + +The element can be used to add a fork of an existing project that +the user needs to work with. + Element default --------------- diff --git a/manifest.py b/manifest.py index 6545568..2ac1453 100644 --- a/manifest.py +++ b/manifest.py @@ -165,6 +165,16 @@ class Manifest(object): (project.name, self.manifestFile) self._projects[project.name] = project + for node in config.childNodes: + if node.nodeName == 'add-remote': + pn = self._reqatt(node, 'to-project') + project = self._projects.get(pn) + if not project: + raise ManifestParseError, \ + 'project %s not defined in %s' % \ + (pn, self.manifestFile) + self._ParseProjectExtraRemote(project, node) + def _AddMetaProjectMirror(self, m): name = None m_url = m.GetRemote(m.remote.name).url @@ -281,18 +291,21 @@ class Manifest(object): for n in node.childNodes: if n.nodeName == 'remote': - r = self._ParseRemote(n) - if project.extraRemotes.get(r.name) \ - or project.remote.name == r.name: - raise ManifestParseError, \ - 'duplicate remote %s in project %s in %s' % \ - (r.name, project.name, self.manifestFile) - project.extraRemotes[r.name] = r + self._ParseProjectExtraRemote(project, n) elif n.nodeName == 'copyfile': self._ParseCopyFile(project, n) return project + def _ParseProjectExtraRemote(self, project, n): + r = self._ParseRemote(n) + if project.extraRemotes.get(r.name) \ + or project.remote.name == r.name: + raise ManifestParseError, \ + 'duplicate remote %s in project %s in %s' % \ + (r.name, project.name, self.manifestFile) + project.extraRemotes[r.name] = r + def _ParseCopyFile(self, project, node): src = self._reqatt(node, 'src') dest = self._reqatt(node, 'dest')