* [gentoo-portage-dev] PATCH: initial EAPI awareness @ 2005-08-27 10:53 Brian Harring 2005-08-28 5:46 ` Jason Stubbs ` (4 more replies) 0 siblings, 5 replies; 40+ messages in thread From: Brian Harring @ 2005-08-27 10:53 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1.1: Type: text/plain, Size: 1518 bytes --] Hola. Attached is a patch that A) adds EAPI awareness to portage; mainly, if >0, complain and be unwilling to merge the package B) tweaks to portage_db_flat, addition of portage_db_metadata, and portage_db_flat_hash Flat_hash is the replacement cache format for metadata/cache; assuming nobody does anything stupid with EAPI, it will allow us to deploy new metadata in the tree without forcing a breakage every time we do so. portage_db_metadata.py is a compability implementation; basically detects if it's flat_list (portage_db_flat), or flat_hash and calls accordingly. Aside from that, tried to keep changes as minimal as possible. The patch isn't complete due to the fact we need to add an EAPI cache compatibility check for --metadata transfer, but can't do that till I get some feedback from -dev ml regarding a bit of tree cleanup that will go along with it. Please test this out; if you want to test the EAPI checking, tag EAPI=1 into an ebuild, and try making emerge bail. If you're less adventurous, please test the compatibility cache testing; in /etc/portage/modules portdbapi.metadbmodule=portage_db_metadata.database Will enable the autodetection. Additionally, portdbapi.auxdbmodule=portage_db_flat_hash.database being flipped on would be appreciated, although you will have to wipe your cache and run emerge --metadata; with the settings above, you're testing the auto-detect functionality, and the new format. Thanks, ~harring [-- Attachment #1.2: 2.0.51-eapi-awareness.patch --] [-- Type: text/plain, Size: 11596 bytes --] diff -urN portage-old/bin/emerge portage/bin/emerge --- portage-old/bin/emerge 2005-08-27 05:28:09.000000000 -0500 +++ portage/bin/emerge 2005-08-27 05:27:17.000000000 -0500 @@ -612,7 +612,7 @@ help() sys.exit(0) elif portage.secpass!=2: - if myaction in ["search", "info", "regen"]: + if myaction in ["search", "info", "regen", "metadata"]: pass elif (not myaction) and (not myfiles): pass @@ -1497,7 +1497,7 @@ myfetchlist=[] for x in mylist: fetch=" " - + stupid_if_logic_hack = True if x[0]=="blocks": addl=""+red("B")+" "+fetch+" " resolved=portage.db[x[1]]["vartree"].resolve_key(x[2]) @@ -1512,7 +1512,22 @@ print red("(is blocking "+x[3]+")") else: print + stupid_if_logic_hack = False + else: + if x[0] == "ebuild": source = "porttree" + elif x[0] == "binary": source = "bintree" + elif x[0] == ("nomerge", "blocker"): source = None + else: + print "EAPI check, unknown source "+str(x[0])+" for "+x[2]+", this shouldn't occur",mylist + sys.exit(1) + if source: + needed = portage.db[x[1]][source].dbapi.aux_get(x[2], ["EAPI"])[0] + if needed > portage.EAPI: + print '[%s] %s %s, EAPI:%i installed portage EAPI:%i' % (x[0].ljust(13), x[2], red("UNMERGABLE"),needed, portage.EAPI) + stupid_if_logic_hack = True + + if stupid_if_logic_hack: if (x[0]!="binary") and ("fetch" in string.split(portage.portdb.aux_get(x[2],["RESTRICT"])[0])): fetch = red("F") if portage.portdb.fetch_check(x[2], portage.settings): @@ -1830,6 +1845,34 @@ self.pkgsettings["FEATURES"]=string.join(myfeat) mergecount=0 + + unmergable = [] + for source, root, cpv, action in mymergelist: + if source == "ebuild": source = "porttree" + elif source == "binary": source = "bintree" + elif source in ("nomerge", "blocks"): + continue + else: + print "EAPI check, unknown source "+str(source)+" for "+cpv+", this shouldn't occur",mymergelist + sys.exit(1) + needed = portage.db[root][source].dbapi.aux_get(cpv, ["EAPI"])[0] + if portage.EAPI < needed: + unmergable.append((needed, cpv)) + + if len(unmergable): + print + print red("!!!") + print red("!!!")+" %s" % red("Ebuild API incompatibility") + print red("!!!")+" installed portage EAPI is %i, the following packages require a higher version" % portage.EAPI + print red("!!!")+" This version of portage is incapable of installing the higher version" + print red("!!!")+" A portage upgrade should solve this" + print red("!!!") + for needed, cpv in unmergable: + print ">>> %s requires EAPI %s" % (cpv, red(str(needed))) + print + if not ("--fetchonly" in myopts or "--fetch-all-uri" in myopts or "--pretend" in myopts): + sys.exit(1) + for x in mymergelist: mergecount+=1 myroot=x[1] diff -urN portage-old/pym/portage.py portage/pym/portage.py --- portage-old/pym/portage.py 2005-08-27 05:28:02.000000000 -0500 +++ portage/pym/portage.py 2005-08-27 05:27:26.000000000 -0500 @@ -81,7 +81,7 @@ MOVE_BINARY, PRELINK_BINARY, WORLD_FILE, MAKE_CONF_FILE, MAKE_DEFAULTS_FILE, \ DEPRECATED_PROFILE_FILE, USER_VIRTUALS_FILE, EBUILD_SH_ENV_FILE, \ INVALID_ENV_FILE, CUSTOM_MIRRORS_FILE, SANDBOX_PIDS_FILE, CONFIG_MEMORY_FILE,\ - INCREMENTALS, STICKIES + INCREMENTALS, STICKIES, EAPI from portage_data import ostype, lchown, userland, secpass, uid, wheelgid, \ portage_uid, portage_gid @@ -5077,9 +5071,9 @@ 'DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'INHERITED', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE', + 'PDEPEND', 'PROVIDE', 'EAPI', 'UNUSED_01', 'UNUSED_02', 'UNUSED_03', 'UNUSED_04', - 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', 'UNUSED_08', + 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', ] auxdbkeylen=len(auxdbkeys) @@ -5373,10 +5367,15 @@ mydata = self.auxdb[mylocation][cat][pkg] returnme = [] for x in mylist: - if mydata.has_key(x): - returnme.append(mydata[x]) - else: - returnme.append("") + returnme.append(mydata.get(x,"")) + + if "EAPI" in mylist: + idx = mylist.index("EAPI") + try: + returnme[idx] = int(returnme[idx]) + except ValueError: + # string + returnme[idx] = 0 return returnme diff -urN portage-old/pym/portage_db_flat.py portage/pym/portage_db_flat.py --- portage-old/pym/portage_db_flat.py 2005-08-27 05:27:59.000000000 -0500 +++ portage/pym/portage_db_flat.py 2005-08-27 05:27:43.000000000 -0500 @@ -9,6 +9,10 @@ import portage_db_template +# since this format is massively deprecated, +# we're hardcoding the previously weird line count +magic_line_count = 22 + class database(portage_db_template.database): def module_init(self): self.lastkey = None # Cache @@ -42,39 +46,39 @@ mykeys += [x] return mykeys - def get_values(self,key): + def get_values(self,key, data=None): + """ do not use data unless you know what it does.""" + if not key: raise KeyError, "key is not set to a valid value" - try: - # give buffering a hint of the pretty much maximal cache size we deal with - myf = open(self.fullpath+key, "r", 8192) - except OSError, oe: - # either the file didn't exist, or it was removed under our feet. - return None - + mydict = {} + if data == None: + try: + # give buffering a hint of the pretty much maximal cache size we deal with + myf = open(self.fullpath+key, "r", 8192) + except OSError: + # either the file didn't exist, or it was removed under our feet. + raise KeyError("failed reading key") + + # nuke the newlines right off the batt. + data = myf.read().splitlines() + mydict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + else: + mydict["_mtime_"] = data.pop(-1) - # nuke the newlines right off the batt. - data = myf.read().splitlines() - mdict = {} - # rely on exceptions to note differing line counts. try: - for x in range(0, len(self.dbkeys)): - mdict[self.dbkeys[x]] = data[x] - - # do this now, rather then earlier- possible that earlier it might have been wasted - # if key count mismatched - mdict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + for x in range(magic_line_count): + mydict[self.dbkeys[x]] = data[x] except IndexError: - myf.close() raise ValueError, "Key count mistmatch" - myf.close() - return mdict + return mydict - def set_values(self,key,val): + def set_values(self,key, val, raw=False): if not key: raise KeyError, "No key provided. key:%s val:%s" % (key,val) if not val: @@ -86,12 +90,19 @@ update_fp = self.fullpath + ".update." + str(os.getpid()) + "." + key myf = open(update_fp,"w") - myf.writelines( [ val[x] +"\n" for x in self.dbkeys] ) + if not raw: + myf.writelines( [ val[x] +"\n" for x in self.dbkeys] ) + if len(self.dbkeys) != magic_line_count: + myf.writelines(["\n"] * len(self.dbkeys) - magic_line_count) + mtime = val["_mtime_"] + else: + mtime = val.pop(-1) + myf.writelines(val) myf.close() os.chown(update_fp, self.uid, self.gid) os.chmod(update_fp, 0664) - os.utime(update_fp, (-1,long(val["_mtime_"]))) + os.utime(update_fp, (-1,long(mtime))) os.rename(update_fp, self.fullpath+key) def del_key(self,key): diff -urN portage-old/pym/portage_db_flat_hash.py portage/pym/portage_db_flat_hash.py --- portage-old/pym/portage_db_flat_hash.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_flat_hash.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,38 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import portage_db_flat, os + +class database(portage_db_flat.database): + + def get_values(self, key, data=None): + """ do not specify data unless you know what it does""" + if not key: + raise KeyError("key is not valid") + + if data == None: + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("failed pulling key") + + data = dict(map(lambda x: x.split("=",1), myf.read().splitlines())) + data["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + + mydict = {} + for x in self.dbkeys: + mydict[x] = data.get(x, "") + mydict["_mtime_"] = long(data["_mtime_"]) + return mydict + + def set_values(self, key, values): + l = [] + for x in values.keys(): + if values[x] and x != "_mtime_": + l.append("%s=%s\n" % (x, values[x])) + l.append(values["_mtime_"]) + portage_db_flat.database.set_values(self, key, l, raw=True) + diff -urN portage-old/pym/portage_db_metadata.py portage/pym/portage_db_metadata.py --- portage-old/pym/portage_db_metadata.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_metadata.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,49 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import os, portage_db_flat_hash, portage_db_flat + +class database(portage_db_flat_hash.database): + + def get_values(self, key): + if not key: + raise KeyError("key is not valid") + + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("key is not valid") + mtime = os.fstat(myf.fileno()).st_mtime + data = myf.read().splitlines() + + # easy attempt first. + if len(data) != portage_db_flat.magic_line_count: + d = dict(map(lambda x: x.split("=",1), data)) + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, d) + # this one's interesting. + d = {} + + for line in data: + # yes, meant to iterate over a string. + hashed = False + for idx, c in enumerate(line): + if not c.isalpha(): + if c == "=" and idx > 0: + hashed = True + d[line[:idx]] = line[idx + 1:] + elif c == "_" or c.isdigit(): + continue + break + elif not c.isupper(): + break + + if not hashed: + # non hashed. + data.append(mtime) + return portage_db_flat.database.get_values(self, key, data=data) + + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, data=d) --- portage-old/pym/portage_const.py 2005-04-28 23:56:35.000000000 -0500 +++ portage/pym/portage_const.py 2005-08-27 03:59:09.000000000 -0500 @@ -43,6 +43,9 @@ INCREMENTALS=["USE","FEATURES","ACCEPT_KEYWORDS","ACCEPT_LICENSE","CONFIG_PROTECT_MASK","CONFIG_PROTECT","PRELINK_PATH","PRELINK_PATH_MASK"] STICKIES=["KEYWORDS_ACCEPT","USE","CFLAGS","CXXFLAGS","MAKEOPTS","EXTRA_ECONF","EXTRA_EINSTALL","EXTRA_EMAKE"] +# supported EBUILD api versions. +EAPI = 0 + # =========================================================================== # END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT # =========================================================================== [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring @ 2005-08-28 5:46 ` Jason Stubbs 2005-08-28 9:29 ` Brian Harring 2005-08-28 9:31 ` Zac Medico ` (3 subsequent siblings) 4 siblings, 1 reply; 40+ messages in thread From: Jason Stubbs @ 2005-08-28 5:46 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 439 bytes --] On Saturday 27 August 2005 19:53, Brian Harring wrote: > Please test this out; if you want to test the EAPI checking, tag > EAPI=1 into an ebuild, and try making emerge bail. + print "EAPI check, unknown source "+str(x[0])+" for "+x[2]+", this shouldn't occur",mylist + sys.exit(1) These two are in the patch. Can that be made an exception please? That way --debug could still be useful if the bug hits. -- Jason Stubbs [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-28 5:46 ` Jason Stubbs @ 2005-08-28 9:29 ` Brian Harring 2005-08-28 15:32 ` warnera6 0 siblings, 1 reply; 40+ messages in thread From: Brian Harring @ 2005-08-28 9:29 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 742 bytes --] On Sun, Aug 28, 2005 at 02:46:28PM +0900, Jason Stubbs wrote: > On Saturday 27 August 2005 19:53, Brian Harring wrote: > > Please test this out; if you want to test the EAPI checking, tag > > EAPI=1 into an ebuild, and try making emerge bail. > > + print "EAPI check, unknown source "+str(x[0])+" for "+x[2]+", this > shouldn't occur",mylist > + sys.exit(1) > > These two are in the patch. Can that be made an exception please? That way > --debug could still be useful if the bug hits. That's debugging; not knowing (due to design flaws) all potentials for x[0], stuck that in debugging for anyone running the patch; people hitting it reporting back (hopefully), for debugging Final version won't include it. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-28 9:29 ` Brian Harring @ 2005-08-28 15:32 ` warnera6 0 siblings, 0 replies; 40+ messages in thread From: warnera6 @ 2005-08-28 15:32 UTC (permalink / raw To: gentoo-portage-dev > On Sun, Aug 28, 2005 at 02:46:28PM +0900, Jason Stubbs wrote: >> On Saturday 27 August 2005 19:53, Brian Harring wrote: >> > Please test this out; if you want to test the EAPI checking, tag >> > EAPI=1 into an ebuild, and try making emerge bail. >> >> + print "EAPI check, unknown source "+str(x[0])+" for "+x[2]+", this >> shouldn't occur",mylist >> + sys.exit(1) >> >> These two are in the patch. Can that be made an exception please? That >> way >> --debug could still be useful if the bug hits. > That's debugging; not knowing (due to design flaws) all potentials for > x[0], stuck that in debugging for anyone running the patch; people > hitting it reporting back (hopefully), for debugging > > Final version won't include it. > ~harring > pppfft, you were just complaining about all the sys.exit()'s in the code and then you go and add one yourself. raise something instead, even if it's just an Exception, that way it saves anyone from grepping through the code for the error message. -Alec PS: Squirrelmail sucks for actual work :P -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring 2005-08-28 5:46 ` Jason Stubbs @ 2005-08-28 9:31 ` Zac Medico 2005-08-28 9:45 ` Brian Harring 2005-08-29 8:32 ` Paul de Vrieze ` (2 subsequent siblings) 4 siblings, 1 reply; 40+ messages in thread From: Zac Medico @ 2005-08-28 9:31 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 234 bytes --] Brian Harring wrote: > Please test this out; if you want to test the EAPI checking, tag > EAPI=1 into an ebuild, and try making emerge bail. I needed to patch ebuild.sh so that EAPI would be parsed. It bails out properly now. Zac [-- Attachment #2: 2.0.51-eapi-awareness-ebuild.sh.patch --] [-- Type: text/x-patch, Size: 741 bytes --] Index: portage/bin/ebuild.sh =================================================================== --- portage.orig/bin/ebuild.sh +++ portage/bin/ebuild.sh @@ -1850,6 +1850,7 @@ for myarg in $*; do echo `echo "$CDEPEND"` >> $dbkey echo `echo "$PDEPEND"` >> $dbkey echo `echo "$PROVIDE"` >> $dbkey + echo `echo "$EAPI"` >> $dbkey echo `echo "$UNUSED_01"` >> $dbkey echo `echo "$UNUSED_02"` >> $dbkey echo `echo "$UNUSED_03"` >> $dbkey @@ -1857,7 +1858,6 @@ for myarg in $*; do echo `echo "$UNUSED_05"` >> $dbkey echo `echo "$UNUSED_06"` >> $dbkey echo `echo "$UNUSED_07"` >> $dbkey - echo `echo "$UNUSED_08"` >> $dbkey set +f #make sure it is writable by our group: exit 0 ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-28 9:31 ` Zac Medico @ 2005-08-28 9:45 ` Brian Harring 0 siblings, 0 replies; 40+ messages in thread From: Brian Harring @ 2005-08-28 9:45 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 395 bytes --] On Sun, Aug 28, 2005 at 02:31:24AM -0700, Zac Medico wrote: > Brian Harring wrote: > >Please test this out; if you want to test the EAPI checking, tag > >EAPI=1 into an ebuild, and try making emerge bail. > > I needed to patch ebuild.sh so that EAPI would be parsed. It bails out > properly now. Crud, didn't include that file. Should be echo `echo "${EAPI:-0}"` actually ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring 2005-08-28 5:46 ` Jason Stubbs 2005-08-28 9:31 ` Zac Medico @ 2005-08-29 8:32 ` Paul de Vrieze 2005-08-29 20:52 ` Zac Medico 2005-09-02 6:31 ` Marius Mauch 4 siblings, 0 replies; 40+ messages in thread From: Paul de Vrieze @ 2005-08-29 8:32 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 927 bytes --] On Saturday 27 August 2005 12:53, Brian Harring wrote: > Hola. > > Attached is a patch that > A) adds EAPI awareness to portage; mainly, if >0, complain and be > unwilling to merge the package > B) tweaks to portage_db_flat, addition of portage_db_metadata, and > portage_db_flat_hash I just realised that there are possible issues with incompatble eclasses and ebuilds. What (should) happen(s) when an eclass supports EAPI=1 with src_configure and src_make, while the ebuild supports/expects EAPI=0 with src_compile. This means that in some way eclasses should state which EAPI versions they support. Possibly with making EAPI a space separated list of api's accepted. This would mean some checking in the inherit code AND that EAPI in the ebuild should be defined before the inherit. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring ` (2 preceding siblings ...) 2005-08-29 8:32 ` Paul de Vrieze @ 2005-08-29 20:52 ` Zac Medico 2005-08-29 22:45 ` Brian Harring 2005-08-30 9:43 ` Paul de Vrieze 2005-09-02 6:31 ` Marius Mauch 4 siblings, 2 replies; 40+ messages in thread From: Zac Medico @ 2005-08-29 20:52 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 826 bytes --] Brian Harring wrote: > > Please test this out; if you want to test the EAPI checking, tag > EAPI=1 into an ebuild, and try making emerge bail. > Well, it bails too often. :) It seems that an explicit integer conversion is needed for > and < comparisons with mixed types (2.0.51-eapi-awareness-emerge-int-conversion.patch). > If you're less adventurous, please test the compatibility cache > testing; > in /etc/portage/modules > portdbapi.metadbmodule=portage_db_metadata.database > We need to make sure EAPI defaults to 0 when using old metadata. It seems like db_template.__getitem__() is a nice central place to do that (2.0.51-eapi-awareness-db_template.patch). I made another patch for bindbapi.aux_get() which does the same for old metadata from binpkgs (2.0.51-eapi-awareness-bindbapi.aux_get.patch). Zac [-- Attachment #2: 2.0.51-eapi-awareness-emerge-int-conversion.patch --] [-- Type: text/x-patch, Size: 907 bytes --] Index: portage-2.0.51.22/bin/emerge =================================================================== --- portage-2.0.51.22.orig/bin/emerge +++ portage-2.0.51.22/bin/emerge @@ -1523,7 +1523,7 @@ class depgraph: sys.exit(1) if source: needed = portage.db[x[1]][source].dbapi.aux_get(x[2], ["EAPI"])[0] - if needed > portage.EAPI: + if int(needed) > portage.EAPI: print '[%s] %s %s, EAPI:%i installed portage EAPI:%i' % (x[0].ljust(13), x[2], red("UNMERGABLE"),needed, portage.EAPI) stupid_if_logic_hack = True @@ -1856,7 +1856,7 @@ class depgraph: print "EAPI check, unknown source "+str(source)+" for "+cpv+", this shouldn't occur",mymergelist sys.exit(1) needed = portage.db[root][source].dbapi.aux_get(cpv, ["EAPI"])[0] - if portage.EAPI < needed: + if portage.EAPI < int(needed): unmergable.append((needed, cpv)) if len(unmergable): [-- Attachment #3: 2.0.51-eapi-awareness-db_template.patch --] [-- Type: text/x-patch, Size: 567 bytes --] Index: portage-2.0.51.22/pym/portage_db_template.py =================================================================== --- portage-2.0.51.22.orig/pym/portage_db_template.py +++ portage-2.0.51.22/pym/portage_db_template.py @@ -71,6 +71,10 @@ class database: if self.has_key(key): try: values = self.get_values(key) + values.setdefault("EAPI","0") + if values["EAPI"]=="": + # for backward compatibility with old metadata from various sources + values["EAPI"]="0" self.__addCache(key,values) return values except SystemExit, e: [-- Attachment #4: 2.0.51-eapi-awareness-bindbapi.aux_get.patch --] [-- Type: text/x-patch, Size: 718 bytes --] Index: portage-2.0.51.22/pym/portage.py =================================================================== --- portage-2.0.51.22.orig/pym/portage.py +++ portage-2.0.51.22/pym/portage.py @@ -4517,13 +4517,18 @@ class bindbapi(fakedbapi): if self.bintree.remotepkgs[tbz2name].has_key(x): mylist.append(self.bintree.remotepkgs[tbz2name][x][:]) # [:] Copy String else: - mylist.append("") + if x=="EAPI": + mylist.append("0") + else: + mylist.append("") else: myval = tbz2.getfile(x) if myval == None: myval = "" else: myval = string.join(myval.split(),' ') + if x=="EAPI" and myval=="": + myval="0" mylist.append(myval) return mylist ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-29 20:52 ` Zac Medico @ 2005-08-29 22:45 ` Brian Harring 2005-08-30 1:07 ` Brian Harring 2005-08-30 9:43 ` Paul de Vrieze 1 sibling, 1 reply; 40+ messages in thread From: Brian Harring @ 2005-08-29 22:45 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1.1: Type: text/plain, Size: 2257 bytes --] On Mon, Aug 29, 2005 at 01:52:50PM -0700, Zac Medico wrote: > Brian Harring wrote: > > > >Please test this out; if you want to test the EAPI checking, tag > >EAPI=1 into an ebuild, and try making emerge bail. > > > > Well, it bails too often. :) Mainly cause I generated something of a crap patch leaving a bit of stuff out from the looks of it :) > It seems that an explicit integer conversion is needed for > and < > comparisons with mixed types > (2.0.51-eapi-awareness-emerge-int-conversion.patch). > >If you're less adventurous, please test the compatibility cache > >testing; > >in /etc/portage/modules > >portdbapi.metadbmodule=portage_db_metadata.database > > > > We need to make sure EAPI defaults to 0 when using old metadata. It seems > like db_template.__getitem__() is a nice central place to do that > (2.0.51-eapi-awareness-db_template.patch). I made another patch for > bindbapi.aux_get() which does the same for old metadata from binpkgs > (2.0.51-eapi-awareness-bindbapi.aux_get.patch). The default'ing should occur outside of the cache layer imo, due to the fact it has to occur in every dbapi. Attached is a patch doing so, using gvisible to mask ebuild's EAPI > portage's EAPI, and a check in doebuild to block people from trying to do things with an ebuild that has an EAPI greater then portage's. The doebuild mod is strictly for non depend phases; the data from a depend's phase gets nuked and EAPI set to -EAPI if it's a later version that what portage knows about. Discussed on irc a bit, but repeating the reasons for those on the ml who've missed the logic; effectively, an EAPI=0 portage generating an EAPI=1 cache entry cannot be guranteed to generate it correctly, contain all needed metadata. So you flag it specially (negated EAPI), and don't store anything. Add a few checks in so when an EAPI=1 portage finds the EAPI=1 cache entry, which has been negated to mean effectively "someone who is EAPI=1, please regenerate me", it gets regenerated, and the entry can be trusted to hold all required EAPI1 metadata. Attached is a patch culminating the feedback, with a few tweaks. Should work a helluva lot better this time around :) ~harring [-- Attachment #1.2: 2.0.51-eapi-awareness-2.patch --] [-- Type: text/plain, Size: 13792 bytes --] diff -purN portage-old/bin/ebuild.sh portage/bin/ebuild.sh --- portage-old/bin/ebuild.sh 2005-08-29 02:16:41.000000000 -0500 +++ portage/bin/ebuild.sh 2005-08-29 17:02:00.000000000 -0500 @@ -1831,6 +1831,7 @@ for myarg in $*; do echo `echo "$CDEPEND"` >> $dbkey echo `echo "$PDEPEND"` >> $dbkey echo `echo "$PROVIDE"` >> $dbkey + echo `echo "${EAPI:-0}"` >> $dbkey echo `echo "$UNUSED_01"` >> $dbkey echo `echo "$UNUSED_02"` >> $dbkey echo `echo "$UNUSED_03"` >> $dbkey @@ -1838,7 +1839,6 @@ for myarg in $*; do echo `echo "$UNUSED_05"` >> $dbkey echo `echo "$UNUSED_06"` >> $dbkey echo `echo "$UNUSED_07"` >> $dbkey - echo `echo "$UNUSED_08"` >> $dbkey set +f #make sure it is writable by our group: exit 0 diff -purN portage-old/pym/portage.py portage/pym/portage.py --- portage-old/pym/portage.py 2005-08-27 05:28:02.000000000 -0500 +++ portage/pym/portage.py 2005-08-29 17:11:30.000000000 -0500 @@ -81,7 +81,7 @@ try: MOVE_BINARY, PRELINK_BINARY, WORLD_FILE, MAKE_CONF_FILE, MAKE_DEFAULTS_FILE, \ DEPRECATED_PROFILE_FILE, USER_VIRTUALS_FILE, EBUILD_SH_ENV_FILE, \ INVALID_ENV_FILE, CUSTOM_MIRRORS_FILE, SANDBOX_PIDS_FILE, CONFIG_MEMORY_FILE,\ - INCREMENTALS, STICKIES + INCREMENTALS, STICKIES, EAPI from portage_data import ostype, lchown, userland, secpass, uid, wheelgid, \ portage_uid, portage_gid @@ -2402,6 +2396,15 @@ def doebuild(myebuild,mydo,myroot,mysett raise except: pass + try: + eapi = abs(db[root][tree].dbapi.aux_get(mycpv, ["EAPI"])[0]) + if portage_const.EAPI != eapi: + # can't do anything with this. + raise Exception("Unable to do any operations on '%s', due to the fact it's EAPI is higher then this portage versions. Please upgrade to a portage version that supports EAPI %i" % (mycpv, eapi)) + except SystemExit, e: + raise + except Exception, e: + raise Exception("Unable to pull EAPI from cpv %s, tree %s; can't confirm that it's supported by this portage, thus unable to merge it: Exception was '%s'" % (mycpv, tree, e)) if mysplit[2] == "r0": mysettings["PVR"]=mysplit[1] @@ -3911,7 +3914,10 @@ def getmaskingstatus(mycpv): rValue.append("package.mask") # keywords checking - mygroups = portdb.aux_get(mycpv, ["KEYWORDS"])[0].split() + mygroups, eapi = portdb.aux_get(mycpv, ["KEYWORDS", "EAPI"]) + if abs(eapi) > portage_const.EAPI: + return ["required EAPI %i, supported EAPI %i" % (eapi, portage_const.EAPI)] + mygroups = mygroups.split() pgroups=groups[:] myarch = settings["ARCH"] pkgdict = settings.pkeywordsdict @@ -4531,7 +4537,12 @@ class bindbapi(fakedbapi): else: myval = string.join(myval.split(),' ') mylist.append(myval) - + if "EAPI" in wants: + idx = wants.index("EAPI") + try: + mylist[idx] = abs(int(mylist[idx])) + except ValueError: + mylist[idx] = 0 return mylist @@ -4811,6 +4822,12 @@ class vardbapi(dbapi): else: myd = "" results.append(myd) + if "EAPI" in wants: + idx = wants.index("EAPI") + try: + results[idx] = abs(int(wants[idx])) + except ValueError: + results[idx] = 0 return results @@ -5077,9 +5094,9 @@ auxdbkeys=[ 'DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'INHERITED', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE', + 'PDEPEND', 'PROVIDE', 'EAPI', 'UNUSED_01', 'UNUSED_02', 'UNUSED_03', 'UNUSED_04', - 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', 'UNUSED_08', + 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', ] auxdbkeylen=len(auxdbkeys) @@ -5293,11 +5310,18 @@ class portdbapi(dbapi): # we use cache files, which is usually on /usr/portage/metadata/cache/. if doregen and mylocation==self.mysettings["PORTDIR"] and metacachedir and self.metadb[cat].has_key(pkg): metadata=self.metadb[cat][pkg] + + if metadata.setdefault("EAPI", 0) != portage_const.EAPI: + # intentionally wipe keys. + metadata = {"EAPI":-metadata["EAPI"]} + + # fun... + # we know that metadata cache entries *always* have all keys self.eclassdb.update_package(mylocation,cat,pkg,metadata["INHERITED"].split()) self.auxdb[mylocation][cat][pkg] = metadata self.auxdb[mylocation][cat].sync() - elif doregen: + elif doregen: writemsg("doregen: %s %s\n" % (doregen,mycpv), 2) writemsg("Generating cache entry(0) for: "+str(myebuild)+"\n",1) @@ -5362,6 +5386,14 @@ class portdbapi(dbapi): if mylines[x][-1] == '\n': mylines[x] = mylines[x][:-1] mydata[auxdbkeys[x]] = mylines[x] + + eapi = int(mydata["EAPI"]) + if eapi > portage_const.EAPI: + # if newer version, wipe everything and negate eapi + mydata = {} + map(lambda x:mydata.setdefault(x, ""), auxdbkeys) + mydata["EAPI"] = -eapi + mydata["_mtime_"] = emtime self.auxdb[mylocation][cat][pkg] = mydata @@ -5373,10 +5405,15 @@ class portdbapi(dbapi): mydata = self.auxdb[mylocation][cat][pkg] returnme = [] for x in mylist: - if mydata.has_key(x): - returnme.append(mydata[x]) - else: - returnme.append("") + returnme.append(mydata.get(x,"")) + + if "EAPI" in mylist: + idx = mylist.index("EAPI") + try: + returnme[idx] = abs(int(returnme[idx])) + except ValueError: + # string + returnme[idx] = 0 return returnme @@ -5625,14 +5662,14 @@ class portdbapi(dbapi): #we need to update this next line when we have fully integrated the new db api auxerr=0 try: - myaux=db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS"]) + keys, eapi = db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS", "EAPI"]) except (KeyError,IOError,TypeError): continue - if not myaux[0]: + if not keys: # KEYWORDS="" #print "!!! No KEYWORDS for "+str(mycpv)+" -- Untested Status" continue - mygroups=myaux[0].split() + mygroups=keys.split() pgroups=groups[:] match=0 cp = dep_getkey(mycpv) @@ -5660,7 +5697,8 @@ class portdbapi(dbapi): if not match and ((hastesting and "~*" in pgroups) or (hasstable and "*" in pgroups)): match=1 if match: - newlist.append(mycpv) + if eapi == portage_const.EAPI: + newlist.append(mycpv) return newlist class binarytree(packagetree): diff -purN portage-old/pym/portage_const.py portage/pym/portage_const.py --- portage-old/pym/portage_const.py 2005-08-29 17:05:10.000000000 -0500 +++ portage/pym/portage_const.py 2005-08-29 17:06:02.000000000 -0500 @@ -43,6 +43,8 @@ CONFIG_MEMORY_FILE = PRIVATE_PATH + INCREMENTALS=["USE","FEATURES","ACCEPT_KEYWORDS","ACCEPT_LICENSE","CONFIG_PROTECT_MASK","CONFIG_PROTECT","PRELINK_PATH","PRELINK_PATH_MASK"] STICKIES=["KEYWORDS_ACCEPT","USE","CFLAGS","CXXFLAGS","MAKEOPTS","EXTRA_ECONF","EXTRA_EINSTALL","EXTRA_EMAKE"] +EAPI = 0 + # =========================================================================== # END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT # =========================================================================== diff -purN portage-old/pym/portage_db_flat.py portage/pym/portage_db_flat.py --- portage-old/pym/portage_db_flat.py 2005-08-27 05:27:59.000000000 -0500 +++ portage/pym/portage_db_flat.py 2005-08-27 05:27:43.000000000 -0500 @@ -9,6 +9,10 @@ import stat import portage_db_template +# since this format is massively deprecated, +# we're hardcoding the previously weird line count +magic_line_count = 22 + class database(portage_db_template.database): def module_init(self): self.lastkey = None # Cache @@ -42,39 +46,39 @@ class database(portage_db_template.datab mykeys += [x] return mykeys - def get_values(self,key): + def get_values(self,key, data=None): + """ do not use data unless you know what it does.""" + if not key: raise KeyError, "key is not set to a valid value" - try: - # give buffering a hint of the pretty much maximal cache size we deal with - myf = open(self.fullpath+key, "r", 8192) - except OSError, oe: - # either the file didn't exist, or it was removed under our feet. - return None - + mydict = {} + if data == None: + try: + # give buffering a hint of the pretty much maximal cache size we deal with + myf = open(self.fullpath+key, "r", 8192) + except OSError: + # either the file didn't exist, or it was removed under our feet. + raise KeyError("failed reading key") + + # nuke the newlines right off the batt. + data = myf.read().splitlines() + mydict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + else: + mydict["_mtime_"] = data.pop(-1) - # nuke the newlines right off the batt. - data = myf.read().splitlines() - mdict = {} - # rely on exceptions to note differing line counts. try: - for x in range(0, len(self.dbkeys)): - mdict[self.dbkeys[x]] = data[x] - - # do this now, rather then earlier- possible that earlier it might have been wasted - # if key count mismatched - mdict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + for x in range(magic_line_count): + mydict[self.dbkeys[x]] = data[x] except IndexError: - myf.close() raise ValueError, "Key count mistmatch" - myf.close() - return mdict + return mydict - def set_values(self,key,val): + def set_values(self,key, val, raw=False): if not key: raise KeyError, "No key provided. key:%s val:%s" % (key,val) if not val: @@ -86,12 +90,19 @@ class database(portage_db_template.datab update_fp = self.fullpath + ".update." + str(os.getpid()) + "." + key myf = open(update_fp,"w") - myf.writelines( [ val[x] +"\n" for x in self.dbkeys] ) + if not raw: + myf.writelines( [ val[x] +"\n" for x in self.dbkeys] ) + if len(self.dbkeys) != magic_line_count: + myf.writelines(["\n"] * len(self.dbkeys) - magic_line_count) + mtime = val["_mtime_"] + else: + mtime = val.pop(-1) + myf.writelines(val) myf.close() os.chown(update_fp, self.uid, self.gid) os.chmod(update_fp, 0664) - os.utime(update_fp, (-1,long(val["_mtime_"]))) + os.utime(update_fp, (-1,long(mtime))) os.rename(update_fp, self.fullpath+key) def del_key(self,key): diff -purN portage-old/pym/portage_db_flat_hash.py portage/pym/portage_db_flat_hash.py --- portage-old/pym/portage_db_flat_hash.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_flat_hash.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,38 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import portage_db_flat, os + +class database(portage_db_flat.database): + + def get_values(self, key, data=None): + """ do not specify data unless you know what it does""" + if not key: + raise KeyError("key is not valid") + + if data == None: + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("failed pulling key") + + data = dict(map(lambda x: x.split("=",1), myf.read().splitlines())) + data["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + + mydict = {} + for x in self.dbkeys: + mydict[x] = data.get(x, "") + mydict["_mtime_"] = long(data["_mtime_"]) + return mydict + + def set_values(self, key, values): + l = [] + for x in values.keys(): + if values[x] and x != "_mtime_": + l.append("%s=%s\n" % (x, values[x])) + l.append(values["_mtime_"]) + portage_db_flat.database.set_values(self, key, l, raw=True) + diff -purN portage-old/pym/portage_db_metadata.py portage/pym/portage_db_metadata.py --- portage-old/pym/portage_db_metadata.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_metadata.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,49 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import os, portage_db_flat_hash, portage_db_flat + +class database(portage_db_flat_hash.database): + + def get_values(self, key): + if not key: + raise KeyError("key is not valid") + + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("key is not valid") + mtime = os.fstat(myf.fileno()).st_mtime + data = myf.read().splitlines() + + # easy attempt first. + if len(data) != portage_db_flat.magic_line_count: + d = dict(map(lambda x: x.split("=",1), data)) + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, d) + # this one's interesting. + d = {} + + for line in data: + # yes, meant to iterate over a string. + hashed = False + for idx, c in enumerate(line): + if not c.isalpha(): + if c == "=" and idx > 0: + hashed = True + d[line[:idx]] = line[idx + 1:] + elif c == "_" or c.isdigit(): + continue + break + elif not c.isupper(): + break + + if not hashed: + # non hashed. + data.append(mtime) + return portage_db_flat.database.get_values(self, key, data=data) + + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, data=d) [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-29 22:45 ` Brian Harring @ 2005-08-30 1:07 ` Brian Harring 2005-08-31 15:10 ` Zac Medico 2005-09-01 8:11 ` Zac Medico 0 siblings, 2 replies; 40+ messages in thread From: Brian Harring @ 2005-08-30 1:07 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1.1: Type: text/plain, Size: 391 bytes --] Round 3, fixed all uglyness. You *will* see uglyness for the changeover from flat_list to flat_hash if you're setting portdbapi.auxdbmodule to flat_hash, but that's a one time hit, and is the reason we blow away the cache on portage upgrades. Either way, full patch, just correction of a few instances where it user visible warnings were popping up, but not required. ~harring [-- Attachment #1.2: 2.0.51-eapi-awareness-3.patch --] [-- Type: text/plain, Size: 13954 bytes --] diff -purN portage-old/bin/ebuild.sh portage/bin/ebuild.sh --- portage-old/bin/ebuild.sh 2005-08-29 02:16:41.000000000 -0500 +++ portage/bin/ebuild.sh 2005-08-29 17:02:00.000000000 -0500 @@ -1831,6 +1831,7 @@ for myarg in $*; do echo `echo "$CDEPEND"` >> $dbkey echo `echo "$PDEPEND"` >> $dbkey echo `echo "$PROVIDE"` >> $dbkey + echo `echo "${EAPI:-0}"` >> $dbkey echo `echo "$UNUSED_01"` >> $dbkey echo `echo "$UNUSED_02"` >> $dbkey echo `echo "$UNUSED_03"` >> $dbkey @@ -1838,7 +1839,6 @@ for myarg in $*; do echo `echo "$UNUSED_05"` >> $dbkey echo `echo "$UNUSED_06"` >> $dbkey echo `echo "$UNUSED_07"` >> $dbkey - echo `echo "$UNUSED_08"` >> $dbkey set +f #make sure it is writable by our group: exit 0 diff -purN portage-old/pym/portage.py portage/pym/portage.py --- portage-old/pym/portage.py 2005-08-27 05:28:02.000000000 -0500 +++ portage/pym/portage.py 2005-08-29 19:28:34.000000000 -0500 @@ -81,7 +81,7 @@ try: MOVE_BINARY, PRELINK_BINARY, WORLD_FILE, MAKE_CONF_FILE, MAKE_DEFAULTS_FILE, \ DEPRECATED_PROFILE_FILE, USER_VIRTUALS_FILE, EBUILD_SH_ENV_FILE, \ INVALID_ENV_FILE, CUSTOM_MIRRORS_FILE, SANDBOX_PIDS_FILE, CONFIG_MEMORY_FILE,\ - INCREMENTALS, STICKIES + INCREMENTALS, STICKIES, EAPI from portage_data import ostype, lchown, userland, secpass, uid, wheelgid, \ portage_uid, portage_gid @@ -2402,6 +2396,15 @@ def doebuild(myebuild,mydo,myroot,mysett raise except: pass + try: + eapi = abs(db[root][tree].dbapi.aux_get(mycpv, ["EAPI"])[0]) + if portage_const.EAPI != eapi: + # can't do anything with this. + raise Exception("Unable to do any operations on '%s', due to the fact it's EAPI is higher then this portage versions. Please upgrade to a portage version that supports EAPI %i" % (mycpv, eapi)) + except SystemExit, e: + raise + except Exception, e: + raise Exception("Unable to pull EAPI from cpv %s, tree %s; can't confirm that it's supported by this portage, thus unable to merge it: Exception was '%s'" % (mycpv, tree, e)) if mysplit[2] == "r0": mysettings["PVR"]=mysplit[1] @@ -3911,7 +3914,10 @@ def getmaskingstatus(mycpv): rValue.append("package.mask") # keywords checking - mygroups = portdb.aux_get(mycpv, ["KEYWORDS"])[0].split() + mygroups, eapi = portdb.aux_get(mycpv, ["KEYWORDS", "EAPI"]) + if abs(eapi) > portage_const.EAPI: + return ["required EAPI %i, supported EAPI %i" % (eapi, portage_const.EAPI)] + mygroups = mygroups.split() pgroups=groups[:] myarch = settings["ARCH"] pkgdict = settings.pkeywordsdict @@ -4531,7 +4537,12 @@ class bindbapi(fakedbapi): else: myval = string.join(myval.split(),' ') mylist.append(myval) - + if "EAPI" in wants: + idx = wants.index("EAPI") + try: + mylist[idx] = abs(int(mylist[idx])) + except ValueError: + mylist[idx] = 0 return mylist @@ -4811,6 +4822,12 @@ class vardbapi(dbapi): else: myd = "" results.append(myd) + if "EAPI" in wants: + idx = wants.index("EAPI") + try: + results[idx] = abs(int(wants[idx])) + except ValueError: + results[idx] = 0 return results @@ -5077,9 +5094,9 @@ auxdbkeys=[ 'DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'INHERITED', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE', + 'PDEPEND', 'PROVIDE', 'EAPI', 'UNUSED_01', 'UNUSED_02', 'UNUSED_03', 'UNUSED_04', - 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', 'UNUSED_08', + 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', ] auxdbkeylen=len(auxdbkeys) @@ -5293,11 +5310,22 @@ class portdbapi(dbapi): # we use cache files, which is usually on /usr/portage/metadata/cache/. if doregen and mylocation==self.mysettings["PORTDIR"] and metacachedir and self.metadb[cat].has_key(pkg): metadata=self.metadb[cat][pkg] - self.eclassdb.update_package(mylocation,cat,pkg,metadata["INHERITED"].split()) + try: + eapi = int(metadata["EAPI"]) + except (KeyError, ValueError): + eapi = 0 + metadata["EAPI"] = eapi + if eapi != portage_const.EAPI: + # intentionally wipe keys. + metadata = {"EAPI":-eapi} + else: + # eclass updates only if we haven't nuked the entry. + self.eclassdb.update_package(mylocation,cat,pkg,metadata["INHERITED"].split()) + self.auxdb[mylocation][cat][pkg] = metadata self.auxdb[mylocation][cat].sync() - elif doregen: + elif doregen: writemsg("doregen: %s %s\n" % (doregen,mycpv), 2) writemsg("Generating cache entry(0) for: "+str(myebuild)+"\n",1) @@ -5362,6 +5390,14 @@ class portdbapi(dbapi): if mylines[x][-1] == '\n': mylines[x] = mylines[x][:-1] mydata[auxdbkeys[x]] = mylines[x] + + eapi = int(mydata["EAPI"]) + if eapi > portage_const.EAPI: + # if newer version, wipe everything and negate eapi + mydata = {} + map(lambda x:mydata.setdefault(x, ""), auxdbkeys) + mydata["EAPI"] = -eapi + mydata["_mtime_"] = emtime self.auxdb[mylocation][cat][pkg] = mydata @@ -5373,10 +5409,15 @@ class portdbapi(dbapi): mydata = self.auxdb[mylocation][cat][pkg] returnme = [] for x in mylist: - if mydata.has_key(x): - returnme.append(mydata[x]) - else: - returnme.append("") + returnme.append(mydata.get(x,"")) + + if "EAPI" in mylist: + idx = mylist.index("EAPI") + try: + returnme[idx] = abs(int(returnme[idx])) + except ValueError: + # string + returnme[idx] = 0 return returnme @@ -5625,14 +5666,14 @@ class portdbapi(dbapi): #we need to update this next line when we have fully integrated the new db api auxerr=0 try: - myaux=db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS"]) + keys, eapi = db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS", "EAPI"]) except (KeyError,IOError,TypeError): continue - if not myaux[0]: + if not keys: # KEYWORDS="" #print "!!! No KEYWORDS for "+str(mycpv)+" -- Untested Status" continue - mygroups=myaux[0].split() + mygroups=keys.split() pgroups=groups[:] match=0 cp = dep_getkey(mycpv) @@ -5660,7 +5701,8 @@ class portdbapi(dbapi): if not match and ((hastesting and "~*" in pgroups) or (hasstable and "*" in pgroups)): match=1 if match: - newlist.append(mycpv) + if eapi == portage_const.EAPI: + newlist.append(mycpv) return newlist class binarytree(packagetree): diff -purN portage-old/pym/portage_const.py portage/pym/portage_const.py --- portage-old/pym/portage_const.py 2005-08-29 17:05:10.000000000 -0500 +++ portage/pym/portage_const.py 2005-08-29 17:06:02.000000000 -0500 @@ -43,6 +43,8 @@ CONFIG_MEMORY_FILE = PRIVATE_PATH + INCREMENTALS=["USE","FEATURES","ACCEPT_KEYWORDS","ACCEPT_LICENSE","CONFIG_PROTECT_MASK","CONFIG_PROTECT","PRELINK_PATH","PRELINK_PATH_MASK"] STICKIES=["KEYWORDS_ACCEPT","USE","CFLAGS","CXXFLAGS","MAKEOPTS","EXTRA_ECONF","EXTRA_EINSTALL","EXTRA_EMAKE"] +EAPI = 0 + # =========================================================================== # END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT # =========================================================================== diff -purN portage-old/pym/portage_db_flat.py portage/pym/portage_db_flat.py --- portage-old/pym/portage_db_flat.py 2005-08-27 05:27:59.000000000 -0500 +++ portage/pym/portage_db_flat.py 2005-08-29 19:34:32.000000000 -0500 @@ -9,6 +9,10 @@ import stat import portage_db_template +# since this format is massively deprecated, +# we're hardcoding the previously weird line count +magic_line_count = 22 + class database(portage_db_template.database): def module_init(self): self.lastkey = None # Cache @@ -42,39 +46,39 @@ class database(portage_db_template.datab mykeys += [x] return mykeys - def get_values(self,key): + def get_values(self,key, data=None): + """ do not use data unless you know what it does.""" + if not key: raise KeyError, "key is not set to a valid value" - try: - # give buffering a hint of the pretty much maximal cache size we deal with - myf = open(self.fullpath+key, "r", 8192) - except OSError, oe: - # either the file didn't exist, or it was removed under our feet. - return None - + mydict = {} + if data == None: + try: + # give buffering a hint of the pretty much maximal cache size we deal with + myf = open(self.fullpath+key, "r", 8192) + except OSError: + # either the file didn't exist, or it was removed under our feet. + raise KeyError("failed reading key") + + # nuke the newlines right off the batt. + data = myf.read().splitlines() + mydict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + else: + mydict["_mtime_"] = data.pop(-1) - # nuke the newlines right off the batt. - data = myf.read().splitlines() - mdict = {} - # rely on exceptions to note differing line counts. try: - for x in range(0, len(self.dbkeys)): - mdict[self.dbkeys[x]] = data[x] - - # do this now, rather then earlier- possible that earlier it might have been wasted - # if key count mismatched - mdict["_mtime_"] = os.fstat(myf.fileno()).st_mtime + for x in range(magic_line_count): + mydict[self.dbkeys[x]] = data[x] except IndexError: - myf.close() raise ValueError, "Key count mistmatch" - myf.close() - return mdict + return mydict - def set_values(self,key,val): + def set_values(self,key, val, raw=False): if not key: raise KeyError, "No key provided. key:%s val:%s" % (key,val) if not val: @@ -86,12 +90,19 @@ class database(portage_db_template.datab update_fp = self.fullpath + ".update." + str(os.getpid()) + "." + key myf = open(update_fp,"w") - myf.writelines( [ val[x] +"\n" for x in self.dbkeys] ) + if not raw: + myf.writelines( [ str(val[x]) +"\n" for x in self.dbkeys] ) + if len(self.dbkeys) != magic_line_count: + myf.writelines(["\n"] * len(self.dbkeys) - magic_line_count) + mtime = val["_mtime_"] + else: + mtime = val.pop(-1) + myf.writelines(val) myf.close() os.chown(update_fp, self.uid, self.gid) os.chmod(update_fp, 0664) - os.utime(update_fp, (-1,long(val["_mtime_"]))) + os.utime(update_fp, (-1,long(mtime))) os.rename(update_fp, self.fullpath+key) def del_key(self,key): diff -purN portage-old/pym/portage_db_flat_hash.py portage/pym/portage_db_flat_hash.py --- portage-old/pym/portage_db_flat_hash.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_flat_hash.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,38 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import portage_db_flat, os + +class database(portage_db_flat.database): + + def get_values(self, key, data=None): + """ do not specify data unless you know what it does""" + if not key: + raise KeyError("key is not valid") + + if data == None: + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("failed pulling key") + + data = dict(map(lambda x: x.split("=",1), myf.read().splitlines())) + data["_mtime_"] = os.fstat(myf.fileno()).st_mtime + myf.close() + + mydict = {} + for x in self.dbkeys: + mydict[x] = data.get(x, "") + mydict["_mtime_"] = long(data["_mtime_"]) + return mydict + + def set_values(self, key, values): + l = [] + for x in values.keys(): + if values[x] and x != "_mtime_": + l.append("%s=%s\n" % (x, values[x])) + l.append(values["_mtime_"]) + portage_db_flat.database.set_values(self, key, l, raw=True) + diff -purN portage-old/pym/portage_db_metadata.py portage/pym/portage_db_metadata.py --- portage-old/pym/portage_db_metadata.py 1969-12-31 18:00:00.000000000 -0600 +++ portage/pym/portage_db_metadata.py 2005-08-27 05:27:43.000000000 -0500 @@ -0,0 +1,49 @@ +# Copyright 2004 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-src/portage/pym/Attic/portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $ +cvs_id_string="$Id: portage_db_flat.py,v 1.13.2.6 2005/04/19 07:14:17 ferringb Exp $"[5:-2] + +import os, portage_db_flat_hash, portage_db_flat + +class database(portage_db_flat_hash.database): + + def get_values(self, key): + if not key: + raise KeyError("key is not valid") + + try: + myf = open(self.fullpath + key, "r") + except OSError: + raise KeyError("key is not valid") + mtime = os.fstat(myf.fileno()).st_mtime + data = myf.read().splitlines() + + # easy attempt first. + if len(data) != portage_db_flat.magic_line_count: + d = dict(map(lambda x: x.split("=",1), data)) + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, d) + # this one's interesting. + d = {} + + for line in data: + # yes, meant to iterate over a string. + hashed = False + for idx, c in enumerate(line): + if not c.isalpha(): + if c == "=" and idx > 0: + hashed = True + d[line[:idx]] = line[idx + 1:] + elif c == "_" or c.isdigit(): + continue + break + elif not c.isupper(): + break + + if not hashed: + # non hashed. + data.append(mtime) + return portage_db_flat.database.get_values(self, key, data=data) + + d["_mtime_"] = mtime + return portage_db_flat_hash.database.get_values(self, key, data=d) [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 1:07 ` Brian Harring @ 2005-08-31 15:10 ` Zac Medico 2005-08-31 20:45 ` Brian Harring 2005-09-01 8:11 ` Zac Medico 1 sibling, 1 reply; 40+ messages in thread From: Zac Medico @ 2005-08-31 15:10 UTC (permalink / raw To: gentoo-portage-dev Brian Harring wrote: > Round 3, fixed all uglyness. > You *will* see uglyness for the changeover from flat_list to flat_hash > if you're setting portdbapi.auxdbmodule to flat_hash, but that's a one > time hit, and is the reason we blow away the cache on portage > upgrades. > > Either way, full patch, just correction of a few instances where it > user visible warnings were popping up, but not required. > ~harring > This patch worked well for me with your suggested settings in /etc/portage/modules: portdbapi.metadbmodule=portage_db_metadata.database portdbapi.auxdbmodule=portage_db_flat_hash.database With "emerge metadata" I was able to convert the existing metadata from the rsync mirrors into flat_hash format. There were no problems emerging ebuilds and I was also able to emerge binpkgs with old metadata. Zac -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 15:10 ` Zac Medico @ 2005-08-31 20:45 ` Brian Harring 0 siblings, 0 replies; 40+ messages in thread From: Brian Harring @ 2005-08-31 20:45 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 988 bytes --] On Wed, Aug 31, 2005 at 08:10:35AM -0700, Zac Medico wrote: > Brian Harring wrote: > >Round 3, fixed all uglyness. > >You *will* see uglyness for the changeover from flat_list to flat_hash > >if you're setting portdbapi.auxdbmodule to flat_hash, but that's a one > >time hit, and is the reason we blow away the cache on portage > >upgrades. > > > >Either way, full patch, just correction of a few instances where it > >user visible warnings were popping up, but not required. > >~harring > > > > This patch worked well for me with your suggested settings in > /etc/portage/modules: > > portdbapi.metadbmodule=portage_db_metadata.database > portdbapi.auxdbmodule=portage_db_flat_hash.database > > With "emerge metadata" I was able to convert the existing metadata from the > rsync mirrors into flat_hash format. There were no problems emerging > ebuilds and I was also able to emerge binpkgs with old metadata. cool, thank you for testing that. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 1:07 ` Brian Harring 2005-08-31 15:10 ` Zac Medico @ 2005-09-01 8:11 ` Zac Medico 1 sibling, 0 replies; 40+ messages in thread From: Zac Medico @ 2005-09-01 8:11 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 628 bytes --] Brian Harring wrote: > Round 3, fixed all uglyness. > You *will* see uglyness for the changeover from flat_list to flat_hash > if you're setting portdbapi.auxdbmodule to flat_hash, but that's a one > time hit, and is the reason we blow away the cache on portage > upgrades. > > Either way, full patch, just correction of a few instances where it > user visible warnings were popping up, but not required. > ~harring > I have created a patch for forward compatibility with arbitrary EAPI strings. The only change is to substitute an integer constant EAPI_UNRECOGNIZED whenever an unrecognized string is encountered. Zac [-- Attachment #2: 2.0.51-eapi-awareness-3-arbitrary-string-forward-compatibility.patch --] [-- Type: text/x-patch, Size: 2687 bytes --] Index: portage/pym/portage.py =================================================================== --- portage.orig/pym/portage.py +++ portage/pym/portage.py @@ -81,7 +81,7 @@ try: MOVE_BINARY, PRELINK_BINARY, WORLD_FILE, MAKE_CONF_FILE, MAKE_DEFAULTS_FILE, \ DEPRECATED_PROFILE_FILE, USER_VIRTUALS_FILE, EBUILD_SH_ENV_FILE, \ INVALID_ENV_FILE, CUSTOM_MIRRORS_FILE, SANDBOX_PIDS_FILE, CONFIG_MEMORY_FILE,\ - INCREMENTALS, STICKIES, EAPI + INCREMENTALS, STICKIES, EAPI, EAPI_UNRECOGNIZED from portage_data import ostype, lchown, userland, secpass, uid, wheelgid, \ portage_uid, portage_gid @@ -4542,7 +4542,10 @@ class bindbapi(fakedbapi): try: mylist[idx] = abs(int(mylist[idx])) except ValueError: - mylist[idx] = 0 + if mylist[idx]=="": + mylist[idx] = 0 + else: + mylist[idx] = EAPI_UNRECOGNIZED return mylist @@ -4827,7 +4830,10 @@ class vardbapi(dbapi): try: results[idx] = abs(int(wants[idx])) except ValueError: - results[idx] = 0 + if wants[idx]=="": + results[idx] = 0 + else: + results[idx] = EAPI_UNRECOGNIZED return results @@ -5313,7 +5319,10 @@ class portdbapi(dbapi): try: eapi = int(metadata["EAPI"]) except (KeyError, ValueError): - eapi = 0 + if metadata.has_key("EAPI") and metadata["EAPI"]!="": + eapi = EAPI_UNRECOGNIZED + else: + eapi = 0 metadata["EAPI"] = eapi if eapi != portage_const.EAPI: # intentionally wipe keys. @@ -5391,7 +5400,10 @@ class portdbapi(dbapi): mylines[x] = mylines[x][:-1] mydata[auxdbkeys[x]] = mylines[x] - eapi = int(mydata["EAPI"]) + try: + eapi = int(mydata["EAPI"]) + except ValueError: + eapi = EAPI_UNRECOGNIZED if eapi > portage_const.EAPI: # if newer version, wipe everything and negate eapi mydata = {} @@ -5417,7 +5429,10 @@ class portdbapi(dbapi): returnme[idx] = abs(int(returnme[idx])) except ValueError: # string - returnme[idx] = 0 + if returnme[idx]=="": + returnme[idx] = 0 + else: + returnme[idx] = EAPI_UNRECOGNIZED return returnme Index: portage/pym/portage_const.py =================================================================== --- portage.orig/pym/portage_const.py +++ portage/pym/portage_const.py @@ -44,6 +44,7 @@ INCREMENTALS=["USE","FEATURES","ACCEPT_K STICKIES=["KEYWORDS_ACCEPT","USE","CFLAGS","CXXFLAGS","MAKEOPTS","EXTRA_ECONF","EXTRA_EINSTALL","EXTRA_EMAKE"] EAPI = 0 +EAPI_UNRECOGNIZED = 65536 # =========================================================================== # END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-29 20:52 ` Zac Medico 2005-08-29 22:45 ` Brian Harring @ 2005-08-30 9:43 ` Paul de Vrieze 2005-08-30 10:38 ` Marius Mauch 1 sibling, 1 reply; 40+ messages in thread From: Paul de Vrieze @ 2005-08-30 9:43 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 841 bytes --] On Monday 29 August 2005 22:52, Zac Medico wrote: > Brian Harring wrote: > > Please test this out; if you want to test the EAPI checking, tag > > EAPI=1 into an ebuild, and try making emerge bail. > > Well, it bails too often. :) > > It seems that an explicit integer conversion is needed for > and < > comparisons with mixed types > (2.0.51-eapi-awareness-emerge-int-conversion.patch). I don't think it is a wise path to interpret EAPI's as integers at all. There should not be guarantees of forward or backward compatibility between versions. Interpreting them as integers seems to imply that. Basically I think that EAPI could be anything wanted, similar to SLOTS. Of course using digits is easy for humans. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 9:43 ` Paul de Vrieze @ 2005-08-30 10:38 ` Marius Mauch 2005-08-30 10:42 ` Brian Harring 2005-08-31 12:30 ` Zac Medico 0 siblings, 2 replies; 40+ messages in thread From: Marius Mauch @ 2005-08-30 10:38 UTC (permalink / raw To: gentoo-portage-dev On 08/30/05 Paul de Vrieze wrote: > On Monday 29 August 2005 22:52, Zac Medico wrote: > > Brian Harring wrote: > > > Please test this out; if you want to test the EAPI checking, tag > > > EAPI=1 into an ebuild, and try making emerge bail. > > > > Well, it bails too often. :) > > > > It seems that an explicit integer conversion is needed for > and < > > comparisons with mixed types > > (2.0.51-eapi-awareness-emerge-int-conversion.patch). > > I don't think it is a wise path to interpret EAPI's as integers at > all. There should not be guarantees of forward or backward > compatibility between versions. Interpreting them as integers seems > to imply that. Basically I think that EAPI could be anything wanted, > similar to SLOTS. Of course using digits is easy for humans. I've to agree with Paul here, portage should hold a list of all EAPI values it understands, not a maximum value. Marius -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 10:38 ` Marius Mauch @ 2005-08-30 10:42 ` Brian Harring 2005-08-30 13:15 ` Marius Mauch 2005-08-31 12:30 ` Zac Medico 1 sibling, 1 reply; 40+ messages in thread From: Brian Harring @ 2005-08-30 10:42 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 1281 bytes --] On Tue, Aug 30, 2005 at 12:38:16PM +0200, Marius Mauch wrote: > On 08/30/05 Paul de Vrieze wrote: > > > On Monday 29 August 2005 22:52, Zac Medico wrote: > > > Brian Harring wrote: > > > > Please test this out; if you want to test the EAPI checking, tag > > > > EAPI=1 into an ebuild, and try making emerge bail. > > > > > > Well, it bails too often. :) > > > > > > It seems that an explicit integer conversion is needed for > and < > > > comparisons with mixed types > > > (2.0.51-eapi-awareness-emerge-int-conversion.patch). > > > > I don't think it is a wise path to interpret EAPI's as integers at > > all. There should not be guarantees of forward or backward > > compatibility between versions. Interpreting them as integers seems > > to imply that. Basically I think that EAPI could be anything wanted, > > similar to SLOTS. Of course using digits is easy for humans. > > I've to agree with Paul here, portage should hold a list of all EAPI > values it understands, not a maximum value. Stable knows of one version- so containment check versus > is moot; negated values are disallowed for eapi anyways. Note that the rewrite will do containment tests instead, but rewrite will also support eapi1 and eapi0 rather then just one. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 10:42 ` Brian Harring @ 2005-08-30 13:15 ` Marius Mauch 2005-08-30 13:28 ` Brian Harring 0 siblings, 1 reply; 40+ messages in thread From: Marius Mauch @ 2005-08-30 13:15 UTC (permalink / raw To: gentoo-portage-dev On 08/30/05 Brian Harring wrote: > On Tue, Aug 30, 2005 at 12:38:16PM +0200, Marius Mauch wrote: > > On 08/30/05 Paul de Vrieze wrote: > > > > > On Monday 29 August 2005 22:52, Zac Medico wrote: > > > > Brian Harring wrote: > > > > > Please test this out; if you want to test the EAPI checking, > > > > > tag EAPI=1 into an ebuild, and try making emerge bail. > > > > > > > > Well, it bails too often. :) > > > > > > > > It seems that an explicit integer conversion is needed for > and > > > > < comparisons with mixed types > > > > (2.0.51-eapi-awareness-emerge-int-conversion.patch). > > > > > > I don't think it is a wise path to interpret EAPI's as integers at > > > all. There should not be guarantees of forward or backward > > > compatibility between versions. Interpreting them as integers > > > seems to imply that. Basically I think that EAPI could be > > > anything wanted, similar to SLOTS. Of course using digits is easy > > > for humans. > > > > I've to agree with Paul here, portage should hold a list of all EAPI > > values it understands, not a maximum value. > Stable knows of one version- so containment check versus > is moot; > negated values are disallowed for eapi anyways. > Note that the rewrite will do containment tests instead, but rewrite > will also support eapi1 and eapi0 rather then just one. Problem is that you then rely on python always evaluating "somestring" > 0 as True which I don't think is a good idea (it holds true even for "0" > 0), if you treat 0 as a string you get problems (as some strings are > "smaller" than 0) and you can't convert all strings to ints. What's the point of using > anyway? Marius -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 13:15 ` Marius Mauch @ 2005-08-30 13:28 ` Brian Harring 2005-08-30 14:47 ` Paul de Vrieze 2005-08-30 15:19 ` Marius Mauch 0 siblings, 2 replies; 40+ messages in thread From: Brian Harring @ 2005-08-30 13:28 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 1418 bytes --] On Tue, Aug 30, 2005 at 03:15:15PM +0200, Marius Mauch wrote: > On 08/30/05 Brian Harring wrote: > Problem is that you then rely on python always evaluating "somestring" > > 0 as True which I don't think is a good idea (it holds true even for "0" > > 0), if you treat 0 as a string you get problems (as some strings are > > "smaller" than 0) and you can't convert all strings to ints. In the initial proposal of EAPI, it was intended as version ebuild format #; think format specifications. Float is probably better, but strings being slipped in I don't see any good reason to allow, nor has it been requrested (it was specifically ixnayed when the idea was hashed out actually). Aside from that, again, stable is capable of a single eapi version; if it's a string, the code catches the value error and knocks it down to eapi0 due to the reasons described above. Further reason why string is a no go indicated in the code; if eapi0 portage tries regening an eapi1 cache entry, it stores negated eapi version with no other metadata. Allowing strings nukes that approach, unless you disallow - as the first character (which would be demonstration of strings not being incredibly well suited for eapi settings imo). > What's the point of using > anyway? Simplicity in the code right now, since stable will *never* support anything but eapi0. It's an easy check. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 13:28 ` Brian Harring @ 2005-08-30 14:47 ` Paul de Vrieze 2005-08-30 23:46 ` Brian Harring 2005-08-30 15:19 ` Marius Mauch 1 sibling, 1 reply; 40+ messages in thread From: Paul de Vrieze @ 2005-08-30 14:47 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 3707 bytes --] On Tuesday 30 August 2005 15:28, Brian Harring wrote: > On Tue, Aug 30, 2005 at 03:15:15PM +0200, Marius Mauch wrote: > > On 08/30/05 Brian Harring wrote: > > Problem is that you then rely on python always evaluating > > "somestring" > 0 as True which I don't think is a good idea (it holds > > true even for "0" > > > > > 0), if you treat 0 as a string you get problems (as some strings > > > are "smaller" than 0) and you can't convert all strings to ints. > > In the initial proposal of EAPI, it was intended as version ebuild > format #; think format specifications. > > Float is probably better, but strings being slipped in I don't see any > good reason to allow, nor has it been requrested (it was > specifically ixnayed when the idea was hashed out actually). What the format of the values of EAPI is is irrelevant. The matter is that there is no way to know that version 5 is in any way compatible with version 4, which in turn is also incompatible with version 3. Seeing versions as numbers would imply an ordering in the versions. Such an ordering would seem to imply compatibility or something the like, while versions could differ significantly. As any portage version should still check which EAPI the ebuild has to be able to support it correctly any range checks would be moot anyway. About the ordering, what if there was some new format that would enable to very easilly write packages for perl modules but sucked at anything else? This would be a different format alltogether, not a different version. If EAPI's were more than just strings, at some point it might even be possible to associate packages with EAPI's so that portage would automatically signal the EAPI was unsupported, find the relevant package and merge the plugin. Restart itself and merge the ebuild that needed the new EAPI. The plugin ebuild could ensure that the portage version is compatible. > Aside from that, again, stable is capable of a single eapi version; if > it's a string, the code catches the value error and knocks it down to > eapi0 due to the reasons described above. Then the code is broken. It should check whether the value is "0" or the empty string "" or unset. If it is the latter it should change it to "0", if it is anything else it should just treat it as an unsupported format and ignore that particular ebuild. (and try to use other versions of the package that are still in the old format). > > Further reason why string is a no go indicated in the code; if eapi0 > portage tries regening an eapi1 cache entry, it stores negated eapi > version with no other metadata. Allowing strings nukes that approach, > unless you disallow - as the first character (which would be > demonstration of strings not being incredibly well suited for eapi > settings imo). As long as it does not generate "-0" this broken behaviour should not break anything as long as portage 2.1 does a forced regen or cache evaluation on installation (when detecting a 2.0 version present) or first run. > > > What's the point of using > anyway? > > Simplicity in the code right now, since stable will *never* support > anything but eapi0. It's an easy check. Is it really harder to check for either "" or unset or "0". That should be very little extra code, and would be correct regardless of future decisions regarding EAPI. EAPI should be left as free as possible, portage just needs to notice that it doesn't recognize the value. If this would be in a not-a-number exception that would be ok too. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 14:47 ` Paul de Vrieze @ 2005-08-30 23:46 ` Brian Harring 2005-08-31 9:55 ` Paul de Vrieze 2005-08-31 10:52 ` Marius Mauch 0 siblings, 2 replies; 40+ messages in thread From: Brian Harring @ 2005-08-30 23:46 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 5387 bytes --] On Tue, Aug 30, 2005 at 04:47:51PM +0200, Paul de Vrieze wrote: > On Tuesday 30 August 2005 15:28, Brian Harring wrote: > > On Tue, Aug 30, 2005 at 03:15:15PM +0200, Marius Mauch wrote: > > > On 08/30/05 Brian Harring wrote: > > > Problem is that you then rely on python always evaluating > > > "somestring" > 0 as True which I don't think is a good idea (it holds > > > true even for "0" > > > > > > > 0), if you treat 0 as a string you get problems (as some strings > > > > are "smaller" than 0) and you can't convert all strings to ints. > > > > In the initial proposal of EAPI, it was intended as version ebuild > > format #; think format specifications. > > > > Float is probably better, but strings being slipped in I don't see any > > good reason to allow, nor has it been requrested (it was > > specifically ixnayed when the idea was hashed out actually). > > What the format of the values of EAPI is is irrelevant. The matter is that > there is no way to know that version 5 is in any way compatible with > version 4, which in turn is also incompatible with version 3. Seeing > versions as numbers would imply an ordering in the versions. Such an > ordering would seem to imply compatibility or something the like, while > versions could differ significantly. There actually is an ordering to the versions though- they're going to map out to later portage releases (eapi3 release's portage version >= eapi4 release's portage version >= eapi5 releases' portage version). Why am I being so damned stubborn about numbers for this? Cause I don't want users having to dink around with knowing that eapi="really cool version" somehow maps out to 3.1. Further, eapi version *likely* will wind up as the slotting for any split out portage-ebuild package, and slots traditionally have always been ints. > About the ordering, what if there was some new format that would enable to > very easilly write packages for perl modules but sucked at anything else? > This would be a different format alltogether, not a different version. > > If EAPI's were more than just strings, at some point it might even be > possible to associate packages with EAPI's so that portage would > automatically signal the EAPI was unsupported, find the relevant package > and merge the plugin. Restart itself and merge the ebuild that needed the > new EAPI. The plugin ebuild could ensure that the portage version is > compatible. The slotting comment above is in regard to it. People will hit annoyances along the way, but slot==EAPI for portage-ebuild ought to allow a sane resolver to dig it's way back. Won't work for stable, due to the fact stable's resolver isn't smart enough, but rewrite's should support the "lets hop from portage version to portage version in upgrading" bit. Aside from that, EAPI is specific to *ebuilds*. New format is a seperate beast that shouldn't be shoe horned into ebuilds imo. > > Aside from that, again, stable is capable of a single eapi version; if > > it's a string, the code catches the value error and knocks it down to > > eapi0 due to the reasons described above. > > Then the code is broken. It should check whether the value is "0" or the > empty string "" or unset. If it is the latter it should change it to "0", > if it is anything else it should just treat it as an unsupported format > and ignore that particular ebuild. (and try to use other versions of the > package that are still in the old format). Yielding on this, since I agree on it. Will update the next round of patches so it's stricter. > > Further reason why string is a no go indicated in the code; if eapi0 > > portage tries regening an eapi1 cache entry, it stores negated eapi > > version with no other metadata. Allowing strings nukes that approach, > > unless you disallow - as the first character (which would be > > demonstration of strings not being incredibly well suited for eapi > > settings imo). > > As long as it does not generate "-0" this broken behaviour should not > break anything as long as portage 2.1 does a forced regen or cache > evaluation on installation (when detecting a 2.0 version present) or > first run. Wouldn't call it broken behaviour; the reasoning behind doing this is that people, regardless of any warning we give them, *will* have caches that are used by multiple portage versions. Bad setups will results in older portage installations updating a central cache; the negating allows for older portage installations and newer to play nice in the cache, not pissing each other off as occurs with stable and >=2.1 (or any cache change for that matter). Granted that's a combination of flat_hash and eapi, but eapi's negation still is a major factor in the compatibility. > Is it really harder to check for either "" or unset or "0". That should be > very little extra code, and would be correct regardless of future > decisions regarding EAPI. > > EAPI should be left as free as possible, portage just needs to notice that > it doesn't recognize the value. If this would be in a not-a-number > exception that would be ok too. Flattening the EAPI version down to 0 is wrong; re: "" existing, it gets corrected by the layers that wrap the cache so it always winds up as a number. [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 23:46 ` Brian Harring @ 2005-08-31 9:55 ` Paul de Vrieze 2005-08-31 12:58 ` Brian Harring 2005-08-31 10:52 ` Marius Mauch 1 sibling, 1 reply; 40+ messages in thread From: Paul de Vrieze @ 2005-08-31 9:55 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 6648 bytes --] On Wednesday 31 August 2005 01:46, Brian Harring wrote: > > What the format of the values of EAPI is is irrelevant. The matter is > > that there is no way to know that version 5 is in any way compatible > > with version 4, which in turn is also incompatible with version 3. > > Seeing versions as numbers would imply an ordering in the versions. > > Such an ordering would seem to imply compatibility or something the > > like, while versions could differ significantly. > > There actually is an ordering to the versions though- they're going to > map out to later portage releases (eapi3 release's portage version >= > eapi4 release's portage version >= eapi5 releases' portage version). Of course there is some kind of ordering. My point is that this ordering should be for users only, but portage should totally disregard this. > Why am I being so damned stubborn about numbers for this? Cause I > don't want users having to dink around with knowing that eapi="really > cool version" somehow maps out to 3.1. Further, eapi version *likely* > will wind up as the slotting for any split out portage-ebuild package, > and slots traditionally have always been ints. I don't mind you using numbers or something like "3.1-strict" meaning that it was introduced with portage 3.1. Just do it in such a way that when in the future it is decided that text can be in EAPI specifiers, portage will not choke on newer ebuilds that do that. > > If EAPI's were more than just strings, at some point it might even be > > possible to associate packages with EAPI's so that portage would > > automatically signal the EAPI was unsupported, find the relevant > > package and merge the plugin. Restart itself and merge the ebuild > > that needed the new EAPI. The plugin ebuild could ensure that the > > portage version is compatible. > > The slotting comment above is in regard to it. People will hit > annoyances along the way, but slot==EAPI for portage-ebuild ought to > allow a sane resolver to dig it's way back. My main focus is not on automatic finding of compatible versions of portage for an EAPI value. It is on ensuring forward compatibility. This is easiest when portage makes very few assumptions on the contents of EAPI. > Won't work for stable, due to the fact stable's resolver isn't smart > enough, but rewrite's should support the "lets hop from portage > version to portage version in upgrading" bit. > > Aside from that, EAPI is specific to *ebuilds*. New format is a > seperate beast that shouldn't be shoe horned into ebuilds imo. EAPI defines which format the ebuild/eclass has. Whether that is a small change or a big change is not that relevant. Currently the formats all have bash-compatible syntax, and I don't argue to remove that. I just want to keep it possible as long as EAPI is recognizable, and bash doesn't bail out on it too early. Hence the reason that I argue that EAPI should be the first item after the whitelines and comments in an ebuild. This allows *fast* and failsafe detection of the required EAPI. Even when what follows is totally incompatible with the default parser. (bash is/contains also a parser) > > > Further reason why string is a no go indicated in the code; if > > > eapi0 portage tries regening an eapi1 cache entry, it stores > > > negated eapi version with no other metadata. Allowing strings > > > nukes that approach, unless you disallow - as the first character > > > (which would be demonstration of strings not being incredibly well > > > suited for eapi settings imo). > > > > As long as it does not generate "-0" this broken behaviour should not > > break anything as long as portage 2.1 does a forced regen or cache > > evaluation on installation (when detecting a 2.0 version present) or > > first run. > > Wouldn't call it broken behaviour; the reasoning behind doing this is > that people, regardless of any warning we give them, *will* have > caches that are used by multiple portage versions. Bad setups will > results in older portage installations updating a central cache; the > negating allows for older portage installations and newer to play nice > in the cache, not pissing each other off as occurs with stable and > > >=2.1 (or any cache change for that matter). > > Granted that's a combination of flat_hash and eapi, but eapi's > negation still is a major factor in the compatibility. This would mean that "-" as the first character in an EAPI string should be disallowed until we can be "certain" that the portage versions in use do not need this feature anymore. > > Is it really harder to check for either "" or unset or "0". That > > should be very little extra code, and would be correct regardless of > > future decisions regarding EAPI. > > > > EAPI should be left as free as possible, portage just needs to notice > > that it doesn't recognize the value. If this would be in a > > not-a-number exception that would be ok too. > > Flattening the EAPI version down to 0 is wrong; re: "" existing, it > gets corrected by the layers that wrap the cache so it always winds up > as a number. Why does the cache do that. It doesn't with IUSE, DEPENDS, and most other variables. It should be easy to have it have the same functioning with EAPI. Btw. if it only maps unset or "" to 0 I have no problem with that, but if it maps "funky-no_number%string" to 0 or any number that would be broken. Paul ps. My point is that one never knows what the future holds. The EAPI feature is one that must be as forward compatible as possible. Designing forward compatibility is hard. As such the contents of EAPI should be as free as possible, and retrieving EAPI should be as easy as possible (by putting it in the start of the file). pps. For being able to state that one eclass/ebuild is compatible with two (overlapping) formats I also argue to make EAPI a space separated list of supported API's. As an example for why this would make sense take for example the depend.apache eclass. This eclass is compatible with both the proposed EAPI1 as the current EAPI0 as it does not use/provide src_compile. Writing separate eclasses with just different EAPI versions is rather pointless, so allowing a list of supported ones makes sense. I do realise that this makes things a bit harder as first the EAPI of an ebuild(including it's eclasses) must be decided, and only then might proper parsing be possible to happen. -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 9:55 ` Paul de Vrieze @ 2005-08-31 12:58 ` Brian Harring 2005-08-31 14:59 ` Paul de Vrieze 0 siblings, 1 reply; 40+ messages in thread From: Brian Harring @ 2005-08-31 12:58 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 2727 bytes --] On Wed, Aug 31, 2005 at 11:55:40AM +0200, Paul de Vrieze wrote: > pps. For being able to state that one eclass/ebuild is compatible with two > (overlapping) formats I also argue to make EAPI a space separated list of > supported API's. As an example for why this would make sense take for > example the depend.apache eclass. This eclass is compatible with both the > proposed EAPI1 as the current EAPI0 as it does not use/provide > src_compile. Writing separate eclasses with just different EAPI versions > is rather pointless, so allowing a list of supported ones makes sense. I > do realise that this makes things a bit harder as first the EAPI of an > ebuild(including it's eclasses) must be decided, and only then might > proper parsing be possible to happen. Preferred solution (imo) for such a case is eapi defined prior to the inherit iff the eclass is capable of multiple eapi levels. It's effectively the same thing, but allows for the ebuild/eclass authors to have total control over it, and doesn't require a second duff eclass. Regarding having the eclass specify compatible eapi versions, and portage somehow tracking ebuild eapi and comparing the two (and bailing if the containment test fails), not much for. Reasoning is thus- new eapi3 is available, ebuild dev bumps (fex) apache so that it uses eapi3; if the eclass limits to <3, the ebuild *cannot* use the eclass. Need a duplicate eclass, or the ebuild gets the eclasses code jammed into it, or (I really don't like this case) eclass gets eapi3 tagged in, despite the fact the eclass may not be eclass compatible without the ebuild doing a little dance (for eapi0/1, defining it's own src_configure and src_compile fex). Or the ebuild is kept at eapi2, till eapi3 is available in the eclass, slightly saner approach, but also effectively adoption of new eapis due to the fact that you cannot localize the build up of eapi3 compatibility crap in the ebuild, then port it into the eclass (then marking the eclass as explicitly eapi3 compatible). Eclass templates I prefer to keep as flexible as possible; granted people can shoot themselves in the foot, but that's always the case (add a safety to the gun, they'll find the safety and maybe gutshot themselves instead while playing with the safety :). Point I'm getting at is that artificial limiters people find a way around, with the workaround being usually a helluva worse then what the limitation is trying to block. Imo, at least. Either way, it's something that once applied, cannot be reversed; would rather leave it loose, then tighten it down the line if people seem chronically apt to screw it up. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 12:58 ` Brian Harring @ 2005-08-31 14:59 ` Paul de Vrieze 0 siblings, 0 replies; 40+ messages in thread From: Paul de Vrieze @ 2005-08-31 14:59 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 5475 bytes --] On Wednesday 31 August 2005 14:58, Brian Harring wrote: > On Wed, Aug 31, 2005 at 11:55:40AM +0200, Paul de Vrieze wrote: > > pps. For being able to state that one eclass/ebuild is compatible > > with two (overlapping) formats I also argue to make EAPI a space > > separated list of supported API's. As an example for why this would > > make sense take for example the depend.apache eclass. This eclass is > > compatible with both the proposed EAPI1 as the current EAPI0 as it > > does not use/provide src_compile. Writing separate eclasses with just > > different EAPI versions is rather pointless, so allowing a list of > > supported ones makes sense. I do realise that this makes things a bit > > harder as first the EAPI of an ebuild(including it's eclasses) must > > be decided, and only then might proper parsing be possible to happen. > > Preferred solution (imo) for such a case is eapi defined prior to the > inherit iff the eclass is capable of multiple eapi levels. > > It's effectively the same thing, but allows for the ebuild/eclass > authors to have total control over it, and doesn't require a second > duff eclass. > > Regarding having the eclass specify compatible eapi versions, and > portage somehow tracking ebuild eapi and comparing the two (and > bailing if the containment test fails), not much for. Reasoning is > thus- new eapi3 is available, ebuild dev bumps (fex) apache so that > it uses eapi3; if the eclass limits to <3, the ebuild *cannot* use the > eclass. Need a duplicate eclass, or the ebuild gets the eclasses code > jammed into it, or (I really don't like this case) eclass gets eapi3 > tagged in, despite the fact the eclass may not be eclass compatible > without the ebuild doing a little dance (for eapi0/1, defining it's > own src_configure and src_compile fex). If the eclass get's ported to eapi3 then all hell breaks loose (probably) as there are many ebuilds (some in the user's overlays and out of our control) that expect it to be eapi2. If the port was the case of just specifying eapi3 by the merit of being compatible to both (the change being outside the region of the eclass) this is unneeded. Further there is a simple scheme for using EAPI as a list: - portage specifies EAPI=0 before loading the ebuild: - ebuild specifies EAPI="eapi1 eapi2 0" - at inherit the current EAPI gets stored and EAPI is set to EAPI=0 - the eclass is sourced. - The eclass specifies EAPI="eapi1 0" - inherit finished the sourcing of the ebuild and compares EAPI_STORED with EAPI and keeps the common elements. Now EAPI="eapi1 0". Other eclasses might now be imported as if 'import a b c d' means 'import a' 'import b' etc.. - After the ebuild is finally sourced completely EAPI has a value. This EAPI value is then masked with the supported EAPI levels. If the masking results in an empty list while the original list had items portage must be updated. If the original list was allready empty the ebuild is invalid. Finally if the masked list results in more than 1 atom, portage uses some internal list to select the best EAPI. This preference system could very well be internal to portage. A feature that could be added would be that inherit would bail out as soon as the EAPI list is empty, and the ebuild can allready be seen as invalid. > Or the ebuild is kept at eapi2, till eapi3 is available in the eclass, > slightly saner approach, but also effectively adoption of new eapis > due to the fact that you cannot localize the build up of eapi3 > compatibility crap in the ebuild, then port it into the eclass (then > marking the eclass as explicitly eapi3 compatible). Many eclasses can be compatible with multiple versions, but some cannot. That's why I argue that eclasses should list all api's that they are compatible with. Suppose for arguments sake that for example api3 was an api that was soon found to be not such usefull, and too far a deviation from api4. Then api4 is introduced that takes most usefull features from api3, but gets a higher compatibility with api2. An eclass could then be compatible with api2 and api4 without any compatibility layer. > > Eclass templates I prefer to keep as flexible as possible; granted > people can shoot themselves in the foot, but that's always the case > (add a safety to the gun, they'll find the safety and maybe gutshot > themselves instead while playing with the safety :). Point I'm > getting at is that artificial limiters people find a way around, with > the workaround being usually a helluva worse then what the limitation > is trying to block. Alternatively one could put all responsibility in ebuild authors. This would however be a disaster waiting to happen as an eclass gets updated to suddenly becomming incompatible with an ebuild in the user's overlay or our own tree. > Imo, at least. > Either way, it's something that once applied, cannot be reversed; > would rather leave it loose, then tighten it down the line if people > seem chronically apt to screw it up. I just think that eclasses should specify what api they work with. If someone finds it does support their api of choice, but doesn't state so, well, that someone can just add the api of choice to the list. Way easier than even the fastest kludge. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 23:46 ` Brian Harring 2005-08-31 9:55 ` Paul de Vrieze @ 2005-08-31 10:52 ` Marius Mauch 2005-08-31 12:57 ` Brian Harring 1 sibling, 1 reply; 40+ messages in thread From: Marius Mauch @ 2005-08-31 10:52 UTC (permalink / raw To: gentoo-portage-dev On 08/30/05 Brian Harring wrote: > Why am I being so damned stubborn about numbers for this? Cause I > don't want users having to dink around with knowing that eapi="really > cool version" somehow maps out to 3.1. Further, eapi version *likely* > will wind up as the slotting for any split out portage-ebuild package, > and slots traditionally have always been ints. Thanks for that last comment, it actually prooves our point ;) Yes, SLOTs are *generally* numeric strings, as they are generally tied to major versions. But as soon as more than the major part of the version is important ints don't work anymore (and never ever mention float again, version numbers aren't floats), and in some cases you find non-version data in SLOT (like $CTARGET). Marius -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 10:52 ` Marius Mauch @ 2005-08-31 12:57 ` Brian Harring 2005-08-31 14:43 ` Zac Medico 2005-08-31 15:41 ` Paul de Vrieze 0 siblings, 2 replies; 40+ messages in thread From: Brian Harring @ 2005-08-31 12:57 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 7884 bytes --] Hokay, this is pretty much my response to the string vs int stuff, slammed into one email. First clarifying the assumption I'm after a max test for eapi testing; not the case- stated so already in this thread. Restating it again, for stable, a check of if it's > 0 (with int conversion failures being knocked up to 1 fex) is effectively the same thing as if str(portage_const.EAPI) in ("", "0"). Stated also that for rewrite, this approach won't work, and you're stuck specifying either a range of supported EAPI (max *and* min), or specifying every single individual eapi identifier, which I'll clarify before is going to burn any maintainer of such code. On Wed, Aug 31, 2005 at 12:52:53PM +0200, Marius Mauch wrote: > On 08/30/05 Brian Harring wrote: > > > Why am I being so damned stubborn about numbers for this? Cause I > > don't want users having to dink around with knowing that eapi="really > > cool version" somehow maps out to 3.1. Further, eapi version *likely* > > will wind up as the slotting for any split out portage-ebuild package, > > and slots traditionally have always been ints. > > Thanks for that last comment, it actually prooves our point ;) > Yes, SLOTs are *generally* numeric strings, as they are generally tied > to major versions. But as soon as more than the major part of the > version is important ints don't work anymore (and never ever mention > float again, version numbers aren't floats), and in some cases you find > non-version data in SLOT (like $CTARGET). Summation of string based failings. First off, a modifier of an EAPI, say EAPI=3-strict isn't valid; why? strict is most likely a restriction, a specific negation of some aspect of eapi3. Restrict is the place for it, or a similar metadata key. Yes this doesn't hold across all cases (someone could've just decided 3-strict was a cool name fex), but throwing it out there to point out that eapi is ebuild templates, not restrictions. Further, any deviation where loss of backwards compatibility would occur (limiting or extending bash syntax) is implicitly another format, thus beyond eapi's keen. EAPI is ebuild (the format) spec/api *only*, see comments below re: format support for further explanation. Re: tagging EAPI at the top of a file, infra would probably shoot me for doing such- till a live, fully compatible and *roughly* equivalent parser is available, portage would have to do a bit of grepping, jacking up the regen times. One thing I'm going to clarify also, is that the rewrite *does not* make it hard to tag new formats in. There's no reason to jam everything into ebuilds, especially considering we are bound by existing definitions, and a body of 20,000 live ebuilds users/devs would get rather pissed off about if we forced a change across it. If it's not an adjustment, a tweak, an extension/subtraction of ebuild functionality, eapi isn't applicable imo, and a seperate format is the route to go (one that could easily live alongside in the tree). EAPI is just for ebuild format. alt formats (whether sh based or otherwise) would be wise to version their version also. Either way, getting to the point of why strings suck badly in the point where it matters- as format version identifiers for the code that does the actual work. Example code for numeric, say we have eapi 0-5 at this point. def configure(self): if self.pkg.eapi > 0: ...call configure phase... return example code for strings def configure(self): if self.pkg.eapi in ("0", "1", "2", "3", "4", "5"): ...call configure phase... return This sucks. the response is "well, stick it into a list somewhere". Can do, but you have to mangle each list everytime you add a new eapi. That's a good way to lead to dumb ass bugs when tinkering with a new eapi level. or... capabilities, as suggested. capabilities = {"0":["configure"], "1":["configure"], "2":["configure"], "3":["configure"], "4":["configure"], "5":["configure"],} def has_capability(eapi, capability): try: return capability in capabilities[eapi]: except KeyError: return False def configure(self): if has_capability(self.pkg.eapi, "configure"): ...call configure phase... return or (slightly nastier example) # eapi5 being eapi4, just with bash side changes. implicit is that # their is bash side changes between each eapi, just stating it # explicitly to avoid the 'wtf' capabilities = {"0":["configure"], "1":["configure", "test_src_uri"], "2":["configure", "test_src_uri"], "3":["configure", "test_src_uri", "full_depriving"], "4":["configure", "test_src_uri", "full_depriving", "user_management"], "5":["configure", "test_src_uri", "full_depriving", "user_management"],} def configure(self): if "configure" in capabilities.get(eapi, []): ...call configure phase... return Suggestions regarding using enumerations still dodge that point that via strings, you're building a finite set of matching strings to execute a block of code under, rather then establishing a min/max during which an int eapi should execute a block of code. Latter's a helluva lot simpler then the former. The arguement here is that it's somehow cleaner; it's not really. You still have magic strings ("configure"), and a massive table of capabilities. I used a single capability; if you're doing "has_capability" for every logic check, you're going to get into some very ugly terrain of magic const's all over the place. Further, if attempting to map out what has changed between each eapi version, it's the wrong place to do so; that's implementation right there, specifically python side knowledge of how to support that version. Proper design would actually use a magic constant at the top of the file, CONFIGURE_REQUIRED = 1 or something of the sort. If I want to work on the next extension of eapi, I create an ebuild that has the new incremented #, and I can *already* have that eapi up and running, usurping the previous eapi definition. No forced manual redefinition of stuff that is an easy way to induce bugs (increased manual work == bugs). I can start extending the previous definition, tweaking it to I want without having to gut half of the controlling code. Yes, I'm talking about it from the code perspective, but remember that this is the area that ultimately *matters*; control of the ebuild env is via the python side of things. Keeping that as bug free, and clean as possible is what matters from where I sit; we can extend the ebuild env/template without issue, but swiveling from template to template is totally controlled by python side portage, which means that bit of code best be clean and robust. That said, if you dig through my earlier patch, and comments about needing to handle int conversion better rather then flattening it to 0, the code *is* forwards compatible if someone decides to stick strings into EAPI. In other words, it's a moot debate due to the fact that the internal representation of eapi (is it a string, or is it an int?) is specific to that portage version; whatever version supports an eapi with strings tagged into has the fun of addressing the issues I've brought up above. So basically the debate over string vs int can be left to when someone tries to add a non int eapi; forewarning: I'll bring up these points again when it's raised. It's a Bad Idea (tm), and there is a damn good reason you don't see it elsewhere when dealing with versions of something :) Final comment on this; there's a reason pkgs are release with major/minor as numeric; detection of capabilities, handling capabilities is *much* cleaner via such an approach. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 12:57 ` Brian Harring @ 2005-08-31 14:43 ` Zac Medico 2005-08-31 15:41 ` Paul de Vrieze 1 sibling, 0 replies; 40+ messages in thread From: Zac Medico @ 2005-08-31 14:43 UTC (permalink / raw To: gentoo-portage-dev Marius Mauch wrote: > On 08/30/05 Paul de Vrieze wrote: > >> I don't think it is a wise path to interpret EAPI's as integers at >> all. There should not be guarantees of forward or backward >> compatibility between versions. Interpreting them as integers seems >> to imply that. Basically I think that EAPI could be anything wanted, >> similar to SLOTS. Of course using digits is easy for humans. > > > > I've to agree with Paul here, portage should hold a list of all EAPI > values it understands, not a maximum value. > I also agree. It seems like a list of string identifiers will give us a high level of forward flexibility. For the implementation we can have a chain of EAPI handlers that are capable of determining whether or not they support a given EAPI. The first handler in the chain to accept the package will be allowed to handle it. Internally, these handlers may be able to share libraries and/or inherit from eachother. Brian Harring wrote: > > Either way, getting to the point of why strings suck badly in the > point where it matters- as format version identifiers for the code > that does the actual work. > > Example code for numeric, say we have eapi 0-5 at this point. > > def configure(self): > if self.pkg.eapi > 0: > ...call configure phase... > return > > > example code for strings > > def configure(self): > if self.pkg.eapi in ("0", "1", "2", "3", "4", "5"): > ...call configure phase... > return > > This sucks. > Yes, the above seems bad. That is why I have suggested that a chain of handlers be used. Select the first handler in the chain that recognizes the ebuild's eapi. The selected handler would not need the above conditionals because it would be designed specifically for the eapi that it handles. [snip] > > capabilities = {"0":["configure"], > "1":["configure", "test_src_uri"], > "2":["configure", "test_src_uri"], > "3":["configure", "test_src_uri", "full_depriving"], > "4":["configure", "test_src_uri", "full_depriving", "user_management"], > "5":["configure", "test_src_uri", "full_depriving", "user_management"],} > > def configure(self): > if "configure" in capabilities.get(eapi, []): > ...call configure phase... > return > Where appropriate, handlers could inherit from eachother or use shared libraries in order to provide the above capabilities. [snip] > > That said, if you dig through my earlier patch, and comments about > needing to handle int conversion better rather then flattening it to > 0, the code *is* forwards compatible if someone decides to stick strings > into EAPI. In other words, it's a moot debate due to the fact that > the internal representation of eapi (is it a string, or is it an int?) > is specific to that portage version; whatever version supports an eapi > with strings tagged into has the fun of addressing the issues I've > brought up above. > Okay, if it works and it's forward compatible with string lists, then I'm happy with it. :) Zac -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 12:57 ` Brian Harring 2005-08-31 14:43 ` Zac Medico @ 2005-08-31 15:41 ` Paul de Vrieze 2005-09-02 5:27 ` Zac Medico 1 sibling, 1 reply; 40+ messages in thread From: Paul de Vrieze @ 2005-08-31 15:41 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 9150 bytes --] On Wednesday 31 August 2005 14:57, Brian Harring wrote: > > First off, a modifier of an EAPI, say EAPI=3-strict isn't valid; why? > strict is most likely a restriction, a specific negation of some > aspect of eapi3. No 3-strict would be a variant of version 3 in the way that html-4.0-strict and html-4.0-transitional are related. They are very similar versions, but for a computer just different as computers don't handle and shouldn't handle "a little bit different". As such a portage implementation would either support the api called "3-strict" or it wouldn't. This would be independent of it's support of some other api that was called "3". The same numbers would be for user aid only. > Restrict is the place for it, or a similar metadata key. Yes this > doesn't hold across all cases (someone could've just decided 3-strict > was a cool name fex), but throwing it out there to point out that eapi > is ebuild templates, not restrictions. EAPI is not templates. It is API. It specifies what format the ebuild/eclass has. Currently the planned versions are only implemented by small differences, but to portage the different api's should be completely separate. It just happens that a lot of code can and will be shared between the api implementations. > Further, any deviation where loss of backwards compatibility would > occur (limiting or extending bash syntax) is implicitly another > format, thus beyond eapi's keen. EAPI is ebuild (the format) spec/api > *only*, see comments below re: format support for further explanation. Why should this be beyond EAPI. As long as any portage in run can read the ebuild well enough to extract the EAPI value and decide that it doesn't recognize it, things should be transparent. Or do you propose that for future/experimental ebuild formats we introduce yet another variable "EFORMAT" to specify what format the ebuild has. For me it's kind of double to do that. > Re: tagging EAPI at the top of a file, infra would probably shoot me > for doing such- till a live, fully compatible and *roughly* equivalent > parser is available, portage would have to do a bit of grepping, > jacking up the regen times. If in cache EAPI can be gotten from the cache. If not, I don't think it matters where in the file EAPI occurs from the standpoint of getting it's value. The only thing would be that in the future a fast EAPI parser could be made that would just look at EAPI and get its version. I could easilly write you such a parser. > One thing I'm going to clarify also, is that the rewrite *does not* > make it hard to tag new formats in. There's no reason to jam > everything into ebuilds, especially considering we are bound by > existing definitions, and a body of 20,000 live ebuilds users/devs > would get rather pissed off about if we forced a change across it. What I want is a way to be able to in the future change the ebuild format to aleviate some of it's deficiencies. And this in such a way that all current ebuilds can still be used, and that is compatible with any reasonable portage version. (So format variations should wait for some time for older portages to get out of view). > If it's not an adjustment, a tweak, an extension/subtraction of ebuild > functionality, eapi isn't applicable imo, and a seperate format is the > route to go (one that could easily live alongside in the tree). You mean a different file extension. That could be possible, but for a proper forward compatible format this is not necessary. We now have the possibility to make the current ebuild format forward compatible. Why not do this immediately. The nice thing is that this forward compatibility is even compatible with current (and old) portage versions as long as no too big changes are made before the non-eapi-aware portage versions are phased out. > EAPI is just for ebuild format. alt formats (whether sh based or > otherwise) would be wise to version their version also. Why not combine them. I really don't see why we should have dual version systems. > Either way, getting to the point of why strings suck badly in the > point where it matters- as format version identifiers for the code > that does the actual work. > > Example code for numeric, say we have eapi 0-5 at this point. > > def configure(self): > if self.pkg.eapi > 0: > ...call configure phase... > return > > > example code for strings This is broken as portage should not allow formats it doesn't know about. > > def configure(self): > if self.pkg.eapi in ("0", "1", "2", "3", "4", "5"): > ...call configure phase... > return > > This sucks. What about this pseudocode: API=self.pkg.eapi if not isnumber(API): error "unsupported api or malformatted api" else if asnumber(API) >= 0 and asnumber(API) <= 5: ...call configure phase... return And as you should remember from programming 101 you should check for faulty inputs anyway. > > the response is "well, stick it into a list somewhere". Can do, but > you have to mangle each list everytime you add a new eapi. That's a > good way to lead to dumb ass bugs when tinkering with a new eapi > level. Support for the api should be added anyway. Along with the code to handle this new api it shouldn't be hard to have this code register itself in the list with handled api's. > Suggestions regarding using enumerations still dodge that point that > via strings, you're building a finite set of matching strings to > execute a block of code under, rather then establishing a min/max > during which an int eapi should execute a block of code. Latter's a > helluva lot simpler then the former. there will anyway only be a finite fixed set of api's that any portage version should handle. If it does know about 4 and 5 but not about 4.5 it shouldn't handle 4.5. > The arguement here is that it's somehow cleaner; it's not really. You > still have magic strings ("configure"), and a massive table of > capabilities. I used a single capability; if you're doing > "has_capability" for every logic check, you're going to get into some > very ugly terrain of magic const's all over the place. The idea is that there is a class for every api version. Some classes share lot's of code with other classes and are siblings. Some are hardly alike. There then only needs to be one check and that calls the approprate class. > If I want to work on the next extension of eapi, I create an ebuild > that has the new incremented #, and I can *already* have that eapi up > and running, usurping the previous eapi definition. No forced > manual redefinition of stuff that is an easy way to induce bugs > (increased manual work == bugs). I can start extending the previous > definition, tweaking it to I want without having to gut half of the > controlling code. You mean subclassing the new eapi in the portage code, and registering it under the new name. That's just about or maybe even more easy than anything else. > Yes, I'm talking about it from the code perspective, but remember that > this is the area that ultimately *matters*; control of the ebuild env > is via the python side of things. Keeping that as bug free, and clean > as possible is what matters from where I sit; we can extend the ebuild > env/template without issue, but swiveling from template to template is > totally controlled by python side portage, which means that bit of > code best be clean and robust. From my perspective the sh part of portage is even messier than the python part. From my perspective doing things at the python side is a lot better. > That said, if you dig through my earlier patch, and comments about > needing to handle int conversion better rather then flattening it to > 0, the code *is* forwards compatible if someone decides to stick > strings into EAPI. In other words, it's a moot debate due to the fact > that the internal representation of eapi (is it a string, or is it an > int?) is specific to that portage version; whatever version supports an > eapi with strings tagged into has the fun of addressing the issues I've > brought up above. If that is the case I don't care. I don't believe that strings are an issue, but I'm happy as long as when I stick EAPI="pauls_test_format" into my ebuild your portage bails out. > So basically the debate over string vs int can be left to when someone > tries to add a non int eapi; forewarning: I'll bring up these points > again when it's raised. It's a Bad Idea (tm), and there is a damn > good reason you don't see it elsewhere when dealing with versions of > something :) I still argue that treating api versions as numbers is the bad idea (tm), and using ranges to check them even worse. Each version should be treated differently anyway so at that point the check needs to be done anyway. More than one check is ugly code. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-31 15:41 ` Paul de Vrieze @ 2005-09-02 5:27 ` Zac Medico 2005-09-02 6:04 ` Brian Harring 2005-09-02 8:42 ` Paul de Vrieze 0 siblings, 2 replies; 40+ messages in thread From: Zac Medico @ 2005-09-02 5:27 UTC (permalink / raw To: gentoo-portage-dev Paul de Vrieze wrote: > On Wednesday 31 August 2005 14:57, Brian Harring wrote: > >> Re: tagging EAPI at the top of a file, infra would probably shoot me for doing such- till a live, fully compatible and *roughly* equivalent parser is available, portage would have to do a bit of grepping, jacking up the regen times. > > > If in cache EAPI can be gotten from the cache. If not, I don't think it matters where in the file EAPI occurs from the standpoint of getting it's value. The only thing would be that in the future a fast EAPI parser could be made that would just look at EAPI and get its version. I could easilly write you such a parser. It is impossible write a parser for an unconstrained and unknown format that may exist in the future. If we put a constraint on the format, in order to parse the EAPI, then we contradict our original goal (to unconstrain the format). A better approach IMO would be to store the EAPI in a separate file such as metadata.xml. This would allow *absolute* flexibility in the "ebuild" format. Portage would be able to select an appropriate parser with no need to examine the "ebuild" itself. Zac -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 5:27 ` Zac Medico @ 2005-09-02 6:04 ` Brian Harring 2005-09-02 6:36 ` Zac Medico 2005-09-02 8:53 ` Paul de Vrieze 2005-09-02 8:42 ` Paul de Vrieze 1 sibling, 2 replies; 40+ messages in thread From: Brian Harring @ 2005-09-02 6:04 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 2376 bytes --] On Thu, Sep 01, 2005 at 10:27:44PM -0700, Zac Medico wrote: > Paul de Vrieze wrote: > >On Wednesday 31 August 2005 14:57, Brian Harring wrote: > > > >>Re: tagging EAPI at the top of a file, infra would probably shoot me for > >>doing such- till a live, fully compatible and *roughly* equivalent parser > >>is available, portage would have to do a bit of grepping, jacking up the > >>regen times. > > > > > >If in cache EAPI can be gotten from the cache. If not, I don't think it > >matters where in the file EAPI occurs from the standpoint of getting it's > >value. The only thing would be that in the future a fast EAPI parser could > >be made that would just look at EAPI and get its version. I could easilly > >write you such a parser. > > It is impossible write a parser for an unconstrained and unknown format > that may exist in the future. If we put a constraint on the format, in > order to parse the EAPI, then we contradict our original goal (to > unconstrain the format). > > A better approach IMO would be to store the EAPI in a separate file such as > metadata.xml. This would allow *absolute* flexibility in the "ebuild" > format. Portage would be able to select an appropriate parser with no need > to examine the "ebuild" itself. Disallows eclasses from ever setting eapi. Like I've said, EAPI is ebuild specific. Ebuild is a format; eapi defines revisions of it, in my mind a minor revision of the ebuild 1 format. Any form of loss of backwards compatability *should* be a different format, .ebuild2 for all I care. Trying to use EAPI to allow for N different formats into one format is wrong from where I sit; you would need a container format for it, which ebuild wasn't designed for (nor is it easily extensible to be made so I posit). EAPI's original specification was for handling addition of new funcs, different hooks in the ebuild; I prefer it remain as this. The core rewrite is format agnostic, if a new format is defined (whether a massively managled version of ebuild or flat out new), it's a seperate format and should be handled via the core, not via ebuild specific package handling. There's no reason a repository can't hold multiple formats internally; the capability is there, use that rather then trying to jam too much into EAPI, imo at least. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 6:04 ` Brian Harring @ 2005-09-02 6:36 ` Zac Medico 2005-09-02 8:53 ` Paul de Vrieze 1 sibling, 0 replies; 40+ messages in thread From: Zac Medico @ 2005-09-02 6:36 UTC (permalink / raw To: gentoo-portage-dev Brian Harring wrote: > On Thu, Sep 01, 2005 at 10:27:44PM -0700, Zac Medico wrote: >> >>A better approach IMO would be to store the EAPI in a separate file such as >>metadata.xml. This would allow *absolute* flexibility in the "ebuild" >>format. Portage would be able to select an appropriate parser with no need >>to examine the "ebuild" itself. > > Disallows eclasses from ever setting eapi. > In order to adapt my above suggestion, to allow for eclasses to define the eapi, we would specify a parser identifier inside metadata.xml rather than an eapi identifier. Indeed, the parser identifier (or file extension) would be a separate thing from eapi. Zac -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 6:04 ` Brian Harring 2005-09-02 6:36 ` Zac Medico @ 2005-09-02 8:53 ` Paul de Vrieze 2005-09-02 12:27 ` Brian Harring 1 sibling, 1 reply; 40+ messages in thread From: Paul de Vrieze @ 2005-09-02 8:53 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 2605 bytes --] On Friday 02 September 2005 08:04, Brian Harring wrote: > > Like I've said, EAPI is ebuild specific. Ebuild is a format; eapi > defines revisions of it, in my mind a minor revision of the ebuild 1 > format. Any form of loss of backwards compatability *should* be a > different format, .ebuild2 for all I care. The new proposed format loses backwards compatibility. If there is backwards compatibility no new format or api version is needed. EAPI should work on the python level, not only on the ebuild.sh level. > Trying to use EAPI to allow for N different formats into one format is > wrong from where I sit; you would need a container format for it, > which ebuild wasn't designed for (nor is it easily extensible to be > made so I posit). No it would state that the eclass is 100% compatible with both by the formats overlapping and the ebuild not threading outside the overlapped area. Take for an example many simple kde applications. Those use the kde eclass to do all the work and only contain a skeleton of variables themselves. These ebuilds are compatible with both the current as the proposed new API. When marked so, they could be used as EAPI=1 as soon as the kde eclass is ported to EAPI=1. Similarly many eclasses do not provide src_compile, and as such are compatible with both EAPI versions. > EAPI's original specification was for handling addition of new funcs, > different hooks in the ebuild; I prefer it remain as this. The core > rewrite is format agnostic, if a new format is defined (whether a > massively managled version of ebuild or flat out new), it's a seperate > format and should be handled via the core, not via ebuild specific > package handling. EAPI now is going to be used for the above. It can however with very little effort be made such that future ebuild format revisions are possible. Also don't be mistaken that splitting out configure and make stages do need support from the python part. > > There's no reason a repository can't hold multiple formats internally; > the capability is there, use that rather then trying to jam too much > into EAPI, imo at least. How would you suggest to do this then. The ebuilds/eclasses are completely the same except for their EAPI definition. They also have the same (file)name. And that is not counting the fact that two files containing the same is bad design as there will allways be an issue of one file being updated and the other not. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 8:53 ` Paul de Vrieze @ 2005-09-02 12:27 ` Brian Harring 0 siblings, 0 replies; 40+ messages in thread From: Brian Harring @ 2005-09-02 12:27 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 10965 bytes --] On Fri, Sep 02, 2005 at 10:53:05AM +0200, Paul de Vrieze wrote: > On Friday 02 September 2005 08:04, Brian Harring wrote: > > > > Like I've said, EAPI is ebuild specific. Ebuild is a format; eapi > > defines revisions of it, in my mind a minor revision of the ebuild 1 > > format. Any form of loss of backwards compatability *should* be a > > different format, .ebuild2 for all I care. > > The new proposed format loses backwards compatibility. If there is > backwards compatibility no new format or api version is needed. EAPI > should work on the python level, not only on the ebuild.sh level. The two are utterly intertwined. Doesn't matter if portage thinks it's eapi 1 or 2, what matters is if the ebuild*sh env *creates* an eapi 1 or 2 env for execution. Python side just behaves a bit differently, ebuild*sh is where all of the actual execution occurs (and varies dependant on eapi). > > Trying to use EAPI to allow for N different formats into one format is > > wrong from where I sit; you would need a container format for it, > > which ebuild wasn't designed for (nor is it easily extensible to be > > made so I posit). > > No it would state that the eclass is 100% compatible with both by the > formats overlapping and the ebuild not threading outside the overlapped > area. And how is this going to work when it's more then just a split of a func? I'm not saying it can't be done, I'm saying it *shouldn't* be done. It's begging for screwups; relying on portage to pick and choose between eapi levels for an ebuild's execution env dependant on an eclass *requires* the ebuild to be fully compatible to those eapis, same for the eclass author. That's not so easy to do, and will lead to a buttload of case tests of EAPI, which isn't going to improve the code (imo). People aren't going to do it, is my opinion. It's unnecessarily complex with minimal gain; the gain being decreased due to the inherent complexity of A) pulling this off in portage B) comprehending *exactly* what portage will do in each case C) the ebuild/eclass author not only managing to get usage of *one* eapi correct, getting potentially N eapi's correct. D) eclasses that inherit eclasses requiring the same eapi compatability checks E) within two bodies of code, devs keeping seperated in their mind the differences between each eapi, and *never* blurring them. Note I'm not pulling the "everyone else is ignorant" crap that popped up on -dev ml; I'm stating that writing to an api is manual work, and people will screw up on it, just the same as in writing the implementation of that api, *we* will screw up on it. Bugs per line, it's unavoidable. Not advocating that we dumb everything down, advocating we don't add something that (assuming we get it right in implementation) is one hell of a pandora's box from the standpoint of complex ebuilds combined with complex eclasses. That's also not even getting into the fact that what you're proposing, effectively greping EAPI from the file is A) helluva lot slower on regen B) trying to turn ebuilds into a container format. They're not a container format, nor should they be (kitchen sink shouldn't be included). C) core's more then capable of supporting seperated formats; the 'container' should be the repository, not jammed within the package data. D) It's a helluva lot easier, and less chance for screwup to just define a new format, use a new extension, and have the repository implementation use a different pkg format for that file. E) New, non eapi=1 style change with a different extension wouldn't even be *seen* by the noncompliant repositories. Helluva lot simpler. Not advocating we define a new format every day; I'm advocating that we define a format (v1), we do tweaks to it, and define a new *seperate* format when we need stuff that is beyond the keen of the existing format. Shifting away from declarative syntax, moving away from bash syntax, etc. If it isn't akin to our existing definition of an ebuild, it's not an ebuild and should *not* be jammed into the ebuild format. It's a new beast, and should be seperated. That's also ignoring the additional interaction of elibs thrown into the mix. If what you're suggesting is implemented, eclasses *and* ebuilds would be litered with if [ "$EAPI" == 2 ]; then eapi2 specific stuff elif [ "$EAPI" == 1]; then eapi1 specific stuff else general, all eapi stuff fi Note that the code above also has a nice hidden bug in it that's not obvious till you think about it; there is no way to predict at the time of the ebuilds writing that EAPI3 will work for the else block, yet logic structures of that sort *will* exist if you open up the N EAPI compatibility for an ebuild/eclass. Any bumping of the potential eapi's for an ebuild/eclass will expose it. That and I'd hope if it were ever implemented, devs would be using functions within the logic block; even with, any non-trivial bit of code is going to get nasty as it's littered with a hundred and one checks of eapi tweaking the flow ever so slightly. It's needlessly complex, and a recipe for disaster. > Take for an example many simple kde applications. Those use the kde > eclass to do all the work and only contain a skeleton of variables > themselves. These ebuilds are compatible with both the current as the > proposed new API. When marked so, they could be used as EAPI=1 as soon as > the kde eclass is ported to EAPI=1. Similarly many eclasses do not > provide src_compile, and as such are compatible with both EAPI versions. Lacking src_compile, they're compatible. They're also quite likely an elib, which is a different beast designed to address the fact that library code of eclasses (true library), should exist outside of the eclass. Eclasses are purely templates for ebuilds, a derived template/class from the base template, that an ebuild uses to avoid defining common chunks of code. Common code blocks, say what eutils/toolchain does are elibs (yes I know about the patch dep on eutils, ignore it for the sake of arguement). > > EAPI's original specification was for handling addition of new funcs, > > different hooks in the ebuild; I prefer it remain as this. The core > > rewrite is format agnostic, if a new format is defined (whether a > > massively managled version of ebuild or flat out new), it's a seperate > > format and should be handled via the core, not via ebuild specific > > package handling. > > EAPI now is going to be used for the above. It can however with very > little effort be made such that future ebuild format revisions are > possible. Also don't be mistaken that splitting out configure and make > stages do need support from the python part. Well aware of the complexities involved in keeping the python and bash side in sync; it's part of the reason I oppose what you're proposing. Change in terminology here btw; eapi (imo) has never been defined as a format revision, it's a change in the portage exported bash api, and how it potentially calls into the ebuild.sh api (addition of src_configure). People split off a new format (seperate extension fex) when they no longer can make changes to the api, where grand changes are required. EAPI isn't designed to address that; it's designed to address ebuilds/eclasses requiring new ebuild*sh functionality, addition of a new do* or change to # of phases called. eapi0 -> eapi1 is probably going to be the nastiest change over from where I sit; it's the transition from a totally unversioned ebuild*sh env to one that has saner handling. Total change over of ebuild format, as you're hinting at is not eapi's intention; that's covered by the core being format agnostic, and repository abstractions. > > There's no reason a repository can't hold multiple formats internally; > > the capability is there, use that rather then trying to jam too much > > into EAPI, imo at least. > > How would you suggest to do this then. The ebuilds/eclasses are completely > the same except for their EAPI definition. They also have the same > (file)name. And that is not counting the fact that two files containing > the same is bad design as there will allways be an issue of one file > being updated and the other not. I'm saying we stick with what already occurs in the tree; eclass functionality is either prototyped outside of the tree, and introduced, or an ebuild has the eclass functionality prototyped within it, and that code migrated to the eclass. For example- I've got kde eclass that's eapi0, and want to migrate to eapi1. I break the kde eclass up so it's eapi1 compatible (at the func level), but with the exported src_compile eapi0 so I don't break the existance ebuilds. I then add a shim eclass that *is* eapi1 (calling the chunked kde internals), and migrate pkgs gradually over to it. Once it's fully in use, convert the underlying kde eclass to eapi1 (move the shim code in), leave the shim as indirection, and remove the shim from the testing ebuilds. Or. I want to migrate my kde eclass to eapi1. Like any eclass change, I find what would be affected. I break the kde eclass into eapi1 compatible chunks (seperated configure and compile), with a eapi0 src_compile that calls both. I then go and clean up the ebuilds that override src_compile, and convert them over to the new funcs in the eclass (bumping the ebuild's eapi in the process). Once they're addressed, all that remains is the ebuilds that use the eclasses exported src_compile; remove the eapi0 src_compile shim in the eclass, and set EAPI=1 within the eclass. All ebuilds that rely on the eclass to define eapi and the majority of their code (those that didn't required modification), are now eapi1, as is the eclass. Heading off the "make the eclass eapi 0 and 1 compliant with portage choosing between them", what I'm stating is that the eclass and ebuilds authors do it, they be explicit and manage the conversion themselves (if they see the need to bump to eapiN). They can manage the code and keep it sane, rather then trying to ifdef N different eapis and hoping portage doesn't screw up (it will screw up invariably, as will they in both my solution and yours). Mine just is simpler, from where I sit, less chance of screwups beyond usual bonehead mistakes people always make. Either solution expects ebuild/eclass devs to get it right; having portage somehow swivel the eclass so that it's exported api/env is of a certain eapi expects the devs to have that code working properly, and for a *perfect* implementation that can do this without screwup. It's not realistic, frankly. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 5:27 ` Zac Medico 2005-09-02 6:04 ` Brian Harring @ 2005-09-02 8:42 ` Paul de Vrieze 1 sibling, 0 replies; 40+ messages in thread From: Paul de Vrieze @ 2005-09-02 8:42 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 2274 bytes --] On Friday 02 September 2005 07:27, Zac Medico wrote: > Paul de Vrieze wrote: > > On Wednesday 31 August 2005 14:57, Brian Harring wrote: > >> Re: tagging EAPI at the top of a file, infra would probably shoot me > >> for doing such- till a live, fully compatible and *roughly* > >> equivalent parser is available, portage would have to do a bit of > >> grepping, jacking up the regen times. > > > > If in cache EAPI can be gotten from the cache. If not, I don't think > > it matters where in the file EAPI occurs from the standpoint of > > getting it's value. The only thing would be that in the future a fast > > EAPI parser could be made that would just look at EAPI and get its > > version. I could easilly write you such a parser. > > It is impossible write a parser for an unconstrained and unknown format > that may exist in the future. If we put a constraint on the format, in > order to parse the EAPI, then we contradict our original goal (to > unconstrain the format). It would be possible to make these restrictions small. A workable restriction could be to put the EAPI statement in the front of the file only preceded by whitespace and comments. After the line with the EAPI statement anything could happen. Even a completely binary format could be used. But indeed no constraints is impossible, so putting the format statement in the start of the file is the best solution. Besides the fact that it makes detecting the format that much faster, and allows bailing out before parsing the whole file if an unsupported api is detected. > A better approach IMO would be to store the EAPI in a separate file > such as metadata.xml. This would allow *absolute* flexibility in the > "ebuild" format. Portage would be able to select an appropriate parser > with no need to examine the "ebuild" itself. Please don't. Parsing xml is a lot harder than recognizing lines. A simple EAPI parser would probably use canned (library) line reading functions and then look if the line starts with "EAPI=". If so it reads the EAPI, else it checks the next line. No need to understand anything else of the file format. Paul -- Paul de Vrieze Gentoo Developer Mail: pauldv@gentoo.org Homepage: http://www.devrieze.net [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 13:28 ` Brian Harring 2005-08-30 14:47 ` Paul de Vrieze @ 2005-08-30 15:19 ` Marius Mauch 1 sibling, 0 replies; 40+ messages in thread From: Marius Mauch @ 2005-08-30 15:19 UTC (permalink / raw To: gentoo-portage-dev On 08/30/05 Brian Harring wrote: > > What's the point of using > anyway? > Simplicity in the code right now, since stable will *never* support > anything but eapi0. It's an easy check. You really want to tell me that you consider if myeapi > 0: as simpler than EAPI_COMPATIBLE="0" if myeapi in ['']+EAPI_COMPATIBLE.split(): ? Marius -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 10:38 ` Marius Mauch 2005-08-30 10:42 ` Brian Harring @ 2005-08-31 12:30 ` Zac Medico 1 sibling, 0 replies; 40+ messages in thread From: Zac Medico @ 2005-08-31 12:30 UTC (permalink / raw To: gentoo-portage-dev Marius Mauch wrote: > On 08/30/05 Paul de Vrieze wrote: >>I don't think it is a wise path to interpret EAPI's as integers at >>all. There should not be guarantees of forward or backward >>compatibility between versions. Interpreting them as integers seems >>to imply that. Basically I think that EAPI could be anything wanted, >>similar to SLOTS. Of course using digits is easy for humans. > > > I've to agree with Paul here, portage should hold a list of all EAPI > values it understands, not a maximum value. > I also agree. It seems like a list of string identifiers will give us a high level of forward flexibility. For the implementation we can have a chain of EAPI handlers that are capable of determining whether or not they support a given EAPI. The first handler in the chain to accept the package will be allowed to handle it. Internally, these handlers may be able to share libraries and/or inherit from eachother. Zac -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring ` (3 preceding siblings ...) 2005-08-29 20:52 ` Zac Medico @ 2005-09-02 6:31 ` Marius Mauch 2005-08-29 8:34 ` Brian Harring 4 siblings, 1 reply; 40+ messages in thread From: Marius Mauch @ 2005-09-02 6:31 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 774 bytes --] On 08/27/05 Brian Harring wrote: > Hola. > > Attached is a patch that > A) adds EAPI awareness to portage; mainly, if >0, complain and be > unwilling to merge the package Actually I just wrote also a patch for it (for 2.1), however instead of complaining I just masked them (without unmask ability), just add a check to gvisible() and getmaskingstatus() (actually just calling dbapi.eapicheck()). That way it should be more transparent to users IMO. Won't stop people from using ebuild(1) though. Marius PS: I'm aware that the cache changes probably aren't 100% correct. -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. [-- Attachment #2: eapi.patch --] [-- Type: text/x-patch, Size: 5345 bytes --] --- pym/portage.py.org 2005-08-23 03:23:59.000000000 +0200 +++ pym/portage.py 2005-09-02 05:49:50.000000000 +0200 @@ -91,7 +90,7 @@ MOVE_BINARY, PRELINK_BINARY, WORLD_FILE, MAKE_CONF_FILE, MAKE_DEFAULTS_FILE, \ DEPRECATED_PROFILE_FILE, USER_VIRTUALS_FILE, EBUILD_SH_ENV_FILE, \ INVALID_ENV_FILE, CUSTOM_MIRRORS_FILE, SANDBOX_PIDS_FILE, CONFIG_MEMORY_FILE,\ - INCREMENTALS, STICKIES + INCREMENTALS, STICKIES, EAPI_COMPATIBLE from portage_data import ostype, lchown, userland, secpass, uid, wheelgid, \ portage_uid, portage_gid @@ -2057,6 +2056,13 @@ 'return: ["0",">=sys-libs/bar-1.0","http://www.foo.com"] or [] if mycpv not found' raise NotImplementedError + def eapicheck(self, mycpv, verbose=0): + myeapi = self.aux_get(mycpv, ["EAPI"])[0] + rval = (myeapi in ['']+EAPI_COMPATIBLE.split()) + if not rval and verbose: + writemsg("Warning: EAPI check failed for %s (has EAPI '%s')" % (mycpv, myeapi)) + return rval + def match(self,origdep,use_cache=1): mydep=dep_expand(origdep,mydb=self) mykey=portage_dep.dep_getkey(mydep) @@ -2667,9 +2673,9 @@ 'DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'INHERITED', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE', + 'PDEPEND', 'PROVIDE', 'EAPI' 'UNUSED_01', 'UNUSED_02', 'UNUSED_03', 'UNUSED_04', - 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', 'UNUSED_08', + 'UNUSED_05', 'UNUSED_06', 'UNUSED_07', ] auxdbkeylen=len(auxdbkeys) @@ -2737,7 +2743,7 @@ raise KeyError("CPV %s does not exist" % mycpv) mycp=mysplit[0]+"/"+mysplit[1] - if settings.pmaskdict.has_key(mycp): + if "package.mask" in getmaskingstatus(mycpv) and settings.pmaskdict.has_key(mycp): for x in settings.pmaskdict[mycp]: if mycpv in self.xmatch("match-all", x): pmaskfile = open(settings["PORTDIR"]+"/profiles/package.mask") @@ -2768,6 +2774,11 @@ rValue = [] + # EAPI checking + + if not db["/"]["porttree"].dbapi.eapicheck(mycpv): + rValue.append("EAPI") + # profile checking revmaskdict=settings.prevmaskdict if revmaskdict.has_key(mycp): @@ -3286,7 +3297,7 @@ return newlist def gvisible(self,mylist): - "strip out group-masked (not in current group) entries" + "strip out group-masked (not in current group) entries and entries with wrong EAPIs" global groups if mylist==None: return [] @@ -3297,7 +3308,7 @@ #we need to update this next line when we have fully integrated the new db api auxerr=0 try: - myaux=db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS"]) + myaux=db["/"]["porttree"].dbapi.aux_get(mycpv, ["KEYWORDS", "EAPI"]) except (KeyError,IOError,TypeError): continue if not myaux[0]: @@ -3305,6 +3316,7 @@ #print "!!! No KEYWORDS for "+str(mycpv)+" -- Untested Status" continue mygroups=myaux[0].split() + myeapi=myaux[1] pgroups=groups[:] cp = portage_dep.dep_getkey(mycpv) if cp in pkgdict: @@ -3334,7 +3346,7 @@ if gp[0] != "-": match=1 break - if match: + if match and db["/"]["porttree"].dbapi.eapicheck(mycpv): newlist.append(mycpv) return newlist --- bin/ebuild.sh.org 2005-08-23 03:23:46.000000000 +0200 +++ bin/ebuild.sh 2005-09-02 04:29:37.000000000 +0200 @@ -640,6 +640,7 @@ [ "$CDEPEND:-unset}" != "unset" ] && speak "CDEPEND=$(echo $CDEPEND)" [ "$PDEPEND:-unset}" != "unset" ] && speak "PDEPEND=$(echo $PDEPEND)" [ "$PROVIDE:-unset}" != "unset" ] && speak "PROVIDE=$(echo $PROVIDE)" + [ "$EAPI:-unset}" != "unset" ] && speak "EAPI=$(echo $EAPI)" speak 'end_keys' set +f ;; --- bin/ebuild-default-functions.sh.org 2005-08-23 03:24:26.000000000 +0200 +++ bin/ebuild-default-functions.sh 2005-09-02 04:30:05.000000000 +0200 @@ -344,6 +340,7 @@ echo "$RDEPEND" > RDEPEND echo "$RESTRICT" > RESTRICT echo "$SLOT" > SLOT + echo "$EAPI" > EAPI echo "$USE" > USE export_environ "${PORTAGE_BUILDDIR}/build-info/environment.bz2" 'bzip2 -c9' cp "${EBUILD}" "${PF}.ebuild" --- pym/portage_const.py.org 2005-08-23 01:18:53.000000000 +0200 +++ pym/portage_const.py 2005-09-02 05:44:43.000000000 +0200 @@ -63,3 +63,4 @@ CVS_BIN = "/usr/bin/cvs" EBUILD_PHASES = "setup unpack compile test install preinst postinst prerm postrm" +EAPI_COMPATIBLE = "0" --- pym/cache/flat_list.py.org 2005-08-23 01:17:51.000000000 +0200 +++ pym/cache/flat_list.py 2005-09-02 05:14:27.000000000 +0200 @@ -11,7 +11,7 @@ auxdbkey_order=('DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE','_eclasses_') + 'PDEPEND', 'PROVIDE', 'EAPI', '_eclasses_') def __init__(self, label, auxdbkeys, **config): super(database,self).__init__(label, auxdbkeys, **config) --- pym/cache/metadata.py.org 2005-08-23 01:17:51.000000000 +0200 +++ pym/cache/metadata.py 2005-09-02 05:53:41.000000000 +0200 @@ -8,7 +8,7 @@ auxdbkey_order=('DEPEND', 'RDEPEND', 'SLOT', 'SRC_URI', 'RESTRICT', 'HOMEPAGE', 'LICENSE', 'DESCRIPTION', 'KEYWORDS', 'INHERITED', 'IUSE', 'CDEPEND', - 'PDEPEND', 'PROVIDE') + 'PDEPEND', 'PROVIDE', 'EAPI') def __init__(self, label, auxdbkeys, **config): super(database,self).__init__(label, auxdbkeys, **config) ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-09-02 6:31 ` Marius Mauch @ 2005-08-29 8:34 ` Brian Harring 2005-08-30 17:46 ` Marius Mauch 0 siblings, 1 reply; 40+ messages in thread From: Brian Harring @ 2005-08-29 8:34 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 1517 bytes --] On Fri, Sep 02, 2005 at 08:31:26AM +0200, Marius Mauch wrote: > On 08/27/05 Brian Harring wrote: > > > Hola. > > > > Attached is a patch that > > A) adds EAPI awareness to portage; mainly, if >0, complain and be > > unwilling to merge the package > > Actually I just wrote also a patch for it (for 2.1), however instead of > complaining I just masked them (without unmask ability), just add a > check to gvisible() and getmaskingstatus() (actually just calling > dbapi.eapicheck()). That way it should be more transparent to users IMO. > Won't stop people from using ebuild(1) though. Masking makes a bit more sense, 'cept that information needs to be dumped out when resolution cannot occur. Further, it's a mild gotcha for users who wonder wth portage is masking a node. Better approach imo though, and would like to see that implemented rather then what I did with the stable patch. Incremental'ing EAPI during inherit is a no go; EAPI1 and EAPI0 are incompatible for execution, due to the src_compile configure/make breakup. Somebody care to split a masking patch for stable rather then the emerge modifications I did btw? I'm poking at ensuring an eapi=0 portage's generated eapi=1 cache entries are not used by an eapi=1 portage without a forced regeneration atm. That and the fact the 2.1 state should be decided, if we're going to have (effectively) two branches of development going at once, vs developmental line and maintenance branch. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-29 8:34 ` Brian Harring @ 2005-08-30 17:46 ` Marius Mauch 2005-08-30 23:38 ` Jason Stubbs 2005-08-31 0:12 ` Brian Harring 0 siblings, 2 replies; 40+ messages in thread From: Marius Mauch @ 2005-08-30 17:46 UTC (permalink / raw To: gentoo-portage-dev On 08/29/05 Brian Harring wrote: > Somebody care to split a masking patch for stable rather then the > emerge modifications I did btw? I'm poking at ensuring an eapi=0 > portage's generated eapi=1 cache entries are not used by an eapi=1 > portage without a forced regeneration atm. Well, the masking part should apply to stable as well as AFAIK those code regions haven't changed. > That and the fact the 2.1 state should be decided, if we're going to > have (effectively) two branches of development going at once, vs > developmental line and maintenance branch. Well, basically I wanted to deploy elog and Jason mentioned some other changes as well, and while talking about it we couldn't find much in head that we didn't want out. Unfortunately you weren't around at that time. Also I think we could use 2.1 to add all the hacks we need for transitioning (like the EAPI and Manifest stuff). However recently I met at least one nasty bug in the 2.1 dep resolver which (if I understood right) Jason classified as more or less unfixable, so I'm not that sure how viable 2.1 is anymore. Marius -- Public Key at http://www.genone.de/info/gpg-key.pub In the beginning, there was nothing. And God said, 'Let there be Light.' And there was still nothing, but you could see a bit better. -- gentoo-portage-dev@gentoo.org mailing list ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 17:46 ` Marius Mauch @ 2005-08-30 23:38 ` Jason Stubbs 2005-08-31 0:12 ` Brian Harring 1 sibling, 0 replies; 40+ messages in thread From: Jason Stubbs @ 2005-08-30 23:38 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 474 bytes --] On Wednesday 31 August 2005 02:46, Marius Mauch wrote: > However recently I met at least one nasty bug in the 2.1 dep resolver > which (if I understood right) Jason classified as more or less > unfixable, so I'm not that sure how viable 2.1 is anymore. This same bug is in stable as well. The difference is that 2.1 keeps adding deps whereas 2.0 skips out the first chance it gets. That, for all intense purposes, completely masks the issue. -- Jason Stubbs [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
* Re: [gentoo-portage-dev] PATCH: initial EAPI awareness 2005-08-30 17:46 ` Marius Mauch 2005-08-30 23:38 ` Jason Stubbs @ 2005-08-31 0:12 ` Brian Harring 1 sibling, 0 replies; 40+ messages in thread From: Brian Harring @ 2005-08-31 0:12 UTC (permalink / raw To: gentoo-portage-dev [-- Attachment #1: Type: text/plain, Size: 1623 bytes --] On Tue, Aug 30, 2005 at 07:46:24PM +0200, Marius Mauch wrote: > On 08/29/05 Brian Harring wrote: > > That and the fact the 2.1 state should be decided, if we're going to > > have (effectively) two branches of development going at once, vs > > developmental line and maintenance branch. > > Well, basically I wanted to deploy elog and Jason mentioned some other > changes as well, and while talking about it we couldn't find much in > head that we didn't want out. Unfortunately you weren't around at that > time. Also I think we could use 2.1 to add all the hacks we need for > transitioning (like the EAPI and Manifest stuff). I'd rather tag the hacks into stable release, as what the EAPI patch is intended to do. Reasoning is pretty straightforward; I trust stable code to hold less user visible bugs now, then what 2.1 would hold- stable has been shoved through the ringer; 2.1 hasn't been shoved through a comparable ringer. Further, if we're tagging compatibility hacks for 2.0.51 -> 3.0, the thing that matters is the compatibility additions, not extra (potentially buggy) features. Don't get me wrong- I'm still watching 2.1 bugs, but mainly for correction of stuff w/in rewrite. 2.1 *could* be made into a full release line, I just am convinced the time to do so has come and gone already. Rewrite isn't complete, but the base of it is saner then 2.x's, and people (beyond me) are actively working on it. Further, people are sniffing around re: capabilities the rewrite has natively, N portdir's for example for the -osx crew. My 2 cents, at least. ~harring [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 40+ messages in thread
end of thread, other threads:[~2005-09-02 12:28 UTC | newest] Thread overview: 40+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2005-08-27 10:53 [gentoo-portage-dev] PATCH: initial EAPI awareness Brian Harring 2005-08-28 5:46 ` Jason Stubbs 2005-08-28 9:29 ` Brian Harring 2005-08-28 15:32 ` warnera6 2005-08-28 9:31 ` Zac Medico 2005-08-28 9:45 ` Brian Harring 2005-08-29 8:32 ` Paul de Vrieze 2005-08-29 20:52 ` Zac Medico 2005-08-29 22:45 ` Brian Harring 2005-08-30 1:07 ` Brian Harring 2005-08-31 15:10 ` Zac Medico 2005-08-31 20:45 ` Brian Harring 2005-09-01 8:11 ` Zac Medico 2005-08-30 9:43 ` Paul de Vrieze 2005-08-30 10:38 ` Marius Mauch 2005-08-30 10:42 ` Brian Harring 2005-08-30 13:15 ` Marius Mauch 2005-08-30 13:28 ` Brian Harring 2005-08-30 14:47 ` Paul de Vrieze 2005-08-30 23:46 ` Brian Harring 2005-08-31 9:55 ` Paul de Vrieze 2005-08-31 12:58 ` Brian Harring 2005-08-31 14:59 ` Paul de Vrieze 2005-08-31 10:52 ` Marius Mauch 2005-08-31 12:57 ` Brian Harring 2005-08-31 14:43 ` Zac Medico 2005-08-31 15:41 ` Paul de Vrieze 2005-09-02 5:27 ` Zac Medico 2005-09-02 6:04 ` Brian Harring 2005-09-02 6:36 ` Zac Medico 2005-09-02 8:53 ` Paul de Vrieze 2005-09-02 12:27 ` Brian Harring 2005-09-02 8:42 ` Paul de Vrieze 2005-08-30 15:19 ` Marius Mauch 2005-08-31 12:30 ` Zac Medico 2005-09-02 6:31 ` Marius Mauch 2005-08-29 8:34 ` Brian Harring 2005-08-30 17:46 ` Marius Mauch 2005-08-30 23:38 ` Jason Stubbs 2005-08-31 0:12 ` Brian Harring
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox