[Qa-jenkins-scm] [jenkins.debian.net] 01/02: reproducible debian: also decorate popular packages in per-issue pages

Holger Levsen holger at layer-acht.org
Tue Jun 14 20:12:01 UTC 2016


This is an automated email from the git hooks/post-receive script.

holger pushed a commit to branch master
in repository jenkins.debian.net.

commit b323cdd195f68a607533d2c2e8f7209744edb3dc
Author: Ximin Luo <infinity0 at debian.org>
Date:   Tue Jun 14 21:45:02 2016 +0200

    reproducible debian: also decorate popular packages in per-issue pages
    
    Signed-off-by: Holger Levsen <holger at layer-acht.org>
---
 bin/reproducible_common.py     | 20 ++++++++++++--------
 bin/reproducible_html_notes.py | 29 ++++++++++++++++++++---------
 2 files changed, 32 insertions(+), 17 deletions(-)

diff --git a/bin/reproducible_common.py b/bin/reproducible_common.py
index 661a81c..3b42cab 100755
--- a/bin/reproducible_common.py
+++ b/bin/reproducible_common.py
@@ -459,29 +459,33 @@ def package_has_notes(package):
         return False
 
 
-def link_package(package, suite, arch, bugs={}):
+def link_package(package, suite, arch, bugs={}, popcon=None, is_popular=None):
     url = RB_PKG_URI + '/' + suite + '/' + arch + '/' + package + '.html'
     query = 'SELECT n.issues, n.bugs, n.comments ' + \
             'FROM notes AS n JOIN sources AS s ON s.id=n.package_id ' + \
             'WHERE s.name="{pkg}" AND s.suite="{suite}" ' + \
             'AND s.architecture="{arch}"'
+    css_classes = []
+    if is_popular:
+        css_classes += ["package-popular"]
+    title = ''
+    if popcon is not None:
+        title += 'popcon score: ' + str(popcon) + '\n'
     try:
         notes = query_db(query.format(pkg=package, suite=suite, arch=arch))[0]
     except IndexError:  # no notes for this package
-        html = '<a href="' + url + '" class="package">' + package  + '</a>'
+        css_classes += ["package"]
     else:
-        title = ''
+        css_classes += ["noted"]
         for issue in json.loads(notes[0]):
             title += issue + '\n'
         for bug in json.loads(notes[1]):
             title += '#' + str(bug) + '\n'
         if notes[2]:
             title += notes[2]
-        title = HTML.escape(title.strip())
-        html = '<a href="' + url + '" class="noted" title="' + title + \
-               '">' + package + '</a>'
-    finally:
-        html += get_trailing_icon(package, bugs) + '\n'
+    html = '<a href="' + url + '" class="' + ' '.join(css_classes) \
+         + '" title="' + HTML.escape(title.strip()) + '">' + package + '</a>' \
+         + get_trailing_icon(package, bugs) + '\n'
     return html
 
 
diff --git a/bin/reproducible_html_notes.py b/bin/reproducible_html_notes.py
index 3b04867..11bcc0f 100755
--- a/bin/reproducible_html_notes.py
+++ b/bin/reproducible_html_notes.py
@@ -276,7 +276,8 @@ def gen_html_issue(issue, suite):
     try:
         arch = 'amd64'
         for status in ['unreproducible', 'FTBFS', 'not for us', 'blacklisted', 'reproducible', 'depwait']:
-            pkgs = [x[0] for x in all_pkgs if x[1] == status and x[2] == suite and x[3] == arch and x[0] in issues_count[issue]]
+            pkgs = [x[0] for x in all_pkgs
+                    if x[1] == status and x[2] == suite and x[3] == arch and x[0] in issues_count[issue]]
             if not pkgs:
                 continue
             affected += tab*4 + '<p>\n'
@@ -284,8 +285,9 @@ def gen_html_issue(issue, suite):
             affected += ' alt="' + status + ' icon" />\n'
             affected += tab*5 + str(len(pkgs)) + ' ' + status + ' packages in ' + suite + '/' + arch +':\n'
             affected += tab*5 + '<code>\n'
-            for pkg in sorted(pkgs, key=lambda x: x in bugs):
-                affected += tab*6 + link_package(pkg, suite, arch, bugs)
+            pkgs_popcon = issues_popcon_annotate(pkgs)
+            for pkg, popcon, is_popular in sorted(pkgs_popcon, key=lambda x: x[0] in bugs):
+                affected += tab*6 + link_package(pkg, suite, arch, bugs, popcon, is_popular)
             affected += tab*5 + '</code>\n'
             affected += tab*4 + '</p>\n'
     except KeyError:    # The note is not listed in any package, that is
@@ -387,12 +389,25 @@ def iterate_over_issues(issues):
         log.info('Created ' + str(i) + ' issue pages for ' + suite)
 
 
+def issues_popcon_annotate(issues_list):
+    # outputs [(package, popcon, is_popular)] where is_popular True if it's
+    # in the upper 1/4 of issues_list, i.e. a relative measure
+    n = len(issues_list)
+    popcon_dict = dict((p, 0) for p in issues_list)
+    popcon_dict.update(popcon.package(*issues_list))
+    issues = sorted(popcon_dict.items(), key=lambda p: p[0])
+    issues_by_popcon = sorted(issues, key=lambda p: p[1], reverse=True)
+    issues_with_popcon = [(p[0], p[1], i<n/4) for i, p in enumerate(issues_by_popcon)]
+    return sorted(issues_with_popcon, key=lambda p: p[0])
+
+
 def sort_issues(scorefunc, issue):
     try:
         return (-scorefunc(issues_count[issue]), issue)
     except KeyError:    # there are no packages affected by this issue
         return (0, issue)
 
+
 def index_issues(issues, scorefuncs):
     firstscorefunc = next(iter(scorefuncs.values()))
     templ = "\n<table class=\"body\">\n" + tab + "<tr>\n" + tab*2 + "<th>\n" \
@@ -410,14 +425,10 @@ def index_issues(issues, scorefuncs):
         for scorefunc in scorefuncs.values():
             html += tab*4 + '<td><b>' + str(scorefunc(issues_list)) + '</b></td>\n'
         html += tab*4 + '<td>\n'
-        popcon_dict = dict((p, 0) for p in issues_list)
-        popcon_dict.update(popcon.package(*issues_list))
-        issues_with_popcon = sorted(popcon_dict.items(), key=lambda p: p[0])
-        issues_by_popcon = sorted(issues_with_popcon, key=lambda p: p[1], reverse=True)
-        popular_packages = set([p[0] for p in issues_by_popcon[:int(len(issues_by_popcon)/4)]])
+        issues_with_popcon = issues_popcon_annotate(issues_list)
         issue_strings = [
             '<span %stitle="popcon score: %s">%s</span>' % (
-                'class="package-popular" ' if p[0] in popular_packages else '', p[1], p[0]
+                'class="package-popular" ' if p[2] else '', p[1], p[0]
             ) for p in issues_with_popcon]
         html += tab*5 + ', '.join(issue_strings) + '\n'
         html += tab*4 + '</td>\n'

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/qa/jenkins.debian.net.git



More information about the Qa-jenkins-scm mailing list