21 #include <solv/solvversion.h>
61 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc()
73 const char * env = getenv(
"ZYPP_PLUGIN_APPDATA_FORCE_COLLECT");
103 class UrlCredentialExtractor
106 UrlCredentialExtractor( Pathname & root_r )
110 ~~UrlCredentialExtractor()
114 bool collect(
const Url & url_r )
116 bool ret = url_r.hasCredentialsInAuthority();
120 _cmPtr->addUserCred( url_r );
125 template<
class TContainer>
126 bool collect(
const TContainer & urls_r )
127 {
bool ret =
false;
for (
const Url &
url : urls_r ) {
if ( collect(
url ) && !ret ) ret =
true; }
return ret; }
130 bool extract( Url & url_r )
132 bool ret = collect( url_r );
134 url_r.setPassword( std::string() );
138 template<
class TContainer>
139 bool extract( TContainer & urls_r )
140 {
bool ret =
false;
for ( Url &
url : urls_r ) {
if ( extract(
url ) && !ret ) ret =
true; }
return ret; }
144 scoped_ptr<media::CredentialManager>
_cmPtr;
159 MediaMounter(
const Url & url_r )
161 media::MediaManager mediamanager;
162 _mid = mediamanager.open( url_r );
163 mediamanager.attach(
_mid );
169 media::MediaManager mediamanager;
170 mediamanager.release(
_mid );
171 mediamanager.close(
_mid );
178 Pathname getPathName(
const Pathname & path_r = Pathname() )
const
180 media::MediaManager mediamanager;
181 return mediamanager.localPath(
_mid, path_r );
190 template <
class Iterator>
191 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
193 for_( it, begin_r, end_r )
194 if ( it->alias() == alias_r )
199 template <
class Container>
200 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
201 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
204 template <
class Iterator>
205 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
207 for_( it, begin_r, end_r )
208 if ( it->alias() == alias_r )
213 template <
class Container>
214 inline typename Container::iterator findAlias(
const std::string & alias_r, Container & cont_r )
215 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
217 template <
class Container>
218 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
219 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
223 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
225 std::string filename( alias_r );
229 filename = Pathname(filename).extend(
"."+stem_r).asString();
230 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
254 RepoCollector(
const std::string & targetDistro_)
258 bool collect(
const RepoInfo &repo )
262 && !repo.targetDistribution().empty()
266 <<
"Skipping repository meant for '" << repo.targetDistribution()
267 <<
"' distribution (current distro is '"
273 repos.push_back(repo);
287 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
289 MIL <<
"repo file: " << file << endl;
290 RepoCollector collector;
291 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
292 return std::move(collector.repos);
305 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
307 MIL <<
"directory " << dir << endl;
308 std::list<RepoInfo>
repos;
309 bool nonroot( geteuid() != 0 );
310 if ( nonroot && ! PathInfo(dir).userMayRX() )
312 JobReport::warning( str::Format(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
316 std::list<Pathname> entries;
323 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
324 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
328 if ( nonroot && ! PathInfo(*it).userMayR() )
330 JobReport::warning( str::Format(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
334 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
335 repos.insert(
repos.end(), tmp.begin(), tmp.end() );
345 inline void assert_alias(
const RepoInfo & info )
347 if ( info.alias().empty() )
351 if ( info.alias()[0] ==
'.')
353 info,
_(
"Repository alias cannot start with dot.")));
356 inline void assert_alias(
const ServiceInfo & info )
358 if ( info.alias().empty() )
362 if ( info.alias()[0] ==
'.')
364 info,
_(
"Service alias cannot start with dot.")));
369 inline void assert_urls(
const RepoInfo & info )
371 if ( info.baseUrlsEmpty() )
375 inline void assert_url(
const ServiceInfo & info )
377 if ( ! info.url().isValid() )
387 inline bool isTmpRepo(
const RepoInfo & info_r )
388 {
return( info_r.filepath().empty() && info_r.usesAutoMethadataPaths() ); }
396 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
399 return isTmpRepo( info ) ? info.metadataPath() : opt.repoRawCachePath / info.escaped_alias();
410 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
411 {
return rawcache_path_for_repoinfo( opt, info ) / info.path(); }
416 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
419 return isTmpRepo( info ) ? info.packagesPath() : opt.repoPackagesCachePath / info.escaped_alias();
425 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
428 return isTmpRepo( info ) ? info.metadataPath().dirname() /
"%SLV%" : opt.repoSolvCachePath / info.escaped_alias();
434 class ServiceCollector
437 typedef std::set<ServiceInfo> ServiceSet;
439 ServiceCollector( ServiceSet & services_r )
443 bool operator()(
const ServiceInfo & service_r )
const
461 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
463 return repositories_in_file(local);
502 #define OUTS(X) str << " " #X "\t" << obj.X << endl
503 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
504 OUTS( repoRawCachePath );
505 OUTS( repoSolvCachePath );
506 OUTS( repoPackagesCachePath );
507 OUTS( knownReposPath );
508 OUTS( knownServicesPath );
537 std::list<Pathname> entries;
539 if ( ! entries.empty() )
542 cmd.push_back(
"<" );
543 cmd.push_back(
">" );
544 cmd.push_back(
"PROGRAM" );
545 for (
const auto & rinfo :
repos() )
547 if ( ! rinfo.enabled() )
549 cmd.push_back(
"-R" );
550 cmd.push_back( rinfo.alias() );
551 cmd.push_back(
"-t" );
552 cmd.push_back( rinfo.type().asString() );
553 cmd.push_back(
"-p" );
554 cmd.push_back( rinfo.metadataPath().asString() );
557 for_( it, entries.begin(), entries.end() )
580 bool hasRepo(
const std::string & alias )
const
581 {
return foundAliasIn( alias,
repos() ); }
591 {
return rawcache_path_for_repoinfo(
_options, info ); }
594 {
return packagescache_path_for_repoinfo(
_options, info ); }
641 {
return foundAliasIn( alias,
_services ); }
674 {
return filenameFromAlias( info.
alias(),
"repo" ); }
677 {
return filenameFromAlias( info.
alias(),
"service" ); }
688 template<
typename OutputIterator>
693 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
712 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
715 {
return new Impl( *
this ); }
721 {
return str <<
"RepoManager::Impl"; }
732 MIL <<
"saving service in " << servfile << endl;
734 std::ofstream file( servfile.
c_str() );
741 MIL <<
"done" << endl;
760 const std::string & basefilename )
const
762 std::string final_filename = basefilename;
764 while (
PathInfo(dir + final_filename).isExist() )
769 return dir +
Pathname(final_filename);
776 Pathname dir = _options.knownServicesPath;
777 std::list<Pathname> entries;
787 for_(it, entries.begin(), entries.end() )
803 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
804 const Pathname & defaultCachePath_r,
805 const std::list<std::string> & repoEscAliases_r )
807 if ( cachePath_r != defaultCachePath_r )
810 std::list<std::string> entries;
814 std::set<std::string> oldfiles;
815 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
816 std::inserter( oldfiles, oldfiles.end() ) );
822 for (
const std::string & old : oldfiles )
826 pi( cachePath_r/old );
838 MIL <<
"start construct known repos" << endl;
842 std::list<std::string> repoEscAliases;
843 std::list<RepoInfo> orphanedRepos;
844 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
847 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
849 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
851 _reposX.insert( repoInfo );
854 const std::string & serviceAlias( repoInfo.service() );
855 if ( ! ( serviceAlias.empty() ||
hasService( serviceAlias ) ) )
857 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
858 orphanedRepos.push_back( repoInfo );
862 repoEscAliases.push_back(repoInfo.escaped_alias());
866 if ( ! orphanedRepos.empty() )
868 for (
const auto & repoInfo : orphanedRepos )
870 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
876 % repoInfo.alias() );
892 repoEscAliases.sort();
893 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath,
896 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath,
899 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath,
903 MIL <<
"end construct known repos" << endl;
910 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
911 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
915 if ( repokind == RepoType::NONE )
916 repokind = probeCache( productdatapath );
923 switch ( repokind.
toEnum() )
925 case RepoType::RPMMD_e :
926 status =
RepoStatus( productdatapath/
"repodata/repomd.xml") &&
RepoStatus( mediarootpath/
"media.1/media" );
929 case RepoType::YAST2_e :
930 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
933 case RepoType::RPMPLAINDIR_e :
937 case RepoType::NONE_e :
944 if ( ! status.
empty() )
953 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
956 if ( repokind.
toEnum() == RepoType::NONE_e )
958 repokind = probeCache( productdatapath );
960 if (repokind == RepoType::NONE_e)
964 switch ( repokind.
toEnum() )
966 case RepoType::RPMMD_e :
967 p =
Pathname(productdatapath +
"/repodata/repomd.xml");
970 case RepoType::YAST2_e :
971 p =
Pathname(productdatapath +
"/content");
974 case RepoType::RPMPLAINDIR_e :
975 p =
Pathname(productdatapath +
"/cookie");
978 case RepoType::NONE_e :
993 MIL <<
"Check if to refresh repo " << info.
alias() <<
" at " <<
url <<
" (" << info.
type() <<
")" << endl;
996 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1000 if ( oldstatus.
empty() )
1002 MIL <<
"No cached metadata, going to refresh" << endl;
1006 if (
url.schemeIsVolatile() )
1008 MIL <<
"Never refresh CD/DVD" << endl;
1014 MIL <<
"Forced refresh!" << endl;
1018 if (
url.schemeIsLocal() )
1031 if ( oldstatus == cachestatus )
1039 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1043 MIL <<
"Repository '" << info.
alias()
1044 <<
"' has been refreshed less than repo.refresh.delay ("
1046 <<
") minutes ago. Advising to skip refresh" << endl;
1052 MIL <<
"Metadata and solv cache don't match. Check data on server..." << endl;
1058 if ( repokind == RepoType::NONE )
1063 switch ( repokind.
toEnum() )
1065 case RepoType::RPMMD_e:
1072 case RepoType::YAST2_e:
1079 case RepoType::RPMPLAINDIR_e:
1084 case RepoType::NONE_e:
1090 if ( oldstatus == newstatus )
1092 MIL <<
"repo has not changed" << endl;
1093 touchIndexFile( info );
1098 MIL <<
"repo has changed, going to refresh" << endl;
1105 ERR <<
"refresh check failed for " <<
url << endl;
1119 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1120 "Valid metadata not found at specified URLs",
1137 MIL <<
"Going to refresh metadata from " <<
url << endl;
1145 if ( repokind != probed )
1151 if ( info.
alias() == (*it).alias() )
1154 modifiedrepo.
setType( repokind );
1164 if ( repokind.
toEnum() == RepoType::NONE_e )
1168 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1179 Exception ex(
_(
"Can't create metadata cache directory."));
1183 if ( ( repokind.
toEnum() == RepoType::RPMMD_e ) ||
1184 ( repokind.
toEnum() == RepoType::YAST2_e ) )
1187 shared_ptr<repo::Downloader> downloader_ptr;
1189 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1191 if ( repokind.
toEnum() == RepoType::RPMMD_e )
1204 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1205 if (
PathInfo(cachepath).isExist() )
1206 downloader_ptr->addCachePath(cachepath);
1209 downloader_ptr->download( media, tmpdir.
path() );
1211 else if ( repokind.
toEnum() == RepoType::RPMPLAINDIR_e )
1214 MediaMounter media(
url );
1229 if ( ! isTmpRepo( info ) )
1238 ERR <<
"Trying another url..." << endl;
1250 ERR <<
"No more urls..." << endl;
1259 progress.
sendTo(progressfnc);
1269 progress.
sendTo(progressfnc);
1279 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1280 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1288 if ( raw_metadata_status.
empty() )
1297 bool needs_cleaning =
false;
1300 MIL << info.
alias() <<
" is already cached." << endl;
1303 if ( cache_status == raw_metadata_status )
1305 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1309 const Pathname & base = solv_path_for_repoinfo( _options, info);
1310 if ( !
PathInfo(base/
"solv.idx").isExist() )
1316 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1320 needs_cleaning =
true;
1334 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1336 Pathname base = solv_path_for_repoinfo( _options, info);
1355 switch ( repokind.
toEnum() )
1357 case RepoType::NONE_e:
1359 repokind = probeCache( productdatapath );
1365 MIL <<
"repo type is " << repokind << endl;
1367 switch ( repokind.
toEnum() )
1369 case RepoType::RPMMD_e :
1370 case RepoType::YAST2_e :
1371 case RepoType::RPMPLAINDIR_e :
1375 scoped_ptr<MediaMounter> forPlainDirs;
1378 cmd.push_back(
PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1380 cmd.push_back(
"-o" );
1381 cmd.push_back( solvfile.
asString() );
1382 cmd.push_back(
"-X" );
1385 if ( repokind == RepoType::RPMPLAINDIR )
1387 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1389 cmd.push_back(
"-R" );
1391 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1394 cmd.push_back( productdatapath.
asString() );
1397 std::string errdetail;
1400 WAR <<
" " << output;
1401 if ( errdetail.empty() ) {
1405 errdetail += output;
1408 int ret = prog.
close();
1426 setCacheStatus(info, raw_metadata_status);
1427 MIL <<
"Commit cache.." << endl;
1442 MIL <<
"going to probe the repo type at " <<
url <<
" (" << path <<
")" << endl;
1448 MIL <<
"Probed type NONE (not exists) at " <<
url <<
" (" << path <<
")" << endl;
1460 bool gotMediaException =
false;
1468 MIL <<
"Probed type RPMMD at " <<
url <<
" (" << path <<
")" << endl;
1475 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1477 gotMediaException =
true;
1484 MIL <<
"Probed type YAST2 at " <<
url <<
" (" << path <<
")" << endl;
1491 DBG <<
"problem checking for content file" << endl;
1493 gotMediaException =
true;
1497 if ( !
url.schemeIsDownloading() )
1499 MediaMounter media(
url );
1503 MIL <<
"Probed type RPMPLAINDIR at " <<
url <<
" (" << path <<
")" << endl;
1517 if (gotMediaException)
1520 MIL <<
"Probed type NONE at " <<
url <<
" (" << path <<
")" << endl;
1531 MIL <<
"going to probe the cached repo at " << path_r << endl;
1535 if (
PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1537 else if (
PathInfo(path_r/
"/content").isFile() )
1539 else if (
PathInfo(path_r).isDir() )
1542 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1550 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1553 progress.
sendTo(progressrcv);
1556 std::list<Pathname> cachedirs;
1557 cachedirs.push_back(_options.repoRawCachePath);
1558 cachedirs.push_back(_options.repoPackagesCachePath);
1559 cachedirs.push_back(_options.repoSolvCachePath);
1561 for_( dir, cachedirs.begin(), cachedirs.end() )
1565 std::list<Pathname> entries;
1570 unsigned sdircount = entries.size();
1571 unsigned sdircurrent = 1;
1572 for_( subdir, entries.begin(), entries.end() )
1577 if ( subdir->basename() == r->escaped_alias() )
1578 { found =
true;
break; }
1583 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1588 progress.
set( progress.
val() + 100 );
1598 progress.
sendTo(progressrcv);
1601 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1612 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1614 if ( !
PathInfo(solvfile).isExist() )
1624 if ( toolversion != LIBSOLV_TOOLVERSION )
1633 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1653 MIL <<
"Try adding repo " << info << endl;
1660 if ( _options.probe )
1662 DBG <<
"unknown repository type, probing" << endl;
1663 assert_urls(tosave);
1666 if ( probedtype == RepoType::NONE )
1677 Pathname repofile = generateNonExistingName(
1678 _options.knownReposPath, generateFilename(tosave));
1680 MIL <<
"Saving repo in " << repofile << endl;
1682 std::ofstream file(repofile.
c_str());
1691 tosave.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1692 tosave.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1698 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1699 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1701 reposManip().insert(tosave);
1706 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1711 MIL <<
"done" << endl;
1718 for ( std::list<RepoInfo>::const_iterator it =
repos.begin();
1725 if ( (*it).alias() == (*kit).alias() )
1727 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1744 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1746 MIL <<
"Saving " <<
repos.size() <<
" repo" << (
repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1748 std::ofstream file(repofile.
c_str());
1755 for ( std::list<RepoInfo>::iterator it =
repos.begin();
1759 MIL <<
"Saving " << (*it).alias() << endl;
1760 it->dumpAsIniOn(file);
1761 it->setFilepath(repofile);
1762 it->setMetadataPath( rawcache_path_for_repoinfo( _options, *it ) );
1763 it->setPackagesPath( packagescache_path_for_repoinfo( _options, *it ) );
1764 reposManip().insert(*it);
1769 MIL <<
"done" << endl;
1781 MIL <<
"Going to delete repo " << info.
alias() << endl;
1788 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1803 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1804 if ( filerepos.size() == 0
1805 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1809 if ( ! ( ret == 0 || ret == ENOENT ) )
1814 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1832 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1833 fit != filerepos.end();
1836 if ( (*fit).alias() != todelete.
alias() )
1837 (*fit).dumpAsIniOn(file);
1850 reposManip().erase(todelete);
1851 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1881 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1897 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1898 fit != filerepos.end();
1903 if ( (*fit).alias() != toedit.
alias() )
1904 (*fit).dumpAsIniOn(file);
1912 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1918 newinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1919 newinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1925 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1926 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1928 reposManip().erase(toedit);
1929 reposManip().insert(newinfo);
1931 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1933 MIL <<
"repo " << alias <<
" modified" << endl;
1942 if ( it !=
repos().end() )
1954 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1956 if ( (*urlit).asString(urlview) ==
url.asString(urlview) )
1973 assert_alias( service );
1982 saveService( toSave );
1986 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1988 MIL <<
"added service " << toSave.
alias() << endl;
1995 MIL <<
"Going to delete service " << alias << endl;
2000 if( location.
empty() )
2009 if ( tmpSet.size() == 1 )
2016 MIL << alias <<
" successfully deleted." << endl;
2022 std::ofstream file(location.
c_str());
2029 for_(it, tmpSet.begin(), tmpSet.end())
2031 if( it->alias() != alias )
2032 it->dumpAsIniOn(file);
2035 MIL << alias <<
" successfully deleted from file " << location << endl;
2039 RepoCollector rcollector;
2041 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2043 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2056 if ( !it->enabled() )
2070 assert_alias( service );
2071 assert_url( service );
2072 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2083 if ( (lrf+=service.
ttl()) > now )
2085 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2090 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2097 bool serviceModified =
false;
2105 if ( type != ServiceType::NONE )
2108 serviceModified =
true;
2113 std::string servicesTargetDistro = _options.servicesTargetDistro;
2114 if ( servicesTargetDistro.empty() )
2118 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2122 RepoCollector collector(servicesTargetDistro);
2135 ServiceRepos( _options.rootDir, service, bind( &RepoCollector::collect, &collector, _1 ) );
2140 uglyHack.first =
true;
2141 uglyHack.second = e;
2143 if ( service.
ttl() != origTtl )
2145 if ( !service.
ttl() )
2147 serviceModified =
true;
2155 for_( it, collector.repos.begin(), collector.repos.end() )
2158 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2160 it->setService( service.
alias() );
2163 newRepoStates[it->alias()] = *it;
2171 if ( !it->path().empty() )
2173 if ( it->path() !=
"/" )
2178 if ( it->baseUrlsEmpty() )
2181 if ( !path.
empty() )
2182 url.setPathName(
url.getPathName() / path );
2183 it->setBaseUrl( std::move(
url) );
2185 else if ( !path.
empty() )
2190 url.setPathName(
url.getPathName() / path );
2192 it->setBaseUrls( std::move(urls) );
2199 RepoInfoList oldRepos;
2204 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2206 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2208 if ( oldRepo->enabled() )
2211 const auto & last = service.
repoStates().find( oldRepo->alias() );
2212 if ( last != service.
repoStates().end() && ! last->second.enabled )
2214 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2216 serviceModified =
true;
2219 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2222 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2230 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2231 for_( it, collector.repos.begin(), collector.repos.end() )
2237 TriBool toBeEnabled( indeterminate );
2238 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2242 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2254 DBG <<
"User request to enable service repo " << it->alias() << endl;
2260 serviceModified =
true;
2264 DBG <<
"User request to disable service repo " << it->alias() << endl;
2265 toBeEnabled =
false;
2269 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2270 if ( oldRepo == oldRepos.end() )
2275 if ( ! indeterminate(toBeEnabled) )
2276 it->setEnabled( (
bool ) toBeEnabled );
2278 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2284 bool oldRepoModified =
false;
2286 if ( indeterminate(toBeEnabled) )
2290 if ( oldRepo->enabled() == it->enabled() )
2291 toBeEnabled = it->enabled();
2294 toBeEnabled = it->enabled();
2295 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2299 const auto & last = service.
repoStates().find( oldRepo->alias() );
2300 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2301 toBeEnabled = it->enabled();
2304 toBeEnabled = oldRepo->enabled();
2305 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2311 if ( toBeEnabled == oldRepo->enabled() )
2313 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2315 else if ( toBeEnabled )
2317 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2318 oldRepo->setEnabled(
true );
2319 oldRepoModified =
true;
2323 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2324 oldRepo->setEnabled(
false );
2325 oldRepoModified =
true;
2331 if ( oldRepo->rawName() != it->rawName() )
2333 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2334 oldRepo->setName( it->rawName() );
2335 oldRepoModified =
true;
2339 if ( oldRepo->autorefresh() != it->autorefresh() )
2341 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2342 oldRepo->setAutorefresh( it->autorefresh() );
2343 oldRepoModified =
true;
2347 if ( oldRepo->priority() != it->priority() )
2349 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2350 oldRepo->setPriority( it->priority() );
2351 oldRepoModified =
true;
2357 urlCredentialExtractor.extract( newUrls );
2358 if ( oldRepo->rawBaseUrls() != newUrls )
2360 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2361 oldRepo->setBaseUrls( std::move(newUrls) );
2362 oldRepoModified =
true;
2368 if ( service.
type() == ServiceType::PLUGIN )
2372 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2373 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2374 #define Z_CHKGPG(I,N) \
2375 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \
2377 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \
2378 oldRepo->set##N##Check( ngpg[I] ); \
2379 oldRepoModified = true; \
2388 if ( oldRepoModified )
2399 serviceModified =
true;
2406 serviceModified =
true;
2411 if ( service.
type() != ServiceType::PLUGIN )
2413 if ( service.
ttl() )
2416 serviceModified =
true;
2419 if ( serviceModified )
2426 if ( uglyHack.first )
2428 throw( uglyHack.second );
2436 MIL <<
"Going to modify service " << oldAlias << endl;
2442 if ( service.
type() == ServiceType::PLUGIN )
2450 if( location.
empty() )
2460 std::ofstream file(location.
c_str());
2461 for_(it, tmpSet.begin(), tmpSet.end())
2463 if( *it != oldAlias )
2464 it->dumpAsIniOn(file);
2473 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2477 if ( oldAlias != service.
alias()
2480 std::vector<RepoInfo> toModify;
2482 for_( it, toModify.begin(), toModify.end() )
2489 const auto & last = service.
repoStates().find( it->alias() );
2491 it->setEnabled( last->second.enabled );
2494 it->setEnabled(
false );
2497 if ( oldAlias != service.
alias() )
2498 it->setService(service.
alias());
2551 {
return _pimpl->repoEmpty(); }
2554 {
return _pimpl->repoSize(); }
2557 {
return _pimpl->repoBegin(); }
2560 {
return _pimpl->repoEnd(); }
2563 {
return _pimpl->getRepo( alias ); }
2566 {
return _pimpl->hasRepo( alias ); }
2576 std::string host( url_r.
getHost() );
2577 if ( ! host.empty() )
2589 {
return _pimpl->metadataStatus( info ); }
2592 {
return _pimpl->checkIfToRefreshMetadata( info,
url, policy ); }
2595 {
return _pimpl->metadataPath( info ); }
2598 {
return _pimpl->packagesPath( info ); }
2601 {
return _pimpl->refreshMetadata( info, policy, progressrcv ); }
2604 {
return _pimpl->cleanMetadata( info, progressrcv ); }
2607 {
return _pimpl->cleanPackages( info, progressrcv ); }
2610 {
return _pimpl->cacheStatus( info ); }
2613 {
return _pimpl->buildCache( info, policy, progressrcv ); }
2616 {
return _pimpl->cleanCache( info, progressrcv ); }
2619 {
return _pimpl->isCached( info ); }
2622 {
return _pimpl->loadFromCache( info, progressrcv ); }
2625 {
return _pimpl->cleanCacheDirGarbage( progressrcv ); }
2634 {
return _pimpl->addRepository( info, progressrcv ); }
2637 {
return _pimpl->addRepositories(
url, progressrcv ); }
2640 {
return _pimpl->removeRepository( info, progressrcv ); }
2643 {
return _pimpl->modifyRepository( alias, newinfo, progressrcv ); }
2646 {
return _pimpl->getRepositoryInfo( alias, progressrcv ); }
2649 {
return _pimpl->getRepositoryInfo(
url, urlview, progressrcv ); }
2652 {
return _pimpl->serviceEmpty(); }
2655 {
return _pimpl->serviceSize(); }
2658 {
return _pimpl->serviceBegin(); }
2661 {
return _pimpl->serviceEnd(); }
2664 {
return _pimpl->getService( alias ); }
2667 {
return _pimpl->hasService( alias ); }
2673 {
return _pimpl->addService( alias,
url ); }
2676 {
return _pimpl->addService( service ); }
2679 {
return _pimpl->removeService( alias ); }
2682 {
return _pimpl->removeService( service ); }
2685 {
return _pimpl->refreshServices( options_r ); }
2688 {
return _pimpl->refreshService( alias, options_r ); }
2691 {
return _pimpl->refreshService( service, options_r ); }
2694 {
return _pimpl->modifyService( oldAlias, service ); }
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
#define PL_(MSG1, MSG2, N)
media::MediaAccessId _mid
scoped_ptr< media::CredentialManager > _cmPtr
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void resetDispose()
Set no dispose function.
Progress callback from another progress.
Store and operate on date (time_t).
static const ValueType day
static Date now()
Return the current time.
Integral type with defined initial value when default constructed.
std::string digest()
get hex string representation of the digest
static const std::string & sha1()
sha1
Base class for Exception.
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
std::string asUserString() const
Translated error message as string suitable for the user.
void addHistory(const std::string &msg_r)
Add some message text to the history.
void remember(const Exception &old_r)
Store an other Exception as history.
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
std::vector< std::string > Arguments
int close()
Wait for the progamm to complete.
const std::string & command() const
The command we're executing.
Writing the zypp history file.
void modifyRepository(const RepoInfo &oldrepo, const RepoInfo &newrepo)
Log certain modifications to a repository.
void addRepository(const RepoInfo &repo)
Log a newly added repository.
void removeRepository(const RepoInfo &repo)
Log recently removed repository.
Maintain [min,max] and counter (value) for progress counting.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
bool toMax()
Set counter value to current max value (unless no range).
void name(const std::string &name_r)
Set counter name.
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
bool toMin()
Set counter value to current min value.
bool set(value_type val_r)
Set new counter value.
What is known about a repository.
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
repo::RepoType type() const
Type of repository,.
urls_size_type baseUrlsSize() const
number of repository urls
Url url() const
Pars pro toto: The first repository url.
static const RepoInfo noRepo
Represents no Repository (one with an empty alias).
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
Pathname path() const
Repository path.
url_set baseUrls() const
The complete set of repository urls.
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
void setMetadataPath(const Pathname &path)
Set the path where the local metadata is stored.
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
void setType(const repo::RepoType &t)
set the repository type
creates and provides information about known sources.
bool hasRepo(const std::string &alias) const
Return whether there is a known repository for alias.
ServiceSet::const_iterator ServiceConstIterator
void cleanCacheDirGarbage(const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove any subdirectories of cache directories which no longer belong to any of known repositories.
void cleanMetadata(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local metadata.
bool serviceEmpty() const
Gets true if no service is in RepoManager (so no one in specified location)
bool hasService(const std::string &alias) const
Return whether there is a known service for alias.
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
@ REFRESH_NEEDED
refresh is needed
@ REPO_UP_TO_DATE
repository not changed
@ REPO_CHECK_DELAYED
refresh is delayed due to settings
RepoSet::const_iterator RepoConstIterator
void addService(const std::string &alias, const Url &url)
Adds new service by it's alias and url.
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
void removeService(const std::string &alias)
Removes service specified by its name.
@ RefreshIfNeededIgnoreDelay
RepoManager(const RepoManagerOptions &options=RepoManagerOptions())
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
repo::ServiceType probeService(const Url &url) const
Probe the type or the service.
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
void cleanCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
clean local cache
void refreshServices(const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refreshes all enabled services.
void addRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds a repository to the list of known repositories.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
ServiceSet::size_type ServiceSizeType
std::set< RepoInfo > RepoSet
RepoInfo typedefs.
Pathname packagesPath(const RepoInfo &info) const
Path where the rpm packages are downloaded and kept.
RepoStatus cacheStatus(const RepoInfo &info) const
Status of metadata cache.
void addRepositories(const Url &url, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds repositores from a repo file to the list of known repositories.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy=RefreshIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local raw cache.
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refresh specific service.
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
@ RefreshService_forceRefresh
Force refresh even if TTL is not reached.
@ RefreshService_restoreStatus
Force restoring repo enabled/disabled status.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
RepoSizeType repoSize() const
void modifyRepository(const std::string &alias, const RepoInfo &newinfo, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Modify repository attributes.
Iterable< ServiceConstIterator > services() const
Iterate the known services.
void removeRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove the best matching repository from known repos list.
RepoInfo getRepositoryInfo(const std::string &alias, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Find a matching repository info.
ServiceSizeType serviceSize() const
Gets count of service in RepoManager (in specified location)
RepoSet::size_type RepoSizeType
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy=RefreshIfNeeded)
Checks whether to refresh metadata for specified repository and url.
RepoConstIterator repoBegin() const
Iterable< RepoConstIterator > repos() const
Iterate the known repositories.
void buildCache(const RepoInfo &info, CacheBuildPolicy policy=BuildIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local cache.
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
fill to output iterator repositories in service name.
void loadFromCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Load resolvables into the pool.
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
void cleanPackages(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local package cache.
RepoConstIterator repoEnd() const
RepoStatus metadataStatus(const RepoInfo &info) const
Status of local metadata.
void modifyService(const std::string &oldAlias, const ServiceInfo &service)
Modifies service file (rewrites it with new values) and underlying repositories if needed.
static std::string makeStupidAlias(const Url &url_r=Url())
Some stupid string but suitable as alias for your url if nothing better is available.
repo::RepoType probe(const Url &url, const Pathname &path) const
Probe repo metadata type.
Track changing files or directories.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Date timestamp() const
The time the data were changed the last time.
bool empty() const
Whether the status is empty (empty checksum)
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
static const std::string & systemRepoAlias()
Reserved system repository alias @System .
void eraseFromPool()
Remove this Repository from it's Pool.
repo::ServiceType type() const
Service type.
Date::Duration ttl() const
Sugested TTL between two metadata auto-refreshs.
void setLrf(Date lrf_r)
Set date of last refresh.
Date lrf() const
Date of last refresh (if known).
bool repoToDisableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToDisable.
bool repoToEnableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToEnable.
const RepoStates & repoStates() const
Access the remembered repository states.
Url url() const
The service url.
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
std::map< std::string, RepoState > RepoStates
Url rawUrl() const
The service raw url (no variables replaced)
void addRepoToEnable(const std::string &alias_r)
Add alias_r to the set of ReposToEnable.
void clearReposToDisable()
Clear the set of ReposToDisable.
void delRepoToEnable(const std::string &alias_r)
Remove alias_r from the set of ReposToEnable.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Writes ServiceInfo to stream in ".service" format.
void setRepoStates(RepoStates newStates_r)
Remember a new set of repository states.
static const ServiceInfo noService
Represents an empty service.
bool reposToDisableEmpty() const
std::string targetDistribution() const
This is register.target attribute of the installed base product.
std::string getScheme() const
Returns the scheme name of the URL.
std::string asCompleteString() const
Returns a complete string representation of the Url object.
std::string getHost(EEncoding eflag=zypp::url::E_DECODED) const
Returns the hostname or IP from the URL authority.
unsigned repo_refresh_delay() const
Amount of time in minutes that must pass before another refresh.
Pathname builtinRepoSolvfilesPath() const
The builtin config file value.
bool repo_add_probe() const
Whether repository urls should be probed.
static ZConfig & instance()
Singleton ctor.
Pathname builtinRepoPackagesPath() const
The builtin config file value.
Pathname builtinRepoMetadataPath() const
The builtin config file value.
std::string receiveLine()
Read one line from the input stream.
Wrapper class for ::stat/::lstat.
const std::string & asString() const
Return current Pathname as String.
bool isExist() const
Return whether valid stat info exists.
const Pathname & path() const
Return current Pathname.
Pathname dirname() const
Return all but the last component od this path.
const std::string & asString() const
String representation.
std::string basename() const
Return the last component of this path.
bool empty() const
Test for an empty path.
static Pathname assertprefix(const Pathname &root_r, const Pathname &path_r)
Return path_r prefixed with root_r, unless it is already prefixed.
const char * c_str() const
String representation.
Provide a new empty temporary directory and recursively delete it when no longer needed.
static TmpDir makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
Read service data from a .service file.
Repository already exists and some unique attribute can't be duplicated.
Exception for repository handling.
std::string label() const
Label for use in messages for the user interface.
void setFilepath(const Pathname &filename)
set the path to the .repo file
void setAlias(const std::string &alias)
set the repository alias
Pathname filepath() const
File where this repo was read from.
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
std::string alias() const
unique identifier for this source.
Thrown when the repo alias is found to be invalid.
thrown when it was impossible to determine an alias for this repo.
thrown when it was impossible to determine one url for this repo.
The repository cache is not built yet so you can't create the repostories from the cache.
thrown when it was impossible to match a repository
thrown when it was impossible to determine this repo type.
Service already exists and some unique attribute can't be duplicated.
Base Exception for service handling.
Thrown when the repo alias is found to be invalid.
Service without alias was used in an operation.
Service has no or invalid url defined.
Service plugin is immutable.
Retrieval of repository list for a service.
Downloader for YUM (rpm-nmd) repositories Encapsulates all the knowledge of which files have to be do...
RepoStatus status(MediaSetAccess &media_r) override
Status of the remote repository.
Lightweight repository attribute value lookup.
void reposErase(const std::string &alias_r)
Remove a Repository named alias_r.
Repository addRepoSolv(const Pathname &file_r, const std::string &name_r)
Load Solvables from a solv-file into a Repository named name_r.
static Pool instance()
Singleton ctor.
static const SolvAttr repositoryToolVersion
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
String related utilities and Regular expression matching.
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT()
To trigger appdata refresh unconditionally.
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
int unlink(const Pathname &path)
Like 'unlink'.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
int touch(const Pathname &path)
Change file's modification and access times.
int exchange(const Pathname &lpath, const Pathname &rpath)
Exchanges two files or directories.
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
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).
std::string numstring(char n, int w=0)
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
\relates regex \ingroup ZYPP_STR_REGEX \relates regex \ingroup ZYPP_STR_REGEX
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
std::string hexstring(char n, int w=4)
Easy-to use interface to the ZYPP dependency resolver.
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
std::list< RepoInfo > readRepoFile(const Url &repo_file)
Parses repo_file and returns a list of RepoInfo objects corresponding to repositories found within th...
std::ostream & operator<<(std::ostream &str, const Exception &obj)
static bool warning(const std::string &msg_r, const UserData &userData_r=UserData())
send warning text
static bool error(const std::string &msg_r, const UserData &userData_r=UserData())
send error text
static RepoManagerOptions makeTestSetup(const Pathname &root_r)
Test setup adjusting all paths to be located below one root_r directory.
Pathname repoSolvCachePath
Pathname rootDir
remembers root_r value for later use
Pathname knownServicesPath
Pathname repoRawCachePath
Pathname repoPackagesCachePath
RepoManagerOptions(const Pathname &root_r=Pathname())
Default ctor following ZConfig global settings.
RepoManager implementation.
RepoSizeType repoSize() const
void saveService(ServiceInfo &service) const
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
void init_knownRepositories()
void addService(const ServiceInfo &service)
repo::ServiceType probeService(const Url &url) const
Impl * clone() const
clone for RWCOW_pointer
bool hasRepo(const std::string &alias) const
bool serviceEmpty() const
void refreshServices(const RefreshServiceOptions &options_r)
std::string generateFilename(const ServiceInfo &info) const
RepoInfo getRepositoryInfo(const Url &url, const url::ViewOption &urlview, OPT_PROGRESS)
RepoManagerOptions _options
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Stream output.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
std::string generateFilename(const RepoInfo &info) const
RepoConstIterator repoEnd() const
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
ServiceSizeType serviceSize() const
void addRepository(const RepoInfo &info, OPT_PROGRESS)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
void addService(const std::string &alias, const Url &url)
void removeService(const std::string &alias)
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
RepoStatus cacheStatus(const RepoInfo &info) const
void removeRepository(const RepoInfo &info, OPT_PROGRESS)
Pathname packagesPath(const RepoInfo &info) const
void cleanPackages(const RepoInfo &info, OPT_PROGRESS)
RepoConstIterator repoBegin() const
void addRepositories(const Url &url, OPT_PROGRESS)
ServiceInfo getService(const std::string &alias) const
void modifyService(const std::string &oldAlias, const ServiceInfo &newService)
repo::RepoType probeCache(const Pathname &path_r) const
Probe Metadata in a local cache directory.
ServiceConstIterator serviceEnd() const
RepoInfo getRepositoryInfo(const std::string &alias, OPT_PROGRESS)
void touchIndexFile(const RepoInfo &info)
Impl(const RepoManagerOptions &opt)
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
Pathname metadataPath(const RepoInfo &info) const
bool isCached(const RepoInfo &info) const
DefaultIntegral< bool, false > _reposDirty
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
void removeService(const ServiceInfo &service)
void setCacheStatus(const RepoInfo &info, const RepoStatus &status)
ServiceConstIterator serviceBegin() const
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
void init_knownServices()
void cleanCacheDirGarbage(OPT_PROGRESS)
const RepoSet & repos() const
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
Probe the metadata type of a repository located at url.
RepoStatus metadataStatus(const RepoInfo &info) const
RepoInfo getRepo(const std::string &alias) const
Pathname generateNonExistingName(const Pathname &dir, const std::string &basefilename) const
Generate a non existing filename in a directory, using a base name.
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
bool hasService(const std::string &alias) const
Functor thats filter RepoInfo by service which it belongs to.
Repository type enumeration.
static const RepoType YAST2
static const RepoType RPMMD
static const RepoType NONE
static const RepoType RPMPLAINDIR
Service type enumeration.
static const ServiceType NONE
No service set.
static const ServiceType RIS
Repository Index Service (RIS) (formerly known as 'Novell Update' (NU) service)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
Url::asString() view options.