]> git.saurik.com Git - apt.git/commitdiff
apt-cache enhancments
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:52:54 +0000 (16:52 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:52:54 +0000 (16:52 +0000)
Author: jgg
Date: 1999-02-19 08:57:41 GMT
apt-cache enhancments

cmdline/apt-cache.cc
doc/apt-cache.8.yo

index f9ba327fa8f1661fc97437d75cc2f4c5a0aa2d49..8a3a636954b665ed801daf9e130b78982e145904 100644 (file)
@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description                                                         /*{{{*/
-// $Id: apt-cache.cc,v 1.27 1999/02/19 07:56:07 jgg Exp $
+// $Id: apt-cache.cc,v 1.28 1999/02/19 08:57:41 jgg Exp $
 /* ######################################################################
    
    apt-cache - Manages the cache files
@@ -447,6 +447,44 @@ bool DoAdd(CommandLine &CmdL)
    GCache = &Gen.GetCache();
    Stats(CmdL);
    
+   return true;
+}
+                                                                       /*}}}*/
+// DisplayRecord - Displays the complete record for the package                /*{{{*/
+// ---------------------------------------------------------------------
+/* This displays the package record from the proper package index file. 
+   It is not used by DumpAvail for performance reasons. */
+bool DisplayRecord(pkgCache::VerIterator V)
+{
+   // Find an appropriate file
+   pkgCache::VerFileIterator Vf = V.FileList();
+   for (; Vf.end() == false; Vf++)
+      if ((Vf.File()->Flags & pkgCache::Flag::NotSource) == 0)
+        break;
+   if (Vf.end() == true)
+      Vf = V.FileList();
+      
+   // Check and load the package list file
+   pkgCache::PkgFileIterator I = Vf.File();
+   if (I.IsOk() == false)
+      return _error->Error("Package file %s is out of sync.",I.FileName());
+   
+   FileFd PkgF(I.FileName(),FileFd::ReadOnly);
+   if (_error->PendingError() == true)
+      return false;
+   
+   // Read the record and then write it out again.
+   unsigned char *Buffer = new unsigned char[GCache->HeaderP->MaxVerFileSize];
+   if (PkgF.Seek(V.FileList()->Offset) == false ||
+       PkgF.Read(Buffer,V.FileList()->Size) == false ||
+       write(STDOUT_FILENO,Buffer,V.FileList()->Size) != V.FileList()->Size)
+   {
+      delete [] Buffer;
+      return false;
+   }
+   
+   delete [] Buffer;
+
    return true;
 }
                                                                        /*}}}*/
@@ -456,6 +494,8 @@ bool DoAdd(CommandLine &CmdL)
 bool Search(CommandLine &CmdL)
 {
    pkgCache &Cache = *GCache;
+   bool ShowFull = _config->FindB("APT::Cache::ShowFull",false);
+   bool NamesOnly = _config->FindB("APT::Cache::NamesOnly",false);
    
    // Make sure there is at least one argument
    if (CmdL.FileSize() != 2)
@@ -476,16 +516,21 @@ bool Search(CommandLine &CmdL)
    pkgCache::PkgIterator I = Cache.PkgBegin();
    for (;I.end() != true; I++)
    {
-      if (regexec(&Pattern,I.Name(),0,0,0) == 0)
+      // We search against the install version as that makes the most sense..
+      pkgCache::VerIterator V = GetCandidateVer(I);
+      if (V.end() == true)
+        continue;
+
+      pkgRecords::Parser &P = Recs.Lookup(V.FileList());
+      
+      if (regexec(&Pattern,I.Name(),0,0,0) == 0 ||
+         (NamesOnly == false && 
+          regexec(&Pattern,P.LongDesc().c_str(),0,0,0) == 0))
       {
-        cout << I.Name();
-        if (I->VersionList != 0)
-        {
-           pkgRecords::Parser &P = Recs.Lookup(I.VersionList().FileList());
-           cout << " - " << P.ShortDesc() << endl;
-        }
-        else 
-           cout << " [virtual package]" << endl;
+        if (ShowFull == true)
+           DisplayRecord(V);
+        else
+           cout << I.Name() << " - " << P.ShortDesc() << endl;
       }      
    }
    
@@ -493,6 +538,31 @@ bool Search(CommandLine &CmdL)
    return true;
 }
                                                                        /*}}}*/
+// ShowPackage - Dump the package record to the screen                 /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool ShowPackage(CommandLine &CmdL)
+{   
+   pkgCache &Cache = *GCache;
+   for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+   {
+      pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+      if (Pkg.end() == true)
+      {
+        _error->Warning("Unable to locate package %s",*I);
+        continue;
+      }
+      
+      // Find the proper version to use. We should probably use the DepCache.
+      pkgCache::VerIterator V = GetCandidateVer(Pkg);
+      if (V.end() == true || V.FileList().end() == true)
+        continue;
+      if (DisplayRecord(V) == false)
+        return false;
+   }
+   return true;
+}
+                                                                       /*}}}*/
 // GenCaches - Call the main cache generator                           /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -533,6 +603,7 @@ bool ShowHelp(CommandLine &Cmd)
    cout << "   unmet - Show unmet dependencies" << endl;
    cout << "   check - Check the cache a bit" << endl;
    cout << "   search - Search the package list for a regex pattern" << endl;
+   cout << "   show - Show a readable record for the package" << endl;
    cout << endl;
    cout << "Options:" << endl;
    cout << "  -h   This help text." << endl;
@@ -565,6 +636,8 @@ int main(int argc,const char *argv[])
       {'s',"src-cache","Dir::Cache::srcpkgcache",CommandLine::HasArg},
       {'q',"quiet","quiet",CommandLine::IntLevel},
       {'i',"important","APT::Cache::Important",0},
+      {'f',"full","APT::Cache::ShowFull",0},
+      {0,"names-only","APT::Cache::NamesOnly",0},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}};
@@ -579,6 +652,7 @@ int main(int argc,const char *argv[])
                                     {"unmet",&UnMet},
                                     {"check",&Check},
                                     {"search",&Search},
