]> git.saurik.com Git - apt.git/blobdiff - apt-private/private-show.cc
more explicit MarkRequired algorithm code
[apt.git] / apt-private / private-show.cc
index 1bf7126843830789c0980c0d4b9c65da42cc7ee8..03229476ec9a352c68376bcb9371d8e56cbcc817 100644 (file)
@@ -17,6 +17,7 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/macros.h>
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/policy.h>
 
 #include <apt-private/private-cacheset.h>
 #include <apt-private/private-output.h>
@@ -218,6 +219,7 @@ static bool DisplayRecordV2(pkgCacheFile &CacheFile, pkgCache::VerIterator const
    RW.push_back(pkgTagSection::Tag::Remove("Description"));
    RW.push_back(pkgTagSection::Tag::Remove("Description-md5"));
    // improve
+   RW.push_back(pkgTagSection::Tag::Rewrite("Package", V.ParentPkg().FullName(true)));
    RW.push_back(pkgTagSection::Tag::Rewrite("Installed-Size", installed_size));
    RW.push_back(pkgTagSection::Tag::Remove("Size"));
    RW.push_back(pkgTagSection::Tag::Rewrite("Download-Size", package_size));
@@ -256,6 +258,8 @@ bool ShowPackage(CommandLine &CmdL)                                 /*{{{*/
    CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
    APT::CacheSetHelper::VerSelector const select = _config->FindB("APT::Cache::AllVersions", true) ?
                        APT::CacheSetHelper::ALL : APT::CacheSetHelper::CANDIDATE;
+   if (select == APT::CacheSetHelper::CANDIDATE && CacheFile.GetDepCache() == nullptr)
+      return false;
    APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper);
    int const ShowVersion = _config->FindI("APT::Cache::Show::Version", 1);
    for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
@@ -297,3 +301,169 @@ bool ShowPackage(CommandLine &CmdL)                                       /*{{{*/
    return true;
 }
                                                                        /*}}}*/
