From d648045366b3710c834531295bd643bceb0c612c Mon Sep 17 00:00:00 2001 From: Steve Rae Date: Wed, 10 Aug 2016 15:00:00 -0700 Subject: [PATCH] implement optional 'pushurl' in the manifest file Allow the 'remote' element in the manifest file to define an optional 'pushurl' attribute which is passed into the .git/config file. Change-Id: If342d299d371374aedc4440645798888869c9714 Signed-off-by: Steve Rae --- docs/manifest-format.txt | 7 +++++++ git_config.py | 5 +++++ manifest_xml.py | 10 +++++++++- project.py | 4 ++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/docs/manifest-format.txt b/docs/manifest-format.txt index 8fd9137c..2a07f199 100644 --- a/docs/manifest-format.txt +++ b/docs/manifest-format.txt @@ -35,6 +35,7 @@ following DTD: + @@ -125,6 +126,12 @@ Attribute `fetch`: The Git 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 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 f76cd04e..f474a1c9 100644 --- a/git_config.py +++ b/git_config.py @@ -572,6 +572,7 @@ class Remote(object): 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 @@ class Remote(object): """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 295493de..9c882af6 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -64,11 +64,13 @@ class _XmlRemote(object): 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 @@ class _XmlRemote(object): remoteName = self.remoteAlias return RemoteSpec(remoteName, url=url, + pushUrl=self.pushUrl, review=self.reviewUrl, orig_name=self.name) @@ -160,6 +163,8 @@ class XmlManifest(object): 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 @@ class XmlManifest(object): 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 @@ class XmlManifest(object): 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 0a86a718..142258e4 100644 --- a/project.py +++ b/project.py @@ -320,11 +320,13 @@ class RemoteSpec(object): 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 @@ class Project(object): 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 @@ class Project(object): 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