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