]> git.saurik.com Git - apt.git/commitdiff
prefer native arch over higher priority for providers
authorColin Watson <cjwatson@ubuntu.com>
Thu, 1 Aug 2013 11:19:43 +0000 (13:19 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 1 Aug 2013 11:37:52 +0000 (13:37 +0200)
The rational from the buglog:
> The problem here is that the Priority field in one of the Packages files
> is incorrect due to a mishap with reprepro configuration, […] the
> amd64 version is Priority: standard but the arm64 version is Priority:
> optional (and has a stray "optional: interpreters" field).
> […]
> However, Priority is a rather weak property of a package because it's
> typically applied via overrides, and it's easy for maintainers of
> third-party repositories to misconfigure them so that overrides aren't
> applied correctly.  It shouldn't be ranked ahead of choosing packages
> from the native architecture.  In this case, I have no user-mode
> emulation for arm64 set up, so choosing m4:arm64 simply won't work.

This effectly makes the priority the least interesting data point in
chosing a provider, which is in line with the other checks we have
already order above priority in the past and also has a certain appeal by
the soft irony it provides.

Closes: #718482
apt-pkg/depcache.cc
test/integration/test-prefer-native-architecture-over-higher-priority [new file with mode: 0755]

index 2c6eb43bf872859cac2fc1bcc78685985b482a50..978a893f7b856537dda8557ec30c93b9b963da9c 100644 (file)
@@ -1007,9 +1007,6 @@ struct CompareProviders {
         else if ((B->Flags & pkgCache::Flag::Important) == pkgCache::Flag::Important)
            return true;
       }
-      // higher priority seems like a good idea
-      if (AV->Priority != BV->Priority)
-        return AV->Priority > BV->Priority;
       // prefer native architecture
       if (strcmp(A.Arch(), B.Arch()) != 0)
       {
@@ -1024,6 +1021,9 @@ struct CompareProviders {
            else if (*a == B.Arch())
               return true;
       }
+      // higher priority seems like a good idea
+      if (AV->Priority != BV->Priority)
+        return AV->Priority > BV->Priority;
       // unable to decide…
       return A->ID < B->ID;
    }
diff --git a/test/integration/test-prefer-native-architecture-over-higher-priority b/test/integration/test-prefer-native-architecture-over-higher-priority
new file mode 100755 (executable)
index 0000000..2e56963
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64' 'arm64'
+
+insertpackage 'unstable' 'm4' 'amd64' '1' 'Multi-Arch: foreign' 'optional'
+insertpackage 'unstable' 'm4' 'arm64' '1' 'Multi-Arch: foreign' 'standard'
+insertpackage 'unstable' 'autoconf' 'all' '1' 'Depends: m4'
+
+setupaptarchive
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following extra packages will be installed:
+  m4
+The following NEW packages will be installed:
+  autoconf m4
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst m4 (1 unstable [amd64])
+Inst autoconf (1 unstable [all])
+Conf m4 (1 unstable [amd64])
+Conf autoconf (1 unstable [all])' aptget install autoconf -s