Skip to content

Commit 362fb8b

Browse files
committed
🚧Support for add (noargs) and add upstreamm
1 parent 30c75ae commit 362fb8b

File tree

5 files changed

+83
-18
lines changed

5 files changed

+83
-18
lines changed

git_repo/repo.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,14 @@ def do_list(self):
258258
@register_action('add')
259259
def do_remote_add(self):
260260
service = self.get_service()
261-
service.add(self.repo_name, self.user_name,
261+
remote, user, repo = service.add(self.repo_name, self.user_name,
262262
name=self.remote_name,
263263
tracking=self.tracking,
264-
alone=self.alone)
265-
log.info('Successfully added `{}` as remote named `{}`'.format(
266-
self.repo_slug,
267-
self.remote_name or service.name)
264+
alone=self.alone,
265+
auto_slug=self._auto_slug)
266+
log.info('Successfully added `{}/{}` as remote named `{}`'.format(
267+
user, repo,
268+
remote.name)
268269
)
269270
return 0
270271

git_repo/services/ext/bitbucket.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,15 @@ def get_auth_token(cls, login, password, prompt=None):
467467

468468
return password, username
469469

470+
def get_parent_project_url(self, user, project, rw=True):
471+
project = self.get_repository(user, project)
472+
if not project and not project.parent:
473+
return None
474+
return self.format_path(
475+
repository=project.parent.name,
476+
namespace=project.parent.owner.login,
477+
rw=True)
478+
470479
@property
471480
def user(self):
472481
try:

git_repo/services/ext/github.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,15 @@ def get_auth_token(cls, login, password, prompt=None):
356356
else:
357357
raise err
358358

359+
def get_parent_project_url(self, user, project, rw=True):
360+
parent = self.gh.repository(user, project).parent
361+
if not parent:
362+
return None
363+
return self.format_path(
364+
repository=parent.name,
365+
namespace=parent.owner.login,
366+
rw=rw)
367+
359368
@property
360369
def user(self):
361370
return self.gh.user().login

git_repo/services/ext/gitlab.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,15 @@ def request_fetch(self, user, repo, request, pull=False, force=False):
362362
raise ResourceNotFoundError('Could not find opened request #{}'.format(request)) from err
363363
raise err
364364

365+
def get_parent_project_url(self, user, project, rw=True):
366+
parent = self.gl.projects.get(onto_project.forked_from_project['id'])
367+
if not parent:
368+
return None
369+
return self.format_path(
370+
repository=parent.path,
371+
namespace=parent.namespace.path,
372+
rw=rw)
373+
365374
@property
366375
def user(self):
367376
return self.gl.user.username

git_repo/services/service.py

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,7 @@ def guess_repo_slug(cls, repository, service, resolve_targets=None):
102102
for remote in repository.remotes:
103103
if remote.name in targets:
104104
for url in remote.urls:
105-
if url.endswith('.git'):
106-
url = url[:-4]
107-
# strip http://, https:// and ssh://
108-
if '://' in url:
109-
*_, user, name = url.split('/')
110-
return '/'.join([user, name])
111-
# scp-style URL
112-
elif '@' in url and ':' in url:
113-
return url.split(':')[-1]
105+
return cls.convert_url_into_slug(url)
114106
return None
115107

116108
@classmethod
@@ -341,7 +333,7 @@ def clone(self, user, repo, branch='master', rw=True):
341333
remote = self.add(user=user, repo=repo, tracking=True, rw=rw)
342334
self.pull(remote, branch)
343335

344-
def add(self, repo, user=None, name=None, tracking=False, alone=False, rw=True):
336+
def add(self, repo, user=None, name=None, tracking=False, alone=False, rw=True, auto_slug=False):
345337
'''Adding repository as remote
346338
347339
:param repo: Name slug of the repository to add
@@ -357,7 +349,47 @@ def add(self, repo, user=None, name=None, tracking=False, alone=False, rw=True):
357349
It also creates an *all* remote that contains all the remotes added by
358350
this tool, to make it possible to push to all remotes at once.
359351
'''
360-
name = name or self.name
352+
# git vcs add upstream
353+
if repo == 'upstream':
354+
try:
355+
slug = self.convert_url_into_slug(self.repository.remote(self.name).url)
356+
if not slug:
357+
raise ValueError()
358+
except ValueError:
359+
raise ResourceNotFoundError('No existing remote for {} to find an upstream of'.format(self.name))
360+
361+
url = self.get_parent_project_url(*slug.split('/'))
362+
if not url:
363+
raise ResourceNotFoundError('No upstream on {} found for this project.'.format(self.name))
364+
slug = self.convert_url_into_slug(url)
365+
if not slug:
366+
raise ResourceNotFoundError('No upstream on {} found for this project.'.format(self.name))
367+
user, repo = slug.split('/')
368+
name = 'upstream'
369+
alone = True
370+
auto_slug = False
371+
372+
# git vcs add
373+
if auto_slug and not name:
374+
remote_urls = set()
375+
for remote in self.repository.remotes:
376+
for url in remote.urls:
377+
if self.fqdn in url:
378+
remote_urls.add(self.convert_url_into_slug(url))
379+
remote_urls = list(remote_urls)
380+
for idx, url in enumerate(remote_urls, 1):
381+
print("[{:d}] {}".format(idx, url))
382+
try:
383+
remote_url = int(input('Please choose an slug to use as \'{}\' remote: '.format(self.name)))
384+
except ValueError:
385+
raise ArgumentError('Please enter a valid integer value.')
386+
if remote_url < 1 or remote_url > idx:
387+
raise ArgumentError('Please enter one of the suggested choices.')
388+
user, repo = remote_urls[remote_url-1].split('/')
389+
name = self.name
390+
391+
if not name:
392+
name = self.name
361393

362394
if not user:
363395
if '/' in repo:
@@ -394,9 +426,10 @@ def add(self, repo, user=None, name=None, tracking=False, alone=False, rw=True):
394426
# set that branch as tracking
395427
branch.set_tracking_branch(remote.refs[0])
396428
break
397-
return remote
398429
else:
399-
return self.repository.create_remote(name, self.format_path(repo, user, rw=rw))
430+
remote = self.repository.create_remote(name, self.format_path(repo, user, rw=rw))
431+
432+
return remote, user, repo
400433

401434

402435
def run_fork(self, user, repo, branch):
@@ -531,6 +564,10 @@ def request_fetch(self, user, repo, request, pull=False, force=False): #pragma:
531564
def request_create(self, user, repo, from_branch, onto_branch, title, description=None, auto_slug=False):
532565
raise NotImplementedError
533566

567+
@property
568+
def get_parent_project_url(self, user, repo, rw=True): #pragma: no cover
569+
raise NotImplementedError
570+
534571
@property
535572
def user(self): #pragma: no cover
536573
raise NotImplementedError

0 commit comments

Comments
 (0)