Repository navigation
Expand file tree
/
Copy pathgitlab-stat.py
More file actions
83 lines (63 loc) · 2.59 KB
/
Copy pathgitlab-stat.py
File metadata and controls
83 lines (63 loc) · 2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import os
import gitlab
from dotenv import load_dotenv
load_dotenv()
# --- 설정 (.env 파일에서 로드) ------------------------------------
GITLAB_URL = os.getenv('GITLAB_URL')
PRIVATE_TOKEN = os.getenv('GITLAB_PRIVATE_TOKEN')
AUTHOR_NAME = os.getenv('AUTHOR_NAME')
AUTHOR_EMAIL = os.getenv('AUTHOR_EMAIL')
GROUP_ID = os.getenv('GROUP_ID') # None이면 전체 프로젝트, 값이 있으면 해당 그룹만
START_DATE = os.getenv('START_DATE', '2025-01-01T00:00:00Z')
END_DATE = os.getenv('END_DATE', '2025-12-31T23:59:59Z')
# GROUP_ID가 숫자면 int로 변환
if GROUP_ID and GROUP_ID.isdigit():
GROUP_ID = int(GROUP_ID)
# -------------------------------------------------
def count_commits():
gl = gitlab.Gitlab(GITLAB_URL, private_token=PRIVATE_TOKEN)
# ... (로그인 확인 부분 생략) ...
print(f"📊 '{AUTHOR_NAME}' ({AUTHOR_EMAIL}) 님의 커밋 집계 시작")
total_commits = 0
# 프로젝트 가져오기
if GROUP_ID:
group = gl.groups.get(GROUP_ID)
projects = group.projects.list(include_subgroups=True, iterator=True)
else:
projects = gl.projects.list(membership=True, simple=True, iterator=True)
for proj in projects:
try:
# 그룹에서 가져온 프로젝트는 제한된 객체이므로 전체 프로젝트 다시 조회
project = gl.projects.get(proj.id)
# 1차 필터: API에서 이름으로 먼저 가져옴 (데이터 전송량 줄이기 위함)
commits = list(project.commits.list(
since=START_DATE,
until=END_DATE,
author=AUTHOR_NAME,
iterator=True,
per_page=100
))
# 2차 필터: 가져온 커밋 중에서 '이메일'이 정확히 일치하는 것만 남김
# (대소문자 무시를 위해 lower() 사용)
my_real_commits = [
c for c in commits
if c.author_email.lower() == AUTHOR_EMAIL.lower()
]
# 디버깅: 이메일 필터로 제외된 커밋 확인
excluded = [c for c in commits if
c.author_email.lower() != AUTHOR_EMAIL.lower()]
if excluded:
print(
f" [DEBUG] {project.name}: API결과 {len(commits)}개, 이메일필터후 {len(my_real_commits)}개")
for c in excluded[:3]: # 최대 3개만 출력
print(f" - 제외된 커밋 이메일: {c.author_email}")
count = len(my_real_commits)
if count > 0:
print(f"{project.name_with_namespace:<40} | {count}")
total_commits += count
except Exception as e:
continue
print("-" * 60)
print(f"🚀 총 커밋 수: {total_commits}")
if __name__ == "__main__":
count_commits()