示例#1
0
def _finalize():
    global _items
    printer = EOutput()
    for root, key, logentries in _items:
        print()
        if root == "/":
            printer.einfo(
                _("Messages for package %s:") % colorize("INFORM", key))
        else:
            printer.einfo(
                _("Messages for package %(pkg)s merged to %(root)s:") % {
                    "pkg": colorize("INFORM", key),
                    "root": root
                })
        print()
        for phase in EBUILD_PHASES:
            if phase not in logentries:
                continue
            for msgtype, msgcontent in logentries[phase]:
                fmap = {
                    "INFO": printer.einfo,
                    "WARN": printer.ewarn,
                    "ERROR": printer.eerror,
                    "LOG": printer.einfo,
                    "QA": printer.ewarn
                }
                if isinstance(msgcontent, basestring):
                    msgcontent = [msgcontent]
                for line in msgcontent:
                    fmap[msgtype](line.strip("\n"))
    _items = []
    return
def finalize(mysettings=None):
	"""The mysettings parameter is just for backward compatibility since
	an older version of portage will import the module from a newer version
	when it upgrades itself."""
	global _items
	printer = EOutput()
	for root, key, logentries in _items:
		print()
		if root == "/":
			printer.einfo(_("Messages for package %s:") %
				colorize("INFORM", key))
		else:
			printer.einfo(_("Messages for package %(pkg)s merged to %(root)s:") %
				{"pkg": colorize("INFORM", key), "root": root})
		print()
		for phase in EBUILD_PHASES:
			if phase not in logentries:
				continue
			for msgtype, msgcontent in logentries[phase]:
				fmap = {"INFO": printer.einfo,
						"WARN": printer.ewarn,
						"ERROR": printer.eerror,
						"LOG": printer.einfo,
						"QA": printer.ewarn}
				if isinstance(msgcontent, basestring):
					msgcontent = [msgcontent]
				for line in msgcontent:
					fmap[msgtype](line.strip("\n"))
	_items = []
	return
示例#3
0
def _finalize():
	global _items
	printer = EOutput()
	for root, key, logentries in _items:
		print()
		if root == "/":
			printer.einfo(_("Messages for package %s:") %
				colorize("INFORM", key))
		else:
			printer.einfo(_("Messages for package %(pkg)s merged to %(root)s:") %
				{"pkg": colorize("INFORM", key), "root": root})
		print()
		for phase in EBUILD_PHASES:
			if phase not in logentries:
				continue
			for msgtype, msgcontent in logentries[phase]:
				fmap = {"INFO": printer.einfo,
						"WARN": printer.ewarn,
						"ERROR": printer.eerror,
						"LOG": printer.einfo,
						"QA": printer.ewarn}
				if isinstance(msgcontent, basestring):
					msgcontent = [msgcontent]
				for line in msgcontent:
					fmap[msgtype](line.strip("\n"))
	_items = []
	return
示例#4
0
def finalize(mysettings=None):
    """The mysettings parameter is just for backward compatibility since
	an older version of portage will import the module from a newer version
	when it upgrades itself."""
    global _items
    printer = EOutput()
    for root, key, logentries in _items:
        print()
        if root == "/":
            printer.einfo(
                _("Messages for package %s:") % colorize("INFORM", key))
        else:
            printer.einfo(
                _("Messages for package %(pkg)s merged to %(root)s:") % {
                    "pkg": colorize("INFORM", key),
                    "root": root
                })
        print()
        for phase in EBUILD_PHASES:
            if phase not in logentries:
                continue
            for msgtype, msgcontent in logentries[phase]:
                fmap = {
                    "INFO": printer.einfo,
                    "WARN": printer.ewarn,
                    "ERROR": printer.eerror,
                    "LOG": printer.einfo,
                    "QA": printer.ewarn
                }
                if isinstance(msgcontent, basestring):
                    msgcontent = [msgcontent]
                for line in msgcontent:
                    fmap[msgtype](line.strip("\n"))
    _items = []
    return
