summaryrefslogtreecommitdiff
path: root/apt-private/private-cacheset.h
blob: e8dba5a7d503e4ce082d30d9779ca1816ef9e6ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#ifndef APT_PRIVATE_CACHESET_H
#define APT_PRIVATE_CACHESET_H

#include <apt-pkg/cacheset.h>
#include <apt-pkg/macros.h>

#include <apt-private/private-output.h>

#include <list>
#include <set>
#include <string>
#include <vector>

class OpProgress;

class VerIteratorWithCaching
{
   const pkgCache::VerIterator iter;
   const pkgCache::DescFile * descFile;
public:

   // cppcheck-suppress noExplicitConstructor
   VerIteratorWithCaching(const pkgCache::VerIterator& iter) :
      iter(iter),
      descFile(iter->DescriptionList != 0
	 ? (const pkgCache::DescFile *) iter.TranslatedDescription().FileList()
	 : nullptr)
   {}
   const pkgCache::DescFile * CachedDescFile() const { return descFile; }
   operator pkgCache::VerIterator() const { return iter; }
   map_id_t ID() const { return iter->ID; }
};

struct VersionSortDescriptionLocality					/*{{{*/
{
   bool operator () (const VerIteratorWithCaching &v_lhs,
	 const VerIteratorWithCaching &v_rhs) const
   {
      pkgCache::DescFile const *A = v_lhs.CachedDescFile();
      pkgCache::DescFile const *B = v_rhs.CachedDescFile();

      if (A == nullptr)
      {
	 if (B == nullptr)
	    return v_lhs.ID() < v_rhs.ID();
	 return true;
      }
      else if (B == nullptr)
	 return false;

      if (A->File == B->File)
      {
	 if (A->Offset == B->Offset)
	    return v_lhs.ID() < v_rhs.ID();
	 return A->Offset < B->Offset;
      }

      return A->File < B->File;
   }
};
									/*}}}*/
// sorted by locality which makes iterating much faster
typedef APT::VersionContainer<
   std::set<VerIteratorWithCaching,
            VersionSortDescriptionLocality> > LocalitySortedVersionSet;

class Matcher {
public:
    virtual bool operator () (const pkgCache::PkgIterator &/*P*/) {
        return true;}
};

// FIXME: add default argument for OpProgress (or overloaded function)
bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
                                    APT::VersionContainerInterface * const vci,
                                    Matcher &matcher,
                                    OpProgress * const progress);
bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
                                    APT::VersionContainerInterface * const vci,
                                    OpProgress * const progress);


// CacheSetHelper saving virtual packages				/*{{{*/
class CacheSetHelperVirtuals: public APT::CacheSetHelper {
public:
   APT::PackageSet virtualPkgs;

   virtual pkgCache::VerIterator canNotGetVersion(enum CacheSetHelper::VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
   virtual void canNotFindVersion(enum CacheSetHelper::VerSelector const select, APT::VersionContainerInterface * vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
   virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str) APT_OVERRIDE;

   CacheSetHelperVirtuals(bool const ShowErrors = true, GlobalError::MsgType const &ErrorType = GlobalError::NOTICE);
};
									/*}}}*/

// CacheSetHelperAPTGet - responsible for message telling from the CacheSets/*{{{*/
class CacheSetHelperAPTGet : public APT::CacheSetHelper {
	/** \brief stream message should be printed to */
	std::ostream &out;
	/** \brief were things like Task or RegEx used to select packages? */
	bool explicitlyNamed;

	APT::PackageSet virtualPkgs;
public:
	std::list<std::pair<pkgCache::VerIterator, std::string> > selectedByRelease;
	std::set<std::string> notFound;

	explicit CacheSetHelperAPTGet(std::ostream &out);

	virtual void showPackageSelection(pkgCache::PkgIterator const &Pkg, enum PkgSelector const select, std::string const &pattern) APT_OVERRIDE;
	void showTaskSelection(pkgCache::PkgIterator const &Pkg, std::string const &pattern);
	void showFnmatchSelection(pkgCache::PkgIterator const &Pkg, std::string const &pattern);
	void showRegExSelection(pkgCache::PkgIterator const &Pkg, std::string const &pattern);
	void showVersionSelection(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const &Ver, enum VerSelector const select, std::string const &pattern) APT_OVERRIDE;
	bool showVirtualPackageErrors(pkgCacheFile &Cache);

	pkgCache::VerIterator canNotGetVersion(enum VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
	void canNotFindVersion(enum VerSelector const select, APT::VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) APT_OVERRIDE;
	pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
	pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
	pkgCache::VerIterator canNotFindVersionNumber(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg, std::string const &verstr);
	pkgCache::VerIterator canNotFindVersionRelease(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg, std::string const &verstr);
	virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str) APT_OVERRIDE;

	APT::VersionSet tryVirtualPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg,
						CacheSetHelper::VerSelector const select);

	inline bool allPkgNamedExplicitly() const { return explicitlyNamed; }
};
									/*}}}*/

#endif