Пример #1
0
 def ToRemoteSpec(self, projectName):
     fetchUrl = self.resolvedFetchUrl.rstrip('/')
     url = fetchUrl + '/' + projectName
     remoteName = self.name
     if self.remoteAlias:
         remoteName = self.remoteAlias
     return RemoteSpec(remoteName,
                       url=url,
                       pushUrl=self.pushUrl,
                       review=self.reviewUrl,
                       orig_name=self.name,
                       fetchUrl=self.fetchUrl)
Пример #2
0
    def UpdateProjectList(self):
        new_project_paths = []
        for project in self.GetProjects(None, missing_ok=True):
            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
                    gitdir = os.path.join(self.manifest.topdir, path, '.git')
                    if os.path.exists(gitdir):
                        project = Project(manifest=self.manifest,
                                          name=path,
                                          remote=RemoteSpec('origin'),
                                          gitdir=gitdir,
                                          objdir=gitdir,
                                          worktree=os.path.join(
                                              self.manifest.topdir, path),
                                          relpath=path,
                                          revisionExpr='HEAD',
                                          revisionId=None,
                                          groups=None)

                        if project.IsDirty():
                            print(
                                'error: Cannot remove project "%s": uncommitted changes '
                                'are present' % project.relpath,
                                file=sys.stderr)
                            print('       commit changes, then run sync again',
                                  file=sys.stderr)
                            return -1
                        elif self._DeleteProject(project.worktree):
                            return -1

        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
Пример #3
0
    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 = os.path.join(self.topdir, '%s.git' % name)
        else:
            worktree = os.path.join(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)
Пример #4
0
    def UpdateProjectList(self, opt):
        new_project_paths = []
        for project in self.GetProjects(None, missing_ok=True):
            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):
            with open(file_path, "r") as fd:
                old_project_paths = fd.read().split("\n")
            # In reversed order, so subfolders are deleted before parent folder.
            for path in sorted(old_project_paths, reverse=True):
                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
                    gitdir = os.path.join(self.manifest.topdir, path, ".git")
                    if os.path.exists(gitdir):
                        project = Project(
                            manifest=self.manifest,
                            name=path,
                            remote=RemoteSpec("origin"),
                            gitdir=gitdir,
                            objdir=gitdir,
                            use_git_worktrees=os.path.isfile(gitdir),
                            worktree=os.path.join(self.manifest.topdir, path),
                            relpath=path,
                            revisionExpr="HEAD",
                            revisionId=None,
                            groups=None,
                        )
                        if not project.DeleteWorktree(
                                quiet=opt.quiet, force=opt.force_remove_dirty):
                            return 1

        new_project_paths.sort()
        with open(file_path, "w") as fd:
            fd.write("\n".join(new_project_paths))
            fd.write("\n")
        return 0
Пример #5
0
    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 = os.path.join(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
Пример #6
0
 def ToRemoteSpec(self, projectName):
   url = self.fetchUrl
   while url.endswith('/'):
     url = url[:-1]
   url += '/%s.git' % projectName
   return RemoteSpec(self.name, url, self.reviewUrl)
Пример #7
0
 def ToRemoteSpec(self, projectName):
     url = self.resolvedFetchUrl.rstrip('/') + '/' + projectName
     remoteName = self.name
     if self.remoteAlias:
         remoteName = self.remoteAlias
     return RemoteSpec(remoteName, url, self.reviewUrl)
Пример #8
0
    def UpdateProjectList(self):
        new_project_paths = []
        for project in self.GetProjects(None, missing_ok=True):
            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(self.manifest.topdir + '/' + path):
                        project = Project(
                            manifest=self.manifest,
                            name=path,
                            remote=RemoteSpec('origin'),
                            gitdir=os.path.join(self.manifest.topdir, path,
                                                '.git'),
                            worktree=os.path.join(self.manifest.topdir, path),
                            relpath=path,
                            revisionExpr='HEAD',
                            revisionId=None,
                            groups=None)

                        if project.IsDirty():
                            print(
                                'error: Cannot remove project "%s": uncommitted changes'
                                'are present' % project.relpath,
                                file=sys.stderr)
                            print('       commit changes, then run sync again',
                                  file=sys.stderr)
                            return -1
                        else:
                            print('Deleting obsolete path %s' %
                                  project.worktree,
                                  file=sys.stderr)
                            shutil.rmtree(
                                project.worktree,
                                onerror=portable.removeReadOnlyFilesHandler)
                            # Try deleting parent subdirs if they are empty
                            project_dir = os.path.dirname(project.worktree)
                            while project_dir != self.manifest.topdir:
                                try:
                                    os.rmdir(project_dir)
                                except OSError:
                                    break
                                project_dir = os.path.dirname(project_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