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:
parent
7160cbf06d
commit
f33aa9ae43
2
Makefile
2
Makefile
@ -1,3 +1,3 @@
|
||||
|
||||
all:
|
||||
python2-flake8 --ignore=F403,F405 port_stats/
|
||||
python2-flake8 --ignore=F403,F405,W503 port_stats/
|
||||
|
@ -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):
|
||||
|
@ -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(
|
||||
|
@ -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)))
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
|
Loading…
x
Reference in New Issue
Block a user