summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py80
1 files changed, 45 insertions, 35 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index 7d02f9d6..d888653d 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,18 +73,18 @@ 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 try: 84 try:
84 if os.path.exists(self.manifestFile): 85 if os.path.exists(self._manifestFile):
85 os.remove(self.manifestFile) 86 os.remove(self._manifestFile)
86 os.symlink('manifests/%s' % name, self.manifestFile) 87 os.symlink('manifests/%s' % name, self._manifestFile)
87 except OSError, e: 88 except OSError, e:
88 raise ManifestParseError('cannot link manifest %s' % name) 89 raise ManifestParseError('cannot link manifest %s' % name)
89 90
@@ -168,9 +169,15 @@ class XmlManifest(object):
168 self._Load() 169 self._Load()
169 return self._default 170 return self._default
170 171
171 @property 172 def InitBranch(self):
172 def IsMirror(self): 173 m = self.manifestProject
173 return self.manifestProject.config.GetBoolean('repo.mirror') 174 if m.CurrentBranch is None:
175 return m.StartBranch('default')
176 return True
177
178 def SetMRefs(self, project):
179 if self.branch:
180 project._InitAnyMRef(R_M + self.branch)
174 181
175 def _Unload(self): 182 def _Unload(self):
176 self._loaded = False 183 self._loaded = False
@@ -182,7 +189,10 @@ class XmlManifest(object):
182 def _Load(self): 189 def _Load(self):
183 if not self._loaded: 190 if not self._loaded:
184 m = self.manifestProject 191 m = self.manifestProject
185 b = m.GetBranch(m.CurrentBranch).merge 192 b = m.GetBranch(m.CurrentBranch)
193 if b.remote and b.remote.name:
194 m.remote.name = b.remote.name
195 b = b.merge
186 if b is not None and b.startswith(R_HEADS): 196 if b is not None and b.startswith(R_HEADS):
187 b = b[len(R_HEADS):] 197 b = b[len(R_HEADS):]
188 self.branch = b 198 self.branch = b
@@ -192,11 +202,11 @@ class XmlManifest(object):
192 local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME) 202 local = os.path.join(self.repodir, LOCAL_MANIFEST_NAME)
193 if os.path.exists(local): 203 if os.path.exists(local):
194 try: 204 try:
195 real = self.manifestFile 205 real = self._manifestFile
196 self.manifestFile = local 206 self._manifestFile = local
197 self._ParseManifest(False) 207 self._ParseManifest(False)
198 finally: 208 finally:
199 self.manifestFile = real 209 self._manifestFile = real
200 210
201 if self.IsMirror: 211 if self.IsMirror:
202 self._AddMetaProjectMirror(self.repoProject) 212 self._AddMetaProjectMirror(self.repoProject)
@@ -205,17 +215,17 @@ class XmlManifest(object):
205 self._loaded = True 215 self._loaded = True
206 216
207 def _ParseManifest(self, is_root_file): 217 def _ParseManifest(self, is_root_file):
208 root = xml.dom.minidom.parse(self.manifestFile) 218 root = xml.dom.minidom.parse(self._manifestFile)
209 if not root or not root.childNodes: 219 if not root or not root.childNodes:
210 raise ManifestParseError, \ 220 raise ManifestParseError, \
211 "no root node in %s" % \ 221 "no root node in %s" % \
212 self.manifestFile 222 self._manifestFile
213 223
214 config = root.childNodes[0] 224 config = root.childNodes[0]
215 if config.nodeName != 'manifest': 225 if config.nodeName != 'manifest':
216 raise ManifestParseError, \ 226 raise ManifestParseError, \
217 "no <manifest> in %s" % \ 227 "no <manifest> in %s" % \
218 self.manifestFile 228 self._manifestFile
219 229
220 for node in config.childNodes: 230 for node in config.childNodes:
221 if node.nodeName == 'remove-project': 231 if node.nodeName == 'remove-project':
@@ -233,7 +243,7 @@ class XmlManifest(object):
233 if self._remotes.get(remote.name): 243 if self._remotes.get(remote.name):
234 raise ManifestParseError, \ 244 raise ManifestParseError, \
235 'duplicate remote %s in %s' % \ 245 'duplicate remote %s in %s' % \
236 (remote.name, self.manifestFile) 246 (remote.name, self._manifestFile)
237 self._remotes[remote.name] = remote 247 self._remotes[remote.name] = remote
238 248
239 for node in config.childNodes: 249 for node in config.childNodes:
@@ -241,7 +251,7 @@ class XmlManifest(object):
241 if self._default is not None: 251 if self._default is not None:
242 raise ManifestParseError, \ 252 raise ManifestParseError, \
243 'duplicate default in %s' % \ 253 'duplicate default in %s' % \
244 (self.manifestFile) 254 (self._manifestFile)
245 self._default = self._ParseDefault(node) 255 self._default = self._ParseDefault(node)
246 if self._default is None: 256 if self._default is None:
247 self._default = _Default() 257 self._default = _Default()
@@ -252,7 +262,7 @@ class XmlManifest(object):
252 if self._projects.get(project.name): 262 if self._projects.get(project.name):
253 raise ManifestParseError, \ 263 raise ManifestParseError, \
254 'duplicate project %s in %s' % \ 264 'duplicate project %s in %s' % \
255 (project.name, self.manifestFile) 265 (project.name, self._manifestFile)
256 self._projects[project.name] = project 266 self._projects[project.name] = project
257 267
258 def _AddMetaProjectMirror(self, m): 268 def _AddMetaProjectMirror(self, m):
@@ -324,7 +334,7 @@ class XmlManifest(object):
324 if remote is None: 334 if remote is None:
325 raise ManifestParseError, \ 335 raise ManifestParseError, \
326 "no remote for project %s within %s" % \ 336 "no remote for project %s within %s" % \
327 (name, self.manifestFile) 337 (name, self._manifestFile)
328 338
329 revisionExpr = node.getAttribute('revision') 339 revisionExpr = node.getAttribute('revision')
330 if not revisionExpr: 340 if not revisionExpr:
@@ -332,7 +342,7 @@ class XmlManifest(object):
332 if not revisionExpr: 342 if not revisionExpr:
333 raise ManifestParseError, \ 343 raise ManifestParseError, \
334 "no revision for project %s within %s" % \ 344 "no revision for project %s within %s" % \
335 (name, self.manifestFile) 345 (name, self._manifestFile)
336 346
337 path = node.getAttribute('path') 347 path = node.getAttribute('path')
338 if not path: 348 if not path:
@@ -340,7 +350,7 @@ class XmlManifest(object):
340 if path.startswith('/'): 350 if path.startswith('/'):
341 raise ManifestParseError, \ 351 raise ManifestParseError, \
342 "project %s path cannot be absolute in %s" % \ 352 "project %s path cannot be absolute in %s" % \
343 (name, self.manifestFile) 353 (name, self._manifestFile)
344 354
345 if self.IsMirror: 355 if self.IsMirror:
346 relpath = None 356 relpath = None
@@ -382,7 +392,7 @@ class XmlManifest(object):
382 if not v: 392 if not v:
383 raise ManifestParseError, \ 393 raise ManifestParseError, \
384 "remote %s not defined in %s" % \ 394 "remote %s not defined in %s" % \
385 (name, self.manifestFile) 395 (name, self._manifestFile)
386 return v 396 return v
387 397
388 def _reqatt(self, node, attname): 398 def _reqatt(self, node, attname):
@@ -393,5 +403,5 @@ class XmlManifest(object):
393 if not v: 403 if not v:
394 raise ManifestParseError, \ 404 raise ManifestParseError, \
395 "no %s in <%s> within %s" % \ 405 "no %s in <%s> within %s" % \
396 (attname, node.nodeName, self.manifestFile) 406 (attname, node.nodeName, self._manifestFile)
397 return v 407 return v