diff options
-rw-r--r-- | docs/manifest-format.txt | 24 | ||||
-rw-r--r-- | manifest.py | 27 |
2 files changed, 43 insertions, 8 deletions
diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt index 2b49d466..5c014d6d 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 | |||
20 | following DTD: | 20 | following DTD: |
21 | 21 | ||
22 | <!DOCTYPE manifest [ | 22 | <!DOCTYPE manifest [ |
23 | <!ELEMENT manifest (remote*, default?, project*)> | 23 | <!ELEMENT manifest (remote*, |
24 | default?, | ||
25 | project*, | ||
26 | add-remote*)> | ||
24 | 27 | ||
25 | <!ELEMENT remote (EMPTY)> | 28 | <!ELEMENT remote (EMPTY)> |
26 | <!ATTLIST remote name ID #REQUIRED> | 29 | <!ATTLIST remote name ID #REQUIRED> |
@@ -37,6 +40,13 @@ following DTD: | |||
37 | <!ATTLIST project path CDATA #IMPLIED> | 40 | <!ATTLIST project path CDATA #IMPLIED> |
38 | <!ATTLIST project remote IDREF #IMPLIED> | 41 | <!ATTLIST project remote IDREF #IMPLIED> |
39 | <!ATTLIST project revision CDATA #IMPLIED> | 42 | <!ATTLIST project revision CDATA #IMPLIED> |
43 | |||
44 | <!ELEMENT add-remote (EMPTY)> | ||
45 | <!ATTLIST add-remote to-project ID #REQUIRED> | ||
46 | <!ATTLIST add-remote name ID #REQUIRED> | ||
47 | <!ATTLIST add-remote fetch CDATA #REQUIRED> | ||
48 | <!ATTLIST add-remote review CDATA #IMPLIED> | ||
49 | <!ATTLIST add-remote project-name CDATA #IMPLIED> | ||
40 | ]> | 50 | ]> |
41 | 51 | ||
42 | A description of the elements and their attributes follows. | 52 | 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 | |||
74 | element (see below). If not given, defaults to the name supplied | 84 | element (see below). If not given, defaults to the name supplied |
75 | in the project's name attribute. | 85 | in the project's name attribute. |
76 | 86 | ||
87 | Element add-remote | ||
88 | ------------------ | ||
89 | |||
90 | Adds a remote to an existing project, whose name is given by the | ||
91 | to-project attribute. This is functionally equivalent to nesting | ||
92 | a remote element under the project, but has the advantage that it | ||
93 | can be specified in the uesr's `local_manifest.xml` to add a remote | ||
94 | to a project declared by the normal manifest. | ||
95 | |||
96 | The element can be used to add a fork of an existing project that | ||
97 | the user needs to work with. | ||
98 | |||
77 | 99 | ||
78 | Element default | 100 | Element default |
79 | --------------- | 101 | --------------- |
diff --git a/manifest.py b/manifest.py index 65455687..2ac1453a 100644 --- a/manifest.py +++ b/manifest.py | |||
@@ -165,6 +165,16 @@ class Manifest(object): | |||
165 | (project.name, self.manifestFile) | 165 | (project.name, self.manifestFile) |
166 | self._projects[project.name] = project | 166 | self._projects[project.name] = project |
167 | 167 | ||
168 | for node in config.childNodes: | ||
169 | if node.nodeName == 'add-remote': | ||
170 | pn = self._reqatt(node, 'to-project') | ||
171 | project = self._projects.get(pn) | ||
172 | if not project: | ||
173 | raise ManifestParseError, \ | ||
174 | 'project %s not defined in %s' % \ | ||
175 | (pn, self.manifestFile) | ||
176 | self._ParseProjectExtraRemote(project, node) | ||
177 | |||
168 | def _AddMetaProjectMirror(self, m): | 178 | def _AddMetaProjectMirror(self, m): |
169 | name = None | 179 | name = None |
170 | m_url = m.GetRemote(m.remote.name).url | 180 | m_url = m.GetRemote(m.remote.name).url |
@@ -281,18 +291,21 @@ class Manifest(object): | |||
281 | 291 | ||
282 | for n in node.childNodes: | 292 | for n in node.childNodes: |
283 | if n.nodeName == 'remote': | 293 | if n.nodeName == 'remote': |
284 | r = self._ParseRemote(n) | 294 | self._ParseProjectExtraRemote(project, n) |
285 | if project.extraRemotes.get(r.name) \ | ||
286 | or project.remote.name == r.name: | ||
287 | raise ManifestParseError, \ | ||
288 | 'duplicate remote %s in project %s in %s' % \ | ||
289 | (r.name, project.name, self.manifestFile) | ||
290 | project.extraRemotes[r.name] = r | ||
291 | elif n.nodeName == 'copyfile': | 295 | elif n.nodeName == 'copyfile': |
292 | self._ParseCopyFile(project, n) | 296 | self._ParseCopyFile(project, n) |
293 | 297 | ||
294 | return project | 298 | return project |
295 | 299 | ||
300 | def _ParseProjectExtraRemote(self, project, n): | ||
301 | r = self._ParseRemote(n) | ||
302 | if project.extraRemotes.get(r.name) \ | ||
303 | or project.remote.name == r.name: | ||
304 | raise ManifestParseError, \ | ||
305 | 'duplicate remote %s in project %s in %s' % \ | ||
306 | (r.name, project.name, self.manifestFile) | ||
307 | project.extraRemotes[r.name] = r | ||
308 | |||
296 | def _ParseCopyFile(self, project, node): | 309 | def _ParseCopyFile(self, project, node): |
297 | src = self._reqatt(node, 'src') | 310 | src = self._reqatt(node, 'src') |
298 | dest = self._reqatt(node, 'dest') | 311 | dest = self._reqatt(node, 'dest') |