Skip to content

Commit c3eee5d

Browse files
authored
Merge pull request #7430 from readthedocs/humitos/sync-orgs-github
2 parents 25ae9ca + 1bd7cfe commit c3eee5d

File tree

6 files changed

+275
-54
lines changed

6 files changed

+275
-54
lines changed

readthedocs/oauth/services/base.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,13 @@ def sync(self):
194194
- deletes old RemoteRepository/Organization that are not present
195195
for this user in the current provider
196196
"""
197-
repos = self.sync_repositories()
198-
organizations, organization_repos = self.sync_organizations()
197+
remote_repositories = self.sync_repositories()
198+
remote_organizations, remote_repositories_organizations = self.sync_organizations()
199199

200200
# Delete RemoteRepository where the user doesn't have access anymore
201201
# (skip RemoteRepository tied to a Project on this user)
202-
repository_full_names = self.get_repository_full_names(repos + organization_repos)
202+
all_remote_repositories = remote_repositories + remote_repositories_organizations
203+
repository_full_names = [r.full_name for r in all_remote_repositories if r is not None]
203204
(
204205
self.user.oauth_repositories
205206
.exclude(
@@ -210,10 +211,10 @@ def sync(self):
210211
)
211212

212213
# Delete RemoteOrganization where the user doesn't have access anymore
213-
organization_names = self.get_organization_names(organizations)
214+
organization_slugs = [o.slug for o in remote_organizations if o is not None]
214215
(
215216
self.user.oauth_organizations
216-
.exclude(name__in=organization_names)
217+
.exclude(slug__in=organization_slugs)
217218
.filter(account=self.account)
218219
.delete()
219220
)

readthedocs/oauth/services/bitbucket.py

+14-16
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,16 @@ class BitbucketService(Service):
3232

3333
def sync_repositories(self):
3434
"""Sync repositories from Bitbucket API."""
35-
repos = []
35+
remote_repositories = []
3636

3737
# Get user repos
3838
try:
3939
repos = self.paginate(
4040
'https://bitbucket.org/api/2.0/repositories/?role=member',
4141
)
4242
for repo in repos:
43-
self.create_repository(repo)
43+
remote_repository = self.create_repository(repo)
44+
remote_repositories.append(remote_repository)
4445

4546
except (TypeError, ValueError):
4647
log.warning('Error syncing Bitbucket repositories')
@@ -69,26 +70,29 @@ def sync_repositories(self):
6970
except (TypeError, ValueError):
7071
pass
7172

72-
return repos
73+
return remote_repositories
7374

7475
def sync_organizations(self):
7576
"""Sync Bitbucket teams (our RemoteOrganization) and team repositories."""
76-
teams = []
77-
repositories = []
77+
remote_organizations = []
78+
remote_repositories = []
7879

7980
try:
8081
teams = self.paginate(
8182
'https://api.bitbucket.org/2.0/teams/?role=member',
8283
)
8384
for team in teams:
84-
org = self.create_organization(team)
85+
remote_organization = self.create_organization(team)
8586
repos = self.paginate(team['links']['repositories']['href'])
8687

87-
# Add organization's repositories to the result
88-
repositories.extend(repos)
88+
remote_organizations.append(remote_organization)
8989

9090
for repo in repos:
91-
self.create_repository(repo, organization=org)
91+
remote_repository = self.create_repository(
92+
repo,
93+
organization=remote_organization,
94+
)
95+
remote_repositories.append(remote_repository)
9296

9397
except ValueError:
9498
log.warning('Error syncing Bitbucket organizations')
@@ -97,7 +101,7 @@ def sync_organizations(self):
97101
'try reconnecting your account',
98102
)
99103

100-
return teams, repositories
104+
return remote_organizations, remote_repositories
101105

102106
def create_repository(self, fields, privacy=None, organization=None):
103107
"""
@@ -190,12 +194,6 @@ def create_organization(self, fields):
190194
organization.save()
191195
return organization
192196

193-
def get_repository_full_names(self, repositories):
194-
return {repository.get('full_name') for repository in repositories}
195-
196-
def get_organization_names(self, organizations):
197-
return {organization.get('display_name') for organization in organizations}
198-
199197
def get_next_url_to_paginate(self, response):
200198
return response.json().get('next')
201199

readthedocs/oauth/services/github.py

+15-17
Original file line numberDiff line numberDiff line change
@@ -36,41 +36,45 @@ class GitHubService(Service):
3636

3737
def sync_repositories(self):
3838
"""Sync repositories from GitHub API."""
39-
repos = []
39+
remote_repositories = []
4040

4141
try:
4242
repos = self.paginate('https://api.github.com/user/repos?per_page=100')
4343
for repo in repos:
44-
self.create_repository(repo)
44+
remote_repository = self.create_repository(repo)
45+
remote_repositories.append(remote_repository)
4546
except (TypeError, ValueError):
4647
log.warning('Error syncing GitHub repositories')
4748
raise SyncServiceError(
4849
'Could not sync your GitHub repositories, '
4950
'try reconnecting your account'
5051
)
51-
return repos
52+
return remote_repositories
5253

