Created
February 21, 2025 13:14
-
-
Save chlenc/b445ea9442e1d4e8ec67aed064b709c3 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import requests | |
| # Параметры | |
| GITHUB_ORG = "compolabs" # например, "cpmpolabs" | |
| USERNAMES = ["chlenc", "alexey"] # например, ["chlenc", "alexey"] | |
| TOKEN = "" #https://github.com/settings/personal-access-tokens | |
| # Базовый URL GitHub API | |
| BASE_URL = "https://api.github.com" | |
| def get_repos_in_org(org_name, token): | |
| """ | |
| Получить список всех репозиториев в организации org_name, | |
| используя пагинацию GitHub API. | |
| Возвращает список словарей, где каждый словарь описывает репозиторий. | |
| """ | |
| repos = [] | |
| page = 1 | |
| per_page = 10000 # максимум 100 на страницу, чтобы сократить число запросов | |
| while True: | |
| url = f"{BASE_URL}/orgs/{org_name}/repos" | |
| headers = {"Authorization": f"token {token}"} | |
| params = { | |
| "page": page, | |
| "per_page": per_page, | |
| "type": "all" # можно указать "public", "private", "forks" и т.д. | |
| } | |
| response = requests.get(url, headers=headers, params=params) | |
| response.raise_for_status() | |
| data = response.json() | |
| if not data: | |
| break | |
| repos.extend(data) | |
| page += 1 | |
| return repos | |
| def get_commit_count_for_users(org_name, repo_name, usernames, token): | |
| """ | |
| Подсчитывает число коммитов пользователей из списка usernames во всех ветках | |
| репозитория repo_name, который находится в организации org_name. | |
| Использует пагинацию. | |
| """ | |
| commit_count = 0 | |
| headers = {"Authorization": f"token {token}"} | |
| # Получаем список всех веток репозитория | |
| branches_url = f"{BASE_URL}/repos/{org_name}/{repo_name}/branches" | |
| branches_response = requests.get(branches_url, headers=headers) | |
| branches_response.raise_for_status() | |
| branches = branches_response.json() | |
| for branch in branches: | |
| branch_name = branch["name"] | |
| page = 1 | |
| per_page = 100 | |
| while True: | |
| url = f"{BASE_URL}/repos/{org_name}/{repo_name}/commits" | |
| params = { | |
| "sha": branch_name, # указываем ветку | |
| "page": page, | |
| "per_page": per_page | |
| } | |
| response = requests.get(url, headers=headers, params=params) | |
| response.raise_for_status() | |
| commits_page = response.json() | |
| # Фильтруем коммиты по именам пользователей | |
| user_commits = [ | |
| commit for commit in commits_page | |
| if commit['commit']['author']['name'] in usernames | |
| ] | |
| # Если коммитов нет, заканчиваем цикл | |
| if not commits_page: | |
| break | |
| # Прибавляем количество коммитов на этой странице | |
| commit_count += len(user_commits) | |
| page += 1 | |
| return commit_count | |
| def main(): | |
| # Получаем список всех репозиториев в организации | |
| repos = get_repos_in_org(GITHUB_ORG, TOKEN) | |
| # Для каждого репозитория считаем число коммитов пользователей | |
| results = [] | |
| for repo in repos: | |
| repo_name = repo["name"] | |
| count = get_commit_count_for_users(GITHUB_ORG, repo_name, USERNAMES, TOKEN) | |
| results.append((repo_name, count)) | |
| print(repo_name, count) | |
| # Сортируем по убыванию числа коммитов (для удобства) | |
| results.sort(key=lambda x: x[1], reverse=True) | |
| # Выводим результат | |
| print(f"\n\nСтатистика по количеству коммитов пользователей {USERNAMES} " | |
| f"в организации '{GITHUB_ORG}':\n") | |
| for repo_name, count in results: | |
| print(f"{repo_name}: {count} коммитов") | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment