← Back to team overview

launchpad-reviewers team mailing list archive

[Merge] lp:~jelmer/launchpad/613468-xb-ppa-db into lp:launchpad

 

Jelmer Vernooij has proposed merging lp:~jelmer/launchpad/613468-xb-ppa-db into lp:launchpad.

Requested reviews:
  Stuart Bishop (stub): db
  Launchpad code reviewers (launchpad-reviewers): code


This adds a database field for user_defined_fields to SourcePackageRelease and BinaryPackageRelease. This is required for bug 613468 so that we can put these user defined fields in the Packages and Sources files generated by the publisher. 

Pre-implementation call: with bigjools

Tests: 
./bin/test lp.soyuz.tests.test_binarypackagerelease lp.soyuz.tests.test_sourcepackagerelease


-- 
https://code.launchpad.net/~jelmer/launchpad/613468-xb-ppa-db/+merge/32307
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~jelmer/launchpad/613468-xb-ppa-db into lp:launchpad.
=== added file 'database/schema/patch-2207-82-0.sql'
--- database/schema/patch-2207-82-0.sql	1970-01-01 00:00:00 +0000
+++ database/schema/patch-2207-82-0.sql	2010-08-11 11:07:47 +0000
@@ -0,0 +1,11 @@
+-- Copyright 2010 Canonical Ltd.  This software is licensed under the
+-- GNU Affero General Public License version 3 (see the file LICENSE).
+SET client_min_messages=ERROR;
+
+ALTER TABLE BinaryPackageRelease
+    ADD COLUMN user_defined_fields TEXT;
+
+ALTER TABLE SourcePackageRelease
+    ADD COLUMN user_defined_fields TEXT;
+
+INSERT INTO LaunchpadDatabaseRevision VALUES (2207, 82, 0);

=== modified file 'lib/lp/archiveuploader/nascentuploadfile.py'
--- lib/lp/archiveuploader/nascentuploadfile.py	2010-07-21 11:13:19 +0000
+++ lib/lp/archiveuploader/nascentuploadfile.py	2010-08-11 11:07:47 +0000
@@ -846,6 +846,12 @@
 
     def storeInDatabase(self, build):
         """Insert this binary release and build into the database."""
+
+        known_fields = set(['Description', 'Essential',
+            'Installed-Size', 'Depends', 'Recommends',
+            'Suggests', 'Conflicts', 'Replaces', 'Provides',
+            'Pre-Depends', 'Enhances', 'Breaks'])
+
         # Reencode everything we are supplying, because old packages
         # contain latin-1 text and that sucks.
         encoded = {}
@@ -871,6 +877,11 @@
         else:
             debug_package = None
 
+        user_defined_fields = []
+        for field, value in encoded.iteritems():
+            if field not in known_fields:
+                user_defined_fields.append((field, value))
+
         binary = build.createBinaryPackageRelease(
             binarypackagename=binary_name,
             version=self.control_version,
@@ -890,6 +901,7 @@
             pre_depends=encoded.get('Pre-Depends', ''),
             enhances=encoded.get('Enhances', ''),
             breaks=encoded.get('Breaks', ''),
+            user_defined_fields=user_defined_fields,
             essential=is_essential,
             installedsize=installedsize,
             architecturespecific=architecturespecific,

=== modified file 'lib/lp/registry/interfaces/distroseries.py'
--- lib/lp/registry/interfaces/distroseries.py	2010-08-05 00:25:36 +0000
+++ lib/lp/registry/interfaces/distroseries.py	2010-08-11 11:07:47 +0000
@@ -572,7 +572,7 @@
         dsc_maintainer_rfc822, dsc_standards_version, dsc_format,
         dsc_binaries, archive, copyright, build_conflicts,
         build_conflicts_indep, dateuploaded=None,
-        source_package_recipe_build=None):
+        source_package_recipe_build=None, user_defined_fields=None):
         """Create an uploads `SourcePackageRelease`.
 
         Set this distroseries set to be the uploadeddistroseries.
@@ -608,6 +608,8 @@
          :param archive: IArchive to where the upload was targeted
          :param dateuploaded: optional datetime, if omitted assumed nowUTC
          :param source_package_recipe_build: optional SourcePackageRecipeBuild
+         :param user_defined_fields: optional sequence of key-value pairs with
+                                     user defined fields.
          :return: the just creates `SourcePackageRelease`
         """
 