示例#5
0
class HookDirectory(object):

	def __init__ (self, phase, settings, myopts=None, myaction=None, mytargets=None):
		self.myopts = myopts
		self.myaction = myaction
		self.mytargets = mytargets
		check_config_instance(settings)
		self.settings = settings
		self.path = os.path.join(settings["PORTAGE_CONFIGROOT"], HOOKS_PATH, phase + '.d')
		self.output = EOutput()

	def execute (self, path=None):
		if "hooks" not in self.settings['FEATURES']:
			return
		
		if not path:
			path = self.path
		
		path = normalize_path(path)
		
		if not os.path.exists(path):
			if self.myopts and "--debug" in self.myopts:
				# behavior mimicked by hook.sh
				self.output.ewarn('This hook path could not be found; ignored: ' + path)
			return
		
		if os.path.isdir(path):
			command=[HOOKS_SH_BINARY]
			if self.myopts:
				for myopt in self.myopts:
					command.extend(['--opt', myopt])
			if self.myaction:
				command.extend(['--action', self.myaction])
			if self.mytargets:
				for mytarget in self.mytargets:
					command.extend(['--target', mytarget])
			
			command=[BASH_BINARY, '-c', 'cd "'+path+'" && source "' + PORTAGE_BIN_PATH + '/isolated-functions.sh" && source ' + ' '.join(command)]
			if self.myopts and "--verbose" in self.myopts:
				self.output.einfo('Executing hooks directory "' + self.path + '"...')
			code = spawn(mycommand=command, env=self.settings.environ())
			if code: # if failure
				# behavior mimicked by hook.sh
				raise PortageException('!!! Hook directory %s failed with exit code %s' % (self.path, code))
		
		else:
			raise InvalidLocation('This hook path ought to be a directory: ' + path)
示例#6
0
文件: git.py 项目: hugbubby/portage
    def verify_head(self):
        if (self.repo.module_specific_options.get(
                'sync-git-verify-commit-signature', 'false') != 'true'):
            return True

        if self.repo.sync_openpgp_key_path is not None:
            if gemato is None:
                writemsg_level(
                    "!!! Verifying against specified key requires gemato-11.0+ installed\n",
                    level=logging.ERROR,
                    noiselevel=-1)
                return False
            openpgp_env = gemato.openpgp.OpenPGPEnvironment()
        else:
            openpgp_env = None

        try:
            out = EOutput()
            env = None
            if openpgp_env is not None:
                try:
                    out.einfo('Using keys from %s' %
                              (self.repo.sync_openpgp_key_path, ))
                    with io.open(self.repo.sync_openpgp_key_path, 'rb') as f:
                        openpgp_env.import_key(f)
                    out.ebegin('Refreshing keys from keyserver')
                    openpgp_env.refresh_keys()
                    out.eend(0)
                except GematoException as e:
                    writemsg_level(
                        "!!! Verification impossible due to keyring problem:\n%s\n"
                        % (e, ),
                        level=logging.ERROR,
                        noiselevel=-1)
                    return (1, False)

                env = os.environ.copy()
                env['GNUPGHOME'] = openpgp_env.home

            rev_cmd = [self.bin_command, "log", "--pretty=format:%G?", "-1"]
            try:
                status = (portage._unicode_decode(
                    subprocess.check_output(rev_cmd,
                                            cwd=portage._unicode_encode(
                                                self.repo.location),
                                            env=env)).strip())
            except subprocess.CalledProcessError:
                return False

            if status == 'G':  # good signature is good
                out.einfo('Trusted signature found on top commit')
                return True
            elif status == 'U':  # untrusted
                out.ewarn('Top commit signature is valid but not trusted')
                return True
            else:
                if status == 'B':
                    expl = 'bad signature'
                elif status == 'X':
                    expl = 'expired signature'
                elif status == 'Y':
                    expl = 'expired key'
                elif status == 'R':
                    expl = 'revoked key'
                elif status == 'E':
                    expl = 'unable to verify signature (missing key?)'
                elif status == 'N':
                    expl = 'no signature'
                else:
                    expl = 'unknown issue'
                out.eerror('No valid signature found: %s' % (expl, ))
                return False
        finally:
            if openpgp_env is not None:
                openpgp_env.close()
