]>
git.saurik.com Git - apt.git/blob - apt-private/private-show.cc
2 #include <apt-pkg/error.h>
3 #include <apt-pkg/cachefile.h>
4 #include <apt-pkg/cachefilter.h>
5 #include <apt-pkg/cacheset.h>
6 #include <apt-pkg/init.h>
7 #include <apt-pkg/progress.h>
8 #include <apt-pkg/sourcelist.h>
9 #include <apt-pkg/cmndline.h>
10 #include <apt-pkg/strutl.h>
11 #include <apt-pkg/fileutl.h>
12 #include <apt-pkg/pkgrecords.h>
13 #include <apt-pkg/srcrecords.h>
14 #include <apt-pkg/version.h>
15 #include <apt-pkg/policy.h>
16 #include <apt-pkg/tagfile.h>
17 #include <apt-pkg/algorithms.h>
18 #include <apt-pkg/sptr.h>
19 #include <apt-pkg/pkgsystem.h>
20 #include <apt-pkg/indexfile.h>
21 #include <apt-pkg/metaindex.h>
25 #include "private-output.h"
26 #include "private-cacheset.h"
32 // DisplayRecord - Displays the complete record for the package /*{{{*/
33 // ---------------------------------------------------------------------
34 bool DisplayRecord ( pkgCacheFile
& CacheFile
, pkgCache :: VerIterator V
,
37 pkgCache
* Cache
= CacheFile
. GetPkgCache ();
38 if ( unlikely ( Cache
== NULL
))
40 pkgDepCache
* depCache
= CacheFile
. GetDepCache ();
41 if ( unlikely ( depCache
== NULL
))
44 // Find an appropriate file
45 pkgCache :: VerFileIterator Vf
= V
. FileList ();
46 for (; Vf
. end () == false ; ++ Vf
)
47 if (( Vf
. File ()-> Flags
& pkgCache :: Flag :: NotSource
) == 0 )
52 // Check and load the package list file
53 pkgCache :: PkgFileIterator I
= Vf
. File ();
54 if ( I
. IsOk () == false )
55 return _error
-> Error ( _ ( "Package file %s is out of sync." ), I
. FileName ());
57 // find matching sources.list metaindex
58 pkgSourceList
* SrcList
= CacheFile
. GetSourceList ();
60 if ( SrcList
-> FindIndex ( I
, Index
) == false &&
61 _system
-> FindIndex ( I
, Index
) == false )
62 return _error
-> Error ( "Can not find indexfile for Package %s ( %s )" ,
63 V
. ParentPkg (). Name (), V
. VerStr ());
64 std :: string source_index_file
= Index
-> Describe ( true );
68 if ( PkgF
. Open ( I
. FileName (), FileFd :: ReadOnly
, FileFd :: Extension
) == false )
71 pkgTagFile
TagF (& PkgF
);
73 if ( TagF
. Jump ( Tags
, V
. FileList ()-> Offset
) == false )
74 return _error
-> Error ( "Internal Error, Unable to parse a package record" );
77 std :: string installed_size
;
78 if ( Tags
. FindI ( "Installed-Size" ) > 0 )
79 strprintf ( installed_size
, " %s B" , SizeToStr ( Tags
. FindI ( "Installed-Size" )* 1024 ). c_str ());
81 installed_size
= _ ( "unknown" );
82 std :: string package_size
;
83 if ( Tags
. FindI ( "Size" ) > 0 )
84 strprintf ( package_size
, " %s B" , SizeToStr ( Tags
. FindI ( "Size" )). c_str ());
86 package_size
= _ ( "unknown" );
88 pkgDepCache :: StateCache
& state
= (* depCache
)[ V
. ParentPkg ()];
89 bool is_installed
= V
. ParentPkg (). CurrentVer () == V
;
90 const char * manual_installed
;
92 manual_installed
= !( state
. Flags
& pkgCache :: Flag :: Auto
) ? "yes" : "no" ;
96 // FIXME: add verbose that does not do the removal of the tags?
97 TFRewriteData RW
[] = {
98 // delete, apt-cache show has this info and most users do not care
99 { "MD5sum" , NULL
, NULL
},
100 { "SHA1" , NULL
, NULL
},
101 { "SHA256" , NULL
, NULL
},
102 { "Filename" , NULL
, NULL
},
103 { "Multi-Arch" , NULL
, NULL
},
104 { "Architecture" , NULL
, NULL
},
105 { "Conffiles" , NULL
, NULL
},
106 // we use the translated description
107 { "Description" , NULL
, NULL
},
108 { "Description-md5" , NULL
, NULL
},
110 { "Installed-Size" , installed_size
. c_str (), NULL
},
111 { "Size" , package_size
. c_str (), "Download-Size" },
113 { "APT-Manual-Installed" , manual_installed
, NULL
},
114 { "APT-Sources" , source_index_file
. c_str (), NULL
},
118 if ( TFRewrite ( stdout
, Tags
, NULL
, RW
) == false )
119 return _error
-> Error ( "Internal Error, Unable to parse a package record" );
121 // write the description
122 pkgRecords
Recs (* Cache
);
123 // FIXME: show (optionally) all available translations(?)
124 pkgCache :: DescIterator Desc
= V
. TranslatedDescription ();
125 if ( Desc
. end () == false )
127 pkgRecords :: Parser
& P
= Recs
. Lookup ( Desc
. FileList ());
128 out
<< "Description: " << P
. LongDesc ();
131 // write a final newline (after the description)
132 out
<< std :: endl
<< std :: endl
;
137 bool ShowPackage ( CommandLine
& CmdL
) /*{{{*/
139 pkgCacheFile CacheFile
;
140 CacheSetHelperVirtuals
helper ( true , GlobalError :: NOTICE
);
141 APT :: VersionList :: Version
const select
= _config
-> FindB ( "APT::Cache::AllVersions" , false ) ?
142 APT :: VersionList :: ALL
: APT :: VersionList :: CANDIDATE
;
143 APT :: VersionList
const verset
= APT :: VersionList :: FromCommandLine ( CacheFile
, CmdL
. FileList
+ 1 , select
, helper
);
144 for ( APT :: VersionList :: const_iterator Ver
= verset
. begin (); Ver
!= verset
. end (); ++ Ver
)
145 if ( DisplayRecord ( CacheFile
, Ver
, c1out
) == false )
148 if ( select
== APT :: VersionList :: CANDIDATE
)
150 APT :: VersionList
const verset_all
= APT :: VersionList :: FromCommandLine ( CacheFile
, CmdL
. FileList
+ 1 , APT :: VersionList :: ALL
, helper
);
151 if ( verset_all
. size () > verset
. size ())
152 _error
-> Notice ( ngettext ( "There is %l u additional record. Please use the '-a' switch to see it" , "There are %l u additional records. Please use the '-a' switch to see them." , verset_all
. size () - verset
. size ()), verset_all
. size () - verset
. size ());
155 for ( APT :: PackageSet :: const_iterator Pkg
= helper
. virtualPkgs
. begin ();
156 Pkg
!= helper
. virtualPkgs
. end (); ++ Pkg
)
158 c1out
<< "Package: " << Pkg
. FullName ( true ) << std :: endl
;
159 c1out
<< "State: " << _ ( "not a real package (virtual)" ) << std :: endl
;
160 // FIXME: show providers, see private-cacheset.h
161 // CacheSetHelperAPTGet::showVirtualPackageErrors()
164 if ( verset
. empty () == true )
166 if ( helper
. virtualPkgs
. empty () == true )
167 return _error
-> Error ( _ ( "No packages found" ));
169 _error
-> Notice ( _ ( "No packages found" ));