upgrade wakatime-cli to v10.1.0

This commit is contained in:
Alan Hamlett 2018-01-04 23:33:07 -08:00
parent 1c92017543
commit 683397534c
7 changed files with 81 additions and 38 deletions

View File

@ -1,7 +1,7 @@
__title__ = 'wakatime' __title__ = 'wakatime'
__description__ = 'Common interface to the WakaTime api.' __description__ = 'Common interface to the WakaTime api.'
__url__ = 'https://github.com/wakatime/wakatime' __url__ = 'https://github.com/wakatime/wakatime'
__version_info__ = ('10', '0', '5') __version_info__ = ('10', '1', '0')
__version__ = '.'.join(__version_info__) __version__ = '.'.join(__version_info__)
__author__ = 'Alan Hamlett' __author__ = 'Alan Hamlett'
__author_email__ = 'alan@wakatime.com' __author_email__ = 'alan@wakatime.com'

View File

@ -144,6 +144,11 @@ def send_heartbeats(heartbeats, args, configs, use_ntlm_proxy=False):
_process_server_results(heartbeats, code, content, results, args, configs) _process_server_results(heartbeats, code, content, results, args, configs)
session_cache.save(session) session_cache.save(session)
return SUCCESS return SUCCESS
else:
log.debug({
'response_code': code,
'response_text': content,
})
if should_try_ntlm: if should_try_ntlm:
return send_heartbeats(heartbeats, args, configs, use_ntlm_proxy=True) return send_heartbeats(heartbeats, args, configs, use_ntlm_proxy=True)
@ -157,6 +162,7 @@ def send_heartbeats(heartbeats, args, configs, use_ntlm_proxy=False):
def _process_server_results(heartbeats, code, content, results, args, configs): def _process_server_results(heartbeats, code, content, results, args, configs):
log.debug({ log.debug({
'response_code': code, 'response_code': code,
'results': results,
}) })
for i in range(len(results)): for i in range(len(results)):

View File

