package: security-tracker severity: minor Hi, the attached non-intrusive patch basically rewrites the availableRelease() function which is only used to create https://security-tracker.debian.org/tracker/data/releases which currently is not ordered at all. The patch makes it logically by release, subrelease and archive. Shall I push this patch into SVN? cheers, Holger, finally finished chasing what he thought was a low hanging fruit ;)
From f1841ee6be909cd6c8e8c8bf94385edf9637954f Mon Sep 17 00:00:00 2001
From: Holger Levsen <holger@layer-acht.org>
Date: Fri, 19 Sep 2014 17:02:36 +0200
Subject: [PATCH] rewrite DB.availableReleases() to make it possible to sort by
release, subrelease and archive
---
bin/tracker_service.py | 2 ++
lib/python/security_db.py | 49 +++++++++++++++++++++++++++++++----------------
2 files changed, 34 insertions(+), 17 deletions(-)
diff --git a/bin/tracker_service.py b/bin/tracker_service.py
index 4ad08be..4e87dc1 100644
--- a/bin/tracker_service.py
+++ b/bin/tracker_service.py
@@ -1141,6 +1141,8 @@ not unimportant."""),
sources = 'yes'
else:
sources = 'no'
+ if 'source' in archs:
+ archs.remove('source')
yield rel, subrel, archive, sources, make_list(archs)
return self.create_page(
url, "Available releases",
diff --git a/lib/python/security_db.py b/lib/python/security_db.py
index 4917b46..1abfb8a 100644
--- a/lib/python/security_db.py
+++ b/lib/python/security_db.py
@@ -440,6 +440,14 @@ class DB:
return -1
self.db.createscalarfunction("subrelease_to_number", subrelease_to_number, 1)
+ archives = ['main', 'contrib', 'non-free']
+ def archive_to_number(u):
+ try:
+ return archives.index(u)
+ except ValueError:
+ return -1
+ self.db.createscalarfunction("archive_to_number", archive_to_number, 1)
+
def release_name(release, subrelease, archive):
if archive <> 'main':
release = release + '/' + archive
@@ -451,6 +459,10 @@ class DB:
self.db.createcollation("version", debian_support.version_compare)
+ def source_arch():
+ return "source"
+ self.db.createscalarfunction("source_arch", source_arch, 0)
+
def filePrint(self, filename):
"""Returns a fingerprint string for filename."""
@@ -860,24 +872,27 @@ class DB:
if cursor is None:
cursor = self.cursor()
- releases = {}
- for r in cursor.execute(
- """SELECT DISTINCT release, subrelease, archive
- FROM source_packages"""):
- releases[r] = (True, [])
-
- for (rel, subrel, archive, archs) in cursor.execute(
- """SELECT DISTINCT release, subrelease, archive, archs
- FROM binary_packages"""):
- key = (rel, subrel, archive)
- if not releases.has_key(key):
- releases[key] = (False, [])
- releases[key][1][:] = mergeLists(releases[key][1], archs)
-
result = []
- for ((rel, subrel, archive), (sources, archs)) in releases.items():
- result.append((rel, subrel, archive, sources, archs))
- result.sort()
+ result.append(('', '', '', False, []))
+ for (rel, subrel, archive, archs) in cursor.execute(
+ """SELECT * FROM
+ (SELECT DISTINCT release, subrelease, archive, archs
+ FROM binary_packages
+ UNION SELECT DISTINCT release, subrelease, archive, source_arch() as archs
+ FROM source_packages)
+ ORDER BY release_to_number(release), subrelease_to_number(subrelease), archive_to_number(archive)"""):
+ if "source" in archs:
+ sources=True
+ else:
+ sources=False
+ (p_rel, p_subrel, p_archive, p_sources, p_archs) = result.pop()
+ if rel == p_rel and subrel == p_subrel and archive == p_archive:
+ sources = sources or p_sources
+ result.append((rel, subrel, archive, sources, mergeLists(p_archs, archs)))
+ else:
+ result.append((p_rel, p_subrel, p_archive, p_sources, mergeLists([], p_archs)))
+ result.append((rel, subrel, archive, sources, mergeLists([], archs)))
+ result.pop(0)
return result
--
1.9.1
Attachment:
signature.asc
Description: This is a digitally signed message part.