Add <remote project-name="..."> attribute within projects

By setting a project-name on a remote nested within a project forks
of a project like the Linux kernel can be easily handled by fetching
all relevant forks into the same client side project under different
remote names.  Developers can create branches off different remotes
using `git checkout --track -b $myname $remote/$branch` and later
`repo upload` automatically redirects to the proper fork project
in the code review server.

Signed-off-by: Shawn O. Pearce <sop@google.com>
This commit is contained in:
Shawn O. Pearce 2008-11-06 10:25:35 -08:00
parent 339ba9f6f7
commit ae6e0949d1
4 changed files with 26 additions and 6 deletions

View File

@ -23,9 +23,10 @@ following DTD:
<!ELEMENT manifest (remote*, default?, project*)> <!ELEMENT manifest (remote*, default?, project*)>
<!ELEMENT remote (EMPTY)> <!ELEMENT remote (EMPTY)>
<!ATTLIST remote name ID #REQUIRED> <!ATTLIST remote name ID #REQUIRED>
<!ATTLIST remote fetch CDATA #REQUIRED> <!ATTLIST remote fetch CDATA #REQUIRED>
<!ATTLIST remote review CDATA #IMPLIED> <!ATTLIST remote review CDATA #IMPLIED>
<!ATTLIST remote project-name CDATA #IMPLIED>
<!ELEMENT default (EMPTY)> <!ELEMENT default (EMPTY)>
<!ATTLIST default remote IDREF #IMPLIED> <!ATTLIST default remote IDREF #IMPLIED>
@ -67,6 +68,12 @@ Attribute `review`: Hostname of the Gerrit server where reviews
are uploaded to by `repo upload`. This attribute is optional; are uploaded to by `repo upload`. This attribute is optional;
if not specified then `repo upload` will not function. if not specified then `repo upload` will not function.
Attribute `project-name`: Specifies the name of this project used
by the review server given in the review attribute of this element.
Only permitted when the remote element is nested inside of a project
element (see below). If not given, defaults to the name supplied
in the project's name attribute.
Element default Element default
--------------- ---------------

View File

@ -206,10 +206,17 @@ class Manifest(object):
name = self._reqatt(node, 'name') name = self._reqatt(node, 'name')
fetch = self._reqatt(node, 'fetch') fetch = self._reqatt(node, 'fetch')
review = node.getAttribute('review') review = node.getAttribute('review')
if review == '':
review = None
projectName = node.getAttribute('project-name')
if projectName == '':
projectName = None
r = Remote(name=name, r = Remote(name=name,
fetch=fetch, fetch=fetch,
review=review) review=review,
projectName=projectName)
for n in node.childNodes: for n in node.childNodes:
if n.nodeName == 'require': if n.nodeName == 'require':

View File

@ -904,7 +904,9 @@ class Project(object):
remote = self.GetRemote(r.name) remote = self.GetRemote(r.name)
remote.url = r.fetchUrl remote.url = r.fetchUrl
remote.review = r.reviewUrl remote.review = r.reviewUrl
if remote.projectname is None: if r.projectName:
remote.projectname = r.projectName
elif remote.projectname is None:
remote.projectname = self.name remote.projectname = self.name
remote.ResetFetch() remote.ResetFetch()
remote.Save() remote.Save()

View File

@ -14,8 +14,12 @@
# limitations under the License. # limitations under the License.
class Remote(object): class Remote(object):
def __init__(self, name, fetch=None, review=None): def __init__(self, name,
fetch=None,
review=None,
projectName=None):
self.name = name self.name = name
self.fetchUrl = fetch self.fetchUrl = fetch
self.reviewUrl = review self.reviewUrl = review
self.projectName = projectName
self.requiredCommits = [] self.requiredCommits = []