57 using namespace zypp::repo;
59 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
74 MediaMounter(
const Url & url_r )
76 media::MediaManager mediamanager;
77 _mid = mediamanager.open( url_r );
78 mediamanager.attach(
_mid );
84 media::MediaManager mediamanager;
85 mediamanager.release(
_mid );
86 mediamanager.close(
_mid );
93 Pathname getPathName(
const Pathname & path_r = Pathname() )
const
95 media::MediaManager mediamanager;
96 return mediamanager.localPath(
_mid, path_r );
105 template <
class Iterator>
106 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
108 for_( it, begin_r, end_r )
109 if ( it->alias() == alias_r )
114 template <
class Container>
115 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
116 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
119 template <
class Iterator>
120 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
122 for_( it, begin_r, end_r )
123 if ( it->alias() == alias_r )
128 template <class Container>
129 inline typename Container::iterator findAlias( const std::
string & alias_r, Container & cont_r )
130 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
132 template <
class Container>
133 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
134 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
138 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
140 std::string filename( alias_r );
144 filename = Pathname(filename).extend(
"."+stem_r).asString();
145 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
169 RepoCollector(
const std::string & targetDistro_)
173 bool collect(
const RepoInfo &repo )
177 && !repo.targetDistribution().empty()
181 <<
"Skipping repository meant for '" << repo.targetDistribution()
182 <<
"' distribution (current distro is '"
188 repos.push_back(repo);
202 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
204 MIL <<
"repo file: " << file << endl;
205 RepoCollector collector;
206 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
207 return std::move(collector.repos);
220 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
222 MIL <<
"directory " << dir << endl;
223 std::list<RepoInfo>
repos;
224 bool nonroot( geteuid() != 0 );
225 if ( nonroot && ! PathInfo(dir).userMayRX() )
227 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
231 std::list<Pathname> entries;
238 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
239 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
243 if ( nonroot && ! PathInfo(*it).userMayR() )
245 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
249 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
250 repos.insert( repos.end(), tmp.begin(), tmp.end() );
260 inline void assert_alias(
const RepoInfo & info )
262 if ( info.alias().empty() )
266 if ( info.alias()[0] ==
'.')
268 info,
_(
"Repository alias cannot start with dot.")));
271 inline void assert_alias(
const ServiceInfo & info )
273 if ( info.alias().empty() )
277 if ( info.alias()[0] ==
'.')
279 info,
_(
"Service alias cannot start with dot.")));
284 inline void assert_urls(
const RepoInfo & info )
286 if ( info.baseUrlsEmpty() )
290 inline void assert_url(
const ServiceInfo & info )
292 if ( ! info.url().isValid() )
302 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
305 return opt.repoRawCachePath / info.escaped_alias();
316 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
319 return opt.repoRawCachePath / info.escaped_alias() / info.path();
325 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
328 return opt.repoPackagesCachePath / info.escaped_alias();
334 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info)
337 return opt.repoSolvCachePath / info.escaped_alias();
343 class ServiceCollector
346 typedef std::set<ServiceInfo> ServiceSet;
348 ServiceCollector( ServiceSet & services_r )
352 bool operator()(
const ServiceInfo & service_r )
const
376 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
378 return repositories_in_file(local);
389 repoCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoCachePath() );
390 repoRawCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoMetadataPath() );
391 repoSolvCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoSolvfilesPath() );
392 repoPackagesCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoPackagesPath() );
393 knownReposPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownReposPath() );
394 knownServicesPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownServicesPath() );
395 pluginsPath = Pathname::assertprefix( root_r,
ZConfig::instance().pluginsPath() );
417 #define OUTS(X) str << " " #X "\t" << obj.X << endl
418 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
419 OUTS( repoRawCachePath );
420 OUTS( repoSolvCachePath );
421 OUTS( repoPackagesCachePath );
422 OUTS( knownReposPath );
423 OUTS( knownServicesPath );
441 init_knownServices();
442 init_knownRepositories();
448 if ( _reposDirty && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
451 std::list<Pathname> entries;
453 if ( ! entries.empty() )
456 cmd.push_back(
"<" );
457 cmd.push_back(
">" );
458 cmd.push_back(
"PROGRAM" );
459 for (
const auto & rinfo :
repos() )
461 if ( ! rinfo.enabled() )
463 cmd.push_back(
"-R" );
464 cmd.push_back( rinfo.alias() );
465 cmd.push_back(
"-t" );
466 cmd.push_back( rinfo.type().asString() );
467 cmd.push_back(
"-p" );
468 cmd.push_back( rinfo.metadataPath().asString() );
471 for_( it, entries.begin(), entries.end() )
475 if ( pi.isFile() && pi.userMayRX() )
478 cmd[2] = pi.asString();
494 bool hasRepo(
const std::string & alias )
const
495 {
return foundAliasIn( alias,
repos() ); }
505 {
return rawcache_path_for_repoinfo( _options, info ); }
508 {
return packagescache_path_for_repoinfo( _options, info ); }
530 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").isExist(); }
555 {
return foundAliasIn( alias,
_services ); }
568 void removeService(
const std::string & alias );
570 { removeService( service.
alias() ); }
576 { refreshService( service.
alias(), options_r ); }
578 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
585 Pathname generateNonExistingName(
const Pathname & dir,
const std::string & basefilename )
const;
588 {
return filenameFromAlias( info.
alias(),
"repo" ); }
591 {
return filenameFromAlias( info.
alias(),
"service" ); }
595 Pathname base = solv_path_for_repoinfo( _options, info );
600 void touchIndexFile(
const RepoInfo & info );
602 template<
typename OutputIterator>
607 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
612 void init_knownServices();
613 void init_knownRepositories();
626 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
629 {
return new Impl( *
this ); }
635 {
return str <<
"RepoManager::Impl"; }
642 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
643 generateFilename( service ) );
646 MIL <<
"saving service in " << servfile << endl;
648 std::ofstream file( servfile.c_str() );
655 MIL <<
"done" << endl;
674 const std::string & basefilename )
const
676 std::string final_filename = basefilename;
678 while ( PathInfo(dir + final_filename).isExist() )
683 return dir + Pathname(final_filename);
690 Pathname dir = _options.knownServicesPath;
691 std::list<Pathname> entries;
692 if (PathInfo(dir).isExist())
701 for_(it, entries.begin(), entries.end() )
717 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
718 const Pathname & defaultCachePath_r,
719 const std::list<std::string> & repoEscAliases_r )
721 if ( cachePath_r != defaultCachePath_r )
724 std::list<std::string> entries;
728 std::set<std::string> oldfiles;
729 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
730 std::inserter( oldfiles, oldfiles.end() ) );
731 for (
const std::string & old : oldfiles )
743 MIL <<
"start construct known repos" << endl;
745 if ( PathInfo(_options.knownReposPath).isExist() )
747 std::list<std::string> repoEscAliases;
748 std::list<RepoInfo> orphanedRepos;
749 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
752 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
754 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
756 _reposX.insert( repoInfo );
759 const std::string & serviceAlias( repoInfo.service() );
760 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
762 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
763 orphanedRepos.push_back( repoInfo );
767 repoEscAliases.push_back(repoInfo.escaped_alias());
771 if ( ! orphanedRepos.empty() )
773 for (
const auto & repoInfo : orphanedRepos )
775 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
781 % repoInfo.alias() );
783 removeRepository( repoInfo );
797 repoEscAliases.sort();
799 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, defaultCache.
repoRawCachePath, repoEscAliases );
800 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, defaultCache.
repoSolvCachePath, repoEscAliases );
801 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, defaultCache.
repoPackagesCachePath, repoEscAliases );
803 MIL <<
"end construct known repos" << endl;
810 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
811 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
816 repokind = probeCache( productdatapath );
819 switch ( repokind.
toEnum() )
822 status =
RepoStatus( productdatapath/
"repodata/repomd.xml");
826 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
845 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
850 repokind = probeCache( productdatapath );
856 switch ( repokind.
toEnum() )
859 p = Pathname(productdatapath +
"/repodata/repomd.xml");
863 p = Pathname(productdatapath +
"/content");
867 p = Pathname(productdatapath +
"/cookie");
885 MIL <<
"Going to try to check whether refresh is needed for " << url << endl;
888 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
890 RepoStatus oldstatus = metadataStatus( info );
892 if ( oldstatus.
empty() )
894 MIL <<
"No cached metadata, going to refresh" << endl;
895 return REFRESH_NEEDED;
901 MIL <<
"never refresh CD/DVD" << endl;
902 return REPO_UP_TO_DATE;
906 policy = RefreshIfNeededIgnoreDelay;
911 if (policy != RefreshForced && policy != RefreshIfNeededIgnoreDelay)
914 double diff = difftime(
920 DBG <<
"last refresh = " << diff <<
" minutes ago" << endl;
926 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
930 MIL <<
"Repository '" << info.
alias()
931 <<
"' has been refreshed less than repo.refresh.delay ("
933 <<
") minutes ago. Advising to skip refresh" << endl;
934 return REPO_CHECK_DELAYED;
942 repokind = probe( url, info.
path() );
946 switch ( repokind.
toEnum() )
963 newstatus =
RepoStatus( MediaMounter(url).getPathName(info.
path()) );
973 bool refresh =
false;
974 if ( oldstatus == newstatus )
976 MIL <<
"repo has not changed" << endl;
977 if ( policy == RefreshForced )
979 MIL <<
"refresh set to forced" << endl;
985 MIL <<
"repo has changed, going to refresh" << endl;
990 touchIndexFile(info);
992 return refresh ? REFRESH_NEEDED : REPO_UP_TO_DATE;
998 ERR <<
"refresh check failed for " << url << endl;
1002 return REFRESH_NEEDED;
1012 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1013 "Valid metadata not found at specified URLs",
1028 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1031 MIL <<
"Going to refresh metadata from " << url << endl;
1039 repokind = probe( *it, info.
path() );
1046 for_( it, repoBegin(), repoEnd() )
1048 if ( info.
alias() == (*it).alias() )
1051 modifiedrepo.
setType( repokind );
1052 modifyRepository( info.
alias(), modifiedrepo );
1059 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1070 Exception ex(
_(
"Can't create metadata cache directory."));
1078 shared_ptr<repo::Downloader> downloader_ptr;
1080 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1093 for_( it, repoBegin(), repoEnd() )
1095 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1096 if ( PathInfo(cachepath).isExist() )
1097 downloader_ptr->addCachePath(cachepath);
1100 downloader_ptr->download( media, tmpdir.
path() );
1104 MediaMounter media( url );
1107 Pathname productpath( tmpdir.
path() / info.
path() );
1127 ERR <<
"Trying another url..." << endl;
1136 ERR <<
"No more urls..." << endl;
1145 progress.
sendTo(progressfnc);
1155 progress.
sendTo(progressfnc);
1165 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1166 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1173 RepoStatus raw_metadata_status = metadataStatus(info);
1174 if ( raw_metadata_status.
empty() )
1179 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1180 raw_metadata_status = metadataStatus(info);
1183 bool needs_cleaning =
false;
1184 if ( isCached( info ) )
1186 MIL << info.
alias() <<
" is already cached." << endl;
1189 if ( cache_status == raw_metadata_status )
1191 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1192 if ( policy == BuildIfNeeded )
1195 const Pathname & base = solv_path_for_repoinfo( _options, info);
1196 if ( ! PathInfo(base/
"solv.idx").isExist() )
1202 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1206 needs_cleaning =
true;
1220 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1222 Pathname base = solv_path_for_repoinfo( _options, info);
1230 if( ! PathInfo(base).userMayW() )
1232 Exception ex(
str::form(
_(
"Can't create cache at %s - no writing permissions."), base.c_str()) );
1235 Pathname solvfile = base /
"solv";
1241 switch ( repokind.
toEnum() )
1245 repokind = probeCache( productdatapath );
1251 MIL <<
"repo type is " << repokind << endl;
1253 switch ( repokind.
toEnum() )
1261 scoped_ptr<MediaMounter> forPlainDirs;
1264 cmd.push_back(
"repo2solv.sh" );
1266 cmd.push_back(
"-o" );
1267 cmd.push_back( solvfile.asString() );
1268 cmd.push_back(
"-X" );
1272 forPlainDirs.reset(
new MediaMounter( *info.
baseUrlsBegin() ) );
1274 cmd.push_back(
"-R" );
1276 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1279 cmd.push_back( productdatapath.asString() );
1282 std::string errdetail;
1285 WAR <<
" " << output;
1286 if ( errdetail.empty() ) {
1290 errdetail += output;
1293 int ret = prog.
close();
1311 setCacheStatus(info, raw_metadata_status);
1312 MIL <<
"Commit cache.." << endl;
1327 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1333 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1345 bool gotMediaException =
false;
1353 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1360 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1362 gotMediaException =
true;
1369 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1376 DBG <<
"problem checking for content file" << endl;
1378 gotMediaException =
true;
1384 MediaMounter media( url );
1385 if ( PathInfo(media.getPathName()/path).isDir() )
1388 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1402 if (gotMediaException)
1405 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1416 MIL <<
"going to probe the cached repo at " << path_r << endl;
1420 if ( PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1422 else if ( PathInfo(path_r/
"/content").isFile() )
1424 else if ( PathInfo(path_r).isDir() )
1427 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1435 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1438 progress.
sendTo(progressrcv);
1441 std::list<Pathname> cachedirs;
1442 cachedirs.push_back(_options.repoRawCachePath);
1443 cachedirs.push_back(_options.repoPackagesCachePath);
1444 cachedirs.push_back(_options.repoSolvCachePath);
1446 for_( dir, cachedirs.begin(), cachedirs.end() )
1448 if ( PathInfo(*dir).isExist() )
1450 std::list<Pathname> entries;
1455 unsigned sdircount = entries.size();
1456 unsigned sdircurrent = 1;
1457 for_( subdir, entries.begin(), entries.end() )
1461 for_( r, repoBegin(), repoEnd() )
1462 if ( subdir->basename() == r->escaped_alias() )
1463 { found =
true;
break; }
1468 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1473 progress.
set( progress.
val() + 100 );
1483 progress.
sendTo(progressrcv);
1486 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1497 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1499 if ( ! PathInfo(solvfile).isExist() )
1524 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1525 cleanCache( info, progressrcv );
1526 buildCache( info, BuildIfNeeded, progressrcv );
1544 MIL <<
"Try adding repo " << info << endl;
1551 if ( _options.probe )
1553 DBG <<
"unknown repository type, probing" << endl;
1571 Pathname repofile = generateNonExistingName(
1572 _options.knownReposPath, generateFilename(tosave));
1574 MIL <<
"Saving repo in " << repofile << endl;
1576 std::ofstream file(repofile.c_str());
1590 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1594 reposManip().insert(tosave);
1599 bool havePasswords =
false;
1601 if ( urlit->hasCredentialsInAuthority() )
1603 havePasswords =
true;
1607 if ( havePasswords )
1613 if (urlit->hasCredentialsInAuthority())
1621 MIL <<
"done" << endl;
1628 for ( std::list<RepoInfo>::const_iterator it = repos.begin();
1633 for_ ( kit, repoBegin(), repoEnd() )
1635 if ( (*it).alias() == (*kit).alias() )
1637 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1643 std::string filename = Pathname(url.
getPathName()).basename();
1645 if ( filename == Pathname() )
1654 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1656 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1658 std::ofstream file(repofile.c_str());
1665 for ( std::list<RepoInfo>::iterator it = repos.begin();
1669 MIL <<
"Saving " << (*it).alias() << endl;
1670 it->setFilepath(repofile.asString());
1671 it->dumpAsIniOn(file);
1672 reposManip().insert(*it);
1677 MIL <<
"done" << endl;
1689 MIL <<
"Going to delete repo " << info.
alias() << endl;
1691 for_( it, repoBegin(), repoEnd() )
1696 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1711 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1712 if ( (filerepos.size() == 1) && ( filerepos.front().alias() == todelete.
alias() ) )
1720 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1732 std::ofstream file(todelete.
filepath().c_str());
1738 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1739 fit != filerepos.end();
1742 if ( (*fit).alias() != todelete.
alias() )
1743 (*fit).dumpAsIniOn(file);
1751 if ( isCached(todelete) )
1752 cleanCache( todelete, cSubprogrcv);
1754 cleanMetadata( todelete, mSubprogrcv );
1755 cleanPackages( todelete, pSubprogrcv );
1756 reposManip().erase(todelete);
1757 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1771 RepoInfo toedit = getRepositoryInfo(alias);
1775 if ( alias != newinfo.
alias() && hasRepo( newinfo.
alias() ) )
1787 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1797 std::ofstream file(toedit.
filepath().c_str());
1803 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1804 fit != filerepos.end();
1809 if ( (*fit).alias() != toedit.
alias() )
1810 (*fit).dumpAsIniOn(file);
1818 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1819 if ( PathInfo(solvidx).isExist() )
1824 reposManip().erase(toedit);
1825 reposManip().insert(newinfo);
1827 MIL <<
"repo " << alias <<
" modified" << endl;
1836 if ( it !=
repos().end() )
1846 for_( it, repoBegin(), repoEnd() )
1848 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1850 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1867 assert_alias( service );
1870 if ( hasService( service.
alias() ) )
1876 saveService( toSave );
1889 MIL <<
"added service " << toSave.
alias() << endl;
1896 MIL <<
"Going to delete service " << alias << endl;
1898 const ServiceInfo & service = getService( alias );
1900 Pathname location = service.
filepath();
1901 if( location.empty() )
1910 if ( tmpSet.size() == 1 )
1917 MIL << alias <<
" successfully deleted." << endl;
1923 std::ofstream file(location.c_str());
1930 for_(it, tmpSet.begin(), tmpSet.end())
1932 if( it->alias() != alias )
1933 it->dumpAsIniOn(file);
1936 MIL << alias <<
" successfully deleted from file " << location << endl;
1940 RepoCollector rcollector;
1941 getRepositoriesInService( alias,
1942 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
1944 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
1945 removeRepository(*rit);
1954 ServiceSet services( serviceBegin(), serviceEnd() );
1955 for_( it, services.begin(), services.end() )
1957 if ( !it->enabled() )
1961 refreshService(*it, options_r);
1971 assert_alias( service );
1972 assert_url( service );
1973 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
1975 if ( service.
ttl() && !options_r.testFlag( RefreshService_forceRefresh ) )
1984 if ( (lrf+=service.
ttl()) > now )
1986 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
1991 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
1998 bool serviceModified =
false;
2009 serviceModified =
true;
2014 std::string servicesTargetDistro = _options.servicesTargetDistro;
2015 if ( servicesTargetDistro.empty() )
2019 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2023 RepoCollector collector(servicesTargetDistro);
2030 ServiceRepos( service, bind( &RepoCollector::collect, &collector, _1 ) );
2035 uglyHack.first =
true;
2036 uglyHack.second = e;
2038 if ( service.
ttl() != origTtl )
2040 if ( !service.
ttl() )
2042 serviceModified =
true;
2050 for_( it, collector.repos.begin(), collector.repos.end() )
2053 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2055 it->setService( service.
alias() );
2058 newRepoStates[it->alias()] = *it;
2062 if ( it->baseUrlsEmpty() )
2072 if ( !it->path().empty() )
2081 it->setBaseUrl( url );
2087 RepoInfoList oldRepos;
2088 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2092 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2094 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2096 if ( oldRepo->enabled() )
2099 const auto & last = service.
repoStates().find( oldRepo->alias() );
2100 if ( last != service.
repoStates().end() && ! last->second.enabled )
2102 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2104 serviceModified =
true;
2107 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2110 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2112 removeRepository( *oldRepo );
2118 for_( it, collector.repos.begin(), collector.repos.end() )
2124 TriBool toBeEnabled( indeterminate );
2125 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2127 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2129 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2141 DBG <<
"User request to enable service repo " << it->alias() << endl;
2147 serviceModified =
true;
2151 DBG <<
"User request to disable service repo " << it->alias() << endl;
2152 toBeEnabled =
false;
2156 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2157 if ( oldRepo == oldRepos.end() )
2162 if ( ! indeterminate(toBeEnabled) )
2163 it->setEnabled( toBeEnabled );
2165 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2166 addRepository( *it );
2171 bool oldRepoModified =
false;
2173 if ( indeterminate(toBeEnabled) )
2177 if ( oldRepo->enabled() == it->enabled() )
2178 toBeEnabled = it->enabled();
2179 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2181 toBeEnabled = it->enabled();
2182 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2186 const auto & last = service.
repoStates().find( oldRepo->alias() );
2187 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2188 toBeEnabled = it->enabled();
2191 toBeEnabled = oldRepo->enabled();
2192 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2198 if ( toBeEnabled == oldRepo->enabled() )
2200 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2202 else if ( toBeEnabled )
2204 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2205 oldRepo->setEnabled(
true );
2206 oldRepoModified =
true;
2210 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2211 oldRepo->setEnabled(
false );
2212 oldRepoModified =
true;
2218 if ( oldRepo->rawName() != it->rawName() )
2220 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2221 oldRepo->setName( it->rawName() );
2222 oldRepoModified =
true;
2226 if ( oldRepo->autorefresh() != it->autorefresh() )
2228 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2229 oldRepo->setAutorefresh( it->autorefresh() );
2230 oldRepoModified =
true;
2234 if ( oldRepo->priority() != it->priority() )
2236 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2237 oldRepo->setPriority( it->priority() );
2238 oldRepoModified =
true;
2243 if ( oldRepo->rawUrl() != it->rawUrl() )
2245 DBG <<
"Service repo " << it->alias() <<
" gets new URL " << it->rawUrl() << endl;
2246 oldRepo->setBaseUrl( it->rawUrl() );
2247 oldRepoModified =
true;
2256 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2257 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2258 #define Z_CHKGPG(I,N) \
2259 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2261 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2262 oldRepo->set##N##Check( ngpg[I] ); \
2263 oldRepoModified = true; \
2272 if ( oldRepoModified )
2274 modifyRepository( oldRepo->alias(), *oldRepo );
2283 serviceModified =
true;
2290 serviceModified =
true;
2297 if ( service.
ttl() )
2300 serviceModified =
true;
2303 if ( serviceModified )
2306 modifyService( service.
alias(), service );
2310 if ( uglyHack.first )
2312 throw( uglyHack.second );
2320 MIL <<
"Going to modify service " << oldAlias << endl;
2331 const ServiceInfo & oldService = getService(oldAlias);
2333 Pathname location = oldService.
filepath();
2334 if( location.empty() )
2344 std::ofstream file(location.c_str());
2345 for_(it, tmpSet.begin(), tmpSet.end())
2347 if( *it != oldAlias )
2348 it->dumpAsIniOn(file);
2358 if ( oldAlias != service.
alias()
2361 std::vector<RepoInfo> toModify;
2362 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2363 for_( it, toModify.begin(), toModify.end() )
2370 const auto & last = service.
repoStates().find( it->alias() );
2372 it->setEnabled( last->second.enabled );
2375 it->setEnabled(
false );
2378 if ( oldAlias != service.
alias() )
2379 it->setService(service.
alias());
2381 modifyRepository(it->alias(), *it);
2425 : _pimpl( new
Impl(opt) )
2457 std::string host( url_r.
getHost() );
2458 if ( ! host.empty() )
2580 {
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)
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 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
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...
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)
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.
bool hasCredentialsInAuthority() const
Returns true if username and password are encoded in the authority component.
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