summaryrefslogtreecommitdiffstats
path: root/manifest_xml.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest_xml.py')
-rw-r--r--manifest_xml.py46
1 files changed, 35 insertions, 11 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index 3c8fadd6..fdc31778 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -63,12 +63,14 @@ class _XmlRemote(object):
63 alias=None, 63 alias=None,
64 fetch=None, 64 fetch=None,
65 manifestUrl=None, 65 manifestUrl=None,
66 review=None): 66 review=None,
67 revision=None):
67 self.name = name 68 self.name = name
68 self.fetchUrl = fetch 69 self.fetchUrl = fetch
69 self.manifestUrl = manifestUrl 70 self.manifestUrl = manifestUrl
70 self.remoteAlias = alias 71 self.remoteAlias = alias
71 self.reviewUrl = review 72 self.reviewUrl = review
73 self.revision = revision
72 self.resolvedFetchUrl = self._resolveFetchUrl() 74 self.resolvedFetchUrl = self._resolveFetchUrl()
73 75
74 def __eq__(self, other): 76 def __eq__(self, other):
@@ -159,6 +161,8 @@ class XmlManifest(object):
159 e.setAttribute('alias', r.remoteAlias) 161 e.setAttribute('alias', r.remoteAlias)
160 if r.reviewUrl is not None: 162 if r.reviewUrl is not None:
161 e.setAttribute('review', r.reviewUrl) 163 e.setAttribute('review', r.reviewUrl)
164 if r.revision is not None:
165 e.setAttribute('revision', r.revision)
162 166
163 def Save(self, fd, peg_rev=False, peg_rev_upstream=True): 167 def Save(self, fd, peg_rev=False, peg_rev_upstream=True):
164 """Write the current manifest out to the given file descriptor. 168 """Write the current manifest out to the given file descriptor.
@@ -240,7 +244,8 @@ class XmlManifest(object):
240 if d.remote: 244 if d.remote:
241 remoteName = d.remote.remoteAlias or d.remote.name 245 remoteName = d.remote.remoteAlias or d.remote.name
242 if not d.remote or p.remote.name != remoteName: 246 if not d.remote or p.remote.name != remoteName:
243 e.setAttribute('remote', p.remote.name) 247 remoteName = p.remote.name
248 e.setAttribute('remote', remoteName)
244 if peg_rev: 249 if peg_rev:
245 if self.IsMirror: 250 if self.IsMirror:
246 value = p.bare_git.rev_parse(p.revisionExpr + '^0') 251 value = p.bare_git.rev_parse(p.revisionExpr + '^0')
@@ -252,8 +257,10 @@ class XmlManifest(object):
252 # isn't our value, and the if the default doesn't already have that 257 # isn't our value, and the if the default doesn't already have that
253 # covered. 258 # covered.
254 e.setAttribute('upstream', p.revisionExpr) 259 e.setAttribute('upstream', p.revisionExpr)
255 elif not d.revisionExpr or p.revisionExpr != d.revisionExpr: 260 else:
256 e.setAttribute('revision', p.revisionExpr) 261 revision = self.remotes[remoteName].revision or d.revisionExpr
262 if not revision or revision != p.revisionExpr:
263 e.setAttribute('revision', p.revisionExpr)
257 264
258 for c in p.copyfiles: 265 for c in p.copyfiles:
259 ce = doc.createElement('copyfile') 266 ce = doc.createElement('copyfile')
@@ -261,6 +268,12 @@ class XmlManifest(object):
261 ce.setAttribute('dest', c.dest) 268 ce.setAttribute('dest', c.dest)
262 e.appendChild(ce) 269 e.appendChild(ce)
263 270
271 for l in p.linkfiles:
272 le = doc.createElement('linkfile')
273 le.setAttribute('src', l.src)
274 le.setAttribute('dest', l.dest)
275 e.appendChild(le)
276
264 default_groups = ['all', 'name:%s' % p.name, 'path:%s' % p.relpath] 277 default_groups = ['all', 'name:%s' % p.name, 'path:%s' % p.relpath]
265 egroups = [g for g in p.groups if g not in default_groups] 278 egroups = [g for g in p.groups if g not in default_groups]
266 if egroups: 279 if egroups:
@@ -304,7 +317,7 @@ class XmlManifest(object):
304 @property 317 @property
305 def projects(self): 318 def projects(self):
306 self._Load() 319 self._Load()
307 return self._paths.values() 320 return list(self._paths.values())
308 321
309 @property 322 @property
310 def remotes(self): 323 def remotes(self):
@@ -586,8 +599,11 @@ class XmlManifest(object):
586 review = node.getAttribute('review') 599 review = node.getAttribute('review')
587 if review == '': 600 if review == '':
588 review = None 601 review = None
602 revision = node.getAttribute('revision')
603 if revision == '':
604 revision = None
589 manifestUrl = self.manifestProject.config.GetString('remote.origin.url') 605 manifestUrl = self.manifestProject.config.GetString('remote.origin.url')
590 return _XmlRemote(name, alias, fetch, manifestUrl, review) 606 return _XmlRemote(name, alias, fetch, manifestUrl, review, revision)
591 607
592 def _ParseDefault(self, node): 608 def _ParseDefault(self, node):
593 """ 609 """
@@ -680,7 +696,7 @@ class XmlManifest(object):
680 raise ManifestParseError("no remote for project %s within %s" % 696 raise ManifestParseError("no remote for project %s within %s" %
681 (name, self.manifestFile)) 697 (name, self.manifestFile))
682 698
683 revisionExpr = node.getAttribute('revision') 699 revisionExpr = node.getAttribute('revision') or remote.revision
684 if not revisionExpr: 700 if not revisionExpr:
685 revisionExpr = self._default.revisionExpr 701 revisionExpr = self._default.revisionExpr
686 if not revisionExpr: 702 if not revisionExpr:
@@ -765,6 +781,8 @@ class XmlManifest(object):
765 for n in node.childNodes: 781 for n in node.childNodes:
766 if n.nodeName == 'copyfile': 782 if n.nodeName == 'copyfile':
767 self._ParseCopyFile(project, n) 783 self._ParseCopyFile(project, n)
784 if n.nodeName == 'linkfile':
785 self._ParseLinkFile(project, n)
768 if n.nodeName == 'annotation': 786 if n.nodeName == 'annotation':
769 self._ParseAnnotation(project, n) 787 self._ParseAnnotation(project, n)
770 if n.nodeName == 'project': 788 if n.nodeName == 'project':
@@ -814,6 +832,14 @@ class XmlManifest(object):
814 # dest is relative to the top of the tree 832 # dest is relative to the top of the tree
815 project.AddCopyFile(src, dest, os.path.join(self.topdir, dest)) 833 project.AddCopyFile(src, dest, os.path.join(self.topdir, dest))
816 834
835 def _ParseLinkFile(self, project, node):
836 src = self._reqatt(node, 'src')
837 dest = self._reqatt(node, 'dest')
838 if not self.IsMirror:
839 # src is project relative;
840 # dest is relative to the top of the tree
841 project.AddLinkFile(src, dest, os.path.join(self.topdir, dest))
842
817 def _ParseAnnotation(self, project, node): 843 def _ParseAnnotation(self, project, node):
818 name = self._reqatt(node, 'name') 844 name = self._reqatt(node, 'name')
819 value = self._reqatt(node, 'value') 845 value = self._reqatt(node, 'value')
@@ -856,10 +882,8 @@ class XmlManifest(object):
856 fromProjects = self.paths 882 fromProjects = self.paths
857 toProjects = manifest.paths 883 toProjects = manifest.paths
858 884
859 fromKeys = fromProjects.keys() 885 fromKeys = sorted(fromProjects.keys())
860 fromKeys.sort() 886 toKeys = sorted(toProjects.keys())
861 toKeys = toProjects.keys()
862 toKeys.sort()
863 887
864 diff = {'added': [], 'removed': [], 'changed': [], 'unreachable': []} 888 diff = {'added': [], 'removed': [], 'changed': [], 'unreachable': []}
865 889