예제 #1
0
    def do(self):
        parent = self.project.parent_project

        if not parent:
            conf.log.error("Cloning failed! Parent not found!")
            return False
        try:
            parent_path = conf.getEnvironmentVcsPath(parent.env_name)
        except Exception:
            conf.log.exception("Parent repository path could not be resolved! %s" % parent.env_name)
            return False

        try:
            project_path = conf.getEnvironmentVcsPath(self.project.env_name)
        except Exception:
            conf.log.exception("Project repository path could not be resolved. %s" % parent.env_name)
            return False

        try:
            shutil.copytree(parent_path, project_path)
        except OSError as err:
            conf.log.error("Could not clone existing version control system. %s => %s (%s)" %
                           (parent_path, project_path, err.strerror))
            return False

        self.success = True
        return True
예제 #2
0
    def do(self):
        parent = self.project.parent_project

        if not parent:
            conf.log.error("Cloning failed! Parent not found!")
            return False
        try:
            parent_path = conf.getEnvironmentVcsPath(parent.env_name)
        except Exception:
            conf.log.exception("Parent repository path could not be resolved! %s" % parent.env_name)
            return False

        try:
            project_path = conf.getEnvironmentVcsPath(self.project.env_name)
        except Exception:
            conf.log.exception("Project repository path could not be resolved. %s" % parent.env_name)
            return False

        try:
            shutil.copytree(parent_path, project_path)
        except OSError as err:
            conf.log.error("Could not clone existing version control system. %s => %s (%s)" %
                           (parent_path, project_path, err.strerror))
            return False

        self.success = True
        return True
예제 #3
0
 def add_repository(self, name, repo_type, req):
     premade_repositories = self.get_repositories()
     for repo in premade_repositories:
         if name.lower() in repo[0].lower():
             return add_warning(req, _("Repository name reserved"))
     if not self.validate_repository_name(name):
         return add_warning(req, _("Repository adding failed. Check name."))
     project = Project._get_project(env_name=self.env.project_identifier,
                                    use_cache=False)
     ctvc = CreateTracVersionControl(project, {
         'vcs_type': repo_type,
         'vcs_name': name
     })
     ctvc.do()
     add_hook = InitCommitHooks(project, {
         'vcs_type': repo_type,
         'vcs_name': name
     })
     add_hook.do()
     self.env.config.set(
         'repositories', name + '.dir',
         conf.getEnvironmentVcsPath(self.env.project_identifier, repo_type,
                                    name))
     self.env.config.set('repositories', name + '.type', repo_type)
     self.env.config.save()
     add_notice(req, _('Added new repository %s to project' % name))
예제 #4
0
 def __init__(self, project, settings):
     Command.__init__(self)
     self.vcs_path = conf.getEnvironmentVcsPath(project.env_name)
     self.vcs_type = settings['vcs_type']
     self.name = "InitCommitHooks"
     self.hooks = {'git': self._git_hook,
                   'hg': self._hg_hook,
                   'svn': self._svn_hook}
예제 #5
0
 def __init__(self, project, settings):
     Command.__init__(self)
     self.vcs_type = settings['vcs_type']
     self.vcs_name = settings['vcs_name']
     self.vcs_path = conf.getEnvironmentVcsPath(project.env_name, self.vcs_type, self.vcs_name)
     self.name = "InitCommitHooks"
     self.hooks = {'git': self._git_hook,
                   'hg': self._hg_hook,
                   'svn': self._svn_hook}
예제 #6
0
 def __init__(self, project, settings):
     Command.__init__(self)
     self.vcs_type = settings['vcs_type']
     self.vcs_name = settings['vcs_name']
     self.vcs_path = conf.getEnvironmentVcsPath(project.env_name, self.vcs_type, self.vcs_name)
     self.env_name = project.env_name
     self.hook_path = conf.getHooksDir()
     self.conf_path = conf.getConfDir()
     self.name = "CreateTracVersionControl"
