update_days report

This change adds new report, update_days, that nicely
displays how many days ago a package was updated. This
report is now available in interactive mode and included
into daily report.
This commit is contained in:
Ivan A. Melnikov 2019-02-01 21:05:21 +04:00
parent 7160cbf06d
commit f33aa9ae43
6 changed files with 74 additions and 1 deletions

View File

@ -1,3 +1,3 @@
all:
python2-flake8 --ignore=F403,F405 port_stats/
python2-flake8 --ignore=F403,F405,W503 port_stats/

View File

@ -115,6 +115,12 @@ def daily_report(out_dir, what, repos, all_tasks):
with open(os.path.join(out_dir, 'task_stats.json'), 'w') as out:
print(utils.format_dict(state_stats, indent=True), file=out)
update_report = reports.update_days(by_name, package_tasks,
colors=('YELLOW', 'ORANGE'),
now=utils.to_timestamp(now))
with open(os.path.join(out_dir, 'update_days.txt'), 'w') as out:
print(update_report, file=out)
# TSV for packages
with open(os.path.join(out_dir, 'colorized.tsv'), 'w') as out:
for name in sorted(by_name):

View File

@ -32,6 +32,7 @@ import re
import readline
import rlcompleter # noqa
import sys
import time
from pydoc import pager
@ -135,6 +136,10 @@ def spi(pkg, to=print):
to(reports.package_one_line(pkg, BY_NAME, PACKAGE_TASKS))
def update_days(colors=('YELLOW', 'ORANGE'), to=pager):
to(reports.update_days(BY_NAME, PACKAGE_TASKS, colors, time.time()))
def _spi_by_predicate(pred, colors):
colors = colors or colorize.COLORS
return '\n'.join(

View File

@ -4,6 +4,7 @@ import logging
from port_stats import colorize
from port_stats import lists
from port_stats import tasks
from port_stats import utils
LOG = logging.getLogger(__name__)
@ -67,3 +68,50 @@ def format_colored_task(info, by_name):
return tasks.format_task(
info,
extra_info=lambda p: colorize.package_color(p, by_name) or 'NONE')
def update_days(by_name, package_tasks, colors, now):
java = []
recent = []
old = []
for name in by_name:
color, bp, np = by_name[name]
if color not in colors or not np:
continue
infos = package_tasks.get(name, ())
try:
last_update = max(info['task_ts'] for info in infos
if info['state'] == 'DONE')
except ValueError:
# never updated
last_update = 0
try:
first_pending = min(info['task_ts'] for info in infos
if tasks.task_is_updating(info, np))
except ValueError:
# no pending task; updated at least on 2018-01-01
first_pending = max(last_update, 1514750400)
about = package_one_line(name, by_name, package_tasks)
days_pendig = utils.days_from(first_pending, now)
days_updated = (utils.days_from(last_update, now)
if last_update else 99999)
ev = (days_pendig, days_updated, about)
if days_pendig <= 3:
recent.append(ev)
elif 'jpp' in about:
java.append(ev)
else:
old.append(ev)
total = len(recent) + len(old) + len(java)
return ('days pending // days since update // color // name'
+ ' // latest version // current version // tasks\n'
+ '\n\nTOTALLY PENDING: %s' % total
+ '\n\nRECENT (%s) // not yet old\n' % len(recent)
+ '\n'.join('%5s %5s\t%s' % x for x in sorted(recent))
+ '\n\nOLD (%s) // update pending for 4+ days\n' % len(old)
+ '\n'.join('%5s %5s\t%s' % x for x in sorted(old))
+ '\n\nOLD JAVA (%s) // has its own category\n' % len(java)
+ '\n'.join('%5s %5s\t%s' % x for x in sorted(java)))

View File

@ -47,6 +47,7 @@ def load_task(task_dir, name, cache=None, now=None):
data = json.load(f)
data['task_path'] = path
data['load_time'] = now or time.time()
data['task_ts'] = mtime
data['task_time'] = utils.format_timestamp(mtime)
data.setdefault('subtasks', {})
data.setdefault('try', 0)

View File

@ -1,6 +1,7 @@
import datetime
import json
import time
def format_timestamp(ts, fmt='%Y-%m-%d %H:%M:%S'):
@ -8,6 +9,13 @@ def format_timestamp(ts, fmt='%Y-%m-%d %H:%M:%S'):
return dt.strftime(fmt)
_EPOCH = datetime.datetime.utcfromtimestamp(0)
def to_timestamp(dt):
return (dt - _EPOCH).total_seconds()
def maybe_int(value):
try:
return int(value)
@ -15,6 +23,11 @@ def maybe_int(value):
return value
def days_from(ts, now=None):
now = now or time.time()
return int((now - ts) / 24 / 60 / 60)
def _transform_to_format(value):
if isinstance(value, dict):
return dict((maybe_int(k), _transform_to_format(v))