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 |
