From a4828ac20dc2a71a60e8918c88afdea1845f7779 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Tue, 24 Mar 2009 02:48:27 +0000 Subject: Add support for FEATURES=parse-eapi-glep-55. This feature is only intended for experimental purposes and should not be enabled under normal circumstances. svn path=/main/trunk/; revision=13175 --- pym/_emerge/__init__.py | 9 +++++- pym/portage/__init__.py | 64 +++++++++++++++++++++++++++++++++++-------- pym/portage/dbapi/porttree.py | 35 +++++++++++++++++++++-- pym/portage/manifest.py | 12 ++++++-- 4 files changed, 103 insertions(+), 17 deletions(-) (limited to 'pym') diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 4a673e19d..f951a8a57 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -3037,9 +3037,16 @@ class EbuildMetadataPhase(SubProcess): settings.setcpv(self.cpv) ebuild_path = self.ebuild_path - if 'parse-eapi-ebuild-head' in settings.features: + eapi = None + if 'parse-eapi-glep-55' in settings.features: + pf, eapi = portage._split_ebuild_name_glep55( + os.path.basename(ebuild_path)) + if eapi is None and \ + 'parse-eapi-ebuild-head' in settings.features: eapi = portage._parse_eapi_ebuild_head(codecs.open(ebuild_path, mode='r', encoding='utf_8', errors='replace')) + + if eapi is not None: if not portage.eapi_is_supported(eapi): self.metadata_callback(self.cpv, self.ebuild_path, self.repo_path, {'EAPI' : eapi}, self.ebuild_mtime) diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 5c1cc1735..ced078f64 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -1790,9 +1790,12 @@ class config(object): self["FEATURES"] = " ".join(sorted(self.features)) self.backup_changes("FEATURES") - global _validate_cache_for_unsupported_eapis + global _glep_55_enabled, _validate_cache_for_unsupported_eapis if 'parse-eapi-ebuild-head' in self.features: _validate_cache_for_unsupported_eapis = False + if 'parse-eapi-glep-55' in self.features: + _validate_cache_for_unsupported_eapis = False + _glep_55_enabled = True self._init_dirs() @@ -4656,8 +4659,14 @@ def digestcheck(myfiles, mysettings, strict=0, justmanifest=0): writemsg("!!! Expected: %s\n" % e.value[3], noiselevel=-1) return 0 # Make sure that all of the ebuilds are actually listed in the Manifest. + glep55 = 'parse-eapi-glep-55' in mysettings.features for f in os.listdir(pkgdir): - if f.endswith(".ebuild") and not mf.hasFile("EBUILD", f): + pf = None + if glep55: + pf, eapi = _split_ebuild_name_glep55(f) + elif f[-7:] == '.ebuild': + pf = f[:-7] + if pf is not None and not mf.hasFile("EBUILD", f): writemsg("!!! A file is not listed in the Manifest: '%s'\n" % \ os.path.join(pkgdir, f), noiselevel=-1) if strict: @@ -5051,6 +5060,20 @@ def _parse_eapi_ebuild_head(f): break return '0' +# True when FEATURES=parse-eapi-glep-55 is enabled. +_glep_55_enabled = False + +_split_ebuild_name_glep55_re = re.compile(r'^(.*)\.ebuild(-([^.]+))?$') + +def _split_ebuild_name_glep55(name): + """ + @returns: (pkg-ver-rev, eapi) + """ + m = _split_ebuild_name_glep55_re.match(name) + if m is None: + return (None, None) + return (m.group(1), m.group(3)) + def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, mydbapi): ebuild_path = os.path.abspath(myebuild) @@ -5060,7 +5083,14 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m cat = mysettings.configdict["pkg"]["CATEGORY"] else: cat = os.path.basename(normalize_path(os.path.join(pkg_dir, ".."))) - mypv = os.path.basename(ebuild_path)[:-7] + + eapi = None + if 'parse-eapi-glep-55' in mysettings.features: + mypv, eapi = portage._split_ebuild_name_glep55( + os.path.basename(myebuild)) + else: + mypv = os.path.basename(ebuild_path)[:-7] + mycpv = cat+"/"+mypv mysplit=pkgsplit(mypv,silent=0) if mysplit is None: @@ -5124,13 +5154,19 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m mysettings["PORTAGE_QUIET"] = "1" if mydo == 'depend' and \ - 'EAPI' not in mysettings.configdict['pkg'] and \ - 'parse-eapi-ebuild-head' in mysettings.features: - eapi = _parse_eapi_ebuild_head(codecs.open(ebuild_path, - mode='r', encoding='utf_8', errors='replace')) - if not eapi_is_supported(eapi): - raise portage.exception.UnsupportedAPIException(mycpv, eapi) - mysettings.configdict['pkg']['EAPI'] = eapi + 'EAPI' not in mysettings.configdict['pkg']: + + if eapi is not None: + # From parse-eapi-glep-55 above. + mysettings.configdict['pkg']['EAPI'] = eapi + elif 'parse-eapi-ebuild-head' in mysettings.features: + eapi = _parse_eapi_ebuild_head(codecs.open(ebuild_path, + mode='r', encoding='utf_8', errors='replace')) + + if eapi is not None: + if not eapi_is_supported(eapi): + raise portage.exception.UnsupportedAPIException(mycpv, eapi) + mysettings.configdict['pkg']['EAPI'] = eapi if mydo != "depend": # Metadata vars such as EAPI and RESTRICT are @@ -5701,8 +5737,14 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, # Make sure that all of the ebuilds are # actually listed in the Manifest. + glep55 = 'parse-eapi-glep-55' in mysettings.features for f in os.listdir(pkgdir): - if f.endswith(".ebuild") and not mf.hasFile("EBUILD", f): + pf = None + if glep55: + pf, eapi = _split_ebuild_name_glep55(f) + elif f[-7:] == '.ebuild': + pf = f[:-7] + if pf is not None and not mf.hasFile("EBUILD", f): f = os.path.join(pkgdir, f) if f not in _doebuild_broken_ebuilds: out = portage.output.EOutput() diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 4cbf7af30..126d3606c 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -279,7 +279,23 @@ class portdbapi(dbapi): else: mytrees = self.porttrees[:] mytrees.reverse() - if psplit: + if 'parse-eapi-glep-55' in self.doebuild_settings.features: + glep55_startswith = '%s.ebuild-' % mysplit[1] + for x in mytrees: + filename = os.path.join(x, mysplit[0], psplit[0], + mysplit[1] + ".ebuild") + if os.access(filename, os.R_OK): + return (filename, x) + + pkgdir = os.path.join(x, mysplit[0], psplit[0]) + try: + files = os.listdir(pkgdir) + except OSError: + continue + for y in files: + if y.startswith(glep55_startswith): + return (os.path.join(pkgdir, y), x) + else: for x in mytrees: file=x+"/"+mysplit[0]+"/"+psplit[0]+"/"+mysplit[1]+".ebuild" if os.access(file, os.R_OK): @@ -421,9 +437,15 @@ class portdbapi(dbapi): mydata = {} eapi = None - if 'parse-eapi-ebuild-head' in self.doebuild_settings.features: + if 'parse-eapi-glep-55' in self.doebuild_settings.features: + pf, eapi = portage._split_ebuild_name_glep55( + os.path.basename(myebuild)) + if eapi is None and \ + 'parse-eapi-ebuild-head' in self.doebuild_settings.features: eapi = portage._parse_eapi_ebuild_head(codecs.open(myebuild, mode='r', encoding='utf_8', errors='replace')) + + if eapi is not None: self.doebuild_settings.configdict['pkg']['EAPI'] = eapi if eapi is not None and not portage.eapi_is_supported(eapi): @@ -666,6 +688,7 @@ class portdbapi(dbapi): return cachelist[:] mysplit = mycp.split("/") invalid_category = mysplit[0] not in self._categories + glep55 = 'parse-eapi-glep-55' in self.doebuild_settings.features d={} if mytree: mytrees = [mytree] @@ -677,8 +700,14 @@ class portdbapi(dbapi): except OSError: continue for x in file_list: - if x.endswith(".ebuild"): + + pf = None + if glep55: + pf, eapi = portage._split_ebuild_name_glep55(x) + elif x[-7:] == '.ebuild': pf = x[:-7] + + if pf is not None: ps = pkgsplit(pf) if not ps: writemsg("\nInvalid ebuild name: %s\n" % \ diff --git a/pym/portage/manifest.py b/pym/portage/manifest.py index 9150674a9..80a0c1642 100644 --- a/pym/portage/manifest.py +++ b/pym/portage/manifest.py @@ -27,6 +27,10 @@ def manifest2AuxfileFilter(filename): def manifest2MiscfileFilter(filename): filename = filename.strip(os.sep) + if portage._glep_55_enabled: + pf, eapi = portage._split_ebuild_name_glep55(filename) + if pf is not None: + return False return not (filename in ["CVS", ".svn", "files", "Manifest"] or filename.endswith(".ebuild")) def guessManifestFileType(filename): @@ -307,9 +311,13 @@ class Manifest(object): for f in pkgdir_files: if f[:1] == ".": continue - elif f[-7:] == ".ebuild": - mytype = "EBUILD" + pf = None + if portage._glep_55_enabled: + pf, eapi = portage._split_ebuild_name_glep55(f) + elif f[-7:] == '.ebuild': pf = f[:-7] + if pf is not None: + mytype = "EBUILD" ps = portage.versions.pkgsplit(pf) cpv = "%s/%s" % (cat, pf) if not ps: -- cgit v1.2.3-1-g7c22