summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xbin/reproducible_html_packages.py155
1 files changed, 155 insertions, 0 deletions
diff --git a/bin/reproducible_html_packages.py b/bin/reproducible_html_packages.py
new file mode 100755
index 00000000..75b786f5
--- /dev/null
+++ b/bin/reproducible_html_packages.py
@@ -0,0 +1,155 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+
+# clean-notes: sort and clean the notes stored in notes.git
+# Copyright © 2015 Mattia Rizzolo <mattia@mapreri.org>
+# Licensed under GPL-2+
+#
+# Depends: python3
+
+
+from reproducible_common import *
+
+html_package_page = Template((tab*2).join(("""
+<table class="head">
+ <tr>
+ <td>
+ <span style="font-size:1.2em;">$package</span> $version
+ <a href="/index_$status.html" target="_parent" title="$status">
+ <img src="/userContent/static/$icon" alt="$status" />
+ </a>
+ <span style="font-size:0.9em;">at $build_time:</span>
+$links
+ <a href="/userContent/rbuild/${package}_$version.rbuild.log" target="main">rbuild ($rbuild_size)</a>
+ <a href="https://packages.qa.debian.org/$package" target="main">PTS</a>
+ <a href="https://bugs.debian.org/src:$package" target="main">BTS</a>
+ <a href="https://sources.debian.net/src/$package/" target="main">sources</a>
+ <a href="https://sources.debian.net/src/$package/$version/debian/rules" target="main">debian/rules</a>
+ </td>
+ <td style="text-align:right; font-size:0.9em;">
+ <a href="%s" target="_parent">
+ reproducible builds
+ </a>
+ </td>
+ </tr>
+</table>
+<iframe name="main" src="${default_view}" width="100%%" height="98%%" frameborder="0">
+ <p>
+ Your browser does not support iframes.
+ Use a different one or follow the links above.
+ </p>
+</iframe>""" % REPRODUCIBLE_URL ).splitlines(True)))
+
+
+def sizeof_fmt(num):
+ for unit in ['B','KB','MB','GB','TB','PB','EB','ZB']:
+ if abs(num) < 1024.0:
+ return str(int(round(float("%3f" % num), 0))) + "%s" % (unit)
+ num /= 1024.0
+ return str(int(round(float("%f" % num), 0))) + "%s" % ('Yi')
+
+
+def check_package_status(package):
+ """
+ This returns a tuple containing status, version and build_date of the last
+ version of the package built by jenkins CI
+ """
+ try:
+ query = 'SELECT status,version,build_date ' + \
+ 'FROM source_packages ' + \
+ 'WHERE name="%s"' % package
+ result = query_db(query)[0]
+ except IndexError:
+ log.critical('The query produces no results. The query: ' + query)
+ raise
+ status = str(result[0])
+ version = str(result[1])
+ build_date = str(result[2])
+ return (status, version, build_date)
+
+def gen_extra_links(package, version):
+ notes = NOTES_PATH + '/' + package + '_note.html'
+ buildinfo = BUILDINFO_PATH + '/' + package + '_' + version + '_amd64.buildinfo'
+ dbd = DBD_PATH + '/' + package + '_' + version + '.debbindiff.html'
+
+ links = ''
+ default_view = False
+ # check whether there are notes available for this package
+ if os.access(notes, os.R_OK):
+ url = NOTES_URI + '/' + package + '_note.html'
+ links += '<a href="' + url + '" target="main">notes</a>\n'
+ default_view = url
+ else:
+ log.debug('notes not detected at ' + notes)
+ if os.access(dbd, os.R_OK):
+ url = DBD_URI + '/' + package + '_' + version + '.debbindiff.html'
+ links += '<a href="' + url + '" target="main">debbindiff</a>\n'
+ if not default_view:
+ default_view = url
+ else:
+ log.debug('debbindiff not detetected at ' + dbd)
+ if os.access(buildinfo, os.R_OK):
+ url = BUILDINFO_URI + '/' + package + '_' + version + '_amd64.buildinfo'
+ links += '<a href="' + url + '" target="main">buildinfo</a>\n'
+ if not default_view:
+ default_view = url
+ else:
+ log.debug('buildinfo not detected at ' + buildinfo)
+ return (links, default_view)
+
+
+def process_packages(packages):
+ """
+ generate the /rb-pkg/package.html page
+ packages should be a list
+ """
+ total = len(packages)
+ log.info('Generating the pages of ' + str(total) + ' package(s)')
+ for pkg in sorted(packages):
+ pkg = str(pkg)
+ status, version, build_date = check_package_status(pkg)
+ log.info('Generating the page of ' + pkg + ' ' + version +
+ ' builded at ' + build_date)
+
+ rbuild = RBUILD_PATH + '/' + pkg + '_' + version + '.rbuild.log'
+ links, default_view = gen_extra_links(pkg, version)
+
+ if not default_view: # this is only possible only if there are no notes,
+ # debbindiff or buildinfo files
+ default_view = RBUILD_URI + '/' + pkg + '_' + version + '.rbuild.log'
+ try:
+ log_size = os.stat(rbuild).st_size
+ except FileNotFoundError:
+ log.warning('The package ' + pkg +
+ ' did not produce any buildlog! Check ' + rbuild)
+ log_size = 0
+ pass
+ status, icon = join_status_icon(status, pkg, version)
+ html = html_package_page.substitute(package=pkg,
+ status=status,
+ version=version,
+ build_time=build_date,
+ icon=icon,
+ links=links,
+ rbuild_size=sizeof_fmt(log_size),
+ default_view=default_view)
+ destfile = RB_PKG_PATH + '/' + pkg + '.html'
+ desturl = REPRODUCIBLE_URL + RB_PKG_URI + '/' + pkg + '.html'
+ title = pkg + ' reproducible build results'
+ write_html_page(title=title, body=html, destfile=destfile,
+ noheader=True, nofooter=True, noendpage=True)
+ log.info("Package page generated at " + desturl)
+ purge_old_pages() # housekeep is always good
+
+
+def purge_old_pages():
+ presents = sorted(os.listdir(RB_PKG_PATH))
+ for page in presents:
+ pkg = page.rsplit('.', 1)[0]
+ log.debug('Checking if ' + page + ' (from ' + pkg + ') is still needed')
+ query = 'SELECT name FROM source_packages WHERE name="%s"' % pkg
+ result = query_db(query)
+ if not result: # actually, the query produces no results
+ log.info('There is no package named ' + pkg + ' in the database.' +
+ ' Removing old page.')
+ os.remove(RB_PKG_PATH + '/' + page)