+                                    {"show",&ShowPackage},
                                     {0,0}};
 
    CacheInitialize();
index 1a6c5e3b423b73834a2abc784bdcca046dc5382a..1dc4633257cf13a30be6e048180d5e79179ac5ae 100644 (file)
@@ -20,6 +20,8 @@ itemize(
   it() dumpavail
   it() unmet
   it() check
+  it() search
+  it() show
 )
 
 Unless the -h, or --help option is given one of the above commands
@@ -135,6 +137,18 @@ dit(bf(check))
 bf(check) is a random function for testing certain aspects of the cache.
 Do not use it.
 
+dit(bf(show))
+bf(show) performs the same function as dpkg --print-avail, it displays
+the package records for the named packages.
+
+dit(bf(search))
+bf(search) performs a full text search on all available package files for
+the pattern given. It searchs the package names and the descriptions for
+an occurance of the string and prints out the package name and the short
+description. If --full is given then output identical to bf(show) is produced
+for each matched package and if --names-only is given then the long
+description is not searched, only the package name is.
+
 enddit()
 
 manpageoptions()
@@ -173,6 +187,13 @@ Print only important deps; for use with unmet causes only em(Depends) and
 em(Pre-Depends) relations to be printed.
 See bf(APT::Cache::Important).
 
+dit(bf(-f --full))
+Print full package records when searching. See bf(APT::Cache::ShowFull).
+
+dit(bf(--names-only))
+Only search on the package names, not the long description. See
+bf(APT::Cache::Names-Only).
+
 dit(bf(-c, --config-file))
 Configuration File; Specify a configuration file to use. bf(apt-get) will
 read the default configuration file and then this configuration file. See