summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py82
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
17import sys 17import sys
18import xml.dom.minidom 18import xml.dom.minidom
19 19
20from git_config import GitConfig, IsId 20from git_config import GitConfig
21from project import RemoteSpec, Project, MetaProject, R_HEADS, HEAD 21from git_config import IsId
22from manifest import Manifest
23from project import RemoteSpec
24from project import Project
25from project import MetaProject
26from project import R_HEADS
27from project import HEAD
22from error import ManifestParseError 28from error import ManifestParseError
23 29
24MANIFEST_FILE_NAME = 'manifest.xml' 30MANIFEST_FILE_NAME = 'manifest.xml'
25LOCAL_MANIFEST_NAME = 'local_manifest.xml' 31LOCAL_MANIFEST_NAME = 'local_manifest.xml'
32R_M = 'refs/remotes/m/'
26 33
27class _Default(object): 34class _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
49class XmlManifest(object): 56class 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