From a8090e3b2525284c17f6ee7bd28abb7a2f91b3c3 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Wed, 7 Oct 2009 19:09:55 +0000 Subject: [PATCH] Merged from trunk -r14487:14497 | 14488 | fix mis-alignment | | grobian | | | 14489 | Restrict upstream.workaround to src_compile and src_install | | volkmar | as much as possible. Prevent warnings when using emake -j1 | | | in src_test which is recommanded. | | 14490 | Add src_configure and pkg_config to the list of phases in | | arfrever | repoman.checks.PhaseCheck.__init__(). | | 14491 | Make pkgsplit() accept a cpv again, since accepting a pv | | zmedico | only will probably break lots of api consumers. Thanks to | | | Romain Perier for reporting epkginfo | | | breakage. | | 14492 | Use the simpler/stricter _pkgspit in dbapi code. | | zmedico | | | 14493 | Use _pkgsplit when input cannot contain a category. | | zmedico | | | 14494 | Make pkgsplit() preserve 'null' category if it's present in | | zmedico | the input. | | 14495 | Make deprecated_profile_check() suggest to use eselect | | zmedico | profile. Thanks to Samuli Suominen for the | | | suggestion. | | 14496 | * Add default ACCEPT_LICENSE and ACCEPT_PROPERTIES values | | zmedico | in make.globals. * Set default values if missing from | | | make.globals. * Only warn once if a given license group is | | | missing. * Prune off any parts of an ACCEPT_LICENSE and | | | ACCEPT_PROPERTIES that are made irrelevant by the latest | | | occuring * or -* wildcard. | | 14497 | - move news into features so it can be ignored when needed. | | solar | Lots of whitespace cleanups | svn path=/main/branches/prefix/; revision=14511 --- cnf/make.globals | 3 ++ pym/_emerge/actions.py | 20 ++++++----- pym/portage/__init__.py | 59 ++++++++++++++++++++++-------- pym/portage/dbapi/porttree.py | 2 +- pym/portage/dbapi/vartree.py | 4 +-- pym/portage/versions.py | 33 ++++++++++++++--- pym/repoman/checks.py | 67 +++++++++++++++++++---------------- 7 files changed, 125 insertions(+), 63 deletions(-) diff --git a/cnf/make.globals b/cnf/make.globals index db1269d48..c2bd3f0f8 100644 --- a/cnf/make.globals +++ b/cnf/make.globals @@ -24,6 +24,9 @@ SYNC="rsync://rsync.prefix.freens.org/gentoo-portage-prefix" # Default distfiles mirrors GENTOO_MIRRORS="http://distfiles.gentoo.org http://distro.ibiblio.org/pub/linux/distributions/gentoo" +ACCEPT_LICENSE="* -@EULA" +ACCEPT_PROPERTIES="*" + # Repository Paths PORTDIR="@PORTAGE_EPREFIX@/usr/portage" DISTDIR="@PORTAGE_EPREFIX@/usr/portage/distfiles" diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 99db6fbb8..8816ac7dc 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -642,7 +642,7 @@ def calc_depclean(settings, trees, ldpath_mtimes, required_sets[s] = InternalPackageSet( initial_atoms=getSetAtoms(s)) - + # When removing packages, use a temporary version of world # which excludes packages that are intended to be eligible for # removal. @@ -1148,7 +1148,7 @@ def calc_depclean(settings, trees, ldpath_mtimes, def cmp_reference_count(node1, node2): return node_refcounts[node1] - node_refcounts[node2] graph.order.sort(key=cmp_sort_key(cmp_reference_count)) - + ignore_priority_range = [None] ignore_priority_range.extend( range(UnmergeDepPriority.MIN, UnmergeDepPriority.MAX + 1)) @@ -1837,7 +1837,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction): portage.writemsg(yellow("WARNING:") + " adding required option " + \ "%s not included in PORTAGE_RSYNC_OPTS\n" % opt) rsync_opts.append(opt) - + for exclude in ("distfiles", "local", "packages"): opt = "--exclude=/%s" % exclude if opt not in rsync_opts: @@ -1845,7 +1845,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction): " adding required option %s not included in " % opt + \ "PORTAGE_RSYNC_OPTS (can be overridden with --exclude='!')\n") rsync_opts.append(opt) - + if syncuri.rstrip("/").endswith(".gentoo.org/gentoo-portage"): def rsync_opt_startswith(opt_prefix): for x in rsync_opts: @@ -2256,7 +2256,7 @@ def action_sync(settings, trees, mtimedb, myopts, myaction): print() print(red(" * ")+"To update portage, run 'emerge portage' now.") print() - + display_news_notification(root_config, myopts) return os.EX_OK @@ -2680,6 +2680,8 @@ def display_news_notification(root_config, myopts): UNREAD_PATH = os.path.join(target_root, NEWS_LIB_PATH, "news") newsReaderDisplay = False update = "--pretend" not in myopts + if "news" not in settings.features: + return if not settings.treeVirtuals: # Populate these using our existing vartree, to avoid @@ -2695,8 +2697,8 @@ def display_news_notification(root_config, myopts): print() print(colorize("WARN", " * IMPORTANT:"), end=' ') print("%s news items need reading for repository '%s'." % (unreadItems, repo)) - - + + if newsReaderDisplay: print(colorize("WARN", " *"), end=' ') print("Use " + colorize("GOOD", "eselect news") + " to read news items.") @@ -2738,7 +2740,7 @@ def checkUpdatedNewsItems(portdb, vardb, NEWS_PATH, UNREAD_PATH, repo_id, """ Examines news items in repodir + '/' + NEWS_PATH and attempts to find unread items Returns the number of unread (yet relevent) items. - + @param portdb: a portage tree database @type portdb: pordbapi @param vardb: an installed package database @@ -2752,7 +2754,7 @@ def checkUpdatedNewsItems(portdb, vardb, NEWS_PATH, UNREAD_PATH, repo_id, @rtype: Integer @returns: 1. The number of unread but relevant news items. - + """ from portage.news import NewsManager manager = NewsManager(portdb, vardb, NEWS_PATH, UNREAD_PATH) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 66566e945..6af4856d9 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1486,6 +1486,12 @@ class config(object): _environ_filter = frozenset(_environ_filter) + _undef_lic_groups = set() + _default_globals = ( + ('ACCEPT_LICENSE', '* -@EULA'), + ('ACCEPT_PROPERTIES', '*'), + ) + def __init__(self, clone=None, mycpv=None, config_profile_path=None, config_incrementals=None, config_root=None, target_root=None, local_config=True, env=None): @@ -1879,6 +1885,9 @@ class config(object): if self.mygcfg is None: self.mygcfg = {} + for k, v in self._default_globals: + self.mygcfg.setdefault(k, v) + self.configlist.append(self.mygcfg) self.configdict["globals"]=self.configlist[-1] @@ -2285,8 +2294,11 @@ class config(object): else: rValue.extend(self._expandLicenseToken(l, traversed_groups)) else: - writemsg(_("Undefined license group '%s'\n") % group_name, - noiselevel=-1) + if self._license_groups and \ + group_name not in self._undef_lic_groups: + self._undef_lic_groups.add(group_name) + writemsg(_("Undefined license group '%s'\n") % group_name, + noiselevel=-1) rValue.append("@"+group_name) if negate: rValue = ["-" + token for token in rValue] @@ -3019,8 +3031,6 @@ class config(object): @rtype: List @return: A list of licenses that have not been accepted. """ - if not self._accept_license: - return [] accept_license = self._accept_license cpdict = self._plicensedict.get(dep_getkey(cpv), None) if cpdict: @@ -3100,8 +3110,6 @@ class config(object): @rtype: List @return: A list of properties that have not been accepted. """ - if not self._accept_properties: - return [] accept_properties = self._accept_properties cpdict = self._ppropertiesdict.get(dep_getkey(cpv), None) if cpdict: @@ -3252,6 +3260,25 @@ class config(object): # env_d will be None if profile.env doesn't exist. self.configdict["env.d"].update(env_d) + def _prune_incremental(self, split): + """ + Prune off any parts of an incremental variable that are + made irrelevant by the latest occuring * or -*. This + could be more aggressive but that might be confusing + and the point is just to reduce noise a bit. + """ + for i, x in enumerate(reversed(split)): + if x == '*': + split = split[-i-1:] + break + elif x == '-*': + if i == 0: + split = [] + else: + split = split[-i:] + break + return split + def regenerate(self,useonly=0,use_cache=1): """ Regenerate settings @@ -3303,28 +3330,28 @@ class config(object): mysplit = [] for curdb in mydbs: mysplit.extend(curdb.get('ACCEPT_LICENSE', '').split()) + mysplit = self._prune_incremental(mysplit) accept_license_str = ' '.join(mysplit) - if accept_license_str: - self.configlist[-1]['ACCEPT_LICENSE'] = accept_license_str + self.configlist[-1]['ACCEPT_LICENSE'] = accept_license_str if accept_license_str != self._accept_license_str: self._accept_license_str = accept_license_str self._accept_license = tuple(self.expandLicenseTokens(mysplit)) else: # repoman will accept any license - self._accept_license = () + self._accept_license = ('*',) # ACCEPT_PROPERTIES works like ACCEPT_LICENSE, without groups if self.local_config: mysplit = [] for curdb in mydbs: mysplit.extend(curdb.get('ACCEPT_PROPERTIES', '').split()) - if mysplit: - self.configlist[-1]['ACCEPT_PROPERTIES'] = ' '.join(mysplit) + mysplit = self._prune_incremental(mysplit) + self.configlist[-1]['ACCEPT_PROPERTIES'] = ' '.join(mysplit) if tuple(mysplit) != self._accept_properties: self._accept_properties = tuple(mysplit) else: # repoman will accept any property - self._accept_properties = () + self._accept_properties = ('*',) for mykey in myincrementals: @@ -6030,7 +6057,7 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m mypv = os.path.basename(ebuild_path)[:-7] mycpv = cat+"/"+mypv - mysplit=pkgsplit(mypv,silent=0) + mysplit = versions._pkgsplit(mypv) if mysplit is None: raise portage.exception.IncorrectParameter( _("Invalid ebuild path: '%s'") % myebuild) @@ -8205,7 +8232,7 @@ def cpv_getkey(mycpv): % (mycpv,), DeprecationWarning) myslash = mycpv.split("/", 1) - mysplit=pkgsplit(myslash[-1]) + mysplit = versions._pkgsplit(myslash[-1]) if mysplit is None: return None mylen=len(myslash) @@ -8248,7 +8275,7 @@ def cpv_expand(mycpv, mydb=None, use_cache=1, settings=None): virtual is a valid choice and defaults to the first element when there are no installed/available candidates.""" myslash=mycpv.split("/") - mysplit=pkgsplit(myslash[-1]) + mysplit = versions._pkgsplit(myslash[-1]) if settings is None: settings = globals()["settings"] virts = settings.getvirtuals("/") @@ -8752,6 +8779,8 @@ def deprecated_profile_check(settings=None): mode='r', encoding=_encodings['content'], errors='replace').readlines() writemsg(colorize("BAD", _("\n!!! Your current profile is " "deprecated and not supported anymore.")) + "\n", noiselevel=-1) + writemsg(colorize("BAD", _("!!! Use eselect profile to update your " + "profile.")) + "\n", noiselevel=-1) if not dcontent: writemsg(colorize("BAD", _("!!! Please refer to the " "Gentoo Upgrading Guide.")) + "\n", noiselevel=-1) diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index f7c8288d5..ef0b8a694 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -12,7 +12,7 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.dep:dep_getkey,match_from_list,paren_reduce,use_reduce', 'portage.env.loaders:KeyValuePairFileLoader', 'portage.util:ensure_dirs,writemsg,writemsg_level', - 'portage.versions:best,catpkgsplit,pkgsplit,ver_regexp', + 'portage.versions:best,catpkgsplit,_pkgsplit@pkgsplit,ver_regexp', ) from portage.cache.cache_errors import CacheError diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 336bd48f2..9c3dbfab6 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -22,7 +22,7 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.util:apply_secpass_permissions,ConfigProtect,ensure_dirs,' + \ 'writemsg,writemsg_level,write_atomic,atomic_ofstream,writedict,' + \ 'grabfile,grabdict,normalize_path,new_protect_filename,getlibpaths', - 'portage.versions:best,catpkgsplit,catsplit,pkgcmp,pkgsplit', + 'portage.versions:best,catpkgsplit,catsplit,pkgcmp,_pkgsplit@pkgsplit', ) from portage.const import CACHE_PATH, CONFIG_MEMORY_FILE, \ @@ -3790,7 +3790,7 @@ class dblink(object): raise del e else: - showMessage(_("<<< !needed %s %s\n") % (obj_type, obj), + showMessage(_("<<< !needed %s %s\n") % (obj_type, obj), noiselevel=-1) # Remove empty parent directories if possible. diff --git a/pym/portage/versions.py b/pym/portage/versions.py index b520936f6..a01c2ee2d 100644 --- a/pym/portage/versions.py +++ b/pym/portage/versions.py @@ -251,8 +251,13 @@ def pkgcmp(pkg1, pkg2): _pv_re = re.compile('^' + _pv + '$', re.VERBOSE) -def pkgsplit(mypkg,silent=1): - +def _pkgsplit(mypkg): + """ + @param mypkg: pv + @return: + 1. None if input is invalid. + 2. (pn, ver, rev) if input is pv + """ m = _pv_re.match(mypkg) if m is None: return None @@ -268,6 +273,7 @@ def pkgsplit(mypkg,silent=1): return (m.group('pn'), m.group('ver'), rev) +_missing_cat = 'null' catcache={} def catpkgsplit(mydata,silent=1): """ @@ -291,11 +297,11 @@ def catpkgsplit(mydata,silent=1): mysplit = mydata.split('/', 1) p_split=None if len(mysplit)==1: - cat = "null" - p_split=pkgsplit(mydata,silent=silent) + cat = _missing_cat + p_split = _pkgsplit(mydata) elif len(mysplit)==2: cat = mysplit[0] - p_split=pkgsplit(mysplit[1],silent=silent) + p_split = _pkgsplit(mysplit[1]) if not p_split: catcache[mydata]=None return None @@ -303,6 +309,23 @@ def catpkgsplit(mydata,silent=1): catcache[mydata]=retval return retval +def pkgsplit(mypkg, silent=1): + """ + @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 + """ + catpsplit = catpkgsplit(mypkg) + if catpsplit is None: + return None + cat, pn, ver, rev = catpsplit + if cat is _missing_cat and '/' not in mypkg: + return (pn, ver, rev) + else: + return (cat + '/' + pn, ver, rev) + def catsplit(mydep): return mydep.split("/", 1) diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py index 5058ec77e..a754ad46e 100644 --- a/pym/repoman/checks.py +++ b/pym/repoman/checks.py @@ -30,6 +30,36 @@ class LineCheck(object): def end(self): pass +class PhaseCheck(LineCheck): + """ basic class for function detection """ + + ignore_line = re.compile(r'(^\s*#)') + func_end_re = re.compile(r'^\}$') + in_phase = '' + + def __init__(self): + self.phases = ('pkg_pretend', 'pkg_setup', 'src_unpack', 'src_prepare', 'src_configure', 'src_compile', + 'src_test', 'src_install', 'pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm', 'pkg_config') + phase_re = '(' + for phase in self.phases: + phase_re += phase + '|' + phase_re = phase_re[:-1] + ')' + self.phases_re = re.compile(phase_re) + + def check(self, num, line): + m = self.phases_re.match(line) + if m is not None: + self.in_phase = m.group(1) + if self.in_phase != '' and \ + self.func_end_re.match(line) is not None: + self.in_phase = '' + + return self.phase_check(num, line) + + def phase_check(self, num, line): + """ override this function for your checks """ + pass + class EbuildHeader(LineCheck): """Ensure ebuilds have proper headers Copyright header errors @@ -327,12 +357,17 @@ class IUseUndefined(LineCheck): if self._iuse_def is None: yield 'IUSE is not defined' -class EMakeParallelDisabled(LineCheck): +class EMakeParallelDisabled(PhaseCheck): """Check for emake -j1 calls which disable parallelization.""" repoman_check_name = 'upstream.workaround' re = re.compile(r'^\s*emake\s+.*-j\s*1\b') error = errors.EMAKE_PARALLEL_DISABLED + def phase_check(self, num, line): + if self.in_phase == 'src_compile' or self.in_phase == 'src_install': + if self.re.match(line): + return self.error + class EMakeParallelDisabledViaMAKEOPTS(LineCheck): """Check for MAKEOPTS=-j1 that disables parallelization.""" repoman_check_name = 'upstream.workaround' @@ -356,36 +391,6 @@ class WantAutoDefaultValue(LineCheck): return 'WANT_AUTO' + m.group(1) + \ ' redundantly set to default value "latest" on line: %d' -class PhaseCheck(LineCheck): - """ basic class for function detection """ - - ignore_line = re.compile(r'(^\s*#)') - func_end_re = re.compile(r'^\}$') - in_phase = '' - - def __init__(self): - self.phases = ('pkg_setup', 'pkg_preinst', 'pkg_postinst', 'pkg_prerm', 'pkg_postrm', 'pkg_pretend', - 'src_unpack', 'src_prepare', 'src_compile', 'src_test', 'src_install') - phase_re = '(' - for phase in self.phases: - phase_re += phase + '|' - phase_re = phase_re[:-1] + ')' - self.phases_re = re.compile(phase_re) - - def check(self, num, line): - m = self.phases_re.match(line) - if m is not None: - self.in_phase = m.group(1) - if self.in_phase != '' and \ - self.func_end_re.match(line) is not None: - self.in_phase = '' - - return self.phase_check(num, line) - - def phase_check(self, num, line): - """ override this function for your checks """ - pass - class SrcCompileEconf(PhaseCheck): repoman_check_name = 'ebuild.minorsyn' configure_re = re.compile(r'\s(econf|./configure)') -- 2.26.2