Skip to content

Instantly share code, notes, and snippets.

@chlenc
Created February 21, 2025 13:14
Show Gist options
  • Save chlenc/b445ea9442e1d4e8ec67aed064b709c3 to your computer and use it in GitHub Desktop.
Save chlenc/b445ea9442e1d4e8ec67aed064b709c3 to your computer and use it in GitHub Desktop.
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