=== modified file 'lib/lp/registry/model/distroseries.py'
--- lib/lp/registry/model/distroseries.py	2010-08-10 21:54:41 +0000
+++ lib/lp/registry/model/distroseries.py	2010-08-11 11:07:47 +0000
@@ -1128,7 +1128,7 @@
         dsc_maintainer_rfc822, dsc_standards_version, dsc_format,
         dsc_binaries, archive, copyright, build_conflicts,
         build_conflicts_indep, dateuploaded=DEFAULT,
-        source_package_recipe_build=None):
+        source_package_recipe_build=None, user_defined_fields=None):
         """See `IDistroSeries`."""
         return SourcePackageRelease(
             upload_distroseries=self, sourcepackagename=sourcepackagename,
@@ -1144,7 +1144,8 @@
             dsc_format=dsc_format, dsc_binaries=dsc_binaries,
             build_conflicts=build_conflicts,
             build_conflicts_indep=build_conflicts_indep,
-            source_package_recipe_build=source_package_recipe_build)
+            source_package_recipe_build=source_package_recipe_build,
+            user_defined_fields=user_defined_fields)
 
     def getComponentByName(self, name):
         """See `IDistroSeries`."""

=== modified file 'lib/lp/soyuz/interfaces/binarypackagebuild.py'
--- lib/lp/soyuz/interfaces/binarypackagebuild.py	2010-08-10 21:54:41 +0000
+++ lib/lp/soyuz/interfaces/binarypackagebuild.py	2010-08-11 11:07:47 +0000
@@ -125,10 +125,11 @@
 
     def createBinaryPackageRelease(
         binarypackagename, version, summary, description, binpackageformat,
-        component, section, priority, shlibdeps, depends, recommends,
-        suggests, conflicts, replaces, provides, pre_depends, enhances,
-        breaks, essential, installedsize, architecturespecific,
-        debug_package):
+        component, section, priority, installedsize, architecturespecific,
+        shlibdeps=None, depends=None, recommends=None, suggests=None,
+        conflicts=None, replaces=None, provides=None, pre_depends=None,
+        enhances=None, breaks=None, essential=False, debug_package=None,
+        user_defined_fields=None):
         """Create and return a `BinaryPackageRelease`.
 
         The binarypackagerelease will be attached to this specific build.

=== modified file 'lib/lp/soyuz/interfaces/binarypackagerelease.py'
--- lib/lp/soyuz/interfaces/binarypackagerelease.py	2010-07-10 04:52:43 +0000
+++ lib/lp/soyuz/interfaces/binarypackagerelease.py	2010-08-11 11:07:47 +0000
@@ -56,6 +56,8 @@
         title=_("Debug package"), schema=Interface, required=False,
         description=_("The corresponding package containing debug symbols "
                       "for this binary."))
+    user_defined_fields = Attribute(
+        "Sequence of user-defined fields as key-value pairs.")
 
     files = Attribute("Related list of IBinaryPackageFile entries")
 

=== modified file 'lib/lp/soyuz/interfaces/sourcepackagerelease.py'
--- lib/lp/soyuz/interfaces/sourcepackagerelease.py	2010-07-29 22:55:15 +0000
+++ lib/lp/soyuz/interfaces/sourcepackagerelease.py	2010-08-11 11:07:47 +0000
@@ -96,8 +96,8 @@
         "was first uploaded in Launchpad")
     publishings = Attribute("MultipleJoin on SourcepackagePublishing")
 
-
-
+    user_defined_fields = Attribute(
+        "Sequence of user-defined fields as key-value pairs.")
     # read-only properties
     name = Attribute('The sourcepackagename for this release, as text')
     title = Attribute('The title of this sourcepackagerelease')

=== modified file 'lib/lp/soyuz/model/binarypackagebuild.py'
--- lib/lp/soyuz/model/binarypackagebuild.py	2010-08-10 21:54:41 +0000
+++ lib/lp/soyuz/model/binarypackagebuild.py	2010-08-11 11:07:47 +0000
@@ -448,10 +448,11 @@
 
     def createBinaryPackageRelease(
         self, binarypackagename, version, summary, description,
-        binpackageformat, component,section, priority, shlibdeps,
-        depends, recommends, suggests, conflicts, replaces, provides,
-        pre_depends, enhances, breaks, essential, installedsize,
-        architecturespecific, debug_package):
+        binpackageformat, component, section, priority, installedsize,
+        architecturespecific, shlibdeps=None, depends=None, recommends=None,
+        suggests=None, conflicts=None, replaces=None, provides=None,
+        pre_depends=None, enhances=None, breaks=None, essential=False,
+        debug_package=None, user_defined_fields=None):
         """See IBuild."""
         return BinaryPackageRelease(
             build=self, binarypackagename=binarypackagename, version=version,
@@ -463,7 +464,8 @@
             provides=provides, pre_depends=pre_depends, enhances=enhances,
             breaks=breaks, essential=essential, installedsize=installedsize,
             architecturespecific=architecturespecific,
-            debug_package=debug_package)
+            debug_package=debug_package,
+            user_defined_fields=user_defined_fields)
 
     def estimateDuration(self):
         """See `IBuildBase`."""

=== modified file 'lib/lp/soyuz/model/binarypackagerelease.py'
--- lib/lp/soyuz/model/binarypackagerelease.py	2010-07-10 04:46:49 +0000
+++ lib/lp/soyuz/model/binarypackagerelease.py	2010-08-11 11:07:47 +0000
@@ -13,6 +13,8 @@
 
 from zope.interface import implements
 
+import simplejson
+
 from sqlobject import StringCol, ForeignKey, IntCol, SQLMultipleJoin, BoolCol
 from storm.locals import Date, Int, Reference, Storm
 
@@ -68,6 +70,22 @@
     files = SQLMultipleJoin('BinaryPackageFile',
         joinColumn='binarypackagerelease', orderBy="libraryfile")
 
+    _user_defined_fields = StringCol(dbName='user_defined_fields')
+
+    def __init__(self, *args, **kwargs):
+        if 'user_defined_fields' in kwargs:
+            kwargs['_user_defined_fields'] = simplejson.dumps(
+                kwargs['user_defined_fields'])
+            del kwargs['user_defined_fields']
+        SQLBase.__init__(self, *args, **kwargs)
+
+    @property
+    def user_defined_fields(self):
+        """See `IBinaryPackageRelease`."""
+        if self._user_defined_fields is None:
+            return []
+        return simplejson.loads(self._user_defined_fields)
+
     @property
     def title(self):
         """See `IBinaryPackageRelease`."""

=== modified file 'lib/lp/soyuz/model/sourcepackagerelease.py'
--- lib/lp/soyuz/model/sourcepackagerelease.py	2010-08-02 02:13:52 +0000
+++ lib/lp/soyuz/model/sourcepackagerelease.py	2010-08-11 11:07:47 +0000
@@ -15,6 +15,7 @@
 import pytz
 from StringIO import StringIO
 import re
+import simplejson
 
 from sqlobject import StringCol, ForeignKey, SQLMultipleJoin
 from storm.expr import Join
@@ -147,6 +148,22 @@
     package_diffs = SQLMultipleJoin(
         'PackageDiff', joinColumn='to_source', orderBy="-date_requested")
 
+    _user_defined_fields = StringCol(dbName='user_defined_fields')
+
+    def __init__(self, *args, **kwargs):
+        if 'user_defined_fields' in kwargs:
+            kwargs['_user_defined_fields'] = simplejson.dumps(
+                kwargs['user_defined_fields'])
+            del kwargs['user_defined_fields']
+        SQLBase.__init__(self, *args, **kwargs)
+
+    @property
+    def user_defined_fields(self):
+        """See `IBinaryPackageRelease`."""
+        if self._user_defined_fields is None:
+            return []
+        return simplejson.loads(self._user_defined_fields)
+
     @property
     def builds(self):
         """See `ISourcePackageRelease`."""

=== added file 'lib/lp/soyuz/tests/test_binarypackagerelease.py'
--- lib/lp/soyuz/tests/test_binarypackagerelease.py	1970-01-01 00:00:00 +0000
+++ lib/lp/soyuz/tests/test_binarypackagerelease.py	2010-08-11 11:07:47 +0000
@@ -0,0 +1,51 @@
+# Copyright 2010 Canonical Ltd.  This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Test BinaryPackageRelease."""
+
+__metaclass__ = type
+
+from canonical.testing import LaunchpadFunctionalLayer
+
+from lp.soyuz.interfaces.binarypackagerelease import (
+    IBinaryPackageRelease, BinaryPackageFormat)
+from lp.soyuz.interfaces.publishing import (
+    PackagePublishingPriority,)
+
+from lp.testing import TestCaseWithFactory
+
+
+class TestBinaryPackageRelease(TestCaseWithFactory):
+
+    layer = LaunchpadFunctionalLayer
+
+    def test_provides(self):
+        build = self.factory.makeBinaryPackageBuild()
+        release = build.createBinaryPackageRelease(
+                binarypackagename=self.factory.makeBinaryPackageName(),
+                version="0.1", summary="My package",
+                description="My description",
+                binpackageformat=BinaryPackageFormat.DEB,
+                component=self.factory.makeComponent("main"),
+                section=self.factory.makeSection("net"),
+                priority=PackagePublishingPriority.OPTIONAL,
+                installedsize=0, architecturespecific=False)
+        self.assertProvides(release, IBinaryPackageRelease)
+
+    def test_user_defined_fields(self):
+        build = self.factory.makeBinaryPackageBuild()
+        release = build.createBinaryPackageRelease(
+                binarypackagename=self.factory.makeBinaryPackageName(),
+                version="0.1", summary="My package",
+                description="My description",
+                binpackageformat=BinaryPackageFormat.DEB,
+                component=self.factory.makeComponent("main"),
+                section=self.factory.makeSection("net"),
+                priority=PackagePublishingPriority.OPTIONAL,
+                installedsize=0, architecturespecific=False,
+                user_defined_fields=[
+                    ("Python-Version", ">= 2.4"),
+                    ("Other", "Bla")])
+        self.assertEquals([
+            ["Python-Version", ">= 2.4"],
+            ["Other", "Bla"]], release.user_defined_fields)