5354
def sync_organizations(self):
5455
"""Sync organizations from GitHub API."""
55-
orgs = []
56-
repositories = []
56+
remote_organizations = []
57+
remote_repositories = []
5758

5859
try:
5960
orgs = self.paginate('https://api.github.com/user/orgs')
6061
for org in orgs:
61-
org_resp = self.get_session().get(org['url'])
62-
org_obj = self.create_organization(org_resp.json())
62+
org_details = self.get_session().get(org['url']).json()
63+
remote_organization = self.create_organization(org_details)
6364
# Add repos
6465
# TODO ?per_page=100
6566
org_repos = self.paginate(
6667
'{org_url}/repos'.format(org_url=org['url']),
6768
)
6869

69-
# Add all the repositories for this organization to the result
70-
repositories.extend(org_repos)
70+
remote_organizations.append(remote_organization)
7171

7272
for repo in org_repos:
73-
self.create_repository(repo, organization=org_obj)
73+
remote_repository = self.create_repository(
74+
repo,
75+
organization=remote_organization,
76+
)
77+
remote_repositories.append(remote_repository)
7478

7579
except (TypeError, ValueError):
7680
log.warning('Error syncing GitHub organizations')
@@ -79,7 +83,7 @@ def sync_organizations(self):
7983
'try reconnecting your account'
8084
)
8185

82-
return orgs, repositories
86+
return remote_organizations, remote_repositories
8387

8488
def create_repository(self, fields, privacy=None, organization=None):
8589
"""
@@ -170,12 +174,6 @@ def create_organization(self, fields):
170174
organization.save()
171175
return organization
172176

173-
def get_repository_full_names(self, repositories):
174-
return {repository.get('full_name') for repository in repositories}
175-
176-
def get_organization_names(self, organizations):
177-
return {organization.get('name') for organization in organizations}
178-
179177
def get_next_url_to_paginate(self, response):
180178
return response.links.get('next', {}).get('url')
181179

readthedocs/oauth/services/gitlab.py

+14-16
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def get_paginated_results(self, response):
6767
return response.json()
6868

6969
def sync_repositories(self):
70-
repos = []
70+
remote_repositories = []
7171
try:
7272
repos = self.paginate(
7373
'{url}/api/v4/projects'.format(url=self.adapter.provider_base_url),
@@ -79,19 +79,20 @@ def sync_repositories(self):
7979
)
8080

8181
for repo in repos:
82-
self.create_repository(repo)
82+
remote_repository = self.create_repository(repo)
83+
remote_repositories.append(remote_repository)
8384
except (TypeError, ValueError):
8485
log.warning('Error syncing GitLab repositories')
8586
raise SyncServiceError(
8687
'Could not sync your GitLab repositories, '
8788
'try reconnecting your account'
8889
)
8990

90-
return repos
91+
return remote_repositories
9192

9293
def sync_organizations(self):
93-
orgs = []
94-
repositories = []
94+
remote_organizations = []
95+
remote_repositories = []
9596

9697
try:
9798
orgs = self.paginate(
@@ -102,7 +103,7 @@ def sync_organizations(self):
102103
sort='asc',
103104
)
104105
for org in orgs:
105-
org_obj = self.create_organization(org)
106+
remote_organization = self.create_organization(org)
106107
org_repos = self.paginate(
107108
'{url}/api/v4/groups/{id}/projects'.format(
108109
url=self.adapter.provider_base_url,
@@ -114,19 +115,22 @@ def sync_organizations(self):
114115
sort='asc',
115116
)
116117

117-
# Add organization's repositories to the result
118-
repositories.extend(org_repos)
118+
remote_organizations.append(remote_organization)
119119

120120
for repo in org_repos:
121-
self.create_repository(repo, organization=org_obj)
121+
remote_repository = self.create_repository(
122+
repo,
123+
organization=remote_organization,
124+
)
125+
remote_repositories.append(remote_repository)
122126
except (TypeError, ValueError):
123127
log.warning('Error syncing GitLab organizations')
124128
raise SyncServiceError(
125129
'Could not sync your GitLab organization, '
126130
'try reconnecting your account'
127131
)
128132

129-
return orgs, repositories
133+
return remote_organizations, remote_repositories
130134

131135
def is_owned_by(self, owner_id):
132136
return self.account.extra_data['id'] == owner_id
@@ -232,12 +236,6 @@ def create_organization(self, fields):
232236
organization.save()
233237
return organization
234238

235-
def get_repository_full_names(self, repositories):
236-
return {repository.get('name_with_namespace') for repository in repositories}
237-
238-
def get_organization_names(self, organizations):
239-
return {organization.get('name') for organization in organizations}
240-
241239
def get_webhook_data(self, repo_id, project, integration):
242240
"""
243241
Get webhook JSON data to post to the API.

0 commit comments

Comments
 (0)