示例#7
0
# Does a first-time-expensive xmatch call
cpv = get_cpv(cp_all[0])
eoutput.eend(0)
for cp in cp_all:
    cpv = get_cpv(cp)
    if not isgstplugin(cpv):
        continue
    new_cpv = get_cpv(cp, GSTLIBVER)
    print ">>> Current package is %s" % cpv
    os.chdir(get_ebuild_dir(cpv))
    old_ebuild = get_ebuild(cpv)
    new_ebuild = get_ebuild(new_cpv)
    eoutput.ebegin("Copying %s to %s" % (old_ebuild, new_ebuild))
    shutil.copyfile(old_ebuild, new_ebuild)
    eoutput.eend(0)
    eoutput.einfo("Editing gstreamer deps and keywords. A diff will follow")
    edit_gstdeps(new_ebuild)
    subprocess.check_call('ekeyword ~all %s' % new_ebuild,
                          shell=True,
                          stdout=subprocess.PIPE)
    try:
        subprocess.check_call('diff -u %s %s' % (old_ebuild, new_ebuild),
                              shell=True)
    except subprocess.CalledProcessError as e:
        # diff returns:
        #   0 if files don't differ
        #   1 if they differ
        #   2 if something went wrong
        if e.returncode == 2:
            raise e
    eoutput.ebegin("Running cvs add %s" % new_ebuild)
示例#8
0
class pkgsys_portage(package_system):
    pkgsysname = 'portage'

    def __init__(self):
        package_system.__init__(self)
        self.eout = EOutput()

    def begin(self, msg):
        self.eout.ebegin(msg)

    def end(self, success_ornot):
        if success_ornot: self.eout.eend(0)
        else: self.eout.eend(1)

    def info(self, msg):
        self.eout.einfo(msg)

    def error(self, msg):
        self.eout.eerror(msg)

    def init_options(self, options):
        options['--portage-distfiles'] = portage.settings['DISTDIR']
        options['--portage-dir'] = os.path.join('/usr/local/portage', pypi_dir)

    def finalize_options(self, options):
        map(lambda diropt: ensure_dir(options[diropt]),
            ['--portage-distfiles', '--portage-dir'])

    def setup_args(self, args):
        if args['license'] != None and args['license'] != '':
            args['license'] = LicenseConvert(args['name'], args['license'])
        elif 'classifiers' in args and args['classifiers'] is not None:
            for cfline in args['classifiers']:
                cflist = map(lambda cf: cf.strip(), cfline.split('::'))
                if len(cflist) == 3 and \
                        cflist[0] == 'License' and cflist[1] == 'OSI Approved':
                    args['license'] = LicenseConvert(args['name'], cflist[2])
        if args['license'] == '': args['license'] = 'UNKNOWN'

        iuse_arr = ['doc'] + args['extras_require'].keys()
        args['iuse'] = string.join(iuse_arr)

        rdepend = map(lambda dep: DepConvert(dep), args['install_requires'])
        args['rdepend'] = string.join(rdepend, '\n\t')

        ereq = {}
        for k in args['extras_require']:
            if args['extras_require'][k] == []: continue
            ereq[k] = args['extras_require'][k]
        depend = []
        if args['name'] != 'setuptools':
            depend.append('dev-python/setuptools')
        depend.append('doc? ( dev-python/pudge dev-python/buildutils )')
        depend.extend(map(lambda extra: '%s? ( %s )' % \
                              (extra, string.join(map(lambda edep:
                                                          DepConvert(edep),
                                                      ereq[extra]))),
                          ereq.keys()))
        args['depend'] = string.join(depend, '\n\t')
        args['patchlist'] = \
            string.join(map(lambda p: 'epatch "${FILESDIR}/%s"' % p,
                            args['patches']), '\n\t')

        # Setup ebuild.
        fullname = MakeFullname(args['name'], args['version'])
        if 'rev' not in args:
            ebuild_fn = '%s.ebuild' % fullname
        else:
            ebuild_fn = '%s-r%s.ebuild' % (fullname, args['rev'])
        ebuild_dir = os.path.join(args['--portage-dir'],
                                  NameConvert(args['name']))
        ebuild_path = os.path.join(ebuild_dir, ebuild_fn)
        for pkgtype in ['setup.py', 'single.py']:
            if args['pkgtype'] == pkgtype:
                args['template'] = os.path.join('portage', '%s.tmpl' % pkgtype)
                break
        if 'template' not in args:
            raise RuntimeError, 'Unsupported package type %s' % args['pkgtype']
        args['output'] = ebuild_path
        args['filedir'] = args['--portage-distfiles']
        args['patchdir'] = os.path.join(ebuild_dir, 'files')

    def process(self, args):
        # Call ebuild ... digest
        try:
            portage._doebuild_manifest_exempt_depend += 1
            pkgdir = os.path.dirname(args['output'])
            fetchlist_dict = portage.FetchlistDict(pkgdir, portage.settings,
                                                   portage.portdb)
            mf = Manifest(pkgdir,
                          args['--portage-distfiles'],
                          fetchlist_dict=fetchlist_dict,
                          manifest1_compat=False)
            mf.create(requiredDistfiles=None,
                      assumeDistHashesSometimes=True,
                      assumeDistHashesAlways=True)
            mf.write()
        finally:
            portage._doebuild_manifest_exempt_depend -= 1
    root = os.environ['ROOT']
