summaryrefslogtreecommitdiffstats
path: root/manifest.py
diff options
context:
space:
mode:
Diffstat (limited to 'manifest.py')
-rw-r--r--manifest.py57
1 files changed, 53 insertions, 4 deletions
diff --git a/manifest.py b/manifest.py
index b928cdfe..ea68b682 100644
--- a/manifest.py
+++ b/manifest.py
@@ -88,6 +88,10 @@ class Manifest(object):
88 self._Load() 88 self._Load()
89 return self._default 89 return self._default
90 90
91 @property
92 def IsMirror(self):
93 return self.manifestProject.config.GetBoolean('repo.mirror')
94
91 def _Unload(self): 95 def _Unload(self):
92 self._loaded = False 96 self._loaded = False
93 self._projects = {} 97 self._projects = {}
@@ -114,6 +118,10 @@ class Manifest(object):
114 finally: 118 finally:
115 self.manifestFile = real 119 self.manifestFile = real
116 120
121 if self.IsMirror:
122 self._AddMetaProjectMirror(self.repoProject)
123 self._AddMetaProjectMirror(self.manifestProject)
124
117 self._loaded = True 125 self._loaded = True
118 126
119 def _ParseManifest(self, is_root_file): 127 def _ParseManifest(self, is_root_file):
@@ -157,6 +165,40 @@ class Manifest(object):
157 (project.name, self.manifestFile) 165 (project.name, self.manifestFile)
158 self._projects[project.name] = project 166 self._projects[project.name] = project
159 167
168 def _AddMetaProjectMirror(self, m):
169 name = None
170 m_url = m.GetRemote(m.remote.name).url
171 if m_url.endswith('/.git'):
172 raise ManifestParseError, 'refusing to mirror %s' % m_url
173
174 if self._default and self._default.remote:
175 url = self._default.remote.fetchUrl
176 if not url.endswith('/'):
177 url += '/'
178 if m_url.startswith(url):
179 remote = self._default.remote
180 name = m_url[len(url):]
181
182 if name is None:
183 s = m_url.rindex('/') + 1
184 remote = Remote('origin', fetch = m_url[:s])
185 name = m_url[s:]
186
187 if name.endswith('.git'):
188 name = name[:-4]
189
190 if name not in self._projects:
191 m.PreSync()
192 gitdir = os.path.join(self.topdir, '%s.git' % name)
193 project = Project(manifest = self,
194 name = name,
195 remote = remote,
196 gitdir = gitdir,
197 worktree = None,
198 relpath = None,
199 revision = m.revision)
200 self._projects[project.name] = project
201
160 def _ParseRemote(self, node): 202 def _ParseRemote(self, node):
161 """ 203 """
162 reads a <remote> element from the manifest file 204 reads a <remote> element from the manifest file
@@ -214,8 +256,13 @@ class Manifest(object):
214 "project %s path cannot be absolute in %s" % \ 256 "project %s path cannot be absolute in %s" % \
215 (name, self.manifestFile) 257 (name, self.manifestFile)
216 258
217 worktree = os.path.join(self.topdir, path) 259 if self.IsMirror:
218 gitdir = os.path.join(self.repodir, 'projects/%s.git' % path) 260 relpath = None
261 worktree = None
262 gitdir = os.path.join(self.topdir, '%s.git' % name)
263 else:
264 worktree = os.path.join(self.topdir, path)
265 gitdir = os.path.join(self.repodir, 'projects/%s.git' % path)
219 266
220 project = Project(manifest = self, 267 project = Project(manifest = self,
221 name = name, 268 name = name,
@@ -242,8 +289,10 @@ class Manifest(object):
242 def _ParseCopyFile(self, project, node): 289 def _ParseCopyFile(self, project, node):
243 src = self._reqatt(node, 'src') 290 src = self._reqatt(node, 'src')
244 dest = self._reqatt(node, 'dest') 291 dest = self._reqatt(node, 'dest')
245 # src is project relative, and dest is relative to the top of the tree 292 if not self.IsMirror:
246 project.AddCopyFile(src, os.path.join(self.topdir, dest)) 293 # src is project relative;
294 # dest is relative to the top of the tree
295 project.AddCopyFile(src, os.path.join(self.topdir, dest))
247 296
248 def _get_remote(self, node): 297 def _get_remote(self, node):
249 name = node.getAttribute('remote') 298 name = node.getAttribute('remote')