57 using namespace zypp::repo;
59 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
88 class UrlCredentialExtractor
91 UrlCredentialExtractor( Pathname & root_r )
95 ~UrlCredentialExtractor()
99 bool collect(
const Url & url_r )
101 bool ret = url_r.hasCredentialsInAuthority();
105 _cmPtr->addUserCred( url_r );
110 template<
class TContainer>
111 bool collect(
const TContainer & urls_r )
112 {
bool ret =
false;
for (
const Url &
url : urls_r ) {
if ( collect(
url ) && !ret ) ret =
true; }
return ret; }
115 bool extract( Url & url_r )
117 bool ret = collect( url_r );
119 url_r.setPassword( std::string() );
123 template<
class TContainer>
124 bool extract( TContainer & urls_r )
125 {
bool ret =
false;
for ( Url &
url : urls_r ) {
if ( extract(
url ) && !ret ) ret =
true; }
return ret; }
129 scoped_ptr<media::CredentialManager>
_cmPtr;
144 MediaMounter(
const Url & url_r )
146 media::MediaManager mediamanager;
147 _mid = mediamanager.open( url_r );
148 mediamanager.attach(
_mid );
154 media::MediaManager mediamanager;
155 mediamanager.release(
_mid );
156 mediamanager.close(
_mid );
163 Pathname getPathName(
const Pathname & path_r = Pathname() )
const
165 media::MediaManager mediamanager;
166 return mediamanager.localPath(
_mid, path_r );
175 template <
class Iterator>
176 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
178 for_( it, begin_r, end_r )
179 if ( it->alias() == alias_r )
184 template <
class Container>
185 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
186 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
189 template <
class Iterator>
190 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
192 for_( it, begin_r, end_r )
193 if ( it->alias() == alias_r )
198 template <class Container>
199 inline typename Container::iterator findAlias( const std::
string & alias_r, Container & cont_r )
200 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
202 template <
class Container>
203 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
204 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
208 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
210 std::string filename( alias_r );
214 filename = Pathname(filename).extend(
"."+stem_r).asString();
215 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
239 RepoCollector(
const std::string & targetDistro_)
243 bool collect(
const RepoInfo &repo )
247 && !repo.targetDistribution().empty()
251 <<
"Skipping repository meant for '" << repo.targetDistribution()
252 <<
"' distribution (current distro is '"
258 repos.push_back(repo);
272 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
274 MIL <<
"repo file: " << file << endl;
275 RepoCollector collector;
276 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
277 return std::move(collector.repos);
290 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
292 MIL <<
"directory " << dir << endl;
293 std::list<RepoInfo>
repos;
294 bool nonroot( geteuid() != 0 );
295 if ( nonroot && ! PathInfo(dir).userMayRX() )
297 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
301 std::list<Pathname> entries;
308 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
309 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
313 if ( nonroot && ! PathInfo(*it).userMayR() )
315 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
319 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
320 repos.insert( repos.end(), tmp.begin(), tmp.end() );
330 inline void assert_alias(
const RepoInfo & info )
332 if ( info.alias().empty() )
336 if ( info.alias()[0] ==
'.')
338 info,
_(
"Repository alias cannot start with dot.")));
341 inline void assert_alias(
const ServiceInfo & info )
343 if ( info.alias().empty() )
347 if ( info.alias()[0] ==
'.')
349 info,
_(
"Service alias cannot start with dot.")));
354 inline void assert_urls(
const RepoInfo & info )
356 if ( info.baseUrlsEmpty() )
360 inline void assert_url(
const ServiceInfo & info )
362 if ( ! info.url().isValid() )
372 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
375 return opt.repoRawCachePath / info.escaped_alias();
386 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
389 return opt.repoRawCachePath / info.escaped_alias() / info.path();
395 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
398 return opt.repoPackagesCachePath / info.escaped_alias();
404 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info)
407 return opt.repoSolvCachePath / info.escaped_alias();
413 class ServiceCollector
416 typedef std::set<ServiceInfo> ServiceSet;
418 ServiceCollector( ServiceSet & services_r )
422 bool operator()(
const ServiceInfo & service_r )
const
446 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
448 return repositories_in_file(local);
459 repoCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoCachePath() );
460 repoRawCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoMetadataPath() );
461 repoSolvCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoSolvfilesPath() );
462 repoPackagesCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoPackagesPath() );
463 knownReposPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownReposPath() );
464 knownServicesPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownServicesPath() );
465 pluginsPath = Pathname::assertprefix( root_r,
ZConfig::instance().pluginsPath() );
487 #define OUTS(X) str << " " #X "\t" << obj.X << endl
488 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
489 OUTS( repoRawCachePath );
490 OUTS( repoSolvCachePath );
491 OUTS( repoPackagesCachePath );
492 OUTS( knownReposPath );
493 OUTS( knownServicesPath );
511 init_knownServices();
512 init_knownRepositories();
518 if ( _reposDirty && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
521 std::list<Pathname> entries;
523 if ( ! entries.empty() )
526 cmd.push_back(
"<" );
527 cmd.push_back(
">" );
528 cmd.push_back(
"PROGRAM" );
529 for (
const auto & rinfo :
repos() )
531 if ( ! rinfo.enabled() )
533 cmd.push_back(
"-R" );
534 cmd.push_back( rinfo.alias() );
535 cmd.push_back(
"-t" );
536 cmd.push_back( rinfo.type().asString() );
537 cmd.push_back(
"-p" );
538 cmd.push_back( rinfo.metadataPath().asString() );
541 for_( it, entries.begin(), entries.end() )
545 if ( pi.isFile() && pi.userMayRX() )
548 cmd[2] = pi.asString();
564 bool hasRepo(
const std::string & alias )
const
565 {
return foundAliasIn( alias,
repos() ); }
575 {
return rawcache_path_for_repoinfo( _options, info ); }
578 {
return packagescache_path_for_repoinfo( _options, info ); }
600 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").isExist(); }
625 {
return foundAliasIn( alias,
_services ); }
638 void removeService(
const std::string & alias );
640 { removeService( service.
alias() ); }
646 { refreshService( service.
alias(), options_r ); }
648 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
655 Pathname generateNonExistingName(
const Pathname & dir,
const std::string & basefilename )
const;
658 {
return filenameFromAlias( info.
alias(),
"repo" ); }
661 {
return filenameFromAlias( info.
alias(),
"service" ); }
665 Pathname base = solv_path_for_repoinfo( _options, info );
670 void touchIndexFile(
const RepoInfo & info );
672 template<
typename OutputIterator>
677 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
682 void init_knownServices();
683 void init_knownRepositories();
696 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
699 {
return new Impl( *
this ); }
705 {
return str <<
"RepoManager::Impl"; }
712 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
713 generateFilename( service ) );
716 MIL <<
"saving service in " << servfile << endl;
718 std::ofstream file( servfile.c_str() );
725 MIL <<
"done" << endl;
744 const std::string & basefilename )
const
746 std::string final_filename = basefilename;
748 while ( PathInfo(dir + final_filename).isExist() )
753 return dir + Pathname(final_filename);
760 Pathname dir = _options.knownServicesPath;
761 std::list<Pathname> entries;
762 if (PathInfo(dir).isExist())
771 for_(it, entries.begin(), entries.end() )
787 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
788 const Pathname & defaultCachePath_r,
789 const std::list<std::string> & repoEscAliases_r )
791 if ( cachePath_r != defaultCachePath_r )
794 std::list<std::string> entries;
798 std::set<std::string> oldfiles;
799 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
800 std::inserter( oldfiles, oldfiles.end() ) );
806 for (
const std::string & old : oldfiles )
810 pi( cachePath_r/old );
822 MIL <<
"start construct known repos" << endl;
824 if ( PathInfo(_options.knownReposPath).isExist() )
826 std::list<std::string> repoEscAliases;
827 std::list<RepoInfo> orphanedRepos;
828 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
831 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
833 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
835 _reposX.insert( repoInfo );
838 const std::string & serviceAlias( repoInfo.service() );
839 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
841 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
842 orphanedRepos.push_back( repoInfo );
846 repoEscAliases.push_back(repoInfo.escaped_alias());
850 if ( ! orphanedRepos.empty() )
852 for (
const auto & repoInfo : orphanedRepos )
854 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
860 % repoInfo.alias() );
862 removeRepository( repoInfo );
876 repoEscAliases.sort();
878 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, defaultCache.
repoRawCachePath, repoEscAliases );
879 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, defaultCache.
repoSolvCachePath, repoEscAliases );
880 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, defaultCache.
repoPackagesCachePath, repoEscAliases );
882 MIL <<
"end construct known repos" << endl;
889 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
890 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
895 repokind = probeCache( productdatapath );
898 switch ( repokind.
toEnum() )
901 status =
RepoStatus( productdatapath/
"repodata/repomd.xml");
905 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
924 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
929 repokind = probeCache( productdatapath );
935 switch ( repokind.
toEnum() )
938 p = Pathname(productdatapath +
"/repodata/repomd.xml");
942 p = Pathname(productdatapath +
"/content");
946 p = Pathname(productdatapath +
"/cookie");
964 MIL <<
"Going to try to check whether refresh is needed for " << url <<
" (" << info.
type() <<
")" << endl;
967 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
969 RepoStatus oldstatus = metadataStatus( info );
971 if ( oldstatus.
empty() )
973 MIL <<
"No cached metadata, going to refresh" << endl;
974 return REFRESH_NEEDED;
980 MIL <<
"never refresh CD/DVD" << endl;
981 return REPO_UP_TO_DATE;
985 policy = RefreshIfNeededIgnoreDelay;
990 if (policy != RefreshForced && policy != RefreshIfNeededIgnoreDelay)
993 double diff = difftime(
999 DBG <<
"last refresh = " << diff <<
" minutes ago" << endl;
1005 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1009 MIL <<
"Repository '" << info.
alias()
1010 <<
"' has been refreshed less than repo.refresh.delay ("
1012 <<
") minutes ago. Advising to skip refresh" << endl;
1013 return REPO_CHECK_DELAYED;
1021 repokind = probe( url, info.
path() );
1025 switch ( repokind.
toEnum() )
1042 newstatus =
RepoStatus( MediaMounter(url).getPathName(info.
path()) );
1052 bool refresh =
false;
1053 if ( oldstatus == newstatus )
1055 MIL <<
"repo has not changed" << endl;
1056 if ( policy == RefreshForced )
1058 MIL <<
"refresh set to forced" << endl;
1064 MIL <<
"repo has changed, going to refresh" << endl;
1069 touchIndexFile(info);
1071 return refresh ? REFRESH_NEEDED : REPO_UP_TO_DATE;
1077 ERR <<
"refresh check failed for " << url << endl;
1081 return REFRESH_NEEDED;
1091 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1092 "Valid metadata not found at specified URLs",
1106 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1109 MIL <<
"Going to refresh metadata from " << url << endl;
1117 if ( repokind != probed )
1123 for_( it, repoBegin(), repoEnd() )
1125 if ( info.
alias() == (*it).alias() )
1128 modifiedrepo.
setType( repokind );
1129 modifyRepository( info.
alias(), modifiedrepo );
1136 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1147 Exception ex(
_(
"Can't create metadata cache directory."));
1155 shared_ptr<repo::Downloader> downloader_ptr;
1157 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1170 for_( it, repoBegin(), repoEnd() )
1172 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1173 if ( PathInfo(cachepath).isExist() )
1174 downloader_ptr->addCachePath(cachepath);
1177 downloader_ptr->download( media, tmpdir.
path() );
1181 MediaMounter media( url );
1184 Pathname productpath( tmpdir.
path() / info.
path() );
1204 ERR <<
"Trying another url..." << endl;
1216 ERR <<
"No more urls..." << endl;
1225 progress.
sendTo(progressfnc);
1235 progress.
sendTo(progressfnc);
1245 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1246 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1253 RepoStatus raw_metadata_status = metadataStatus(info);
1254 if ( raw_metadata_status.
empty() )
1259 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1260 raw_metadata_status = metadataStatus(info);
1263 bool needs_cleaning =
false;
1264 if ( isCached( info ) )
1266 MIL << info.
alias() <<
" is already cached." << endl;
1269 if ( cache_status == raw_metadata_status )
1271 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1272 if ( policy == BuildIfNeeded )
1275 const Pathname & base = solv_path_for_repoinfo( _options, info);
1276 if ( ! PathInfo(base/
"solv.idx").isExist() )
1282 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1286 needs_cleaning =
true;
1300 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1302 Pathname base = solv_path_for_repoinfo( _options, info);
1310 if( ! PathInfo(base).userMayW() )
1312 Exception ex(
str::form(
_(
"Can't create cache at %s - no writing permissions."), base.c_str()) );
1315 Pathname solvfile = base /
"solv";
1321 switch ( repokind.
toEnum() )
1325 repokind = probeCache( productdatapath );
1331 MIL <<
"repo type is " << repokind << endl;
1333 switch ( repokind.
toEnum() )
1341 scoped_ptr<MediaMounter> forPlainDirs;
1344 cmd.push_back( PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1346 cmd.push_back(
"-o" );
1347 cmd.push_back( solvfile.asString() );
1348 cmd.push_back(
"-X" );
1349 cmd.push_back(
"-A" );
1353 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1355 cmd.push_back(
"-R" );
1357 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1360 cmd.push_back( productdatapath.asString() );
1363 std::string errdetail;
1366 WAR <<
" " << output;
1367 if ( errdetail.empty() ) {
1371 errdetail += output;
1374 int ret = prog.
close();
1392 setCacheStatus(info, raw_metadata_status);
1393 MIL <<
"Commit cache.." << endl;
1408 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1414 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1426 bool gotMediaException =
false;
1434 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1441 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1443 gotMediaException =
true;
1450 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1457 DBG <<
"problem checking for content file" << endl;
1459 gotMediaException =
true;
1465 MediaMounter media( url );
1466 if ( PathInfo(media.getPathName()/path).isDir() )
1469 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1483 if (gotMediaException)
1486 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1497 MIL <<
"going to probe the cached repo at " << path_r << endl;
1501 if ( PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1503 else if ( PathInfo(path_r/
"/content").isFile() )
1505 else if ( PathInfo(path_r).isDir() )
1508 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1516 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1519 progress.
sendTo(progressrcv);
1522 std::list<Pathname> cachedirs;
1523 cachedirs.push_back(_options.repoRawCachePath);
1524 cachedirs.push_back(_options.repoPackagesCachePath);
1525 cachedirs.push_back(_options.repoSolvCachePath);
1527 for_( dir, cachedirs.begin(), cachedirs.end() )
1529 if ( PathInfo(*dir).isExist() )
1531 std::list<Pathname> entries;
1536 unsigned sdircount = entries.size();
1537 unsigned sdircurrent = 1;
1538 for_( subdir, entries.begin(), entries.end() )
1542 for_( r, repoBegin(), repoEnd() )
1543 if ( subdir->basename() == r->escaped_alias() )
1544 { found =
true;
break; }
1549 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1554 progress.
set( progress.
val() + 100 );
1564 progress.
sendTo(progressrcv);
1567 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1578 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1580 if ( ! PathInfo(solvfile).isExist() )
1605 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1606 cleanCache( info, progressrcv );
1607 buildCache( info, BuildIfNeeded, progressrcv );
1625 MIL <<
"Try adding repo " << info << endl;
1632 if ( _options.probe )
1634 DBG <<
"unknown repository type, probing" << endl;
1635 assert_urls(tosave);
1649 Pathname repofile = generateNonExistingName(
1650 _options.knownReposPath, generateFilename(tosave));
1652 MIL <<
"Saving repo in " << repofile << endl;
1654 std::ofstream file(repofile.c_str());
1668 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1672 reposManip().insert(tosave);
1677 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1682 MIL <<
"done" << endl;
1689 for ( std::list<RepoInfo>::const_iterator it = repos.begin();
1694 for_ ( kit, repoBegin(), repoEnd() )
1696 if ( (*it).alias() == (*kit).alias() )
1698 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1704 std::string filename = Pathname(url.
getPathName()).basename();
1706 if ( filename == Pathname() )
1715 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1717 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1719 std::ofstream file(repofile.c_str());
1726 for ( std::list<RepoInfo>::iterator it = repos.begin();
1730 MIL <<
"Saving " << (*it).alias() << endl;
1731 it->setFilepath(repofile.asString());
1732 it->dumpAsIniOn(file);
1733 reposManip().insert(*it);
1738 MIL <<
"done" << endl;
1750 MIL <<
"Going to delete repo " << info.
alias() << endl;
1752 for_( it, repoBegin(), repoEnd() )
1757 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1772 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1773 if ( filerepos.size() == 0
1774 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1778 if ( ! ( ret == 0 || ret == ENOENT ) )
1783 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1795 std::ofstream file(todelete.
filepath().c_str());
1801 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1802 fit != filerepos.end();
1805 if ( (*fit).alias() != todelete.
alias() )
1806 (*fit).dumpAsIniOn(file);
1814 if ( isCached(todelete) )
1815 cleanCache( todelete, cSubprogrcv);
1817 cleanMetadata( todelete, mSubprogrcv );
1818 cleanPackages( todelete, pSubprogrcv );
1819 reposManip().erase(todelete);
1820 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1834 RepoInfo toedit = getRepositoryInfo(alias);
1838 if ( alias != newinfo.
alias() && hasRepo( newinfo.
alias() ) )
1850 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1860 std::ofstream file(toedit.
filepath().c_str());
1866 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1867 fit != filerepos.end();
1872 if ( (*fit).alias() != toedit.
alias() )
1873 (*fit).dumpAsIniOn(file);
1881 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1882 if ( PathInfo(solvidx).isExist() )
1887 reposManip().erase(toedit);
1888 reposManip().insert(newinfo);
1890 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1892 MIL <<
"repo " << alias <<
" modified" << endl;
1901 if ( it !=
repos().end() )
1911 for_( it, repoBegin(), repoEnd() )
1913 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1915 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1932 assert_alias( service );
1935 if ( hasService( service.
alias() ) )
1941 saveService( toSave );
1945 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1947 MIL <<
"added service " << toSave.
alias() << endl;
1954 MIL <<
"Going to delete service " << alias << endl;
1956 const ServiceInfo & service = getService( alias );
1958 Pathname location = service.
filepath();
1959 if( location.empty() )
1968 if ( tmpSet.size() == 1 )
1975 MIL << alias <<
" successfully deleted." << endl;
1981 std::ofstream file(location.c_str());
1988 for_(it, tmpSet.begin(), tmpSet.end())
1990 if( it->alias() != alias )
1991 it->dumpAsIniOn(file);
1994 MIL << alias <<
" successfully deleted from file " << location << endl;
1998 RepoCollector rcollector;
1999 getRepositoriesInService( alias,
2000 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2002 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2003 removeRepository(*rit);
2012 ServiceSet services( serviceBegin(), serviceEnd() );
2013 for_( it, services.begin(), services.end() )
2015 if ( !it->enabled() )
2019 refreshService(*it, options_r);
2029 assert_alias( service );
2030 assert_url( service );
2031 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2033 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2042 if ( (lrf+=service.
ttl()) > now )
2044 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2049 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2056 bool serviceModified =
false;
2067 serviceModified =
true;
2072 std::string servicesTargetDistro = _options.servicesTargetDistro;
2073 if ( servicesTargetDistro.empty() )
2077 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2081 RepoCollector collector(servicesTargetDistro);
2088 ServiceRepos( service, bind( &RepoCollector::collect, &collector, _1 ) );
2093 uglyHack.first =
true;
2094 uglyHack.second = e;
2096 if ( service.
ttl() != origTtl )
2098 if ( !service.
ttl() )
2100 serviceModified =
true;
2108 for_( it, collector.repos.begin(), collector.repos.end() )
2111 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2113 it->setService( service.
alias() );
2116 newRepoStates[it->alias()] = *it;
2124 if ( !it->path().empty() )
2126 if ( it->path() !=
"/" )
2131 if ( it->baseUrlsEmpty() )
2134 if ( !path.empty() )
2136 it->setBaseUrl( std::move(url) );
2138 else if ( !path.empty() )
2141 for (
Url & url : urls )
2145 it->setBaseUrls( std::move(urls) );
2152 RepoInfoList oldRepos;
2153 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2157 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2159 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2161 if ( oldRepo->enabled() )
2164 const auto & last = service.
repoStates().find( oldRepo->alias() );
2165 if ( last != service.
repoStates().end() && ! last->second.enabled )
2167 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2169 serviceModified =
true;
2172 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2175 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2177 removeRepository( *oldRepo );
2183 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2184 for_( it, collector.repos.begin(), collector.repos.end() )
2190 TriBool toBeEnabled( indeterminate );
2191 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2193 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2195 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2207 DBG <<
"User request to enable service repo " << it->alias() << endl;
2213 serviceModified =
true;
2217 DBG <<
"User request to disable service repo " << it->alias() << endl;
2218 toBeEnabled =
false;
2222 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2223 if ( oldRepo == oldRepos.end() )
2228 if ( ! indeterminate(toBeEnabled) )
2229 it->setEnabled( toBeEnabled );
2231 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2232 addRepository( *it );
2237 bool oldRepoModified =
false;
2239 if ( indeterminate(toBeEnabled) )
2243 if ( oldRepo->enabled() == it->enabled() )
2244 toBeEnabled = it->enabled();
2245 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2247 toBeEnabled = it->enabled();
2248 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2252 const auto & last = service.
repoStates().find( oldRepo->alias() );
2253 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2254 toBeEnabled = it->enabled();
2257 toBeEnabled = oldRepo->enabled();
2258 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2264 if ( toBeEnabled == oldRepo->enabled() )
2266 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2268 else if ( toBeEnabled )
2270 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2271 oldRepo->setEnabled(
true );
2272 oldRepoModified =
true;
2276 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2277 oldRepo->setEnabled(
false );
2278 oldRepoModified =
true;
2284 if ( oldRepo->rawName() != it->rawName() )
2286 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2287 oldRepo->setName( it->rawName() );
2288 oldRepoModified =
true;
2292 if ( oldRepo->autorefresh() != it->autorefresh() )
2294 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2295 oldRepo->setAutorefresh( it->autorefresh() );
2296 oldRepoModified =
true;
2300 if ( oldRepo->priority() != it->priority() )
2302 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2303 oldRepo->setPriority( it->priority() );
2304 oldRepoModified =
true;
2310 urlCredentialExtractor.extract( newUrls );
2311 if ( oldRepo->rawBaseUrls() != newUrls )
2313 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2314 oldRepo->setBaseUrls( std::move(newUrls) );
2315 oldRepoModified =
true;
2325 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2326 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2327 #define Z_CHKGPG(I,N) \
2328 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2330 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2331 oldRepo->set##N##Check( ngpg[I] ); \
2332 oldRepoModified = true; \
2341 if ( oldRepoModified )
2343 modifyRepository( oldRepo->alias(), *oldRepo );
2352 serviceModified =
true;
2359 serviceModified =
true;
2366 if ( service.
ttl() )
2369 serviceModified =
true;
2372 if ( serviceModified )
2375 modifyService( service.
alias(), service );
2379 if ( uglyHack.first )
2381 throw( uglyHack.second );
2389 MIL <<
"Going to modify service " << oldAlias << endl;
2400 const ServiceInfo & oldService = getService(oldAlias);
2402 Pathname location = oldService.
filepath();
2403 if( location.empty() )
2413 std::ofstream file(location.c_str());
2414 for_(it, tmpSet.begin(), tmpSet.end())
2416 if( *it != oldAlias )
2417 it->dumpAsIniOn(file);
2426 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2430 if ( oldAlias != service.
alias()
2433 std::vector<RepoInfo> toModify;
2434 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2435 for_( it, toModify.begin(), toModify.end() )
2442 const auto & last = service.
repoStates().find( it->alias() );
2444 it->setEnabled( last->second.enabled );
2447 it->setEnabled(
false );
2450 if ( oldAlias != service.
alias() )
2451 it->setService(service.
alias());
2453 modifyRepository(it->alias(), *it);
2497 : _pimpl( new
Impl(opt) )
2529 std::string host( url_r.
getHost() );
2530 if ( ! host.empty() )
2652 {
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...
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.
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.
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 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.
std::string asString() const
This is an overloaded member function, provided for convenience. It differs from the above function o...
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.
iterator begin() const
Iterator to the begin of query results.
Repository type enumeration.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
repo::ServiceType probeService(const Url &url) const