vardbapi = portage.vardbapi()
# Find the latest g-i
# XXX: Assumes there's only one slot for g-i
eoutput.ebegin("Finding current GIRepository version")
gi = vardbapi.match(gi)[0]
for each in get_contents(gi):
    # Find GIRepository-$ver.gir, and get the internal version
    if re.match('.*GIRepository[^/]+\.gir$', each):
        girepository = each
        break
else:
    raise Exception("GIRepository .gir not found")
girversion = get_version(girepository)
eoutput.eend(0)
eoutput.einfo("Current GIRepository version is " + girversion)

##########
## Work ##
##########
if force:
    eoutput.ebegin("Finding GIR files")
else:
    eoutput.ebegin("Finding broken GIR files")
files_list = set()
for dir in gir_dirs:
    # Walk the gir directories to find files
    for (path, dirs, files) in os.walk(osp.join(root, dir)):
        for f in files:
            if not f.endswith('.gir'):
                continue
示例#10
0
    root = os.environ['ROOT']
vardbapi = portage.vardbapi()
# Find the latest g-i
# XXX: Assumes there's only one slot for g-i
eoutput.ebegin("Finding current GIRepository version")
gi = vardbapi.match(gi)[0]
for each in get_contents(gi):
    # Find GIRepository-$ver.gir, and get the internal version
    if re.match('.*GIRepository[^/]+\.gir$', each):
        girepository = each
        break
else:
    raise Exception("GIRepository .gir not found")
girversion = get_version(girepository)
eoutput.eend(0)
eoutput.einfo("Current GIRepository version is " + girversion)

##########
## Work ##
##########
if force:
    eoutput.ebegin("Finding GIR files")
else:
    eoutput.ebegin("Finding broken GIR files")
files_list = set()
for dir in gir_dirs:
    # Walk the gir directories to find files
    for (path, dirs, files) in os.walk(osp.join(root, dir)):
        for f in files:
            if not f.endswith('.gir'):
                continue