=== modified file 'lib/lp/soyuz/tests/test_sourcepackagerelease.py'
--- lib/lp/soyuz/tests/test_sourcepackagerelease.py	2010-07-29 23:09:34 +0000
+++ lib/lp/soyuz/tests/test_sourcepackagerelease.py	2010-08-11 11:07:47 +0000
@@ -30,3 +30,12 @@
         spr = self.factory.makeSourcePackageRelease(
             source_package_recipe_build=recipe_build)
         self.assertEqual(recipe_build.requester, spr.uploader)
+
+    def test_user_defined_fields(self):
+        release = self.factory.makeSourcePackageRelease(
+                user_defined_fields=[
+                    ("Python-Version", ">= 2.4"),
+                    ("Other", "Bla")])
+        self.assertEquals([
+            ["Python-Version", ">= 2.4"],
+            ["Other", "Bla"]], release.user_defined_fields)

=== modified file 'lib/lp/testing/factory.py'
--- lib/lp/testing/factory.py	2010-08-06 10:48:49 +0000
+++ lib/lp/testing/factory.py	2010-08-11 11:07:47 +0000
@@ -2289,7 +2289,8 @@
                                  dsc_format='1.0', dsc_binaries='foo-bin',
                                  date_uploaded=UTC_NOW,
                                  source_package_recipe_build=None,
-                                 dscsigningkey=None):
+                                 dscsigningkey=None,
+                                 user_defined_fields=None):
         """Make a `SourcePackageRelease`."""
         if distroseries is None:
             if source_package_recipe_build is not None:
@@ -2355,7 +2356,8 @@
             dsc_binaries=dsc_binaries,
             archive=archive,
             dateuploaded=date_uploaded,
-            source_package_recipe_build=source_package_recipe_build)
+            source_package_recipe_build=source_package_recipe_build,
+            user_defined_fields=user_defined_fields)
 
     def makeSourcePackageReleaseFile(self, sourcepackagerelease=None,
                                      library_file=None, filetype=None):


Follow ups