def writecachedrepo(self, ext, repodata=None): if 'incomplete' in self: return tmpname = None try: if not os.path.isdir("/var/cache/solv"): os.mkdir("/var/cache/solv", 0o755) (fd, tmpname) = tempfile.mkstemp(prefix='.newsolv-', dir='/var/cache/solv') os.fchmod(fd, 0o444) f = os.fdopen(fd, 'wb+') f = solv.xfopen_fd(None, f.fileno()) if not repodata: self.handle.write(f) elif ext: repodata.write(f) else: # rewrite_repos case, do not write stubs self.handle.write_first_repodata(f) f.flush() if self.type != 'system' and not ext: if not hasattr(self, 'extcookie'): self['extcookie'] = self.calc_cookie_ext(f, self['cookie']) f.write(self['extcookie']) if not ext: f.write(self['cookie']) else: f.write(self['extcookie']) f.close if self.handle.iscontiguous(): # switch to saved repo to activate paging and save memory nf = solv.xfopen(tmpname) if not ext: # main repo self.handle.empty() flags = solv.Repo.SOLV_ADD_NO_STUBS if repodata: flags = 0 # rewrite repos case, recreate stubs if not self.handle.add_solv(nf, flags): sys.exit("internal error, cannot reload solv file") else: # extension repodata # need to extend to repo boundaries, as this is how # repodata.write() has written the data repodata.extend_to_repo() flags = solv.Repo.REPO_EXTEND_SOLVABLES if ext != 'DL': flags |= solv.Repo.REPO_LOCALPOOL repodata.add_solv(nf, flags) os.rename(tmpname, self.cachepath(ext)) except (OSError, IOError): if tmpname: os.unlink(tmpname)
def setup(self): """ Load the repos into repostore to query package dependencies """ for repo in self.repos: solv_repo = self.pool.add_repo(str(repo['id'])) solv_path = os.path.join(repo['relative_path'], 'solv') if not os.path.isfile(solv_path) or not solv_repo.add_solv( solv.xfopen(str(solv_path)), 0): raise Exception( "Repository solv file cannot be found at: {}".format( solv_path)) self.pool.addfileprovides() self.pool.createwhatprovides()
def dump_solv(name, baseurl): pool = solv.Pool() pool.setarch() repo = pool.add_repo(''.join(random.choice(string.ascii_letters) for _ in range(5))) if not parse_repomd(repo, baseurl) and not parse_susetags(repo, baseurl): raise Exception('neither repomd nor susetags exists in ' + baseurl) repo.create_stubs() ofh = solv.xfopen(name, 'w') repo.write(ofh) ofh.flush() return name
def raw_list_packages(self, filters=None): if not self.repo.is_configured: self.setup_repo(self.repo) pool = solv.Pool() repo = pool.add_repo(str(self.channel_label or self.reponame)) solv_path = os.path.join(self.repo.root, ZYPP_SOLV_CACHE_PATH, self.channel_label or self.reponame, 'solv') if not os.path.isfile(solv_path) or not repo.add_solv(solv.xfopen(str(solv_path)), 0): raise SolvFileNotFound(solv_path) rawpkglist = [] for solvable in repo.solvables_iter(): # Solvables with ":" in name are not packages if ':' in solvable.name: continue rawpkglist.append(RawSolvablePackage(solvable)) self.num_packages = len(rawpkglist) return rawpkglist
def load(self, pool): self.handle = pool.add_repo(self.name) self.handle.appdata = self pool.installed = self.handle sys.stdout.write("rpm database: ") self['cookie'] = self.calc_cookie_file("/var/lib/rpm/Packages") if self.usecachedrepo(None): print("cached") return True print("reading") if hasattr(self.handle.__class__, 'add_products'): self.handle.add_products("/etc/products.d", solv.Repo.REPO_NO_INTERNALIZE) f = solv.xfopen(self.cachepath()) self.handle.add_rpmdb_reffp(f, solv.Repo.REPO_REUSE_REPODATA) self.writecachedrepo(None) return True
def _get_solvable_packages(self): """ Return the full list of solvable packages available at the configured repo. This information is read from the solv file created by Zypper. :returns: list """ if not self.repo.is_configured: self.setup_repo(self.repo) self.solv_pool = solv.Pool() self.solv_repo = self.solv_pool.add_repo(str(self.channel_label or self.reponame)) solv_path = os.path.join(self.repo.root, ZYPP_SOLV_CACHE_PATH, self.channel_label or self.reponame, 'solv') if not os.path.isfile(solv_path) or not self.solv_repo.add_solv(solv.xfopen(str(solv_path)), 0): raise SolvFileNotFound(solv_path) self.solv_pool.addfileprovides() self.solv_pool.createwhatprovides() # Solvables with ":" in name are not packages return [pack for pack in self.solv_repo.solvables if ':' not in pack.name]
def write_cached_repo(self, ext, info=None): try: if not os.path.isdir(self.md_cache_dir): os.mkdir(self.md_cache_dir, 0755) (fd, tmpname) = tempfile.mkstemp(prefix='.newsolv-', dir=self.md_cache_dir) os.fchmod(fd, 0444) f = os.fdopen(fd, 'w+') if not info: self.handle.write(f) elif ext: info.write(f) else: # rewrite_repos case self.handle.write_first_repodata(f) if self.type != 'system' and not ext: if 'extcookie' not in self: self.get_ext_cookie(f) f.write(self['extcookie']) if not ext: f.write(self['cookie']) else: f.write(self['extcookie']) f.close() if self.handle.iscontiguous(): # Switch to saved repo to activate paging and save memory. nf = solv.xfopen(tmpname) if not ext: # Main repository. self.handle.empty() if not self.handle.add_solv(nf, solv.Repo.SOLV_ADD_NO_STUBS): sys.exit("Internal error, cannot reload solv file.") else: # Extension repodata. # Need to extend to repo boundaries, as this is how # info.write() has written the data. info.extend_to_repo() # LOCALPOOL does not help as pool already contains all ids info.add_solv(nf, solv.Repo.REPO_EXTEND_SOLVABLES) solv.xfclose(nf) os.rename(tmpname, self.cache_path(ext)) except IOError, e: if tmpname: os.unlink(tmpname)
def list_packages(self, filters, latest): """ List available packages. :returns: list """ if not self.repo.is_configured: self.setup_repo(self.repo) pool = solv.Pool() repo = pool.add_repo(str(self.channel_label or self.reponame)) solv_path = os.path.join(self.repo.root, ZYPP_SOLV_CACHE_PATH, self.channel_label or self.reponame, 'solv') if not os.path.isfile(solv_path) or not repo.add_solv(solv.xfopen(str(solv_path)), 0): raise SolvFileNotFound(solv_path) #TODO: Implement latest #if latest: # pkglist = pkglist.returnNewestByNameArch() #TODO: Implement sort #pkglist.sort(self._sort_packages) to_return = [] for pack in repo.solvables: # Solvables with ":" in name are not packages if ':' in pack.name: continue new_pack = ContentPackage() epoch, version, release = RawSolvablePackage._parse_solvable_evr(pack.evr) new_pack.setNVREA(pack.name, version, release, epoch, pack.arch) new_pack.unique_id = RawSolvablePackage(pack) checksum = pack.lookup_checksum(solv.SOLVABLE_CHECKSUM) new_pack.checksum_type = checksum.typestr() new_pack.checksum = checksum.hex() to_return.append(new_pack) self.num_packages = len(to_return) return to_return
from __future__ import print_function import sys import os import re import solv pool = solv.Pool() args = sys.argv[1:] if len(args) < 2: print("usage: checknewer NEWREPO OLDREPO1 [OLDREPO2...]") sys.exit(1) firstrepo = None for arg in args: argf = solv.xfopen(arg) repo = pool.add_repo(arg) if not firstrepo: firstrepo = repo if re.search(r'solv$', arg): repo.add_solv(argf) elif re.search(r'primary\.xml', arg): repo.add_rpmmd(argf, None) elif re.search(r'packages', arg): repo.add_susetags(argf, 0, None) else: print("%s: unknown repo type" % (arg)) sys.exit(1) # we only want self-provides for p in pool.solvables: