33from datetime import datetime
44from time import sleep
55from typing import Generator
6- import os
76import pytz
87import requests
98
@@ -51,34 +50,34 @@ def get_connected_pulls(
5150 base_url : str | None = None
5251) -> str :
5352
54- if base_url : # Forgejo
53+ if base_url : # Forgejo
5554 headers = {
5655 "Authorization" : f"token { token } " ,
5756 "Accept" : "application/json"
5857 }
59-
58+
6059 connected_prs = set ()
6160 api_base = f"{ base_url } /api/v1/repos/{ repo_owner } /{ repo_name } "
62-
61+
6362 try :
6463 comments_response = requests .get (
6564 f"{ api_base } /issues/{ issue_number } /comments" ,
6665 headers = headers
6766 )
6867 comments_response .raise_for_status ()
69-
68+
7069 for comment in comments_response .json ():
7170 body = comment .get ("body" , "" )
7271 if not body :
7372 continue
74-
73+
7574 for word in body .split ():
7675 clean_word = word .strip (".,:;!?()[]{}" )
7776 if len (clean_word ) > 1 and clean_word [1 :].isdigit ():
78- if clean_word .startswith ('#' ):
77+ if clean_word .startswith ('#' ):
7978 pr_num = clean_word [1 :]
8079 connected_prs .add (f"{ base_url } /{ repo_owner } /{ repo_name } /pulls/{ pr_num } " )
81- elif clean_word .startswith ('!' ):
80+ elif clean_word .startswith ('!' ):
8281 pr_num = clean_word [1 :]
8382 connected_prs .add (f"{ base_url } /{ repo_owner } /{ repo_name } /pulls/{ pr_num } " )
8483
@@ -87,92 +86,93 @@ def get_connected_pulls(
8786 headers = headers
8887 )
8988 prs_response .raise_for_status ()
90-
89+
9190 for pr in prs_response .json ():
9291 if f"#{ issue_number } " in pr .get ("body" , "" ):
9392 connected_prs .add (pr .get ("html_url" ))
94-
93+
9594 except requests .exceptions .RequestException as e :
9695 print (f"[Warning] Failed to fetch connected PRs: { str (e )} " )
9796 return 'Empty field'
98-
97+
9998 return ';' .join (sorted (connected_prs )) if connected_prs else 'Empty field'
10099
101- else : # PyGithub
102- repo_owner = repo_owner .login
103- # Формирование запроса GraphQL
104- query = """
105- {
106- repository(owner: "%s", name: "%s") {
107- issue(number: %d) {
108- timelineItems(first: 50, itemTypes:[CONNECTED_EVENT,CROSS_REFERENCED_EVENT]) {
109- filteredCount
110- nodes {
111- ... on ConnectedEvent {
112- ConnectedEvent: subject {
113- ... on PullRequest {
114- number
115- title
116- url
117- }
118- }
100+ else : # PyGithub
101+ repo_owner = repo_owner .login
102+ # Формирование запроса GraphQL
103+ query = """
104+ {
105+ repository(owner: "%s", name: "%s") {
106+ issue(number: %d) {
107+ timelineItems(first: 50, itemTypes:[CONNECTED_EVENT,CROSS_REFERENCED_EVENT]) {
108+ filteredCount
109+ nodes {
110+ ... on ConnectedEvent {
111+ ConnectedEvent: subject {
112+ ... on PullRequest {
113+ number
114+ title
115+ url
119116 }
120- ... on CrossReferencedEvent {
121- CrossReferencedEvent: source {
122- ... on PullRequest {
123- number
124- title
125- url
126- }
127- }
117+ }
118+ }
119+ ... on CrossReferencedEvent {
120+ CrossReferencedEvent: source {
121+ ... on PullRequest {
122+ number
123+ title
124+ url
128125 }
129126 }
130127 }
131128 }
132129 }
133- }""" % (
134- repo_owner ,
135- repo_name ,
136- issue_number ,
137- )
138-
139- # Формирование заголовков запроса
140- headers = {
141- "Authorization" : f"Bearer { token } " ,
142- "Content-Type" : "application/json" ,
143130 }
131+ }
132+ }""" % (
133+ repo_owner ,
134+ repo_name ,
135+ issue_number ,
136+ )
144137
145- # Отправка запроса GraphQL
146- response = requests .post (
147- "https://api.github.com/graphql" ,
148- headers = headers ,
149- data = json .dumps ({"query" : query }),
150- )
151- response_data = response .json ()
152- # Обработка полученных данных
153- pull_request_data = response_data ["data" ]["repository" ]["issue" ]
154- list_url = []
155- if pull_request_data is not None :
156- issues_data = pull_request_data ["timelineItems" ]["nodes" ]
157- for pulls in issues_data :
158- if (
159- pulls .get ("CrossReferencedEvent" ) is not None
160- and pulls .get ("CrossReferencedEvent" ).get ("url" ) is not None
161- and pulls .get ("CrossReferencedEvent" ).get ("url" ) not in list_url
162- ):
163- list_url .append (pulls .get ("CrossReferencedEvent" ).get ("url" ))
164- if (
165- pulls .get ("ConnectedEvent" ) is not None
166- and pulls .get ("ConnectedEvent" ).get ("url" ) is not None
167- and pulls .get ("ConnectedEvent" ).get ("url" ) not in list_url
168- ):
169- list_url .append (pulls .get ("ConnectedEvent" ).get ("url" ))
170- if list_url == []:
171- return 'Empty field'
172- else :
173- return ';' .join (list_url )
138+ # Формирование заголовков запроса
139+ headers = {
140+ "Authorization" : f"Bearer { token } " ,
141+ "Content-Type" : "application/json" ,
142+ }
143+
144+ # Отправка запроса GraphQL
145+ response = requests .post (
146+ "https://api.github.com/graphql" ,
147+ headers = headers ,
148+ data = json .dumps ({"query" : query }),
149+ )
150+ response_data = response .json ()
151+ # Обработка полученных данных
152+ pull_request_data = response_data ["data" ]["repository" ]["issue" ]
153+ list_url = []
154+ if pull_request_data is not None :
155+ issues_data = pull_request_data ["timelineItems" ]["nodes" ]
156+ for pulls in issues_data :
157+ if (
158+ pulls .get ("CrossReferencedEvent" ) is not None
159+ and pulls .get ("CrossReferencedEvent" ).get ("url" ) is not None
160+ and pulls .get ("CrossReferencedEvent" ).get ("url" ) not in list_url
161+ ):
162+ list_url .append (pulls .get ("CrossReferencedEvent" ).get ("url" ))
163+ if (
164+ pulls .get ("ConnectedEvent" ) is not None
165+ and pulls .get ("ConnectedEvent" ).get ("url" ) is not None
166+ and pulls .get ("ConnectedEvent" ).get ("url" ) not in list_url
167+ ):
168+ list_url .append (pulls .get ("ConnectedEvent" ).get ("url" ))
169+ if list_url == []:
170+ return 'Empty field'
171+ else :
172+ return ';' .join (list_url )
174173 return 'Empty field'
175174
175+
176176def log_repository_issues (
177177 client : IRepositoryAPI , repository : Repository , csv_name , token , start , finish
178178):
0 commit comments