21 #include <solv/solvversion.h> 23 #include <zypp-core/base/InputStream> 24 #include <zypp/base/LogTools.h> 25 #include <zypp/base/Gettext.h> 26 #include <zypp-core/base/DefaultIntegral> 27 #include <zypp/base/Function.h> 28 #include <zypp/base/Regex.h> 29 #include <zypp/PathInfo.h> 30 #include <zypp/TmpPath.h> 37 #include <zypp-media/auth/CredentialManager> 38 #include <zypp-media/MediaException> 40 #include <zypp/ExternalProgram.h> 41 #include <zypp/ManagedFile.h> 46 #include <zypp/repo/yum/Downloader.h> 47 #include <zypp/repo/susetags/Downloader.h> 62 #define OPT_PROGRESS const ProgressData::ReceiverFnc & = ProgressData::ReceiverFnc() 74 const char * env = getenv(
"ZYPP_PLUGIN_APPDATA_FORCE_COLLECT");
104 class UrlCredentialExtractor
107 UrlCredentialExtractor( Pathname & root_r )
111 ~UrlCredentialExtractor()
115 bool collect(
const Url & url_r )
117 bool ret = url_r.hasCredentialsInAuthority();
121 _cmPtr->addUserCred( url_r );
126 template<
class TContainer>
127 bool collect(
const TContainer & urls_r )
128 {
bool ret =
false;
for (
const Url & url : urls_r ) {
if ( collect( url ) && !ret ) ret =
true; }
return ret; }
131 bool extract( Url & url_r )
133 bool ret = collect( url_r );
135 url_r.setPassword( std::string() );
139 template<
class TContainer>
140 bool extract( TContainer & urls_r )
141 {
bool ret =
false;
for ( Url & url : urls_r ) {
if ( extract( url ) && !ret ) ret =
true; }
return ret; }
145 scoped_ptr<media::CredentialManager>
_cmPtr;
160 MediaMounter(
const Url & url_r )
162 media::MediaManager mediamanager;
163 _mid = mediamanager.open( url_r );
164 mediamanager.attach(
_mid );
170 media::MediaManager mediamanager;
171 mediamanager.release(
_mid );
172 mediamanager.close(
_mid );
179 Pathname getPathName(
const Pathname & path_r = Pathname() )
const 181 media::MediaManager mediamanager;
182 return mediamanager.localPath(
_mid, path_r );
191 template <
class Iterator>
192 inline bool foundAliasIn(
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 bool foundAliasIn(
const std::string & alias_r,
const Container & cont_r )
202 {
return foundAliasIn( alias_r, cont_r.begin(), cont_r.end() ); }
205 template <
class Iterator>
206 inline Iterator findAlias(
const std::string & alias_r, Iterator begin_r, Iterator end_r )
208 for_( it, begin_r, end_r )
209 if ( it->alias() == alias_r )
214 template <
class Container>
215 inline typename Container::iterator findAlias(
const std::string & alias_r, Container & cont_r )
216 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
218 template <
class Container>
219 inline typename Container::const_iterator findAlias(
const std::string & alias_r,
const Container & cont_r )
220 {
return findAlias( alias_r, cont_r.begin(), cont_r.end() ); }
224 inline std::string filenameFromAlias(
const std::string & alias_r,
const std::string & stem_r )
226 std::string filename( alias_r );
230 filename = Pathname(filename).extend(
"."+stem_r).asString();
231 MIL <<
"generating filename for " << stem_r <<
" [" << alias_r <<
"] : '" << filename <<
"'" << endl;
255 RepoCollector(
const std::string & targetDistro_)
259 bool collect(
const RepoInfo &repo )
263 && !repo.targetDistribution().empty()
267 <<
"Skipping repository meant for '" << repo.targetDistribution()
268 <<
"' distribution (current distro is '" 274 repos.push_back(repo);
288 std::list<RepoInfo> repositories_in_file(
const Pathname & file )
290 MIL <<
"repo file: " << file << endl;
291 RepoCollector collector;
292 parser::RepoFileReader parser( file, bind( &RepoCollector::collect, &collector, _1 ) );
293 return std::move(collector.repos);
306 std::list<RepoInfo> repositories_in_dir(
const Pathname &dir )
308 MIL <<
"directory " << dir << endl;
309 std::list<RepoInfo>
repos;
310 bool nonroot( geteuid() != 0 );
311 if ( nonroot && ! PathInfo(dir).userMayRX() )
313 JobReport::warning( str::Format(
_(
"Cannot read repo directory '%1%': Permission denied")) % dir );
317 std::list<Pathname> entries;
324 str::regex allowedRepoExt(
"^\\.repo(_[0-9]+)?$");
325 for ( std::list<Pathname>::const_iterator it = entries.begin(); it != entries.end(); ++it )
329 if ( nonroot && ! PathInfo(*it).userMayR() )
331 JobReport::warning( str::Format(
_(
"Cannot read repo file '%1%': Permission denied")) % *it );
335 const std::list<RepoInfo> & tmp( repositories_in_file( *it ) );
336 repos.insert(
repos.end(), tmp.begin(), tmp.end() );
346 inline void assert_alias(
const RepoInfo & info )
348 if ( info.alias().empty() )
352 if ( info.alias()[0] ==
'.')
354 info,
_(
"Repository alias cannot start with dot.")));
357 inline void assert_alias(
const ServiceInfo & info )
359 if ( info.alias().empty() )
363 if ( info.alias()[0] ==
'.')
365 info,
_(
"Service alias cannot start with dot.")));
370 inline void assert_urls(
const RepoInfo & info )
372 if ( info.baseUrlsEmpty() )
376 inline void assert_url(
const ServiceInfo & info )
378 if ( ! info.url().isValid() )
388 inline bool isTmpRepo(
const RepoInfo & info_r )
389 {
return( info_r.filepath().empty() && info_r.usesAutoMethadataPaths() ); }
397 inline Pathname rawcache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
400 return isTmpRepo( info ) ? info.metadataPath() : opt.repoRawCachePath / info.escaped_alias();
411 inline Pathname rawproductdata_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
412 {
return rawcache_path_for_repoinfo( opt, info ) / info.path(); }
417 inline Pathname packagescache_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
420 return isTmpRepo( info ) ? info.packagesPath() : opt.repoPackagesCachePath / info.escaped_alias();
426 inline Pathname solv_path_for_repoinfo(
const RepoManagerOptions &opt,
const RepoInfo &info )
429 return isTmpRepo( info ) ? info.metadataPath().dirname() /
"%SLV%" : opt.repoSolvCachePath / info.escaped_alias();
435 class ServiceCollector
438 typedef std::set<ServiceInfo> ServiceSet;
440 ServiceCollector( ServiceSet & services_r )
444 bool operator()(
const ServiceInfo & service_r )
const 462 DBG <<
"reading repo file " << repo_file <<
", local path: " << local << endl;
464 return repositories_in_file(local);
503 #define OUTS(X) str << " " #X "\t" << obj.X << endl 504 str <<
"RepoManagerOptions (" << obj.
rootDir <<
") {" << endl;
505 OUTS( repoRawCachePath );
506 OUTS( repoSolvCachePath );
507 OUTS( repoPackagesCachePath );
508 OUTS( knownReposPath );
509 OUTS( knownServicesPath );
527 init_knownServices();
528 init_knownRepositories();
535 && geteuid() == 0 && ( _options.rootDir.empty() || _options.rootDir ==
"/" ) )
538 std::list<Pathname> entries;
540 if ( ! entries.empty() )
543 cmd.push_back(
"<" );
544 cmd.push_back(
">" );
545 cmd.push_back(
"PROGRAM" );
546 for (
const auto & rinfo :
repos() )
548 if ( ! rinfo.enabled() )
550 cmd.push_back(
"-R" );
551 cmd.push_back( rinfo.alias() );
552 cmd.push_back(
"-t" );
553 cmd.push_back( rinfo.type().asString() );
554 cmd.push_back(
"-p" );
555 cmd.push_back( rinfo.metadataPath().asString() );
558 for_( it, entries.begin(), entries.end() )
581 bool hasRepo(
const std::string & alias )
const 582 {
return foundAliasIn( alias,
repos() ); }
592 {
return rawcache_path_for_repoinfo( _options, info ); }
595 {
return packagescache_path_for_repoinfo( _options, info ); }
617 {
return PathInfo(solv_path_for_repoinfo( _options, info ) /
"solv").
isExist(); }
642 {
return foundAliasIn( alias,
_services ); }
655 void removeService(
const std::string & alias );
657 { removeService( service.
alias() ); }
663 { refreshService( service.
alias(), options_r ); }
665 void modifyService(
const std::string & oldAlias,
const ServiceInfo & newService );
672 Pathname generateNonExistingName(
const Pathname & dir,
const std::string & basefilename )
const;
675 {
return filenameFromAlias( info.
alias(),
"repo" ); }
678 {
return filenameFromAlias( info.
alias(),
"service" ); }
682 Pathname base = solv_path_for_repoinfo( _options, info );
687 void touchIndexFile(
const RepoInfo & info );
689 template<
typename OutputIterator>
694 boost::make_filter_iterator( filter,
repos().end(),
repos().end() ),
699 void init_knownServices();
700 void init_knownRepositories();
713 friend Impl * rwcowClone<Impl>(
const Impl * rhs );
716 {
return new Impl( *
this ); }
722 {
return str <<
"RepoManager::Impl"; }
729 Pathname servfile = generateNonExistingName( _options.knownServicesPath,
730 generateFilename( service ) );
733 MIL <<
"saving service in " << servfile << endl;
735 std::ofstream file( servfile.
c_str() );
742 MIL <<
"done" << endl;
761 const std::string & basefilename )
const 763 std::string final_filename = basefilename;
765 while (
PathInfo(dir + final_filename).isExist() )
770 return dir +
Pathname(final_filename);
777 Pathname dir = _options.knownServicesPath;
778 std::list<Pathname> entries;
788 for_(it, entries.begin(), entries.end() )
804 inline void cleanupNonRepoMetadtaFolders(
const Pathname & cachePath_r,
805 const Pathname & defaultCachePath_r,
806 const std::list<std::string> & repoEscAliases_r )
808 if ( cachePath_r != defaultCachePath_r )
811 std::list<std::string> entries;
815 std::set<std::string> oldfiles;
816 set_difference( entries.begin(), entries.end(), repoEscAliases_r.begin(), repoEscAliases_r.end(),
817 std::inserter( oldfiles, oldfiles.end() ) );
823 for (
const std::string & old : oldfiles )
827 pi( cachePath_r/old );
839 MIL <<
"start construct known repos" << endl;
843 std::list<std::string> repoEscAliases;
844 std::list<RepoInfo> orphanedRepos;
845 for (
RepoInfo & repoInfo : repositories_in_dir(_options.knownReposPath) )
848 repoInfo.setMetadataPath( rawcache_path_for_repoinfo(_options, repoInfo) );
850 repoInfo.setPackagesPath( packagescache_path_for_repoinfo(_options, repoInfo) );
852 _reposX.insert( repoInfo );
855 const std::string & serviceAlias( repoInfo.service() );
856 if ( ! ( serviceAlias.empty() || hasService( serviceAlias ) ) )
858 WAR <<
"Schedule orphaned service repo for deletion: " << repoInfo << endl;
859 orphanedRepos.push_back( repoInfo );
863 repoEscAliases.push_back(repoInfo.escaped_alias());
867 if ( ! orphanedRepos.empty() )
869 for (
const auto & repoInfo : orphanedRepos )
871 MIL <<
"Delete orphaned service repo " << repoInfo.alias() << endl;
877 % repoInfo.alias() );
879 removeRepository( repoInfo );
893 repoEscAliases.sort();
894 cleanupNonRepoMetadtaFolders( _options.repoRawCachePath,
897 cleanupNonRepoMetadtaFolders( _options.repoSolvCachePath,
900 cleanupNonRepoMetadtaFolders( _options.repoPackagesCachePath,
904 MIL <<
"end construct known repos" << endl;
911 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
912 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
917 repokind = probeCache( productdatapath );
924 switch ( repokind.
toEnum() )
927 status =
RepoStatus( productdatapath/
"repodata/repomd.xml") &&
RepoStatus( mediarootpath/
"media.1/media" );
931 status =
RepoStatus( productdatapath/
"content" ) &&
RepoStatus( mediarootpath/
"media.1/media" );
945 if ( ! status.
empty() )
954 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
959 repokind = probeCache( productdatapath );
965 switch ( repokind.
toEnum() )
968 p =
Pathname(productdatapath +
"/repodata/repomd.xml");
972 p =
Pathname(productdatapath +
"/content");
976 p =
Pathname(productdatapath +
"/cookie");
994 MIL <<
"Check if to refresh repo " << info.
alias() <<
" at " << url <<
" (" << info.
type() <<
")" << endl;
997 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
999 RepoStatus oldstatus = metadataStatus( info );
1001 if ( oldstatus.
empty() )
1003 MIL <<
"No cached metadata, going to refresh" << endl;
1004 return REFRESH_NEEDED;
1009 MIL <<
"Never refresh CD/DVD" << endl;
1010 return REPO_UP_TO_DATE;
1013 if ( policy == RefreshForced )
1015 MIL <<
"Forced refresh!" << endl;
1016 return REFRESH_NEEDED;
1021 policy = RefreshIfNeededIgnoreDelay;
1025 if ( policy != RefreshIfNeededIgnoreDelay )
1030 RepoStatus cachestatus = cacheStatus( info );
1032 if ( oldstatus == cachestatus )
1040 WAR <<
"Repository '" << info.
alias() <<
"' was refreshed in the future!" << endl;
1044 MIL <<
"Repository '" << info.
alias()
1045 <<
"' has been refreshed less than repo.refresh.delay (" 1047 <<
") minutes ago. Advising to skip refresh" << endl;
1048 return REPO_CHECK_DELAYED;
1053 MIL <<
"Metadata and solv cache don't match. Check data on server..." << endl;
1060 repokind = probe( url, info.
path() );
1064 switch ( repokind.
toEnum() )
1091 if ( oldstatus == newstatus )
1093 MIL <<
"repo has not changed" << endl;
1094 touchIndexFile( info );
1095 return REPO_UP_TO_DATE;
1099 MIL <<
"repo has changed, going to refresh" << endl;
1100 return REFRESH_NEEDED;
1106 ERR <<
"refresh check failed for " << url << endl;
1110 return REFRESH_NEEDED;
1120 RepoException rexception( info,
PL_(
"Valid metadata not found at specified URL",
1121 "Valid metadata not found at specified URLs",
1135 if (checkIfToRefreshMetadata(info, url, policy)!=REFRESH_NEEDED)
1138 MIL <<
"Going to refresh metadata from " << url << endl;
1146 if ( repokind != probed )
1150 for_( it, repoBegin(), repoEnd() )
1152 if ( info.
alias() == (*it).alias() )
1155 modifiedrepo.
setType( repokind );
1169 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1180 Exception ex(
_(
"Can't create metadata cache directory."));
1188 shared_ptr<repo::Downloader> downloader_ptr;
1190 MIL <<
"Creating downloader for [ " << info.
alias() <<
" ]" << endl;
1203 for_( it, repoBegin(), repoEnd() )
1205 Pathname cachepath(rawcache_path_for_repoinfo( _options, *it ));
1206 if (
PathInfo(cachepath).isExist() )
1207 downloader_ptr->addCachePath(cachepath);
1210 downloader_ptr->download( media, tmpdir.
path() );
1215 MediaMounter media( url );
1230 if ( ! isTmpRepo( info ) )
1239 ERR <<
"Trying another url..." << endl;
1251 ERR <<
"No more urls..." << endl;
1260 progress.
sendTo(progressfnc);
1270 progress.
sendTo(progressfnc);
1280 Pathname mediarootpath = rawcache_path_for_repoinfo( _options, info );
1281 Pathname productdatapath = rawproductdata_path_for_repoinfo( _options, info );
1288 RepoStatus raw_metadata_status = metadataStatus(info);
1289 if ( raw_metadata_status.
empty() )
1294 refreshMetadata(info, RefreshIfNeeded, progressrcv );
1295 raw_metadata_status = metadataStatus(info);
1298 bool needs_cleaning =
false;
1299 if ( isCached( info ) )
1301 MIL << info.
alias() <<
" is already cached." << endl;
1304 if ( cache_status == raw_metadata_status )
1306 MIL << info.
alias() <<
" cache is up to date with metadata." << endl;
1307 if ( policy == BuildIfNeeded )
1310 const Pathname & base = solv_path_for_repoinfo( _options, info);
1311 if ( !
PathInfo(base/
"solv.idx").isExist() )
1317 MIL << info.
alias() <<
" cache rebuild is forced" << endl;
1321 needs_cleaning =
true;
1335 MIL << info.
alias() <<
" building cache..." << info.
type() << endl;
1337 Pathname base = solv_path_for_repoinfo( _options, info);
1356 switch ( repokind.
toEnum() )
1360 repokind = probeCache( productdatapath );
1366 MIL <<
"repo type is " << repokind << endl;
1368 switch ( repokind.
toEnum() )
1376 scoped_ptr<MediaMounter> forPlainDirs;
1379 cmd.push_back(
PathInfo(
"/usr/bin/repo2solv" ).isFile() ?
"repo2solv" :
"repo2solv.sh" );
1381 cmd.push_back(
"-o" );
1382 cmd.push_back( solvfile.
asString() );
1383 cmd.push_back(
"-X" );
1388 forPlainDirs.reset(
new MediaMounter( info.
url() ) );
1390 cmd.push_back(
"-R" );
1392 cmd.push_back( forPlainDirs->getPathName( info.
path() ).c_str() );
1395 cmd.push_back( productdatapath.
asString() );
1398 std::string errdetail;
1401 WAR <<
" " << output;
1402 errdetail += output;
1405 int ret = prog.
close();
1423 setCacheStatus(info, raw_metadata_status);
1424 MIL <<
"Commit cache.." << endl;
1439 MIL <<
"going to probe the repo type at " << url <<
" (" << path <<
")" << endl;
1445 MIL <<
"Probed type NONE (not exists) at " << url <<
" (" << path <<
")" << endl;
1457 bool gotMediaException =
false;
1465 MIL <<
"Probed type RPMMD at " << url <<
" (" << path <<
")" << endl;
1469 catch (
const media::MediaException &e )
1472 DBG <<
"problem checking for repodata/repomd.xml file" << endl;
1474 gotMediaException =
true;
1481 MIL <<
"Probed type YAST2 at " << url <<
" (" << path <<
")" << endl;
1485 catch (
const media::MediaException &e )
1488 DBG <<
"problem checking for content file" << endl;
1490 gotMediaException =
true;
1496 MediaMounter media( url );
1497 if (
PathInfo(media.getPathName()/path).isDir() )
1500 MIL <<
"Probed type RPMPLAINDIR at " << url <<
" (" << path <<
")" << endl;
1514 if (gotMediaException)
1517 MIL <<
"Probed type NONE at " << url <<
" (" << path <<
")" << endl;
1528 MIL <<
"going to probe the cached repo at " << path_r << endl;
1532 if (
PathInfo(path_r/
"/repodata/repomd.xml").isFile() )
1534 else if (
PathInfo(path_r/
"/content").isFile() )
1536 else if (
PathInfo(path_r).isDir() )
1539 MIL <<
"Probed cached type " << ret <<
" at " << path_r << endl;
1547 MIL <<
"Going to clean up garbage in cache dirs" << endl;
1550 progress.
sendTo(progressrcv);
1553 std::list<Pathname> cachedirs;
1554 cachedirs.push_back(_options.repoRawCachePath);
1555 cachedirs.push_back(_options.repoPackagesCachePath);
1556 cachedirs.push_back(_options.repoSolvCachePath);
1558 for_( dir, cachedirs.begin(), cachedirs.end() )
1562 std::list<Pathname> entries;
1567 unsigned sdircount = entries.size();
1568 unsigned sdircurrent = 1;
1569 for_( subdir, entries.begin(), entries.end() )
1573 for_( r, repoBegin(), repoEnd() )
1574 if ( subdir->basename() == r->escaped_alias() )
1575 { found =
true;
break; }
1580 progress.
set( progress.
val() + sdircurrent * 100 / sdircount );
1585 progress.
set( progress.
val() + 100 );
1595 progress.
sendTo(progressrcv);
1598 MIL <<
"Removing raw metadata cache for " << info.
alias() << endl;
1609 Pathname solvfile = solv_path_for_repoinfo(_options, info) /
"solv";
1611 if ( !
PathInfo(solvfile).isExist() )
1621 if ( toolversion != LIBSOLV_TOOLVERSION )
1630 MIL <<
"Try to handle exception by rebuilding the solv-file" << endl;
1631 cleanCache( info, progressrcv );
1632 buildCache( info, BuildIfNeeded, progressrcv );
1650 MIL <<
"Try adding repo " << info << endl;
1657 if ( _options.probe )
1659 DBG <<
"unknown repository type, probing" << endl;
1660 assert_urls(tosave);
1674 Pathname repofile = generateNonExistingName(
1675 _options.knownReposPath, generateFilename(tosave));
1677 MIL <<
"Saving repo in " << repofile << endl;
1679 std::ofstream file(repofile.
c_str());
1688 tosave.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1689 tosave.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1693 RepoInfo & oinfo( const_cast<RepoInfo &>(info) );
1695 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, tosave ) );
1696 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, tosave ) );
1698 reposManip().insert(tosave);
1703 UrlCredentialExtractor( _options.rootDir ).collect( tosave.
baseUrls() );
1708 MIL <<
"done" << endl;
1715 for ( std::list<RepoInfo>::const_iterator it =
repos.begin();
1720 for_ ( kit, repoBegin(), repoEnd() )
1722 if ( (*it).alias() == (*kit).alias() )
1724 ERR <<
"To be added repo " << (*it).alias() <<
" conflicts with existing repo " << (*kit).alias() << endl;
1741 Pathname repofile = generateNonExistingName(_options.knownReposPath, filename);
1743 MIL <<
"Saving " <<
repos.size() <<
" repo" << (
repos.size() ?
"s" :
"" ) <<
" in " << repofile << endl;
1745 std::ofstream file(repofile.
c_str());
1752 for ( std::list<RepoInfo>::iterator it =
repos.begin();
1756 MIL <<
"Saving " << (*it).alias() << endl;
1757 it->dumpAsIniOn(file);
1758 it->setFilepath(repofile);
1759 it->setMetadataPath( rawcache_path_for_repoinfo( _options, *it ) );
1760 it->setPackagesPath( packagescache_path_for_repoinfo( _options, *it ) );
1761 reposManip().insert(*it);
1766 MIL <<
"done" << endl;
1778 MIL <<
"Going to delete repo " << info.
alias() << endl;
1780 for_( it, repoBegin(), repoEnd() )
1785 if ( (!info.
alias().empty()) && ( info.
alias() != (*it).alias() ) )
1800 std::list<RepoInfo> filerepos = repositories_in_file(todelete.
filepath());
1801 if ( filerepos.size() == 0
1802 ||(filerepos.size() == 1 && filerepos.front().alias() == todelete.
alias() ) )
1806 if ( ! ( ret == 0 || ret == ENOENT ) )
1811 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1829 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1830 fit != filerepos.end();
1833 if ( (*fit).alias() != todelete.
alias() )
1834 (*fit).dumpAsIniOn(file);
1842 if ( isCached(todelete) )
1843 cleanCache( todelete, cSubprogrcv);
1845 cleanMetadata( todelete, mSubprogrcv );
1846 cleanPackages( todelete, pSubprogrcv );
1847 reposManip().erase(todelete);
1848 MIL << todelete.
alias() <<
" successfully deleted." << endl;
1862 RepoInfo toedit = getRepositoryInfo(alias);
1866 if ( alias != newinfo.
alias() && hasRepo( newinfo.
alias() ) )
1878 std::list<RepoInfo> filerepos = repositories_in_file(toedit.
filepath());
1894 for ( std::list<RepoInfo>::const_iterator fit = filerepos.begin();
1895 fit != filerepos.end();
1900 if ( (*fit).alias() != toedit.
alias() )
1901 (*fit).dumpAsIniOn(file);
1909 const Pathname & solvidx = solv_path_for_repoinfo(_options, newinfo)/
"solv.idx";
1915 newinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1916 newinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1920 RepoInfo & oinfo( const_cast<RepoInfo &>(newinfo_r) );
1922 oinfo.
setMetadataPath( rawcache_path_for_repoinfo( _options, newinfo ) );
1923 oinfo.
setPackagesPath( packagescache_path_for_repoinfo( _options, newinfo ) );
1925 reposManip().erase(toedit);
1926 reposManip().insert(newinfo);
1928 UrlCredentialExtractor( _options.rootDir ).collect( newinfo.
baseUrls() );
1930 MIL <<
"repo " << alias <<
" modified" << endl;
1939 if ( it !=
repos().end() )
1949 for_( it, repoBegin(), repoEnd() )
1951 for_( urlit, (*it).baseUrlsBegin(), (*it).baseUrlsEnd() )
1953 if ( (*urlit).asString(urlview) == url.
asString(urlview) )
1970 assert_alias( service );
1973 if ( hasService( service.
alias() ) )
1979 saveService( toSave );
1983 UrlCredentialExtractor( _options.rootDir ).collect( toSave.
url() );
1985 MIL <<
"added service " << toSave.
alias() << endl;
1992 MIL <<
"Going to delete service " << alias << endl;
1994 const ServiceInfo & service = getService( alias );
1997 if( location.
empty() )
2006 if ( tmpSet.size() == 1 )
2013 MIL << alias <<
" successfully deleted." << endl;
2019 std::ofstream file(location.
c_str());
2026 for_(it, tmpSet.begin(), tmpSet.end())
2028 if( it->alias() != alias )
2029 it->dumpAsIniOn(file);
2032 MIL << alias <<
" successfully deleted from file " << location << endl;
2036 RepoCollector rcollector;
2037 getRepositoriesInService( alias,
2038 boost::make_function_output_iterator( bind( &RepoCollector::collect, &rcollector, _1 ) ) );
2040 for_(rit, rcollector.repos.begin(), rcollector.repos.end())
2041 removeRepository(*rit);
2050 ServiceSet services( serviceBegin(), serviceEnd() );
2051 for_( it, services.begin(), services.end() )
2053 if ( !it->enabled() )
2057 refreshService(*it, options_r);
2067 assert_alias( service );
2068 assert_url( service );
2069 MIL <<
"Going to refresh service '" << service.
alias() <<
"', url: " << service.
url() <<
", opts: " << options_r << endl;
2071 if ( service.
ttl() && !( options_r.testFlag( RefreshService_forceRefresh) || options_r.testFlag( RefreshService_restoreStatus ) ) )
2080 if ( (lrf+=service.
ttl()) > now )
2082 MIL <<
"Skip: '" << service.
alias() <<
"' metadata valid until " << lrf << endl;
2087 WAR <<
"Force: '" << service.
alias() <<
"' metadata last refresh in the future: " << lrf << endl;
2094 bool serviceModified =
false;
2105 serviceModified =
true;
2110 std::string servicesTargetDistro = _options.servicesTargetDistro;
2111 if ( servicesTargetDistro.empty() )
2115 DBG <<
"ServicesTargetDistro: " << servicesTargetDistro << endl;
2119 RepoCollector collector(servicesTargetDistro);
2132 ServiceRepos( _options.rootDir, service, bind( &RepoCollector::collect, &collector, _1 ) );
2137 uglyHack.first =
true;
2138 uglyHack.second = e;
2140 if ( service.
ttl() != origTtl )
2142 if ( !service.
ttl() )
2144 serviceModified =
true;
2152 for_( it, collector.repos.begin(), collector.repos.end() )
2155 it->setAlias(
str::form(
"%s:%s", service.
alias().c_str(), it->alias().c_str() ) );
2157 it->setService( service.
alias() );
2160 newRepoStates[it->alias()] = *it;
2168 if ( !it->path().empty() )
2170 if ( it->path() !=
"/" )
2175 if ( it->baseUrlsEmpty() )
2178 if ( !path.
empty() )
2180 it->setBaseUrl( std::move(url) );
2182 else if ( !path.
empty() )
2185 for (
Url & url : urls )
2189 it->setBaseUrls( std::move(urls) );
2196 RepoInfoList oldRepos;
2197 getRepositoriesInService( service.
alias(), std::back_inserter( oldRepos ) );
2201 for_( oldRepo, oldRepos.begin(), oldRepos.end() )
2203 if ( ! foundAliasIn( oldRepo->alias(), collector.repos ) )
2205 if ( oldRepo->enabled() )
2208 const auto & last = service.
repoStates().find( oldRepo->alias() );
2209 if ( last != service.
repoStates().end() && ! last->second.enabled )
2211 DBG <<
"Service removes user enabled repo " << oldRepo->alias() << endl;
2213 serviceModified =
true;
2216 DBG <<
"Service removes enabled repo " << oldRepo->alias() << endl;
2219 DBG <<
"Service removes disabled repo " << oldRepo->alias() << endl;
2221 removeRepository( *oldRepo );
2227 UrlCredentialExtractor urlCredentialExtractor( _options.rootDir );
2228 for_( it, collector.repos.begin(), collector.repos.end() )
2234 TriBool toBeEnabled( indeterminate );
2235 DBG <<
"Service request to " << (it->enabled()?
"enable":
"disable") <<
" service repo " << it->alias() << endl;
2237 if ( options_r.testFlag( RefreshService_restoreStatus ) )
2239 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() << endl;
2251 DBG <<
"User request to enable service repo " << it->alias() << endl;
2257 serviceModified =
true;
2261 DBG <<
"User request to disable service repo " << it->alias() << endl;
2262 toBeEnabled =
false;
2266 RepoInfoList::iterator oldRepo( findAlias( it->alias(), oldRepos ) );
2267 if ( oldRepo == oldRepos.end() )
2272 if ( ! indeterminate(toBeEnabled) )
2273 it->setEnabled( (
bool ) toBeEnabled );
2275 DBG <<
"Service adds repo " << it->alias() <<
" " << (it->enabled()?
"enabled":
"disabled") << endl;
2276 addRepository( *it );
2281 bool oldRepoModified =
false;
2283 if ( indeterminate(toBeEnabled) )
2287 if ( oldRepo->enabled() == it->enabled() )
2288 toBeEnabled = it->enabled();
2289 else if (options_r.testFlag( RefreshService_restoreStatus ) )
2291 toBeEnabled = it->enabled();
2292 DBG <<
"Opt RefreshService_restoreStatus " << it->alias() <<
" forces " << (toBeEnabled?
"enabled":
"disabled") << endl;
2296 const auto & last = service.
repoStates().find( oldRepo->alias() );
2297 if ( last == service.
repoStates().end() || last->second.enabled != it->enabled() )
2298 toBeEnabled = it->enabled();
2301 toBeEnabled = oldRepo->enabled();
2302 DBG <<
"User modified service repo " << it->alias() <<
" may stay " << (toBeEnabled?
"enabled":
"disabled") << endl;
2308 if ( toBeEnabled == oldRepo->enabled() )
2310 DBG <<
"Service repo " << it->alias() <<
" stays " << (oldRepo->enabled()?
"enabled":
"disabled") << endl;
2312 else if ( toBeEnabled )
2314 DBG <<
"Service repo " << it->alias() <<
" gets enabled" << endl;
2315 oldRepo->setEnabled(
true );
2316 oldRepoModified =
true;
2320 DBG <<
"Service repo " << it->alias() <<
" gets disabled" << endl;
2321 oldRepo->setEnabled(
false );
2322 oldRepoModified =
true;
2328 if ( oldRepo->rawName() != it->rawName() )
2330 DBG <<
"Service repo " << it->alias() <<
" gets new NAME " << it->rawName() << endl;
2331 oldRepo->setName( it->rawName() );
2332 oldRepoModified =
true;
2336 if ( oldRepo->autorefresh() != it->autorefresh() )
2338 DBG <<
"Service repo " << it->alias() <<
" gets new AUTOREFRESH " << it->autorefresh() << endl;
2339 oldRepo->setAutorefresh( it->autorefresh() );
2340 oldRepoModified =
true;
2344 if ( oldRepo->priority() != it->priority() )
2346 DBG <<
"Service repo " << it->alias() <<
" gets new PRIORITY " << it->priority() << endl;
2347 oldRepo->setPriority( it->priority() );
2348 oldRepoModified =
true;
2354 urlCredentialExtractor.extract( newUrls );
2355 if ( oldRepo->rawBaseUrls() != newUrls )
2357 DBG <<
"Service repo " << it->alias() <<
" gets new URLs " << newUrls << endl;
2358 oldRepo->setBaseUrls( std::move(newUrls) );
2359 oldRepoModified =
true;
2369 oldRepo->getRawGpgChecks( ogpg[0], ogpg[1], ogpg[2] );
2370 it-> getRawGpgChecks( ngpg[0], ngpg[1], ngpg[2] );
2371 #define Z_CHKGPG(I,N) \ 2372 if ( ! sameTriboolState( ogpg[I], ngpg[I] ) ) \ 2374 DBG << "Service repo " << it->alias() << " gets new "#N"Check " << ngpg[I] << endl; \ 2375 oldRepo->set##N##Check( ngpg[I] ); \ 2376 oldRepoModified = true; \ 2385 if ( oldRepoModified )
2387 modifyRepository( oldRepo->alias(), *oldRepo );
2396 serviceModified =
true;
2403 serviceModified =
true;
2410 if ( service.
ttl() )
2413 serviceModified =
true;
2416 if ( serviceModified )
2419 modifyService( service.
alias(), service );
2423 if ( uglyHack.first )
2425 throw( uglyHack.second );
2433 MIL <<
"Going to modify service " << oldAlias << endl;
2444 const ServiceInfo & oldService = getService(oldAlias);
2447 if( location.
empty() )
2457 std::ofstream file(location.
c_str());
2458 for_(it, tmpSet.begin(), tmpSet.end())
2460 if( *it != oldAlias )
2461 it->dumpAsIniOn(file);
2470 UrlCredentialExtractor( _options.rootDir ).collect( service.
url() );
2474 if ( oldAlias != service.
alias()
2477 std::vector<RepoInfo> toModify;
2478 getRepositoriesInService(oldAlias, std::back_inserter(toModify));
2479 for_( it, toModify.begin(), toModify.end() )
2486 const auto & last = service.
repoStates().find( it->alias() );
2488 it->setEnabled( last->second.enabled );
2491 it->setEnabled(
false );
2494 if ( oldAlias != service.
alias() )
2495 it->setService(service.
alias());
2497 modifyRepository(it->alias(), *it);
2514 catch (
const media::MediaException &e )
2541 : _pimpl( new
Impl(opt) )
2573 std::string host( url_r.
getHost() );
2574 if ( ! host.empty() )
std::string getScheme() const
Returns the scheme name of the URL.
std::string asString(const Patch::Category &obj)
RepoManager(const RepoManagerOptions &options=RepoManagerOptions())
Pathname filepath() const
File where this repo was read from.
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.
Pathname path() const
Repository path.
RepoStatus cacheStatus(const RepoInfo &info) const
thrown when it was impossible to match a repository
Thrown when the repo alias is found to be invalid.
std::string targetDistribution() const
This is register.target attribute of the installed base product.
RepoManagerOptions(const Pathname &root_r=Pathname())
Default ctor following ZConfig global settings.
Pathname builtinRepoPackagesPath() const
The builtin config file value.
bool empty() const
Whether the status is empty (empty checksum)
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
RepoConstIterator repoEnd() const
void setCacheStatus(const RepoInfo &info, const RepoStatus &status)
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.
void refreshServices(const RefreshServiceOptions &options_r)
Pathname repoRawCachePath
RepoStatus cacheStatus(const RepoInfo &info) const
Status of metadata cache.
bool hasRepo(const std::string &alias) const
Return whether there is a known repository for alias.
void modifyService(const std::string &oldAlias, const ServiceInfo &service)
Modifies service file (rewrites it with new values) and underlying repositories if needed...
const Pathname & path() const
Return current Pathname.
Read service data from a .service file.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
ServiceConstIterator serviceBegin() const
#define ZYPP_THROW(EXCPT)
Drops a logline and throws the Exception.
ServiceInfo getService(const std::string &alias) const
Finds ServiceInfo by alias or return ServiceInfo::noService.
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)
void setProbedType(const repo::RepoType &t) const
This allows to adjust the RepoType lazy, from NONE to some probed value, even for const objects...
scoped_ptr< media::CredentialManager > _cmPtr
Date lrf() const
Date of last refresh (if known).
RWCOW_pointer< Impl > _pimpl
Pointer to implementation.
repo::RepoType probeCache(const Pathname &path_r) const
Probe Metadata in a local cache directory.
RepoStatus metadataStatus(const RepoInfo &info) const
void cleanCacheDirGarbage(const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Remove any subdirectories of cache directories which no longer belong to any of known repositories...
bool hasService(const std::string &alias) const
Return whether there is a known service for alias.
const RepoSet & repos() const
void refreshServices(const RefreshServiceOptions &options_r=RefreshServiceOptions())
Refreshes all enabled services.
Service plugin is immutable.
RefreshCheckStatus
Possibly return state of checkIfRefreshMEtadata function.
Url rawUrl() const
The service raw url (no variables replaced)
const std::string & execError() const
Some detail telling why the execution failed, if it failed.
RepoSet::size_type RepoSizeType
Pathname builtinRepoMetadataPath() const
The builtin config file value.
void loadFromCache(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Load resolvables into the pool.
bool repo_add_probe() const
Whether repository urls should be probed.
repo::ServiceType probeService(const Url &url) const
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
const char * c_str() const
String representation.
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.
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).
bool serviceEmpty() const
Gets true if no service is in RepoManager (so no one in specified location)
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
std::ostream & operator<<(std::ostream &str, const SerialNumber &obj)
What is known about a repository.
bool isCached(const RepoInfo &info) const
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.
Pathname knownServicesPath
std::string receiveLine()
Read one line from the input stream.
void setBaseUrl(const Url &url)
Clears current base URL list and adds url.
ServiceConstIterator serviceEnd() const
Iterator to place behind last service in internal storage.
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)
repo::ServiceType probeService(const Url &url) const
Probe the type or the service.
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
bool enabled() const
If enabled is false, then this repository must be ignored as if does not exists, except when checking...
static RepoStatus fromCookieFile(const Pathname &path)
Reads the status from a cookie file.
void setProbedType(const repo::ServiceType &t) const
Lazy init service type.
Service without alias was used in an operation.
RepoSet::const_iterator RepoConstIterator
function< bool(const ProgressData &)> ReceiverFnc
Most simple version of progress reporting The percentage in most cases.
RepoConstIterator repoBegin() const
Url::asString() view options.
Pathname metadataPath(const RepoInfo &info) const
Path where the metadata is downloaded and kept.
static bool schemeIsPlugin(const std::string &scheme_r)
plugin
void cleanMetadata(const RepoInfo &info, OPT_PROGRESS)
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
urls_const_iterator baseUrlsBegin() const
iterator that points at begin of repository urls
RepoManagerOptions _options
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
void addRepository(const RepoInfo &info, OPT_PROGRESS)
Url url() const
Pars pro toto: The first repository url.
bool repoToEnableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToEnable.
static const ServiceType RIS
Repository Index Service (RIS) (formerly known as 'Novell Update' (NU) service)
void saveToCookieFile(const Pathname &path_r) const
Save the status information to a cookie file.
RepoStatus metadataStatus(const RepoInfo &info) const
Status of local metadata.
RepoManager implementation.
bool empty() const
Test for an empty path.
#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.
RepoConstIterator repoBegin() const
Store and operate on date (time_t).
std::string asString() const
Returns a default string representation of the Url object.
static Pool instance()
Singleton ctor.
ServiceSizeType serviceSize() 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
Pathname packagesPath(const RepoInfo &info) const
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...
RepoSizeType repoSize() const
Impl * clone() const
clone for RWCOW_pointer
void clearReposToDisable()
Clear the set of ReposToDisable.
Lightweight repository attribute value lookup.
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.
const std::string & asString() const
String representation.
RepoStatus status(MediaSetAccess &media_r) override
Status of the remote repository.
std::string alias() const
unique identifier for this source.
bool isExist() const
Return whether valid stat info exists.
unsigned repo_refresh_delay() const
Amount of time in minutes that must pass before another refresh.
static const ServiceType NONE
No service set.
ServiceConstIterator serviceBegin() const
Iterator to first service in internal storage.
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
static const SolvAttr repositoryToolVersion
Service type enumeration.
void modifyRepository(const std::string &alias, const RepoInfo &newinfo_r, OPT_PROGRESS)
std::string asUserString() const
Translated error message as string suitable for the user.
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)
Pathname dirname() const
Return all but the last component od this path.
bool reposToDisableEmpty() const
static Pathname assertprefix(const Pathname &root_r, const Pathname &path_r)
Return path_r prefixed with root_r, unless it is already prefixed.
int recursive_rmdir(const Pathname &path)
Like 'rm -r DIR'.
void setMetadataPath(const Pathname &path)
Set the path where the local metadata is stored.
std::string asCompleteString() const
Returns a complete string representation of the Url object.
void setType(const repo::RepoType &t)
set the repository type
Maintain [min,max] and counter (value) for progress counting.
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.
Writing the zypp history fileReference counted signleton for writhing the zypp history file...
RepoConstIterator repoEnd() const
static bool schemeIsVolatile(const std::string &scheme_r)
cd dvd
repo::RepoType probe(const Url &url, const Pathname &path=Pathname()) const
Probe the metadata type of a repository located at url.
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.
RepoInfo getRepo(const std::string &alias) const
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
const std::string & asString() const
Return current Pathname as String.
void cleanCache(const RepoInfo &info, OPT_PROGRESS)
std::string numstring(char n, int w=0)
ServiceSet::size_type ServiceSizeType
Date::Duration ttl() const
Sugested TTL between two metadata auto-refreshs.
static const RepoType NONE
bool hasService(const std::string &alias) const
int touch(const Pathname &path)
Change file's modification and access times.
void resetDispose()
Set no dispose function.
Url url() const
The service url.
RepoSizeType repoSize() const
void setPackagesPath(const Pathname &path)
set the path where the local packages are stored
ServiceSizeType serviceSize() const
Gets count of service in RepoManager (in specified location)
std::ostream & copy(std::istream &from_r, std::ostream &to_r)
Copy istream to ostream.
int close()
Wait for the progamm to complete.
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).
int readdir(std::list< std::string > &retlist_r, const Pathname &path_r, bool dots_r)
Return content of directory via retlist.
Pathname builtinRepoSolvfilesPath() const
The builtin config file value.
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...
static const RepoType YAST2
thrown when it was impossible to determine an alias for this repo.
std::string generateFilename(const RepoInfo &info) const
void buildCache(const RepoInfo &info, CacheBuildPolicy policy=BuildIfNeeded, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Refresh local cache.
const RepoStates & repoStates() const
Access the remembered repository states.
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.
Date timestamp() const
The time the data were changed the last time.
const std::string & command() const
The command we're executing.
std::set< ServiceInfo > ServiceSet
ServiceInfo typedefs.
Exception for repository handling.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Write this RepoInfo object into str in a .repo file format.
virtual std::ostream & dumpAsIniOn(std::ostream &str) const
Writes ServiceInfo to stream in ".service" format.
Impl(const RepoManagerOptions &opt)
Pathname packagesPath(const RepoInfo &info) const
Path where the rpm packages are downloaded and kept.
media::MediaAccessId _mid
static Date now()
Return the current time.
bool repoToDisableFind(const std::string &alias_r) const
Whether alias_r is mentioned in ReposToDisable.
bool ZYPP_PLUGIN_APPDATA_FORCE_COLLECT()
To trigger appdata refresh unconditionally.
#define PL_(MSG1, MSG2, N)
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
DefaultIntegral< bool, false > _reposDirty
std::string getHost(EEncoding eflag=zypp::url::E_DECODED) const
Returns the hostname or IP from the URL authority.
Functor thats filter RepoInfo by service which it belongs to.
bool serviceEmpty() const
bool strToBool(const C_Str &str, bool default_r)
Parse str into a bool depending on the default value.
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
The repository cache is not built yet so you can't create the repostories from the cache...
void eraseFromPool()
Remove this Repository from its Pool.
Pathname repoPackagesCachePath
repo::RepoType probe(const Url &url, const Pathname &path) const
Probe repo metadata type.
bool hasRepo(const std::string &alias) const
static const ServiceInfo noService
Represents an empty service.
void saveService(ServiceInfo &service) const
Wrapper class for ::stat/::lstat.
void removeService(const std::string &alias)
void buildCache(const RepoInfo &info, CacheBuildPolicy policy, OPT_PROGRESS)
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.
urls_const_iterator baseUrlsEnd() const
iterator that points at end of repository urls
static const RepoType RPMPLAINDIR
static const std::string & systemRepoAlias()
Reserved system repository alias .
ServiceInfo getService(const std::string &alias) const
Track changing files or directories.
void cleanPackages(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local package cache.
Repository already exists and some unique attribute can't be duplicated.
bool set(value_type val_r)
Set new counter value.
urls_size_type baseUrlsSize() const
number of repository urls
static bool schemeIsDownloading(const std::string &scheme_r)
http https ftp sftp tftp
void getRepositoriesInService(const std::string &alias, OutputIterator out) const
void modifyRepository(const RepoInfo &oldrepo, const RepoInfo &newrepo)
Log certain modifications to a repository.
std::ostream & operator<<(std::ostream &str, const RepoManager::Impl &obj)
ServiceConstIterator serviceEnd() const
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...
Easy-to use interface to the ZYPP dependency resolver.
Pathname metadataPath(const RepoInfo &info) const
void cleanPackages(const RepoInfo &info, OPT_PROGRESS)
std::string generateFilename(const ServiceInfo &info) const
RepoInfo getRepo(const std::string &alias) const
Find RepoInfo by alias or return RepoInfo::noRepo.
void loadFromCache(const RepoInfo &info, OPT_PROGRESS)
std::string hexstring(char n, int w=4)
bool isCached(const RepoInfo &info) const
Whether a repository exists in cache.
void addService(const std::string &alias, const Url &url)
Adds a new service by its alias and URL.
repo::ServiceType type() const
Service type.
void refreshMetadata(const RepoInfo &info, RawMetadataRefreshPolicy policy, OPT_PROGRESS)
std::string label() const
Label for use in messages for the user interface.
url_set baseUrls() const
The complete set of repository urls.
Service has no or invalid url defined.
repo::RepoType type() const
Type of repository,.
static bool schemeIsLocal(const std::string &scheme_r)
hd cd dvd dir file iso
void addRepositories(const Url &url, OPT_PROGRESS)
Pathname generateNonExistingName(const Pathname &dir, const std::string &basefilename) const
Generate a non existing filename in a directory, using a base name.
void cleanMetadata(const RepoInfo &info, const ProgressData::ReceiverFnc &progressrcv=ProgressData::ReceiverFnc())
Clean local metadata.
Repository type enumeration.
RefreshCheckStatus checkIfToRefreshMetadata(const RepoInfo &info, const Url &url, RawMetadataRefreshPolicy policy)