Exemple #1
0
 def __init__(self):
     self._publish = Gate().grants('gentoo', 'repositories')
     self._fill_overlays()
     tree_config = config()
     tree_config['PORTDIR_OVERLAY'] = ' '.join(self._get_active_paths())
     tree_config['PORTDIR'] = main_tree_dir()
     self._dbapi = portdbapi(main_tree_dir(), tree_config)
Exemple #2
0
 def __init__(self):
     self._publish = Gate().grants('gentoo', 'repositories')
     self._fill_overlays()
     tree_config = config()
     tree_config['PORTDIR_OVERLAY'] = ' '.join(self._get_active_paths())
     tree_config['PORTDIR'] = main_tree_dir()
     self._dbapi = portdbapi(main_tree_dir(), tree_config)
Exemple #3
0
def get_atom(package):
	"""Return the atom for a specified package name."""

	try:
		atom = cpv_expand.cpv_expand(package, mydb=porttree.portdbapi())
	except AmbiguousPackageName as e:
		print('Found several matches for "%s": %s' % (package, e))
		return None
	return atom if not atom.startswith('null/') else None
def getAllMeta(metadata, ebuild_repo, super_repo=None):
	print("EBUILD REPO", ebuild_repo.root, "SUPER_REPO", super_repo.root)
	metadict = { "LICENSE" : 0, "INHERITED" : 1 }
	metapos = metadict[metadata]

	# ebuild_repo is where we get the set of all packages for our loop:
	eb_name = ebuild_repo.reponame if ebuild_repo.reponame else repoName(ebuild_repo)
	env = os.environ.copy()
	# super_repo contains all ebuilds in ebuild_repo AND eclasses
	if super_repo:
		super_name = super_repo.reponame if super_repo.reponame else repoName(super_repo)
		env['PORTAGE_REPOSITORIES'] = '''
[DEFAULT]
main-repo = gentoo

[gentoo]
location = %s

[%s]
location = %s
eclass-overrides = gentoo 
aliases = -gentoo
masters = gentoo 
	''' % ( super_repo.root, eb_name, ebuild_repo.root)
	else:
		env['PORTAGE_REPOSITORIES'] = '''
[DEFAULT]
main-repo = %s

[%s]
location = %s
	''' % ( eb_name, eb_name, eb_name, ebuild_repo.root )
	print(env['PORTAGE_REPOSITORIES'])
	p = portdbapi(mysettings=portage.config(env=env,config_profile_path=''))
	p.frozen = False
	myeclasses = set()
	for cp in p.cp_all(trees=[ebuild_repo.root]):
		for cpv in p.cp_list(cp, mytree=ebuild_repo.root):
			try:
				aux = p.aux_get(cpv, ["LICENSE","INHERITED"], mytree=ebuild_repo.root)
			except PortageKeyError:
				print("Portage key error for %s" % repr(cpv))
				raise
			if metadata == "INHERITED":
				for eclass in aux[metapos].split():
					key = eclass + ".eclass"
					if key not in myeclasses:
						myeclasses.add(key)
			elif metadata == "LICENSE":
				for lic in aux[metapos].split():
					if lic not in myeclasses:
						myeclasses.add(lic)
	return myeclasses
Exemple #5
0
    def get_repo_info(self):
        """
        Get portage repos informations and return formatted
        """
        logger = logging.getLogger(f'::{self.__logger_name}::get_repo_info::')

        # Generic infos
        infos = {
            'names': [],
            'formatted': 'unknow',
            'count': '(?)',
            'msg': 'repo',
            'failed': [],
            'success': []
        }

        names = portdbapi().getRepositories()

        if names:
            names = sorted(names)
            count = len(names)
            msg = 'repositories'
            # get only first 6 elements if names > 6
            if count > 6:
                formatted = ', '.join(names[:6]) + ' (+' + str(count - 6) + ')'
            elif count == 1:
                msg = 'repository'
                formatted = ''.join(names)
            else:
                formatted = ', '.join(names)
            logger.debug(f"Informations extracted for {count} {msg}: "
                         f"{','.join(names)}")

            infos['names'] = names
            infos['formatted'] = formatted
            infos['count'] = count
            infos['msg'] = msg
            return infos

        logger.error("Failed to extract repositories informations"
                     " from portdbapi().getRepositories()")
        return infos