@ -103,12 +103,17 @@ def parse_arguments():
'auto-detected language') 'auto-detected language')
parser.add_argument('--hostname', dest='hostname', action=StoreWithoutQuotes, help='hostname of '+ parser.add_argument('--hostname', dest='hostname', action=StoreWithoutQuotes, help='hostname of '+
'current machine.') 'current machine.')
parser.add_argument('--disableoffline', dest='offline', parser.add_argument('--disable-offline', dest='offline',
action='store_false', action='store_false',
help='disables offline time logging instead of queuing logged time') help='disables offline time logging instead of queuing logged time')
parser.add_argument('--disableoffline', dest='offline_deprecated',
action='store_true', help=argparse.SUPPRESS)
parser.add_argument('--hide-filenames', dest='hide_filenames',
action='store_true',
help='obfuscate filenames; will not send file names to api')
parser.add_argument('--hidefilenames', dest='hidefilenames', parser.add_argument('--hidefilenames', dest='hidefilenames',
action='store_true', action='store_true',
help='obfuscate file names; will not send file names to api') help=argparse.SUPPRESS)
parser.add_argument('--exclude', dest='exclude', action='append', parser.add_argument('--exclude', dest='exclude', action='append',
help='filename patterns to exclude from logging; POSIX regex '+ help='filename patterns to exclude from logging; POSIX regex '+
'syntax; can be used more than once') 'syntax; can be used more than once')
@ -116,15 +121,24 @@ def parse_arguments():
help='filename patterns to log; when used in combination with '+ help='filename patterns to log; when used in combination with '+
'--exclude, files matching include will still be logged; '+ '--exclude, files matching include will still be logged; '+
'POSIX regex syntax; can be used more than once') 'POSIX regex syntax; can be used more than once')
parser.add_argument('--include-only-with-project-file',
dest='include_only_with_project_file',
action='store_true',
help='disables tracking folders unless they contain '+
'a .wakatime-project file; defaults to false')
parser.add_argument('--ignore', dest='ignore', action='append', parser.add_argument('--ignore', dest='ignore', action='append',
help=argparse.SUPPRESS) help=argparse.SUPPRESS)
parser.add_argument('--extra-heartbeats', dest='extra_heartbeats', parser.add_argument('--extra-heartbeats', dest='extra_heartbeats',
action='store_true', action='store_true',
help='reads extra heartbeats from STDIN as a JSON array until EOF') help='reads extra heartbeats from STDIN as a JSON array until EOF')
parser.add_argument('--logfile', dest='logfile', action=StoreWithoutQuotes, parser.add_argument('--log-file', dest='log_file', action=StoreWithoutQuotes,
help='defaults to ~/.wakatime.log') help='defaults to ~/.wakatime.log')
parser.add_argument('--apiurl', dest='api_url', action=StoreWithoutQuotes, parser.add_argument('--logfile', dest='logfile', action=StoreWithoutQuotes,
help=argparse.SUPPRESS)
parser.add_argument('--api-url', dest='api_url', action=StoreWithoutQuotes,
help='heartbeats api url; for debugging with a local server') help='heartbeats api url; for debugging with a local server')
parser.add_argument('--apiurl', dest='apiurl', action=StoreWithoutQuotes,
help=argparse.SUPPRESS)
parser.add_argument('--timeout', dest='timeout', type=int, action=StoreWithoutQuotes, parser.add_argument('--timeout', dest='timeout', type=int, action=StoreWithoutQuotes,
help='number of seconds to wait when sending heartbeats to api; '+ help='number of seconds to wait when sending heartbeats to api; '+
'defaults to 60 seconds') 'defaults to 60 seconds')
@ -194,6 +208,8 @@ def parse_arguments():
args.exclude.append(pattern) args.exclude.append(pattern)
except TypeError: # pragma: nocover except TypeError: # pragma: nocover
pass pass
if not args.include_only_with_project_file and configs.has_option('settings', 'include_only_with_project_file'):
args.include_only_with_project_file = configs.get('settings', 'include_only_with_project_file')
if not args.include: if not args.include:
args.include = [] args.include = []
if configs.has_option('settings', 'include'): if configs.has_option('settings', 'include'):
@ -203,18 +219,26 @@ def parse_arguments():
args.include.append(pattern) args.include.append(pattern)
except TypeError: # pragma: nocover except TypeError: # pragma: nocover
pass pass
if args.hidefilenames: if not args.hide_filenames and args.hidefilenames:
args.hidefilenames = ['.*'] args.hide_filenames = args.hidefilenames
if args.hide_filenames:
args.hide_filenames = ['.*']
else: else:
args.hidefilenames = [] args.hide_filenames = []
option = None
if configs.has_option('settings', 'hidefilenames'): if configs.has_option('settings', 'hidefilenames'):
option = configs.get('settings', 'hidefilenames') option = configs.get('settings', 'hidefilenames')
if configs.has_option('settings', 'hide_filenames'):
option = configs.get('settings', 'hide_filenames')
if option is not None:
if option.strip().lower() == 'true': if option.strip().lower() == 'true':
args.hidefilenames = ['.*'] args.hide_filenames = ['.*']
elif option.strip().lower() != 'false': elif option.strip().lower() != 'false':
for pattern in option.split("\n"): for pattern in option.split("\n"):
if pattern.strip() != '': if pattern.strip() != '':
args.hidefilenames.append(pattern) args.hide_filenames.append(pattern)
if args.offline_deprecated:
args.offline = False
if args.offline and configs.has_option('settings', 'offline'): if args.offline and configs.has_option('settings', 'offline'):
args.offline = configs.getboolean('settings', 'offline') args.offline = configs.getboolean('settings', 'offline')
if not args.proxy and configs.has_option('settings', 'proxy'): if not args.proxy and configs.has_option('settings', 'proxy'):
@ -235,11 +259,15 @@ def parse_arguments():
args.verbose = configs.getboolean('settings', 'verbose') args.verbose = configs.getboolean('settings', 'verbose')
if not args.verbose and configs.has_option('settings', 'debug'): if not args.verbose and configs.has_option('settings', 'debug'):
args.verbose = configs.getboolean('settings', 'debug') args.verbose = configs.getboolean('settings', 'debug')
if not args.logfile and configs.has_option('settings', 'logfile'): if not args.log_file and args.logfile:
args.logfile = configs.get('settings', 'logfile') args.log_file = args.logfile
if not args.logfile and os.environ.get('WAKATIME_HOME'): if not args.log_file and configs.has_option('settings', 'log_file'):
args.log_file = configs.get('settings', 'log_file')
if not args.log_file and os.environ.get('WAKATIME_HOME'):
home = os.environ.get('WAKATIME_HOME') home = os.environ.get('WAKATIME_HOME')
args.logfile = os.path.join(os.path.expanduser(home), '.wakatime.log') args.log_file = os.path.join(os.path.expanduser(home), '.wakatime.log')
if not args.api_url and args.apiurl:
args.api_url = args.apiurl
if not args.api_url and configs.has_option('settings', 'api_url'): if not args.api_url and configs.has_option('settings', 'api_url'):
args.api_url = configs.get('settings', 'api_url') args.api_url = configs.get('settings', 'api_url')
if not args.timeout and configs.has_option('settings', 'timeout'): if not args.timeout and configs.has_option('settings', 'timeout'):

View File

