diff options
Diffstat (limited to 'manifest_xml.py')
-rw-r--r-- | manifest_xml.py | 90 |
1 files changed, 66 insertions, 24 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index 0103cf55..0e6421f1 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
@@ -171,6 +171,14 @@ class XmlManifest(object): | |||
171 | ce.setAttribute('dest', c.dest) | 171 | ce.setAttribute('dest', c.dest) |
172 | e.appendChild(ce) | 172 | e.appendChild(ce) |
173 | 173 | ||
174 | if self._repo_hooks_project: | ||
175 | root.appendChild(doc.createTextNode('')) | ||
176 | e = doc.createElement('repo-hooks') | ||
177 | e.setAttribute('in-project', self._repo_hooks_project.name) | ||
178 | e.setAttribute('enabled-list', | ||
179 | ' '.join(self._repo_hooks_project.enabled_repo_hooks)) | ||
180 | root.appendChild(e) | ||
181 | |||
174 | doc.writexml(fd, '', ' ', '\n', 'UTF-8') | 182 | doc.writexml(fd, '', ' ', '\n', 'UTF-8') |
175 | 183 | ||
176 | @property | 184 | @property |
@@ -189,6 +197,11 @@ class XmlManifest(object): | |||
189 | return self._default | 197 | return self._default |
190 | 198 | ||
191 | @property | 199 | @property |
200 | def repo_hooks_project(self): | ||
201 | self._Load() | ||
202 | return self._repo_hooks_project | ||
203 | |||
204 | @property | ||
192 | def notice(self): | 205 | def notice(self): |
193 | self._Load() | 206 | self._Load() |
194 | return self._notice | 207 | return self._notice |
@@ -207,6 +220,7 @@ class XmlManifest(object): | |||
207 | self._projects = {} | 220 | self._projects = {} |
208 | self._remotes = {} | 221 | self._remotes = {} |
209 | self._default = None | 222 | self._default = None |
223 | self._repo_hooks_project = None | ||
210 | self._notice = None | 224 | self._notice = None |
211 | self.branch = None | 225 | self.branch = None |
212 | self._manifest_server = None | 226 | self._manifest_server = None |
@@ -239,15 +253,15 @@ class XmlManifest(object): | |||
239 | def _ParseManifest(self, is_root_file): | 253 | def _ParseManifest(self, is_root_file): |
240 | root = xml.dom.minidom.parse(self.manifestFile) | 254 | root = xml.dom.minidom.parse(self.manifestFile) |
241 | if not root or not root.childNodes: | 255 | if not root or not root.childNodes: |
242 | raise ManifestParseError, \ | 256 | raise ManifestParseError( |
243 | "no root node in %s" % \ | 257 | "no root node in %s" % |
244 | self.manifestFile | 258 | self.manifestFile) |
245 | 259 | ||
246 | config = root.childNodes[0] | 260 | config = root.childNodes[0] |
247 | if config.nodeName != 'manifest': | 261 | if config.nodeName != 'manifest': |
248 | raise ManifestParseError, \ | 262 | raise ManifestParseError( |
249 | "no <manifest> in %s" % \ | 263 | "no <manifest> in %s" % |
250 | self.manifestFile | 264 | self.manifestFile) |
251 | 265 | ||
252 | for node in config.childNodes: | 266 | for node in config.childNodes: |
253 | if node.nodeName == 'remove-project': | 267 | if node.nodeName == 'remove-project': |
@@ -255,25 +269,30 @@ class XmlManifest(object): | |||
255 | try: | 269 | try: |
256 | del self._projects[name] | 270 | del self._projects[name] |
257 | except KeyError: | 271 | except KeyError: |
258 | raise ManifestParseError, \ | 272 | raise ManifestParseError( |
259 | 'project %s not found' % \ | 273 | 'project %s not found' % |
260 | (name) | 274 | (name)) |
275 | |||
276 | # If the manifest removes the hooks project, treat it as if it deleted | ||
277 | # the repo-hooks element too. | ||
278 | if self._repo_hooks_project and (self._repo_hooks_project.name == name): | ||
279 | self._repo_hooks_project = None | ||
261 | 280 | ||
262 | for node in config.childNodes: | 281 | for node in config.childNodes: |
263 | if node.nodeName == 'remote': | 282 | if node.nodeName == 'remote': |
264 | remote = self._ParseRemote(node) | 283 | remote = self._ParseRemote(node) |
265 | if self._remotes.get(remote.name): | 284 | if self._remotes.get(remote.name): |
266 | raise ManifestParseError, \ | 285 | raise ManifestParseError( |
267 | 'duplicate remote %s in %s' % \ | 286 | 'duplicate remote %s in %s' % |
268 | (remote.name, self.manifestFile) | 287 | (remote.name, self.manifestFile)) |
269 | self._remotes[remote.name] = remote | 288 | self._remotes[remote.name] = remote |
270 | 289 | ||
271 | for node in config.childNodes: | 290 | for node in config.childNodes: |
272 | if node.nodeName == 'default': | 291 | if node.nodeName == 'default': |
273 | if self._default is not None: | 292 | if self._default is not None: |
274 | raise ManifestParseError, \ | 293 | raise ManifestParseError( |
275 | 'duplicate default in %s' % \ | 294 | 'duplicate default in %s' % |
276 | (self.manifestFile) | 295 | (self.manifestFile)) |
277 | self._default = self._ParseDefault(node) | 296 | self._default = self._ParseDefault(node) |
278 | if self._default is None: | 297 | if self._default is None: |
279 | self._default = _Default() | 298 | self._default = _Default() |
@@ -281,29 +300,52 @@ class XmlManifest(object): | |||
281 | for node in config.childNodes: | 300 | for node in config.childNodes: |
282 | if node.nodeName == 'notice': | 301 | if node.nodeName == 'notice': |
283 | if self._notice is not None: | 302 | if self._notice is not None: |
284 | raise ManifestParseError, \ | 303 | raise ManifestParseError( |
285 | 'duplicate notice in %s' % \ | 304 | 'duplicate notice in %s' % |
286 | (self.manifestFile) | 305 | (self.manifestFile)) |
287 | self._notice = self._ParseNotice(node) | 306 | self._notice = self._ParseNotice(node) |
288 | 307 | ||
289 | for node in config.childNodes: | 308 | for node in config.childNodes: |
290 | if node.nodeName == 'manifest-server': | 309 | if node.nodeName == 'manifest-server': |
291 | url = self._reqatt(node, 'url') | 310 | url = self._reqatt(node, 'url') |
292 | if self._manifest_server is not None: | 311 | if self._manifest_server is not None: |
293 | raise ManifestParseError, \ | 312 | raise ManifestParseError( |
294 | 'duplicate manifest-server in %s' % \ | 313 | 'duplicate manifest-server in %s' % |
295 | (self.manifestFile) | 314 | (self.manifestFile)) |
296 | self._manifest_server = url | 315 | self._manifest_server = url |
297 | 316 | ||
298 | for node in config.childNodes: | 317 | for node in config.childNodes: |
299 | if node.nodeName == 'project': | 318 | if node.nodeName == 'project': |
300 | project = self._ParseProject(node) | 319 | project = self._ParseProject(node) |
301 | if self._projects.get(project.name): | 320 | if self._projects.get(project.name): |
302 | raise ManifestParseError, \ | 321 | raise ManifestParseError( |
303 | 'duplicate project %s in %s' % \ | 322 | 'duplicate project %s in %s' % |
304 | (project.name, self.manifestFile) | 323 | (project.name, self.manifestFile)) |
305 | self._projects[project.name] = project | 324 | self._projects[project.name] = project |
306 | 325 | ||
326 | for node in config.childNodes: | ||
327 | if node.nodeName == 'repo-hooks': | ||
328 | # Get the name of the project and the (space-separated) list of enabled. | ||
329 | repo_hooks_project = self._reqatt(node, 'in-project') | ||
330 | enabled_repo_hooks = self._reqatt(node, 'enabled-list').split() | ||
331 | |||
332 | # Only one project can be the hooks project | ||
333 | if self._repo_hooks_project is not None: | ||
334 | raise ManifestParseError( | ||
335 | 'duplicate repo-hooks in %s' % | ||
336 | (self.manifestFile)) | ||
337 | |||
338 | # Store a reference to the Project. | ||
339 | try: | ||
340 | self._repo_hooks_project = self._projects[repo_hooks_project] | ||
341 | except KeyError: | ||
342 | raise ManifestParseError( | ||
343 | 'project %s not found for repo-hooks' % | ||
344 | (repo_hooks_project)) | ||
345 | |||
346 | # Store the enabled hooks in the Project object. | ||
347 | self._repo_hooks_project.enabled_repo_hooks = enabled_repo_hooks | ||
348 | |||
307 | def _AddMetaProjectMirror(self, m): | 349 | def _AddMetaProjectMirror(self, m): |
308 | name = None | 350 | name = None |
309 | m_url = m.GetRemote(m.remote.name).url | 351 | m_url = m.GetRemote(m.remote.name).url |