Skip to content

Commit 21be27e

Browse files
committed
🚧 Improves the request create function
improves: git hub request create git hub request foo/bar create so it looks up the first ref containing the requested branch, and returns the matching remote. Signed-off-by: Guyzmo <[email protected]>
1 parent 5945e20 commit 21be27e

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

git_repo/repo.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,13 +167,13 @@ def _guess_repo_slug(self, repository, service, resolve_targets=None):
167167
if url.endswith('.git'):
168168
url = url[:-4]
169169
*_, user, name = url.split('/')
170-
self.set_repo_slug('/'.join([user, name]))
170+
self.set_repo_slug('/'.join([user, name]), auto=True)
171171
return
172172
elif url.startswith('git@'):
173173
if url.endswith('.git'):
174174
url = url[:-4]
175175
_, repo_slug = url.split(':')
176-
self.set_repo_slug(repo_slug)
176+
self.set_repo_slug(repo_slug, auto=True)
177177
return
178178

179179
def get_service(self, lookup_repository=True, resolve_targets=None):
@@ -223,8 +223,9 @@ def set_verbosity(self, verbose): # pragma: no cover
223223
log.addHandler(logging.StreamHandler())
224224

225225
@store_parameter('<user>/<repo>')
226-
def set_repo_slug(self, repo_slug):
226+
def set_repo_slug(self, repo_slug, auto=False):
227227
self.repo_slug = EXTRACT_URL_RE.sub('', repo_slug) if repo_slug else repo_slug
228+
self._auto_slug = auto
228229
if not self.repo_slug:
229230
self.user_name = None
230231
self.repo_name = None
@@ -443,7 +444,7 @@ def request_edition(repository, from_branch):
443444
self.remote_branch,
444445
self.title,
445446
self.message,
446-
self.repo_slug != None,
447+
self._auto_slug,
447448
request_edition)
448449
log.info('Successfully created request of `{local}` onto `{}:{remote}`, with id `{ref}`!'.format(
449450
'/'.join([self.user_name, self.repo_name]),

git_repo/services/ext/github.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,28 @@ def gist_delete(self, gist_id):
221221
raise ResourceNotFoundError('Could not find gist')
222222
gist.delete()
223223

224+
def _convert_username_into_ref(self, username, from_branch):
225+
# builds a ref with an username and a branch
226+
# this method parses the repository's remotes to find the url matching username
227+
# and containing the given branch and returns the corresponding ref
228+
def exists_ref(ref_name):
229+
# this function takes a given ref and returns true if it actually exists
230+
for ref in self.repository.refs:
231+
if ref.name.endswith(ref_name):
232+
return True
233+
return False
234+
235+
remotes = {remote.name: list(remote.urls) for remote in self.repository.remotes}
236+
for name in ('upstream', self.name) + tuple(remotes.keys()):
237+
if name in remotes and name != 'all':
238+
for url in remotes[name]:
239+
if self.fqdn in url and username == url.split(':')[1].split('/')[0]:
240+
ref = '{}/{}'.format(name, from_branch)
241+
if exists_ref(ref):
242+
return ref
243+
244+
raise ArgumentError('Could not find a remote for user {} containing branch {}'.format(username, from_branch))
245+
224246
def request_create(self, user, repo, from_branch, onto_branch, title=None, description=None, auto_slug=False, edit=None):
225247
repository = self.gh.repository(user, repo)
226248
if not repository:
@@ -241,10 +263,13 @@ def request_create(self, user, repo, from_branch, onto_branch, title=None, descr
241263
# the branch we're currently working on
242264
if not onto_branch:
243265
onto_branch = repository.default_branch or 'master'
244-
if self.username != repository.owner.login:
245-
from_branch = ':'.join([self.username, from_branch])
266+
from_ref = self._convert_username_into_ref(user, from_branch)
267+
if user != repository.owner.login:
268+
from_branch = ':'.join([user, from_branch])
269+
270+
# translate from github username to git remote name
246271
if not title and not description and edit:
247-
title, description = edit(self.repository, from_branch)
272+
title, description = edit(self.repository, from_ref)
248273
if not title and not description:
249274
raise ArgumentError('Missing message for request creation')
250275
try:

0 commit comments

Comments
 (0)