def UpdateProjectList(self): new_project_paths = [] for project in self.manifest.projects.values(): if project.relpath: new_project_paths.append(project.relpath) file_name = 'project.list' file_path = os.path.join(self.manifest.repodir, file_name) old_project_paths = [] if os.path.exists(file_path): fd = open(file_path, 'r') try: old_project_paths = fd.read().split('\n') finally: fd.close() for path in old_project_paths: if not path: continue if path not in new_project_paths: """If the path has already been deleted, we don't need to do it """ if os.path.exists(abspath(self.manifest.topdir, path)): project = Project( manifest = self.manifest, name = path, remote = RemoteSpec('origin'), gitdir = os.path.join(abspath(self.manifest.topdir, path), '.git'), worktree = abspath(self.manifest.topdir, path), relpath = path, revisionExpr = 'HEAD', revisionId = None) if project.IsDirty(): print >>sys.stderr, 'error: Cannot remove project "%s": \ uncommitted changes are present' % project.relpath print >>sys.stderr, ' commit changes, then run sync again' return -1 else: print >>sys.stderr, 'Deleting obsolete path %s' % project.worktree shutil.rmtree(project.worktree) # Try deleting parent subdirs if they are empty dir = os.path.dirname(project.worktree) while dir != self.manifest.topdir: try: os.rmdir(dir) except OSError: break dir = os.path.dirname(dir) new_project_paths.sort() fd = open(file_path, 'w') try: fd.write('\n'.join(new_project_paths)) fd.write('\n') finally: fd.close() return 0
def _ParseProject(self, node): """ reads a <project> element from the manifest file """ name = self._reqatt(node, 'name') remote = self._get_remote(node) if remote is None: remote = self._default.remote if remote is None: raise ManifestParseError, \ "no remote for project %s within %s" % \ (name, self._manifestFile) revisionExpr = node.getAttribute('revision') if not revisionExpr: revisionExpr = self._default.revisionExpr if not revisionExpr: raise ManifestParseError, \ "no revision for project %s within %s" % \ (name, self._manifestFile) path = node.getAttribute('path') if not path: path = name if self.IsMirror: relpath = None worktree = None gitdir = abspath(self.topdir, '%s.git' % name) else: worktree = abspath(self.topdir, path).replace('\\', '/') gitdir = abspath(self.repodir, 'projects/%s.git' % name) project = Project(manifest = self, name = name, remote = remote.ToRemoteSpec(name), gitdir = gitdir, worktree = worktree, relpath = path, revisionExpr = revisionExpr, revisionId = None) for n in node.childNodes: if n.nodeName == 'copyfile': self._ParseCopyFile(project, n) return project
def _ParseCopyFile(self, project, node): src = self._reqatt(node, 'src') dest = self._reqatt(node, 'dest') if not self.IsMirror: # src is project relative; # dest is relative to the top of the tree project.AddCopyFile(src, dest, abspath(self.topdir, dest))
def _AddMetaProjectMirror(self, m): name = None m_url = m.GetRemote(m.remote.name).url if m_url.endswith('/.git'): raise ManifestParseError, 'refusing to mirror %s' % m_url if self._default and self._default.remote: url = self._default.remote.fetchUrl if not url.endswith('/'): url += '/' if m_url.startswith(url): remote = self._default.remote name = m_url[len(url):] if name is None: s = m_url.rindex('/') + 1 remote = _XmlRemote('origin', m_url[:s]) name = m_url[s:] if name.endswith('.git'): name = name[:-4] worktree = abspath(self.topdir, '%s.git' % name) if worktree not in self._projects: m.PreSync() project = Project(manifest = self, name = name, remote = remote.ToRemoteSpec(name), gitdir = gitdir, worktree = None, relpath = None, revisionExpr = m.revisionExpr, revisionId = None) self._projects[project.worktree] = project
def _ParseProject(self, name): gm = self._modules gr = self._review path = gm.GetString('submodule.%s.path' % name) if not path: path = name revId = self._GetRevisionId(path) if not revId: raise ManifestParseError( 'submodule "%s" has no revision at "%s"' \ % (name, path)) url = gm.GetString('submodule.%s.url' % name) if not url: url = name url = self._ResolveUrl(url) review = gr.GetString('review.%s.url' % name) if not review: review = gr.GetString('review.url') if not review: review = self._Remote().review remote = RemoteSpec(self._Remote().name, url, review) revExpr = gm.GetString('submodule.%s.revision' % name) if revExpr == '.': revExpr = self.branch if self.IsMirror: relpath = None worktree = None gitdir = abspath(self.topdir, '%s.git' % name) else: worktree = abspath(self.topdir, path) gitdir = os.path.join(self.repodir, 'projects/%s.git' % name) return Project(manifest = self, name = name, remote = remote, gitdir = gitdir, worktree = worktree, relpath = path, revisionExpr = revExpr, revisionId = revId)
def _AddMetaProjectMirror(self, m): m_url = m.GetRemote(m.remote.name).url if m_url.endswith('/.git'): raise ManifestParseError, 'refusing to mirror %s' % m_url name = self._GuessMetaName(m_url) if name.endswith('.git'): name = name[:-4] if name not in self._projects: m.PreSync() gitdir = abspath(self.topdir, '%s.git' % name) project = Project(manifest = self, name = name, remote = RemoteSpec(self._Remote().name, m_url), gitdir = gitdir, worktree = None, relpath = None, revisionExpr = m.revisionExpr, revisionId = None) self._projects[project.name] = project