← Back to team overview

launchpad-reviewers team mailing list archive

Re: [Merge] lp:~wgrant/launchpad/overrides-take-overrides into lp:launchpad

 

Review: Approve

Looks like a reasonable set of changes.  Thanks.

Diff comments:

> === modified file 'lib/lp/soyuz/adapters/overrides.py'
> --- lib/lp/soyuz/adapters/overrides.py	2013-07-16 08:10:32 +0000
> +++ lib/lp/soyuz/adapters/overrides.py	2014-07-18 07:28:40 +0000
> @@ -27,6 +27,7 @@
>      implements,
>      Interface,
>      )
> +from zope.security.proxy import isinstance as zope_isinstance
>  
>  from lp.registry.model.sourcepackagename import SourcePackageName
>  from lp.services.database import bulk
> @@ -66,8 +67,8 @@
>  
>      binary_package_name = Attribute(
>          "The IBinaryPackageName that's being overridden")
> -    distro_arch_series = Attribute(
> -        "The IDistroArchSeries for the publication")
> +    architecture_tag = Attribute(
> +        "The architecture tag for the publication")
>      priority = Attribute(
>          "The PackagePublishingPriority that's being overridden")
>      phased_update_percentage = Attribute(
> @@ -95,7 +96,7 @@
>      """See `ISourceOverride`."""
>      implements(ISourceOverride)
>  
> -    def __init__(self, source_package_name, component, section):
> +    def __init__(self, source_package_name, component=None, section=None):
>          super(SourceOverride, self).__init__(component, section)
>          self.source_package_name = source_package_name
>  
> @@ -105,35 +106,42 @@
>              self.component == other.component and
>              self.section == other.section)
>  
> +    def __repr__(self):
> +        return (
> +            "<%s at %x source_package_name=%r component=%r section=%r>" %
> +            (self.__class__.__name__, id(self), self.source_package_name,
> +             self.component, self.section))
> +
>  
>  class BinaryOverride(Override):
>      """See `IBinaryOverride`."""
>      implements(IBinaryOverride)
>  
> -    def __init__(self, binary_package_name, distro_arch_series, component,
> -                 section, priority, phased_update_percentage):
> +    def __init__(self, binary_package_name, architecture_tag, component=None,
> +                 section=None, priority=None, phased_update_percentage=None):
>          super(BinaryOverride, self).__init__(component, section)
>          self.binary_package_name = binary_package_name
> -        self.distro_arch_series = distro_arch_series
> +        self.architecture_tag = architecture_tag
>          self.priority = priority
>          self.phased_update_percentage = phased_update_percentage
>  
>      def __eq__(self, other):
>          return (
>              self.binary_package_name == other.binary_package_name and
> -            self.distro_arch_series == other.distro_arch_series and
> +            self.architecture_tag == other.architecture_tag and
>              self.component == other.component and
>              self.section == other.section and
>              self.priority == other.priority and
>              self.phased_update_percentage == other.phased_update_percentage)
>  
>      def __repr__(self):
> -        return ("<BinaryOverride at %x component=%r section=%r "
> -            "binary_package_name=%r distro_arch_series=%r priority=%r "
> +        return (
> +            "<%s at %x binary_package_name=%r architecture_tag=%r "
> +            "component=%r section=%r priority=%r "
>              "phased_update_percentage=%r>" %
> -            (id(self), self.component, self.section, self.binary_package_name,
> -             self.distro_arch_series, self.priority,
> -             self.phased_update_percentage))
> +            (self.__class__.__name__, id(self), self.binary_package_name,
> +             self.architecture_tag, self.component, self.section,
> +             self.priority, self.phased_update_percentage))
>  
>  
>  class IOverridePolicy(Interface):
> @@ -149,15 +157,13 @@
>      phased_update_percentage = Attribute(
>          "The phased update percentage to apply to binary publications.")
>  
> -    def calculateSourceOverrides(archive, distroseries, pocket, sources,
> -                                 source_component=None):
> +    def calculateSourceOverrides(archive, distroseries, pocket, sources):
>          """Calculate source overrides.
>  
>          :param archive: The target `IArchive`.
>          :param distroseries: The target `IDistroSeries`.
>          :param pocket: The target `PackagePublishingPocket`.
> -        :param sources: A tuple of `ISourcePackageName`s.
> -        :param source_component: The sources' `IComponent` (optional).
> +        :param sources: A tuple of `ISourceOverride`s.
>  
>          :return: A list of `ISourceOverride`
>          """
> @@ -186,8 +192,7 @@
>          super(BaseOverridePolicy, self).__init__()
>          self.phased_update_percentage = phased_update_percentage
>  
> -    def calculateSourceOverrides(self, archive, distroseries, pocket,
> -                                 sources, source_component=None):
> +    def calculateSourceOverrides(self, archive, distroseries, pocket, sources):
>          raise NotImplementedError()
>  
>      def calculateBinaryOverrides(self, archive, distroseries, pocket,
> @@ -200,7 +205,7 @@
>  
>      Override policy that returns the SourcePackageName, component and
>      section for the latest published source publication, or the
> -    BinaryPackageName, DistroArchSeries, component, section and priority
> +    BinaryPackageName, architecture_tag, component, section and priority
>      for the latest published binary publication.
>      """
>  
> @@ -213,12 +218,13 @@
>              status.append(PackagePublishingStatus.DELETED)
>          return status
>  
> -    def calculateSourceOverrides(self, archive, distroseries, pocket, spns,
> -                                 source_component=None, include_deleted=False):
> +    def calculateSourceOverrides(self, archive, distroseries, pockets, sources,
> +                                 include_deleted=False):
>          def eager_load(rows):
>              bulk.load(Component, (row[1] for row in rows))
>              bulk.load(Section, (row[2] for row in rows))
>  
> +        spns = [override.source_package_name for override in sources]
>          store = IStore(SourcePackagePublishingHistory)
>          already_published = DecoratedResultSet(
>              store.find(
> @@ -241,7 +247,7 @@
>              id_resolver((SourcePackageName, Component, Section)),
>              pre_iter_hook=eager_load)
>          return [
> -            SourceOverride(name, component, section)
> +            SourceOverride(name, component=component, section=section)
>              for (name, component, section) in already_published]
>  
>      def calculateBinaryOverrides(self, archive, distroseries, pocket,
> @@ -251,7 +257,10 @@
>              bulk.load(Section, (row[3] for row in rows))
>  
>          store = IStore(BinaryPackagePublishingHistory)
> -        expanded = calculate_target_das(distroseries, binaries)
> +        expanded = calculate_target_das(
> +            distroseries,
> +            [(override.binary_package_name, override.architecture_tag)
> +             for override in binaries])
>  
>          candidates = [
>              make_package_condition(archive, das, bpn)
> @@ -283,10 +292,13 @@
>                  (BinaryPackageName, DistroArchSeries, Component, Section,
>                  None)),
>              pre_iter_hook=eager_load)
> +        # XXX: This should return None for arch-indep, not the
> +        # nominatedarchindep archtag.
>          return [
>              BinaryOverride(
> -                name, das, component, section, priority,
> -                self.phased_update_percentage)
> +                name, das.architecturetag, component=component,
> +                section=section, priority=priority,
> +                phased_update_percentage=self.phased_update_percentage)
>              for name, das, component, section, priority in already_published]
>  
>  
> @@ -317,7 +329,7 @@
>      @classmethod
>      def getComponentOverride(cls, component=None, return_component=False):
>          # component can be a Component object or a component name.
> -        if isinstance(component, Component):
> +        if zope_isinstance(component, Component):
>              component = component.name
>          override_component_name = cls.DEBIAN_COMPONENT_OVERRIDE_MAP.get(
>              component, cls.DEFAULT_OVERRIDE_COMPONENT)
> @@ -326,15 +338,15 @@
>          else:
>              return override_component_name
>  
> -    def calculateSourceOverrides(self, archive, distroseries, pocket,
> -                                 sources, source_component=None):
> -        default_component = (
> -            archive.default_component or
> -            UnknownOverridePolicy.getComponentOverride(
> -                source_component, return_component=True))
> +    def calculateSourceOverrides(self, archive, distroseries, pocket, sources):
>          return [
> -            SourceOverride(source, default_component, None)
> -            for source in sources]
> +            SourceOverride(
> +                override.source_package_name,
> +                component=(
> +                    archive.default_component or
> +                    UnknownOverridePolicy.getComponentOverride(
> +                        override.component, return_component=True)))
> +            for override in sources]
>  
>      def calculateBinaryOverrides(self, archive, distroseries, pocket,
>                                   binaries):
> @@ -342,9 +354,10 @@
>              IComponentSet)['universe']
>          return [
>              BinaryOverride(
> -                binary, das, default_component, None, None,
> -                self.phased_update_percentage)
> -            for binary, das in calculate_target_das(distroseries, binaries)]
> +                override.binary_package_name, override.architecture_tag,
> +                component=default_component,
> +                phased_update_percentage=self.phased_update_percentage)
> +            for override in binaries]
>  
>  
>  class UbuntuOverridePolicy(FromExistingOverridePolicy,
> @@ -355,36 +368,39 @@
>      unknown policy.
>      """
>  
> -    def calculateSourceOverrides(self, archive, distroseries, pocket,
> -                                 sources, source_component=None):
> -        total = set(sources)
> +    def calculateSourceOverrides(self, archive, distroseries, pocket, sources):
> +        spns = [override.source_package_name for override in sources]
> +        total = set(spns)
>          overrides = FromExistingOverridePolicy.calculateSourceOverrides(
> -            self, archive, distroseries, pocket, sources, source_component,
> -            include_deleted=True)
> +            self, archive, distroseries, pocket, sources, include_deleted=True)
>          existing = set(override.source_package_name for override in overrides)
>          missing = total.difference(existing)
>          if missing:
>              unknown = UnknownOverridePolicy.calculateSourceOverrides(
> -                self, archive, distroseries, pocket, missing, source_component)
> +                self, archive, distroseries, pocket,
> +                [override for override in sources
> +                 if override.source_package_name in missing])
>              overrides.extend(unknown)
>          return overrides
>  
>      def calculateBinaryOverrides(self, archive, distroseries, pocket,
>                                   binaries):
> -        total = set(binaries)
> +        total = set(
> +            (override.binary_package_name, override.architecture_tag)
> +            for override in binaries)
>          overrides = FromExistingOverridePolicy.calculateBinaryOverrides(
>              self, archive, distroseries, pocket, binaries,
>              include_deleted=True)
>          existing = set(
> -            (
> -                override.binary_package_name,
> -                override.distro_arch_series.architecturetag,
> -            )
> +            (override.binary_package_name, override.architecture_tag)
>              for override in overrides)
>          missing = total.difference(existing)
>          if missing:
>              unknown = UnknownOverridePolicy.calculateBinaryOverrides(
> -                self, archive, distroseries, pocket, missing)
> +                self, archive, distroseries, pocket,
> +                [override for override in binaries
> +                 if (override.binary_package_name, override.architecture_tag)
> +                 in missing])
>              overrides.extend(unknown)
>          return overrides
>  
> 
> === modified file 'lib/lp/soyuz/adapters/tests/test_overrides.py'
> --- lib/lp/soyuz/adapters/tests/test_overrides.py	2013-06-21 09:36:02 +0000
> +++ lib/lp/soyuz/adapters/tests/test_overrides.py	2014-07-18 07:28:40 +0000
> @@ -8,6 +8,7 @@
>  from testtools.matchers import Equals
>  from zope.component import getUtility
>  
> +from lp.registry.interfaces.pocket import PackagePublishingPocket
>  from lp.services.database import bulk
>  from lp.services.database.sqlbase import flush_database_caches
>  from lp.soyuz.adapters.overrides import (
> @@ -23,23 +24,24 @@
>      StormStatementRecorder,
>      TestCaseWithFactory,
>      )
> -from lp.testing.layers import LaunchpadZopelessLayer
> +from lp.testing.layers import ZopelessDatabaseLayer
>  from lp.testing.matchers import HasQueryCount
>  
>  
> -class TestOverrides(TestCaseWithFactory):
> +class TestFromExistingOverridePolicy(TestCaseWithFactory):
>  
> -    layer = LaunchpadZopelessLayer
> +    layer = ZopelessDatabaseLayer
>  
>      def test_no_source_overrides(self):
> -        # If the spn is not published in the given archive/distroseries, an
> -        # empty list is returned.
> +        # If the spn is not published in the given archive/distroseries,
> +        # no changes are made.
>          spn = self.factory.makeSourcePackageName()
>          distroseries = self.factory.makeDistroSeries()
>          pocket = self.factory.getAnyPocket()
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateSourceOverrides(
> -            distroseries.main_archive, distroseries, pocket, (spn,))
> +            distroseries.main_archive, distroseries, pocket,
> +            [SourceOverride(spn)])
>          self.assertEqual([], overrides)
>  
>      def test_source_overrides(self):
> @@ -49,10 +51,10 @@
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateSourceOverrides(
>              spph.distroseries.main_archive, spph.distroseries, spph.pocket,
> -            (spph.sourcepackagerelease.sourcepackagename,))
> +            [SourceOverride(spph.sourcepackagerelease.sourcepackagename)])
>          expected = [SourceOverride(
>              spph.sourcepackagerelease.sourcepackagename,
> -            spph.component, spph.section)]
> +            component=spph.component, section=spph.section)]
>          self.assertEqual(expected, overrides)
>  
>      def test_source_overrides_latest_only_is_returned(self):
> @@ -72,9 +74,12 @@
>              sourcepackagerelease=spr, distroseries=distroseries)
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateSourceOverrides(
> -            distroseries.main_archive, distroseries, spph.pocket, (spn,))
> +            spph.distroseries.main_archive, spph.distroseries, spph.pocket,
> +            [SourceOverride(spn)])
>          self.assertEqual(
> -            [SourceOverride(spn, spph.component, spph.section)], overrides)
> +            [SourceOverride(
> +                spn, component=spph.component, section=spph.section)],
> +            overrides)
>  
>      def test_source_overrides_constant_query_count(self):
>          # The query count is constant, no matter how many sources are
> @@ -94,7 +99,7 @@
>          with StormStatementRecorder() as recorder:
>              policy.calculateSourceOverrides(
>                  spph.distroseries.main_archive, spph.distroseries,
> -                spph.pocket, spns)
> +                spph.pocket, [SourceOverride(spn) for spn in spns])
>          self.assertThat(recorder, HasQueryCount(Equals(4)))
>  
>      def test_no_binary_overrides(self):
> @@ -107,25 +112,44 @@
>          pocket = self.factory.getAnyPocket()
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateBinaryOverrides(
> -            distroseries.main_archive, distroseries, pocket, ((bpn, None),))
> +            distroseries.main_archive, distroseries, pocket,
> +            [BinaryOverride(bpn, None)])
>          self.assertEqual([], overrides)
>  
>      def test_binary_overrides(self):
>          # When a binary is published in the given distroarchseries, the
>          # overrides are returned.
> -        bpph = self.factory.makeBinaryPackagePublishingHistory()
> -        distroseries = bpph.distroarchseries.distroseries
> -        distroseries.nominatedarchindep = bpph.distroarchseries
> +        distroseries = self.factory.makeDistroSeries()
> +        bpph1 = self.factory.makeBinaryPackagePublishingHistory(
> +            archive=distroseries.main_archive,
> +            distroarchseries=self.factory.makeDistroArchSeries(distroseries))
> +        bpph2 = self.factory.makeBinaryPackagePublishingHistory(
> +            archive=distroseries.main_archive, pocket=bpph1.pocket,
> +            distroarchseries=self.factory.makeDistroArchSeries(distroseries))
> +        distroseries.nominatedarchindep = bpph1.distroarchseries
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateBinaryOverrides(
> -            distroseries.main_archive, distroseries, bpph.pocket,
> -            ((bpph.binarypackagerelease.binarypackagename, None),))
> +            distroseries.main_archive, distroseries, bpph1.pocket,
> +            [BinaryOverride(
> +                bpph1.binarypackagerelease.binarypackagename,
> +                bpph1.distroarchseries.architecturetag),
> +             BinaryOverride(
> +                bpph2.binarypackagerelease.binarypackagename,
> +                bpph2.distroarchseries.architecturetag),
> +            ])
>          expected = [
>              BinaryOverride(
> -                bpph.binarypackagerelease.binarypackagename,
> -                bpph.distroarchseries, bpph.component, bpph.section,
> -                bpph.priority, None)]
> -        self.assertEqual(expected, overrides)
> +                bpph1.binarypackagerelease.binarypackagename,
> +                bpph1.distroarchseries.architecturetag,
> +                component=bpph1.component, section=bpph1.section,
> +                priority=bpph1.priority),
> +            BinaryOverride(
> +                bpph2.binarypackagerelease.binarypackagename,
> +                bpph2.distroarchseries.architecturetag,
> +                component=bpph2.component, section=bpph2.section,
> +                priority=bpph2.priority),
> +            ]
> +        self.assertContentEqual(expected, overrides)
>  
>      def test_binary_overrides_constant_query_count(self):
>          # The query count is constant, no matter how many bpn-das pairs are
> @@ -146,9 +170,15 @@
>          policy = FromExistingOverridePolicy()
>          with StormStatementRecorder() as recorder:
>              policy.calculateBinaryOverrides(
> -                distroseries.main_archive, distroseries, pocket, bpns)
> +                distroseries.main_archive, distroseries, pocket,
> +                [BinaryOverride(bpn, das) for bpn, das in bpns])
>          self.assertThat(recorder, HasQueryCount(Equals(4)))
>  
> +
> +class TestUnknownOverridePolicy(TestCaseWithFactory):
> +
> +    layer = ZopelessDatabaseLayer
> +
>      def test_getComponentOverride_default_name(self):
>          # getComponentOverride returns the default component name when an
>          # unknown component name is passed.
> @@ -175,18 +205,40 @@
>          self.assertEqual(universe_component, component)
>  
>      def test_unknown_sources(self):
> -        # If the unknown policy is used, it does no checks, just returns the
> -        # defaults.
> -        spph = self.factory.makeSourcePackagePublishingHistory()
> -        policy = UnknownOverridePolicy()
> -        overrides = policy.calculateSourceOverrides(
> -            spph.distroseries.main_archive, spph.distroseries, spph.pocket,
> -            (spph.sourcepackagerelease.sourcepackagename,))
> -        universe = getUtility(IComponentSet)['universe']
> -        expected = [
> -            SourceOverride(
> -                spph.sourcepackagerelease.sourcepackagename, universe,
> -                None)]
> +        # The unknown policy uses a default component based on the
> +        # pre-override component.
> +        for component in ('contrib', 'non-free'):
> +            self.factory.makeComponent(component)
> +        distroseries = self.factory.makeDistroSeries()
> +        spns = [self.factory.makeSourcePackageName() for i in range(3)]
> +        overrides = UnknownOverridePolicy().calculateSourceOverrides(
> +            distroseries.main_archive, distroseries,
> +            PackagePublishingPocket.RELEASE,
> +            [SourceOverride(
> +                spn, component=getUtility(IComponentSet)[component])
> +             for spn, component in zip(spns, ('main', 'contrib', 'non-free'))])
> +        expected = [
> +            SourceOverride(spn, component=getUtility(IComponentSet)[component])
> +            for spn, component in
> +            zip(spns, ('universe', 'multiverse', 'multiverse'))]
> +        self.assertEqual(expected, overrides)
> +
> +    def test_unknown_sources_ppa(self):
> +        # The unknown policy overrides everything to the archive's
> +        # default component, if it has one.
> +        for component in ('contrib', 'non-free'):
> +            self.factory.makeComponent(component)
> +        distroseries = self.factory.makeDistroSeries()
> +        spns = [self.factory.makeSourcePackageName() for i in range(3)]
> +        overrides = UnknownOverridePolicy().calculateSourceOverrides(
> +            self.factory.makeArchive(distribution=distroseries.distribution),
> +            distroseries, PackagePublishingPocket.RELEASE,
> +            [SourceOverride(
> +                spn, component=getUtility(IComponentSet)[component])
> +             for spn, component in zip(spns, ('main', 'contrib', 'non-free'))])
> +        expected = [
> +            SourceOverride(spn, component=getUtility(IComponentSet)[component])
> +            for spn, component in zip(spns, ('main', 'main', 'main'))]
>          self.assertEqual(expected, overrides)
>  
>      def test_unknown_binaries(self):
> @@ -198,20 +250,26 @@
>          policy = UnknownOverridePolicy()
>          overrides = policy.calculateBinaryOverrides(
>              distroseries.main_archive, distroseries, bpph.pocket,
> -            ((bpph.binarypackagerelease.binarypackagename, None),))
> +            [BinaryOverride(
> +                bpph.binarypackagerelease.binarypackagename, None)])
>          universe = getUtility(IComponentSet)['universe']
>          expected = [
>              BinaryOverride(
> -                bpph.binarypackagerelease.binarypackagename,
> -                bpph.distroarchseries, universe, None, None, None)]
> +                bpph.binarypackagerelease.binarypackagename, None,
> +                component=universe)]
>          self.assertEqual(expected, overrides)
>  
> +
> +class TestUbuntuOverridePolicy(TestCaseWithFactory):
> +
> +    layer = ZopelessDatabaseLayer
> +
>      def test_ubuntu_override_policy_sources(self):
>          # The Ubuntu policy incorporates both the existing and the unknown
>          # policy.
>          universe = getUtility(IComponentSet)['universe']
>          spns = [self.factory.makeSourcePackageName()]
> -        expected = [SourceOverride(spns[0], universe, None)]
> +        expected = [SourceOverride(spns[0], component=universe)]
>          distroseries = self.factory.makeDistroSeries()
>          pocket = self.factory.getAnyPocket()
>          for i in xrange(8):
> @@ -222,12 +280,14 @@
>              expected.append(
>                  SourceOverride(
>                      spph.sourcepackagerelease.sourcepackagename,
> -                    spph.component, spph.section))
> +                    component=spph.component, section=spph.section))
>          spns.append(self.factory.makeSourcePackageName())
> -        expected.append(SourceOverride(spns[-1], universe, None))
> +        expected.append(
> +            SourceOverride(spns[-1], component=universe, section=None))

