summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce <sop@google.com>2009-05-19 14:58:02 -0700
committerShawn O. Pearce <sop@google.com>2009-05-29 09:31:28 -0700
commitd1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6 (patch)
tree746fa0d1ace702f114357d1798bc67eddd1b79a9
parentc8a300f6397dad7db00c3654ff6e50e9519ed7c9 (diff)
downloadgit-repo-d1f70d9929ddd2748ccc9c1dd2f9603068e1f3e6.tar.gz
Refactor how projects parse remotes so it can be replaced
We now feed Project a RemoteSpec, instead of the Remote directly from the XmlManifest. This way the RemoteSpec already has the full project URL, rather than just the base, permitting other types of manifests to produce the URL in their own style. Signed-off-by: Shawn O. Pearce <sop@google.com>
-rw-r--r--manifest_xml.py26
-rw-r--r--project.py25
-rw-r--r--remote.py22
-rw-r--r--subcmds/init.py1
4 files changed, 33 insertions, 41 deletions
diff --git a/manifest_xml.py b/manifest_xml.py
index 46976538..5c5617ac 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -18,8 +18,7 @@ import sys
18import xml.dom.minidom 18import xml.dom.minidom
19 19
20from git_config import GitConfig, IsId 20from git_config import GitConfig, IsId
21from project import Project, MetaProject, R_HEADS, HEAD 21from project import RemoteSpec, Project, MetaProject, R_HEADS, HEAD
22from remote import Remote
23from error import ManifestParseError 22from error import ManifestParseError
24 23
25MANIFEST_FILE_NAME = 'manifest.xml' 24MANIFEST_FILE_NAME = 'manifest.xml'
@@ -31,6 +30,21 @@ class _Default(object):
31 revision = None 30 revision = None
32 remote = None 31 remote = None
33 32
33class _XmlRemote(object):
34 def __init__(self,
35 name,
36 fetch=None,
37 review=None):
38 self.name = name
39 self.fetchUrl = fetch
40 self.reviewUrl = review
41
42 def ToRemoteSpec(self, projectName):
43 url = self.fetchUrl
44 while url.endswith('/'):
45 url = url[:-1]
46 url += '/%s.git' % projectName
47 return RemoteSpec(self.name, url, self.reviewUrl)
34 48
35class XmlManifest(object): 49class XmlManifest(object):
36 """manages the repo configuration file""" 50 """manages the repo configuration file"""
@@ -257,7 +271,7 @@ class XmlManifest(object):
257 271
258 if name is None: 272 if name is None:
259 s = m_url.rindex('/') + 1 273 s = m_url.rindex('/') + 1
260 remote = Remote('origin', fetch = m_url[:s]) 274 remote = _XmlRemote('origin', m_url[:s])
261 name = m_url[s:] 275 name = m_url[s:]
262 276
263 if name.endswith('.git'): 277 if name.endswith('.git'):
@@ -268,7 +282,7 @@ class XmlManifest(object):
268 gitdir = os.path.join(self.topdir, '%s.git' % name) 282 gitdir = os.path.join(self.topdir, '%s.git' % name)
269 project = Project(manifest = self, 283 project = Project(manifest = self,
270 name = name, 284 name = name,
271 remote = remote, 285 remote = remote.ToRemoteSpec(name),
272 gitdir = gitdir, 286 gitdir = gitdir,
273 worktree = None, 287 worktree = None,
274 relpath = None, 288 relpath = None,
@@ -284,7 +298,7 @@ class XmlManifest(object):
284 review = node.getAttribute('review') 298 review = node.getAttribute('review')
285 if review == '': 299 if review == '':
286 review = None 300 review = None
287 return Remote(name=name, fetch=fetch, review=review) 301 return _XmlRemote(name, fetch, review)
288 302
289 def _ParseDefault(self, node): 303 def _ParseDefault(self, node):
290 """ 304 """
@@ -337,7 +351,7 @@ class XmlManifest(object):
337 351
338 project = Project(manifest = self, 352 project = Project(manifest = self,
339 name = name, 353 name = name,
340 remote = remote, 354 remote = remote.ToRemoteSpec(name),
341 gitdir = gitdir, 355 gitdir = gitdir,
342 worktree = worktree, 356 worktree = worktree,
343 relpath = path, 357 relpath = path,
diff --git a/project.py b/project.py
index 5ccf33eb..53fd38ee 100644
--- a/project.py
+++ b/project.py
@@ -26,7 +26,6 @@ from git_command import GitCommand
26from git_config import GitConfig, IsId 26from git_config import GitConfig, IsId
27from error import GitError, ImportError, UploadError 27from error import GitError, ImportError, UploadError
28from error import ManifestInvalidRevisionError 28from error import ManifestInvalidRevisionError
29from remote import Remote
30 29
31from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M 30from git_refs import GitRefs, HEAD, R_HEADS, R_TAGS, R_PUB, R_M
32 31
@@ -212,6 +211,14 @@ class _CopyFile:
212 except IOError: 211 except IOError:
213 _error('Cannot copy file %s to %s', src, dest) 212 _error('Cannot copy file %s to %s', src, dest)
214 213
214class RemoteSpec(object):
215 def __init__(self,
216 name,
217 url = None,
218 review = None):
219 self.name = name
220 self.url = url
221 self.review = review
215 222
216class Project(object): 223class Project(object):
217 def __init__(self, 224 def __init__(self,
@@ -1061,17 +1068,11 @@ class Project(object):
1061 raise 1068 raise
1062 1069
1063 def _InitRemote(self): 1070 def _InitRemote(self):
1064 if self.remote.fetchUrl: 1071 if self.remote.url:
1065 remote = self.GetRemote(self.remote.name) 1072 remote = self.GetRemote(self.remote.name)
1066 1073 remote.url = self.remote.url
1067 url = self.remote.fetchUrl 1074 remote.review = self.remote.review
1068 while url.endswith('/'): 1075 remote.projectname = self.name
1069 url = url[:-1]
1070 url += '/%s.git' % self.name
1071 remote.url = url
1072 remote.review = self.remote.reviewUrl
1073 if remote.projectname is None:
1074 remote.projectname = self.name
1075 1076
1076 if self.worktree: 1077 if self.worktree:
1077 remote.ResetFetch(mirror=False) 1078 remote.ResetFetch(mirror=False)
@@ -1426,7 +1427,7 @@ class MetaProject(Project):
1426 name = name, 1427 name = name,
1427 gitdir = gitdir, 1428 gitdir = gitdir,
1428 worktree = worktree, 1429 worktree = worktree,
1429 remote = Remote('origin'), 1430 remote = RemoteSpec('origin'),
1430 relpath = '.repo/%s' % name, 1431 relpath = '.repo/%s' % name,
1431 revision = 'refs/heads/master') 1432 revision = 'refs/heads/master')
1432 1433
diff --git a/remote.py b/remote.py
deleted file mode 100644
index bb8f740c..00000000
--- a/remote.py
+++ /dev/null
@@ -1,22 +0,0 @@
1#
2# Copyright (C) 2008 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16class Remote(object):
17 def __init__(self, name,
18 fetch=None,
19 review=None):
20 self.name = name
21 self.fetchUrl = fetch
22 self.reviewUrl = review
diff --git a/subcmds/init.py b/subcmds/init.py
index 90b76e8b..0d0fcd06 100644
--- a/subcmds/init.py
+++ b/subcmds/init.py
@@ -19,7 +19,6 @@ import sys
19from color import Coloring 19from color import Coloring
20from command import InteractiveCommand, MirrorSafeCommand 20from command import InteractiveCommand, MirrorSafeCommand
21from error import ManifestParseError 21from error import ManifestParseError
22from remote import Remote
23from project import SyncBuffer 22from project import SyncBuffer
24from git_command import git, MIN_GIT_VERSION 23from git_command import git, MIN_GIT_VERSION
25 24