Skip to content

Commit 03e3b0b

Browse files
zmmbshom1eHadronCollider
authored
Gitwiki (#28)
--------- Co-authored-by: SaveliyBorivets <[email protected]> Co-authored-by: Dmitry Ivanov <[email protected]>
1 parent e61a9e4 commit 03e3b0b

File tree

7 files changed

+116
-25
lines changed

7 files changed

+116
-25
lines changed

.idea/.gitignore

Lines changed: 0 additions & 4 deletions
This file was deleted.

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,24 @@ pip install -r requirements.txt
1212
## Запуск приложения:
1313
1. Логирование commits
1414
```commandline
15-
python3 main.py [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи) [-b, --branch] branch (branch - название конкретной ветки, откуда брать коммиты или all - логгировать все коммиты изо всех веток)
15+
python3 main.py [-c, --commits] [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи) [-b, --branch] branch (branch - название конкретной ветки, откуда брать коммиты или all - логгировать все коммиты изо всех веток)
1616
```
1717
2. Логирование issues
1818
```commandline
19-
python3 main.py -i [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
19+
python3 main.py [-i, --issues] [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
2020
```
2121
3. Логирование pull requests
2222
```commandline
23-
python3 main.py -p [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
23+
python3 main.py [-p, --pull_requests] [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
2424
```
2525
4. Логирование непринятых приглашений в репо
2626
```commandline
2727
python3 main.py --invites [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
2828
```
29-
29+
5. Логирование вики-репозиториев
30+
```commandline
31+
python3 main.py [-w, --wikis] [-t, --token] token (github токен вместо token) [-l, --list] list (list - строка пути к txt файлу со списком репозиториев) --dowland_repos path_drepo (path_drepo - строка пути к директории, где сохраняются вики-репозитории) [-o, --out] out (out - название csv файла, в который будут помещены все логи)
32+
```
3033

3134

3235
## Получение токена для работы с Google таблицей:
@@ -44,7 +47,7 @@ python3 main.py --invites [-t, --token] token (github токен вместо to
4447
## Экспорт таблицы в Google Sheets:
4548

4649
``` commandline
47-
python3 main.py -p [-t, --token] token (github токен вместо token) [-l,--list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи) [--google_token] token.json (файл с google токеном) [--table_id] table_id (id таблицы, указанной в url пути до таблицы) [--sheet_id] sheet_id (id конкретного листа в таблице google)
50+
python3 main.py [-p, --pull_requests] [-t, --token] token (github токен вместо token) [-l,--list] list (list - строка пути к txt файлу со списком репозиториев) [-o, --out] out (out - название csv файла, в который будут помещены все логи) [--google_token] token.json (файл с google токеном) [--table_id] table_id (id таблицы, указанной в url пути до таблицы) [--sheet_id] sheet_id (id конкретного листа в таблице google)
4851
```
4952

5053
## Файл со списком репозиториев:

export_sheets.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def write_data_to_table(csv_path, google_token, table_id, sheet_id):
2020
wk_content = sh.worksheet_by_title(sheet_id)
2121

2222
if csv_path:
23-
df = pd.read_csv(csv_path, delimiter=',', encoding='cp1251')
23+
df = pd.read_csv(csv_path, delimiter=',', encoding='utf-8')
2424
else:
2525
df = pd.DataFrame(INT_MASS)
2626

git_logger.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ def log_repository_commits(repository: Repository, csv_name, start, finish, bran
8686

8787
for branch in branches:
8888
print(f'Processing branch {branch}')
89-
for commit in repository.get_commits():
89+
# TODO add support of since and until in https://pygithub.readthedocs.io/en/stable/github_objects/Repository.html#github.Repository.Repository.get_commits
90+
for commit in repository.get_commits(sha=branch):
9091
if commit.commit.author.date.astimezone(
9192
pytz.timezone(timezone)) < start or commit.commit.author.date.astimezone(
9293
pytz.timezone(timezone)) > finish:

main.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,19 @@
44

55
import git_logger
66
import export_sheets
7+
import wikipars
78

89
def parse_args():
910
parser = argparse.ArgumentParser()
1011
parser.add_argument("--invites", help="print pending invites", action="store_true")
11-
parser.add_argument("-p", help="log pull requests", action="store_true")
12-
parser.add_argument("-i", help="log issues", action="store_true")
13-
parser.add_argument("-e", help="export table to google sheets", action="store_true")
12+
parser.add_argument("-c", "--commits", help="log commits", action="store_true")
13+
parser.add_argument("-p", "--pull_requests", help="log pull requests", action="store_true")
14+
parser.add_argument("-i", "--issues", help="log issues", action="store_true")
15+
parser.add_argument("-w", "--wikis", help="log wikis", action="store_true")
16+
parser.add_argument("-e", "--export_google_sheets", help="export table to google sheets", action="store_true")
1417
parser.add_argument('-t', '--token', type=str, required=True, help='token github account')
1518
parser.add_argument('-l', '--list', type=str, required=True, help='repos names file')
19+
parser.add_argument("--download_repos", type=str, help="path to downloaded repositories", default='./')
1620
parser.add_argument('-o', '--out', type=str, required=True, help='output filename')
1721
parser.add_argument('-s', '--start', type=str, required=False, help='start time', default='2000/01/01-00:00:00')
1822
parser.add_argument('-f', '--finish', type=str, required=False, help='finish time', default='2400/01/01-00:00:00')
@@ -24,7 +28,7 @@ def parse_args():
2428
help='Specify title for a sheet in a document in which data will be printed')
2529
args = parser.parse_args()
2630

27-
if args.e:
31+
if args.export_google_sheets:
2832
for action in parser._actions:
2933
if action.dest == 'google_token':
3034
action.required = True
@@ -49,6 +53,7 @@ def main():
4953
token = args.token
5054
repositories = args.list
5155
csv_name = args.out
56+
path_drepo = args.download_repos
5257

5358
try:
5459
client = git_logger.login(token=token)
@@ -59,20 +64,18 @@ def main():
5964
start = parse_time(args.start.split('-'))
6065
if args.finish:
6166
finish = parse_time(args.finish.split('-'))
62-
if not args.p and not args.i and not args.invites:
67+
if args.commits:
6368
git_logger.log_commits(client, repositories, csv_name, start, finish, args.branch)
64-
if (args.e):
65-
export_sheets.write_data_to_table(csv_name, args.google_token, args.table_id, args.sheet_id)
66-
if args.p:
69+
if args.pull_requests:
6770
git_logger.log_pull_requests(client, repositories, csv_name, token, start, finish)
68-
if (args.e):
69-
export_sheets.write_data_to_table(csv_name, args.google_token, args.table_id, args.sheet_id)
70-
if args.i:
71+
if args.issues:
7172
git_logger.log_issues(client, repositories, csv_name, token, start, finish)
72-
if (args.e):
73-
export_sheets.write_data_to_table(csv_name, args.google_token, args.table_id, args.sheet_id)
7473
if args.invites:
7574
git_logger.log_invitations(client, repositories, csv_name)
75+
if args.wikis:
76+
wikipars.wikiparser(client, repositories, path_drepo, csv_name)
77+
if args.export_google_sheets:
78+
export_sheets.write_data_to_table(csv_name, args.google_token, args.table_id, args.sheet_id)
7679

7780

7881
if __name__ == '__main__':

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
GitPython==3.1.41
12
PyGithub~=1.55
23
pygsheets==2.0.5
34
pandas==1.4.3
45
pytz~=2023.3
56
requests~=2.31.0
6-

wikipars.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from git import Repo, exc
2+
import os
3+
import time
4+
import csv
5+
6+
WIKI_FIELDNAMES = ['repository name', 'author name', 'author login', 'datetime', 'page', 'action', 'revision id', 'added lines', 'deleted lines']
7+
8+
def log_wiki_to_csv(info, csv_name):
9+
with open(csv_name, 'a', newline='') as file:
10+
writer = csv.DictWriter(file, fieldnames=WIKI_FIELDNAMES)
11+
writer.writerow(info)
12+
13+
def wikiparser(client, repositories, path_drepo, csv_name):
14+
with open(csv_name, 'w', newline='') as file:
15+
writer = csv.writer(file)
16+
writer.writerow(WIKI_FIELDNAMES)
17+
18+
19+
#Создаем список репозиториев из файла
20+
with open(repositories, 'r') as file:
21+
list_repos = [x for x in file.read().split('\n') if x]
22+
error_repos = []
23+
24+
data_changes = []
25+
for name_rep in list_repos:
26+
#Проверяем, есть ли репозиторий в папке
27+
dir_path = path_drepo + "/" + name_rep
28+
if os.path.exists(dir_path):
29+
#Обновляем репозиторий
30+
if len(os.listdir(dir_path)) > 0:
31+
repo = Repo(dir_path)
32+
repo.remotes.origin.pull()
33+
else:
34+
os.rmdir(dir_path)
35+
error_repos.append(name_rep)
36+
continue
37+
else:
38+
#Клонируем репозиторий в папку
39+
dir_path = path_drepo + "/" + name_rep
40+
os.makedirs(dir_path, exist_ok=True)
41+
repo_url = f"[email protected]:{name_rep}.wiki.git"
42+
try:
43+
repo = Repo.clone_from(repo_url, dir_path)
44+
except exc.GitCommandError:
45+
os.rmdir(dir_path)
46+
error_repos.append(name_rep)
47+
continue
48+
49+
print("=" * 20, name_rep, "=" * 20)
50+
#Вывод изменений
51+
EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" #Хэш пустого дерева для сравнения с первым коммитом. Способ был найден здесь: https://stackoverflow.com/questions/33916648/get-the-diff-details-of-first-commit-in-gitpython
52+
wiki_commits = repo.iter_commits(all=True)
53+
activity = {"A" : "Страница добавлена", "M" : "Страница изменена", "D" : "Страница удалена", "R":"Страница переименована"}
54+
#eng_activity = {"A" : "Page added", "M" : "Page modified", "D" : "Page deleted", "R": "Page renamed"}
55+
for commit in wiki_commits:
56+
data_commit = dict()
57+
parent = commit.parents
58+
data_commit["repository name"] = name_rep
59+
data_commit["author name"] = commit.author
60+
if commit.author.email and len(commit.author.email.split('+')) > 1:
61+
data_commit["author login"] = commit.author.email.split('+')[1].split('@users')[0]
62+
else:
63+
data_commit["author login"] = "empty login"
64+
data_commit["datetime"] = time.strftime("%Y-%m-%d %H:%M:%S%z", time.gmtime(commit.committed_date))
65+
if parent:
66+
data_commit["page"] = ';'.join([diff.b_path for diff in parent[0].diff(commit)])
67+
data_commit["action"] = ';'.join([activity[diff.change_type] for diff in parent[0].diff(commit)])
68+
else:
69+
#Первый коммит
70+
data_commit["page"] = ';'.join([diff.b_path for diff in commit.diff(EMPTY_TREE_SHA)])
71+
data_commit["action"] = ';'.join([activity["A"]])
72+
data_commit["revision id"] = commit
73+
data_commit["added lines"] = commit.stats.total["insertions"]
74+
data_commit["deleted lines"] = commit.stats.total["deletions"]
75+
for fieldname in data_commit:
76+
print(fieldname, data_commit[fieldname], sep=': ')
77+
print("-" * 40)
78+
log_wiki_to_csv(data_commit, csv_name)
79+
data_changes.append(data_commit)
80+
81+
#Вывод репозиториев, с которыми возникли ошибки
82+
if error_repos:
83+
print("!=====Проблемные репозитории=====!")
84+
for rep in error_repos:
85+
print(rep)
86+
87+
88+
return data_changes

0 commit comments

Comments
 (0)