You could probably drop the section=None kwarg here.

>          policy = UbuntuOverridePolicy()
>          overrides = policy.calculateSourceOverrides(
> -            distroseries.main_archive, distroseries, pocket, spns)
> +            distroseries.main_archive, distroseries, pocket,
> +            [SourceOverride(spn) for spn in spns])
>          self.assertEqual(10, len(overrides))
>          sorted_expected = sorted(
>              expected, key=attrgetter("source_package_name.name"))
> @@ -258,23 +318,24 @@
>              bpns.append((bpn, distroarchseries.architecturetag))
>              expected.append(
>                  BinaryOverride(
> -                    bpn, distroarchseries, bpph.component, bpph.section,
> -                    bpph.priority, None))
> +                    bpn, distroarchseries.architecturetag,
> +                    component=bpph.component, section=bpph.section,
> +                    priority=bpph.priority))
>          for i in xrange(2):
>              distroarchseries = self.factory.makeDistroArchSeries(
>                  distroseries=distroseries)
>              bpns.append((bpn, distroarchseries.architecturetag))
>              expected.append(
>                  BinaryOverride(
> -                    bpn, distroarchseries, universe, None, None, None))
> +                    bpn, distroarchseries.architecturetag, component=universe))
>          distroseries.nominatedarchindep = distroarchseries
>          policy = UbuntuOverridePolicy()
>          overrides = policy.calculateBinaryOverrides(
> -            distroseries.main_archive, distroseries, pocket, bpns)
> +            distroseries.main_archive, distroseries, pocket,
> +            [BinaryOverride(bpn, das) for bpn, das in bpns])
>          self.assertEqual(5, len(overrides))
> -        key = attrgetter("binary_package_name.name",
> -            "distro_arch_series.architecturetag",
> -            "component.name")
> +        key = attrgetter(
> +            "binary_package_name.name", "architecture_tag", "component.name")
>          sorted_expected = sorted(expected, key=key)
>          sorted_overrides = sorted(overrides, key=key)
>          self.assertEqual(sorted_expected, sorted_overrides)
> @@ -292,7 +353,8 @@
>          pocket = self.factory.getAnyPocket()
>          policy = FromExistingOverridePolicy()
>          overrides = policy.calculateBinaryOverrides(
> -            distroseries.main_archive, distroseries, pocket, ((bpn, 'i386'),))
> +            distroseries.main_archive, distroseries, pocket,
> +            [BinaryOverride(bpn, 'i386')])
>  
>          self.assertEqual([], overrides)
>  
> @@ -317,21 +379,24 @@
>          bpns.append((bpn, distroarchseries.architecturetag))
>          expected.append(
>              BinaryOverride(
> -                bpn, distroarchseries, bpph.component, bpph.section,
> -                bpph.priority, 50))
> +                bpn, distroarchseries.architecturetag,
> +                component=bpph.component, section=bpph.section,
> +                priority=bpph.priority, phased_update_percentage=50))
>          distroarchseries = self.factory.makeDistroArchSeries(
>              distroseries=distroseries)
>          bpns.append((bpn, distroarchseries.architecturetag))
>          expected.append(
> -            BinaryOverride(bpn, distroarchseries, universe, None, None, 50))
> +            BinaryOverride(
> +                bpn, distroarchseries.architecturetag, component=universe,
> +                phased_update_percentage=50))
>          distroseries.nominatedarchindep = distroarchseries
>          policy = UbuntuOverridePolicy(phased_update_percentage=50)
>          overrides = policy.calculateBinaryOverrides(
> -            distroseries.main_archive, distroseries, pocket, bpns)
> +            distroseries.main_archive, distroseries, pocket,
> +            [BinaryOverride(bpn, das) for bpn, das in bpns])
>          self.assertEqual(2, len(overrides))
> -        key = attrgetter("binary_package_name.name",
> -            "distro_arch_series.architecturetag",
> -            "component.name")
> +        key = attrgetter(
> +            "binary_package_name.name", "architecture_tag", "component.name")
>          sorted_expected = sorted(expected, key=key)
>          sorted_overrides = sorted(overrides, key=key)
>          self.assertEqual(sorted_expected, sorted_overrides)
> 
> === modified file 'lib/lp/soyuz/model/packagecopyjob.py'
> --- lib/lp/soyuz/model/packagecopyjob.py	2014-07-09 01:25:05 +0000
> +++ lib/lp/soyuz/model/packagecopyjob.py	2014-07-18 07:28:40 +0000
> @@ -501,7 +501,8 @@
>          except NotFoundError:
>              section = None
>  
> -        return SourceOverride(source_package_name, component, section)
> +        return SourceOverride(
> +            source_package_name, component=component, section=section)
>  
>      def findSourcePublication(self):
>          """Find the appropriate origin `ISourcePackagePublishingHistory`."""
> @@ -523,7 +524,7 @@
>          override_policy = FromExistingOverridePolicy()
>          ancestry = override_policy.calculateSourceOverrides(
>              self.target_archive, self.target_distroseries,
> -            self.target_pocket, [source_name])
> +            self.target_pocket, [SourceOverride(source_name)])
>  
>          copy_policy = self.getPolicyImplementation()
>  
> @@ -532,7 +533,8 @@
>              # metadata.
>              defaults = UnknownOverridePolicy().calculateSourceOverrides(
>                  self.target_archive, self.target_distroseries,
> -                self.target_pocket, [source_name], source_component)
> +                self.target_pocket,
> +                [SourceOverride(source_name, component=source_component)])
>              self.addSourceOverride(defaults[0])
>              if auto_approve:
>                  auto_approve = self.target_archive.canAdministerQueue(
> 
> === modified file 'lib/lp/soyuz/model/publishing.py'
> --- lib/lp/soyuz/model/publishing.py	2014-07-08 05:05:19 +0000
> +++ lib/lp/soyuz/model/publishing.py	2014-07-18 07:28:40 +0000
> @@ -1445,6 +1445,7 @@
>  
>      def copyBinaries(self, archive, distroseries, pocket, bpphs, policy=None):
>          """See `IPublishingSet`."""
> +        from lp.soyuz.adapters.overrides import BinaryOverride
>          if distroseries.distribution != archive.distribution:
>              raise AssertionError(
>                  "Series distribution %s doesn't match archive distribution %s."
> @@ -1477,13 +1478,12 @@
>                      bpph.distroarchseries.architecturetag)] = bpph
>              with_overrides = {}
>              overrides = policy.calculateBinaryOverrides(
> -                archive, distroseries, pocket, bpn_archtag.keys())
> +                archive, distroseries, pocket,
> +                [BinaryOverride(bpn, archtag)
> +                 for bpn, archtag in bpn_archtag.keys()])
>              for override in overrides:
> -                if override.distro_arch_series is None:
> -                    continue
>                  bpph = bpn_archtag[
> -                    (override.binary_package_name,
> -                     override.distro_arch_series.architecturetag)]
> +                    (override.binary_package_name, override.architecture_tag)]
>                  new_component = override.component or bpph.component
>                  new_section = override.section or bpph.section
>                  new_priority = override.priority or bpph.priority
> 
> === modified file 'lib/lp/soyuz/scripts/packagecopier.py'
> --- lib/lp/soyuz/scripts/packagecopier.py	2013-07-16 08:10:32 +0000
> +++ lib/lp/soyuz/scripts/packagecopier.py	2014-07-18 07:28:40 +0000
> @@ -23,6 +23,7 @@
>  
>  from lp.services.database.bulk import load_related
>  from lp.soyuz.adapters.notification import notify
> +from lp.soyuz.adapters.overrides import SourceOverride
>  from lp.soyuz.enums import (
>      BinaryPackageFileType,
>      SourcePackageFormat,
> @@ -38,6 +39,7 @@
>  from lp.soyuz.interfaces.queue import IPackageUploadCustom
>  from lp.soyuz.scripts.custom_uploads_copier import CustomUploadsCopier
>  
> +

I love the way this newline keeps appearing and disappearing based on which exact flavour of lint tool somebody has used most recently. :-)

