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
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
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))
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}
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}
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"
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)
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)
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"
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"
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))
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') 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 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')
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')