[Python-modules-commits] r33440 - in packages/plainbox/trunk/debian (3 files)

zyga-guest at users.alioth.debian.org zyga-guest at users.alioth.debian.org
Wed Jul 22 16:05:24 UTC 2015


    Date: Wednesday, July 22, 2015 @ 16:05:23
  Author: zyga-guest
Revision: 33440

debian/patches/fix-packaging-metadata-units: add a combined patch that
addresses three Debian-affecting bugs that prevent providers from
generating some of their dependencies.

Added:
  packages/plainbox/trunk/debian/patches/fix-packaging-metadata-units
Modified:
  packages/plainbox/trunk/debian/changelog
  packages/plainbox/trunk/debian/patches/series

Modified: packages/plainbox/trunk/debian/changelog
===================================================================
--- packages/plainbox/trunk/debian/changelog	2015-07-22 10:15:07 UTC (rev 33439)
+++ packages/plainbox/trunk/debian/changelog	2015-07-22 16:05:23 UTC (rev 33440)
@@ -13,6 +13,9 @@
   * debian/control: Make the dependency on python3-xlsxwriter explicit as it
     is now more directly tested and not so much optional.
   * debian/patches/documentation-theme: refresh patch 
+  * debian/patches/fix-packaging-metadata-units: add a combined patch that
+    addresses three Debian-affecting bugs that prevent providers from
+    generating some of their dependencies.
 
  -- Zygmunt Krynicki <zygmunt.krynicki at canonical.com>  Tue, 21 Jul 2015 12:22:03 +0200
 