>  # XXX cprov 2009-06-12: this function should be incorporated in
>  # IPublishing.
>  def update_files_privacy(pub_record):
> @@ -720,7 +722,8 @@
>              # Only one override can be returned so take the first
>              # element of the returned list.
>              overrides = policy.calculateSourceOverrides(
> -                archive, series, pocket, package_names)
> +                archive, series, pocket,
> +                [SourceOverride(spn) for spn in package_names])
>              # Only one override can be returned so take the first
>              # element of the returned list.
>              assert len(overrides) == 1, (
> 
> === modified file 'lib/lp/soyuz/scripts/tests/test_copypackage.py'
> --- lib/lp/soyuz/scripts/tests/test_copypackage.py	2014-07-09 06:34:14 +0000
> +++ lib/lp/soyuz/scripts/tests/test_copypackage.py	2014-07-18 07:28:40 +0000
> @@ -1591,12 +1591,23 @@
>  
>      def test_copying_unsupported_arch_with_override(self):
>          # When the copier is passed an unsupported arch with an override
> -        # on the destination series, no binary is copied.
> +        # on the destination series, no binary is copied. But an
> +        # architecture-independent binary is copied even if the target
> +        # has a totally disjoint set of archs.
>          archive = self.factory.makeArchive(
>              distribution=self.test_publisher.ubuntutest, virtualized=False)
> -        source = self.test_publisher.getPubSource(
> -            archive=archive, architecturehintlist='all')
> -        self.test_publisher.getPubBinaries(pub_source=source)
> +        spph = self.factory.makeSourcePackagePublishingHistory(
> +            archive=archive)
> +        das = self.factory.makeDistroArchSeries(spph.distroseries)
> +        spph.distroseries.nominatedarchindep = das
> +        self.factory.makeBinaryPackagePublishingHistory(
> +            archive=archive, distroarchseries=das,
> +            source_package_release=spph.sourcepackagerelease,
> +            architecturespecific=True)
> +        bpph_indep = self.factory.makeBinaryPackagePublishingHistory(
> +            archive=archive, distroarchseries=das,
> +            source_package_release=spph.sourcepackagerelease,
> +            architecturespecific=False)
>  
>          # Now make a new distroseries with only one architecture:
>          # 'hppa'.
> @@ -1606,11 +1617,16 @@
>          target_archive = self.factory.makeArchive(
>              purpose=ArchivePurpose.PRIMARY,
>              distribution=self.test_publisher.ubuntutest, virtualized=False)
> -        copies = _do_direct_copy(source, target_archive, nobby, source.pocket,
> +        copies = _do_direct_copy(spph, target_archive, nobby, spph.pocket,
>              include_binaries=True, close_bugs=False, create_dsd_job=False)
>  
> -        # Only the source package has been copied.
> -        self.assertEqual(1, len(copies))
> +        # Only the source package and the architecture-independent
> +        # binary have been copied.
> +        self.assertEqual(2, len(copies))
> +        self.assertEqual(
> +            spph.sourcepackagerelease, copies[0].sourcepackagerelease)
> +        self.assertEqual(
> +            bpph_indep.binarypackagerelease, copies[1].binarypackagerelease)
>  
>      def test_copy_sets_creator(self):
>          # The creator for the copied SPPH is the person passed
> 
> === modified file 'lib/lp/soyuz/tests/test_packagecopyjob.py'
> --- lib/lp/soyuz/tests/test_packagecopyjob.py	2014-07-09 02:42:47 +0000
> +++ lib/lp/soyuz/tests/test_packagecopyjob.py	2014-07-18 07:28:40 +0000
> @@ -832,7 +832,8 @@
>          package = source_package.sourcepackagerelease.sourcepackagename
>          restricted = getUtility(IComponentSet)['restricted']
>          editors = getUtility(ISectionSet)['editors']
> -        override = SourceOverride(package, restricted, editors)
> +        override = SourceOverride(
> +            package, component=restricted, section=editors)
>          job.addSourceOverride(override)
>  
>          # Accept the upload to release the job then run it.
> @@ -1525,12 +1526,10 @@
>          old_component = self.factory.makeComponent()
>          old_section = self.factory.makeSection()
>          pcj.addSourceOverride(SourceOverride(
> -            source_package_name=pcj.package_name,
> -            component=old_component, section=old_section))
> +            pcj.package_name, component=old_component, section=old_section))
>          new_section = self.factory.makeSection()
>          pcj.addSourceOverride(SourceOverride(
> -            source_package_name=pcj.package_name,
> -            component=None, section=new_section))
> +            pcj.package_name, section=new_section))
>          self.assertEqual(old_component.name, pcj.component_name)
>          self.assertEqual(new_section.name, pcj.section_name)
>  
> @@ -1542,12 +1541,10 @@
>          old_component = self.factory.makeComponent()
>          old_section = self.factory.makeSection()
>          pcj.addSourceOverride(SourceOverride(
> -            source_package_name=pcj.package_name,
> -            component=old_component, section=old_section))
> +            pcj.package_name, component=old_component, section=old_section))
>          new_component = self.factory.makeComponent()
>          pcj.addSourceOverride(SourceOverride(
> -            source_package_name=pcj.package_name,
> -            component=new_component, section=None))
> +            pcj.package_name, component=new_component))
>          self.assertEqual(new_component.name, pcj.component_name)
>          self.assertEqual(old_section.name, pcj.section_name)
>  
> @@ -1561,8 +1558,7 @@
>              package_name=name.name, package_version="1.0")
>          switch_dbuser('copy_packages')
>  
> -        override = SourceOverride(
> -            source_package_name=name, component=component, section=section)
> +        override = SourceOverride(name, component=component, section=section)
>          pcj.addSourceOverride(override)
>  
>          self.assertEqual(override, pcj.getSourceOverride())
> 


-- 
https://code.launchpad.net/~wgrant/launchpad/overrides-take-overrides/+merge/227191
Your team Launchpad code reviewers is subscribed to branch lp:launchpad.


References