aba8162676
This function displays subtasks of the tasks that would update packages in the target repo. It is especially useful for determining why the particular task gets into next_tasks(...) output. Implementing it nicely required a bit of refactoring to factor out certain parts of colorizing and display mech.
116 lines
3.9 KiB
Python
116 lines
3.9 KiB
Python
|
|
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__)
|
|
|
|
|
|
def percent(small, big):
|
|
perc = (100.0 * small) / big
|
|
return "%6s (%6.2f%% of %s)" % (small, perc, big)
|
|
|
|
|
|
def text_totals(keys, data, legend=(), total=None):
|
|
result = []
|
|
for key in keys:
|
|
if total:
|
|
message = "%10s:%-24s" % (key, percent(data.get(key), total))
|
|
else:
|
|
message = '%10s:%6s' % (key, data.get(key))
|
|
if key in legend:
|
|
message += ' // %s' % legend[key]
|
|
result.append(message)
|
|
if total:
|
|
result.append('%10s:%6s' % ('[TOTAL]', total))
|
|
return '\n'.join(result)
|
|
|
|
|
|
COLORS_EX = tuple(colorize.COLORS) + ('[RECENT]', '[PENDING]')
|
|
|
|
|
|
def color_stats(by_color, names=None):
|
|
if names:
|
|
data = dict((color, sum(1 for p in by_color[color] if p[0] in names))
|
|
for color in colorize.COLORS)
|
|
else:
|
|
data = dict((color, len(by_color[color]))
|
|
for color in colorize.COLORS)
|
|
data['[PENDING]'] = data.get('ORANGE', 0) + data.get('YELLOW', 0)
|
|
data['[RECENT]'] = data.get('GREEN', 0) + data.get('SLATE', 0)
|
|
return data
|
|
|
|
|
|
def color_totals(by_color, names=None, total=None, summary=False):
|
|
data = color_stats(by_color, names)
|
|
if summary:
|
|
keys = COLORS_EX
|
|
legend = dict(colorize.LEGEND)
|
|
legend['[RECENT]'] = 'recent enough'
|
|
legend['[PENDING]'] = 'updates are pending'
|
|
else:
|
|
keys = colorize.COLORS
|
|
legend = colorize.LEGEND
|
|
return text_totals(keys, data, legend, total)
|
|
|
|
|
|
def package_one_line(name, by_name, package_tasks, separator='\t'):
|
|
color, bp, np = by_name[name]
|
|
tasks_str = tasks.format_tasks_short(package_tasks.get(name))
|
|
return '\t'.join((color, name, lists.format_evr(bp),
|
|
lists.format_evr(np), tasks_str))
|
|
|
|
|
|
def update_days(by_name, package_tasks, update_times, now):
|
|
java = []
|
|
recent = []
|
|
old = []
|
|
|
|
for name in by_name:
|
|
color, bp, np = by_name[name]
|
|
if color == 'RED':
|
|
continue
|
|
|
|
last_update = update_times.get(name, 0)
|
|
|
|
infos = package_tasks.get(name, ())
|
|
# for outdated packages, check for newer versions
|
|
# for SLATE packages, check for base repo version rebuilds
|
|
rebuild_nevr = np if color in ('ORANGE', 'YELLOW', 'EXTRA') else bp
|
|
try:
|
|
first_pending = min(
|
|
info['task_ctime'] for info in infos
|
|
if tasks.task_is_updating(info, rebuild_nevr, last_update))
|
|
except ValueError:
|
|
# if package was never updated, set update date to 2018-01-01
|
|
first_pending = 1514750400
|
|
LOG.debug('name=%s, first_pending=%s, last_update=%s',
|
|
name, first_pending, last_update)
|
|
if first_pending < last_update:
|
|
continue
|
|
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)))
|