Просмотр исходного кода

* 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 лет назад: 14
Родитель
Сommit
b855a40058

+ 14 - 2
cmdline/apt-mark.cc

@@ -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());
       }
    }

+ 5 - 0
debian/changelog

@@ -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
 

+ 5 - 0
test/integration/framework

@@ -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;"

+ 72 - 0
test/integration/test-bug-680041-apt-mark-holds-correctly

@@ -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