def get_pr_users(session, user_id): ''' Return all pagure.lib.model.PullRequest related to the usernames provided ''' query1 = session.query(model.PullRequest.uid).filter( sqlalchemy.or_(model.PullRequest.assignee_id == user_id, model.PullRequest.user_id == user_id)) query2 = session.query(model.PullRequest.uid).filter( model.PullRequest.uid == model.PullRequestComment.pull_request_uid ).filter(model.PullRequestComment.user_id == user_id) query = session.query(model.PullRequest).filter( sqlalchemy.or_(model.PullRequest.uid.in_(query1.subquery()), model.PullRequest.uid.in_(query2.subquery()))).order_by( model.PullRequest.date_created) return query.all()
def get_issue_users(session, user_id): ''' Return all pagure.lib.model.Issue related to the usernames provided ''' query1 = session.query(model.Issue.uid).filter( sqlalchemy.or_(model.Issue.assignee_id == user_id, model.Issue.user_id == user_id)) query2 = session.query(model.Issue.uid).filter( model.Issue.uid == model.IssueComment.issue_uid).filter( model.IssueComment.user_id == user_id) query = session.query(model.Issue).filter( sqlalchemy.or_(model.Issue.uid.in_(query1.subquery()), model.Issue.uid.in_(query2.subquery()))).order_by( model.Issue.date_created) return query.all()
def _generate_groups_config(cls, session): """ Generate the gitolite configuration for all of the groups. :arg session: the session with which to connect to the database :return: the gitolite configuration for the groups :return type: list """ query = session.query(model.PagureGroup).order_by( model.PagureGroup.group_name) groups = {} for grp in query.all(): groups[grp.group_name] = [user.username for user in grp.users] return groups
def do_ensure_project_hooks(args): """ Ensures that all projects have their hooks setup Args: args (argparse.Namespace): Parsed arguments """ projects = [] query = session.query(pagure.lib.model.Project).order_by( pagure.lib.model.Project.id) for project in query.all(): print("Ensuring hooks for %s" % project.fullname) projects.append(project.fullname) pagure.lib.git.set_up_project_hooks(project, project.repospanner_region, hook=args.hook) return projects
def do_ensure_project_hooks(args): """ Ensures that all projects have their hooks setup Args: args (argparse.Namespace): Parsed arguments """ projects = [] query = session.query(pagure.lib.model.Project).order_by( pagure.lib.model.Project.id ) for project in query.all(): print("Ensuring hooks for %s" % project.fullname) projects.append(project.fullname) pagure.lib.git.set_up_project_hooks( project, project.repospanner_region, hook=args.hook ) return projects
def _generate_groups_config(cls, session): """ Generate the gitolite configuration for all of the groups. :arg session: the session with which to connect to the database :return: the gitolite configuration for the groups :return type: list """ query = session.query(model.PagureGroup).order_by( model.PagureGroup.group_name ) groups = {} for grp in query.all(): groups[grp.group_name] = [user.username for user in grp.users] return groups
def write_gitolite_acls( cls, session, configfile, project, preconf=None, postconf=None, group=None, ): """ Generate the configuration file for gitolite for all projects on the forge. :arg cls: the current class :type: Gitolite2Auth :arg session: a session to connect to the database with :arg configfile: the name of the configuration file to generate/write :type configfile: str :arg project: the project to update in the gitolite configuration file. It can be of three types/values. If it is ``-1`` or if the file does not exist on disk, the entire gitolite configuration will be re-generated. If it is ``None``, the gitolite configuration will have its groups information updated but not the projects and will be re-compiled. If it is a ``pagure.lib.model.Project``, the gitolite configuration will be updated for just this project. :type project: None, int or spagure.lib.model.Project :kwarg preconf: a file to include at the top of the configuration file :type preconf: None or str :kwarg postconf: a file to include at the bottom of the configuration file :type postconf: None or str :kwarg group: the group to refresh the members of :type group: None or pagure.lib.model.PagureGroup """ _log.info("Write down the gitolite configuration file") preconfig = None if preconf: _log.info( "Loading the file to include at the top of the generated one" ) preconfig = _read_file(preconf) postconfig = None if postconf: _log.info( "Loading the file to include at the end of the generated one" ) postconfig = _read_file(postconf) global_pr_only = pagure_config.get("PR_ONLY", False) config = [] groups = {} if group is None: groups = cls._generate_groups_config(session) if project == -1 or not os.path.exists(configfile): _log.info("Refreshing the configuration for all projects") query = session.query(model.Project).order_by(model.Project.id) for project in query.all(): config = cls._process_project(project, config, global_pr_only) elif project: _log.info("Refreshing the configuration for one project") config = cls._process_project(project, config, global_pr_only) current_config = cls._get_current_config( configfile, preconfig, postconfig ) current_config = cls._clean_current_config(current_config, project) config = current_config + config if config: _log.info("Cleaning the group %s from the loaded config", group) config = cls._clean_groups(config, group=group) else: current_config = cls._get_current_config( configfile, preconfig, postconfig ) _log.info("Cleaning the group %s from the config on disk", group) config = cls._clean_groups(current_config, group=group) if not config: return _log.info("Writing the configuration to: %s", configfile) with open(configfile, "w", encoding="utf-8") as stream: if preconfig: stream.write(preconfig + "\n") stream.write("# end of header\n") if groups: for key in sorted(groups): stream.write("@%s = %s\n" % (key, " ".join(groups[key]))) stream.write("# end of groups\n\n") prev = None for row in config: if prev is None: prev = row if prev == row == "": continue stream.write(row + "\n") prev = row stream.write("# end of body\n") if postconfig: stream.write(postconfig + "\n")