@@ -102,15 +102,7 @@ def guess_repo_slug(cls, repository, service, resolve_targets=None):
102
102
for remote in repository .remotes :
103
103
if remote .name in targets :
104
104
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 )
114
106
return None
115
107
116
108
@classmethod
@@ -341,7 +333,7 @@ def clone(self, user, repo, branch='master', rw=True):
341
333
remote = self .add (user = user , repo = repo , tracking = True , rw = rw )
342
334
self .pull (remote , branch )
343
335
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 ):
345
337
'''Adding repository as remote
346
338
347
339
: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):
357
349
It also creates an *all* remote that contains all the remotes added by
358
350
this tool, to make it possible to push to all remotes at once.
359
351
'''
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
361
393
362
394
if not user :
363
395
if '/' in repo :
@@ -394,9 +426,10 @@ def add(self, repo, user=None, name=None, tracking=False, alone=False, rw=True):
394
426
# set that branch as tracking
395
427
branch .set_tracking_branch (remote .refs [0 ])
396
428
break
397
- return remote
398
429
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
400
433
401
434
402
435
def run_fork (self , user , repo , branch ):
@@ -531,6 +564,10 @@ def request_fetch(self, user, repo, request, pull=False, force=False): #pragma:
531
564
def request_create (self , user , repo , from_branch , onto_branch , title , description = None , auto_slug = False ):
532
565
raise NotImplementedError
533
566
567
+ @property
568
+ def get_parent_project_url (self , user , repo , rw = True ): #pragma: no cover
569
+ raise NotImplementedError
570
+
534
571
@property
535
572
def user (self ): #pragma: no cover
536
573
raise NotImplementedError
0 commit comments