21
21
from requests import request
22
22
23
23
24
- GITHUB_API = "https://api.github.com"
25
-
26
24
REQ_BUFFER_SIZE = 65536 # Chunk size when iterating a download body
27
25
28
26
_github_token_cli_arg = None
27
+ _github_api_url = None
29
28
30
29
31
30
class _NoopProgressReporter (object ):
@@ -105,7 +104,7 @@ def _check_for_credentials(func):
105
104
@wraps (func )
106
105
def with_check_for_credentials (* args , ** kwargs ):
107
106
has_github_token_env_var = "GITHUB_TOKEN" in os .environ
108
- has_netrc = requests .utils .get_netrc_auth (GITHUB_API )
107
+ has_netrc = requests .utils .get_netrc_auth (_github_api_url )
109
108
if (not _github_token_cli_arg
110
109
and not has_github_token_env_var and not has_netrc ):
111
110
raise EnvironmentError (
@@ -173,16 +172,21 @@ def _validate_repo_name(ctx, param, value):
173
172
@click .group ()
174
173
@click .option ("--github-token" , envvar = 'GITHUB_TOKEN' , default = None ,
175
174
help = "[default: GITHUB_TOKEN env. variable]" )
175
+ @click .option ('--github-api-url' , envvar = 'GITHUB_API_URL' ,
176
+ default = 'https://api.github.com' ,
177
+ help = '[default: https://api.github.com]' )
176
178
@click .option ("--progress/--no-progress" , default = True ,
177
179
help = "Display progress bar (default: yes)." )
178
- def main (github_token , progress ):
180
+ def main (github_token , github_api_url , progress ):
179
181
"""A CLI to easily manage GitHub releases, assets and references."""
180
182
global progress_reporter_cls
181
183
progress_reporter_cls .reportProgress = sys .stdout .isatty () and progress
182
184
if progress_reporter_cls .reportProgress :
183
185
progress_reporter_cls = _progress_bar
184
186
global _github_token_cli_arg
185
187
_github_token_cli_arg = github_token
188
+ global _github_api_url
189
+ _github_api_url = github_api_url
186
190
187
191
188
192
@main .group ("release" )
@@ -255,7 +259,7 @@ def get_releases(repo_name, verbose=False):
255
259
256
260
releases = []
257
261
_recursive_gh_get (
258
- GITHUB_API + '/repos/{0}/releases' .format (repo_name ), releases )
262
+ _github_api_url + '/repos/{0}/releases' .format (repo_name ), releases )
259
263
260
264
if verbose :
261
265
list (map (print_release_info ,
@@ -373,7 +377,7 @@ def patch_release(repo_name, current_tag_name, **values):
373
377
data .update (values )
374
378
375
379
if not dry_run :
376
- url = GITHUB_API + '/repos/{0}/releases/{1}' .format (
380
+ url = _github_api_url + '/repos/{0}/releases/{1}' .format (
377
381
repo_name , release ['id' ])
378
382
response = _request (
379
383
'PATCH' , url ,
@@ -394,7 +398,7 @@ def get_assets(repo_name, tag_name, verbose=False):
394
398
raise Exception ('Release with tag_name {0} not found' .format (tag_name ))
395
399
396
400
assets = []
397
- _recursive_gh_get (GITHUB_API + '/repos/{0}/releases/{1}/assets' .format (
401
+ _recursive_gh_get (_github_api_url + '/repos/{0}/releases/{1}/assets' .format (
398
402
repo_name , release ["id" ]), assets )
399
403
400
404
if verbose :
@@ -465,7 +469,7 @@ def gh_release_create(repo_name, tag_name, asset_pattern=None, name=None, body=N
465
469
data ["target_commitish" ] = target_commitish
466
470
if not dry_run :
467
471
response = _request (
468
- 'POST' , GITHUB_API + '/repos/{0}/releases' .format (repo_name ),
472
+ 'POST' , _github_api_url + '/repos/{0}/releases' .format (repo_name ),
469
473
data = json .dumps (data ),
470
474
headers = {'Content-Type' : 'application/json' })
471
475
response .raise_for_status ()
@@ -540,7 +544,7 @@ def gh_release_delete(repo_name, pattern, keep_pattern=None,
540
544
print ('deleting release {0}' .format (release ['tag_name' ]))
541
545
if dry_run :
542
546
continue
543
- url = (GITHUB_API
547
+ url = (_github_api_url
544
548
+ '/repos/{0}/releases/{1}' .format (repo_name , release ['id' ]))
545
549
response = _request ('DELETE' , url )
546
550
response .raise_for_status ()
@@ -683,7 +687,7 @@ def _upload_release_file(
683
687
print (" deleting %s (invalid asset "
684
688
"with state set to 'new')" % asset ['name' ])
685
689
url = (
686
- GITHUB_API
690
+ _github_api_url
687
691
+ '/repos/{0}/releases/assets/{1}' .format (
688
692
repo_name , asset ['id' ])
689
693
)
@@ -747,7 +751,7 @@ def gh_asset_upload(repo_name, tag_name, pattern, dry_run=False, verbose=False):
747
751
# Raise exception if no token is specified AND netrc file is found
748
752
# BUT only api.github.com is specified. See #17
749
753
has_github_token = "GITHUB_TOKEN" in os .environ
750
- has_netrc = requests .utils .get_netrc_auth (GITHUB_API )
754
+ has_netrc = requests .utils .get_netrc_auth (_github_api_url )
751
755
if not has_github_token and has_netrc :
752
756
if requests .utils .get_netrc_auth (upload_url ) is None :
753
757
raise EnvironmentError (
@@ -832,7 +836,7 @@ def gh_asset_delete(repo_name, tag_name, pattern,
832
836
if dry_run :
833
837
continue
834
838
url = (
835
- GITHUB_API
839
+ _github_api_url
836
840
+ '/repos/{0}/releases/assets/{1}' .format (repo_name , asset ['id' ])
837
841
)
838
842
response = _request ('DELETE' , url )
@@ -860,7 +864,7 @@ def _cli_asset_download(*args, **kwargs):
860
864
def _download_file (repo_name , asset ):
861
865
response = _request (
862
866
method = 'GET' ,
863
- url = GITHUB_API + '/repos/{0}/releases/assets/{1}' .format (
867
+ url = _github_api_url + '/repos/{0}/releases/assets/{1}' .format (
864
868
repo_name , asset ['id' ]),
865
869
allow_redirects = False ,
866
870
headers = {'Accept' : 'application/octet-stream' },
@@ -930,7 +934,7 @@ def get_refs(repo_name, tags=None, pattern=None):
930
934
931
935
refs = []
932
936
_recursive_gh_get (
933
- GITHUB_API + '/repos/{0}/git/refs' .format (repo_name ), refs )
937
+ _github_api_url + '/repos/{0}/git/refs' .format (repo_name ), refs )
934
938
935
939
# If "tags" is True, keep only "refs/tags/*"
936
940
data = refs
@@ -945,7 +949,7 @@ def get_refs(repo_name, tags=None, pattern=None):
945
949
try :
946
950
tags = []
947
951
_recursive_gh_get (
948
- GITHUB_API + '/repos/{0}/git/refs/tags' .format (repo_name ), tags )
952
+ _github_api_url + '/repos/{0}/git/refs/tags' .format (repo_name ), tags )
949
953
for ref in tags :
950
954
if ref ["ref" ] not in tag_names :
951
955
data .append (ref )
@@ -1001,7 +1005,7 @@ def gh_ref_create(repo_name, reference, sha):
1001
1005
'sha' : sha
1002
1006
}
1003
1007
response = _request (
1004
- 'POST' , GITHUB_API + '/repos/{0}/git/refs' .format (repo_name ),
1008
+ 'POST' , _github_api_url + '/repos/{0}/git/refs' .format (repo_name ),
1005
1009
data = json .dumps (data ),
1006
1010
headers = {'Content-Type' : 'application/json' })
1007
1011
response .raise_for_status ()
@@ -1040,7 +1044,7 @@ def gh_ref_delete(repo_name, pattern, keep_pattern=None, tags=False,
1040
1044
continue
1041
1045
response = _request (
1042
1046
'DELETE' ,
1043
- GITHUB_API + '/repos/{0}/git/{1}' .format (repo_name , ref ['ref' ]))
1047
+ _github_api_url + '/repos/{0}/git/{1}' .format (repo_name , ref ['ref' ]))
1044
1048
response .raise_for_status ()
1045
1049
return len (removed_refs ) > 0
1046
1050
@@ -1053,7 +1057,7 @@ def gh_commit_get(repo_name, sha):
1053
1057
try :
1054
1058
response = _request (
1055
1059
'GET' ,
1056
- GITHUB_API + '/repos/{0}/git/commits/{1}' .format (repo_name , sha ))
1060
+ _github_api_url + '/repos/{0}/git/commits/{1}' .format (repo_name , sha ))
1057
1061
response .raise_for_status ()
1058
1062
return response .json ()
1059
1063
except requests .exceptions .HTTPError as exc_info :
0 commit comments