6
6
from ..service import register_target , RepositoryService
7
7
from ...exceptions import ResourceError , ResourceExistsError , ResourceNotFoundError
8
8
9
- from pybitbucket .bitbucket import Client
9
+ from pybitbucket .bitbucket import Client , Bitbucket
10
10
from pybitbucket .auth import BasicAuthenticator
11
- from pybitbucket .user import User
12
11
from pybitbucket .repository import Repository , RepositoryForkPolicy
13
12
14
13
from requests import Request , Session
15
14
from requests .exceptions import HTTPError
16
15
import json
17
16
18
- # bitbucket.URLS.update({
19
- # 'GET_REPO' : 'repositories/%(username)s/%(repo_slug)s/',
20
- # 'DELETE_REPO' : 'repositories/%(accountname)s/%(repo_slug)s',
21
- # 'FORK_REPO' : 'repositories/%(username)s/%(repo_slug)s/fork',
22
- # })
23
-
24
17
25
18
@register_target ('bb' , 'bitbucket' )
26
19
class BitbucketService (RepositoryService ):
27
20
fqdn = 'bitbucket.org'
28
21
29
22
def __init__ (self , * args , ** kwarg ):
30
- self .bb = Client ()
23
+ self .bb_client = Client ()
24
+ self .bb = Bitbucket (self .bb_client )
31
25
super (BitbucketService , self ).__init__ (* args , ** kwarg )
32
26
33
27
def connect (self ):
34
28
if not self ._privatekey :
35
29
raise ConnectionError ('Could not connect to BitBucket. Please configure .gitconfig with your bitbucket credentials.' )
36
30
if not ':' in self ._privatekey :
37
31
raise ConnectionError ('Could not connect to BitBucket. Please setup your private key with login:password' )
38
- self .bb .config = BasicAuthenticator (* self ._privatekey .split (':' )+ ['z+git-repo+pub@m0g.net' ])
39
- self .bb .session = self .bb .config .session
32
+ self .bb_client .config = BasicAuthenticator (* self ._privatekey .split (':' )+ ['z+git-repo+pub@m0g.net' ])
33
+ self .bb_client .session = self .bb_client .config .session
40
34
try :
41
- User . find_current_user ( client = self .bb )
42
- except HTTPError as err :
35
+ self .user
36
+ except ResourceError as err :
43
37
raise ConnectionError ('Could not connect to BitBucket. Not authorized, wrong credentials.' ) from err
44
38
45
39
def create (self , user , repo , add = False ):
@@ -48,36 +42,36 @@ def create(self, user, repo, add=False):
48
42
repo ,
49
43
fork_policy = RepositoryForkPolicy .ALLOW_FORKS ,
50
44
is_private = False ,
51
- client = self .bb
45
+ client = self .bb_client
52
46
)
53
47
if add :
54
48
self .add (user = user , repo = repo , tracking = self .name )
55
49
except HTTPError as err :
56
- if err .status_code == 400 :
50
+ if '400' in err .args [ 0 ]. split ( ' ' ) :
57
51
raise ResourceExistsError ('Project {} already exists on this account.' .format (repo )) from err
58
52
raise ResourceError ("Couldn't complete creation: {}" .format (err )) from err
59
53
60
54
def fork (self , user , repo ):
61
55
raise NotImplementedError ('No support yet by the underlying library.' )
62
56
try :
63
- Repository . find_repository_by_name_and_owner ( repo , owner = user , client = self . bb ).fork ()
57
+ self . get_repository ( user , repo ).fork ()
64
58
except HTTPError as err :
65
- raise ResourceError ("Couldn't complete creation : {}" .format (err )) from err
59
+ raise ResourceError ("Couldn't complete fork : {}" .format (err )) from err
66
60
return '/' .join ([result ['owner' ], result ['slug' ]])
67
61
68
62
def delete (self , repo , user = None ):
69
63
if not user :
70
64
user = self .user
71
65
try :
72
- Repository . find_repository_by_name_and_owner ( repo , owner = user , client = self . bb ).delete ()
66
+ self . get_repository ( user , repo ).delete ()
73
67
except HTTPError as err :
74
- if err .status_code == 404 :
68
+ if '404' in err .args [ 0 ]. split ( ' ' ) :
75
69
raise ResourceNotFoundError ("Cannot delete: repository {}/{} does not exists." .format (user , repo )) from err
76
- raise ResourceError ("Couldn't complete creation : {}" .format (err )) from err
70
+ raise ResourceError ("Couldn't complete deletion : {}" .format (err )) from err
77
71
78
72
def get_repository (self , user , repo ):
79
73
try :
80
- return Repository . find_repository_by_name_and_owner ( repo , owner = user , client = self . bb )
74
+ return next ( self . bb . repositoryByOwnerAndRepositoryName ( owner = user , repository_name = repo ) )
81
75
except HTTPError as err :
82
76
raise ResourceNotFoundError ('Cannot retrieve repository: {}/{} does not exists.' .format (user , repo ))
83
77
@@ -89,8 +83,9 @@ def get_auth_token(cls, login, password, prompt=None):
89
83
@property
90
84
def user (self ):
91
85
try :
92
- return User .find_current_user (client = self .bb ).username
93
- except HTTPError as err :
94
- raise ResourceError ("Couldn't complete creation: {}" .format (err )) from err
86
+ user = next (self .bb .userForMyself ()).username
87
+ return user
88
+ except (HTTPError , AttributeError ) as err :
89
+ raise ResourceError ("Couldn't find the current user: {}" .format (err )) from err
95
90
96
91
0 commit comments