11import csv
2+ import requests
3+ import json
24import pytz
35
46from github import Github , Repository , GithubException , PullRequest
@@ -76,7 +78,8 @@ def log_repository_commits(repository: Repository, csv_name, start, finish):
7678 'author login' : EMPTY_FIELD ,
7779 'author email' : EMPTY_FIELD ,
7880 'date and time' : commit .commit .author .date .astimezone (pytz .timezone ('Europe/Moscow' )),
79- 'changed files' : '; ' .join ([file .filename for file in commit .files ])}
81+ 'changed files' : '; ' .join ([file .filename for file in commit .files ]),
82+ 'commit id' : commit .commit .sha }}
8083
8184 if commit .author is not None :
8285 info ['author login' ] = commit .author .login
@@ -103,7 +106,68 @@ def log_issue_to_stdout(info):
103106 print (info )
104107
105108
106- def log_repository_issues (repository : Repository , csv_name , start , finish ):
109+ def get_connected_pulls (issue_number , repo_owner , repo_name , token ):
110+ access_token = token
111+ repo_owner = repo_owner .login
112+ # Формирование запроса GraphQL
113+ query = """
114+ {
115+ repository(owner: "%s", name: "%s") {
116+ issue(number: %d) {
117+ timelineItems(first: 50, itemTypes:[CONNECTED_EVENT,CROSS_REFERENCED_EVENT]) {
118+ filteredCount
119+ nodes {
120+ ... on ConnectedEvent {
121+ ConnectedEvent: subject {
122+ ... on PullRequest {
123+ number
124+ title
125+ url
126+ }
127+ }
128+ }
129+ ... on CrossReferencedEvent {
130+ CrossReferencedEvent: source {
131+ ... on PullRequest {
132+ number
133+ title
134+ url
135+ }
136+ }
137+ }
138+ }
139+ }
140+ }
141+ }
142+ }""" % (repo_owner , repo_name , issue_number )
143+
144+ # Формирование заголовков запроса
145+ headers = {
146+ "Authorization" : f"Bearer { access_token } " ,
147+ "Content-Type" : "application/json"
148+ }
149+
150+ # Отправка запроса GraphQL
151+ response = requests .post ("https://api.github.com/graphql" , headers = headers , data = json .dumps ({"query" : query }))
152+ response_data = response .json ()
153+ # Обработка полученных данных
154+ pull_request_data = response_data ["data" ]["repository" ]["issue" ]
155+ list_url = []
156+ if (pull_request_data is not None ):
157+ issues_data = pull_request_data ["timelineItems" ]["nodes" ]
158+ for pulls in issues_data :
159+ if (pulls .get ("CrossReferencedEvent" ) != None and pulls .get ("CrossReferencedEvent" ).get ("url" ) not in list_url ) :
160+ list_url .append (pulls .get ("CrossReferencedEvent" ).get ("url" ))
161+ if (pulls .get ("ConnectedEvent" ) != None and pulls .get ("ConnectedEvent" ).get ("url" ) not in list_url ):
162+ list_url .append (pulls .get ("ConnectedEvent" ).get ("url" ))
163+ if (list_url == []):
164+ return 'Empty field'
165+ else :
166+ return list_url
167+ return 'Empty field'
168+
169+
170+ def log_repository_issues (repository : Repository , csv_name , token , start , finish ):
107171 for issue in repository .get_issues (state = 'all' ):
108172 if issue .created_at .astimezone (pytz .timezone ('Europe/Moscow' )) < start or issue .created_at .astimezone (
109173 pytz .timezone ('Europe/Moscow' )) > finish :
@@ -172,7 +236,53 @@ def log_pr_to_stdout(info):
172236 print (info )
173237
174238
175- def log_repositories_pr (repository : Repository , csv_name , start , finish ):
239+ def get_related_issues (pull_request_number , repo_owner , repo_name , token ):
240+ access_token = token
241+ repo_owner = repo_owner .login
242+
243+ # Формирование запроса GraphQL
244+ query = """
245+ {
246+ repository(owner: "%s", name: "%s") {
247+ pullRequest(number: %d) {
248+ id
249+ closingIssuesReferences(first: 50) {
250+ edges {
251+ node {
252+ id
253+ body
254+ number
255+ title
256+ url
257+ }
258+ }
259+ }
260+ }
261+ }
262+ }
263+ """ % (repo_owner , repo_name , pull_request_number )
264+
265+ # Формирование заголовков запроса
266+ headers = {
267+ "Authorization" : f"Bearer { access_token } " ,
268+ "Content-Type" : "application/json"
269+ }
270+
271+ # Отправка запроса GraphQL
272+ response = requests .post ("https://api.github.com/graphql" , headers = headers , data = json .dumps ({"query" : query }))
273+ response_data = response .json ()
274+ # Обработка полученных данных
275+ pull_request_data = response_data ["data" ]["repository" ]["pullRequest" ]
276+ issues_data = pull_request_data ["closingIssuesReferences" ]["edges" ]
277+ list_issues_url = []
278+ # сохранение информации об issues
279+ for issue in issues_data :
280+ issue_node = issue ["node" ]
281+ list_issues_url .append (issue_node ["url" ])
282+ return list_issues_url
283+
284+
285+ def log_repositories_pr (repository : Repository , csv_name , token , start , finish ):
176286 for pull in repository .get_pulls (state = 'all' ):
177287 if pull .created_at .astimezone (pytz .timezone ('Europe/Moscow' )) < start or pull .created_at .astimezone (
178288 pytz .timezone ('Europe/Moscow' )) > finish :
@@ -227,7 +337,7 @@ def log_repositories_pr(repository: Repository, csv_name, start, finish):
227337 log_pr_to_stdout (info_tmp )
228338
229339
230- def log_pull_requests (client : Github , repositories , csv_name , start , finish ):
340+ def log_pull_requests (client : Github , repositories , csv_name , token , start , finish ):
231341 with open (csv_name , 'w' , newline = '' ) as file :
232342 writer = csv .writer (file )
233343 writer .writerow (
@@ -260,10 +370,10 @@ def log_pull_requests(client: Github, repositories, csv_name, start, finish):
260370 )
261371
262372 for repo in get_next_repo (client , repositories ):
263- log_repositories_pr (repo , csv_name , start , finish )
373+ log_repositories_pr (repo , csv_name , token , start , finish )
264374
265375
266- def log_issues (client : Github , repositories , csv_name , start , finish ):
376+ def log_issues (client : Github , repositories , csv_name , token , start , finish ):
267377 with open (csv_name , 'w' , newline = '' ) as file :
268378 writer = csv .writer (file )
269379 writer .writerow (
@@ -293,7 +403,7 @@ def log_issues(client: Github, repositories, csv_name, start, finish):
293403 )
294404
295405 for repo in get_next_repo (client , repositories ):
296- log_repository_issues (repo , csv_name , start , finish )
406+ log_repository_issues (repo , csv_name , token , start , finish )
297407
298408
299409def log_commits (client : Github , repositories , csv_name , start , finish ):
0 commit comments