From cf27baf51956747f9ea5a349d41e796031871c5c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 6 Nov 2013 21:48:52 -0600 Subject: Add new `signature_bytes` field on package model Now that we have a BinaryField option in Django 1.6, put it to use. Signed-off-by: Dan McGee --- main/models.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'main/models.py') diff --git a/main/models.py b/main/models.py index 2ace0109..91f1483b 100644 --- a/main/models.py +++ b/main/models.py @@ -97,7 +97,7 @@ class Package(models.Model): pkgver = models.CharField(max_length=255) pkgrel = models.CharField(max_length=255) epoch = models.PositiveIntegerField(default=0) - pkgdesc = models.TextField(null=True) + pkgdesc = models.TextField('description', null=True) url = models.CharField(max_length=255, null=True) filename = models.CharField(max_length=255) compressed_size = PositiveBigIntegerField() @@ -106,10 +106,11 @@ class Package(models.Model): last_update = models.DateTimeField(db_index=True) files_last_update = models.DateTimeField(null=True, blank=True) created = models.DateTimeField() - packager_str = models.CharField(max_length=255) + packager_str = models.CharField('packager string', max_length=255) packager = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL) - pgp_signature = models.TextField(null=True, blank=True) + pgp_signature = models.TextField('PGP signature', null=True, blank=True) + signature_bytes = models.BinaryField('PGP signature', null=True) flag_date = models.DateTimeField(null=True, blank=True) objects = PackageManager() -- cgit v1.2.3-2-g168b From a4cf77ba247605fb442b314e311de2829bb3706b Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 6 Nov 2013 22:05:18 -0600 Subject: Move signature data from base64 string to bytes type Signed-off-by: Dan McGee --- main/models.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) (limited to 'main/models.py') diff --git a/main/models.py b/main/models.py index 91f1483b..70872c60 100644 --- a/main/models.py +++ b/main/models.py @@ -1,4 +1,3 @@ -from base64 import b64decode from datetime import datetime from itertools import groupby from pgpdump import BinaryData @@ -141,13 +140,9 @@ class Package(models.Model): @property def signature(self): - try: - data = b64decode(self.pgp_signature.encode('utf-8')) - except TypeError: - return None - if not data: + if not self.signature_bytes: return None - data = BinaryData(data) + data = BinaryData(self.signature_bytes) packets = list(data.packets()) return packets[0] -- cgit v1.2.3-2-g168b From 071bd6bd71f681c45048fc0a0961e58d43d44d48 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Wed, 6 Nov 2013 22:08:01 -0600 Subject: Drop old base64-ed PGP signature column We've moved onto bytes only now. Signed-off-by: Dan McGee --- main/models.py | 1 - 1 file changed, 1 deletion(-) (limited to 'main/models.py') diff --git a/main/models.py b/main/models.py index 70872c60..3f964082 100644 --- a/main/models.py +++ b/main/models.py @@ -108,7 +108,6 @@ class Package(models.Model): packager_str = models.CharField('packager string', max_length=255) packager = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL) - pgp_signature = models.TextField('PGP signature', null=True, blank=True) signature_bytes = models.BinaryField('PGP signature', null=True) flag_date = models.DateTimeField(null=True, blank=True) -- cgit v1.2.3-2-g168b From 833798f4fb7f629fdb8d7e57b5f25b31d395fa5e Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Mon, 11 Nov 2013 16:28:34 -0600 Subject: Filtered requiredby list for non-primary depends For something like gambas3 which has a makedepend on postgresql, we end up getting every single split package listed in the required by list for postgresql. This is a bit crazy and unnecessary, so slim it down a bit when possible by using a slightly crazy groupby function and some smarts in our get_requiredby function. Signed-off-by: Dan McGee --- main/models.py | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'main/models.py') diff --git a/main/models.py b/main/models.py index 2ace0109..b3c3e409 100644 --- a/main/models.py +++ b/main/models.py @@ -9,7 +9,7 @@ from django.contrib.auth.models import User from django.contrib.sites.models import Site from .fields import PositiveBigIntegerField -from .utils import set_created_field +from .utils import set_created_field, DependStandin from devel.models import DeveloperKey from packages.alpm import AlpmAPI @@ -247,6 +247,20 @@ class Package(models.Model): if len(requiredby) == 0: return requiredby + # do we have duplicate pkgbase values for non-primary depends? + # if so, filter it down to base packages only + def grouper(depend): + p = depend.pkg + return (depend.deptype, p.pkgbase, p.repo.testing, p.repo.staging) + + filtered = [] + for (typ, pkgbase, _, _), dep_pkgs in groupby(requiredby, grouper): + dep_pkgs = list(dep_pkgs) + if typ == 'D' or len(dep_pkgs) == 1: + filtered.extend(dep_pkgs) + else: + filtered.append(DependStandin(dep_pkgs)) + # find another package by this name in a different testing or staging # repo; if we can't, we can short-circuit some checks repo_q = (Q(repo__testing=(not self.repo.testing)) | @@ -255,13 +269,13 @@ class Package(models.Model): repo_q, pkgname=self.pkgname, arch=self.arch ).exclude(id=self.id).exists(): # there isn't one? short circuit, all required by entries are fine - return requiredby + return filtered trimmed = [] # for each unique package name, try to screen our package list down to # those packages in the same testing and staging category (yes or no) # iff there is a package in the same testing and staging category. - for _, dep_pkgs in groupby(requiredby, lambda x: x.pkg.pkgname): + for _, dep_pkgs in groupby(filtered, lambda x: x.pkg.pkgname): dep_pkgs = list(dep_pkgs) dep = dep_pkgs[0] if len(dep_pkgs) > 1: @@ -271,6 +285,7 @@ class Package(models.Model): if len(dep_pkgs) > 0: dep = dep_pkgs[0] trimmed.append(dep) + return trimmed def get_depends(self): -- cgit v1.2.3-2-g168b