]>
git.saurik.com Git - apt.git/blob - apt-private/private-show.cc
4 #include <apt-pkg/cachefile.h>
5 #include <apt-pkg/cacheset.h>
6 #include <apt-pkg/cmndline.h>
7 #include <apt-pkg/error.h>
8 #include <apt-pkg/fileutl.h>
9 #include <apt-pkg/indexfile.h>
10 #include <apt-pkg/pkgrecords.h>
11 #include <apt-pkg/pkgsystem.h>
12 #include <apt-pkg/sourcelist.h>
13 #include <apt-pkg/strutl.h>
14 #include <apt-pkg/tagfile.h>
15 #include <apt-pkg/cacheiterators.h>
16 #include <apt-pkg/configuration.h>
17 #include <apt-pkg/depcache.h>
18 #include <apt-pkg/macros.h>
19 #include <apt-pkg/pkgcache.h>
21 #include <apt-private/private-cacheset.h>
22 #include <apt-private/private-output.h>
23 #include <apt-private/private-show.h>
35 // DisplayRecord - Displays the complete record for the package /*{{{*/
36 // ---------------------------------------------------------------------
37 static bool DisplayRecord ( pkgCacheFile
& CacheFile
, pkgCache :: VerIterator V
,
40 pkgCache
* Cache
= CacheFile
. GetPkgCache ();
41 if ( unlikely ( Cache
== NULL
))
43 pkgDepCache
* depCache
= CacheFile
. GetDepCache ();
44 if ( unlikely ( depCache
== NULL
))
47 // Find an appropriate file
48 pkgCache :: VerFileIterator Vf
= V
. FileList ();
49 for (; Vf
. end () == false ; ++ Vf
)
50 if (( Vf
. File ()-> Flags
& pkgCache :: Flag :: NotSource
) == 0 )
55 // Check and load the package list file
56 pkgCache :: PkgFileIterator I
= Vf
. File ();
57 if ( I
. IsOk () == false )
58 return _error
-> Error ( _ ( "Package file %s is out of sync." ), I
. FileName ());
60 // find matching sources.list metaindex
61 pkgSourceList
* SrcList
= CacheFile
. GetSourceList ();
63 if ( SrcList
-> FindIndex ( I
, Index
) == false &&
64 _system
-> FindIndex ( I
, Index
) == false )
65 return _error
-> Error ( "Can not find indexfile for Package %s ( %s )" ,
66 V
. ParentPkg (). Name (), V
. VerStr ());
67 std :: string source_index_file
= Index
-> Describe ( true );
71 if ( PkgF
. Open ( I
. FileName (), FileFd :: ReadOnly
, FileFd :: Extension
) == false )
74 pkgTagFile
TagF (& PkgF
);
76 if ( TagF
. Jump ( Tags
, V
. FileList ()-> Offset
) == false )
77 return _error
-> Error ( "Internal Error, Unable to parse a package record" );
80 std :: string installed_size
;
81 if ( Tags
. FindI ( "Installed-Size" ) > 0 )
82 strprintf ( installed_size
, " %s B" , SizeToStr ( Tags
. FindI ( "Installed-Size" )* 1024 ). c_str ());
84 installed_size
= _ ( "unknown" );
85 std :: string package_size
;
86 if ( Tags
. FindI ( "Size" ) > 0 )
87 strprintf ( package_size
, " %s B" , SizeToStr ( Tags
. FindI ( "Size" )). c_str ());
89 package_size
= _ ( "unknown" );
91 pkgDepCache :: StateCache
& state
= (* depCache
)[ V
. ParentPkg ()];
92 bool is_installed
= V
. ParentPkg (). CurrentVer () == V
;
93 const char * manual_installed
;
95 manual_installed
= !( state
. Flags
& pkgCache :: Flag :: Auto
) ? "yes" : "no" ;
99 // FIXME: add verbose that does not do the removal of the tags?
100 TFRewriteData RW
[] = {
101 // delete, apt-cache show has this info and most users do not care
102 { "MD5sum" , NULL
, NULL
},
103 { "SHA1" , NULL
, NULL
},
104 { "SHA256" , NULL
, NULL
},
105 { "Filename" , NULL
, NULL
},
106 { "Multi-Arch" , NULL
, NULL
},
107 { "Architecture" , NULL
, NULL
},
108 { "Conffiles" , NULL
, NULL
},
109 // we use the translated description
110 { "Description" , NULL
, NULL
},
111 { "Description-md5" , NULL
, NULL
},
113 { "Installed-Size" , installed_size
. c_str (), NULL
},
114 { "Size" , package_size
. c_str (), "Download-Size" },
116 { "APT-Manual-Installed" , manual_installed
, NULL
},
117 { "APT-Sources" , source_index_file
. c_str (), NULL
},
121 if ( TFRewrite ( stdout
, Tags
, NULL
, RW
) == false )
122 return _error
-> Error ( "Internal Error, Unable to parse a package record" );
124 // write the description
125 pkgRecords
Recs (* Cache
);
126 // FIXME: show (optionally) all available translations(?)
127 pkgCache :: DescIterator Desc
= V
. TranslatedDescription ();
128 if ( Desc
. end () == false )
130 pkgRecords :: Parser
& P
= Recs
. Lookup ( Desc
. FileList ());
131 out
<< "Description: " << P
. LongDesc ();
134 // write a final newline (after the description)
135 out
<< std :: endl
<< std :: endl
;
140 bool ShowPackage ( CommandLine
& CmdL
) /*{{{*/
142 pkgCacheFile CacheFile
;
143 CacheSetHelperVirtuals
helper ( true , GlobalError :: NOTICE
);
144 APT :: VersionList :: Version
const select
= _config
-> FindB ( "APT::Cache::AllVersions" , false ) ?
145 APT :: VersionList :: ALL
: APT :: VersionList :: CANDIDATE
;
146 APT :: VersionList
const verset
= APT :: VersionList :: FromCommandLine ( CacheFile
, CmdL
. FileList
+ 1 , select
, helper
);
147 for ( APT :: VersionList :: const_iterator Ver
= verset
. begin (); Ver
!= verset
. end (); ++ Ver
)
148 if ( DisplayRecord ( CacheFile
, Ver
, c1out
) == false )
151 if ( select
== APT :: VersionList :: CANDIDATE
)
153 APT :: VersionList
const verset_all
= APT :: VersionList :: FromCommandLine ( CacheFile
, CmdL
. FileList
+ 1 , APT :: VersionList :: ALL
, helper
);
154 int const records
= verset_all
. size () - verset
. size ();
156 _error
-> Notice ( P_ ( "There is %i additional record. Please use the '-a' switch to see it" , "There are %i additional records. Please use the '-a' switch to see them." , records
), records
);
159 for ( APT :: PackageSet :: const_iterator Pkg
= helper
. virtualPkgs
. begin ();
160 Pkg
!= helper
. virtualPkgs
. end (); ++ Pkg
)
162 c1out
<< "Package: " << Pkg
. FullName ( true ) << std :: endl
;
163 c1out
<< "State: " << _ ( "not a real package (virtual)" ) << std :: endl
;
164 // FIXME: show providers, see private-cacheset.h
165 // CacheSetHelperAPTGet::showVirtualPackageErrors()
168 if ( verset
. empty () == true )
170 if ( helper
. virtualPkgs
. empty () == true )
171 return _error
-> Error ( _ ( "No packages found" ));
173 _error
-> Notice ( _ ( "No packages found" ));