21 #include <solv/solvversion.h>
59 using namespace zypp::repo;
61 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
73 const char * env = getenv(
"ZYPP_PLUGIN_APPDATA_FORCE_COLLECT");
103 class UrlCredentialExtractor
106 UrlCredentialExtractor( Pathname & root_r )
110 ~UrlCredentialExtractor()
114 bool collect(
const Url & url_r )
116 bool ret = url_r.hasCredentialsInAuthority();
120 _cmPtr->addUserCred( url_r );
125 template<
class TContainer>
126 bool collect(
const TContainer & urls_r )
127 {
bool ret =
false;
for (
const Url &
url : urls_r ) {
if ( collect(
url ) && !ret ) ret =
true; }
return ret; }
130 bool extract( Url & url_r )
132 bool ret = collect( url_r );
134 url_r.setPassword( std::string() );
138 template<
class TContainer>
139 bool extract( TContainer & urls_r )
140 {
bool ret =
false;
for ( Url &
url : urls_r ) {
if ( extract(
url ) && !ret ) ret =
true; }
return ret; }
144 scoped_ptr<media::CredentialManager>
_cmPtr;
159 MediaMounter(
const Url & url_r )
161 media::MediaManager mediamanager;
162 _mid = mediamanager.open( url_r );
163 mediamanager.attach(
_mid );
169 media::MediaManager mediamanager;
170 mediamanager.release(
_mid );
171 mediamanager.close(
_mid );
178 Pathname getPathName(
const Pathname & path_r = Pathname() )
const
180 media::MediaManager mediamanager;
181 return mediamanager.localPath(
_mid, path_r );
190 template <
class Iterator>
191 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
193 for_( it, begin_r, end_r )
194 if ( it->alias() == alias_r )
199 template <
class Container>
200 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
201 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
204 template <
class Iterator>
205 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
207 for_( it, begin_r, end_r )
208 if ( it->alias() == alias_r )
213 template <class Container>
214 inline typename Container::iterator findAlias( const std::
string & alias_r, Container & cont_r )
215 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
217 template <
class Container>
218 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
219 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
223 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
225 std::string filename( alias_r );
229 filename = Pathname(filename).extend(
"."+stem_r).asString();
230 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
254 RepoCollector(
const std::string & targetDistro_)
258 bool collect(
const RepoInfo &repo )
262 && !repo.targetDistribution().empty()
266 <<
"Skipping repository meant for '" << repo.targetDistribution()
267 <<
"' distribution (current distro is '"
273 repos.push_back(repo);
287 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
289 MIL <<
"repo file: " << file << endl;
290 RepoCollector collector;
291 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
292 return std::move(collector.repos);
305 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
307 MIL <<
"directory " << dir << endl;
308 std::list<RepoInfo>
repos;
309 bool nonroot( geteuid() != 0 );
310 if ( nonroot && ! PathInfo(dir).userMayRX() )
312 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
316 std::list<Pathname> entries;
323 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
324 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
328 if ( nonroot && ! PathInfo(*it).userMayR() )
330 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
334 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
335 repos.insert( repos.end(), tmp.begin(), tmp.end() );
345 inline void assert_alias(
const RepoInfo & info )
347 if ( info.alias().empty() )
351 if ( info.alias()[0] ==
'.')
353 info,
_(
"Repository alias cannot start with dot.")));
356 inline void assert_alias(
const ServiceInfo & info )
358 if ( info.alias().empty() )
362 if ( info.alias()[0] ==
'.')
364 info,
_(
"Service alias cannot start with dot.")));
369 inline void assert_urls(
const RepoInfo & info )
371 if ( info.baseUrlsEmpty() )
375 inline void assert_url(
const ServiceInfo & info )
377 if ( ! info.url().isValid() )
387 inline bool isTmpRepo(
const RepoInfo & info_r )
388 {
return( info_r.filepath().empty() && info_r.usesAutoMethadataPaths() ); }
396 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
399 return isTmpRepo( info ) ? info.metadataPath() : opt.repoRawCachePath / info.escaped_alias();
410 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
411 {
return rawcache_path_for_repoinfo( opt, info ) / info.path(); }
416 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
419 return isTmpRepo( info ) ? info.packagesPath() : opt.repoPackagesCachePath / info.escaped_alias();
425 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
428 return isTmpRepo( info ) ? info.metadataPath().dirname() /
"%SLV%" : opt.repoSolvCachePath / info.escaped_alias();
434 class ServiceCollector
437 typedef std::set<ServiceInfo> ServiceSet;
439 ServiceCollector( ServiceSet & services_r )
443 bool operator()(
const ServiceInfo & service_r )
const
467 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
469 return repositories_in_file(local);
480 repoCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoCachePath() );
481 repoRawCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoMetadataPath() );
482 repoSolvCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoSolvfilesPath() );
483 repoPackagesCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoPackagesPath() );
484 knownReposPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownReposPath() );
485 knownServicesPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownServicesPath() );
486 pluginsPath = Pathname::assertprefix( root_r,
ZConfig::instance().pluginsPath() );
508 #define OUTS(X) str << " " #X "\t" << obj.X << endl
509 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
510 OUTS( repoRawCachePath );
511 OUTS( repoSolvCachePath );
512 OUTS( repoPackagesCachePath );
513 OUTS( knownReposPath );
514 OUTS( knownServicesPath );
532 init_knownServices();
533 init_knownRepositories();
540 && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
543 std::list<Pathname> entries;
545 if ( ! entries.empty() )
548 cmd.push_back(
"<" );
549 cmd.push_back(
">" );
550 cmd.push_back(
"PROGRAM" );
551 for (
const auto & rinfo :
repos() )
553 if ( ! rinfo.enabled() )
555 cmd.push_back(
"-R" );
556 cmd.push_back( rinfo.alias() );
557 cmd.push_back(
"-t" );
558 cmd.push_back( rinfo.type().asString() );
559 cmd.push_back(
"-p" );
560 cmd.push_back( rinfo.metadataPath().asString() );
563 for_( it, entries.begin(), entries.end() )
567 if ( pi.isFile() && pi.userMayRX() )
570 cmd[2] = pi.asString();
586 bool hasRepo(
const std::string & alias )
const
587 {
return foundAliasIn( alias,
repos() ); }
597 {
return rawcache_path_for_repoinfo( _options, info ); }
600 {
return packagescache_path_for_repoinfo( _options, info ); }
622 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").isExist(); }
647 {
return foundAliasIn( alias,
_services ); }
660 void removeService(
const std::string & alias );
662 { removeService( service.
alias() ); }
668 { refreshService( service.
alias(), options_r ); }
670 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
677 Pathname generateNonExistingName(
const Pathname & dir,
const std::string & basefilename )
const;
680 {
return filenameFromAlias( info.
alias(),
"repo" ); }
683 {
return filenameFromAlias( info.
alias(),
"service" ); }
687 Pathname base = solv_path_for_repoinfo( _options, info );
692 void touchIndexFile(
const RepoInfo & info );
694 template<
typename OutputIterator>
699 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
704 void init_knownServices();
705 void init_knownRepositories();
718 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
721 {
return new Impl( *
this ); }
727 {
return str <<
"RepoManager::Impl"; }
734 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
735 generateFilename( service ) );
738 MIL <<
"saving service in " << servfile << endl;
740 std::ofstream file( servfile.c_str() );
747 MIL <<
"done" << endl;
766 const std::string & basefilename )
const
768 std::string final_filename = basefilename;
770 while ( PathInfo(dir + final_filename).isExist() )
775 return dir + Pathname(final_filename);
782 Pathname dir = _options.knownServicesPath;
783 std::list<Pathname> entries;
784 if (PathInfo(dir).isExist())
793 for_(it, entries.begin(), entries.end() )
809 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
810 const Pathname & defaultCachePath_r,
811 const std::list<std::string> & repoEscAliases_r )
813 if ( cachePath_r != defaultCachePath_r )
816 std::list<std::string> entries;
820 std::set<std::string> oldfiles;
821 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
822 std::inserter( oldfiles, oldfiles.end() ) );
828 for (
const std::string & old : oldfiles )
832 pi( cachePath_r/old );
844 MIL <<
"start construct known repos" << endl;
846 if ( PathInfo(_options.knownReposPath).isExist() )
848 std::list<std::string> repoEscAliases;
849 std::list<RepoInfo> orphanedRepos;
850 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
853 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
855 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
857 _reposX.insert( repoInfo );
860 const std::string & serviceAlias( repoInfo.service() );
861 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
863 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
864 orphanedRepos.push_back( repoInfo );
868 repoEscAliases.push_back(repoInfo.escaped_alias());
872 if ( ! orphanedRepos.empty() )
874 for (
const auto & repoInfo : orphanedRepos )
876 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
882 % repoInfo.alias() );
884 removeRepository( repoInfo );
898 repoEscAliases.sort();
900 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, defaultCache.
repoRawCachePath, repoEscAliases );
901 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, defaultCache.
repoSolvCachePath, repoEscAliases );
902 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, defaultCache.
repoPackagesCachePath, repoEscAliases );
904 MIL <<
"end construct known repos" << endl;
911 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
912 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
917 repokind = probeCache( productdatapath );
920 switch ( repokind.
toEnum() )
923 status =
RepoStatus( productdatapath/
"repodata/repomd.xml") &&
RepoStatus( mediarootpath/
"media.1/media" );
927 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
946 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
951 repokind = probeCache( productdatapath );
957 switch ( repokind.
toEnum() )
960 p = Pathname(productdatapath +
"/repodata/repomd.xml");
964 p = Pathname(productdatapath +
"/content");
968 p = Pathname(productdatapath +
"/cookie");
986 MIL <<
"Going to try to check whether refresh is needed for " << url <<
" (" << info.
type() <<
")" << endl;
989 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
991 RepoStatus oldstatus = metadataStatus( info );
992 if ( oldstatus.
empty() )
994 MIL <<
"No cached metadata, going to refresh" << endl;
995 return REFRESH_NEEDED;
1000 MIL <<
"Never refresh CD/DVD" << endl;
1001 return REPO_UP_TO_DATE;
1004 if ( policy == RefreshForced )
1006 MIL <<
"Forced refresh!" << endl;
1007 return REFRESH_NEEDED;
1012 policy = RefreshIfNeededIgnoreDelay;
1016 if ( policy != RefreshIfNeededIgnoreDelay )
1019 double diff = difftime(
1025 DBG <<
"last refresh = " << diff <<
" minutes ago" << endl;
1031 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1035 MIL <<
"Repository '" << info.
alias()
1036 <<
"' has been refreshed less than repo.refresh.delay ("
1038 <<
") minutes ago. Advising to skip refresh" << endl;
1039 return REPO_CHECK_DELAYED;
1047 repokind = probe( url, info.
path() );
1051 switch ( repokind.
toEnum() )
1068 newstatus =
RepoStatus( MediaMounter(url).getPathName(info.
path()) );
1078 if ( oldstatus == newstatus )
1080 MIL <<
"repo has not changed" << endl;
1081 touchIndexFile( info );
1082 return REPO_UP_TO_DATE;
1086 MIL <<
"repo has changed, going to refresh" << endl;
1087 return REFRESH_NEEDED;
1093 ERR <<
"refresh check failed for " << url << endl;
1097 return REFRESH_NEEDED;
1107 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1108 "Valid metadata not found at specified URLs",
1122 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1125 MIL <<
"Going to refresh metadata from " << url << endl;
1133 if ( repokind != probed )
1139 for_( it, repoBegin(), repoEnd() )
1141 if ( info.
alias() == (*it).alias() )
1144 modifiedrepo.
setType( repokind );
1145 modifyRepository( info.
alias(), modifiedrepo );
1152 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1163 Exception ex(
_(
"Can't create metadata cache directory."));
1171 shared_ptr<repo::Downloader> downloader_ptr;
1173 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1186 for_( it, repoBegin(), repoEnd() )
1188 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1189 if ( PathInfo(cachepath).isExist() )
1190 downloader_ptr->addCachePath(cachepath);
1193 downloader_ptr->download( media, tmpdir.
path() );
1197 MediaMounter media( url );
1200 Pathname productpath( tmpdir.
path() / info.
path() );
1212 if ( ! isTmpRepo( info ) )
1221 ERR <<
"Trying another url..." << endl;
1233 ERR <<
"No more urls..." << endl;
1242 progress.
sendTo(progressfnc);
1252 progress.
sendTo(progressfnc);
1262 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1263 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1270 RepoStatus raw_metadata_status = metadataStatus(info);
1271 if ( raw_metadata_status.
empty() )
1276 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1277 raw_metadata_status = metadataStatus(info);
1280 bool needs_cleaning =
false;
1281 if ( isCached( info ) )
1283 MIL << info.
alias() <<
" is already cached." << endl;
1286 if ( cache_status == raw_metadata_status )
1288 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1289 if ( policy == BuildIfNeeded )
1292 const Pathname & base = solv_path_for_repoinfo( _options, info);
1293 if ( ! PathInfo(base/
"solv.idx").isExist() )
1299 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1303 needs_cleaning =
true;
1317 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1319 Pathname base = solv_path_for_repoinfo( _options, info);
1327 if( ! PathInfo(base).userMayW() )
1329 Exception ex(
str::form(
_(
"Can't create cache at %s - no writing permissions."), base.c_str()) );
1332 Pathname solvfile = base /
"solv";
1338 switch ( repokind.
toEnum() )
1342 repokind = probeCache( productdatapath );
1348 MIL <<
"repo type is " << repokind << endl;
1350 switch ( repokind.
toEnum() )
1358 scoped_ptr<MediaMounter> forPlainDirs;
1361 cmd.push_back( PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1363 cmd.push_back(
"-o" );
1364 cmd.push_back( solvfile.asString() );
1365 cmd.push_back(
"-X" );
1366 cmd.push_back(
"-A" );
1370 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1372 cmd.push_back(
"-R" );
1374 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1377 cmd.push_back( productdatapath.asString() );
1380 std::string errdetail;
1383 WAR <<
" " << output;
1384 if ( errdetail.empty() ) {
1388 errdetail += output;
1391 int ret = prog.
close();
1409 setCacheStatus(info, raw_metadata_status);
1410 MIL <<
"Commit cache.." << endl;
1425 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1431 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1443 bool gotMediaException =
false;
1451 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1458 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1460 gotMediaException =
true;
1467 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1474 DBG <<
"problem checking for content file" << endl;
1476 gotMediaException =
true;
1482 MediaMounter media( url );
1483 if ( PathInfo(media.getPathName()/path).isDir() )
1486 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1500 if (gotMediaException)
1503 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1514 MIL <<
"going to probe the cached repo at " << path_r << endl;
1518 if ( PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1520 else if ( PathInfo(path_r/
"/content").isFile() )
1522 else if ( PathInfo(path_r).isDir() )
1525 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1533 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1536 progress.
sendTo(progressrcv);
1539 std::list<Pathname> cachedirs;
1540 cachedirs.push_back(_options.repoRawCachePath);
1541 cachedirs.push_back(_options.repoPackagesCachePath);
1542 cachedirs.push_back(_options.repoSolvCachePath);
1544 for_( dir, cachedirs.begin(), cachedirs.end() )
1546 if ( PathInfo(*dir).isExist() )
1548 std::list<Pathname> entries;
1553 unsigned sdircount = entries.size();
1554 unsigned sdircurrent = 1;
1555 for_( subdir, entries.begin(), entries.end() )
1559 for_( r, repoBegin(), repoEnd() )
1560 if ( subdir->basename() == r->escaped_alias() )
1561 { found =
true;
break; }
1566 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1571 progress.
set( progress.
val() + 100 );
1581 progress.
sendTo(progressrcv);
1584 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1595 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1597 if ( ! PathInfo(solvfile).isExist() )
1607 if ( toolversion != LIBSOLV_TOOLVERSION )
1616 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1617 cleanCache( info, progressrcv );
1618 buildCache( info, BuildIfNeeded, progressrcv );
1636 MIL <<
"Try adding repo " << info << endl;
1643 if ( _options.probe )
1645 DBG <<
"unknown repository type, probing" << endl;
1646 assert_urls(tosave);
1660 Pathname repofile = generateNonExistingName(
1661 _options.knownReposPath, generateFilename(tosave));
1663 MIL <<
"Saving repo in " << repofile << endl;
1665 std::ofstream file(repofile.c_str());
1674 tosave.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1675 tosave.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1679 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1681 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1682 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1684 reposManip().insert(tosave);
1689 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1694 MIL <<
"done" << endl;
1701 for ( std::list<RepoInfo>::const_iterator it = repos.begin();
1706 for_ ( kit, repoBegin(), repoEnd() )
1708 if ( (*it).alias() == (*kit).alias() )
1710 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1716 std::string filename = Pathname(url.
getPathName()).basename();
1718 if ( filename == Pathname() )
1727 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1729 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1731 std::ofstream file(repofile.c_str());
1738 for ( std::list<RepoInfo>::iterator it = repos.begin();
1742 MIL <<
"Saving " << (*it).alias() << endl;
1743 it->dumpAsIniOn(file);
1744 it->setFilepath(repofile);
1745 it->setMetadataPath( rawcache_path_for_repoinfo( _options, *it ) );
1746 it->setPackagesPath( packagescache_path_for_repoinfo( _options, *it ) );
1747 reposManip().insert(*it);
1752 MIL <<
"done" << endl;
1764 MIL <<
"Going to delete repo " << info.
alias() << endl;
1766 for_( it, repoBegin(), repoEnd() )
1771 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1786 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1787 if ( filerepos.size() == 0
1788 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1792 if ( ! ( ret == 0 || ret == ENOENT ) )
1797 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1809 std::ofstream file(todelete.
filepath().c_str());
1815 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1816 fit != filerepos.end();
1819 if ( (*fit).alias() != todelete.
alias() )
1820 (*fit).dumpAsIniOn(file);
1828 if ( isCached(todelete) )
1829 cleanCache( todelete, cSubprogrcv);
1831 cleanMetadata( todelete, mSubprogrcv );
1832 cleanPackages( todelete, pSubprogrcv );
1833 reposManip().erase(todelete);
1834 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1848 RepoInfo toedit = getRepositoryInfo(alias);
1852 if ( alias != newinfo.
alias() && hasRepo( newinfo.
alias() ) )
1864 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1874 std::ofstream file(toedit.
filepath().c_str());
1880 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1881 fit != filerepos.end();
1886 if ( (*fit).alias() != toedit.
alias() )
1887 (*fit).dumpAsIniOn(file);
1895 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1896 if ( PathInfo(solvidx).isExist() )
1901 newinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1902 newinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1906 RepoInfo & oinfo( const_cast<RepoInfo &>(newinfo_r) );
1908 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1909 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1911 reposManip().erase(toedit);
1912 reposManip().insert(newinfo);
1914 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1916 MIL <<
"repo " << alias <<
" modified" << endl;
1925 if ( it !=
repos().end() )
1935 for_( it, repoBegin(), repoEnd() )
1937 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1939 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1956 assert_alias( service );
1959 if ( hasService( service.
alias() ) )
1965 saveService( toSave );
1969 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1971 MIL <<
"added service " << toSave.
alias() << endl;
1978 MIL <<
"Going to delete service " << alias << endl;
1980 const ServiceInfo & service = getService( alias );
1982 Pathname location = service.
filepath();
1983 if( location.empty() )
1992 if ( tmpSet.size() == 1 )
1999 MIL << alias <<
" successfully deleted." << endl;
2005 std::ofstream file(location.c_str());
2012 for_(it, tmpSet.begin(), tmpSet.end())
2014 if( it->alias() != alias )
2015 it->dumpAsIniOn(file);
2018 MIL << alias <<
" successfully deleted from file " << location << endl;
2022 RepoCollector rcollector;
2023 getRepositoriesInService( alias,
2024 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2026 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2027 removeRepository(*rit);
2036 ServiceSet services( serviceBegin(), serviceEnd() );
2037 for_( it, services.begin(), services.end() )
2039 if ( !it->enabled() )
2043 refreshService(*it, options_r);
2053 assert_alias( service );
2054 assert_url( service );
2055 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2057 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2066 if ( (lrf+=service.
ttl()) > now )
2068 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2073 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2080 bool serviceModified =
false;
2091 serviceModified =
true;
2096 std::string servicesTargetDistro = _options.servicesTargetDistro;
2097 if ( servicesTargetDistro.empty() )
2101 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2105 RepoCollector collector(servicesTargetDistro);
2112 ServiceRepos( service, bind( &RepoCollector::collect, &collector, _1 ) );
2117 uglyHack.first =
true;
2118 uglyHack.second = e;
2120 if ( service.
ttl() != origTtl )
2122 if ( !service.
ttl() )
2124 serviceModified =
true;
2132 for_( it, collector.repos.begin(), collector.repos.end() )
2135 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2137 it->setService( service.
alias() );
2140 newRepoStates[it->alias()] = *it;
2148 if ( !it->path().empty() )
2150 if ( it->path() !=
"/" )
2155 if ( it->baseUrlsEmpty() )
2158 if ( !path.empty() )
2160 it->setBaseUrl( std::move(url) );
2162 else if ( !path.empty() )
2165 for (
Url & url : urls )
2169 it->setBaseUrls( std::move(urls) );
2176 RepoInfoList oldRepos;
2177 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2181 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2183 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2185 if ( oldRepo->enabled() )
2188 const auto & last = service.
repoStates().find( oldRepo->alias() );
2189 if ( last != service.
repoStates().end() && ! last->second.enabled )
2191 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2193 serviceModified =
true;
2196 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2199 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2201 removeRepository( *oldRepo );
2207 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2208 for_( it, collector.repos.begin(), collector.repos.end() )
2214 TriBool toBeEnabled( indeterminate );
2215 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2217 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2219 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2231 DBG <<
"User request to enable service repo " << it->alias() << endl;
2237 serviceModified =
true;
2241 DBG <<
"User request to disable service repo " << it->alias() << endl;
2242 toBeEnabled =
false;
2246 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2247 if ( oldRepo == oldRepos.end() )
2252 if ( ! indeterminate(toBeEnabled) )
2253 it->setEnabled( toBeEnabled );
2255 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2256 addRepository( *it );
2261 bool oldRepoModified =
false;
2263 if ( indeterminate(toBeEnabled) )
2267 if ( oldRepo->enabled() == it->enabled() )
2268 toBeEnabled = it->enabled();
2269 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2271 toBeEnabled = it->enabled();
2272 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2276 const auto & last = service.
repoStates().find( oldRepo->alias() );
2277 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2278 toBeEnabled = it->enabled();
2281 toBeEnabled = oldRepo->enabled();
2282 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2288 if ( toBeEnabled == oldRepo->enabled() )
2290 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2292 else if ( toBeEnabled )
2294 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2295 oldRepo->setEnabled(
true );
2296 oldRepoModified =
true;
2300 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2301 oldRepo->setEnabled(
false );
2302 oldRepoModified =
true;
2308 if ( oldRepo->rawName() != it->rawName() )
2310 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2311 oldRepo->setName( it->rawName() );
2312 oldRepoModified =
true;
2316 if ( oldRepo->autorefresh() != it->autorefresh() )
2318 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2319 oldRepo->setAutorefresh( it->autorefresh() );
2320 oldRepoModified =
true;
2324 if ( oldRepo->priority() != it->priority() )
2326 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2327 oldRepo->setPriority( it->priority() );
2328 oldRepoModified =
true;
2334 urlCredentialExtractor.extract( newUrls );
2335 if ( oldRepo->rawBaseUrls() != newUrls )
2337 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2338 oldRepo->setBaseUrls( std::move(newUrls) );
2339 oldRepoModified =
true;
2349 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2350 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2351 #define Z_CHKGPG(I,N) \
2352 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2354 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2355 oldRepo->set##N##Check( ngpg[I] ); \
2356 oldRepoModified = true; \
2365 if ( oldRepoModified )
2367 modifyRepository( oldRepo->alias(), *oldRepo );
2376 serviceModified =
true;
2383 serviceModified =
true;
2390 if ( service.
ttl() )
2393 serviceModified =
true;
2396 if ( serviceModified )
2399 modifyService( service.
alias(), service );
2403 if ( uglyHack.first )
2405 throw( uglyHack.second );
2413 MIL <<
"Going to modify service " << oldAlias << endl;
2424 const ServiceInfo & oldService = getService(oldAlias);
2426 Pathname location = oldService.
filepath();
2427 if( location.empty() )
2437 std::ofstream file(location.c_str());
2438 for_(it, tmpSet.begin(), tmpSet.end())
2440 if( *it != oldAlias )
2441 it->dumpAsIniOn(file);
2450 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2454 if ( oldAlias != service.
alias()
2457 std::vector<RepoInfo> toModify;
2458 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2459 for_( it, toModify.begin(), toModify.end() )
2466 const auto & last = service.
repoStates().find( it->alias() );
2468 it->setEnabled( last->second.enabled );
2471 it->setEnabled(
false );
2474 if ( oldAlias != service.
alias() )
2475 it->setService(service.
alias());
2477 modifyRepository(it->alias(), *it);
2521 : _pimpl( new
Impl(opt) )
2553 std::string host( url_r.
getHost() );
2554 if ( ! host.empty() )
2676 {
return str << *obj.
_pimpl; }
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
Pathname packagesPath(const RepoInfo &info) const
RepoManager(const RepoManagerOptions &options=RepoManagerOptions())
static const ValueType day
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
void removeService(const std::string &alias)
Removes service specified by its name.
thrown when it was impossible to match a repository
Thrown when the repo alias is found to be invalid.
RepoManagerOptions(const Pathname &root_r=Pathname())
Default ctor following ZConfig global settings.
bool hasService(const std::string &alias) const
std::string alias() const
unique identifier for this source.
static const std::string & sha1()
sha1
int exchange(const Pathname &lpath, const Pathname &rpath)
Exchanges two files or directories.
static bool error(const std::string &msg_r, const UserData &userData_r=UserData())
send error text
RepoStatus status(MediaSetAccess &media)
Status of the remote repository.
void setCacheStatus(const RepoInfo &info, const RepoStatus &status)
std::string generateFilename(const ServiceInfo &info) const
thrown when it was impossible to determine this repo type.
std::string digest()
get hex string representation of the digest
Retrieval of repository list for a service.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
void refreshServices(const RefreshServiceOptions &options_r)
Pathname repoRawCachePath
bool serviceEmpty() const
Gets true if no service is in RepoManager (so no one in specified location)
void modifyService(const std::string &oldAlias, const ServiceInfo &service)
Modifies service file (rewrites it with new values) and underlying repositories if needed...
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
Read service data from a .service file.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Date timestamp() const
The time the data were changed the last time.
ServiceConstIterator serviceBegin() const
static ZConfig & instance()
Singleton ctor.
static TmpDir makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
scoped_ptr< media::CredentialManager > _cmPtr
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
void cleanCacheDirGarbage(const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove any subdirectories of cache directories which no longer belong to any of known repositories...
RepoConstIterator repoBegin() const
Pathname filepath() const
File where this repo was read from.
bool isCached(const RepoInfo &info) const
void refreshServices(const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refreshes all enabled services.
Service plugin is immutable.
RepoStatus metadataStatus(const RepoInfo &info) const
Status of local metadata.
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
bool empty() const
Test for an empty path.
std::string getHost(EEncoding eflag=zypp::url::E_DECODED) const
Returns the hostname or IP from the URL authority.
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
const std::string & command() const
The command we're executing.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
RepoSet::size_type RepoSizeType
bool empty() const
Whether the status is empty (default constucted)
void loadFromCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Load resolvables into the pool.
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
repo::RepoType probe(const Url &url, const Pathname &path) const
Probe repo metadata type.
std::string generateFilename(const RepoInfo &info) const
RepoConstIterator repoBegin() const
void addHistory(const std::string &msg_r)
Add some message text to the history.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy=RefreshIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local raw cache.
Pathname packagesPath(const RepoInfo &info) const
Path where the rpm packages are downloaded and kept.
void addService(const std::string &alias, const Url &url)
void touchIndexFile(const RepoInfo &info)
void setAlias(const std::string &alias)
set the repository alias
void init_knownRepositories()
void addRepoToEnable(const std::string &alias_r)
Add alias_r to the set of ReposToEnable.
void removeRepository(const RepoInfo &info, OPT_PROGRESS)
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
void modifyService(const std::string &oldAlias, const ServiceInfo &newService)
bool toMax()
Set counter value to current max value (unless no range).
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects...
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refresh specific service.
void setFilepath(const Pathname &filename)
set the path to the .repo file
What is known about a repository.
static bool warning(const std::string &msg_r, const UserData &userData_r=UserData())
send warning text
void removeRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove the best matching repository from known repos list.
const RepoSet & repos() const
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
const RepoStates & repoStates() const
Access the remembered repository states.
Pathname knownServicesPath
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
void reposErase(const std::string &alias_r)
Remove a Repository named alias_r.
Service already exists and some unique attribute can't be duplicated.
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
bool repo_add_probe() const
Whether repository urls should be probed.
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
std::string targetDistribution() const
This is register.target attribute of the installed base product.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Service without alias was used in an operation.
RepoStatus metadataStatus(const RepoInfo &info) const
RepoSet::const_iterator RepoConstIterator
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
Url::asString() view options.
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
repo::RepoType probeCache(const Pathname &path_r) const
Probe Metadata in a local cache directory.
#define PL_(MSG1, MSG2, N)
void modifyRepository(const std::string &alias, const RepoInfo &newinfo, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Modify repository attributes.
Pathname repoSolvCachePath
std::vector< std::string > Arguments
RepoManagerOptions _options
std::string asString() const
Returns a default string representation of the Url object.
ServiceInfo getService(const std::string &alias) const
RepoSizeType repoSize() const
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
void remember(const Exception &old_r)
Store an other Exception as history.
std::string & replaceAll(std::string &str_r, const std::string &from_r, const std::string &to_r)
Replace all occurrences of from_r with to_r in str_r (inplace).
void removeService(const ServiceInfo &service)
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
Progress callback from another progress.
std::map< std::string, RepoState > RepoStates
std::string label() const
Label for use in messages for the user interface.
void addRepository(const RepoInfo &info, OPT_PROGRESS)
static const ServiceType RIS
Repository Index Service (RIS) (formerly known as 'Novell Update' (NU) service)
RepoManager implementation.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
void setPathName(const std::string &path, EEncoding eflag=zypp::url::E_DECODED)
Set the path name.
std::set< RepoInfo > RepoSet
RepoInfo typedefs.
bool toMin()
Set counter value to current min value.
RepoInfo getRepositoryInfo(const std::string &alias, OPT_PROGRESS)
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Store and operate on date (time_t).
static Pool instance()
Singleton ctor.
bool serviceEmpty() const
static RepoManagerOptions makeTestSetup(const Pathname &root_r)
Test setup adjusting all paths to be located below one root_r directory.
Pathname rootDir
remembers root_r value for later use
void removeRepository(const RepoInfo &repo)
Log recently removed repository.
Provide a new empty temporary directory and recursively delete it when no longer needed.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
void clearReposToDisable()
Clear the set of ReposToDisable.
Lightweight repository attribute value lookup.
std::string asCompleteString() const
Returns a complete string representation of the Url object.
std::ostream & operator<<(std::ostream &str, const Exception &obj)
RepoConstIterator repoEnd() const
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
void cleanCacheDirGarbage(OPT_PROGRESS)
int unlink(const Pathname &path)
Like 'unlink'.
thrown when it was impossible to determine one url for this repo.
static const ServiceType NONE
No service set.
static const SolvAttr repositoryToolVersion
Service type enumeration.
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
ServiceSet::const_iterator ServiceConstIterator
void setRepoStates(RepoStates newStates_r)
Remember a new set of repository states.
std::ostream & operator<<(std::ostream &str, const DeltaCandidates &obj)
repo::ServiceType probeService(const Url &url) const
Probe the type or the service.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
void setMetadataPath(const Pathname &path)
Set the path where the local metadata is stored.
void setType(const repo::RepoType &t)
set the repository type
Maintain [min,max] and counter (value) for progress counting.
Date::Duration ttl() const
Sugested TTL between two metadata auto-refreshs.
RepoStatus cacheStatus(const RepoInfo &info) const
Pathname generateNonExistingName(const Pathname &dir, const std::string &basefilename) const
Generate a non existing filename in a directory, using a base name.
void addRepository(const RepoInfo &repo)
Log a newly added repository.
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
RepoInfo getRepo(const std::string &alias) const
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
static bool schemeIsVolatile(const std::string &scheme_r)
cd dvd
void addRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds a repository to the list of known repositories.
RepoInfo getRepositoryInfo(const std::string &alias, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Find a matching repository info.
static const ServiceType PLUGIN
Plugin services are scripts installed on your system that provide the package manager with repositori...
Base Exception for service handling.
std::string receiveLine()
Read one line from the input stream.
void init_knownServices()
void delRepoToEnable(const std::string &alias_r)
Remove alias_r from the set of ReposToEnable.
static std::string makeStupidAlias(const Url &url_r=Url())
Some stupid string but suitable as alias for your url if nothing better is available.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy=RefreshIfNeeded)
Checks whether to refresh metadata for specified repository and url.
void cleanCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
clean local cache
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
std::string numstring(char n, int w=0)
ServiceSet::size_type ServiceSizeType
bool reposToDisableEmpty() const
static const RepoType NONE
int touch(const Pathname &path)
Change file's modification and access times.
void resetDispose()
Set no dispose function.
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
url_set baseUrls() const
The complete set of repository urls.
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
int close()
Wait for the progamm to complete.
bool hasRepo(const std::string &alias) const
Return whether there is a known repository for alias.
void setLrf(Date lrf_r)
Set date of last refresh.
static const RepoType RPMMD
creates and provides information about known sources.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
RepoStatus cacheStatus(const RepoInfo &info) const
Status of metadata cache.
repo::RepoType type() const
Type of repository,.
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
RepoSizeType repoSize() const
void addService(const ServiceInfo &service)
std::list< RepoInfo > readRepoFile(const Url &repo_file)
Parses repo_file and returns a list of RepoInfo objects corresponding to repositories found within th...
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
Url rawUrl() const
The service raw url (no variables replaced)
static const RepoType YAST2
thrown when it was impossible to determine an alias for this repo.
void buildCache(const RepoInfo &info, CacheBuildPolicy policy=BuildIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local cache.
Base class for Exception.
void addRepositories(const Url &url, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds repositores from a repo file to the list of known repositories.
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
Exception for repository handling.
void saveService(ServiceInfo &service) const
Impl(const RepoManagerOptions &opt)
media::MediaAccessId _mid
static Date now()
Return the current time.
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
Probe the metadata type of a repository located at url.
bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT()
To trigger appdata refresh unconditionally.
DefaultIntegral< bool, false > _reposDirty
ServiceConstIterator serviceEnd() const
Functor thats filter RepoInfo by service which it belongs to.
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
bool hasRepo(const std::string &alias) const
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
The repository cache is not built yet so you can't create the repostories from the cache...
Url url() const
Pars pro toto: The first repository url.
void eraseFromPool()
Remove this Repository from it's Pool.
Pathname repoPackagesCachePath
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
static const ServiceInfo noService
Represents an empty service.
RepoConstIterator repoEnd() const
bool hasService(const std::string &alias) const
Return whether there is a known service for alias.
void removeService(const std::string &alias)
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
bool repoToDisableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToDisable.
static const RepoInfo noRepo
Represents no Repository (one with an empty alias).
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
regex ZYPP_STR_REGEX regex ZYPP_STR_REGEX
Thrown when the repo alias is found to be invalid.
ServiceSizeType serviceSize() const
Gets count of service in RepoManager (in specified location)
static const RepoType RPMPLAINDIR
static const std::string & systemRepoAlias()
Reserved system repository alias .
bool repoToEnableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToEnable.
ServiceSizeType serviceSize() const
Track changing files or directories.
void cleanPackages(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local package cache.
unsigned repo_refresh_delay() const
Amount of time in minutes that must pass before another refresh.
Repository already exists and some unique attribute can't be duplicated.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
bool set(value_type val_r)
Set new counter value.
std::string getScheme() const
Returns the scheme name of the URL.
Url url() const
The service url.
static bool schemeIsDownloading(const std::string &scheme_r)
http https ftp sftp tftp
void modifyRepository(const RepoInfo &oldrepo, const RepoInfo &newrepo)
Log certain modifications to a repository.
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Impl * clone() const
clone for RWCOW_pointer
urls_size_type baseUrlsSize() const
number of repository urls
Repository addRepoSolv(const Pathname &file_r, const std::string &name_r)
Load Solvables from a solv-file into a Repository named name_r.
void name(const std::string &name_r)
Set counter name.
Downloader for YUM (rpm-nmd) repositories Encapsulates all the knowledge of which files have to be do...
Pathname metadataPath(const RepoInfo &info) const
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
void cleanPackages(const RepoInfo &info, OPT_PROGRESS)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
std::string hexstring(char n, int w=4)
std::string asUserString() const
Translated error message as string suitable for the user.
void addService(const std::string &alias, const Url &url)
Adds new service by it's alias and url.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
Service has no or invalid url defined.
static bool schemeIsLocal(const std::string &scheme_r)
hd cd dvd dir file iso
Date lrf() const
Date of last refresh (if known).
void addRepositories(const Url &url, OPT_PROGRESS)
void cleanMetadata(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local metadata.
Pathname path() const
Repository path.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Writes ServiceInfo to stream in ".service" format.
repo::ServiceType type() const
Service type.
Repository type enumeration.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
repo::ServiceType probeService(const Url &url) const