libzypp 17.31.23
Repository.cc
Go to the documentation of this file.
1/*---------------------------------------------------------------------\
2| ____ _ __ __ ___ |
3| |__ / \ / / . \ . \ |
4| / / \ V /| _/ _/ |
5| / /__ | | | | | | |
6| /_____||_| |_| |_| |
7| |
8\---------------------------------------------------------------------*/
12#include <climits>
13#include <iostream>
14
15#include <zypp/base/Logger.h>
16#include <zypp/base/Gettext.h>
17#include <zypp/base/Exception.h>
18#include <zypp/base/Xml.h>
19
20#include <zypp/AutoDispose.h>
21#include <zypp/Pathname.h>
22
23#include <zypp/sat/detail/PoolImpl.h>
24#include <zypp/Repository.h>
25#include <zypp/ResPool.h>
26#include <zypp/Product.h>
27#include <zypp/sat/Pool.h>
28
29using std::endl;
30
32namespace zypp
33{
34
35 const Repository Repository::noRepository;
36
37 const std::string & Repository::systemRepoAlias()
39
41
43 { return myPool().getRepo( _id ); }
44
45#define NO_REPOSITORY_RETURN( VAL ) \
46 sat::detail::CRepo * _repo( get() ); \
47 if ( ! _repo ) return VAL
48
49#define NO_REPOSITORY_THROW( VAL ) \
50 sat::detail::CRepo * _repo( get() ); \
51 if ( ! _repo ) ZYPP_THROW( VAL )
52
54 {
55 NO_REPOSITORY_RETURN( false );
56 return myPool().isSystemRepo( _repo );
57 }
58
59 std::string Repository::alias() const
60 {
61 NO_REPOSITORY_RETURN( std::string() );
62 if ( ! _repo->name )
63 return std::string();
64 return _repo->name;
65 }
66
67 std::string Repository::name() const
68 { return info().name(); }
69
70 std::string Repository::label() const
71 { return info().label(); }
72
74 {
75 NO_REPOSITORY_RETURN( INT_MIN );
76 return _repo->priority;
77 }
78
80 {
81 NO_REPOSITORY_RETURN( INT_MIN );
82 return _repo->subpriority;
83 }
84
86 {
89 return q.empty() ? std::string() : q.begin().asString();
90 }
91
93 {
96 return q.empty() ? std::string() : q.begin().asString();
97 }
98
100 {
101 NO_REPOSITORY_RETURN( false );
103 for_( it, q.begin(), q.end() )
104 if ( it.asString() == id_r )
105 return true;
106 return false;
107 }
108
110 {
113 return( q.empty() ? 0 : q.begin().asUnsigned() );
114 }
115
117 {
119 Date generated = generatedTimestamp();
120 if ( ! generated )
121 return 0; // do not calculate over a missing generated timestamp
122
124 if ( q.empty() )
125 return 0;
126
127 return generated + Date(q.begin().asUnsigned());
128 }
129
131 {
134 }
135
136 bool Repository::hasKeyword( const std::string & val_r ) const
137 {
138 for ( const auto & val : keywords() )
139 if ( val == val_r )
140 return true;
141 return false;
142 }
143
145 {
146 NO_REPOSITORY_RETURN( false );
147 // system repo is not mirrored
148 if ( isSystemRepo() )
149 return false;
150
152
153 // if no data, don't suggest
154 if ( ! suggested )
155 return false;
156
158 }
159
160 bool Repository::providesUpdatesFor( const CpeId & cpeid_r ) const
161 {
162 NO_REPOSITORY_RETURN( false );
163 if ( ! cpeid_r )
164 return false; // filter queries/products without CpeId, as an empty CpeId matches ANYthing.
165
166 // check in repository metadata
168 {
169 if ( compare( cpeid_r, it.cpeId(), SetRelation::subset ) )
170 return true;
171 }
172
173 // check whether known products refer to this as update repo
174 sat::LookupRepoAttr myIds( sat::SolvAttr::repositoryRepoid, *this ); // usually just one, but...
175 if ( ! myIds.empty() )
176 {
177 const ResPool & pool( ResPool::instance() );
178 for_( it, pool.byKindBegin<Product>(), pool.byKindEnd<Product>() )
179 {
180 Product::constPtr prod( (*it)->asKind<Product>() );
181 if ( compare( cpeid_r, prod->cpeId(), SetRelation::superset ) )
182 {
183 for_( myId, myIds.begin(), myIds.end() )
184 {
185 if ( prod->hasUpdateContentIdentifier( myId.asString() ) )
186 return true;
187 }
188 }
189 }
190 }
191 return false;
192 }
193
195 {
196 NO_REPOSITORY_RETURN( false );
197
198 // check in repository metadata
200 return true;
201
202 // check whether known products refer to this as update repo
203 sat::LookupRepoAttr myIds( sat::SolvAttr::repositoryRepoid, *this ); // usually just one, but...
204 if ( ! myIds.empty() )
205 {
206 const ResPool & pool( ResPool::instance() );
207 for_( it, pool.byKindBegin<Product>(), pool.byKindEnd<Product>() )
208 {
209 for_( myId, myIds.begin(), myIds.end() )
210 {
211 if ( (*it)->asKind<Product>()->hasUpdateContentIdentifier( myId.asString() ) )
212 return true;
213 }
214 }
215 }
216 return false;
217 }
218
220 {
221 NO_REPOSITORY_RETURN( true );
222 return !_repo->nsolvables;
223 }
224
226 {
228 return _repo->nsolvables;
229 }
230
232 {
233 NO_REPOSITORY_RETURN( make_filter_iterator( detail::ByRepository( *this ),
236 return make_filter_iterator( detail::ByRepository( *this ),
237 sat::detail::SolvableIterator(_repo->start),
238 sat::detail::SolvableIterator(_repo->end) );
239 }
240
242 {
243 NO_REPOSITORY_RETURN( make_filter_iterator( detail::ByRepository( *this ),
246 return make_filter_iterator(detail::ByRepository( *this ),
248 sat::detail::SolvableIterator(_repo->end) );
249 }
250
252 {
255 }
256
258 {
259 return ProductInfoIterator();
260 }
261
263 {
266 }
267
269 {
270 return ProductInfoIterator();
271 }
272
274 {
276 return myPool().repoInfo( _repo );
277 }
278
279 void Repository::setInfo( const RepoInfo & info_r )
280 {
281 NO_REPOSITORY_THROW( Exception( "Can't set RepoInfo for norepo." ) );
282 if ( info_r.alias() != alias() )
283 {
284 ZYPP_THROW( Exception( str::form( "RepoInfo alias (%s) does not match repository alias (%s)",
285 info_r.alias().c_str(), alias().c_str() ) ) );
286 }
287 myPool().setRepoInfo( _repo, info_r );
288 MIL << *this << endl;
289 }
290
292 {
294 myPool().setRepoInfo( _repo, RepoInfo() );
295 }
296
298 {
300 MIL << *this << " removed from pool" << endl;
301 myPool()._deleteRepo( _repo );
303 }
304
306 {
308 for_( it, sat::Pool::instance().reposBegin(), sat::Pool::instance().reposEnd() )
309 {
310 if ( *it == *this )
311 {
312 if ( ++it != _for_end )
313 return *it;
314 break;
315 }
316 }
317 return noRepository;
318 }
319
320 void Repository::addSolv( const Pathname & file_r )
321 {
322 NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) );
323
324 AutoDispose<FILE*> file( ::fopen( file_r.c_str(), "re" ), ::fclose );
325 if ( file == NULL )
326 {
327 file.resetDispose();
328 ZYPP_THROW( Exception( "Can't open solv-file: "+file_r.asString() ) );
329 }
330
331 if ( myPool()._addSolv( _repo, file ) != 0 )
332 {
333 ZYPP_THROW( Exception( "Error reading solv-file: "+file_r.asString() ) );
334 }
335
336 MIL << *this << " after adding " << file_r << endl;
337 }
338
339 void Repository::addHelix( const Pathname & file_r )
340 {
341 NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) );
342
343 std::string command( file_r.extension() == ".gz" ? "zcat " : "cat " );
344 command += file_r.asString();
345
346 AutoDispose<FILE*> file( ::popen( command.c_str(), "re" ), ::pclose );
347 if ( file == NULL )
348 {
349 file.resetDispose();
350 ZYPP_THROW( Exception( "Can't open helix-file: "+file_r.asString() ) );
351 }
352
353 if ( myPool()._addHelix( _repo, file ) != 0 )
354 {
355 ZYPP_THROW( Exception( "Error reading helix-file: "+file_r.asString() ) );
356 }
357
358 MIL << *this << " after adding " << file_r << endl;
359 }
360
361 void Repository::addTesttags( const Pathname & file_r )
362 {
363 NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo." ) );
364
365 std::string command( file_r.extension() == ".gz" ? "zcat " : "cat " );
366 command += file_r.asString();
367
368 AutoDispose<FILE*> file( ::popen( command.c_str(), "re" ), ::pclose );
369 if ( file == NULL )
370 {
371 file.resetDispose();
372 ZYPP_THROW( Exception( "Can't open testtags-file: "+file_r.asString() ) );
373 }
374
375 if ( myPool()._addTesttags( _repo, file ) != 0 )
376 {
377 ZYPP_THROW( Exception( "Error reading testtags-file: "+file_r.asString() ) );
378 }
379
380 MIL << *this << " after adding " << file_r << endl;
381 }
382
384 {
385 NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo.") );
386 return myPool()._addSolvables( _repo, count_r );
387 }
388
389 /******************************************************************
390 **
391 ** FUNCTION NAME : operator<<
392 ** FUNCTION TYPE : std::ostream &
393 */
394 std::ostream & operator<<( std::ostream & str, const Repository & obj )
395 {
396 if ( ! obj )
397 return str << "noRepository";
398
399 return str << "sat::repo(" << obj.alias() << ")"
400 << "{"
401 << "prio " << obj.get()->priority << '.' << obj.get()->subpriority
402 << ", size " << obj.solvablesSize()
403 << "}";
404 }
405
406 std::ostream & dumpAsXmlOn( std::ostream & str, const Repository & obj )
407 {
408 return xmlout::node( str, "repository", {
409 { "name", obj.name() },
410 { "alias", obj.alias() }
411 } );
412 }
413
415 namespace detail
416 {
417 void RepositoryIterator::increment()
418 {
419 if ( base() )
420 {
422 do {
423 ++base_reference();
424 } while ( base() < satpool->repos+satpool->nrepos && !*base() );
425 }
426 }
427 } // namespace detail
429
431 //
432 // Repository::ProductInfoIterator
433 //
435
437 { base_reference() = sat::LookupRepoAttr( attr_r, repo_r ).begin(); }
438
440 { return base_reference().subFind( sat::SolvAttr::repositoryProductLabel ).asString(); }
441
443 { return CpeId( base_reference().subFind( sat::SolvAttr::repositoryProductCpeid ).asString(), CpeId::noThrow ); }
444
446} // namespace zypp
#define NO_REPOSITORY_THROW(VAL)
Definition: Repository.cc:49
#define NO_REPOSITORY_RETURN(VAL)
Definition: Repository.cc:45
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition: AutoDispose.h:94
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:180
Common Platform Enumearation (2.3) See http://cpe.mitre.org/ for more information on the Common Platf...
Definition: CpeId.h:32
static constexpr NoThrowType noThrow
Indicator argument for non-trowing ctor.
Definition: CpeId.h:62
Store and operate on date (time_t).
Definition: Date.h:33
static Date now()
Return the current time.
Definition: Date.h:78
Base class for Exception.
Definition: Exception.h:146
Product interface.
Definition: Product.h:33
TraitsType::constPtrType constPtr
Definition: Product.h:38
bool hasUpdateContentIdentifier(const Repository::ContentIdentifier &cident_r) const
Whether cident_r is listed as required update repository.
Definition: Product.cc:229
What is known about a repository.
Definition: RepoInfo.h:72
Query class for Repository related products.
Definition: Repository.h:378
std::string label() const
Product label.
Definition: Repository.cc:439
CpeId cpeId() const
The Common Platform Enumeration name for this product.
Definition: Repository.cc:442
Repository nextInPool() const
Return next Repository in Pool (or noRepository).
Definition: Repository.cc:305
int satInternalSubPriority() const
Definition: Repository.cc:79
static const Repository noRepository
Represents no Repository.
Definition: Repository.h:62
void addHelix(const Pathname &file_r)
Load Solvables from a helix-file.
Definition: Repository.cc:339
bool hasKeyword(const std::string &val_r) const
Whether val_r is present in keywords.
Definition: Repository.cc:136
std::string ContentIdentifier
Definition: Repository.h:49
bool isUpdateRepo() const
Hint whether the Repo may provide updates for a product.
Definition: Repository.cc:194
Keywords keywords() const
repository keywords (tags)
Definition: Repository.cc:130
sat::detail::CRepo * get() const
Expert backdoor.
Definition: Repository.cc:42
bool solvablesEmpty() const
Whether Repository contains solvables.
Definition: Repository.cc:219
std::string label() const
Alias or name, according to ZConfig::repoLabelIsAlias.
Definition: Repository.cc:70
Date suggestedExpirationTimestamp() const
Suggested expiration timestamp.
Definition: Repository.cc:116
SolvableIterator solvablesEnd() const
Iterator behind the last Solvable.
Definition: Repository.cc:241
ProductInfoIterator compatibleWithProductEnd() const
Get an iterator to the end of the repository compatible distros.
Definition: Repository.cc:257
int satInternalPriority() const
libsolv internal priorities.
Definition: Repository.cc:73
void clearInfo()
Remove any RepoInfo set for this repository.
Definition: Repository.cc:291
sat::Solvable::IdType addSolvables(unsigned count_r)
Add count_r new empty Solvable to this Repository.
Definition: Repository.cc:383
bool providesUpdatesFor(const CpeId &cpeid_r) const
Hint whether the Repo may provide updates for a product identified by its CpeId.
Definition: Repository.cc:160
SolvableIterator solvablesBegin() const
Iterator to the first Solvable.
Definition: Repository.cc:231
void addTesttags(const Pathname &file_r)
Load Solvables from a libsolv testtags-file.
Definition: Repository.cc:361
ProductInfoIterator updatesProductEnd() const
Get an iterator to the end of distos the repository provides upadates for.
Definition: Repository.cc:268
ContentIdentifier contentIdentifier() const
Unique string identifying a repositories content.
Definition: Repository.cc:92
bool maybeOutdated() const
The suggested expiration date of this repository already passed.
Definition: Repository.cc:144
ProductInfoIterator compatibleWithProductBegin() const
Get an iterator to the beginning of the repository compatible distros.
Definition: Repository.cc:251
std::string alias() const
Short unique string to identify a repo.
Definition: Repository.cc:59
bool hasContentIdentifier(const ContentIdentifier &id_r) const
Whether id_r matches this repos content identifier.
Definition: Repository.cc:99
size_type solvablesSize() const
Number of solvables in Repository.
Definition: Repository.cc:225
void setInfo(const RepoInfo &info_r)
Set RepoInfo for this repository.
Definition: Repository.cc:279
std::string name() const
Label to display for this repo.
Definition: Repository.cc:67
void addSolv(const Pathname &file_r)
Load Solvables from a solv-file.
Definition: Repository.cc:320
ContentRevision contentRevision() const
Timestamp or arbitrary user supplied string.
Definition: Repository.cc:85
sat::detail::size_type size_type
Definition: Repository.h:43
filter_iterator< detail::ByRepository, sat::detail::SolvableIterator > SolvableIterator
Definition: Repository.h:42
Date generatedTimestamp() const
Timestamp when this repository was generated.
Definition: Repository.cc:109
ProductInfoIterator updatesProductBegin() const
Get an iterator to the beginning of distos the repository provides upadates for.
Definition: Repository.cc:262
std::string ContentRevision
Definition: Repository.h:48
sat::ArrayAttr< std::string, std::string > Keywords
Definition: Repository.h:46
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
Definition: Repository.cc:37
RepoInfo info() const
Return any associated RepoInfo.
Definition: Repository.cc:273
void eraseFromPool()
Remove this Repository from its Pool.
Definition: Repository.cc:297
bool isSystemRepo() const
Return whether this is the system repository.
Definition: Repository.cc:53
Global ResObject pool.
Definition: ResPool.h:61
static ResPool instance()
Singleton ctor.
Definition: ResPool.cc:37
byKind_iterator byKindEnd(const ResKind &kind_r) const
Definition: ResPool.h:268
byKind_iterator byKindBegin(const ResKind &kind_r) const
Definition: ResPool.h:261
const char * c_str() const
String representation.
Definition: Pathname.h:110
const std::string & asString() const
String representation.
Definition: Pathname.h:91
std::string extension() const
Return all of the characters in name after and including the last dot in the last element of name.
Definition: Pathname.h:135
std::string label() const
Label for use in messages for the user interface.
std::string name() const
Repository name.
std::string alias() const
unique identifier for this source.
LookupAttr::TransformIterator based container to retrieve list attributes.
unsigned asUnsigned() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: LookupAttr.cc:558
std::string asString() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: LookupAttr.cc:610
iterator end() const
Iterator behind the end of query results.
Definition: LookupAttr.cc:239
bool empty() const
Whether the query is empty.
Definition: LookupAttr.cc:242
@ REPO_ATTR
Search for repository attributes.
Definition: LookupAttr.h:118
iterator begin() const
Iterator to the begin of query results.
Definition: LookupAttr.cc:236
Lightweight repository attribute value lookup.
Definition: LookupAttr.h:258
static Pool instance()
Singleton ctor.
Definition: Pool.h:55
detail::CPool * get() const
Expert backdoor.
Definition: Pool.cc:49
Solvable attribute keys.
Definition: SolvAttr.h:41
static const SolvAttr repositoryUpdates
array of repositoryProductLabel repositoryProductCpeid pairs
Definition: SolvAttr.h:174
static const SolvAttr repositoryRepoid
Definition: SolvAttr.h:178
static const SolvAttr repositoryRevision
Definition: SolvAttr.h:180
static const SolvAttr repositoryProductLabel
Definition: SolvAttr.h:176
static const SolvAttr repositoryTimestamp
Definition: SolvAttr.h:172
static const SolvAttr repositoryExpire
Definition: SolvAttr.h:173
static const SolvAttr repositoryProductCpeid
Definition: SolvAttr.h:177
static const SolvAttr repositoryDistros
array of repositoryProductLabel repositoryProductCpeid pairs
Definition: SolvAttr.h:175
static const SolvAttr repositoryKeywords
Definition: SolvAttr.h:179
bool isSystemRepo(CRepo *repo_r) const
Definition: PoolImpl.h:101
CRepo * getRepo(RepoIdType id_r) const
Definition: PoolImpl.h:176
const RepoInfo & repoInfo(RepoIdType id_r)
Definition: PoolImpl.h:218
void _deleteRepo(CRepo *repo_r)
Delete repo repo_r from pool.
Definition: PoolImpl.cc:337
detail::SolvableIdType _addSolvables(CRepo *repo_r, unsigned count_r)
Adding Solvables to a repo.
Definition: PoolImpl.cc:424
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
Definition: PoolImpl.cc:100
void setRepoInfo(RepoIdType id_r, const RepoInfo &info_r)
Also adjust repo priority and subpriority accordingly.
Definition: PoolImpl.cc:430
Iterate over valid Solvables in the pool.
Definition: Solvable.h:516
String related utilities and Regular expression matching.
static const RepoIdType noRepoId(0)
Id to denote Repo::noRepository.
::s_Repo CRepo
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:63
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:61
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
Definition: PoolMember.h:125
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:36
std::ostream & node(std::ostream &out_r, const std::string &name_r, Node::Attr attr_r)
Definition: Xml.h:203
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
Definition: SerialNumber.cc:52
std::ostream & dumpAsXmlOn(std::ostream &str, const Repository &obj)
Definition: Repository.cc:406
Functor filtering Solvable by Repository.
Definition: Repository.h:485
static PoolImpl & myPool()
Definition: PoolImpl.cc:184
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:28
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:428
#define MIL
Definition: Logger.h:96