diff options
Diffstat (limited to 'manifest_xml.py')
-rw-r--r-- | manifest_xml.py | 80 |
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 | |||
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,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 |