예제 #7
0
 def delete_repo(self, repo_type, name):
     path = conf.getEnvironmentVcsPath(self.env.project_identifier, repo_type, name)
     inifile = conf.getEnvironmentConfigPath(self.env.project_identifier)
     conf.remove_item_from_section(inifile, 'repositories', name + '.dir')
     conf.remove_item_from_section(inifile, 'repositories', name + '.type')
     path2 = path + '.deleted.0'
     i = 0
     while os.path.exists(path2):
         i = i + 1
         path2 = path + '.deleted.' + i
     os.rename(path, path2)
예제 #8
0
 def delete_repo(self, repo_type, name):
     path = conf.getEnvironmentVcsPath(self.env.project_identifier,
                                       repo_type, name)
     inifile = conf.getEnvironmentConfigPath(self.env.project_identifier)
     conf.remove_item_from_section(inifile, 'repositories', name + '.dir')
     conf.remove_item_from_section(inifile, 'repositories', name + '.type')
     path2 = path + '.deleted.0'
     i = 0
     while os.path.exists(path2):
         i = i + 1
         path2 = path + '.deleted.' + i
     os.rename(path, path2)
예제 #9
0
 def __init__(self, project, settings):
     Command.__init__(self)
     self.vcs_type = settings['vcs_type']
     self.short_name = project.env_name
     self.long_name = project.project_name
     self.author = project.author
     self.env_path = conf.getEnvironmentSysPath(self.short_name)
     self.db_string = conf.getEnvironmentDbPath(self.short_name)
     self.vcs_path = conf.getEnvironmentVcsPath(self.short_name)
     self.args = "'" + self.long_name + "'" + " " + self.db_string
     self.args += " " + self.vcs_type + " " + self.vcs_path
     self.args += " --inherit=" + conf.global_conf_path
     self.name = "CreateTracEnvironment"
예제 #10
0
 def __init__(self, project, settings):
     Command.__init__(self)
     self.vcs_type = settings['vcs_type']
     self.vcs_name = settings['vcs_name']
     self.short_name = project.env_name
     self.long_name = project.project_name
     self.author = project.author
     self.env_path = conf.getEnvironmentSysPath(self.short_name)
     self.db_string = conf.getEnvironmentDbPath(self.short_name)
     self.vcs_path = conf.getEnvironmentVcsPath(self.short_name, self.vcs_type, self.vcs_name)
     self.args = "'" + self.long_name + "'" + " " + self.db_string
     self.args += " " + self.vcs_type + " " + self.vcs_path
     self.args += " --inherit=" + conf.global_conf_path
     self.name = "CreateTracEnvironment"
예제 #11
0
 def add_repository(self, name, repo_type, req):
     premade_repositories = self.get_repositories()
     for repo in premade_repositories:
         if name.lower() in repo[0].lower():
             return add_warning(req, _("Repository name reserved"))
     if not self.validate_repository_name(name):
         return add_warning(req, _("Repository adding failed. Check name."))
     project = Project._get_project(env_name=self.env.project_identifier, use_cache=False)
     ctvc = CreateTracVersionControl(project, {'vcs_type':repo_type, 'vcs_name':name})
     ctvc.do()
     add_hook = InitCommitHooks(project, {'vcs_type':repo_type, 'vcs_name':name})
     add_hook.do()
     self.env.config.set('repositories', name + '.dir', 
                         conf.getEnvironmentVcsPath(self.env.project_identifier, repo_type, name))
     self.env.config.set('repositories', name + '.type', repo_type)
     self.env.config.save()
     add_notice(req, _('Added new repository %s to project' % name))
