Merge "On project cleanup, don't remove nested projects"
diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt
index 8fd9137..2a07f19 100644
--- a/docs/manifest-format.txt
+++ b/docs/manifest-format.txt
@@ -35,6 +35,7 @@
<!ATTLIST remote name ID #REQUIRED>
<!ATTLIST remote alias CDATA #IMPLIED>
<!ATTLIST remote fetch CDATA #REQUIRED>
+ <!ATTLIST remote pushurl CDATA #IMPLIED>
<!ATTLIST remote review CDATA #IMPLIED>
<!ATTLIST remote revision CDATA #IMPLIED>
@@ -125,6 +126,12 @@
this remote. Each project's name is appended to this prefix to
form the actual URL used to clone the project.
+Attribute `pushurl`: The Git "push" URL prefix for all projects
+which use this remote. Each project's name is appended to this
+prefix to form the actual URL used to "git push" the project.
+This attribute is optional; if not specified then "git push"
+will use the same URL as the `fetch` attribute.
+
Attribute `review`: Hostname of the Gerrit server where reviews
are uploaded to by `repo upload`. This attribute is optional;
if not specified then `repo upload` will not function.
diff --git a/git_config.py b/git_config.py
index f76cd04..f474a1c 100644
--- a/git_config.py
+++ b/git_config.py
@@ -572,6 +572,7 @@
self._config = config
self.name = name
self.url = self._Get('url')
+ self.pushUrl = self._Get('pushurl')
self.review = self._Get('review')
self.projectname = self._Get('projectname')
self.fetch = list(map(RefSpec.FromString,
@@ -701,6 +702,10 @@
"""Save this remote to the configuration.
"""
self._Set('url', self.url)
+ if self.pushUrl is not None:
+ self._Set('pushurl', self.pushUrl + '/' + self.projectname)
+ else:
+ self._Set('pushurl', self.pushUrl)
self._Set('review', self.review)
self._Set('projectname', self.projectname)
self._Set('fetch', list(map(str, self.fetch)))
diff --git a/manifest_xml.py b/manifest_xml.py
index 295493d..9c882af 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -64,11 +64,13 @@
name,
alias=None,
fetch=None,
+ pushUrl=None,
manifestUrl=None,
review=None,
revision=None):
self.name = name
self.fetchUrl = fetch
+ self.pushUrl = pushUrl
self.manifestUrl = manifestUrl
self.remoteAlias = alias
self.reviewUrl = review
@@ -104,6 +106,7 @@
remoteName = self.remoteAlias
return RemoteSpec(remoteName,
url=url,
+ pushUrl=self.pushUrl,
review=self.reviewUrl,
orig_name=self.name)
@@ -160,6 +163,8 @@
root.appendChild(e)
e.setAttribute('name', r.name)
e.setAttribute('fetch', r.fetchUrl)
+ if r.pushUrl is not None:
+ e.setAttribute('pushurl', r.pushUrl)
if r.remoteAlias is not None:
e.setAttribute('alias', r.remoteAlias)
if r.reviewUrl is not None:
@@ -639,6 +644,9 @@
if alias == '':
alias = None
fetch = self._reqatt(node, 'fetch')
+ pushUrl = node.getAttribute('pushurl')
+ if pushUrl == '':
+ pushUrl = None
review = node.getAttribute('review')
if review == '':
review = None
@@ -646,7 +654,7 @@
if revision == '':
revision = None
manifestUrl = self.manifestProject.config.GetString('remote.origin.url')
- return _XmlRemote(name, alias, fetch, manifestUrl, review, revision)
+ return _XmlRemote(name, alias, fetch, pushUrl, manifestUrl, review, revision)
def _ParseDefault(self, node):
"""
diff --git a/project.py b/project.py
index 0a86a71..142258e 100644
--- a/project.py
+++ b/project.py
@@ -320,11 +320,13 @@
def __init__(self,
name,
url=None,
+ pushUrl=None,
review=None,
revision=None,
orig_name=None):
self.name = name
self.url = url
+ self.pushUrl = pushUrl
self.review = review
self.revision = revision
self.orig_name = orig_name
@@ -1825,6 +1827,7 @@
remote = RemoteSpec(self.remote.name,
url=url,
+ pushUrl=self.remote.pushUrl,
review=self.remote.review,
revision=self.remote.revision)
subproject = Project(manifest=self.manifest,
@@ -2346,6 +2349,7 @@
if self.remote.url:
remote = self.GetRemote(self.remote.name)
remote.url = self.remote.url
+ remote.pushUrl = self.remote.pushUrl
remote.review = self.remote.review
remote.projectname = self.name