Compare commits

..

14 Commits

2 changed files with 123 additions and 63 deletions

View File

@ -3,6 +3,35 @@ History
-------
11.0.8 (2022-08-23)
++++++++++++++++++
- Bugfix to prevent using empty selection object.
`#116 <https://github.com/wakatime/sublime-wakatime/issues/116>`_
11.0.7 (2022-06-25)
++++++++++++++++++
- Check wakatime-cli versions in background thread.
`#115 <https://github.com/wakatime/sublime-wakatime/issues/115>`_
11.0.6 (2022-06-08)
++++++++++++++++++
- Fix call to log helper.
`#113 <https://github.com/wakatime/sublime-wakatime/issues/113>`_
11.0.5 (2022-04-29)
++++++++++++++++++
- Bugfix to not overwrite global urlopener in embedded Python.
`#110 <https://github.com/wakatime/sublime-wakatime/issues/110>`_
- Chmod wakatime-cli to be executable after updating on non-Windows platforms.
11.0.4 (2022-01-06)
++++++++++++++++++

View File

@ -8,7 +8,7 @@ Website: https://wakatime.com/
==========================================================="""
__version__ = '11.0.4'
__version__ = '11.0.8'
import sublime
@ -40,9 +40,9 @@ try:
except ImportError:
from configparser import ConfigParser, Error as ConfigParserError
try:
from urllib2 import urlopen, urlretrieve, ProxyHandler, build_opener, install_opener, HTTPError
from urllib2 import Request, urlopen, HTTPError
except ImportError:
from urllib.request import urlopen, urlretrieve, ProxyHandler, build_opener, install_opener
from urllib.request import Request, urlopen
from urllib.error import HTTPError
@ -422,7 +422,7 @@ def append_heartbeat(entity, timestamp, is_write, view, project, folders):
'lines_in_file': view.rowcol(view.size())[0] + 1,
}
selections = view.sel()
if selections:
if selections and len(selections) > 0:
rowcol = view.rowcol(selections[0].begin())
row, col = rowcol[0] + 1, rowcol[1] + 1
heartbeat['lineno'] = row
@ -594,9 +594,7 @@ def plugin_loaded():
log(INFO, 'Initializing WakaTime plugin v%s' % __version__)
update_status_bar('Initializing...')
if not isCliLatest():
thread = DownloadCLI()
thread.start()
UpdateCLI().start()
after_loaded()
@ -632,13 +630,19 @@ class WakatimeDashboardCommand(sublime_plugin.ApplicationCommand):
webbrowser.open_new_tab('https://wakatime.com/dashboard')
class DownloadCLI(threading.Thread):
class UpdateCLI(threading.Thread):
"""Non-blocking thread for downloading latest wakatime-cli from GitHub.
"""
def run(self):
if isCliLatest():
return
log(INFO, 'Downloading wakatime-cli...')
if os.path.isdir(os.path.join(RESOURCES_FOLDER, 'wakatime-cli')):
shutil.rmtree(os.path.join(RESOURCES_FOLDER, 'wakatime-cli'))
if not os.path.exists(RESOURCES_FOLDER):
os.makedirs(RESOURCES_FOLDER)
@ -844,83 +848,98 @@ def reportMissingPlatformSupport(osname, arch):
def request(url, last_modified=None):
req = Request(url)
req.add_header('User-Agent', 'github.com/wakatime/sublime-wakatime')
proxy = SETTINGS.get('proxy')
if proxy:
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
else:
opener = build_opener()
req.set_proxy(proxy, 'https')
headers = [('User-Agent', 'github.com/wakatime/sublime-wakatime')]
if last_modified:
headers.append(('If-Modified-Since', last_modified))
opener.addheaders = headers
install_opener(opener)
req.add_header('If-Modified-Since', last_modified)
try:
resp = urlopen(url)
resp = urlopen(req)
headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode()
except HTTPError as err:
if err.code == 304:
return None, None, 304
if is_py2:
ssl._create_default_https_context = ssl._create_unverified_context
try:
resp = urlopen(url)
headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode()
except HTTPError as err2:
if err2.code == 304:
return None, None, 304
log(DEBUG, err.read().decode())
log(DEBUG, err2.read().decode())
raise
except IOError:
raise
with SSLCertVerificationDisabled():
try:
resp = urlopen(req)
headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode()
except HTTPError as err2:
if err2.code == 304:
return None, None, 304
log(DEBUG, err.read().decode())
log(DEBUG, err2.read().decode())
raise
except IOError:
raise
log(DEBUG, err.read().decode())
raise
except IOError:
if is_py2:
ssl._create_default_https_context = ssl._create_unverified_context
try:
resp = urlopen(url)
headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode()
except HTTPError as err:
if err.code == 304:
return None, None, 304
log(DEBUG, err.read().decode())
raise
except IOError:
raise
with SSLCertVerificationDisabled():
try:
resp = urlopen(url)
headers = dict(resp.getheaders()) if is_py2 else resp.headers
return headers, resp.read(), resp.getcode()
except HTTPError as err:
if err.code == 304:
return None, None, 304
log(DEBUG, err.read().decode())
raise
except IOError:
raise
raise
def download(url, filePath):
req = Request(url)
req.add_header('User-Agent', 'github.com/wakatime/sublime-wakatime')
proxy = SETTINGS.get('proxy')
if proxy:
opener = build_opener(ProxyHandler({
'http': proxy,
'https': proxy,
}))
else:
opener = build_opener()
opener.addheaders = [('User-Agent', 'github.com/wakatime/sublime-wakatime')]
req.set_proxy(proxy, 'https')
install_opener(opener)
try:
urlretrieve(url, filePath)
except IOError:
if is_py2:
ssl._create_default_https_context = ssl._create_unverified_context
urlretrieve(url, filePath)
raise
with open(filePath, 'wb') as fh:
try:
resp = urlopen(req)
fh.write(resp.read())
except HTTPError as err:
if err.code == 304:
return None, None, 304
if is_py2:
with SSLCertVerificationDisabled():
try:
resp = urlopen(req)
fh.write(resp.read())
return
except HTTPError as err2:
log(DEBUG, err.read().decode())
log(DEBUG, err2.read().decode())
raise
except IOError:
raise
log(DEBUG, err.read().decode())
raise
except IOError:
if is_py2:
with SSLCertVerificationDisabled():
try:
resp = urlopen(url)
fh.write(resp.read())
return
except HTTPError as err:
log(DEBUG, err.read().decode())
raise
except IOError:
raise
raise
def is_symlink(path):
@ -942,5 +961,17 @@ def createSymlink():
except:
try:
shutil.copy2(getCliLocation(), link)
if not is_win:
os.chmod(link, 509) # 755
except:
log(traceback.format_exc())
log(WARNING, traceback.format_exc())
class SSLCertVerificationDisabled(object):
def __enter__(self):
self.original_context = ssl._create_default_https_context
ssl._create_default_https_context = ssl._create_unverified_context
def __exit__(self, *args, **kwargs):
ssl._create_default_https_context = self.original_context