예제 #12
0
    def create_project(self, req):
        """ Handler for creating project request
        """
        req.perm.require("PROJECT_CREATE")
        if req.method != 'POST':
            return self.create_failure(req, 'POST request needed when creating a new project')
        author = get_context(req)['author']
        # If agreement needed but not getting it, show failure
        if conf.project_requires_agreed_terms and not self._is_active_user(req):
            return self.create_failure(req, 'You need to approve legal text to create a project!')

        # Read and transform some variables
        vcs_type = req.args.get('vcstype')
        vcs_name = req.args.get('vcs_name')
        if not self.validate_repository_name(vcs_name):
            return self.create_failure(req, 'Check repository name.')

        parent_project = None
        if "_project_" in req.args:
            parent_project = Project.get(env_name=req.args.get('_project_'))
            self.__require_permissions_for_cloning(req.authname, parent_project)
            vcs_type = conf.getVersionControlType(parent_project.env_name) # TODO: expensive call, probably needed

        # Read settings
        settings = {}
        if vcs_type:
            settings['vcs_type'] = vcs_type
        if vcs_name:
            settings['vcs_name'] = vcs_name

        identifier = req.args.get('prj_short_name')
        name = req.args.get('prj_long_name')
        project_visibility = 'prj_is_public' in req.args

        public = False
        published = None
        if project_visibility:
            public = True
            published = datetime.now()

        # Create project object
        project = Project(
            id = None,
            env_name = identifier,
            project_name = name,
            description = req.args.get('prj_description'),
            author_id = author.id,
            created = None, # Use default which is now()
            public = public,
            published = published
        )

        # Create project environment
        projects = Projects()
        try:
            projects.create_project(project, settings)
        except ProjectValidationException as exc:
            self.log.warning('Project creation failed due the validation: {0}'.format(exc.value))
            return self.create_failure(req, exc.value)
        except:
            self.log.exception('Project creation failed')
            return self.create_failure(req, _("Creating project failed. Try again later."))

        if public:
            projects.add_public_project_visibility(project.id)

        #Add author to follow project
        watch_store = CQDEWatchlistStore()
        watch_store.watch_project(author.id, project.id)

        #Change project trac.ini to support multiple repositories
        project_env_path = conf.getEnvironmentSysPath(project.env_name)
        repo_env_path = conf.getEnvironmentVcsPath(project.env_name, vcs_type, vcs_name)
        os.rename(project_env_path + '/conf/trac.ini', project_env_path + '/conf/trac.ini.bak')
        oldfile = open(project_env_path + '/conf/trac.ini.bak', 'r')
        newfile = open(project_env_path + '/conf/trac.ini', 'w')
        lines = oldfile.readlines()
        for line in lines:
            newfile.write(line)
            if line.startswith('database ='):
                break
        newfile.write('repository_dir =\nrepository_type = svn\n\n[repositories]\n')
        newfile.write('%s.dir = %s\n' % (vcs_name, repo_env_path))
        newfile.write('%s.type = %s\n' % (vcs_name, vcs_type))
        newfile.close()
        oldfile.close()
        os.remove(project_env_path + '/conf/trac.ini.bak')

        # Notify listeners. The project object still exists, but database does not
        for listener in self.project_change_listeners:
            try:
                listener.project_created(project)
                listener.project_watchers(project)
                if public:
                    listener.project_set_public(project)
            except:
                pass


        return self.create_success(req, project)
