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
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
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)
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()
# 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)
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
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()
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)
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)