示例#11
0
    def verify_head(self, revision="-1"):
        if self.repo.module_specific_options.get(
                "sync-git-verify-commit-signature",
                "false").lower() not in ("true", "yes"):
            return True

        if self.repo.sync_openpgp_key_path is not None and gemato is None:
            writemsg_level(
                "!!! Verifying against specified key requires gemato-14.5+ installed\n",
                level=logging.ERROR,
                noiselevel=-1,
            )
            return False

        openpgp_env = self._get_openpgp_env(self.repo.sync_openpgp_key_path)

        try:
            out = EOutput()
            env = None
            if openpgp_env is not None and self.repo.sync_openpgp_key_path is not None:
                try:
                    out.einfo("Using keys from %s" %
                              (self.repo.sync_openpgp_key_path, ))
                    with io.open(self.repo.sync_openpgp_key_path, "rb") as f:
                        openpgp_env.import_key(f)
                    self._refresh_keys(openpgp_env)
                except (GematoException, asyncio.TimeoutError) as e:
                    writemsg_level(
                        "!!! Verification impossible due to keyring problem:\n%s\n"
                        % (e, ),
                        level=logging.ERROR,
                        noiselevel=-1,
                    )
                    return False

                env = os.environ.copy()
                env["GNUPGHOME"] = openpgp_env.home

            rev_cmd = [
                self.bin_command, "log", "-n1", "--pretty=format:%G?", revision
            ]
            try:
                status = portage._unicode_decode(
                    subprocess.check_output(
                        rev_cmd,
                        cwd=portage._unicode_encode(self.repo.location),
                        env=env,
                    )).strip()
            except subprocess.CalledProcessError:
                return False

            if status == "G":  # good signature is good
                out.einfo("Trusted signature found on top commit")
                return True
            if status == "U":  # untrusted
                out.ewarn("Top commit signature is valid but not trusted")
                return True
            if status == "B":
                expl = "bad signature"
            elif status == "X":
                expl = "expired signature"
            elif status == "Y":
                expl = "expired key"
            elif status == "R":
                expl = "revoked key"
            elif status == "E":
                expl = "unable to verify signature (missing key?)"
            elif status == "N":
                expl = "no signature"
            else:
                expl = "unknown issue"
            out.eerror("No valid signature found: %s" % (expl, ))
            return False
        finally:
            if openpgp_env is not None:
                openpgp_env.close()
示例#12
0
文件: git.py 项目: mgorny/portage
	def verify_head(self, revision='-1'):
		if (self.repo.module_specific_options.get(
				'sync-git-verify-commit-signature', 'false') != 'true'):
			return True

		if self.repo.sync_openpgp_key_path is not None:
			if gemato is None:
				writemsg_level("!!! Verifying against specified key requires gemato-11.0+ installed\n",
					level=logging.ERROR, noiselevel=-1)
				return False
			openpgp_env = gemato.openpgp.OpenPGPEnvironment()
		else:
			openpgp_env = None

		try:
			out = EOutput()
			env = None
			if openpgp_env is not None:
				try:
					out.einfo('Using keys from %s' % (self.repo.sync_openpgp_key_path,))
					with io.open(self.repo.sync_openpgp_key_path, 'rb') as f:
						openpgp_env.import_key(f)
					out.ebegin('Refreshing keys from keyserver')
					openpgp_env.refresh_keys()
					out.eend(0)
				except GematoException as e:
					writemsg_level("!!! Verification impossible due to keyring problem:\n%s\n"
							% (e,),
							level=logging.ERROR, noiselevel=-1)
					return False

				env = os.environ.copy()
				env['GNUPGHOME'] = openpgp_env.home

			rev_cmd = [self.bin_command, "log", "-n1", "--pretty=format:%G?", revision]
			try:
				status = (portage._unicode_decode(
					subprocess.check_output(rev_cmd,
						cwd=portage._unicode_encode(self.repo.location),
						env=env))
					.strip())
			except subprocess.CalledProcessError:
				return False

			if status == 'G':  # good signature is good
				out.einfo('Trusted signature found on top commit')
				return True
			elif status == 'U':  # untrusted
				out.ewarn('Top commit signature is valid but not trusted')
				return True
			else:
				if status == 'B':
					expl = 'bad signature'
				elif status == 'X':
					expl = 'expired signature'
				elif status == 'Y':
					expl = 'expired key'
				elif status == 'R':
					expl = 'revoked key'
				elif status == 'E':
					expl = 'unable to verify signature (missing key?)'
				elif status == 'N':
					expl = 'no signature'
				else:
					expl = 'unknown issue'
				out.eerror('No valid signature found: %s' % (expl,))
				return False
		finally:
			if openpgp_env is not None:
				openpgp_env.close()
