def check_contributors(): """ Identify missing contributors: people who have commits in a repository, but who are not listed in the AUTHORS file. """ repo = request.form.get("repo", "") if repo: repos = (repo, ) else: repos = get_repos_file().keys() people = get_people_file() people_lower = {username.lower() for username in people.keys()} missing_contributors = defaultdict(set) for repo in repos: sentry.client.extra_context({"repo": repo}) contributors_url = "/repos/{repo}/contributors".format(repo=repo) contributors = paginated_get(contributors_url, session=github) for contributor in contributors: if contributor["login"].lower() not in people_lower: missing_contributors[repo].add(contributor["login"]) # convert sets to lists, so jsonify can handle them output = { repo: list(contributors) for repo, contributors in missing_contributors.items() } return jsonify(output)
def github_rescan(): """ Used to pick up PRs that might not have tickets associated with them. """ if request.method == "GET": # just render the form return render_template("github_rescan.html") repo = request.form.get("repo") or "edx/edx-platform" if repo.startswith('all'): repos = get_repos_file().keys() repos.remove("edx/edx-platform") num_repos = len(repos) if repo == 'all.1': repos = repos[:num_repos/2] elif repo == 'all.2': repos = repos[num_repos/2:] created = {} for repo in repos: created.update(rescan_repo(repo)) else: created = rescan_repo(repo) resp = make_response(json.dumps(created), 200) resp.headers["Content-Type"] = "application/json" return resp
def rescan(): """ Used to pick up PRs that might not have tickets associated with them. """ if request.method == "GET": # just render the form return render_template("github_rescan.html") repo = request.form.get("repo") or "edx/edx-platform" inline = request.form.get("inline", False) if repo == 'all' and inline: return "Don't be silly." if inline: return jsonify(rescan_repository(repo)) if repo == 'all': repos = get_repos_file(session=github).keys() workflow = group( rescan_repository.s(repo, wsgi_environ=minimal_wsgi_environ()) for repo in repos ) group_result = workflow.delay() group_result.save() # this is necessary for groups, for some reason status_url = url_for("tasks.group_status", group_id=group_result.id, _external=True) else: result = rescan_repository.delay(repo, wsgi_environ=minimal_wsgi_environ()) status_url = url_for("tasks.status", task_id=result.id, _external=True) resp = jsonify({"message": "queued", "status_url": status_url}) resp.status_code = 202 resp.headers["Location"] = status_url return resp
def github_check_contributors(): if request.method == "GET": return render_template("github_check_contributors.html") repo = request.form.get("repo", "") if repo: repos = (repo,) else: repos = get_repos_file().keys() people = get_people_file() people_lower = {username.lower() for username in people.keys()} missing_contributors = defaultdict(set) for repo in repos: bugsnag_context = {"repo": repo} bugsnag.configure_request(meta_data=bugsnag_context) contributors_url = "/repos/{repo}/contributors".format(repo=repo) contributors = paginated_get(contributors_url, session=github) for contributor in contributors: if contributor["login"].lower() not in people_lower: missing_contributors[repo].add(contributor["login"]) # convert sets to lists, so jsonify can handle them output = { repo: list(contributors) for repo, contributors in missing_contributors.items() } return jsonify(output)
def install(): """ Install GitHub webhooks for a repo. """ # Import here because reverse URL lookup (which is used in `webhook_confs`) # relies on Flask app environment being bootstrapped already. from openedx_webhooks.webhook_confs import WEBHOOK_CONFS repo = request.form.get("repo", "") if repo: repos = [repo] else: repos = get_repos_file().keys() success = [] failed = [] for repo, conf in ((r, c) for r in repos for c in WEBHOOK_CONFS): sentry.client.extra_context({'repo': repo, 'config': conf}) payload_url = conf['config']['url'] try: create_or_update_webhook(repo, conf['config'], conf['events']) success.append((repo, payload_url)) except Exception as e: failed.append((repo, payload_url, str(e))) if failed: resp = make_response(json.dumps(failed), 502) else: resp = make_response(json.dumps(success), 200) resp.headers["Content-Type"] = "application/json" return resp
def check_contributors(): """ Identify missing contributors: people who have commits in a repository, but who are not listed in the AUTHORS file. """ repo = request.form.get("repo", "") if repo: repos = (repo,) else: repos = get_repos_file().keys() people = get_people_file() people_lower = {username.lower() for username in people.keys()} missing_contributors = defaultdict(set) for repo in repos: sentry.client.extra_context({"repo": repo}) contributors_url = "/repos/{repo}/contributors".format(repo=repo) contributors = paginated_get(contributors_url, session=github) for contributor in contributors: if contributor["login"].lower() not in people_lower: missing_contributors[repo].add(contributor["login"]) # convert sets to lists, so jsonify can handle them output = { repo: list(contributors) for repo, contributors in missing_contributors.items() } return jsonify(output)
def rescan(): """ Re-scan GitHub repositories to find pull requests that need OSPR issues on JIRA, and do not have them. If this method finds pull requests that are missing JIRA issues, it will automatically process those pull requests just as though the pull request was newly created. Note that this rescan functionality is the reason why :func:`~openedx_webhooks.tasks.github.pull_request_opened` must be idempotent. It could run many times over the same pull request. """ repo = request.form.get("repo") or "edx/edx-platform" inline = request.form.get("inline", False) if repo == 'all' and inline: return "Don't be silly." if inline: return jsonify(rescan_repository(repo)) if repo == 'all': repos = get_repos_file().keys() workflow = group( rescan_repository.s(repo, wsgi_environ=minimal_wsgi_environ()) for repo in repos) group_result = workflow.delay() group_result.save() # this is necessary for groups, for some reason status_url = url_for("tasks.group_status", group_id=group_result.id, _external=True) else: result = rescan_repository.delay(repo, wsgi_environ=minimal_wsgi_environ()) status_url = url_for("tasks.status", task_id=result.id, _external=True) resp = jsonify({"message": "queued", "status_url": status_url}) resp.status_code = 202 resp.headers["Location"] = status_url return resp
def install(): """ Install GitHub webhooks for a repo. """ repo = request.form.get("repo", "") if repo: repos = [repo] else: repos = get_repos_file().keys() api_url = url_for("github_views.pull_request", _external=True) success = [] failed = [] for repo in repos: url = "/repos/{repo}/hooks".format(repo=repo) body = { "name": "web", "events": ["pull_request"], "config": { "url": api_url, "content_type": "json", } } sentry.client.extra_context({"repo": repo, "body": body}) hook_resp = github.post(url, json=body) if hook_resp.ok: success.append(repo) else: failed.append((repo, hook_resp.text)) if failed: resp = make_response(json.dumps(failed), 502) else: resp = make_response(json.dumps(success), 200) resp.headers["Content-Type"] = "application/json" return resp
def github_install(): if request.method == "GET": return render_template("install.html") repo = request.form.get("repo", "") if repo: repos = (repo,) else: repos = get_repos_file().keys() api_url = url_for("github_pull_request", _external=True) success = [] failed = [] for repo in repos: url = "/repos/{repo}/hooks".format(repo=repo) body = { "name": "web", "events": ["pull_request"], "config": { "url": api_url, "content_type": "json", } } bugsnag_context = {"repo": repo, "body": body} bugsnag.configure_request(meta_data=bugsnag_context) hook_resp = github.post(url, json=body) if hook_resp.ok: success.append(repo) else: failed.append((repo, hook_resp.text)) if failed: resp = make_response(json.dumps(failed), 502) else: resp = make_response(json.dumps(success), 200) resp.headers["Content-Type"] = "application/json" return resp
def rescan(): """ Re-scan GitHub repositories to find pull requests that need OSPR issues on JIRA, and do not have them. If this method finds pull requests that are missing JIRA issues, it will automatically process those pull requests just as though the pull request was newly created. Note that this rescan functionality is the reason why :func:`~openedx_webhooks.tasks.github.pull_request_opened` must be idempotent. It could run many times over the same pull request. """ repo = request.form.get("repo") or "edx/edx-platform" inline = request.form.get("inline", False) if repo == 'all' and inline: return "Don't be silly." if inline: return jsonify(rescan_repository(repo)) if repo == 'all': repos = get_repos_file().keys() workflow = group( rescan_repository.s(repo, wsgi_environ=minimal_wsgi_environ()) for repo in repos ) group_result = workflow.delay() group_result.save() # this is necessary for groups, for some reason status_url = url_for("tasks.group_status", group_id=group_result.id, _external=True) else: result = rescan_repository.delay(repo, wsgi_environ=minimal_wsgi_environ()) status_url = url_for("tasks.status", task_id=result.id, _external=True) resp = jsonify({"message": "queued", "status_url": status_url}) resp.status_code = 202 resp.headers["Location"] = status_url return resp