libzypp 17.31.31
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
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
91
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
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
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
256
261
267
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.
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.
CpeId cpeId() const
The Common Platform Enumeration name for this product.
Repository nextInPool() const
Return next Repository in Pool (or noRepository).
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.
bool hasKeyword(const std::string &val_r) const
Whether val_r is present in keywords.
std::string ContentIdentifier
Definition Repository.h:49
bool isUpdateRepo() const
Hint whether the Repo may provide updates for a product.
Keywords keywords() const
repository keywords (tags)
sat::detail::CRepo * get() const
Expert backdoor.
Definition Repository.cc:42
bool solvablesEmpty() const
Whether Repository contains solvables.
std::string label() const
Alias or name, according to ZConfig::repoLabelIsAlias.
Definition Repository.cc:70
Date suggestedExpirationTimestamp() const
Suggested expiration timestamp.
SolvableIterator solvablesEnd() const
Iterator behind the last Solvable.
ProductInfoIterator compatibleWithProductEnd() const
Get an iterator to the end of the repository compatible distros.
int satInternalPriority() const
libsolv internal priorities.
Definition Repository.cc:73
void clearInfo()
Remove any RepoInfo set for this repository.
sat::Solvable::IdType addSolvables(unsigned count_r)
Add count_r new empty Solvable to this Repository.
bool providesUpdatesFor(const CpeId &cpeid_r) const
Hint whether the Repo may provide updates for a product identified by its CpeId.
SolvableIterator solvablesBegin() const
Iterator to the first Solvable.
void addTesttags(const Pathname &file_r)
Load Solvables from a libsolv testtags-file.
ProductInfoIterator updatesProductEnd() const
Get an iterator to the end of distos the repository provides upadates for.
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.
ProductInfoIterator compatibleWithProductBegin() const
Get an iterator to the beginning of the repository compatible distros.
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.
void setInfo(const RepoInfo &info_r)
Set RepoInfo for this repository.
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.
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.
ProductInfoIterator updatesProductBegin() const
Get an iterator to the beginning of distos the repository provides upadates for.
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.
void eraseFromPool()
Remove this Repository from its Pool.
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...
iterator subFind(SolvAttr attr_r) const
Iterator pointing to the first occurance of SolvAttr attr_r in sub-structure.
std::string asString() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
iterator end() const
Iterator behind the end of query results.
bool empty() const
Whether the query is empty.
@ REPO_ATTR
Search for repository attributes.
Definition LookupAttr.h:118
iterator begin() const
Iterator to the begin of query results.
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.
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
std::ostream & dumpAsXmlOn(std::ostream &str, const Repository &obj)
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