Exemple #6
0
    def available_portage_update(self, detected=False, init=False):
        """
        Check if an update to portage is available.
        """

        # TODO: be more verbose for debug !
        name = 'available_portage_update'
        logger = logging.getLogger(f'{self.__logger_name}{name}::')

        logger.debug(f"Running with detected={detected}, init={init}")

        self.available = False
        self.latest = False
        self.current = False

        # First, any way get installed and latest
        current = vardbapi().match('portage')[0]
        latest = portdbapi().xmatch('bestmatch-visible', 'portage')

        # Then just compare
        # From site-packages/portage/versions.py
        #   @param mypkg: either a pv or cpv
        #   @return:
        #   1. None if input is invalid.
        #   2. (pn, ver, rev) if input is pv
        #   3. (cp, ver, rev) if input is a cpv
        result = pkgcmp(pkgsplit(latest), pkgsplit(current))
        # From site-packages/portage/versions.py
        # Parameters:
        # pkg1 (list (example: ['test', '1.0', 'r1'])) -
        #                           package to compare with
        # pkg2 (list (example: ['test', '1.0', 'r1'])) -
        #                           package to compare againts
        # Returns: None or integer
        # None if package names are not the same
        # 1 if pkg1 is greater than pkg2
        # -1 if pkg1 is less than pkg2
        # 0 if pkg1 equals pkg2
        if result == None or result == -1:
            msg = 'no result (package names are not the same ?!)'
            if result == -1:
                msg = ('the latest version available is lower than the'
                       ' one installed...')
            logger.error("FAILED to compare versions when obtaining update "
                         "informations for the portage package.")
            logger.error(f"Result is: {msg}")
            logger.error(f"Current portage version: {current}, latest:"
                         f" {latest}.")
            # Return is ignored for the moment...
            # TODO ??
            return

        # Split current version
        # as we don't know yet if latest > current
        split = pkgsplit(current)
        self.current = split[1]
        if not split[2] == 'r0':
            self.current = '-'.join(split[-2:])

        # Check if an update to portage is available
        if result:
            # Now, split latest because > current
            split = pkgsplit(latest)
            self.latest = split[1]
            if not split[2] == 'r0':
                self.latest = '-'.join(split[-2:])
            logger.debug(f"Found an update to portage (from {self.current}"
                         f" to {self.latest}).")
            # Print only one time when program start
            if init:
                logger.info("Found an update to portage (from "
                            f"{self.current} to {self.latest}).")
            self.available = True
        else:
            logger.debug("No update to portage package is available"
                         f" (current version: {self.current})")
            self.available = False

        # For detected we have to compare current extracted
        # version and last current know version (so from
        # self.portage['current']. Both versions are already
        # split
        if detected:
            # From site-packages/portage/versions.py
            #   Compare two versions
            #   Example usage:
            #       >>> from portage.versions import vercmp
            #       >>> vercmp('1.0-r1','1.2-r3')
            #       negative number
            #       >>> vercmp('1.3','1.2-r3')
            #       positive number
            #       >>> vercmp('1.0_p3','1.0_p3')
            #       0
            #   @param pkg1: version to compare with
            #       (see ver_regexp in portage.versions.py)
            #   @type pkg1: string (example: "2.1.2-r3")
            #   @param pkg2: version to compare againts
            #       (see ver_regexp in portage.versions.py)
            #   @type pkg2: string (example: "2.1.2_rc5")
            #   @rtype: None or float
            #   @return:
            #   1. positive if ver1 is greater than ver2
            #   2. negative if ver1 is less than ver2
            #   3. 0 if ver1 equals ver2
            #   4. None if ver1 or ver2 are invalid
            #       (see ver_regexp in portage.versions.py)
            compare = vercmp(self.portage['current'], self.current)
            msg = False
            add_msg = ''
            if compare < 0:
                # If not available and it have been updated
                # than it have been updated to latest one
                if not self.available:
                    add_msg = 'latest '
                msg = (f"The portage package has been updated (from "
                       f"{self.portage['current']} to "
                       f"{add_msg}{self.current}).")
            elif compare > 0:
                # Same here but reversed: if it was not
                # available (self.portage['available'])
                # and now it is (self.available) than
                # it have been downgraded from latest.
                if not self.portage['available'] and self.available:
                    add_msg = 'latest '
                msg = (f"The portage package has been downgraded (from "
                       f"{add_msg}{self.portage['current']} to "
                       f"{self.current}).")
            elif compare == 0:
                # This have been aborted
                msg = ("The portage package process has been aborted.")

            # Just skipp if msg = False
            # so that mean compare == None
            if msg:
                logger.info(msg)

        tosave = []
        # Update only if change
        for key in 'current', 'latest', 'available':
            if not self.portage[key] == getattr(self, key):
                # This print if there a new version of portage available
                # even if there is already an older version available
                # TEST: if checking only for key latest than it could
                # be == to current so check also result.
                if key == 'latest' and result:
                    logger.info("Found an update to portage (from "
                                f"{self.current} to {self.latest}).")

                self.portage[key] = getattr(self, key)
                tosave.append([f'portage {key}', self.portage[key]])

        if tosave:
            self.stateinfo.save(*tosave)
Exemple #7
0
import os
import sys
import portage
from portage.dbapi.porttree import portdbapi

portdir = os.path.realpath(sys.argv[1])

env = {}
env["PORTAGE_REPOSITORIES"] = """
[gentoo_prefix]
location = %s

""" % portdir

settings = portage.config(env=env)

portdb = portdbapi(mysettings=settings)
portdb.porttrees = [portdir]

for i in range(2, len(sys.argv)):
	for ebuild in portdb.cp_list(sys.argv[i]):
		for distfile in portdb.getFetchMap(ebuild):
			print(distfile)
#!/usr/bin/python

from portage.dbapi.porttree import portdbapi
import subprocess

TREE = "/usr/portage/"

dbapi = portdbapi()
pkgs = dbapi.cp_all(categories=None, trees=[TREE])

for pkg in pkgs:
	res = subprocess.call("egrep -q \"SLOT=\\\"?[0-9]*\/\" %s/%s/*.ebuild" % (TREE, pkg), shell=True)
	if res == 0:
		print("%s" % pkg)

Exemple #9
0
 def __init__(self):
     self.dbapi = portdbapi()
     self.subslottedCp = []
     with open("subslotted-packages.txt", "r") as f:
         for line in f:
             self.subslottedCp.append(line[:-1])
Exemple #10
0
#!/usr/bin/python

from portage.dbapi.porttree import portdbapi
import subprocess

TREE = "/usr/portage/"

dbapi = portdbapi()
pkgs = dbapi.cp_all(categories=None, trees=[TREE])

for pkg in pkgs:
    res = subprocess.call("egrep -q \"SLOT=\\\"?[0-9]*\/\" %s/%s/*.ebuild" %
                          (TREE, pkg),
                          shell=True)
    if res == 0:
        print("%s" % pkg)
	def __init__(self):
		self.dbapi = portdbapi()
		self.subslottedCp = []
		with open("subslotted-packages.txt", "r") as f:
			for line in f:
				self.subslottedCp.append(line[:-1])