1010import platform
1111import getopt
1212import config
13-
1413from contextlib import closing
14+ from requests .adapters import HTTPAdapter
1515
16+ proxy_flag = False
1617proxies = {}
1718headers = {
1819 "Content-Type" : "application/json"
1920}
21+ ghproxy = "https://ghproxy.com/"
22+ session = requests .session ()
23+ session .proxies = proxies
24+ session .mount ("http://" , HTTPAdapter (max_retries = 5 ))
25+ session .mount ("https://" , HTTPAdapter (max_retries = 5 ))
2026
21- def __set_proxy__ (proxy ):
22- if proxy or config .proxy :
23- # 配置 requests 代理
24- proxies ["http" ] = proxy
25- proxies ["https" ] = proxy
26- # 配置git代理
27- os .system ("git config --global http.https://github.com.proxy %s" % (proxy ))
28- os .system ("git config --global https.https://github.com.proxy %s" % (proxy ))
27+ def __set__flag__ (flag ):
28+ global proxy_flag
29+ proxy_flag = flag
2930
31+ def __set_proxy__ (proxy ):
32+ if not (proxy or config .proxy ):
33+ return
3034
35+ if proxy == ghproxy or config .proxy == ghproxy :
36+ __set__flag__ (True )
37+ return
38+
39+ # 配置 requests 代理
40+ proxies ["http" ] = proxy
41+ proxies ["https" ] = proxy
42+ # 配置git临时代理
43+ os .system ("git config --global http.https://github.com.proxy %s" % (proxy ))
44+ os .system ("git config --global https.https://github.com.proxy %s" % (proxy ))
45+
46+ def __requsets__ (url , headers = None , stream = False ):
47+ try :
48+ if stream :
49+ headers ["Content-Type" ] = "application/octet-stream"
50+
51+ resp = session .get (url , headers = headers ,stream = True , timeout = (10 ,20 ))
52+ if resp .status_code == requests .codes .ok :
53+ return resp
54+ except requests .exceptions .ConnectTimeout as e :
55+ print ("链接github.com超时,请使用-p参数或者在config.py中配置代理后重试!!!" )
56+ exit ()
57+ finally :
58+ resp .close ()
59+
3160def start (out_path , proxy , token ) -> None :
32- __set_proxy__ (proxy ) # 启动代理
61+ __set_proxy__ (proxy )
62+
3363 if token or config .github_token :
3464 headers ["Authorization" ] = ("token %s" ) % (token )
3565
@@ -45,7 +75,7 @@ def start(out_path, proxy, token) -> None:
4575 dir_path = os .path .join (out_path , dir_name )
4676
4777 if not os .path .exists (dir_path ):
48- os .makedirs (dir_path ) # 创建分类目录
78+ os .makedirs (dir_path )
4979
5080 tools_list = json_obj ["tools_list" ]
5181 for tools_name , tools_json_obj in tools_list .items ():
@@ -65,6 +95,8 @@ def clone_source_code(tools_path, dir_path, tools_url) -> None:
6595 '''
6696 if not os .path .exists (tools_path ): # 使用clone拉取主分支代码
6797 git_url = tools_url + ".git"
98+ if proxy_flag :
99+ git_url = ghproxy + tools_url + ".git"
68100 os .chdir (dir_path )
69101 os .system (("git clone %s" ) % git_url )
70102 else : # 更新代码到最新版本
@@ -90,33 +122,31 @@ def download_code_or_binary(tools_path, tools_url, platforms, tools_type) -> Non
90122 api_url = tools_url .replace ("www" , "" )
91123 api_url = tools_url .replace ("github.com" , "api.github.com/repos" ) + "/releases/latest"
92124
93- with closing (requests .get (url = api_url , proxies = proxies )) as resp :
94- if not (resp .status_code == requests .codes .ok ):
95- return
96-
97- repos_json_obj = resp .json ()
98- try :
99- tools_vesion = str (repos_json_obj ["tag_name" ])
100- assets_list = repos_json_obj ["assets" ]
101- zipball_url = repos_json_obj ["zipball_url" ] # 源代码
102- except KeyError as e :
103- # 未发布正式版本就忽略
104- return
105-
106- # 文件不存在,创建并下载
107- if not os .path .exists (tools_path ):
108- os .makedirs (tools_path )
109- tools_name = ""
110- tools_download_url = zipball_url
111- if tools_type == "binary" :
112- for assets in assets_list :
113- browser_download_url = assets ["browser_download_url" ]
114- if file_name in browser_download_url :
115- tools_name = assets ["name" ]
116- tools_download_url = browser_download_url
117-
118- # TODO 是否需要更新二进制文件?期待反馈
119- download_tools (tools_download_url , tools_path , tools_name , tools_vesion )
125+ resp = __requsets__ (api_url ,headers )
126+ repos_json_obj = resp .json ()
127+
128+ try :
129+ tools_vesion = str (repos_json_obj ["tag_name" ])
130+ assets_list = repos_json_obj ["assets" ]
131+ zipball_url = repos_json_obj ["zipball_url" ] # 源代码
132+ except KeyError as e :
133+ # 未发布正式版本就忽略
134+ return
135+
136+ # 文件不存在,创建并下载
137+ if not os .path .exists (tools_path ):
138+ os .makedirs (tools_path )
139+ tools_name = ""
140+ tools_download_url = zipball_url
141+ if tools_type == "binary" :
142+ for assets in assets_list :
143+ browser_download_url = assets ["browser_download_url" ]
144+ if file_name in browser_download_url :
145+ tools_name = assets ["name" ]
146+ tools_download_url = browser_download_url
147+
148+ # TODO 是否需要更新二进制文件?期待反馈
149+ download_tools (tools_download_url , tools_path , tools_name , tools_vesion )
120150
121151def download_tools (tools_download_url , tools_path , tools_name , tools_vesion ) -> None :
122152 new_file_name = tools_name + "_" + tools_vesion
@@ -130,22 +160,19 @@ def download_tools(tools_download_url, tools_path, tools_name, tools_vesion) ->
130160 if os .path .exists (tools_file_path ):
131161 return
132162
133- with closing (requests .get (tools_download_url , proxies = proxies , stream = True )) as resp :
134- current_download_size = 0 # 已下载大小
135- chunk_size = 1024 * 1024 * 5 # 单次5MB大小的下载
136- content_length = int (resp .headers ["content-length" ])
137- try :
138- if resp .status_code == requests .codes .ok :
139- print ('文件: {} 正在下载中, 总大小为: {size:.2f} MB' .format (tools_name , size = content_length / 1024 / 1024 ))
140- with open (file = tools_file_path ,mode = "wb" ,encoding = "utf8" ) as f :
141- for data in resp .iter_content (chunk_size = chunk_size ):
142- current_download_size += len (data )
143- f .write (data )
144- print ('\r ' + '下载进度: %s%.2f%%' % ('=' * int (current_download_size * 50 / content_length ), float (current_download_size / content_length * 100 )), end = ' ' )
145- except Exception as e :
146- pass
147- finally :
148- resp .close ()
163+ resp = __requsets__ (tools_download_url , headers , True )
164+ current_download_size = 0 # 已下载大小
165+ chunk_size = 1024 * 1024 * 5 # 单次5MB大小的下载
166+ content_length = int (resp .headers ["content-length" ])
167+ try :
168+ print ('文件: {} 正在下载中, 总大小为: {size:.2f} MB' .format (tools_name , size = content_length / 1024 / 1024 ))
169+ with open (file = tools_file_path ,mode = "wb" ,encoding = "utf8" ) as f :
170+ for data in resp .iter_content (chunk_size = chunk_size ):
171+ current_download_size += len (data )
172+ f .write (data )
173+ print ('\r ' + '下载进度: %s%.2f%%' % ('=' * int (current_download_size * 50 / content_length ), float (current_download_size / content_length * 100 )), end = ' ' )
174+ except Exception as e :
175+ pass
149176
150177def get_cpu_type ():
151178 sys_platform = sys .platform
0 commit comments