# Does a first-time-expensive xmatch call
cpv = get_cpv(cp_all[0])
eoutput.eend(0)
for cp in cp_all:
    cpv = get_cpv(cp)
    if not isgstplugin(cpv):
        continue
    new_cpv = get_cpv(cp, GSTLIBVER)
    print ">>> Current package is %s" % cpv
    os.chdir(get_ebuild_dir(cpv))
    old_ebuild = get_ebuild(cpv)
    new_ebuild = get_ebuild(new_cpv)
    eoutput.ebegin("Copying %s to %s" % (old_ebuild, new_ebuild))
    shutil.copyfile(old_ebuild, new_ebuild)
    eoutput.eend(0)
    eoutput.einfo("Editing gstreamer deps and keywords. A diff will follow")
    edit_gstdeps(new_ebuild)
    subprocess.check_call('ekeyword ~all %s' % new_ebuild, shell=True, stdout=subprocess.PIPE)
    try:
        subprocess.check_call('diff -u %s %s' % (old_ebuild, new_ebuild), shell=True)
    except subprocess.CalledProcessError as e:
        # diff returns:
        #   0 if files don't differ
        #   1 if they differ
        #   2 if something went wrong
        if e.returncode == 2:
            raise e
    eoutput.ebegin("Running cvs add %s" % new_ebuild)
    subprocess.check_call('cvs add %s' % new_ebuild, shell=True, stderr=subprocess.PIPE)
    eoutput.eend(0)
    subprocess.check_call('ebuild %s manifest' % new_ebuild, shell=True)
示例#14
0
class HookDirectory(object):
    def __init__(self,
                 phase,
                 settings,
                 myopts=None,
                 myaction=None,
                 mytargets=None):
        self.myopts = myopts
        self.myaction = myaction
        self.mytargets = mytargets
        check_config_instance(settings)
        self.settings = settings
        self.path = os.path.join(settings["PORTAGE_CONFIGROOT"], HOOKS_PATH,
                                 phase + '.d')
        self.output = EOutput()

    def execute(self, path=None):
        if "hooks" not in self.settings['FEATURES']:
            return

        if not path:
            path = self.path

        path = normalize_path(path)

        if not os.path.exists(path):
            if self.myopts and "--debug" in self.myopts:
                # behavior mimicked by hook.sh
                self.output.ewarn(
                    'This hook path could not be found; ignored: ' + path)
            return

        if os.path.isdir(path):
            command = [HOOKS_SH_BINARY]
            if self.myopts:
                for myopt in self.myopts:
                    command.extend(['--opt', myopt])
            if self.myaction:
                command.extend(['--action', self.myaction])
            if self.mytargets:
                for mytarget in self.mytargets:
                    command.extend(['--target', mytarget])

            command = [
                BASH_BINARY, '-c',
                'cd "' + path + '" && source "' + PORTAGE_BIN_PATH +
                '/isolated-functions.sh" && source ' + ' '.join(command)
            ]
            if self.myopts and "--verbose" in self.myopts:
                self.output.einfo('Executing hooks directory "' + self.path +
                                  '"...')
            code = spawn(mycommand=command, env=self.settings.environ())
            if code:  # if failure
                # behavior mimicked by hook.sh
                raise PortageException(
                    '!!! Hook directory %s failed with exit code %s' %
                    (self.path, code))

        else:
            raise InvalidLocation('This hook path ought to be a directory: ' +
                                  path)