support for retry on failure

resolves #94
This commit is contained in:
lilydjwg 2019-02-15 20:16:49 +08:00
parent f482ee6499
commit a6315985d0
3 changed files with 20 additions and 7 deletions

View file

@ -1,4 +1,4 @@
# MIT licensed
# Copyright (c) 2013-2018 lilydjwg <lilydjwg@gmail.com>, et al.
__version__ = '1.3'
__version__ = '1.4dev'

View file

@ -104,12 +104,14 @@ def write_verfile(file, versions):
class Source:
oldver = newver = None
tries = 1
def __init__(self, file):
def __init__(self, file, tries=1):
self.config = config = configparser.ConfigParser(
dict_type=dict, allow_no_value=True
)
self.name = file.name
self.tries = tries
config.read_file(file)
if '__config__' in config:
c = config['__config__']
@ -141,6 +143,7 @@ class Source:
self.oldvers = {}
self.curvers = self.oldvers.copy()
tries = self.tries
token_q = asyncio.Queue(maxsize=self.max_concurrent)
for _ in range(self.max_concurrent):
@ -149,10 +152,18 @@ class Source:
async def worker(name, conf):
await token_q.get()
try:
ret = await get_version(name, conf, keyman=self.keymanager)
return name, ret
except Exception as e:
return name, e
for i in range(tries):
try:
ret = await get_version(
name, conf, keyman=self.keymanager)
return name, ret
except Exception as e:
if i + 1 < tries:
logger.warning('failed, retrying',
name=name, exc_info=e)
await asyncio.sleep(i)
else:
return name, e
finally:
await token_q.put(True)

View file

@ -28,6 +28,8 @@ def main():
parser = argparse.ArgumentParser(description='New version checker for software')
parser.add_argument('-n', '--notify', action='store_true', default=False,
help='show desktop notifications when a new version is available')
parser.add_argument('-t', '--tries', default=1, type=int, metavar='N',
help='try N times when errors occur')
core.add_common_arguments(parser)
args = parser.parse_args()
if core.process_common_arguments(args):
@ -36,7 +38,7 @@ def main():
if not args.file:
return
s = Source(args.file)
s = Source(args.file, args.tries)
ioloop = asyncio.get_event_loop()
ioloop.run_until_complete(s.check())