21 #include <solv/solvversion.h> 61 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc() 90 class UrlCredentialExtractor
93 UrlCredentialExtractor( Pathname & root_r )
97 ~UrlCredentialExtractor()
101 bool collect(
const Url & url_r )
103 bool ret = url_r.hasCredentialsInAuthority();
107 _cmPtr->addUserCred( url_r );
112 template<
class TContainer>
113 bool collect(
const TContainer & urls_r )
114 {
bool ret =
false;
for (
const Url &
url : urls_r ) {
if ( collect(
url ) && !ret ) ret =
true; }
return ret; }
117 bool extract( Url & url_r )
119 bool ret = collect( url_r );
121 url_r.setPassword( std::string() );
125 template<
class TContainer>
126 bool extract( TContainer & urls_r )
127 {
bool ret =
false;
for ( Url &
url : urls_r ) {
if ( extract(
url ) && !ret ) ret =
true; }
return ret; }
131 scoped_ptr<media::CredentialManager>
_cmPtr;
146 MediaMounter(
const Url & url_r )
148 media::MediaManager mediamanager;
149 _mid = mediamanager.open( url_r );
150 mediamanager.attach(
_mid );
156 media::MediaManager mediamanager;
157 mediamanager.release(
_mid );
158 mediamanager.close(
_mid );
165 Pathname getPathName(
const Pathname & path_r = Pathname() )
const 167 media::MediaManager mediamanager;
168 return mediamanager.localPath(
_mid, path_r );
177 template <
class Iterator>
178 inline bool foundAliasIn(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
180 for_( it, begin_r, end_r )
181 if ( it->alias() == alias_r )
186 template <
class Container>
187 inline bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
188 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
191 template <
class Iterator>
192 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
194 for_( it, begin_r, end_r )
195 if ( it->alias() == alias_r )
200 template <
class Container>
201 inline typename Container::iterator findAlias(
const std::string & alias_r, Container & cont_r )
202 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
204 template <
class Container>
205 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
206 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
210 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
212 std::string filename( alias_r );
216 filename = Pathname(filename).extend(
"."+stem_r).asString();
217 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
241 RepoCollector(
const std::string & targetDistro_)
245 bool collect(
const RepoInfo &repo )
249 && !repo.targetDistribution().empty()
253 <<
"Skipping repository meant for '" << repo.targetDistribution()
254 <<
"' distribution (current distro is '" 260 repos.push_back(repo);
274 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
276 MIL <<
"repo file: " << file << endl;
277 RepoCollector collector;
278 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
279 return std::move(collector.repos);
292 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
294 MIL <<
"directory " << dir << endl;
295 std::list<RepoInfo>
repos;
296 bool nonroot( geteuid() != 0 );
297 if ( nonroot && ! PathInfo(dir).userMayRX() )
299 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
303 std::list<Pathname> entries;
310 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
311 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
315 if ( nonroot && ! PathInfo(*it).userMayR() )
317 JobReport::warning( str::FormatNAC(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
321 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
322 repos.insert( repos.end(), tmp.begin(), tmp.end() );
332 inline void assert_alias(
const RepoInfo & info )
334 if ( info.alias().empty() )
338 if ( info.alias()[0] ==
'.')
340 info,
_(
"Repository alias cannot start with dot.")));
343 inline void assert_alias(
const ServiceInfo & info )
345 if ( info.alias().empty() )
349 if ( info.alias()[0] ==
'.')
351 info,
_(
"Service alias cannot start with dot.")));
356 inline void assert_urls(
const RepoInfo & info )
358 if ( info.baseUrlsEmpty() )
362 inline void assert_url(
const ServiceInfo & info )
364 if ( ! info.url().isValid() )
374 inline bool isTmpRepo(
const RepoInfo & info_r )
375 {
return( info_r.filepath().empty() && info_r.usesAutoMethadataPaths() ); }
383 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
386 return isTmpRepo( info ) ? info.metadataPath() : opt.repoRawCachePath / info.escaped_alias();
397 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
398 {
return rawcache_path_for_repoinfo( opt, info ) / info.path(); }
403 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
406 return isTmpRepo( info ) ? info.packagesPath() : opt.repoPackagesCachePath / info.escaped_alias();
412 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
415 return isTmpRepo( info ) ? info.metadataPath().dirname() /
"%SLV%" : opt.repoSolvCachePath / info.escaped_alias();
421 class ServiceCollector
424 typedef std::set<ServiceInfo> ServiceSet;
426 ServiceCollector( ServiceSet & services_r )
430 bool operator()(
const ServiceInfo & service_r )
const 454 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
456 return repositories_in_file(local);
467 repoCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoCachePath() );
468 repoRawCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoMetadataPath() );
469 repoSolvCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoSolvfilesPath() );
470 repoPackagesCachePath = Pathname::assertprefix( root_r,
ZConfig::instance().repoPackagesPath() );
471 knownReposPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownReposPath() );
472 knownServicesPath = Pathname::assertprefix( root_r,
ZConfig::instance().knownServicesPath() );
473 pluginsPath = Pathname::assertprefix( root_r,
ZConfig::instance().pluginsPath() );
495 #define OUTS(X) str << " " #X "\t" << obj.X << endl 496 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
497 OUTS( repoRawCachePath );
498 OUTS( repoSolvCachePath );
499 OUTS( repoPackagesCachePath );
500 OUTS( knownReposPath );
501 OUTS( knownServicesPath );
519 init_knownServices();
520 init_knownRepositories();
526 if ( _reposDirty && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
529 std::list<Pathname> entries;
531 if ( ! entries.empty() )
534 cmd.push_back(
"<" );
535 cmd.push_back(
">" );
536 cmd.push_back(
"PROGRAM" );
537 for (
const auto & rinfo :
repos() )
539 if ( ! rinfo.enabled() )
541 cmd.push_back(
"-R" );
542 cmd.push_back( rinfo.alias() );
543 cmd.push_back(
"-t" );
544 cmd.push_back( rinfo.type().asString() );
545 cmd.push_back(
"-p" );
546 cmd.push_back( rinfo.metadataPath().asString() );
549 for_( it, entries.begin(), entries.end() )
553 if ( pi.isFile() && pi.userMayRX() )
556 cmd[2] = pi.asString();
572 bool hasRepo(
const std::string & alias )
const 573 {
return foundAliasIn( alias,
repos() ); }
583 {
return rawcache_path_for_repoinfo( _options, info ); }
586 {
return packagescache_path_for_repoinfo( _options, info ); }
600 repo::RepoType probe(
const Url & url,
const Pathname & path = Pathname() )
const;
608 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").isExist(); }
633 {
return foundAliasIn( alias,
_services ); }
646 void removeService(
const std::string & alias );
648 { removeService( service.
alias() ); }
654 { refreshService( service.
alias(), options_r ); }
656 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
663 Pathname generateNonExistingName(
const Pathname & dir,
const std::string & basefilename )
const;
666 {
return filenameFromAlias( info.
alias(),
"repo" ); }
669 {
return filenameFromAlias( info.
alias(),
"service" ); }
673 Pathname base = solv_path_for_repoinfo( _options, info );
678 void touchIndexFile(
const RepoInfo & info );
680 template<
typename OutputIterator>
685 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
690 void init_knownServices();
691 void init_knownRepositories();
704 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
707 {
return new Impl( *
this ); }
713 {
return str <<
"RepoManager::Impl"; }
720 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
721 generateFilename( service ) );
724 MIL <<
"saving service in " << servfile << endl;
726 std::ofstream file( servfile.c_str() );
733 MIL <<
"done" << endl;
752 const std::string & basefilename )
const 754 std::string final_filename = basefilename;
756 while ( PathInfo(dir + final_filename).isExist() )
761 return dir + Pathname(final_filename);
768 Pathname dir = _options.knownServicesPath;
769 std::list<Pathname> entries;
770 if (PathInfo(dir).isExist())
779 for_(it, entries.begin(), entries.end() )
795 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
796 const Pathname & defaultCachePath_r,
797 const std::list<std::string> & repoEscAliases_r )
799 if ( cachePath_r != defaultCachePath_r )
802 std::list<std::string> entries;
806 std::set<std::string> oldfiles;
807 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
808 std::inserter( oldfiles, oldfiles.end() ) );
809 for (
const std::string & old : oldfiles )
821 MIL <<
"start construct known repos" << endl;
823 if ( PathInfo(_options.knownReposPath).isExist() )
825 std::list<std::string> repoEscAliases;
826 std::list<RepoInfo> orphanedRepos;
827 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
830 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
832 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
834 _reposX.insert( repoInfo );
837 const std::string & serviceAlias( repoInfo.service() );
838 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
840 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
841 orphanedRepos.push_back( repoInfo );
845 repoEscAliases.push_back(repoInfo.escaped_alias());
849 if ( ! orphanedRepos.empty() )
851 for (
const auto & repoInfo : orphanedRepos )
853 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
859 % repoInfo.alias() );
861 removeRepository( repoInfo );
875 repoEscAliases.sort();
877 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath, defaultCache.
repoRawCachePath, repoEscAliases );
878 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath, defaultCache.
repoSolvCachePath, repoEscAliases );
879 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath, defaultCache.
repoPackagesCachePath, repoEscAliases );
881 MIL <<
"end construct known repos" << endl;
888 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
889 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
894 repokind = probeCache( productdatapath );
897 switch ( repokind.
toEnum() )
900 status =
RepoStatus( productdatapath/
"repodata/repomd.xml") &&
RepoStatus( mediarootpath/
"media.1/media" );
904 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
923 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
928 repokind = probeCache( productdatapath );
934 switch ( repokind.
toEnum() )
937 p = Pathname(productdatapath +
"/repodata/repomd.xml");
941 p = Pathname(productdatapath +
"/content");
945 p = Pathname(productdatapath +
"/cookie");
963 MIL <<
"Going to try to check whether refresh is needed for " << url << endl;
966 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
968 RepoStatus oldstatus = metadataStatus( info );
969 if ( oldstatus.
empty() )
971 MIL <<
"No cached metadata, going to refresh" << endl;
972 return REFRESH_NEEDED;
977 MIL <<
"Never refresh CD/DVD" << endl;
978 return REPO_UP_TO_DATE;
981 if ( policy == RefreshForced )
983 MIL <<
"Forced refresh!" << endl;
984 return REFRESH_NEEDED;
989 policy = RefreshIfNeededIgnoreDelay;
993 if ( policy != RefreshIfNeededIgnoreDelay )
996 double diff = difftime(
1002 DBG <<
"last refresh = " << diff <<
" minutes ago" << endl;
1008 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1012 MIL <<
"Repository '" << info.
alias()
1013 <<
"' has been refreshed less than repo.refresh.delay (" 1015 <<
") minutes ago. Advising to skip refresh" << endl;
1016 return REPO_CHECK_DELAYED;
1024 repokind = probe( url, info.
path() );
1028 switch ( repokind.
toEnum() )
1045 newstatus =
RepoStatus( MediaMounter(url).getPathName(info.
path()) );
1055 if ( oldstatus == newstatus )
1057 MIL <<
"repo has not changed" << endl;
1058 touchIndexFile( info );
1059 return REPO_UP_TO_DATE;
1063 MIL <<
"repo has changed, going to refresh" << endl;
1064 return REFRESH_NEEDED;
1070 ERR <<
"refresh check failed for " << url << endl;
1074 return REFRESH_NEEDED;
1084 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1085 "Valid metadata not found at specified URLs",
1100 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1103 MIL <<
"Going to refresh metadata from " << url << endl;
1111 repokind = probe( *it, info.
path() );
1118 for_( it, repoBegin(), repoEnd() )
1120 if ( info.
alias() == (*it).alias() )
1123 modifiedrepo.
setType( repokind );
1124 modifyRepository( info.
alias(), modifiedrepo );
1131 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1142 Exception ex(
_(
"Can't create metadata cache directory."));
1150 shared_ptr<repo::Downloader> downloader_ptr;
1152 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1165 for_( it, repoBegin(), repoEnd() )
1167 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1168 if ( PathInfo(cachepath).isExist() )
1169 downloader_ptr->addCachePath(cachepath);
1172 downloader_ptr->download( media, tmpdir.
path() );
1176 MediaMounter media( url );
1179 Pathname productpath( tmpdir.
path() / info.
path() );
1191 if ( ! isTmpRepo( info ) )
1200 ERR <<
"Trying another url..." << endl;
1212 ERR <<
"No more urls..." << endl;
1221 progress.
sendTo(progressfnc);
1231 progress.
sendTo(progressfnc);
1241 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1242 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1249 RepoStatus raw_metadata_status = metadataStatus(info);
1250 if ( raw_metadata_status.
empty() )
1255 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1256 raw_metadata_status = metadataStatus(info);
1259 bool needs_cleaning =
false;
1260 if ( isCached( info ) )
1262 MIL << info.
alias() <<
" is already cached." << endl;
1265 if ( cache_status == raw_metadata_status )
1267 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1268 if ( policy == BuildIfNeeded )
1271 const Pathname & base = solv_path_for_repoinfo( _options, info);
1272 if ( ! PathInfo(base/
"solv.idx").isExist() )
1278 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1282 needs_cleaning =
true;
1296 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1298 Pathname base = solv_path_for_repoinfo( _options, info);
1306 if( ! PathInfo(base).userMayW() )
1308 Exception ex(
str::form(
_(
"Can't create cache at %s - no writing permissions."), base.c_str()) );
1311 Pathname solvfile = base /
"solv";
1317 switch ( repokind.
toEnum() )
1321 repokind = probeCache( productdatapath );
1327 MIL <<
"repo type is " << repokind << endl;
1329 switch ( repokind.
toEnum() )
1337 scoped_ptr<MediaMounter> forPlainDirs;
1340 cmd.push_back( PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1342 cmd.push_back(
"-o" );
1343 cmd.push_back( solvfile.asString() );
1344 cmd.push_back(
"-X" );
1348 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1350 cmd.push_back(
"-R" );
1352 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1355 cmd.push_back( productdatapath.asString() );
1358 std::string errdetail;
1361 WAR <<
" " << output;
1362 if ( errdetail.empty() ) {
1366 errdetail += output;
1369 int ret = prog.
close();
1387 setCacheStatus(info, raw_metadata_status);
1388 MIL <<
"Commit cache.." << endl;
1403 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1409 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1421 bool gotMediaException =
false;
1429 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1436 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1438 gotMediaException =
true;
1445 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1452 DBG <<
"problem checking for content file" << endl;
1454 gotMediaException =
true;
1460 MediaMounter media( url );
1461 if ( PathInfo(media.getPathName()/path).isDir() )
1464 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1478 if (gotMediaException)
1481 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1492 MIL <<
"going to probe the cached repo at " << path_r << endl;
1496 if ( PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1498 else if ( PathInfo(path_r/
"/content").isFile() )
1500 else if ( PathInfo(path_r).isDir() )
1503 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1511 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1514 progress.
sendTo(progressrcv);
1517 std::list<Pathname> cachedirs;
1518 cachedirs.push_back(_options.repoRawCachePath);
1519 cachedirs.push_back(_options.repoPackagesCachePath);
1520 cachedirs.push_back(_options.repoSolvCachePath);
1522 for_( dir, cachedirs.begin(), cachedirs.end() )
1524 if ( PathInfo(*dir).isExist() )
1526 std::list<Pathname> entries;
1531 unsigned sdircount = entries.size();
1532 unsigned sdircurrent = 1;
1533 for_( subdir, entries.begin(), entries.end() )
1537 for_( r, repoBegin(), repoEnd() )
1538 if ( subdir->basename() == r->escaped_alias() )
1539 { found =
true;
break; }
1544 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1549 progress.
set( progress.
val() + 100 );
1559 progress.
sendTo(progressrcv);
1562 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1573 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1575 if ( ! PathInfo(solvfile).isExist() )
1585 if ( toolversion != LIBSOLV_TOOLVERSION )
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;
1624 assert_urls(tosave);
1638 Pathname repofile = generateNonExistingName(
1639 _options.knownReposPath, generateFilename(tosave));
1641 MIL <<
"Saving repo in " << repofile << endl;
1643 std::ofstream file(repofile.c_str());
1652 tosave.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1653 tosave.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1657 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1659 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1660 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1662 reposManip().insert(tosave);
1667 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1672 MIL <<
"done" << endl;
1679 for ( std::list<RepoInfo>::const_iterator it = repos.begin();
1684 for_ ( kit, repoBegin(), repoEnd() )
1686 if ( (*it).alias() == (*kit).alias() )
1688 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1694 std::string filename = Pathname(url.
getPathName()).basename();
1696 if ( filename == Pathname() )
1705 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1707 MIL <<
"Saving " << repos.size() <<
" repo" << ( repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1709 std::ofstream file(repofile.c_str());
1716 for ( std::list<RepoInfo>::iterator it = repos.begin();
1720 MIL <<
"Saving " << (*it).alias() << endl;
1721 it->dumpAsIniOn(file);
1722 it->setFilepath(repofile);
1723 it->setMetadataPath( rawcache_path_for_repoinfo( _options, *it ) );
1724 it->setPackagesPath( packagescache_path_for_repoinfo( _options, *it ) );
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 newinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1880 newinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1884 RepoInfo & oinfo( const_cast<RepoInfo &>(newinfo_r) );
1886 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1887 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1889 reposManip().erase(toedit);
1890 reposManip().insert(newinfo);
1892 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1894 MIL <<
"repo " << alias <<
" modified" << endl;
1903 if ( it !=
repos().end() )
1913 for_( it, repoBegin(), repoEnd() )
1915 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1917 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1934 assert_alias( service );
1937 if ( hasService( service.
alias() ) )
1943 saveService( toSave );
1947 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1949 MIL <<
"added service " << toSave.
alias() << endl;
1956 MIL <<
"Going to delete service " << alias << endl;
1958 const ServiceInfo & service = getService( alias );
1960 Pathname location = service.
filepath();
1961 if( location.empty() )
1970 if ( tmpSet.size() == 1 )
1977 MIL << alias <<
" successfully deleted." << endl;
1983 std::ofstream file(location.c_str());
1990 for_(it, tmpSet.begin(), tmpSet.end())
1992 if( it->alias() != alias )
1993 it->dumpAsIniOn(file);
1996 MIL << alias <<
" successfully deleted from file " << location << endl;
2000 RepoCollector rcollector;
2001 getRepositoriesInService( alias,
2002 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2004 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2005 removeRepository(*rit);
2014 ServiceSet services( serviceBegin(), serviceEnd() );
2015 for_( it, services.begin(), services.end() )
2017 if ( !it->enabled() )
2021 refreshService(*it, options_r);
2031 assert_alias( service );
2032 assert_url( service );
2033 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2035 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2044 if ( (lrf+=service.
ttl()) > now )
2046 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2051 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2058 bool serviceModified =
false;
2069 serviceModified =
true;
2074 std::string servicesTargetDistro = _options.servicesTargetDistro;
2075 if ( servicesTargetDistro.empty() )
2079 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2083 RepoCollector collector(servicesTargetDistro);
2090 ServiceRepos( service, bind( &RepoCollector::collect, &collector, _1 ) );
2095 uglyHack.first =
true;
2096 uglyHack.second = e;
2098 if ( service.
ttl() != origTtl )
2100 if ( !service.
ttl() )
2102 serviceModified =
true;
2110 for_( it, collector.repos.begin(), collector.repos.end() )
2113 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2115 it->setService( service.
alias() );
2118 newRepoStates[it->alias()] = *it;
2126 if ( !it->path().empty() )
2128 if ( it->path() !=
"/" )
2133 if ( it->baseUrlsEmpty() )
2136 if ( !path.empty() )
2138 it->setBaseUrl( std::move(url) );
2140 else if ( !path.empty() )
2143 for (
Url & url : urls )
2147 it->setBaseUrls( std::move(urls) );
2154 RepoInfoList oldRepos;
2155 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2159 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2161 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2163 if ( oldRepo->enabled() )
2166 const auto & last = service.
repoStates().find( oldRepo->alias() );
2167 if ( last != service.
repoStates().end() && ! last->second.enabled )
2169 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2171 serviceModified =
true;
2174 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2177 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2179 removeRepository( *oldRepo );
2185 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2186 for_( it, collector.repos.begin(), collector.repos.end() )
2192 TriBool toBeEnabled( indeterminate );
2193 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2195 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2197 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2209 DBG <<
"User request to enable service repo " << it->alias() << endl;
2215 serviceModified =
true;
2219 DBG <<
"User request to disable service repo " << it->alias() << endl;
2220 toBeEnabled =
false;
2224 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2225 if ( oldRepo == oldRepos.end() )
2230 if ( ! indeterminate(toBeEnabled) )
2231 it->setEnabled( toBeEnabled );
2233 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2234 addRepository( *it );
2239 bool oldRepoModified =
false;
2241 if ( indeterminate(toBeEnabled) )
2245 if ( oldRepo->enabled() == it->enabled() )
2246 toBeEnabled = it->enabled();
2247 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2249 toBeEnabled = it->enabled();
2250 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2254 const auto & last = service.
repoStates().find( oldRepo->alias() );
2255 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2256 toBeEnabled = it->enabled();
2259 toBeEnabled = oldRepo->enabled();
2260 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2266 if ( toBeEnabled == oldRepo->enabled() )
2268 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2270 else if ( toBeEnabled )
2272 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2273 oldRepo->setEnabled(
true );
2274 oldRepoModified =
true;
2278 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2279 oldRepo->setEnabled(
false );
2280 oldRepoModified =
true;
2286 if ( oldRepo->rawName() != it->rawName() )
2288 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2289 oldRepo->setName( it->rawName() );
2290 oldRepoModified =
true;
2294 if ( oldRepo->autorefresh() != it->autorefresh() )
2296 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2297 oldRepo->setAutorefresh( it->autorefresh() );
2298 oldRepoModified =
true;
2302 if ( oldRepo->priority() != it->priority() )
2304 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2305 oldRepo->setPriority( it->priority() );
2306 oldRepoModified =
true;
2312 urlCredentialExtractor.extract( newUrls );
2313 if ( oldRepo->rawBaseUrls() != newUrls )
2315 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2316 oldRepo->setBaseUrls( std::move(newUrls) );
2317 oldRepoModified =
true;
2327 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2328 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2329 #define Z_CHKGPG(I,N) \ 2330 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \ 2332 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \ 2333 oldRepo->set##N##Check( ngpg[I] ); \ 2334 oldRepoModified = true; \ 2343 if ( oldRepoModified )
2345 modifyRepository( oldRepo->alias(), *oldRepo );
2354 serviceModified =
true;
2361 serviceModified =
true;
2368 if ( service.
ttl() )
2371 serviceModified =
true;
2374 if ( serviceModified )
2377 modifyService( service.
alias(), service );
2381 if ( uglyHack.first )
2383 throw( uglyHack.second );
2391 MIL <<
"Going to modify service " << oldAlias << endl;
2402 const ServiceInfo & oldService = getService(oldAlias);
2404 Pathname location = oldService.
filepath();
2405 if( location.empty() )
2415 std::ofstream file(location.c_str());
2416 for_(it, tmpSet.begin(), tmpSet.end())
2418 if( *it != oldAlias )
2419 it->dumpAsIniOn(file);
2428 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2432 if ( oldAlias != service.
alias()
2435 std::vector<RepoInfo> toModify;
2436 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2437 for_( it, toModify.begin(), toModify.end() )
2444 const auto & last = service.
repoStates().find( it->alias() );
2446 it->setEnabled( last->second.enabled );
2449 it->setEnabled(
false );
2452 if ( oldAlias != service.
alias() )
2453 it->setService(service.
alias());
2455 modifyRepository(it->alias(), *it);
2499 : _pimpl( new
Impl(opt) )
2531 std::string host( url_r.
getHost() );
2532 if ( ! host.empty() )
2654 {
return str << *obj.
_pimpl; }
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
Pathname packagesPath(const RepoInfo &info) const
RepoManager(const RepoManagerOptions &options=RepoManagerOptions())
static const ValueType day
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
void removeService(const std::string &alias)
Removes service specified by its name.
thrown when it was impossible to match a repository
Thrown when the repo alias is found to be invalid.
RepoManagerOptions(const Pathname &root_r=Pathname())
Default ctor following ZConfig global settings.
bool hasService(const std::string &alias) const
std::string alias() const
unique identifier for this source.
static const std::string & sha1()
sha1
int exchange(const Pathname &lpath, const Pathname &rpath)
Exchanges two files or directories.
static bool error(const std::string &msg_r, const UserData &userData_r=UserData())
send error text
RepoStatus status(MediaSetAccess &media)
Status of the remote repository.
void setCacheStatus(const RepoInfo &info, const RepoStatus &status)
std::string generateFilename(const ServiceInfo &info) const
thrown when it was impossible to determine this repo type.
std::string digest()
get hex string representation of the digest
Retrieval of repository list for a service.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
void refreshServices(const RefreshServiceOptions &options_r)
Pathname repoRawCachePath
bool serviceEmpty() const
Gets true if no service is in RepoManager (so no one in specified location)
void modifyService(const std::string &oldAlias, const ServiceInfo &service)
Modifies service file (rewrites it with new values) and underlying repositories if needed...
std::string asString(const DefaultIntegral< Tp, TInitial > &obj)
Read service data from a .service file.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
Date timestamp() const
The time the data were changed the last time.
ServiceConstIterator serviceBegin() const
static ZConfig & instance()
Singleton ctor.
static TmpDir makeSibling(const Pathname &sibling_r)
Provide a new empty temporary directory as sibling.
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r)
scoped_ptr< media::CredentialManager > _cmPtr
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
void cleanCacheDirGarbage(const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove any subdirectories of cache directories which no longer belong to any of known repositories...
RepoConstIterator repoBegin() const
Pathname filepath() const
File where this repo was read from.
bool isCached(const RepoInfo &info) const
void refreshServices(const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refreshes all enabled services.
Service plugin is immutable.
RepoStatus metadataStatus(const RepoInfo &info) const
Status of local metadata.
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
bool empty() const
Test for an empty path.
std::string getHost(EEncoding eflag=zypp::url::E_DECODED) const
Returns the hostname or IP from the URL authority.
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
const std::string & command() const
The command we're executing.
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
RepoSet::size_type RepoSizeType
bool empty() const
Whether the status is empty (default constucted)
void loadFromCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Load resolvables into the pool.
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
repo::RepoType probe(const Url &url, const Pathname &path) const
Probe repo metadata type.
std::string generateFilename(const RepoInfo &info) const
RepoConstIterator repoBegin() const
void addHistory(const std::string &msg_r)
Add some message text to the history.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy=RefreshIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local raw cache.
Pathname packagesPath(const RepoInfo &info) const
Path where the rpm packages are downloaded and kept.
void addService(const std::string &alias, const Url &url)
void touchIndexFile(const RepoInfo &info)
void setAlias(const std::string &alias)
set the repository alias
void init_knownRepositories()
String related utilities and Regular expression matching.
void addRepoToEnable(const std::string &alias_r)
Add alias_r to the set of ReposToEnable.
void removeRepository(const RepoInfo &info, OPT_PROGRESS)
RefreshServiceFlags RefreshServiceOptions
Options tuning RefreshService.
void modifyService(const std::string &oldAlias, const ServiceInfo &newService)
bool toMax()
Set counter value to current max value (unless no range).
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects...
void refreshService(const std::string &alias, const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refresh specific service.
void setFilepath(const Pathname &filename)
set the path to the .repo file
What is known about a repository.
static bool warning(const std::string &msg_r, const UserData &userData_r=UserData())
send warning text
void removeRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove the best matching repository from known repos list.
const RepoSet & repos() const
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
const RepoStates & repoStates() const
Access the remembered repository states.
Pathname knownServicesPath
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
void reposErase(const std::string &alias_r)
Remove a Repository named alias_r.
Service already exists and some unique attribute can't be duplicated.
void refreshService(const ServiceInfo &service, const RefreshServiceOptions &options_r)
bool repo_add_probe() const
Whether repository urls should be probed.
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
std::string targetDistribution() const
This is register.target attribute of the installed base product.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
Service without alias was used in an operation.
RepoStatus metadataStatus(const RepoInfo &info) const
RepoSet::const_iterator RepoConstIterator
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
Url::asString() view options.
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
repo::RepoType probeCache(const Pathname &path_r) const
Probe Metadata in a local cache directory.
#define PL_(MSG1, MSG2, N)
void modifyRepository(const std::string &alias, const RepoInfo &newinfo, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Modify repository attributes.
Pathname repoSolvCachePath
std::vector< std::string > Arguments
RepoManagerOptions _options
std::string asString() const
Returns a default string representation of the Url object.
ServiceInfo getService(const std::string &alias) const
RepoSizeType repoSize() const
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
void remember(const Exception &old_r)
Store an other Exception as history.
std::string & replaceAll(std::string &str_r, const std::string &from_r, const std::string &to_r)
Replace all occurrences of from_r with to_r in str_r (inplace).
void removeService(const ServiceInfo &service)
transform_iterator< repo::RepoVariablesUrlReplacer, url_set::const_iterator > urls_const_iterator
Progress callback from another progress.
std::map< std::string, RepoState > RepoStates
std::string label() const
Label for use in messages for the user interface.
void addRepository(const RepoInfo &info, OPT_PROGRESS)
static const ServiceType RIS
Repository Index Service (RIS) (formerly known as 'Novell Update' (NU) service)
RepoManager implementation.
#define ZYPP_RETHROW(EXCPT)
Drops a logline and rethrows, updating the CodeLocation.
void setPathName(const std::string &path, EEncoding eflag=zypp::url::E_DECODED)
Set the path name.
std::set< RepoInfo > RepoSet
RepoInfo typedefs.
bool toMin()
Set counter value to current min value.
RepoInfo getRepositoryInfo(const std::string &alias, OPT_PROGRESS)
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.
Store and operate on date (time_t).
static Pool instance()
Singleton ctor.
bool serviceEmpty() const
static RepoManagerOptions makeTestSetup(const Pathname &root_r)
Test setup adjusting all paths to be located below one root_r directory.
Pathname rootDir
remembers root_r value for later use
void removeRepository(const RepoInfo &repo)
Log recently removed repository.
Provide a new empty temporary directory and recursively delete it when no longer needed.
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
void clearReposToDisable()
Clear the set of ReposToDisable.
Lightweight repository attribute value lookup.
std::string asCompleteString() const
Returns a complete string representation of the Url object.
RepoConstIterator repoEnd() const
Execute a program and give access to its io An object of this class encapsulates the execution of an ...
void cleanCacheDirGarbage(OPT_PROGRESS)
int unlink(const Pathname &path)
Like 'unlink'.
thrown when it was impossible to determine one url for this repo.
static const ServiceType NONE
No service set.
static const SolvAttr repositoryToolVersion
Service type enumeration.
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
ServiceSet::const_iterator ServiceConstIterator
void setRepoStates(RepoStates newStates_r)
Remember a new set of repository states.
std::ostream & operator<<(std::ostream &str, const DeltaCandidates &obj)
repo::ServiceType probeService(const Url &url) const
Probe the type or the service.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
void setMetadataPath(const Pathname &path)
Set the path where the local metadata is stored.
void setType(const repo::RepoType &t)
set the repository type
Maintain [min,max] and counter (value) for progress counting.
Date::Duration ttl() const
Sugested TTL between two metadata auto-refreshs.
RepoStatus cacheStatus(const RepoInfo &info) const
Pathname generateNonExistingName(const Pathname &dir, const std::string &basefilename) const
Generate a non existing filename in a directory, using a base name.
void addRepository(const RepoInfo &repo)
Log a newly added repository.
void updateSolvFileIndex(const Pathname &solvfile_r)
Create solv file content digest for zypper bash completion.
RepoInfo getRepo(const std::string &alias) const
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
static bool schemeIsVolatile(const std::string &scheme_r)
cd dvd
void addRepository(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds a repository to the list of known repositories.
RepoInfo getRepositoryInfo(const std::string &alias, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Find a matching repository info.
static const ServiceType PLUGIN
Plugin services are scripts installed on your system that provide the package manager with repositori...
Base Exception for service handling.
std::string receiveLine()
Read one line from the input stream.
void init_knownServices()
void delRepoToEnable(const std::string &alias_r)
Remove alias_r from the set of ReposToEnable.
static std::string makeStupidAlias(const Url &url_r=Url())
Some stupid string but suitable as alias for your url if nothing better is available.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy=RefreshIfNeeded)
Checks whether to refresh metadata for specified repository and url.
void cleanCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
clean local cache
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
std::string numstring(char n, int w=0)
ServiceSet::size_type ServiceSizeType
bool reposToDisableEmpty() const
static const RepoType NONE
int touch(const Pathname &path)
Change file's modification and access times.
void resetDispose()
Set no dispose function.
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
url_set baseUrls() const
The complete set of repository urls.
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
int close()
Wait for the progamm to complete.
bool hasRepo(const std::string &alias) const
Return whether there is a known repository for alias.
void setLrf(Date lrf_r)
Set date of last refresh.
static const RepoType RPMMD
creates and provides information about known sources.
#define ZYPP_CAUGHT(EXCPT)
Drops a logline telling the Exception was caught (in order to handle it).
RepoStatus cacheStatus(const RepoInfo &info) const
Status of metadata cache.
repo::RepoType type() const
Type of repository,.
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
RepoSizeType repoSize() const
void addService(const ServiceInfo &service)
std::list< RepoInfo > readRepoFile(const Url &repo_file)
Parses repo_file and returns a list of RepoInfo objects corresponding to repositories found within th...
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
Url rawUrl() const
The service raw url (no variables replaced)
static const RepoType YAST2
thrown when it was impossible to determine an alias for this repo.
void buildCache(const RepoInfo &info, CacheBuildPolicy policy=BuildIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local cache.
Base class for Exception.
void addRepositories(const Url &url, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Adds repositores from a repo file to the list of known repositories.
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
Exception for repository handling.
void saveService(ServiceInfo &service) const
Impl(const RepoManagerOptions &opt)
media::MediaAccessId _mid
static Date now()
Return the current time.
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
Probe the metadata type of a repository located at url.
DefaultIntegral< bool, false > _reposDirty
ServiceConstIterator serviceEnd() const
Functor thats filter RepoInfo by service which it belongs to.
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
bool hasRepo(const std::string &alias) const
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
The repository cache is not built yet so you can't create the repostories from the cache...
Url url() const
Pars pro toto: The first repository url.
void eraseFromPool()
Remove this Repository from it's Pool.
Pathname repoPackagesCachePath
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
static const ServiceInfo noService
Represents an empty service.
RepoConstIterator repoEnd() const
bool hasService(const std::string &alias) const
Return whether there is a known service for alias.
void removeService(const std::string &alias)
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
bool repoToDisableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToDisable.
static const RepoInfo noRepo
Represents no Repository (one with an empty alias).
bool regex_match(const std::string &s, smatch &matches, const regex ®ex)
regex ZYPP_STR_REGEX regex ZYPP_STR_REGEX
Thrown when the repo alias is found to be invalid.
friend std::ostream & operator<<(std::ostream &str, const RepoManager &obj)
ServiceSizeType serviceSize() const
Gets count of service in RepoManager (in specified location)
static const RepoType RPMPLAINDIR
static const std::string & systemRepoAlias()
Reserved system repository alias .
bool repoToEnableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToEnable.
ServiceSizeType serviceSize() const
Track changing files or directories.
void cleanPackages(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local package cache.
unsigned repo_refresh_delay() const
Amount of time in minutes that must pass before another refresh.
Repository already exists and some unique attribute can't be duplicated.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
bool set(value_type val_r)
Set new counter value.
std::string getScheme() const
Returns the scheme name of the URL.
Url url() const
The service url.
static bool schemeIsDownloading(const std::string &scheme_r)
http https ftp sftp tftp
void modifyRepository(const RepoInfo &oldrepo, const RepoInfo &newrepo)
Log certain modifications to a repository.
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
Impl * clone() const
clone for RWCOW_pointer
urls_size_type baseUrlsSize() const
number of repository urls
Repository addRepoSolv(const Pathname &file_r, const std::string &name_r)
Load Solvables from a solv-file into a Repository named name_r.
void name(const std::string &name_r)
Set counter name.
Downloader for YUM (rpm-nmd) repositories Encapsulates all the knowledge of which files have to be do...
Pathname metadataPath(const RepoInfo &info) const
Easy-to use interface to the ZYPP dependency resolver.
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
void cleanPackages(const RepoInfo &info, OPT_PROGRESS)
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
std::string hexstring(char n, int w=4)
std::string asUserString() const
Translated error message as string suitable for the user.
void addService(const std::string &alias, const Url &url)
Adds new service by it's alias and url.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
Service has no or invalid url defined.
static bool schemeIsLocal(const std::string &scheme_r)
hd cd dvd dir file iso
Date lrf() const
Date of last refresh (if known).
void addRepositories(const Url &url, OPT_PROGRESS)
void cleanMetadata(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local metadata.
Pathname path() const
Repository path.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Writes ServiceInfo to stream in ".service" format.
repo::ServiceType type() const
Service type.
Repository type enumeration.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)
repo::ServiceType probeService(const Url &url) const