@ -14,7 +14,7 @@ import re
from .compat import u, json from .compat import u, json
from .project import get_project_info from .project import get_project_info
from .stats import get_file_stats from .stats import get_file_stats
from .utils import get_user_agent, should_exclude, format_file_path from .utils import get_user_agent, should_exclude, format_file_path, find_project_file
log = logging.getLogger('WakaTime') log = logging.getLogger('WakaTime')
@ -66,9 +66,12 @@ class Heartbeat(object):
return return
if self.type == 'file': if self.type == 'file':
self.entity = format_file_path(self.entity) self.entity = format_file_path(self.entity)
if self.type == 'file' and (not self.entity or not os.path.isfile(self.entity)): if not self.entity or not os.path.isfile(self.entity):
self.skip = u('File does not exist; ignoring this heartbeat.') self.skip = u('File does not exist; ignoring this heartbeat.')
return return
if self._excluded_by_missing_project_file():
self.skip = u('Skipping because missing .wakatime-project file in parent path.')
return
project, branch = get_project_info(configs, self, data) project, branch = get_project_info(configs, self, data)
self.project = project self.project = project
@ -103,7 +106,7 @@ class Heartbeat(object):
Returns a Heartbeat. Returns a Heartbeat.
""" """
if not self.args.hidefilenames: if not self.args.hide_filenames:
return self return self
if self.entity is None: if self.entity is None:
@ -112,7 +115,7 @@ class Heartbeat(object):
if self.type != 'file': if self.type != 'file':
return self return self
for pattern in self.args.hidefilenames: for pattern in self.args.hide_filenames:
try: try:
compiled = re.compile(pattern, re.IGNORECASE) compiled = re.compile(pattern, re.IGNORECASE)
if compiled.search(self.entity): if compiled.search(self.entity):
@ -183,6 +186,11 @@ class Heartbeat(object):
def _excluded_by_pattern(self): def _excluded_by_pattern(self):
return should_exclude(self.entity, self.args.include, self.args.exclude) return should_exclude(self.entity, self.args.include, self.args.exclude)
def _excluded_by_missing_project_file(self):
if not self.args.include_only_with_project_file:
return False
return find_project_file(self.entity) is None
def __repr__(self): def __repr__(self):
return self.json() return self.json()

View File

@ -75,7 +75,7 @@ def setup_logging(args, version):
for handler in logger.handlers: for handler in logger.handlers:
logger.removeHandler(handler) logger.removeHandler(handler)
set_log_level(logger, args) set_log_level(logger, args)
logfile = args.logfile logfile = args.log_file
if not logfile: if not logfile:
logfile = '~/.wakatime.log' logfile = '~/.wakatime.log'
handler = logging.FileHandler(os.path.expanduser(logfile)) handler = logging.FileHandler(os.path.expanduser(logfile))

View File

@ -12,11 +12,11 @@
""" """
import logging import logging
import os
import sys import sys
from .base import BaseProject from .base import BaseProject
from ..compat import u, open from ..compat import u, open
from ..utils import find_project_file
log = logging.getLogger('WakaTime') log = logging.getLogger('WakaTime')
@ -25,7 +25,7 @@ log = logging.getLogger('WakaTime')
class ProjectFile(BaseProject): class ProjectFile(BaseProject):
def process(self): def process(self):
self.config = self._find_config(self.path) self.config = find_project_file(self.path)
self._project_name = None self._project_name = None
self._project_branch = None self._project_branch = None
@ -33,13 +33,13 @@ class ProjectFile(BaseProject):
try: try:
with open(self.config, 'r', encoding='utf-8') as fh: with open(self.config, 'r', encoding='utf-8') as fh:
self._project_name = u(fh.readline().strip()) self._project_name = u(fh.readline().strip()) or None
self._project_branch = u(fh.readline().strip()) self._project_branch = u(fh.readline().strip()) or None
except UnicodeDecodeError: # pragma: nocover except UnicodeDecodeError: # pragma: nocover
try: try:
with open(self.config, 'r', encoding=sys.getfilesystemencoding()) as fh: with open(self.config, 'r', encoding=sys.getfilesystemencoding()) as fh:
self._project_name = u(fh.readline().strip()) self._project_name = u(fh.readline().strip()) or None
self._project_branch = u(fh.readline().strip()) self._project_branch = u(fh.readline().strip()) or None
except: except:
log.traceback(logging.WARNING) log.traceback(logging.WARNING)
except IOError: # pragma: nocover except IOError: # pragma: nocover
@ -53,14 +53,3 @@ class ProjectFile(BaseProject):
def branch(self): def branch(self):
return self._project_branch return self._project_branch
def _find_config(self, path):
path = os.path.realpath(path)
if os.path.isfile(path):
path = os.path.split(path)[0]
if os.path.isfile(os.path.join(path, '.wakatime-project')):
return os.path.join(path, '.wakatime-project')
split_path = os.path.split(path)
if split_path[1] == '':
return None
return self._find_config(split_path[0])

View File

@ -82,3 +82,15 @@ def format_file_path(filepath):
def get_hostname(args): def get_hostname(args):
return args.hostname or socket.gethostname() return args.hostname or socket.gethostname()
def find_project_file(path):
path = os.path.realpath(path)
if os.path.isfile(path):
path = os.path.split(path)[0]
if os.path.isfile(os.path.join(path, '.wakatime-project')):
return os.path.join(path, '.wakatime-project')
split_path = os.path.split(path)
if split_path[1] == '':
return None
return find_project_file(split_path[0])