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() ) );
801 for (
const std::string & old : oldfiles )
813 MIL <<
"start construct known repos" << endl;
815 if ( PathInfo(_options.knownReposPath).isExist() )
817 std::list<std::string> repoEscAliases;
818 std::list<RepoInfo> orphanedRepos;
819 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
822 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
824 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
826 _reposX.insert( repoInfo );
829 const std::string & serviceAlias( repoInfo.service() );
830 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
832 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
833 orphanedRepos.push_back( repoInfo );
837 repoEscAliases.push_back(repoInfo.escaped_alias());
841 if ( ! orphanedRepos.empty() )
843 for (
const auto & repoInfo : orphanedRepos )
845 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
851 % repoInfo.alias() );
853 removeRepository( repoInfo );
867 repoEscAliases.sort();
869 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, defaultCache.
repoRawCachePath, repoEscAliases );
870 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, defaultCache.
repoSolvCachePath, repoEscAliases );
871 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, defaultCache.
repoPackagesCachePath, repoEscAliases );
873 MIL <<
"end construct known repos" << endl;
880 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
881 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
886 repokind = probeCache( productdatapath );
889 switch ( repokind.
toEnum() )
892 status =
RepoStatus( productdatapath/
"repodata/repomd.xml");
896 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
915 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
920 repokind = probeCache( productdatapath );
926 switch ( repokind.
toEnum() )
929 p = Pathname(productdatapath +
"/repodata/repomd.xml");
933 p = Pathname(productdatapath +
"/content");
937 p = Pathname(productdatapath +
"/cookie");
955 MIL <<
"Going to try to check whether refresh is needed for " << url << endl;
958 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
960 RepoStatus oldstatus = metadataStatus( info );
962 if ( oldstatus.
empty() )
964 MIL <<
"No cached metadata, going to refresh" << endl;
965 return REFRESH_NEEDED;
971 MIL <<
"never refresh CD/DVD" << endl;
972 return REPO_UP_TO_DATE;
976 policy = RefreshIfNeededIgnoreDelay;
981 if (policy != RefreshForced && policy != RefreshIfNeededIgnoreDelay)
984 double diff = difftime(
990 DBG <<
"last refresh = " << diff <<
" minutes ago" << endl;
996 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1000 MIL <<
"Repository '" << info.
alias()
1001 <<
"' has been refreshed less than repo.refresh.delay ("
1003 <<
") minutes ago. Advising to skip refresh" << endl;
1004 return REPO_CHECK_DELAYED;
1012 repokind = probe( url, info.
path() );
1016 switch ( repokind.
toEnum() )
1033 newstatus =
RepoStatus( MediaMounter(url).getPathName(info.
path()) );
1043 bool refresh =
false;
1044 if ( oldstatus == newstatus )
1046 MIL <<
"repo has not changed" << endl;
1047 if ( policy == RefreshForced )
1049 MIL <<
"refresh set to forced" << endl;
1055 MIL <<
"repo has changed, going to refresh" << endl;
1060 touchIndexFile(info);
1062 return refresh ? REFRESH_NEEDED : REPO_UP_TO_DATE;
1068 ERR <<
"refresh check failed for " << url << endl;
1072 return REFRESH_NEEDED;
1082 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1083 "Valid metadata not found at specified URLs",
1098 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1101 MIL <<
"Going to refresh metadata from " << url << endl;
1109 repokind = probe( *it, info.
path() );
1116 for_( it, repoBegin(), repoEnd() )
1118 if ( info.
alias() == (*it).alias() )
1121 modifiedrepo.
setType( repokind );
1122 modifyRepository( info.
alias(), modifiedrepo );
1129 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1140 Exception ex(
_(
"Can't create metadata cache directory."));
1148 shared_ptr<repo::Downloader> downloader_ptr;
1150 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1163 for_( it, repoBegin(), repoEnd() )
1165 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1166 if ( PathInfo(cachepath).isExist() )
1167 downloader_ptr->addCachePath(cachepath);
1170 downloader_ptr->download( media, tmpdir.
path() );
1174 MediaMounter media( url );
1177 Pathname productpath( tmpdir.
path() / info.
path() );
1197 ERR <<
"Trying another url..." << endl;
1206 ERR <<
"No more urls..." << endl;
1215 progress.
sendTo(progressfnc);
1225 progress.
sendTo(progressfnc);
1235 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1236 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1243 RepoStatus raw_metadata_status = metadataStatus(info);
1244 if ( raw_metadata_status.
empty() )
1249 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1250 raw_metadata_status = metadataStatus(info);
1253 bool needs_cleaning =
false;
1254 if ( isCached( info ) )
1256 MIL << info.
alias() <<
" is already cached." << endl;
1259 if ( cache_status == raw_metadata_status )
1261 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1262 if ( policy == BuildIfNeeded )
1265 const Pathname & base = solv_path_for_repoinfo( _options, info);
1266 if ( ! PathInfo(base/
"solv.idx").isExist() )
1272 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1276 needs_cleaning =
true;
1290 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1292 Pathname base = solv_path_for_repoinfo( _options, info);
1300 if( ! PathInfo(base).userMayW() )
1302 Exception ex(
str::form(
_(
"Can't create cache at %s - no writing permissions."), base.c_str()) );
1305 Pathname solvfile = base /
"solv";
1311 switch ( repokind.
toEnum() )
1315 repokind = probeCache( productdatapath );
1321 MIL <<
"repo type is " << repokind << endl;
1323 switch ( repokind.
toEnum() )
1331 scoped_ptr<MediaMounter> forPlainDirs;
1334 cmd.push_back(
"repo2solv.sh" );
1336 cmd.push_back(
"-o" );
1337 cmd.push_back( solvfile.asString() );
1338 cmd.push_back(
"-X" );
1342 forPlainDirs.reset(
new MediaMounter( *info.
baseUrlsBegin() ) );
1344 cmd.push_back(
"-R" );
1346 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1349 cmd.push_back( productdatapath.asString() );
1352 std::string errdetail;
1355 WAR <<
" " << output;
1356 if ( errdetail.empty() ) {
1360 errdetail += output;
1363 int ret = prog.
close();
1381 setCacheStatus(info, raw_metadata_status);
1382 MIL <<
"Commit cache.." << endl;
1397 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1403 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1415 bool gotMediaException =
false;
1423 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1430 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1432 gotMediaException =
true;
1439 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1446 DBG <<
"problem checking for content file" << endl;
1448 gotMediaException =
true;
1454 MediaMounter media( url );
1455 if ( PathInfo(media.getPathName()/path).isDir() )
1458 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1472 if (gotMediaException)
1475 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1486 MIL <<
"going to probe the cached repo at " << path_r << endl;
1490 if ( PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1492 else if ( PathInfo(path_r/
"/content").isFile() )
1494 else if ( PathInfo(path_r).isDir() )
1497 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1505 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1508 progress.
sendTo(progressrcv);
1511 std::list<Pathname> cachedirs;
1512 cachedirs.push_back(_options.repoRawCachePath);
1513 cachedirs.push_back(_options.repoPackagesCachePath);
1514 cachedirs.push_back(_options.repoSolvCachePath);
1516 for_( dir, cachedirs.begin(), cachedirs.end() )
1518 if ( PathInfo(*dir).isExist() )
1520 std::list<Pathname> entries;
1525 unsigned sdircount = entries.size();
1526 unsigned sdircurrent = 1;
1527 for_( subdir, entries.begin(), entries.end() )
1531 for_( r, repoBegin(), repoEnd() )
1532 if ( subdir->basename() == r->escaped_alias() )
1533 { found =
true;
break; }
1538 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1543 progress.
set( progress.
val() + 100 );
1553 progress.
sendTo(progressrcv);
1556 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1567 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1569 if ( ! PathInfo(solvfile).isExist() )
1594 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1595 cleanCache( info, progressrcv );
1596 buildCache( info, BuildIfNeeded, progressrcv );
1614 MIL <<
"Try adding repo " << info << endl;
1621 if ( _options.probe )
1623 DBG <<
"unknown repository type, probing" << endl;
1641 Pathname repofile = generateNonExistingName(
1642 _options.knownReposPath, generateFilename(tosave));
1644 MIL <<
"Saving repo in " << repofile << endl;
1646 std::ofstream file(repofile.c_str());
1660 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1664 reposManip().insert(tosave);
1669 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1674 MIL <<
"done" << endl;
1681 for ( std::list<RepoInfo>::const_iterator it = repos.begin();
1686 for_ ( kit, repoBegin(), repoEnd() )
1688 if ( (*it).alias() == (*kit).alias() )
1690 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1696 std::string filename = Pathname(url.
getPathName()).basename();
1698 if ( filename == Pathname() )
1707 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1709 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1711 std::ofstream file(repofile.c_str());
1718 for ( std::list<RepoInfo>::iterator it = repos.begin();
1722 MIL <<
"Saving " << (*it).alias() << endl;
1723 it->setFilepath(repofile.asString());
1724 it->dumpAsIniOn(file);
1725 reposManip().insert(*it);
1730 MIL <<
"done" << endl;
1742 MIL <<
"Going to delete repo " << info.
alias() << endl;
1744 for_( it, repoBegin(), repoEnd() )
1749 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1764 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1765 if ( filerepos.size() == 0
1766 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1770 if ( ! ( ret == 0 || ret == ENOENT ) )
1775 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1787 std::ofstream file(todelete.
filepath().c_str());
1793 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1794 fit != filerepos.end();
1797 if ( (*fit).alias() != todelete.
alias() )
1798 (*fit).dumpAsIniOn(file);
1806 if ( isCached(todelete) )
1807 cleanCache( todelete, cSubprogrcv);
1809 cleanMetadata( todelete, mSubprogrcv );
1810 cleanPackages( todelete, pSubprogrcv );
1811 reposManip().erase(todelete);
1812 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1826 RepoInfo toedit = getRepositoryInfo(alias);
1830 if ( alias != newinfo.
alias() && hasRepo( newinfo.
alias() ) )
1842 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1852 std::ofstream file(toedit.
filepath().c_str());
1858 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1859 fit != filerepos.end();
1864 if ( (*fit).alias() != toedit.
alias() )
1865 (*fit).dumpAsIniOn(file);
1873 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1874 if ( PathInfo(solvidx).isExist() )
1879 reposManip().erase(toedit);
1880 reposManip().insert(newinfo);
1882 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1884 MIL <<
"repo " << alias <<
" modified" << endl;
1893 if ( it !=
repos().end() )
1903 for_( it, repoBegin(), repoEnd() )
1905 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1907 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1924 assert_alias( service );
1927 if ( hasService( service.
alias() ) )
1933 saveService( toSave );
1937 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1939 MIL <<
"added service " << toSave.
alias() << endl;
1946 MIL <<
"Going to delete service " << alias << endl;
1948 const ServiceInfo & service = getService( alias );
1950 Pathname location = service.
filepath();
1951 if( location.empty() )
1960 if ( tmpSet.size() == 1 )
1967 MIL << alias <<
" successfully deleted." << endl;
1973 std::ofstream file(location.c_str());
1980 for_(it, tmpSet.begin(), tmpSet.end())
1982 if( it->alias() != alias )
1983 it->dumpAsIniOn(file);
1986 MIL << alias <<
" successfully deleted from file " << location << endl;
1990 RepoCollector rcollector;
1991 getRepositoriesInService( alias,
1992 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
1994 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
1995 removeRepository(*rit);
2004 ServiceSet services( serviceBegin(), serviceEnd() );
2005 for_( it, services.begin(), services.end() )
2007 if ( !it->enabled() )
2011 refreshService(*it, options_r);
2021 assert_alias( service );
2022 assert_url( service );
2023 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2025 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2034 if ( (lrf+=service.
ttl()) > now )
2036 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2041 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2048 bool serviceModified =
false;
2059 serviceModified =
true;
2064 std::string servicesTargetDistro = _options.servicesTargetDistro;
2065 if ( servicesTargetDistro.empty() )
2069 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2073 RepoCollector collector(servicesTargetDistro);
2080 ServiceRepos( service, bind( &RepoCollector::collect, &collector, _1 ) );
2085 uglyHack.first =
true;
2086 uglyHack.second = e;
2088 if ( service.
ttl() != origTtl )
2090 if ( !service.
ttl() )
2092 serviceModified =
true;
2100 for_( it, collector.repos.begin(), collector.repos.end() )
2103 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2105 it->setService( service.
alias() );
2108 newRepoStates[it->alias()] = *it;
2116 if ( !it->path().empty() )
2118 if ( it->path() !=
"/" )
2123 if ( it->baseUrlsEmpty() )
2126 if ( !path.empty() )
2128 it->setBaseUrl( std::move(url) );
2130 else if ( !path.empty() )
2133 for (
Url & url : urls )
2137 it->setBaseUrls( std::move(urls) );
2144 RepoInfoList oldRepos;
2145 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2149 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2151 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2153 if ( oldRepo->enabled() )
2156 const auto & last = service.
repoStates().find( oldRepo->alias() );
2157 if ( last != service.
repoStates().end() && ! last->second.enabled )
2159 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2161 serviceModified =
true;
2164 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2167 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2169 removeRepository( *oldRepo );
2175 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2176 for_( it, collector.repos.begin(), collector.repos.end() )
2182 TriBool toBeEnabled( indeterminate );
2183 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2185 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2187 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2199 DBG <<
"User request to enable service repo " << it->alias() << endl;
2205 serviceModified =
true;
2209 DBG <<
"User request to disable service repo " << it->alias() << endl;
2210 toBeEnabled =
false;
2214 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2215 if ( oldRepo == oldRepos.end() )
2220 if ( ! indeterminate(toBeEnabled) )
2221 it->setEnabled( toBeEnabled );
2223 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2224 addRepository( *it );
2229 bool oldRepoModified =
false;
2231 if ( indeterminate(toBeEnabled) )
2235 if ( oldRepo->enabled() == it->enabled() )
2236 toBeEnabled = it->enabled();
2237 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2239 toBeEnabled = it->enabled();
2240 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2244 const auto & last = service.
repoStates().find( oldRepo->alias() );
2245 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2246 toBeEnabled = it->enabled();
2249 toBeEnabled = oldRepo->enabled();
2250 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2256 if ( toBeEnabled == oldRepo->enabled() )
2258 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2260 else if ( toBeEnabled )
2262 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2263 oldRepo->setEnabled(
true );
2264 oldRepoModified =
true;
2268 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2269 oldRepo->setEnabled(
false );
2270 oldRepoModified =
true;
2276 if ( oldRepo->rawName() != it->rawName() )
2278 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2279 oldRepo->setName( it->rawName() );
2280 oldRepoModified =
true;
2284 if ( oldRepo->autorefresh() != it->autorefresh() )
2286 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2287 oldRepo->setAutorefresh( it->autorefresh() );
2288 oldRepoModified =
true;
2292 if ( oldRepo->priority() != it->priority() )
2294 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2295 oldRepo->setPriority( it->priority() );
2296 oldRepoModified =
true;
2302 urlCredentialExtractor.extract( newUrls );
2303 if ( oldRepo->rawBaseUrls() != newUrls )
2305 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2306 oldRepo->setBaseUrls( std::move(newUrls) );
2307 oldRepoModified =
true;
2317 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2318 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2319 #define Z_CHKGPG(I,N) \
2320 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2322 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2323 oldRepo->set##N##Check( ngpg[I] ); \
2324 oldRepoModified = true; \
2333 if ( oldRepoModified )
2335 modifyRepository( oldRepo->alias(), *oldRepo );
2344 serviceModified =
true;
2351 serviceModified =
true;
2358 if ( service.
ttl() )
2361 serviceModified =
true;
2364 if ( serviceModified )
2367 modifyService( service.
alias(), service );
2371 if ( uglyHack.first )
2373 throw( uglyHack.second );
2381 MIL <<
"Going to modify service " << oldAlias << endl;
2392 const ServiceInfo & oldService = getService(oldAlias);
2394 Pathname location = oldService.
filepath();
2395 if( location.empty() )
2405 std::ofstream file(location.c_str());
2406 for_(it, tmpSet.begin(), tmpSet.end())
2408 if( *it != oldAlias )
2409 it->dumpAsIniOn(file);
2418 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2422 if ( oldAlias != service.
alias()
2425 std::vector<RepoInfo> toModify;
2426 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2427 for_( it, toModify.begin(), toModify.end() )
2434 const auto & last = service.
repoStates().find( it->alias() );
2436 it->setEnabled( last->second.enabled );
2439 it->setEnabled(
false );
2442 if ( oldAlias != service.
alias() )
2443 it->setService(service.
alias());
2445 modifyRepository(it->alias(), *it);
2489 : _pimpl( new
Impl(opt) )
2521 std::string host( url_r.
getHost() );
2522 if ( ! host.empty() )
2644 {
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 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...
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.
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