7
7
{self} [--path=<path>] [-v...] <target> delete [-f]
8
8
{self} [--path=<path>] [-v...] <target> open
9
9
{self} [--path=<path>] [-v...] <target> (list|ls) [-l] <user>
10
- {self} [--path=<path>] [-v...] <target> fork <user >/<repo> [--branch=<branch>]
11
- {self} [--path=<path>] [-v...] <target> fork <user >/<repo> <repo> [--branch=<branch>]
12
- {self} [--path=<path>] [-v...] <target> create <user >/<repo> [--add]
13
- {self} [--path=<path>] [-v...] <target> delete <user >/<repo> [-f]
14
- {self} [--path=<path>] [-v...] <target> open <user >/<repo>
15
- {self} [--path=<path>] [-v...] <target> clone <user >/<repo> [<repo> [<branch>]]
10
+ {self} [--path=<path>] [-v...] <target> fork <namespace >/<repo> [--branch=<branch>]
11
+ {self} [--path=<path>] [-v...] <target> fork <namespace >/<repo> <repo> [--branch=<branch>]
12
+ {self} [--path=<path>] [-v...] <target> create <namespace >/<repo> [--add]
13
+ {self} [--path=<path>] [-v...] <target> delete <namespace >/<repo> [-f]
14
+ {self} [--path=<path>] [-v...] <target> open <namespace >/<repo>
15
+ {self} [--path=<path>] [-v...] <target> clone <namespace >/<repo> [<repo> [<branch>]]
16
16
{self} [--path=<path>] [-v...] <target> add
17
- {self} [--path=<path>] [-v...] <target> add <user >/<repo> [<name>] [--tracking=<branch>] [-a]
17
+ {self} [--path=<path>] [-v...] <target> add <namespace >/<repo> [<name>] [--tracking=<branch>] [-a]
18
18
{self} [--path=<path>] [-v...] <target> request (list|ls)
19
19
{self} [--path=<path>] [-v...] <target> request fetch <request> [-f]
20
20
{self} [--path=<path>] [-v...] <target> request create [--title=<title>] [--message=<message>]
21
21
{self} [--path=<path>] [-v...] <target> request create <local_branch> [--title=<title>] [--message=<message>]
22
22
{self} [--path=<path>] [-v...] <target> request create <remote_branch> <local_branch> [--title=<title>] [--message=<message>]
23
- {self} [--path=<path>] [-v...] <target> request <user >/<repo> (list|ls)
24
- {self} [--path=<path>] [-v...] <target> request <user >/<repo> fetch <request> [-f]
25
- {self} [--path=<path>] [-v...] <target> request <user >/<repo> create [--title=<title>] [--branch=<remote>] [--message=<message>]
26
- {self} [--path=<path>] [-v...] <target> request <user >/<repo> create <local_branch> [--title=<title>] [--branch=<remote>] [--message=<message>]
27
- {self} [--path=<path>] [-v...] <target> request <user >/<repo> create <remote_branch> <local_branch> [--title=<title>] [--branch=<remote>] [--message=<message>]
23
+ {self} [--path=<path>] [-v...] <target> request <namespace >/<repo> (list|ls)
24
+ {self} [--path=<path>] [-v...] <target> request <namespace >/<repo> fetch <request> [-f]
25
+ {self} [--path=<path>] [-v...] <target> request <namespace >/<repo> create [--title=<title>] [--branch=<remote>] [--message=<message>]
26
+ {self} [--path=<path>] [-v...] <target> request <namespace >/<repo> create <local_branch> [--title=<title>] [--branch=<remote>] [--message=<message>]
27
+ {self} [--path=<path>] [-v...] <target> request <namespace >/<repo> create <remote_branch> <local_branch> [--title=<title>] [--branch=<remote>] [--message=<message>]
28
28
{self} [--path=<path>] [-v...] <target> (gist|snippet) (list|ls) [<gist>]
29
29
{self} [--path=<path>] [-v...] <target> (gist|snippet) clone <gist>
30
30
{self} [--path=<path>] [-v...] <target> (gist|snippet) fetch <gist> [<gist_file>]
49
49
config Run authentication process and configure the tool
50
50
51
51
Options:
52
- <user >/<repo> Repository to work with
52
+ <namespace >/<repo> Repository to work with
53
53
-p,--path=<path> Path to work on [default: .]
54
54
-v,--verbose Makes it more chatty (repeat twice to see git commands)
55
55
-h,--help Shows this message
56
56
57
57
Options for list:
58
- <user> Name of the user whose repositories will be listed
58
+ <namespace> Name of the user whose repositories will be listed
59
59
-l,--long Show one repository per line, when set show the results
60
60
with the following columns:
61
61
STATUS, COMMITS, REQUESTS, ISSUES, FORKS, CONTRIBUTORS, WATCHERS, LIKES, LANGUAGE, MODIF, NAME
116
116
'''
117
117
118
118
from docopt import docopt
119
+ from getpass import getpass
119
120
120
121
import os
121
122
import sys
131
132
log_root = logging .getLogger ()
132
133
log = logging .getLogger ('git_repo' )
133
134
134
- if sys .version_info .major < 3 : # pragma: no cover
135
+ if sys .version_info .major < 3 : # pragma: no cover
135
136
print ('Please use with python version 3' )
136
137
sys .exit (1 )
137
138
138
139
from .exceptions import ArgumentError , ResourceNotFoundError
139
- from .services .service import RepositoryService
140
+ from .services .service import RepositoryService , EXTRACT_URL_RE
140
141
141
142
from .tools import print_tty , print_iter , loop_input , confirm
142
143
from .kwargparse import KeywordArgumentParser , store_parameter , register_action
143
144
144
145
from git import Repo , Git
145
146
from git .exc import InvalidGitRepositoryError , NoSuchPathError , BadName
146
147
147
- import re
148
-
149
- EXTRACT_URL_RE = re .compile ('[^:]*(://|@)[^/]*/' )
150
-
151
-
152
148
class GitRepoRunner (KeywordArgumentParser ):
153
149
154
- def init (self ): # pragma: no cover
150
+ def init (self ): # pragma: no cover
155
151
if 'GIT_WORK_TREE' in os .environ .keys () or 'GIT_DIR' in os .environ .keys ():
156
152
del os .environ ['GIT_WORK_TREE' ]
157
153
@@ -180,7 +176,7 @@ def get_service(self, lookup_repository=True, resolve_targets=None):
180
176
'''Argument storage'''
181
177
182
178
@store_parameter ('--verbose' )
183
- def set_verbosity (self , verbose ): # pragma: no cover
179
+ def set_verbosity (self , verbose ): # pragma: no cover
184
180
if verbose >= 5 :
185
181
print (self .args )
186
182
if verbose >= 4 :
@@ -205,21 +201,25 @@ def set_verbosity(self, verbose): # pragma: no cover
205
201
206
202
log .addHandler (logging .StreamHandler ())
207
203
208
- @store_parameter ('<user >/<repo>' )
204
+ @store_parameter ('<namespace >/<repo>' )
209
205
def set_repo_slug (self , repo_slug , auto = False ):
210
206
self .repo_slug = EXTRACT_URL_RE .sub ('' , repo_slug ) if repo_slug else repo_slug
211
207
self ._auto_slug = auto
212
208
if not self .repo_slug :
213
- self .user_name = None
209
+ self .namespace = None
214
210
self .repo_name = None
215
211
elif '/' in self .repo_slug :
216
212
# in case a full URL is given as parameter, just extract the slug part.
217
- self .user_name , self .repo_name , * overflow = self .repo_slug .split ('/' )
218
- if len (overflow ) != 0 :
213
+ * namespace , self .repo_name = self .repo_slug .split ('/' )
214
+ self .namespace = '/' .join (namespace )
215
+
216
+ # This needs to be manually plucked because otherwise it'll be unset for some commands.
217
+ service = RepositoryService .get_service (None , self .target )
218
+ if len (namespace ) > service ._max_nested_namespaces :
219
219
raise ArgumentError ('Too many slashes.'
220
- 'Format of the parameter is <user>/<repo> or <repo>.' )
220
+ 'The maximum depth of namespaces is: {}' . format ( service . _max_nested_namespaces ) )
221
221
else :
222
- self .user_name = None
222
+ self .namespace = None
223
223
self .repo_name = self .repo_slug
224
224
225
225
@store_parameter ('<branch>' )
@@ -258,7 +258,7 @@ def do_list(self):
258
258
@register_action ('add' )
259
259
def do_remote_add (self ):
260
260
service = self .get_service ()
261
- remote , user , repo = service .add (self .repo_name , self .user_name ,
261
+ remote , user , repo = service .add (self .repo_name , self .namespace ,
262
262
name = self .remote_name ,
263
263
tracking = self .tracking ,
264
264
alone = self .alone ,
@@ -280,15 +280,15 @@ def do_fork(self):
280
280
raise ArgumentError ('Path {} is not a git repository' .format (self .path ))
281
281
282
282
else :
283
- # git <target> fork <user >/<repo>
283
+ # git <target> fork <namespace >/<repo>
284
284
if not self .target_repo :
285
- if not self .user_name :
285
+ if not self .namespace :
286
286
raise ArgumentError ('Cannot clone repository, '
287
- 'you shall provide either a <user >/<repo> parameter '
287
+ 'you shall provide either a <namespace >/<repo> parameter '
288
288
'or no parameters to fork current repository!' )
289
289
service = self .get_service (None )
290
290
291
- # git <target> fork <user >/<repo> <path>
291
+ # git <target> fork <namespace >/<repo> <path>
292
292
else :
293
293
repo_path = os .path .join (self .path , self .target_repo )
294
294
try :
@@ -298,7 +298,7 @@ def do_fork(self):
298
298
# if the repository does not exists at given path, clone upstream into that path
299
299
self .do_clone (service , repo_path )
300
300
301
- service .run_fork (self .user_name , self .repo_name , branch = self .branch )
301
+ service .run_fork (self .namespace , self .repo_name , branch = self .branch )
302
302
303
303
if not self .repo_slug or self .target_repo :
304
304
log .info ('Successfully forked {} as {} within {}.' .format (
@@ -317,7 +317,7 @@ def do_clone(self, service=None, repo_path=None):
317
317
try :
318
318
repository = Repo .init (repo_path )
319
319
service = RepositoryService .get_service (repository , self .target )
320
- service .clone (self .user_name , self .repo_name , self .branch )
320
+ service .clone (self .namespace , self .repo_name , self .branch )
321
321
log .info ('Successfully cloned `{}` into `{}`!' .format (
322
322
service .format_path (self .repo_slug ),
323
323
repo_path )
@@ -332,28 +332,28 @@ def do_clone(self, service=None, repo_path=None):
332
332
def do_create (self ):
333
333
service = self .get_service (lookup_repository = self .repo_slug == None or self .add )
334
334
# if no repo_slug has been given, use the directory name as current project name
335
- if not self .user_name and not self .repo_name :
335
+ if not self .namespace and not self .repo_name :
336
336
self .set_repo_slug ('/' .join ([service .user ,
337
337
os .path .basename (os .path .abspath (self .path ))]))
338
- if not self .user_name :
339
- self .user_name = service .user
340
- service .create (self .user_name , self .repo_name , add = self .add )
338
+ if not self .namespace :
339
+ self .namespace = service .user
340
+ service .create (self .namespace , self .repo_name , add = self .add )
341
341
log .info ('Successfully created remote repository `{}`, '
342
342
'with local remote `{}`' .format (
343
- service .format_path (self .repo_name , namespace = self .user_name ),
343
+ service .format_path (self .repo_name , namespace = self .namespace ),
344
344
service .name )
345
345
)
346
346
return 0
347
347
348
348
@register_action ('delete' )
349
349
def do_delete (self ):
350
350
service = self .get_service (lookup_repository = self .repo_slug == None )
351
- if not self .force : # pragma: no cover
351
+ if not self .force : # pragma: no cover
352
352
if not confirm ('repository' , self .repo_slug ):
353
353
return 0
354
354
355
- if self .user_name :
356
- service .delete (self .repo_name , self .user_name )
355
+ if self .namespace :
356
+ service .delete (self .repo_name , self .namespace )
357
357
else :
358
358
service .delete (self .repo_name )
359
359
log .info ('Successfully deleted remote `{}` from {}' .format (
@@ -365,15 +365,15 @@ def do_delete(self):
365
365
366
366
@register_action ('open' )
367
367
def do_open (self ):
368
- self .get_service (lookup_repository = self .repo_slug is None ).open (self .user_name , self .repo_name )
368
+ self .get_service (lookup_repository = self .repo_slug is None ).open (self .namespace , self .repo_name )
369
369
return 0
370
370
371
371
@register_action ('request' , 'ls' )
372
372
@register_action ('request' , 'list' )
373
373
def do_request_list (self ):
374
374
service = self .get_service (lookup_repository = self .repo_slug == None )
375
375
print_tty ('List of open requests to merge:' )
376
- print_iter (service .request_list (self .user_name , self .repo_name ))
376
+ print_iter (service .request_list (self .namespace , self .repo_name ))
377
377
return 0
378
378
379
379
@register_action ('request' , 'create' )
@@ -426,7 +426,7 @@ def request_edition(repository, from_branch, onto_target):
426
426
427
427
service = self .get_service (resolve_targets = ('upstream' , '{service}' , 'origin' ))
428
428
429
- new_request = service .request_create (self .user_name ,
429
+ new_request = service .request_create (self .namespace ,
430
430
self .repo_name ,
431
431
self .local_branch ,
432
432
self .remote_branch ,
@@ -442,7 +442,7 @@ def request_edition(repository, from_branch, onto_target):
442
442
@register_action ('request' , 'fetch' )
443
443
def do_request_fetch (self ):
444
444
service = self .get_service ()
445
- new_branch = service .request_fetch (self .user_name , self .repo_name , self .request , force = self .force )
445
+ new_branch = service .request_fetch (self .namespace , self .repo_name , self .request , force = self .force )
446
446
log .info ('Successfully fetched request id `{}` of `{}` into `{}`!' .format (
447
447
self .request ,
448
448
self .repo_slug ,
@@ -489,7 +489,7 @@ def do_gist_create(self):
489
489
@register_action ('snippet' , 'delete' )
490
490
def do_gist_delete (self ):
491
491
service = self .get_service (lookup_repository = False )
492
- if not self .force : # pragma: no cover
492
+ if not self .force : # pragma: no cover
493
493
if not confirm ('snippet' , self .gist_ref ):
494
494
return 0
495
495
@@ -499,8 +499,6 @@ def do_gist_delete(self):
499
499
500
500
@register_action ('config' )
501
501
def do_config (self ):
502
- from getpass import getpass
503
-
504
502
def setup_service (service ):
505
503
new_conf = dict (
506
504
fqdn = None ,
@@ -587,7 +585,8 @@ def main(args):
587
585
log .exception ('------------------------------------' )
588
586
return 2
589
587
590
- def cli (): #pragma: no cover
588
+
589
+ def cli (): # pragma: no cover
591
590
try :
592
591
sys .exit (main (docopt (__doc__ .format (self = sys .argv [0 ].split (os .path .sep )[- 1 ], version = __version__ ))))
593
592
finally :
0 commit comments