예제 #13
0
    def create_project(self, req):
        """ Handler for creating project request
        """
        req.perm.require("PROJECT_CREATE")
        if req.method != 'POST':
            return self.create_failure(
                req, 'POST request needed when creating a new project')
        author = get_context(req)['author']
        # If agreement needed but not getting it, show failure
        if conf.project_requires_agreed_terms and not self._is_active_user(
                req):
            return self.create_failure(
                req, 'You need to approve legal text to create a project!')

        # Read and transform some variables
        vcs_type = req.args.get('vcstype')
        vcs_name = req.args.get('vcs_name')
        if not self.validate_repository_name(vcs_name):
            return self.create_failure(req, 'Check repository name.')

        parent_project = None
        if "_project_" in req.args:
            parent_project = Project.get(env_name=req.args.get('_project_'))
            self.__require_permissions_for_cloning(req.authname,
                                                   parent_project)
            vcs_type = conf.getVersionControlType(
                parent_project.env_name
            )  # TODO: expensive call, probably needed

        # Read settings
        settings = {}
        if vcs_type:
            settings['vcs_type'] = vcs_type
        if vcs_name:
            settings['vcs_name'] = vcs_name

        identifier = req.args.get('prj_short_name')
        name = req.args.get('prj_long_name')
        project_visibility = 'prj_is_public' in req.args

        public = False
        published = None
        if project_visibility:
            public = True
            published = datetime.now()

        # Create project object
        project = Project(
            id=None,
            env_name=identifier,
            project_name=name,
            description=req.args.get('prj_description'),
            author_id=author.id,
            created=None,  # Use default which is now()
            public=public,
            published=published)

        # Create project environment
        projects = Projects()
        try:
            projects.create_project(project, settings)
        except ProjectValidationException as exc:
            self.log.warning(
                'Project creation failed due the validation: {0}'.format(
                    exc.value))
            return self.create_failure(req, exc.value)
        except:
            self.log.exception('Project creation failed')
            return self.create_failure(
                req, _("Creating project failed. Try again later."))

        if public:
            projects.add_public_project_visibility(project.id)

        #Add author to follow project
        watch_store = CQDEWatchlistStore()
        watch_store.watch_project(author.id, project.id)

        #Change project trac.ini to support multiple repositories
        project_env_path = conf.getEnvironmentSysPath(project.env_name)
        repo_env_path = conf.getEnvironmentVcsPath(project.env_name, vcs_type,
                                                   vcs_name)
        os.rename(project_env_path + '/conf/trac.ini',
                  project_env_path + '/conf/trac.ini.bak')
        oldfile = open(project_env_path + '/conf/trac.ini.bak', 'r')
        newfile = open(project_env_path + '/conf/trac.ini', 'w')
        lines = oldfile.readlines()
        for line in lines:
            newfile.write(line)
            if line.startswith('database ='):
                break
        newfile.write(
            'repository_dir =\nrepository_type = svn\n\n[repositories]\n')
        newfile.write('%s.dir = %s\n' % (vcs_name, repo_env_path))
        newfile.write('%s.type = %s\n' % (vcs_name, vcs_type))
        newfile.close()
        oldfile.close()
        os.remove(project_env_path + '/conf/trac.ini.bak')

        # Notify listeners. The project object still exists, but database does not
        for listener in self.project_change_listeners:
            try:
                listener.project_created(project)
                listener.project_watchers(project)
                if public:
                    listener.project_set_public(project)
            except:
                pass

        return self.create_success(req, project)
예제 #14
0
    def process_request(self, req):
        """
        Handle the export requests

        :raises: TracError in case of failure
        """
        req.perm.require('BROWSER_VIEW')
        req.perm.require('FILE_VIEW')

        # Get default repository and its type
        rm = RepositoryManager(self.env)
        repo = rm.get_repository('')
        repo_type = rm.repository_type
        svn_path = 'trunk'
        format = plaintext(req.args.get('format', 'zip'))

        # Get revision info. For svn it's in format: <revnum>/<path>
        revision = plaintext(str(req.args.get('rev', repo.get_youngest_rev())))
        if repo_type == 'svn':
            revision = repo.get_youngest_rev()
            svn_path = req.args.get('rev', svn_path)

        # Validate if given revision really exists
        try:
            revision = repo.normalize_rev(revision)
        except NoSuchChangeset:
            raise HTTPNotFound('No such changeset')

        # Validate format
        if format not in self.formats:
            raise TracError('Format is not supported')

        # Load project object based on current environment
        env_name = conf.resolveProjectName(self.env)
        repo_type = self.env.config.get('trac', 'repository_type')
        repo_dir = conf.getEnvironmentVcsPath(env_name)
        project = Project.get(env_name=env_name)

        if repo_type not in conf.supported_scm_systems:
            raise TracError('Non-supported VCS type')

        # Create temporary directory with appropriate subdirectory where to export repository
        tempfd = tempfile.NamedTemporaryFile(delete=False)

        # Dump the repository per type, into defined location
        try:
            if repo_type == 'git':
                # Use short revision format
                revision = revision[:6]
                prefix = '%s-%s' % (env_name, revision[:6])
                self._archive_git(repo_dir, revision, format, tempfd.name, prefix)

            elif repo_type == 'hg':
                # In case of both local:global revision format, use only global
                if ':' in revision:
                    revision = revision.split(':', 1)[1]
                prefix = '%s-%s' % (env_name, revision[:6])
                self._archive_hg(repo_dir, revision, format, tempfd.name, prefix)

            elif repo_type == 'svn':
                assert format == 'zip', 'Only zip format is supported for subversion'

                # Redirect to Trac's internal changeset functionality
                # Example: https://localhost/svnproject/changeset/4/trunk?old_path=%2F&format=zip
                changeset_href = Href('/%s/changeset' % env_name)
                return req.redirect(changeset_href(revision, svn_path, old_path='/', format='zip'))

        # Redirect raises RequestDone: re-raise it
        except RequestDone:
            raise

        except Exception, err:
            self.env.log.exception('Repository dump failed: %s' % err)
            raise TracError('Repository archive failed - please try again later')