Added: packages/plainbox/trunk/debian/patches/fix-packaging-metadata-units
===================================================================
--- packages/plainbox/trunk/debian/patches/fix-packaging-metadata-units	                        (rev 0)
+++ packages/plainbox/trunk/debian/patches/fix-packaging-metadata-units	2015-07-22 16:05:23 UTC (rev 33440)
@@ -0,0 +1,436 @@
+Description: Fix bugs associated with packaging meta-data units
+ This patch contains the following upstream changes, squashed
+ and cherry-picked on top of the 0.22 release. They are:
+ - https://bugs.launchpad.net/plainbox/+bug/1477095
+ - https://bugs.launchpad.net/plainbox/+bug/1476678
+ - https://bugs.launchpad.net/plainbox/+bug/1477131
+ The relevant changes are linked to each bug. In short, they fix bugs that
+ prevent the use of packaging meta-data units to generate Debian dependencies,
+ suggestions and recommendations to work. This is a part of a long-term plan to
+ simplify packaging for providers by moving bulk of the burden upstream.
+Origin: upstream
+Last-Update: 2015-07-22
+
+--- plainbox-0.22.orig/plainbox/impl/unit/packaging.py
++++ plainbox-0.22/plainbox/impl/unit/packaging.py
+@@ -114,6 +114,7 @@ not documented.
+ import abc
+ import errno
+ import logging
++import re
+ import sys
+ 
+ from plainbox.i18n import gettext as _
+@@ -142,13 +143,13 @@ class PackagingMetaDataUnit(Unit):
+ 
+     @property
+     def os_id(self):
+-        """ Identifier of the operating system.  """
+-        return self.get_record_value('os-id')
++        """Identifier of the operating system."""
++        return self.get_record_value(self.Meta.fields.os_id)
+ 
+     @property
+     def os_version_id(self):
+-        """ Version of the operating system.  """
+-        return self.get_record_value('os-version')
++        """Version of the operating system."""
++        return self.get_record_value(self.Meta.fields.os_version_id)
+ 
+     class Meta:
+ 
+@@ -156,7 +157,7 @@ class PackagingMetaDataUnit(Unit):
+ 
+         class fields(SymbolDef):
+ 
+-            """ Symbols for each field of a packaging meta-data unit. """
++            """Symbols for each field of a packaging meta-data unit."""
+ 
+             os_id = 'os-id'
+             os_version_id = 'os-version-id'
+@@ -174,70 +175,144 @@ class PackagingMetaDataUnit(Unit):
+ 
+ class PackagingDriverError(Exception):
+ 
+-    """ Base for all packaging driver exceptions. """
++    """Base for all packaging driver exceptions."""
+ 
+ 
+ class NoPackagingDetected(PackagingDriverError):
+ 
+-    """ Exception raised when packaging cannot be found. """
++    """Exception raised when packaging cannot be found."""
+ 
+ 
+ class NoApplicableBinaryPackages(PackagingDriverError):
+ 
+-    """ Exception raised when no applicable binary packages are found. """
++    """Exception raised when no applicable binary packages are found."""
+ 
+ 
+ class IPackagingDriver(metaclass=abc.ABCMeta):
+ 
+-    """ Interface for all packaging drivers. """
++    """Interface for all packaging drivers."""
+ 
+     @abc.abstractmethod
+     def __init__(self, os_release: 'Dict[str, str]'):
+-        pass
++        """
++        Initialize the packaging driver.
++
++        :param os_release:
++            The dictionary that represents the contents of the
++            ``/etc/os-release`` file. Using this file the packaging driver can
++            infer information about the target operating system that the
++            packaging will be built for.
++
++            This assumes that packages are built natively, not through a
++            cross-compiler of some sort where the target distribution is
++            different from the host distribution.
++        """
+ 
+     @abc.abstractmethod
+     def inspect_provider(self, provider: 'Provider1') -> None:
+-        pass
++        """
++        Inspect a provider looking for packaging meta-data.
++
++        :param provider:
++            A provider object to look at. All of the packaging meta-data units
++            there are inspected, if they are applicable (see
++            :meth:`is_applicable()`. Information from applicable units is
++            collected using the :meth:`collect()` method.
++        """
+ 
+     @abc.abstractmethod
+     def is_applicable(self, unit: Unit) -> bool:
+-        pass
++        """
++        Check if the given unit is applicable for collecting.
++
++        :param unit:
++            The unit to inspect. This doesn't have to be a packaging meta-data
++            unit. In fact, all units are checked with this method.
++        :returns:
++            True if the unit is applicable for collection.
++
++        Packaging meta-data units that have certain properties are applicable.
++        Refer to the documentation of the module for details.
++        """
+ 
+     @abc.abstractmethod
+     def collect(self, unit: Unit) -> None:
+-        pass
++        """
++        Collect information from the given applicable unit.
++
++        :param unit:
++            The unit to collect information from. This is usually expressed as
++            additional fields that are specific to the type of native packaging
++            for the system.
++
++        Collected information is recorded and made available for the
++        :meth:`modify_packaging_tree()` method later.
++        """
+ 
+     @abc.abstractmethod
+     def inspect_packaging(self) -> None:
+-        pass
++        """
++        Inspect the packaging tree for additional information.
++
++        :raises NoPackagingDetected:
++            Exception raised when packaging cannot be found.
++        :raises NoApplicableBinaryPackages:
++            Exception raised when no applicable binary packages are found.
++
++        This method looks at the packaging system located in the current
++        directory. This can be the ``debian/`` directory, a particular
++        ``.spec`` file or anything else. Information obtained from the package
++        is used to infer additional properties that can aid in the packaging
++        process.
++        """
+ 
+     @abc.abstractmethod
+     def modify_packaging_tree(self) -> None:
+-        pass
++        """
++        Modify the packaging tree with information from the packaging units.
++
++        This method uses all of the available information collected from
++        particular packaging meta-data units and from the native packaging to
++        modify the packaging. Additional dependencies may be injected in
++        appropriate places. Please refer to the documentation specific to your
++        packaging system for details.
++        """
+ 
+ 
+ def _strategy_id_version(unit, os_release):
+     _logger.debug(_("Considering strategy: %s"),
+-                  _("os-id == ID and os-version-id == VERSION"))
+-    return (unit.os_id == os_release['ID']
+-            and unit.os_version_id == os_release['VERSION_ID'])
++                  _("os-id == ID and os-version-id == VERSION_ID"))
++    return (
++        'ID' in os_release
++        and unit.os_id == os_release['ID']
++        and 'VERSION_ID' in os_release
++        and unit.os_version_id == os_release['VERSION_ID']
++    )
+ 
+ 
+ def _strategy_id(unit, os_release):
+     _logger.debug(_("Considering strategy: %s"),
+                   _("os-id == ID and os-version-id == undefined"))
+-    return unit.os_id == os_release['ID'] and unit.os_version_id is None
++    return (
++        'ID' in os_release
++        and unit.os_id == os_release['ID']
++        and unit.os_version_id is None
++    )
+ 
+ 
+ def _strategy_id_like(unit, os_release):
+     _logger.debug(_("Considering strategy: %s"),
+                   _("os-id == ID_LIKE and os-version-id == undefined"))
+-    return unit.os_id == os_release['ID_LIKE'] and unit.os_version_id is None
++    return (
++        'ID_LIKE' in os_release
++        and unit.os_id == os_release['ID_LIKE']
++        and unit.os_version_id is None
++    )
+ 
+ 
+ class PackagingDriverBase(IPackagingDriver):
+ 
+-    """ Base implementation of a packaging driver. """
++    """Base implementation of a packaging driver."""
+ 
+     def __init__(self, os_release: 'Dict[str, str]'):
+         self.os_release = os_release
+@@ -262,7 +337,12 @@ class PackagingDriverBase(IPackagingDriv
+ 
+ class NullPackagingDriver(PackagingDriverBase):
+ 
+-    """ Null implementation of a packaging driver. """
++    """
++    Null implementation of a packaging driver.
++
++    This driver just does nothing at all. It is used as a fall-back when
++    nothing better is detected.
++    """
+ 
+     def is_applicable(self, unit: Unit) -> bool:
+         return False
+@@ -316,10 +396,14 @@ class DebianPackagingDriver(PackagingDri
+     def collect(self, unit: Unit) -> None:
+         def rel_list(field):
+             relations = unit.get_record_value(field, '').replace('\n', ' ')
+-            return ', '.join([rel.strip() for rel in relations.split(',')])
+-        self._depends.append(rel_list('Depends'))
+-        self._suggests.append(rel_list('Suggests'))
+-        self._recommends.append(rel_list('Recommends'))
++            return (
++                rel.strip()
++                for rel in re.split(', *', relations)
++                if rel.strip()
++            )
++        self._depends.extend(rel_list('Depends'))
++        self._suggests.extend(rel_list('Suggests'))
++        self._recommends.extend(rel_list('Recommends'))
+ 
+     def _write_pkg_substvars(self, pkg):
+         fname = 'debian/{}.substvars'.format(pkg)
+@@ -357,7 +441,7 @@ class DebianPackagingDriver(PackagingDri
+ 
+ 
+ def get_packaging_driver() -> IPackagingDriver:
+-    """ Get the packaging driver appropriate for the current platform. """
++    """Get the packaging driver appropriate for the current platform."""
+     if sys.platform.startswith("linux"):
+         os_release = get_os_release()
+         if (os_release.get('ID') == 'debian'
+--- /dev/null
++++ plainbox-0.22/plainbox/impl/unit/test_packging.py
+@@ -0,0 +1,180 @@
++# This file is part of Checkbox.
++#
++# Copyright 2015 Canonical Ltd.
++# Written by:
++#   Zygmunt Krynicki <zygmunt.krynicki at canonical.com>
++#
++# Checkbox is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License version 3,
++# as published by the Free Software Foundation.
++#
++# Checkbox is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with Checkbox.  If not, see <http://www.gnu.org/licenses/>.
++
++"""Tests for the PackagingMetaDataUnit and friends."""
++
++from unittest import TestCase
++
++from plainbox.impl.unit.packaging import DebianPackagingDriver
++from plainbox.impl.unit.packaging import PackagingMetaDataUnit
++from plainbox.impl.unit.packaging import _strategy_id
++from plainbox.impl.unit.packaging import _strategy_id_like
++from plainbox.impl.unit.packaging import _strategy_id_version
++
++
++class DebianPackagingDriverTests(TestCase):
++
++    """Tests for the DebianPackagingDriver class."""
++
++    DEBIAN_JESSIE = {
++        'PRETTY_NAME': "Debian GNU/Linux 8 (jessie)",
++        'NAME': "Debian GNU/Linux",
++        'VERSION_ID': "8",
++        'VERSION': "8 (jessie)",
++        'ID': 'debian',
++        'HOME_URL': "http://www.debian.org/",
++        'SUPPORT_URL': "http://www.debian.org/support/",
++        'BUG_REPORT_URL': "https://bugs.debian.org/",
++    }
++
++    DEBIAN_SID = {
++        'PRETTY_NAME': "Debian GNU/Linux stretch/sid",
++        'NAME': "Debian GNU/Linux",
++        'ID': 'debian',
++        'HOME_URL': "https://www.debian.org/",
++        'SUPPORT_URL': "https://www.debian.org/support/",
++        'BUG_REPORT_URL': "https://bugs.debian.org/",
++    }
++
++    UBUNTU_VIVID = {
++        'NAME': "Ubuntu",
++        'VERSION': "15.04 (Vivid Vervet)",
++        'ID': 'ubuntu',
++        'ID_LIKE': 'debian',
++        'PRETTY_NAME': "Ubuntu 15.04",
++        'VERSION_ID': "15.04",
++        'HOME_URL': "http://www.ubuntu.com/",
++        'SUPPORT_URL': "http://help.ubuntu.com/",
++        'BUG_REPORT_URL': "http://bugs.launchpad.net/ubuntu/",
++    }
++
++    def test_fix_1476678(self):
++        """Check https://bugs.launchpad.net/plainbox/+bug/1476678."""
++        driver = DebianPackagingDriver({})
++        driver.collect(PackagingMetaDataUnit({
++            'Depends': (
++                'python3-checkbox-support (>= 0.2),\n'
++                'python3 (>= 3.2),\n'),
++            'Recommends': (
++                'dmidecode,\n'
++                'dpkg (>= 1.13),\n'
++                'lsb-release,\n'
++                'wodim')
++        }))
++        self.assertEqual(driver._depends, [
++            'python3-checkbox-support (>= 0.2)',
++            'python3 (>= 3.2)',
++        ])
++        self.assertEqual(driver._recommends, [
++            'dmidecode',
++            'dpkg (>= 1.13)',
++            'lsb-release',
++            'wodim'
++        ])
++        self.assertEqual(driver._suggests, [])
++
++    def test_fix_1477095(self):
++        """Check https://bugs.launchpad.net/plainbox/+bug/1477095."""
++        # This unit is supposed to for Debian (any version) and derivatives.
++        # Note below that id match lets both Debian Jessie and Debian Sid pass
++        # and that id_like match also lets Ubuntu Vivid pass.
++        unit = PackagingMetaDataUnit({
++            'os-id': 'debian',
++        })
++        # Using id and version match
++        self.assertFalse(_strategy_id_version(unit, {}))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_version(unit, self.UBUNTU_VIVID))
++        # Using id match
++        self.assertFalse(_strategy_id(unit, {}))
++        self.assertTrue(_strategy_id(unit, self.DEBIAN_SID))
++        self.assertTrue(_strategy_id(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id(unit, self.UBUNTU_VIVID))
++        # Using id like
++        self.assertFalse(_strategy_id_like(unit, {}))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_JESSIE))
++        self.assertTrue(_strategy_id_like(unit, self.UBUNTU_VIVID))
++        # This unit is supposed to for Debian Jessie only.  Note below that
++        # only Debian Jessie is passed and only by id and version match.
++        # Nothing else is allowed.
++        unit = PackagingMetaDataUnit({
++            'os-id': 'debian',
++            'os-version-id': '8'
++        })
++        # Using id and version match
++        self.assertFalse(_strategy_id_version(unit, {}))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_SID))
++        self.assertTrue(_strategy_id_version(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_version(unit, self.UBUNTU_VIVID))
++        # Using id match
++        self.assertFalse(_strategy_id(unit, {}))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id(unit, self.UBUNTU_VIVID))
++        # Using id like
++        self.assertFalse(_strategy_id_like(unit, {}))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_like(unit, self.UBUNTU_VIVID))
++        # This unit is supposed to for Ubuntu (any version) and derivatives.
++        # Note that None of the Debian versions pass anymore and the only
++        # version that is allowed here is the one Vivid version we test for.
++        # (If there was an Elementary test here it would have passed as well, I
++        # hope).
++        unit = PackagingMetaDataUnit({
++            'os-id': 'ubuntu',
++        })
++        # Using id and version match
++        self.assertFalse(_strategy_id_version(unit, {}))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_version(unit, self.UBUNTU_VIVID))
++        # Using id match
++        self.assertFalse(_strategy_id(unit, {}))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_JESSIE))
++        self.assertTrue(_strategy_id(unit, self.UBUNTU_VIVID))
++        # Using id like
++        self.assertFalse(_strategy_id_like(unit, {}))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_like(unit, self.UBUNTU_VIVID))
++        # This unit is supposed to for Ubuntu Vivid only.  Note that it behaves
++        # exactly like the Debian Jessie test above.  Only Ubuntu Vivid is
++        # passed and only by the id and version match.
++        unit = PackagingMetaDataUnit({
++            'os-id': 'ubuntu',
++            'os-version-id': '15.04'
++        })
++        # Using id and version match
++        self.assertFalse(_strategy_id_version(unit, {}))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_version(unit, self.DEBIAN_JESSIE))
++        self.assertTrue(_strategy_id_version(unit, self.UBUNTU_VIVID))
++        # Using id match
++        self.assertFalse(_strategy_id(unit, {}))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id(unit, self.UBUNTU_VIVID))
++        # Using id like
++        self.assertFalse(_strategy_id_like(unit, {}))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_SID))
++        self.assertFalse(_strategy_id_like(unit, self.DEBIAN_JESSIE))
++        self.assertFalse(_strategy_id_like(unit, self.UBUNTU_VIVID))

Modified: packages/plainbox/trunk/debian/patches/series
===================================================================
--- packages/plainbox/trunk/debian/patches/series	2015-07-22 10:15:07 UTC (rev 33439)
+++ packages/plainbox/trunk/debian/patches/series	2015-07-22 16:05:23 UTC (rev 33440)
@@ -1,3 +1,4 @@
 unvendorize
 silence-logging-failure
 documentation-theme
+fix-packaging-metadata-units




More information about the Python-modules-commits mailing list