2424# limitations under the License.
2525#
2626import os
27+ import re
28+
29+ from six .moves .urllib .parse import urlparse
2730
2831
2932class JobsService (object ):
@@ -1075,10 +1078,35 @@ def stop(self, pipeline_id=None, headers=None):
10751078
10761079 return self .client .perform_query ('POST' , '/pipelines/{pipeline_id}/stop' .format (pipeline_id = pipeline_id ),
10771080 data = _data , headers = headers )
1081+
1082+
10781083class ReposService (object ):
1084+ __git_providers__ = {
1085+ "github.com" : "gitHub" ,
1086+ "dev.azure.com" : "azureDevOpsServices" ,
1087+ "gitlab.com" : "gitLab" ,
1088+ "bitbucket.org" : "bitbucketCloud"
1089+ }
1090+ __aws_code_commit_regexp__ = re .compile (r"^git-codecommit\.[^.]+\.amazonaws.com$" )
1091+
10791092 def __init__ (self , client ):
10801093 self .client = client
10811094
1095+ @staticmethod
1096+ def detect_repo_provider (url ):
1097+ provider = None
1098+ try :
1099+ netloc = urlparse (url ).netloc
1100+ idx = netloc .rfind ("@" )
1101+ if idx != - 1 :
1102+ netloc = netloc [(idx + 1 ):]
1103+ provider = ReposService .__git_providers__ .get (netloc .lower ())
1104+ if provider is None and ReposService .__aws_code_commit_regexp__ .match (netloc ):
1105+ provider = "awsCodeCommit"
1106+ except :
1107+ pass
1108+ return provider
1109+
10821110 def list_repos (self , path_prefix = None , next_page_token = None , headers = None ):
10831111 _data = {}
10841112 if path_prefix is not None :
@@ -1090,27 +1118,35 @@ def list_repos(self, path_prefix=None, next_page_token=None, headers=None):
10901118 def get_repo (self , id , headers = None ):
10911119 _data = {}
10921120
1093- return self .client .perform_query ('GET' , '/repos/{id}' .format (id = id ), data = _data , headers = headers )
1121+ return self .client .perform_query ('GET' , '/repos/{id}' .format (id = id ),
1122+ data = _data , headers = headers )
10941123
10951124 def update_repo (self , id , branch = None , tag = None , headers = None ):
10961125 _data = {}
10971126 if branch is not None :
10981127 _data ['branch' ] = branch
10991128 if tag is not None :
11001129 _data ['tag' ] = tag
1101- return self .client .perform_query ('PATCH' , '/repos/{id}' .format (id = id ), data = _data , headers = headers )
1130+ return self .client .perform_query ('PATCH' , '/repos/{id}' .format (id = id ),
1131+ data = _data , headers = headers )
11021132
11031133 def create_repo (self , url , provider , path = None , headers = None ):
11041134 _data = {}
11051135 if url is not None :
11061136 _data ['url' ] = url
1137+ if provider is None or provider .trim () == "" :
1138+ provider = self .detect_repo_provider (url )
11071139 if provider is not None :
11081140 _data ['provider' ] = provider
1141+ else :
1142+ raise ValueError ("The Git provider parameter wasn't specified and we can't detect it "
1143+ "from URL. Please pass 'provider' option" )
11091144 if path is not None :
11101145 _data ['path' ] = path
11111146 return self .client .perform_query ('POST' , '/repos' , data = _data , headers = headers )
11121147
11131148 def delete_repo (self , id , headers = None ):
11141149 _data = {}
11151150
1116- return self .client .perform_query ('DELETE' , '/repos/{id}' .format (id = id ), data = _data , headers = headers )
1151+ return self .client .perform_query ('DELETE' , '/repos/{id}' .format (id = id ),
1152+ data = _data , headers = headers )
0 commit comments