示例#1
0
 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)
示例#2
0
 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 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
示例#5
0
文件: yum_src.py 项目: renner/uyuni
 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
示例#6
0
 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
示例#7
0
    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]
示例#8
0
文件: libsolv.py 项目: rtnpro/faf
 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)
示例#9
0
文件: yum_src.py 项目: renner/uyuni
    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: