]> git.saurik.com Git - apt.git/blobdiff - cmdline/apt-mark.cc
* apt-pkg/depcache.cc:
[apt.git] / cmdline / apt-mark.cc
index b067413e3d4d6f5a60221b9ee3bb5a9fee299c66..c5b7ca4962f87dfed3a18699d3f2eebfac248433 100644 (file)
@@ -220,7 +220,7 @@ bool DoHold(CommandLine &CmdL)
 
    bool const MarkHold = strcasecmp(CmdL.FileList[0],"hold") == 0;
 
-   for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+   for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end();)
    {
       if ((Pkg->SelectedState == pkgCache::State::Hold) == MarkHold)
       {
@@ -228,9 +228,10 @@ bool DoHold(CommandLine &CmdL)
            ioprintf(c1out,_("%s was already set on hold.\n"), Pkg.FullName(true).c_str());
         else
            ioprintf(c1out,_("%s was already not hold.\n"), Pkg.FullName(true).c_str());
-        pkgset.erase(Pkg);
-        continue;
+        Pkg = pkgset.erase(Pkg, true);
       }
+      else
+        ++Pkg;
    }
 
    bool dpkgMultiArch = false;
@@ -279,8 +280,8 @@ bool DoHold(CommandLine &CmdL)
       if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0)
         _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --set-selections", chrootDir.c_str());
       int const nullfd = open("/dev/null", O_RDONLY);
-      dup2(nullfd, STDIN_FILENO);
-      dup2(external[0], STDOUT_FILENO);
+      dup2(external[0], STDIN_FILENO);
+      dup2(nullfd, STDOUT_FILENO);
       dup2(nullfd, STDERR_FILENO);
       execvp(Args[0], (char**) &Args[0]);
       _error->WarningE("dpkgGo", "Can't detect if dpkg supports multi-arch!");
@@ -290,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());
       }
    }
@@ -359,14 +372,14 @@ bool ShowHold(CommandLine &CmdL)
 /* */
 bool ShowHelp(CommandLine &CmdL)
 {
-   ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,VERSION,
+   ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
            COMMON_ARCH,__DATE__,__TIME__);
 
    cout <<
     _("Usage: apt-mark [options] {auto|manual} pkg1 [pkg2 ...]\n"
       "\n"
       "apt-mark is a simple command line interface for marking packages\n"
-      "as manual or automatical installed. It can also list marks.\n"
+      "as manually or automatically installed. It can also list marks.\n"
       "\n"
       "Commands:\n"
       "   auto - Mark the given packages as automatically installed\n"