diff options
Diffstat (limited to 'manifest.py')
-rw-r--r-- | manifest.py | 57 |
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') |