* cmdline/apt-mark.cc:
authorDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 4 Jul 2012 21:54:48 +0000 (23:54 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Wed, 4 Jul 2012 21:54:48 +0000 (23:54 +0200)
  - arch:all packages are treated as arch:native packages, but dpkg
    expects pkg:all for selections, so use the arch of the installed
    version instead of the package structure if possible.
    Thanks to Stepan Golosunov for the report! (Closes: #680041)

cmdline/apt-mark.cc
debian/changelog
test/integration/framework
test/integration/test-bug-680041-apt-mark-holds-correctly [new file with mode: 0755]

index 2a093c5..c5b7ca4 100644 (file)
@@ -291,14 +291,26 @@ bool DoHold(CommandLine &CmdL)
    FILE* dpkg = fdopen(external[1], "w");
    for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
    {
+      if (dpkgMultiArch == false)
+        fprintf(dpkg, "%s", Pkg.FullName(true).c_str());
+      else
+      {
+        if (Pkg->CurrentVer != 0)
+           fprintf(dpkg, "%s:%s", Pkg.Name(), Pkg.CurrentVer().Arch());
+        else if (Pkg.VersionList().end() == false)
+           fprintf(dpkg, "%s:%s", Pkg.Name(), Pkg.VersionList().Arch());
+        else
+           fprintf(dpkg, "%s", Pkg.FullName(false).c_str());
+      }
+
       if (MarkHold == true)
       {
-        fprintf(dpkg, "%s hold\n", Pkg.FullName(!dpkgMultiArch).c_str());
+        fprintf(dpkg, " hold\n");
         ioprintf(c1out,_("%s set on hold.\n"), Pkg.FullName(true).c_str());
       }
       else
       {
-        fprintf(dpkg, "%s install\n", Pkg.FullName(!dpkgMultiArch).c_str());
+        fprintf(dpkg, " install\n");
         ioprintf(c1out,_("Canceled hold on %s.\n"), Pkg.FullName(true).c_str());
       }
    }
index 4fe8a80..9d3c2b2 100644 (file)
@@ -16,6 +16,11 @@ apt (0.9.7.2) UNRELEASED; urgency=low
   * ftparchive/writer.cc:
     - handle the APT::FTPArchive::Packages::SHA512 option correctly instead
       of overriding SHA256, thanks Christian Marillat! (Closes: #680252)
+  * cmdline/apt-mark.cc:
+    - arch:all packages are treated as arch:native packages, but dpkg
+      expects pkg:all for selections, so use the arch of the installed
+      version instead of the package structure if possible.
+      Thanks to Stepan Golosunov for the report! (Closes: #680041)
 
  -- David Kalnischkies <kalnischkies@gmail.com>  Sun, 01 Jul 2012 08:20:57 +0200
 
index 2d6ada1..da85d23 100644 (file)
@@ -736,6 +736,11 @@ testfileequal() {
        fi
 }
 
+testempty() {
+       msgtest "Test for no output of" "$*"
+       test -z "$($* 2>&1)" && msgpass || msgfail
+}
+
 testequal() {
        local COMPAREFILE=$(mktemp)
        addtrap "rm $COMPAREFILE;"
diff --git a/test/integration/test-bug-680041-apt-mark-holds-correctly b/test/integration/test-bug-680041-apt-mark-holds-correctly
new file mode 100755 (executable)
index 0000000..2e5e39c
--- /dev/null
@@ -0,0 +1,72 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+insertinstalledpackage 'pkgarch' 'amd64' '1'
+insertinstalledpackage 'pkgall' 'all' '1'
+
+insertpackage 'unstable' 'pkgarch' 'amd64' '2'
+insertpackage 'unstable' 'pkgall' 'all' '2'
+
+setupaptarchive
+
+runtests() {
+       testempty aptmark showhold
+
+       testequal 'Reading package lists...
+Building dependency tree...
+The following packages will be upgraded:
+  pkgall pkgarch
+2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+After this operation, 0 B of additional disk space will be used.
+E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only
+
+       testequal 'pkgarch set on hold.' aptmark hold pkgarch
+       testequal 'pkgarch' aptmark showhold
+
+       testequal 'Reading package lists...
+Building dependency tree...
+The following packages have been kept back:
+  pkgarch
+The following packages will be upgraded:
+  pkgall
+1 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
+After this operation, 0 B of additional disk space will be used.
+E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only
+
+       testequal 'Canceled hold on pkgarch.' aptmark unhold pkgarch
+       testempty aptmark showhold
+
+       testequal 'Reading package lists...
+Building dependency tree...
+The following packages will be upgraded:
+  pkgall pkgarch
+2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
+After this operation, 0 B of additional disk space will be used.
+E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only
+
+       testequal 'pkgall set on hold.' aptmark hold pkgall
+       testequal 'pkgall' aptmark showhold
+
+       testequal 'Reading package lists...
+Building dependency tree...
+The following packages have been kept back:
+  pkgall
+The following packages will be upgraded:
+  pkgarch
+1 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
+After this operation, 0 B of additional disk space will be used.
+E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgrade --trivial-only
+
+       testequal 'Canceled hold on pkgall.' aptmark unhold pkgall
+       testempty aptmark showhold
+}
+# single-arch
+runtests
+# multi-arch
+configarchitecture 'amd64' 'i386'
+runtests