2121from requests import request
2222
2323
24- GITHUB_API = "https://api.github.com"
25-
2624REQ_BUFFER_SIZE = 65536 # Chunk size when iterating a download body
2725
2826_github_token_cli_arg = None
27+ _github_api_url = None
2928
3029
3130class _NoopProgressReporter (object ):
@@ -105,7 +104,7 @@ def _check_for_credentials(func):
105104 @wraps (func )
106105 def with_check_for_credentials (* args , ** kwargs ):
107106 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 )
109108 if (not _github_token_cli_arg
110109 and not has_github_token_env_var and not has_netrc ):
111110 raise EnvironmentError (
@@ -173,16 +172,21 @@ def _validate_repo_name(ctx, param, value):
173172@click .group ()
174173@click .option ("--github-token" , envvar = 'GITHUB_TOKEN' , default = None ,
175174 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]' )
176178@click .option ("--progress/--no-progress" , default = True ,
177179 help = "Display progress bar (default: yes)." )
178- def main (github_token , progress ):
180+ def main (github_token , github_api_url , progress ):
179181 """A CLI to easily manage GitHub releases, assets and references."""
180182 global progress_reporter_cls
181183 progress_reporter_cls .reportProgress = sys .stdout .isatty () and progress
182184 if progress_reporter_cls .reportProgress :
183185 progress_reporter_cls = _progress_bar
184186 global _github_token_cli_arg
185187 _github_token_cli_arg = github_token
188+ global _github_api_url
189+ _github_api_url = github_api_url
186190
187191
188192@main .group ("release" )
@@ -255,7 +259,7 @@ def get_releases(repo_name, verbose=False):
255259
256260 releases = []
257261 _recursive_gh_get (
258- GITHUB_API + '/repos/{0}/releases' .format (repo_name ), releases )
262+ _github_api_url + '/repos/{0}/releases' .format (repo_name ), releases )
259263
260264 if verbose :
261265 list (map (print_release_info ,
@@ -373,7 +377,7 @@ def patch_release(repo_name, current_tag_name, **values):
373377 data .update (values )
374378
375379 if not dry_run :
376- url = GITHUB_API + '/repos/{0}/releases/{1}' .format (
380+ url = _github_api_url + '/repos/{0}/releases/{1}' .format (
377381 repo_name , release ['id' ])
378382 response = _request (
379383 'PATCH' , url ,
@@ -394,7 +398,7 @@ def get_assets(repo_name, tag_name, verbose=False):
394398 raise Exception ('Release with tag_name {0} not found' .format (tag_name ))
395399
396400 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 (
398402 repo_name , release ["id" ]), assets )
399403
400404 if verbose :
@@ -465,7 +469,7 @@ def gh_release_create(repo_name, tag_name, asset_pattern=None, name=None, body=N
465469 data ["target_commitish" ] = target_commitish
466470 if not dry_run :
467471 response = _request (
468- 'POST' , GITHUB_API + '/repos/{0}/releases' .format (repo_name ),
472+ 'POST' , _github_api_url + '/repos/{0}/releases' .format (repo_name ),
469473 data = json .dumps (data ),
470474 headers = {'Content-Type' : 'application/json' })
471475 response .raise_for_status ()
@@ -540,7 +544,7 @@ def gh_release_delete(repo_name, pattern, keep_pattern=None,
540544 print ('deleting release {0}' .format (release ['tag_name' ]))
541545 if dry_run :
542546 continue
543- url = (GITHUB_API
547+ url = (_github_api_url
544548 + '/repos/{0}/releases/{1}' .format (repo_name , release ['id' ]))
545549 response = _request ('DELETE' , url )
546550 response .raise_for_status ()
@@ -683,7 +687,7 @@ def _upload_release_file(
683687 print (" deleting %s (invalid asset "
684688 "with state set to 'new')" % asset ['name' ])
685689 url = (
686- GITHUB_API
690+ _github_api_url
687691 + '/repos/{0}/releases/assets/{1}' .format (
688692 repo_name , asset ['id' ])
689693 )
@@ -747,7 +751,7 @@ def gh_asset_upload(repo_name, tag_name, pattern, dry_run=False, verbose=False):
747751 # Raise exception if no token is specified AND netrc file is found
748752 # BUT only api.github.com is specified. See #17
749753 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 )
751755 if not has_github_token and has_netrc :
752756 if requests .utils .get_netrc_auth (upload_url ) is None :
753757 raise EnvironmentError (
@@ -832,7 +836,7 @@ def gh_asset_delete(repo_name, tag_name, pattern,
832836 if dry_run :
833837 continue
834838 url = (
835- GITHUB_API
839+ _github_api_url
836840 + '/repos/{0}/releases/assets/{1}' .format (repo_name , asset ['id' ])
837841 )
838842 response = _request ('DELETE' , url )
@@ -860,7 +864,7 @@ def _cli_asset_download(*args, **kwargs):
860864def _download_file (repo_name , asset ):
861865 response = _request (
862866 method = 'GET' ,
863- url = GITHUB_API + '/repos/{0}/releases/assets/{1}' .format (
867+ url = _github_api_url + '/repos/{0}/releases/assets/{1}' .format (
864868 repo_name , asset ['id' ]),
865869 allow_redirects = False ,
866870 headers = {'Accept' : 'application/octet-stream' },
@@ -930,7 +934,7 @@ def get_refs(repo_name, tags=None, pattern=None):
930934
931935 refs = []
932936 _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 )
934938
935939 # If "tags" is True, keep only "refs/tags/*"
936940 data = refs
@@ -945,7 +949,7 @@ def get_refs(repo_name, tags=None, pattern=None):
945949 try :
946950 tags = []
947951 _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 )
949953 for ref in tags :
950954 if ref ["ref" ] not in tag_names :
951955 data .append (ref )
@@ -1001,7 +1005,7 @@ def gh_ref_create(repo_name, reference, sha):
10011005 'sha' : sha
10021006 }
10031007 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 ),
10051009 data = json .dumps (data ),
10061010 headers = {'Content-Type' : 'application/json' })
10071011 response .raise_for_status ()
@@ -1040,7 +1044,7 @@ def gh_ref_delete(repo_name, pattern, keep_pattern=None, tags=False,
10401044 continue
10411045 response = _request (
10421046 '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' ]))
10441048 response .raise_for_status ()
10451049 return len (removed_refs ) > 0
10461050
@@ -1053,7 +1057,7 @@ def gh_commit_get(repo_name, sha):
10531057 try :
10541058 response = _request (
10551059 '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 ))
10571061 response .raise_for_status ()
10581062 return response .json ()
10591063 except requests .exceptions .HTTPError as exc_info :
0 commit comments