diff options
Diffstat (limited to 'manifest_xml.py')
-rw-r--r-- | manifest_xml.py | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/manifest_xml.py b/manifest_xml.py index e2f58e62..3517c151 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,12 @@ 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) | ||
264 | if p.upstream and p.upstream != p.revisionExpr: | ||
265 | e.setAttribute('upstream', p.upstream) | ||
257 | 266 | ||
258 | for c in p.copyfiles: | 267 | for c in p.copyfiles: |
259 | ce = doc.createElement('copyfile') | 268 | ce = doc.createElement('copyfile') |
@@ -310,7 +319,7 @@ class XmlManifest(object): | |||
310 | @property | 319 | @property |
311 | def projects(self): | 320 | def projects(self): |
312 | self._Load() | 321 | self._Load() |
313 | return self._paths.values() | 322 | return list(self._paths.values()) |
314 | 323 | ||
315 | @property | 324 | @property |
316 | def remotes(self): | 325 | def remotes(self): |
@@ -592,8 +601,11 @@ class XmlManifest(object): | |||
592 | review = node.getAttribute('review') | 601 | review = node.getAttribute('review') |
593 | if review == '': | 602 | if review == '': |
594 | review = None | 603 | review = None |
604 | revision = node.getAttribute('revision') | ||
605 | if revision == '': | ||
606 | revision = None | ||
595 | manifestUrl = self.manifestProject.config.GetString('remote.origin.url') | 607 | manifestUrl = self.manifestProject.config.GetString('remote.origin.url') |
596 | return _XmlRemote(name, alias, fetch, manifestUrl, review) | 608 | return _XmlRemote(name, alias, fetch, manifestUrl, review, revision) |
597 | 609 | ||
598 | def _ParseDefault(self, node): | 610 | def _ParseDefault(self, node): |
599 | """ | 611 | """ |
@@ -686,7 +698,7 @@ class XmlManifest(object): | |||
686 | raise ManifestParseError("no remote for project %s within %s" % | 698 | raise ManifestParseError("no remote for project %s within %s" % |
687 | (name, self.manifestFile)) | 699 | (name, self.manifestFile)) |
688 | 700 | ||
689 | revisionExpr = node.getAttribute('revision') | 701 | revisionExpr = node.getAttribute('revision') or remote.revision |
690 | if not revisionExpr: | 702 | if not revisionExpr: |
691 | revisionExpr = self._default.revisionExpr | 703 | revisionExpr = self._default.revisionExpr |
692 | if not revisionExpr: | 704 | if not revisionExpr: |
@@ -872,10 +884,8 @@ class XmlManifest(object): | |||
872 | fromProjects = self.paths | 884 | fromProjects = self.paths |
873 | toProjects = manifest.paths | 885 | toProjects = manifest.paths |
874 | 886 | ||
875 | fromKeys = fromProjects.keys() | 887 | fromKeys = sorted(fromProjects.keys()) |
876 | fromKeys.sort() | 888 | toKeys = sorted(toProjects.keys()) |
877 | toKeys = toProjects.keys() | ||
878 | toKeys.sort() | ||
879 | 889 | ||
880 | diff = {'added': [], 'removed': [], 'changed': [], 'unreachable': []} | 890 | diff = {'added': [], 'removed': [], 'changed': [], 'unreachable': []} |
881 | 891 | ||