33from __future__ import annotations
44
55import logging
6- from datetime import timedelta as td
76
8- from django .utils import timezone
9- from github .GithubException import UnknownObjectException
10-
11- from apps .github .models .issue import Issue
12- from apps .github .models .label import Label
13- from apps .github .models .milestone import Milestone
147from apps .github .models .organization import Organization
15- from apps .github .models .pull_request import PullRequest
16- from apps .github .models .release import Release
178from apps .github .models .repository import Repository
18- from apps .github .models .repository_contributor import RepositoryContributor
199from apps .github .models .user import User
2010from apps .github .utils import check_owasp_site_repository
2111
@@ -39,20 +29,26 @@ def sync_repository(
3929 entity_key = gh_repository .name .lower ()
4030 is_owasp_site_repository = check_owasp_site_repository (entity_key )
4131
42- # Setup organization and user
43- organization = organization or (
44- Organization .update_data (gh_repository .organization )
45- if gh_repository .organization
46- else None
47- )
48- user = user or User .update_data (gh_repository .owner )
32+ # GitHub repository organization.
33+ if organization is None :
34+ gh_organization = gh_repository .organization
35+ if gh_organization is not None :
36+ organization = Organization .update_data (gh_organization )
37+
38+ # GitHub repository owner.
39+ if user is None :
40+ user = User .update_data (gh_repository .owner )
41+
42+ # GitHub repository.
43+ commits = gh_repository .get_commits ()
44+ contributors = gh_repository .get_contributors ()
45+ languages = None if is_owasp_site_repository else gh_repository .get_languages ()
4946
50- # Create repository
5147 repository = Repository .update_data (
5248 gh_repository ,
53- commits = gh_repository . get_commits () ,
54- contributors = gh_repository . get_contributors () ,
55- languages = None if is_owasp_site_repository else gh_repository . get_languages () ,
49+ commits = commits ,
50+ contributors = contributors ,
51+ languages = languages ,
5652 organization = organization ,
5753 user = user ,
5854 )
@@ -67,154 +63,3 @@ def sync_repository(
6763 repository .sync_contributors (gh_repository )
6864
6965 return organization , repository
70-
71-
72- def _sync_repository_milestones (gh_repository , repository ):
73- """Sync repository milestones."""
74- until = (
75- repository .latest_updated_milestone .updated_at
76- if repository .latest_updated_milestone
77- else timezone .now () - td (days = 30 )
78- )
79-
80- for gh_milestone in gh_repository .get_milestones (
81- direction = "desc" , sort = "updated" , state = "all"
82- ):
83- if gh_milestone .updated_at < until :
84- break
85-
86- milestone = Milestone .update_data (
87- gh_milestone ,
88- author = User .update_data (gh_milestone .creator ),
89- repository = repository ,
90- )
91-
92- milestone .labels .clear ()
93- for gh_milestone_label in gh_milestone .get_labels ():
94- try :
95- milestone .labels .add (Label .update_data (gh_milestone_label ))
96- except UnknownObjectException :
97- logger .exception ("Couldn't get GitHub milestone label %s" , milestone .url )
98-
99-
100- def _sync_repository_issues (gh_repository , repository ):
101- """Sync repository issues."""
102- project_track_issues = repository .project .track_issues if repository .project else True
103-
104- if not (repository .track_issues and project_track_issues ):
105- logger .info ("Skipping issues sync for %s" , repository .name )
106- return
107-
108- until = (
109- repository .latest_updated_issue .updated_at
110- if repository .latest_updated_issue
111- else timezone .now () - td (days = 30 )
112- )
113-
114- for gh_issue in gh_repository .get_issues (direction = "desc" , sort = "updated" , state = "all" ):
115- if gh_issue .pull_request :
116- continue
117- if gh_issue .updated_at < until :
118- break
119-
120- milestone = (
121- Milestone .update_data (
122- gh_issue .milestone ,
123- author = User .update_data (gh_issue .milestone .creator ),
124- repository = repository ,
125- )
126- if gh_issue .milestone
127- else None
128- )
129-
130- issue = Issue .update_data (
131- gh_issue ,
132- author = User .update_data (gh_issue .user ),
133- milestone = milestone ,
134- repository = repository ,
135- )
136-
137- _update_assignees_and_labels (issue , gh_issue .assignees , gh_issue .labels , "issue" )
138-
139-
140- def _sync_repository_pull_requests (gh_repository , repository ):
141- """Sync repository pull requests."""
142- until = (
143- repository .latest_updated_pull_request .updated_at
144- if repository .latest_updated_pull_request
145- else timezone .now () - td (days = 30 )
146- )
147-
148- for gh_pull_request in gh_repository .get_pulls (direction = "desc" , sort = "updated" , state = "all" ):
149- if gh_pull_request .updated_at < until :
150- break
151-
152- milestone = (
153- Milestone .update_data (
154- gh_pull_request .milestone ,
155- author = User .update_data (gh_pull_request .milestone .creator ),
156- repository = repository ,
157- )
158- if gh_pull_request .milestone
159- else None
160- )
161-
162- pull_request = PullRequest .update_data (
163- gh_pull_request ,
164- author = User .update_data (gh_pull_request .user ),
165- milestone = milestone ,
166- repository = repository ,
167- )
168-
169- _update_assignees_and_labels (
170- pull_request , gh_pull_request .assignees , gh_pull_request .labels , "pull request"
171- )
172-
173-
174- def _update_assignees_and_labels (item , gh_assignees , gh_labels , item_type ):
175- """Update assignees and labels for issues/pull requests."""
176- item .assignees .clear ()
177- for gh_assignee in gh_assignees :
178- assignee = User .update_data (gh_assignee )
179- if assignee :
180- item .assignees .add (assignee )
181-
182- item .labels .clear ()
183- for gh_label in gh_labels :
184- try :
185- item .labels .add (Label .update_data (gh_label ))
186- except UnknownObjectException :
187- logger .exception ("Couldn't get GitHub %s label %s" , item_type , item .url )
188-
189-
190- def _sync_repository_releases (gh_repository , repository , is_owasp_site_repository ):
191- """Sync repository releases."""
192- releases = []
193- if not is_owasp_site_repository :
194- existing_release_node_ids = set (
195- Release .objects .filter (repository = repository ).values_list ("node_id" , flat = True )
196- if repository .id
197- else ()
198- )
199- for gh_release in gh_repository .get_releases ():
200- release_node_id = Release .get_node_id (gh_release )
201- if release_node_id in existing_release_node_ids :
202- break
203-
204- releases .append (
205- Release .update_data (
206- gh_release , author = User .update_data (gh_release .author ), repository = repository
207- )
208- )
209- Release .bulk_save (releases )
210-
211-
212- def _sync_repository_contributors (gh_repository , repository ):
213- """Sync repository contributors."""
214- RepositoryContributor .bulk_save (
215- [
216- RepositoryContributor .update_data (gh_contributor , repository = repository , user = user )
217- for gh_contributor in gh_repository .get_contributors ()
218- if (user := User .update_data (gh_contributor ))
219- ]
220- )
0 commit comments