]> cygwin.com Git - cygwin-apps/setup.git/blame - libsolv.h
Add 'depends2:' as an alternative to 'depends':
[cygwin-apps/setup.git] / libsolv.h
CommitLineData
1c159e0a
JT
1/*
2 * Copyright (c) 2017 Jon Turney
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * A copy of the GNU General Public License can be found at
10 * http://www.gnu.org/
11 *
12 */
13
14#ifndef LIBSOLV_H
15#define LIBSOLV_H
16
17#include "solv/pool.h"
18#include "solv/repo.h"
1d553f34 19#include "solv/solver.h"
1c159e0a
JT
20#include "PackageSpecification.h"
21#include "PackageTrust.h"
22#include "package_source.h"
23#include "package_depends.h"
24#include <map>
25#include <vector>
26
27typedef trusts package_stability_t;
28
29typedef enum
30{
31 package_binary,
32 package_source
33}
34package_type_t;
35
36// ---------------------------------------------------------------------------
37// interface to class SolverVersion
38//
39// a wrapper around a libsolv Solvable
40// ---------------------------------------------------------------------------
41
42class SolverPool;
1d553f34 43class SolverSolution;
1c159e0a
JT
44
45class SolvableVersion
46{
47 public:
48 SolvableVersion() : id(0), pool(0) {};
49 SolvableVersion(Id _id, Pool *_pool) : id(_id), pool(_pool) {};
50
51 // converted to a bool, this is true if this isn't the result of the default
52 // constructor (an 'empty' version, in some sense)
53 explicit operator bool () const { return (id != 0); }
54
55 const std::string Name () const;
56 const std::string SDesc () const;
57 // In setup-speak, 'Canonical' version means 'e:v-r', the non-decomposed version
58 const std::string Canonical_version () const;
5ebe14e4 59 // Return the dependency list
1c159e0a 60 const PackageDepends depends() const;
5ebe14e4
KB
61 // Return the obsoletes list
62 const PackageDepends obsoletes() const;
1c159e0a
JT
63 bool accessible () const;
64 package_type_t Type () const;
65 package_stability_t Stability () const;
c59b92e8
JT
66 // the associated source package name, if this is a binary package
67 const std::string sourcePackageName () const;
1c159e0a
JT
68 // the associated source package, if this is a binary package
69 SolvableVersion sourcePackage () const;
70 // where this package archive can be obtained from
71 packagesource *source() const;
72
c59b92e8
JT
73 // fixup spkg_id
74 void fixup_spkg_id(SolvableVersion spkg_id) const;
75
1c159e0a
JT
76 // utility function to compare package versions
77 static int compareVersions(const SolvableVersion &a, const SolvableVersion &b);
78
79 // comparison operators
80
81 // these are somewhat necessary as otherwise we are compared as bool values
82 bool operator == (SolvableVersion const &) const;
83 bool operator != (SolvableVersion const &) const;
84
85 // these are only well defined for versions of the same package
86 bool operator < (SolvableVersion const &) const;
87 bool operator <= (SolvableVersion const &) const;
88 bool operator > (SolvableVersion const &) const;
89 bool operator >= (SolvableVersion const &) const;
90
91 private:
92 Id id;
93 Pool *pool;
94
95 friend SolverPool;
1d553f34 96 friend SolverSolution;
5ebe14e4
KB
97
98 const PackageDepends deplist(Id keyname) const;
bfe593cf 99 Id name_id () const;
1c159e0a
JT
100};
101
102// ---------------------------------------------------------------------------
103// Helper class SolvRepo
104//
105// ---------------------------------------------------------------------------
106
107class SolvRepo
108{
109public:
3c3d695d
KB
110 typedef enum
111 {
112 priorityLow = 0,
113 priorityNormal,
114 priorityHigh,
115 } priority_t;
1c159e0a
JT
116 Repo *repo;
117 Repodata *data;
118 bool test;
3c3d695d 119 void setPriority(priority_t p) { repo->priority = p; }
1c159e0a
JT
120};
121
122// ---------------------------------------------------------------------------
123// interface to class SolverPool
124//
125// a simplified wrapper for libsolv
126// ---------------------------------------------------------------------------
127
128class SolverPool
129{
130public:
131 SolverPool();
ab67dafa 132 void clear();
1c159e0a
JT
133 SolvRepo *getRepo(const std::string &name, bool test = false);
134
135 // Utility class for passing arguments to addPackage()
136 class addPackageData
137 {
138 public:
139 std::string reponame;
140 std::string version;
141 std::string vendor;
142 std::string sdesc;
143 std::string ldesc;
144 package_stability_t stability;
145 package_type_t type;
146 packagesource archive;
147 PackageSpecification spkg;
148 SolvableVersion spkg_id;
149 PackageDepends *requires;
20b98f20 150 PackageDepends *obsoletes;
1c159e0a
JT
151 };
152
153 SolvableVersion addPackage(const std::string& pkgname,
154 const addPackageData &pkgdata);
155
156 void internalize(void);
1d553f34
JT
157 void use_test_packages(bool use_test_packages);
158
1c159e0a
JT
159
160private:
ab67dafa 161 void init();
1c159e0a
JT
162 Id makedeps(Repo *repo, PackageDepends *requires);
163 Pool *pool;
164
165 typedef std::map<std::string, SolvRepo *> RepoList;
166 RepoList repos;
1d553f34
JT
167
168 friend SolverSolution;
1c159e0a
JT
169};
170
171
1d553f34
JT
172// ---------------------------------------------------------------------------
173// interface to class SolverTaskQueue
174//
175// This is used to contain a set of package install/uninstall tasks selected via
176// the UI to be passed to solver
177// ---------------------------------------------------------------------------
178
179class SolverTasks
180{
181 public:
182 enum task
183 {
184 taskInstall,
185 taskUninstall,
9deed604
KB
186 taskReinstall,
187 taskKeep,
bfe593cf 188 taskSkip,
1d553f34
JT
189 };
190 void add(const SolvableVersion &v, task t)
191 {
192 tasks.push_back(taskList::value_type(v, t));
193 };
16994679
KB
194 /* Create solver tasks corresponding to state of database */
195 void setTasks();
196
1d553f34 197 private:
389e4dff 198 typedef std::vector<std::pair<const SolvableVersion, task>> taskList;
1d553f34
JT
199 taskList tasks;
200
201 friend SolverSolution;
202};
203
204// ---------------------------------------------------------------------------
205// SolverTransactionList
206//
207// a list of transactions output by the solver
208// ---------------------------------------------------------------------------
209
210class SolverTransaction
211{
212 public:
213 typedef enum
214 {
215 transIgnore,
216 transInstall,
217 transErase,
218 } transType;
219
220 SolverTransaction(SolvableVersion version_, transType type_) :
221 version(version_), type(type_) {};
222
223 SolvableVersion version;
224 transType type;
225};
226
227typedef std::vector<SolverTransaction> SolverTransactionList;
228
229// ---------------------------------------------------------------------------
230// interface to class SolverSolution
231//
232// A wrapper around the libsolv solver
233// ---------------------------------------------------------------------------
234
235class SolverSolution
236{
237 public:
2506055b 238 SolverSolution(SolverPool &_pool);
1d553f34 239 ~SolverSolution();
ab67dafa 240 void clear();
1d553f34 241
7c94d449
KB
242 /* Reset package database to correspond to trans */
243 void trans2db() const;
244
9a7507eb
KB
245 /* Reset transaction list to correspond to package database */
246 void db2trans();
247
45f5ab69
JT
248 enum updateMode
249 {
250 keep, // don't update
251 updateBest, // update to best version
252 updateForce, // distupdate: downgrade if necessary to best version in repo
253 };
2506055b
JT
254 bool update(SolverTasks &tasks, updateMode update, bool use_test_packages);
255 void augmentTasks(SolverTasks &tasks);
256 void addSource(bool include_source);
257 void applyDefaultProblemSolutions();
1d553f34
JT
258 std::string report() const;
259
260 const SolverTransactionList &transactions() const;
2506055b 261 void dumpTransactionList() const;
1d553f34
JT
262
263 private:
264 static SolverTransaction::transType type(Transaction *trans, int pos);
2506055b
JT
265 bool solve();
266 void tasksToJobs(SolverTasks &tasks, updateMode update, Queue &job);
267 void solutionToTransactionList();
1d553f34
JT
268
269 SolverPool &pool;
270 Solver *solv;
2506055b 271 Queue job;
1d553f34
JT
272 SolverTransactionList trans;
273};
274
1c159e0a 275#endif // LIBSOLV_H
This page took 0.051924 seconds and 5 git commands to generate.