libzypp  17.3.1
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 
24 #include "zypp/Repository.h"
25 #include "zypp/ResPool.h"
26 #include "zypp/Product.h"
27 #include "zypp/sat/Pool.h"
28 
29 using std::endl;
30 
32 namespace 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 
151  Date suggested = suggestedExpirationTimestamp();
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 ),
247  sat::detail::SolvableIterator(_repo->end),
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 
362  {
363  NO_REPOSITORY_THROW( Exception( "Can't add solvables to norepo.") );
364  return myPool()._addSolvables( _repo, count_r );
365  }
366 
367  /******************************************************************
368  **
369  ** FUNCTION NAME : operator<<
370  ** FUNCTION TYPE : std::ostream &
371  */
372  std::ostream & operator<<( std::ostream & str, const Repository & obj )
373  {
374  if ( ! obj )
375  return str << "noRepository";
376 
377  return str << "sat::repo(" << obj.alias() << ")"
378  << "{"
379  << "prio " << obj.get()->priority << '.' << obj.get()->subpriority
380  << ", size " << obj.solvablesSize()
381  << "}";
382  }
383 
384  std::ostream & dumpAsXmlOn( std::ostream & str, const Repository & obj )
385  {
386  return xmlout::node( str, "repository", {
387  { "name", obj.name() },
388  { "alias", obj.alias() }
389  } );
390  }
391 
393  namespace detail
394  {
395  void RepositoryIterator::increment()
396  {
397  if ( base() )
398  {
400  do {
401  ++base_reference();
402  } while ( base() < satpool->repos+satpool->nrepos && !*base() );
403  }
404  }
405  } // namespace detail
407 
409  //
410  // Repository::ProductInfoIterator
411  //
413 
415  { base_reference() = sat::LookupRepoAttr( attr_r, repo_r ).begin(); }
416 
418  { return base_reference().subFind( sat::SolvAttr::repositoryProductLabel ).asString(); }
419 
421  { return CpeId( base_reference().subFind( sat::SolvAttr::repositoryProductCpeid ).asString(), CpeId::noThrow ); }
422 
424 } // namespace zypp
#define NO_REPOSITORY_RETURN(VAL)
Definition: Repository.cc:45
int satInternalSubPriority() const
Definition: Repository.cc:79
std::ostream & node(std::ostream &out_r, const std::string &name_r, Node::Attr attr_r)
Definition: Xml.h:203
Interface to gettext.
ContentIdentifier contentIdentifier() const
Unique string identifying a repositories content.
Definition: Repository.cc:92
Product interface.
Definition: Product.h:32
#define MIL
Definition: Logger.h:64
Functor filtering Solvable by Repository.
Definition: Repository.h:476
bool isUpdateRepo() const
Hint whether the Repo may provide updates for a product.
Definition: Repository.cc:194
Date suggestedExpirationTimestamp() const
Suggested expiration timestamp.
Definition: Repository.cc:116
static const SolvAttr repositoryExpire
Definition: SolvAttr.h:165
static const SolvAttr repositoryProductLabel
Definition: SolvAttr.h:168
sat::ArrayAttr< std::string, std::string > Keywords
Definition: Repository.h:46
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Definition: Exception.h:392
bool isSystemRepo() const
Return whether this is the system repository.
Definition: Repository.cc:53
void addSolv(const Pathname &file_r)
Load Solvables from a solv-file.
Definition: Repository.cc:320
bool providesUpdatesFor(const CpeId &cpeid_r) const
Hint whether the Repo may provide updates for a product identified by it&#39;s CpeId. ...
Definition: Repository.cc:160
ProductInfoIterator compatibleWithProductBegin() const
Get an iterator to the beginning of the repository compatible distros.
Definition: Repository.cc:251
::_Repo CRepo
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:63
std::ostream & dumpAsXmlOn(std::ostream &str, const Repository &obj)
Definition: Repository.cc:384
void _deleteRepo(CRepo *repo_r)
Delete repo repo_r from pool.
Definition: PoolImpl.cc:306
sat::Solvable::IdType addSolvables(unsigned count_r)
Add count_r new empty Solvable to this Repository.
Definition: Repository.cc:361
std::string name() const
Label to display for this repo.
Definition: Repository.cc:67
static const RepoIdType noRepoId(0)
Id to denote Repo::noRepository.
::_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
Definition: PoolMember.h:61
byKind_iterator byKindBegin(const ResKind &kind_r) const
Definition: ResPool.h:261
void clearInfo()
Remove any RepoInfo set for this repository.
Definition: Repository.cc:291
const char * c_str() const
String representation.
Definition: Pathname.h:109
static const SolvAttr repositoryTimestamp
Definition: SolvAttr.h:164
ProductInfoIterator compatibleWithProductEnd() const
Get an iterator to the end of the repository compatible distros.
Definition: Repository.cc:257
String related utilities and Regular expression matching.
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
Definition: PoolMember.h:125
What is known about a repository.
Definition: RepoInfo.h:71
Common Platform Enumearation (2.3) See http://cpe.mitre.org/ for more information on the Common Platf...
Definition: CpeId.h:31
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
Definition: Easy.h:27
detail::SolvableIdType _addSolvables(CRepo *repo_r, unsigned count_r)
Adding Solvables to a repo.
Definition: PoolImpl.cc:384
LookupAttr::TransformIterator based container to retrieve list attributes.
Definition: LookupAttr.h:592
bool maybeOutdated() const
The suggested expiration date of this repository already passed.
Definition: Repository.cc:144
std::string label() const
Product label.
Definition: Repository.cc:417
TraitsType::constPtrType constPtr
Definition: Product.h:38
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:36
CRepo * getRepo(RepoIdType id_r) const
Definition: PoolImpl.h:168
std::string ContentRevision
Definition: Repository.h:48
filter_iterator< detail::ByRepository, sat::detail::SolvableIterator > SolvableIterator
Definition: Repository.h:42
sat::detail::size_type size_type
Definition: Repository.h:43
static const SolvAttr repositoryRevision
Definition: SolvAttr.h:172
bool isSystemRepo(CRepo *repo_r) const
Definition: PoolImpl.h:99
CpeId cpeId() const
The Common Platform Enumeration name for this product.
Definition: Repository.cc:420
iterator end() const
Iterator behind the end of query results.
Definition: LookupAttr.cc:239
Store and operate on date (time_t).
Definition: Date.h:32
SolvableIterator solvablesEnd() const
Iterator behind the last Solvable.
Definition: Repository.cc:241
static Pool instance()
Singleton ctor.
Definition: Pool.h:53
Solvable attribute keys.
Definition: SolvAttr.h:40
sat::detail::CRepo * get() const
Expert backdoor.
Definition: Repository.cc:42
void setRepoInfo(RepoIdType id_r, const RepoInfo &info_r)
Also adjust repo priority and subpriority accordingly.
Definition: PoolImpl.cc:390
Lightweight repository attribute value lookup.
Definition: LookupAttr.h:257
const std::string & asString() const
String representation.
Definition: Pathname.h:90
std::string alias() const
unique identifier for this source.
void setInfo(const RepoInfo &info_r)
Set RepoInfo for this repository.
Definition: Repository.cc:279
RepoInfo info() const
Return any associated RepoInfo.
Definition: Repository.cc:273
SolvableIterator solvablesBegin() const
Iterator to the first Solvable.
Definition: Repository.cc:231
Keywords keywords() const
repository keywords (tags)
Definition: Repository.cc:130
bool hasKeyword(const std::string &val_r) const
Whether val_r is present in keywords.
Definition: Repository.cc:136
detail::CPool * get() const
Expert backdoor.
Definition: Pool.cc:49
Query class for Repository related products.
Definition: Repository.h:363
Date generatedTimestamp() const
Timestamp when this repository was generated.
Definition: Repository.cc:109
int satInternalPriority() const
libsolv internal priorities.
Definition: Repository.cc:73
static PoolImpl & myPool()
Definition: PoolImpl.cc:172
ProductInfoIterator updatesProductBegin() const
Get an iterator to the beginning of distos the repository provides upadates for.
Definition: Repository.cc:262
#define NO_REPOSITORY_THROW(VAL)
Definition: Repository.cc:49
bool hasContentIdentifier(const ContentIdentifier &id_r) const
Whether id_r matches this repos content identifier.
Definition: Repository.cc:99
void resetDispose()
Set no dispose function.
Definition: AutoDispose.h:162
std::string ContentIdentifier
Definition: Repository.h:49
byKind_iterator byKindEnd(const ResKind &kind_r) const
Definition: ResPool.h:268
Repository nextInPool() const
Return next Repository in Pool (or noRepository).
Definition: Repository.cc:305
void addHelix(const Pathname &file_r)
Load Solvables from a helix-file.
Definition: Repository.cc:339
static constexpr NoThrowType noThrow
Indicator argument for non-trowing ctor.
Definition: CpeId.h:62
Global ResObject pool.
Definition: ResPool.h:60
std::string alias() const
Short unique string to identify a repo.
Definition: Repository.cc:59
ContentRevision contentRevision() const
Timestamp or arbitrary user supplied string.
Definition: Repository.cc:85
Base class for Exception.
Definition: Exception.h:145
static const Repository noRepository
Represents no Repository.
Definition: Repository.h:62
ProductInfoIterator updatesProductEnd() const
Get an iterator to the end of distos the repository provides upadates for.
Definition: Repository.cc:268
static Date now()
Return the current time.
Definition: Date.h:78
static const SolvAttr repositoryRepoid
Definition: SolvAttr.h:170
std::string name() const
Repository name.
static const std::string & systemRepoAlias()
Reserved system repository alias .
Definition: PoolImpl.cc:94
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Definition: AutoDispose.h:92
static const SolvAttr repositoryKeywords
Definition: SolvAttr.h:171
void eraseFromPool()
Remove this Repository from it&#39;s Pool.
Definition: Repository.cc:297
static const SolvAttr repositoryProductCpeid
Definition: SolvAttr.h:169
bool solvablesEmpty() const
Whether Repository contains solvables.
Definition: Repository.cc:219
static const std::string & systemRepoAlias()
Reserved system repository alias .
Definition: Repository.cc:37
bool hasUpdateContentIdentifier(const Repository::ContentIdentifier &cident_r) const
Whether cident_r is listed as required update repository.
Definition: Product.cc:243
static const SolvAttr repositoryDistros
array of repositoryProductLabel repositoryProductCpeid pairs
Definition: SolvAttr.h:167
static const SolvAttr repositoryUpdates
array of repositoryProductLabel repositoryProductCpeid pairs
Definition: SolvAttr.h:166
std::string asString() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition: LookupAttr.cc:613
const RepoInfo & repoInfo(RepoIdType id_r)
Definition: PoolImpl.h:205
size_type solvablesSize() const
Number of solvables in Repository.
Definition: Repository.cc:225
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:1
std::string label() const
Label for use in messages for the user interface.
bool empty() const
Whether the query is empty.
Definition: LookupAttr.cc:242
iterator begin() const
Iterator to the begin of query results.
Definition: LookupAttr.cc:236
std::string label() const
Alias or name, according to ZConfig::repoLabelIsAlias.
Definition: Repository.cc:70
std::ostream & operator<<(std::ostream &str, const Repository &obj)
Definition: Repository.cc:372
Search for repository attributes.
Definition: LookupAttr.h:118
static ResPool instance()
Singleton ctor.
Definition: ResPool.cc:33
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:134