42 struct RepoMirrorListTempProvider
44 RepoMirrorListTempProvider()
46 RepoMirrorListTempProvider(
const Pathname & localfile_r )
49 RepoMirrorListTempProvider(
const Url & url_r )
52 abs_url.setPathName(
"/" );
53 abs_url.setQueryParam(
"mediahandler",
"curl" );
54 _access.reset(
new MediaSetAccess( abs_url ) );
58 const Pathname & localfile()
const
67 inline std::vector<Url> RepoMirrorListParseXML(
const Pathname &tmpfile )
69 InputStream tmpfstream (tmpfile);
70 media::MetaLinkParser metalink;
71 metalink.parse(tmpfstream);
72 return metalink.getUrls();
75 inline std::vector<Url> RepoMirrorListParseTXT(
const Pathname &tmpfile )
77 InputStream tmpfstream (tmpfile);
78 std::vector<Url> my_urls;
80 while (
getline(tmpfstream.stream(), tmpurl))
82 my_urls.push_back(Url(tmpurl));
88 inline std::vector<Url> RepoMirrorListParse(
const Url & url_r,
const Pathname & listfile_r )
90 USR << url_r <<
" " << listfile_r << endl;
92 std::vector<Url> mirrorurls;
93 if ( url_r.asString().find(
"/metalink" ) != string::npos )
94 mirrorurls = RepoMirrorListParseXML( listfile_r );
96 mirrorurls = RepoMirrorListParseTXT( listfile_r );
100 for (
auto & murl : mirrorurls )
102 if ( murl.getScheme() !=
"rsync" )
104 size_t delpos = murl.getPathName().find(
"repodata/repomd.xml");
105 if( delpos != string::npos )
107 murl.setPathName( murl.getPathName().erase(delpos) );
109 ret.push_back( murl );
111 if ( ret.size() >= 4 )
122 RepoMirrorList::RepoMirrorList(
const Url & url_r,
const Pathname & metadatapath_r )
127 _urls = RepoMirrorListParse( url_r, url_r.
getPathName() );
129 else if ( ! PathInfo( metadatapath_r).isDir() )
132 RepoMirrorListTempProvider provider( url_r );
133 _urls = RepoMirrorListParse( url_r, provider.localfile() );
138 Pathname cachefile( metadatapath_r );
139 if ( url_r.
asString().find(
"/metalink" ) != string::npos )
140 cachefile /=
"mirrorlist.xml";
142 cachefile /=
"mirrorlist.txt";
145 if ( !cacheinfo.
isFile() || cacheinfo.
mtime() < time(NULL) - (long) ZConfig::instance().repo_refresh_delay() * 60 )
147 DBG <<
"Getting MirrorList from URL: " << url_r << endl;
148 RepoMirrorListTempProvider provider( url_r );
151 DBG <<
"Copy MirrorList file to " << cachefile << endl;
156 _urls = RepoMirrorListParse( url_r, cachefile );
159 DBG <<
"Removing Cachefile as it contains no URLs" << endl;
int assert_dir(const Pathname &path, unsigned mode)
Like 'mkdir -p'.
std::string getPathName(EEncoding eflag=zypp::url::E_DECODED) const
Returns the path name from the URL.
std::string asString() const
Returns a default string representation of the Url object.
std::string getline(std::istream &str)
Read one line from stream.
int unlink(const Pathname &path)
Like 'unlink'.
int hardlinkCopy(const Pathname &oldpath, const Pathname &newpath)
Create newpath as hardlink or copy of oldpath.
shared_ptr< MediaSetAccess > _access
Wrapper class for ::stat/::lstat.
std::string getScheme() const
Returns the scheme name of the URL.