diff options
Diffstat (limited to 'manifest_xml.py')
| -rw-r--r-- | manifest_xml.py | 82 |
1 files changed, 46 insertions, 36 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index 9d68f09f..1d02f9d4 100644 --- a/manifest_xml.py +++ b/manifest_xml.py | |||
| @@ -17,12 +17,19 @@ import os | |||
| 17 | import sys | 17 | import sys |
| 18 | import xml.dom.minidom | 18 | import xml.dom.minidom |
| 19 | 19 | ||
| 20 | from git_config import GitConfig, IsId | 20 | from git_config import GitConfig |
| 21 | from project import RemoteSpec, Project, MetaProject, R_HEADS, HEAD | 21 | from git_config import IsId |
| 22 | from manifest import Manifest | ||
| 23 | from project import RemoteSpec | ||
| 24 | from project import Project | ||
| 25 | from project import MetaProject | ||
| 26 | from project import R_HEADS | ||
| 27 | from project import HEAD | ||
| 22 | from error import ManifestParseError | 28 | from error import ManifestParseError |
| 23 | 29 | ||
| 24 | MANIFEST_FILE_NAME = 'manifest.xml' | 30 | MANIFEST_FILE_NAME = 'manifest.xml' |
| 25 | LOCAL_MANIFEST_NAME = 'local_manifest.xml' | 31 | LOCAL_MANIFEST_NAME = 'local_manifest.xml' |
| 32 | R_M = 'refs/remotes/m/' | ||
| 26 | 33 | ||
| 27 | class _Default(object): | 34 | class _Default(object): |
| 28 | """Project defaults within the manifest.""" | 35 | """Project defaults within the manifest.""" |
| @@ -46,19 +53,13 @@ class _XmlRemote(object): | |||
| 46 | url += '/%s.git' % projectName | 53 | url += '/%s.git' % projectName |
| 47 | return RemoteSpec(self.name, url, self.reviewUrl) | 54 | return RemoteSpec(self.name, url, self.reviewUrl) |
| 48 | 55 | ||
| 49 | class XmlManifest(object): | 56 | class XmlManifest(Manifest): |
| 50 | """manages the repo configuration file""" | 57 | """manages the repo configuration file""" |
| 51 | 58 | ||
| 52 | def __init__(self, repodir): | 59 | def __init__(self, repodir): |
| 53 | self.repodir = os.path.abspath(repodir) | 60 | Manifest.__init__(self, repodir) |
| 54 | self.topdir = os.path.dirname(self.repodir) | ||
| 55 | self.manifestFile = os.path.join(self.repodir, MANIFEST_FILE_NAME) | ||
| 56 | self.globalConfig = GitConfig.ForUser() | ||
| 57 | |||
| 58 | self.repoProject = MetaProject(self, 'repo', | ||
| 59 | gitdir = os.path.join(repodir, 'repo/.git'), | ||
| 60 | worktree = os.path.join(repodir, 'repo')) | ||
| 61 | 61 | ||
| 62 | self._manifestFile = os.path.join(repodir, MANIFEST_FILE_NAME) | ||
| 62 | self.manifestProject = MetaProject(self, 'manifests', | 63 | self.manifestProject = MetaProject(self, 'manifests', |
| 63 | gitdir = os.path.join(repodir, 'manifests.git'), | 64 | gitdir = os.path.join(repodir, 'manifests.git'), |
| 64 | worktree = os.path.join(repodir, 'manifests')) | 65 | worktree = os.path.join(repodir, 'manifests')) |
| @@ -72,13 +73,13 @@ class XmlManifest(object): | |||
| 72 | if not os.path.isfile(path): | 73 | if not os.path.isfile(path): |
| 73 | raise ManifestParseError('manifest %s not found' % name) | 74 | raise ManifestParseError('manifest %s not found' % name) |
| 74 | 75 | ||
| 75 | old = self.manifestFile | 76 | old = self._manifestFile |
| 76 | try: | 77 | try: |
| 77 | self.manifestFile = path | 78 | self._manifestFile = path |
| 78 | self._Unload() | 79 | self._Unload() |
| 79 | self._Load() | 80 | self._Load() |
| 80 | finally: | 81 | finally: |
| 81 | self.manifestFile = old | 82 | self._manifestFile = old |
| 82 | 83 | ||
| 83 | def Link(self, name): | 84 | def Link(self, name): |
| 84 | """Update the repo metadata to use a different manifest. | 85 | """Update the repo metadata to use a different manifest. |
| @@ -86,9 +87,9 @@ class XmlManifest(object): | |||
| 86 | self.Override(name) | 87 | self.Override(name) |
| 87 | 88 | ||
| 88 | try: | 89 | try: |
| 89 | if os.path.exists(self.manifestFile): | 90 | if os.path.exists(self._manifestFile): |
| 90 | os.remove(self.manifestFile) | 91 | os.remove(self._manifestFile) |
| 91 | os.symlink('manifests/%s' % name, self.manifestFile) | 92 | os.symlink('manifests/%s' % name, self._manifestFile) |
| 92 | except OSError, e: | 93 | except OSError, e: |
| 93 | raise ManifestParseError('cannot link manifest %s' % name) | 94 | raise ManifestParseError('cannot link manifest %s' % name) |
| 94 | 95 | ||
| @@ -198,9 +199,15 @@ class XmlManifest(object): | |||
| 198 | self._Load() | 199 | self._Load() |
| 199 | return self._manifest_server | 200 | return self._manifest_server |
| 200 | 201 | ||
| 201 | @property | 202 | def InitBranch(self): |
| 202 | def IsMirror(self): | 203 | m = self.manifestProject |
| 203 | return self.manifestProject.config.GetBoolean('repo.mirror') | 204 | if m.CurrentBranch is None: |
| 205 | return m.StartBranch('default') | ||
| 206 | return True | ||
| 207 | |||
| 208 | def SetMRefs(self, project): | ||
| 209 | if self.branch: | ||
| 210 | project._InitAnyMRef(R_M + self.branch) | ||
| 204 | 211 | ||
| 205 | def _Unload(self): | 212 | def _Unload(self): |
| 206 | self._loaded = False | 213 | self._loaded = False |
| @@ -214,7 +221,10 @@ class XmlManifest(object): | |||
| 214 | def _Load(self): | 221 | def _Load(self): |
| 215 | if not self._loaded: | 222 | if not self._loaded: |
| 216 | m = self.manifestProject | 223 | m = self.manifestProject |
| 217 | b = m.GetBranch(m.CurrentBranch).merge | 224 | b = m.GetBranch(m.CurrentBranch) |
| 225 | if b.remote and b.remote.name: | ||
| 226 | m.remote.name = b.remote.name | ||
| 227 | b = b.merge | ||
| 218 | if b is not None and b.startswith(R_HEADS): | 228 | if b is not None and b.startswith(R_HEADS): |
| 219 | b = b[len(R_HEADS):] | 229 | b = b[len(R_HEADS):] |
| 220 | self.branch = b | 230 | self.branch = b |
| @@ -224,11 +234,11 @@ class XmlManifest(object): | |||
| 224 | local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME) | 234 | local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME) |
| 225 | if os.path.exists(local): | 235 | if os.path.exists(local): |
| 226 | try: | 236 | try: |
| 227 | real = self.manifestFile | 237 | real = self._manifestFile |
| 228 | self.manifestFile = local | 238 | self._manifestFile = local |
| 229 | self._ParseManifest(False) | 239 | self._ParseManifest(False) |
| 230 | finally: | 240 | finally: |
| 231 | self.manifestFile = real | 241 | self._manifestFile = real |
| 232 | 242 | ||
| 233 | if self.IsMirror: | 243 | if self.IsMirror: |
| 234 | self._AddMetaProjectMirror(self.repoProject) | 244 | self._AddMetaProjectMirror(self.repoProject) |
| @@ -237,17 +247,17 @@ class XmlManifest(object): | |||
| 237 | self._loaded = True | 247 | self._loaded = True |
| 238 | 248 | ||
| 239 | def _ParseManifest(self, is_root_file): | 249 | def _ParseManifest(self, is_root_file): |
| 240 | root = xml.dom.minidom.parse(self.manifestFile) | 250 | root = xml.dom.minidom.parse(self._manifestFile) |
| 241 | if not root or not root.childNodes: | 251 | if not root or not root.childNodes: |
| 242 | raise ManifestParseError, \ | 252 | raise ManifestParseError, \ |
| 243 | "no root node in %s" % \ | 253 | "no root node in %s" % \ |
| 244 | self.manifestFile | 254 | self._manifestFile |
| 245 | 255 | ||
| 246 | config = root.childNodes[0] | 256 | config = root.childNodes[0] |
| 247 | if config.nodeName != 'manifest': | 257 | if config.nodeName != 'manifest': |
| 248 | raise ManifestParseError, \ | 258 | raise ManifestParseError, \ |
| 249 | "no <manifest> in %s" % \ | 259 | "no <manifest> in %s" % \ |
| 250 | self.manifestFile | 260 | self._manifestFile |
| 251 | 261 | ||
| 252 | for node in config.childNodes: | 262 | for node in config.childNodes: |
| 253 | if node.nodeName == 'remove-project': | 263 | if node.nodeName == 'remove-project': |
| @@ -265,7 +275,7 @@ class XmlManifest(object): | |||
| 265 | if self._remotes.get(remote.name): | 275 | if self._remotes.get(remote.name): |
| 266 | raise ManifestParseError, \ | 276 | raise ManifestParseError, \ |
| 267 | 'duplicate remote %s in %s' % \ | 277 | 'duplicate remote %s in %s' % \ |
| 268 | (remote.name, self.manifestFile) | 278 | (remote.name, self._manifestFile) |
| 269 | self._remotes[remote.name] = remote | 279 | self._remotes[remote.name] = remote |
| 270 | 280 | ||
| 271 | for node in config.childNodes: | 281 | for node in config.childNodes: |
| @@ -273,7 +283,7 @@ class XmlManifest(object): | |||
| 273 | if self._default is not None: | 283 | if self._default is not None: |
| 274 | raise ManifestParseError, \ | 284 | raise ManifestParseError, \ |
| 275 | 'duplicate default in %s' % \ | 285 | 'duplicate default in %s' % \ |
| 276 | (self.manifestFile) | 286 | (self._manifestFile) |
| 277 | self._default = self._ParseDefault(node) | 287 | self._default = self._ParseDefault(node) |
| 278 | if self._default is None: | 288 | if self._default is None: |
| 279 | self._default = _Default() | 289 | self._default = _Default() |
| @@ -301,7 +311,7 @@ class XmlManifest(object): | |||
| 301 | if self._projects.get(project.name): | 311 | if self._projects.get(project.name): |
| 302 | raise ManifestParseError, \ | 312 | raise ManifestParseError, \ |
| 303 | 'duplicate project %s in %s' % \ | 313 | 'duplicate project %s in %s' % \ |
| 304 | (project.name, self.manifestFile) | 314 | (project.name, self._manifestFile) |
| 305 | self._projects[project.name] = project | 315 | self._projects[project.name] = project |
| 306 | 316 | ||
| 307 | def _AddMetaProjectMirror(self, m): | 317 | def _AddMetaProjectMirror(self, m): |
| @@ -412,7 +422,7 @@ class XmlManifest(object): | |||
| 412 | if remote is None: | 422 | if remote is None: |
| 413 | raise ManifestParseError, \ | 423 | raise ManifestParseError, \ |
| 414 | "no remote for project %s within %s" % \ | 424 | "no remote for project %s within %s" % \ |
| 415 | (name, self.manifestFile) | 425 | (name, self._manifestFile) |
| 416 | 426 | ||
| 417 | revisionExpr = node.getAttribute('revision') | 427 | revisionExpr = node.getAttribute('revision') |
| 418 | if not revisionExpr: | 428 | if not revisionExpr: |
| @@ -420,7 +430,7 @@ class XmlManifest(object): | |||
| 420 | if not revisionExpr: | 430 | if not revisionExpr: |
| 421 | raise ManifestParseError, \ | 431 | raise ManifestParseError, \ |
| 422 | "no revision for project %s within %s" % \ | 432 | "no revision for project %s within %s" % \ |
| 423 | (name, self.manifestFile) | 433 | (name, self._manifestFile) |
| 424 | 434 | ||
| 425 | path = node.getAttribute('path') | 435 | path = node.getAttribute('path') |
| 426 | if not path: | 436 | if not path: |
| @@ -428,14 +438,14 @@ class XmlManifest(object): | |||
| 428 | if path.startswith('/'): | 438 | if path.startswith('/'): |
| 429 | raise ManifestParseError, \ | 439 | raise ManifestParseError, \ |
| 430 | "project %s path cannot be absolute in %s" % \ | 440 | "project %s path cannot be absolute in %s" % \ |
| 431 | (name, self.manifestFile) | 441 | (name, self._manifestFile) |
| 432 | 442 | ||
| 433 | if self.IsMirror: | 443 | if self.IsMirror: |
| 434 | relpath = None | 444 | relpath = None |
| 435 | worktree = None | 445 | worktree = None |
| 436 | gitdir = os.path.join(self.topdir, '%s.git' % name) | 446 | gitdir = os.path.join(self.topdir, '%s.git' % name) |
| 437 | else: | 447 | else: |
| 438 | worktree = os.path.join(self.topdir, path) | 448 | worktree = os.path.join(self.topdir, path).replace('\\', '/') |
| 439 | gitdir = os.path.join(self.repodir, 'projects/%s.git' % path) | 449 | gitdir = os.path.join(self.repodir, 'projects/%s.git' % path) |
| 440 | 450 | ||
| 441 | project = Project(manifest = self, | 451 | project = Project(manifest = self, |
| @@ -470,7 +480,7 @@ class XmlManifest(object): | |||
| 470 | if not v: | 480 | if not v: |
| 471 | raise ManifestParseError, \ | 481 | raise ManifestParseError, \ |
| 472 | "remote %s not defined in %s" % \ | 482 | "remote %s not defined in %s" % \ |
| 473 | (name, self.manifestFile) | 483 | (name, self._manifestFile) |
| 474 | return v | 484 | return v |
| 475 | 485 | ||
| 476 | def _reqatt(self, node, attname): | 486 | def _reqatt(self, node, attname): |
| @@ -481,5 +491,5 @@ class XmlManifest(object): | |||
| 481 | if not v: | 491 | if not v: |
| 482 | raise ManifestParseError, \ | 492 | raise ManifestParseError, \ |
| 483 | "no %s in <%s> within %s" % \ | 493 | "no %s in <%s> within %s" % \ |
| 484 | (attname, node.nodeName, self.manifestFile) | 494 | (attname, node.nodeName, self._manifestFile) |
| 485 | return v | 495 | return v |