+static std::string Sha1FromString(std::string const &input)            /*{{{*/
+{
+   // XXX: move to hashes.h: HashString::FromString() ?
+   SHA1Summation sha1;
+   sha1.Add(input.c_str(), input.length());
+   return sha1.Result().Value();
+}
+                                                                       /*}}}*/
+bool ShowSrcPackage(CommandLine &CmdL)                                 /*{{{*/
+{
+   pkgCacheFile CacheFile;
+   pkgSourceList *List = CacheFile.GetSourceList();
+   if (unlikely(List == NULL))
+      return false;
+
+   // Create the text record parsers
+   pkgSrcRecords SrcRecs(*List);
+   if (_error->PendingError() == true)
+      return false;
+
+   bool found = false;
+   // avoid showing identical records
+   std::set<std::string> seen;
+   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   {
+      SrcRecs.Restart();
+
+      pkgSrcRecords::Parser *Parse;
+      bool found_this = false;
+      while ((Parse = SrcRecs.Find(*I,false)) != 0) {
+        // SrcRecs.Find() will find both binary and source names
+        if (_config->FindB("APT::Cache::Only-Source", false) == true)
+           if (Parse->Package() != *I)
+              continue;
+         std::string sha1str = Sha1FromString(Parse->AsStr());
+         if (std::find(seen.begin(), seen.end(), sha1str) == seen.end())
+         {
+            std::cout << Parse->AsStr() << std::endl;;
+            found = true;
+            found_this = true;
+            seen.insert(sha1str);
+         }
+      }
+      if (found_this == false) {
+        _error->Warning(_("Unable to locate package %s"),*I);
+        continue;
+      }
+   }
+   if (found == false)
+      _error->Notice(_("No packages found"));
+   return true;
+}
+                                                                       /*}}}*/
+// Policy - Show the results of the preferences file                   /*{{{*/
+bool Policy(CommandLine &CmdL)
+{
+   pkgCacheFile CacheFile;
+   pkgSourceList const * const SrcList = CacheFile.GetSourceList();
+   if (unlikely(SrcList == nullptr))
+      return false;
+   pkgCache * const Cache = CacheFile.GetPkgCache();
+   if (unlikely(Cache == nullptr))
+      return false;
+   pkgPolicy * const Plcy = CacheFile.GetPolicy();
+   if (unlikely(Plcy == nullptr))
+      return false;
+
+   // Print out all of the package files
+   if (CmdL.FileList[1] == 0)
+   {
+      std::cout << _("Package files:") << std::endl;
+      for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F.end() == false; ++F)
+      {
+        if (F.Flagged(pkgCache::Flag::NoPackages))
+           continue;
+        // Locate the associated index files so we can derive a description
+        pkgIndexFile *Indx;
+        if (SrcList->FindIndex(F,Indx) == false &&
+              _system->FindIndex(F,Indx) == false)
+           return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
+
+        printf("%4i %s\n",
+              Plcy->GetPriority(F),Indx->Describe(true).c_str());
+
+        // Print the reference information for the package
+        std::string Str = F.RelStr();
+        if (Str.empty() == false)
+           printf("     release %s\n",F.RelStr().c_str());
+        if (F.Site() != 0 && F.Site()[0] != 0)
+           printf("     origin %s\n",F.Site());
+      }
+
+      // Show any packages have explicit pins
+      std::cout << _("Pinned packages:") << std::endl;
+      pkgCache::PkgIterator I = Cache->PkgBegin();
+      for (;I.end() != true; ++I)
+      {
+        for (pkgCache::VerIterator V = I.VersionList(); !V.end(); ++V) {
+           auto Prio = Plcy->GetPriority(V, false);
+           if (Prio == 0)
+              continue;
+
+           std::cout << "     ";
+           // Print the package name and the version we are forcing to
+           ioprintf(std::cout, _("%s -> %s with priority %d\n"), I.FullName(true).c_str(), V.VerStr(), Prio);
+        }
+      }
+      return true;
+   }
+
+   char const * const msgInstalled = _("  Installed: ");
+   char const * const msgCandidate = _("  Candidate: ");
+   short const InstalledLessCandidate =
+      mbstowcs(NULL, msgInstalled, 0) - mbstowcs(NULL, msgCandidate, 0);
+   short const deepInstalled =
+      (InstalledLessCandidate < 0 ? (InstalledLessCandidate*-1) : 0) - 1;
+   short const deepCandidate =
+      (InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
+
+   // Print out detailed information for each package
+   APT::CacheSetHelper helper(true, GlobalError::NOTICE);
+   APT::PackageList pkgset = APT::PackageList::FromCommandLine(CacheFile, CmdL.FileList + 1, helper);
+   for (APT::PackageList::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+   {
+      std::cout << Pkg.FullName(true) << ":" << std::endl;
+
+      // Installed version
+      std::cout << msgInstalled << OutputInDepth(deepInstalled, " ");
+      if (Pkg->CurrentVer == 0)
+        std::cout << _("(none)") << std::endl;
+      else
+        std::cout << Pkg.CurrentVer().VerStr() << std::endl;
+
+      // Candidate Version 
+      std::cout << msgCandidate << OutputInDepth(deepCandidate, " ");
+      pkgCache::VerIterator V = Plcy->GetCandidateVer(Pkg);
+      if (V.end() == true)
+        std::cout << _("(none)") << std::endl;
+      else
+        std::cout << V.VerStr() << std::endl;
+
+      // Show the priority tables
+      std::cout << _("  Version table:") << std::endl;
+      for (V = Pkg.VersionList(); V.end() == false; ++V)
+      {
+        if (Pkg.CurrentVer() == V)
+           std::cout << " *** " << V.VerStr();
+        else
+           std::cout << "     " << V.VerStr();
+
+        std::cout << " " << Plcy->GetPriority(V) << std::endl;
+        for (pkgCache::VerFileIterator VF = V.FileList(); VF.end() == false; ++VF)
+        {
+           // Locate the associated index files so we can derive a description
+           pkgIndexFile *Indx;
+           if (SrcList->FindIndex(VF.File(),Indx) == false &&
+                 _system->FindIndex(VF.File(),Indx) == false)
+              return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
+           printf("       %4i %s\n",Plcy->GetPriority(VF.File()),
+                 Indx->Describe(true).c_str());
+        }
+      }
+   }
+   return true;
+}
+                                                                       /*}}}*/