예제 #15
0
    def process_request(self, req):
        """
        Handle the export requests

        :raises: TracError in case of failure
        """
        req.perm.require('BROWSER_VIEW')
        req.perm.require('FILE_VIEW')
        repository_name = req.path_info.split("/")[-1]
        # Get default repository and its type
        rm = RepositoryManager(self.env)
        list_repos = rm.get_real_repositories()
        repo = None
        repo_type = None
        for r in list_repos:
            if r.get_base().split("/")[-1].lower() == repository_name:
                repo = r
                break
        repo_type = repo.get_base().split(":")[0]
        svn_path = 'trunk'
        format = plaintext(req.args.get('format', 'zip'))
        conf.log.exception("Repotype at beginning: %s" % repo_type)
        # Get revision info. For svn it's in format: <revnum>/<path>
        revision = plaintext(str(req.args.get('rev', repo.get_youngest_rev())))

        # Validate if given revision really exists
        try:
            revision = repo.normalize_rev(revision)
        except NoSuchChangeset:
            raise HTTPNotFound('No such changeset')

        # Validate format
        if format not in self.formats:
            raise TracError('Format is not supported')

        # Load project object based on current environment
        env_name = conf.resolveProjectName(self.env)
        #repo_type = self.env.config.get('trac', 'repository_type')
        repo_dir = conf.getEnvironmentVcsPath(env_name, repo_type,
                                              repository_name)
        project = Project.get(env_name=env_name)

        if repo_type not in conf.supported_scm_systems:
            raise TracError('Non-supported VCS type')

        # Create temporary directory with appropriate subdirectory where to export repository
        tempfd = tempfile.NamedTemporaryFile(delete=False)

        # Dump the repository per type, into defined location
        conf.log.exception("Repotype: %s, repo_dir: %s" %
                           (repo_type, repo_dir))
        try:
            if repo_type == 'git':
                # Use short revision format
                revision = revision[:6]
                prefix = '%s-%s' % (env_name, revision[:6])
                self._archive_git(repo_dir, revision, format, tempfd.name,
                                  prefix)

            elif repo_type == 'hg':
                # In case of both local:global revision format, use only global
                if ':' in revision:
                    revision = revision.split(':', 1)[1]
                prefix = '%s-%s' % (env_name, revision[:6])
                self._archive_hg(repo_dir, revision, format, tempfd.name,
                                 prefix)

            elif repo_type == 'svn':
                assert format == 'zip', 'Only zip format is supported for subversion'

                # Redirect to Trac's internal changeset functionality
                # Example: https://localhost/svnproject/changeset/4/trunk?old_path=%2F&format=zip
                changeset_href = Href('/%s/changeset' % env_name)
                return req.redirect(
                    changeset_href(revision,
                                   repository_name + "/",
                                   format='zip'))

        # Redirect raises RequestDone: re-raise it
        except RequestDone:
            raise

        except Exception, err:
            self.env.log.exception('Repository dump failed: %s' % err)
            raise TracError(
                'Repository archive failed - please try again later')