def get_repository_url(self, relative=False): # TODO: Find way to fix this """ WARNING: Expensive call due conf.getVersionControlType """ params = {'domain': conf.domain_name, 'project': self.env_name, 'path': conf.getVersionControlType(self.env_name), 'scheme': conf.default_http_scheme} if relative: return "%(path)s/%(project)s/" % params else: return "%(scheme)s://%(domain)s/%(path)s/%(project)s/" % params
def get_repository_url(self, relative=False): # TODO: Find way to fix this """ WARNING: Expensive call due conf.getVersionControlType """ params = { 'domain': conf.domain_name, 'project': self.env_name, 'path': conf.getVersionControlType(self.env_name), 'scheme': conf.default_http_scheme } if relative: return "%(path)s/%(project)s/" % params else: return "%(scheme)s://%(domain)s/%(path)s/%(project)s/" % params
def get_scm_repository_url(self, env_name): """ .. WARNING:: Expensive call due conf.getVersionControlType """ vcs = conf.getVersionControlType(env_name) if vcs == "git": extension = ".git" else: extension = "" params = {'domain': conf.domain_name, 'project': env_name, 'scm_type': vcs, 'scheme': conf.default_http_scheme, 'ext': extension} return "versioncontrol|%(scm_type)s|%(scheme)s://%(domain)s/%(scm_type)s/%(project)s%(ext)s" % params
def render_admin_panel(self, req, cat, page, path_info): """ Renders storage admin panel page """ req.perm.require("TRAC_ADMIN") project = Project.get(self.env) vcs_type = conf.getVersionControlType(self.env.project_identifier) # TODO: deprecate / heavy call! vcs_url = project.get_repository_url() data = { "vcs_name": conf.getVersionControlName(vcs_type), "vcs_type": vcs_type, "vcs_url": vcs_url, "dav_url": project.get_dav_url(), "vcs_cmd": "clone", } if vcs_type == "svn": data["vcs_cmd"] = "checkout" return "storages.html", data
def remove_project(self, project): """ Removes existing project. :arg project: :class:`Project` to be removed. """ vcs_type = conf.getVersionControlType(project.env_name) vcs_name = "" # Remove project from db cmd = commands.ListUpProject(project) cmd.success = True cmd.undo() # Remove configuration cmd = commands.ConfigureTrac(project, {'vcs_type': vcs_type}) cmd.success = True cmd.undo() # Remove trac environment cmd = commands.CreateTracEnvironment(project, {'vcs_type': vcs_type, 'vcs_name': vcs_name}) cmd.success = True cmd.undo() cmd = commands.CreateTracVersionControl(project, {'vcs_type': vcs_type, 'vcs_name': vcs_name}) cmd.success = True cmd.undo() # Remove database cmd = commands.CreateTracDatabase(project) cmd.success = True cmd.undo() cmd = commands.CreateDav(project) cmd.undo() cmd = commands.CreateDownloads(project) cmd.undo() return True
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)
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') 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 identifier = req.args.get('prj_short_name') name = req.args.get('prj_long_name') public = 'prj_is_public' in req.args published = None if public: 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() 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) # Notify listeners. The project object still exists, but database does not for listener in self.project_change_listeners: listener.project_created(project) if public: listener.project_set_public(project) return self.create_success(req, project)
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)