<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE rdf:RDF [
<!ENTITY % HTMLlat1 PUBLIC
 "-//W3C//ENTITIES Latin 1 for XHTML//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">
]>
<rdf:RDF
 xmlns="http://purl.org/rss/1.0/"
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:admin="http://webns.net/mvcb/"
>
<channel rdf:about="http://gentooexperimental.org/~ferringb/blog/index.xml">
<title>Sordid (well, not really) tales of Brian Harring, aka ferringb</title>
<link>http://gentooexperimental.org/~ferringb/blog</link>
<description>portage news, diffball news, and general (uninformed) commentary/opinions</description>
<dc:language>en-us</dc:language>
<dc:creator>Brian Harring</dc:creator>
<dc:date>2005-12-03T06:09:47-06:00</dc:date>
<admin:generatorAgent rdf:resource="http://nanoblogger.sourceforge.net" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-12.html#e2005-12-03T05_37_05.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-21T21_01_50.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T18_47_56.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T02_19_28.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-14T19_05_12.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-23T03_53_37.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-12T23_59_53.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-01T19_42_18.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-27T13_10_45.txt" />
<rdf:li rdf:resource="http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-24T21_33_19.txt" />
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-12.html#e2005-12-03T05_37_05.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-12.html#e2005-12-03T05_37_05.txt</link>
<title>Purveyor of Banjosity</title>
<dc:date>2005-12-03T05:37:05-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>general</dc:subject>
<description><![CDATA[<p>Unhappy note, but an intersting fellow from the circle I occasionally run in passed away recently.  Not much to say, the freeman 
<a href="http://www.freemanol.com/topnews02.htm">article</a> pretty well covers it.  About the best you'll find of marty on the web, 
<a href="http://www.ackme.net/DonOne/doyou.wma">one of the more interesting tracks</a>, although tracking down a full version of a Celia album he was in might be wise.  Joys of a weekly house 'jam' session
in our apt and bar conversion (mandolin, banjo, guitar, bass, occasionally keyboard and dulcimer), always was entertaining (and educational) 
to see a master at work with their instrument.</p>
<p>So, RIP marty :-/</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-21T21_01_50.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-21T21_01_50.txt</link>
<title>confcache-0.3.3</title>
<dc:date>2005-11-21T21:01:50-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo, general</dc:subject>
<description><![CDATA[<p>Whee, another confcache bugfix release.  Version 0.3.3 is up in <a href="http://gentooexperimental.org/~ferringb/confcache">usual location</a>.  Adding it to portage shortly, since the bugfixes against 0.3 have been pretty minor, plus 0.3.x will sit for a bit while some refactoring occurs to better handle doing tricks to avoid invalidation of the cache.</p>
<p>Many thanks to Ed Catmur, Christian Lemke, and Diego 'Flameeyes' Pettenò for feedback and bug reports.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T18_47_56.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T18_47_56.txt</link>
<title>confcache-0.3</title>
<dc:date>2005-11-15T18:47:56-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo, general</dc:subject>
<description><![CDATA[<p><a href="http://gentooexperimental.org/~ferringb/confcache/">Confcache, version 0.3</a>.  
Fixed up a bunch of ass biter issues in dealing with the sandbox when trying to start it up (versus confcache
being called within a sandbox env); pretty confident it now works fine under userpriv, and standalone as of version 0.2</p>
<p>Wound up having to introduce a lovely little bit of twisty code- certain sandbox vars defined prior to starting the sandbox
result in the sandbox not appending the usual sane defaults (allowing write to /dev/tty for example).  The solution?  Well, we shift
those vars to the side, spawn an indirection script that appends them to the sandbox default, then execs the actual configure call.</p>
<p>Kind of nuts, but does the trick.</p>
<p>Aside from the quicky version 0.2 release, 0.3 was released a while after.  Closed up some nasty gaps in staleness detection.  At this 
point, I don't know any way to trip up the detection code- still get some occasional failures (mono for example), but the failures so 
far haven't been confcache's fault, issue has been that the package doesn't properly support --cache (which confcache uses).</p>
<p>Aside from that, rewrote the portage integration patch- back out the original if you have it, and raid the v3 from the 
<a href="http://gentooexperimental.org/~ferringb/confcache/">usual place</a>.</p>
<p>Addressing a couple of questions-</p>
<p>Why was configure complaining about stale build_alias/host_alias?<br/>
Bug, namely.  Version 0.3 now digs through the args passed to configure, and (should) properly handle staleness detection for that facet
of configure caches.</p>
<p>Why isn't configure caching all configure tests?<br/>
Because the configure script has to be written to cache results.  A 
lot of default checks are cached, but a lot of package specific checks aren't written to cache (yell at upstream in other words).
</p><p>Why isn't confcache working for ebuild xyz?<br/>
The current integration is active only for econf (it's the only place I can force it).
You can do a nasty little trick however to have confcache step in in the meantime.  Add 
<blockquote>function ./configure() { $CONFCACHE ./configure; }
</blockquote>to your /etc/portage/bashrc.  Shouldn't break stuff, but if it does it will be obvious- additionally, don't blame me.
It's an evil hack, you've been duly warned :) .
</p><p>Why is the global cache invalidated every run when I have cpufreq enabled?<br/>
Cpufreq changes the proc frequency (good thing), this info is exposed in /proc/cpuinfo, a file configure scripts check.  The md5 changes
every time the proc changes frequency, thus invalidating the cache each time (bad thing).  I'm aware of it, and intend to address this in 
0.4.
</p>
<p>Offhand, probably end of the weekend for 0.4- need to introduce a framework for registering triggers to override the normal md5
checks for certain files, so it'll require a bit of expansion to confcache.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T02_19_28.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-15T02_19_28.txt</link>
<title>portage parallel fetching/compiling</title>
<dc:date>2005-11-15T02:19:28-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo</dc:subject>
<description><![CDATA[<p>Continuing to pillage year old patches out of the ebd portage branch,   
<a href="http://gentooexperimental.org/~ferringb/portage/2.0/parallel-fetch.patch">parallel-fetch.patch</a> is available.</p>
<p>Roughly, this patch adds FEATURES="parallel-fetch", which when enabled (and merging more then one package), splits the 
buildplan execution into two processes- one building, the other doing strictly fetching.</p>
<p>Equivalent to (emerge -f target &> /dev/null < /dev/null &); emerge target , just saner (verifies distlocks are available for example).</p>
<p>Testing and feedback, as always, is desired and appreciated.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-14T19_05_12.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-11.html#e2005-11-14T19_05_12.txt</link>
<title>confcache-0.1.1</title>
<dc:date>2005-11-14T19:05:12-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo, general</dc:subject>
<description><![CDATA[<p>Got a little ticked off at the runtime cost of configure calls for package updates, so I wound up rewriting confcache from the ebd 
portage line as a stand alone tool (score, I can use it locally for development), and split a patch for portage stable integrating it as 
FEATURES="confcache".  Ebuild, and portage patch are available in <a href="http://gentooexperimental.org/~ferringb/confcache">my devspace</a>.</p>
<p>Rough example of the improvement run time wise, is a reduction of php's configure call from 80s to 25s.  About what ebd was getting, if I recall correctly.</p>
<p>For those unfamiliar with what this feature/code is actually doing- autoconf scripts have the option to cache settings in a file, and 
reuse that file next time around.  Save the result of checks/tests, basically, which can result in pretty massive speed ups sometimes.</p>
<p>The problem is that autoconf doesn't offer a way to quickly/cleanly verify the cache- for portage, this is a major issue since a glibc
update should most likely invalidate the cache; you don't want configure tests using old results that are no longer correct.</p>
<p>Enter the sandbox. :)</p>
<p>Via the sandbox, we can track what the configure script accesses for it's tests.  Store a list of the files checked, and their md5 checksums, 
and you have a way to check if the cache is stale or not.  It's actually a bit more complicated (need to track env vars also), but that's the basic jist of it.</p>
<p>Either way, looking for testers and feedback- the gain from it should be obvious, so I'll avoid the usual pleading to get people to test stuff ;)</p>
<p>For the non-gentoo folk, well, grab our sandbox, install it, and install confcache and you will be able to use it to manage a global cache for configure calls.  Still useful, although y'all will have a few more hoops to jump through ;)</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-23T03_53_37.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-23T03_53_37.txt</link>
<title>diffball releases</title>
<dc:date>2005-10-23T03:53:37-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>delta compression, python</dc:subject>
<description><![CDATA[<p>Hola kiddies</p>
<p>Received a request earlier, which wound up with diffball 0.7 being <a href="http://developer.berlios.de/projects/diffball">released</a>, 
and a large amount of lib work being done so that people can get access to a rather simple high level api.</p>
<p>At this point, the lib exposes the exact same set of runs that compromises the differ binaries algo, and exposes a reconstruct func
that, again, pretty much comprises the patcher binaries internal reconstruction calls.  An example of using libdiffball for doing delta
compression between two files in memory, dumping the results to another array (note that the code is being anal about dealloc, hence the structure)-
<blockquote><pre>
#include <stdlib.h>
#include <cfile.h>
#include <diffball/api.h>

&#047;&#047; returns 0 on success, non zero on failure
int diff_it(char *src_array, int src_len, char *ver_array, int ver_len, 
  char **out_array, int *out_len)
{
  cfile src_cfh, ver_cfh, out_cfh;
  int ret = -1;

  if((ret = copen_mem(&src_cfh, src_array, src_len, NO_COMPRESSOR, CFILE_RONLY)) 
    == 0) {

    if((ret = copen_mem(&ver_cfh, ver_array, ver_len, NO_COMPRESSOR, CFILE_RONLY)) 
      == 0) {

      if((ret = copen_mem(&out_cfh, NULL, 0, NO_COMPRESSOR, CFILE_WONLY)) == 0) {
      
        if((ret = simple_difference(&src_cfh, &ver_cfh, &out_cfh, 0, 0, 0, 0)) 
          == 0) {
          *out_array = out_cfh.data.buff;
    	  *out_len = out_cfh.data.write_end;
        } else {
          free(out_cfh.data.buff);
        }
        cclose(&out_cfh);
      }
      cclose(&ver_cfh);
    }
    cclose(&src_cfh);
  }
  return ret;
}

</pre></blockquote>
So what exactly is that doing?  Libdiffball uses internally the io lib cfile that I created for it, that's intended to transparently wrap access to
mem/compressed files/raw files behind a common structure and set of functions.   Pretty much have the usual open/read/write/lseek/close/tell, 
just prefixed with a c; internally, if it's a bzip2 stream, it does the decompression on it's own, and feeds data to users.</p>
<p>To head off concerns about buffers of buffers, preferred access to cfile structs is via a page api, that exposes the underlying buffer, so
as to cut down on unneccessarily cread memcpy's (for example).</p>
<p>The copen_mem above is configuring the cfile struct so that it's working directly from the passed in array- for CFILE_RONLY, obviously, 
doesn't modify the buffer. :)  I'm opening the out_cfh with a null buffer, so that it allocs it's own.</p>
<p>From there... the simple_difference call is pretty straightforward.  The trailing zero args are just telling it to use defaults for a 
couple of tunables (in this case, I have no interest in fooling with them).</p>
<p>What's all the nonsense involving pulling a buffer?  Well, that's because I haven't yet thought up a good, *clean* api for raiding the 
buffer + size out; till that's in place, management of data.buff (namely free'ing), is left to the caller- this is also why I choose this example,
since would welcome suggestions for it.  Remaining chunk of the code is pretty much just free'ing stuff on the way out, error or otherwise, then returning either the error or zero.</p>
<p>That's the beast.  Might seem a bit complex, but aside from the CFILE_WONLY + free design decision, it's about as simple as I can make it.  The
api reconstruct equivalent, 'simple_reconstruct' is roughly on par for straightforwardness-
<blockquote><pre>
int simple_reconstruct(cfile *src_cfh, cfile *patch_cfh[], unsigned char patch_count, 
  cfile *out_cfh, unsigned int force_patch_id, unsigned int max_buff_size);
</pre></blockquote>
Again, pretty much just having the cfile handles passed in, a couple of options that most people will leave set to zero (use internal sane defaults).
Nifty thing to note is that patch_cfh is an array of cfile ptrs- multiple patches applied in a single run (hard max of 256 atm), so via
those funcs above you've got transparent decompression of patches/sources, multiple patches in a single run, and at least read capabilities
on 6 different patch formats- xdelta, fdtu, bsdiff, and gdiff being the main external formats others may know.</p>
<p>So, enough whoring of that.  Needed an easy way to test the new code from above, so I also wrote out some quick python bindings via pyrex- 
<a href="http://developer.berlios.de/projects/diffball">pydiffball-0.1</a> being the result.  Exposed functionality is cfile creation (both
memory and usual file based), simple_difference, and simple_reconstruct.  The python module is quite a bit more friendly, since it'll generate the cfile instances on it's own for all api calls, assuming it's an on disk path passed in when the arg is a basestring derivative.</p>
<p>Hopefully people find some use in it; personally, the python bindings will at least make my life a helluva lot easier for some extra code I occasionaly
work with.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-12T23_59_53.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-12T23_59_53.txt</link>
<title>backport of cache rewrite to stable</title>
<dc:date>2005-10-12T23:59:53-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo</dc:subject>
<description><![CDATA[<p>Hola all.  Patch still is a bit raw, due to the fact the integration chunk of it is 24 hours old, but my cache rewrite sitting in 2.1 
and 3.x I've backported to 2.0.53_rc5 for anyone interested.  Thanks to antarus, zmedico, fuzzyray, and Bastian Balthazar Bux for 
testing the hell out of it.  Initial patches were rather raw.</p>
<p>Did some further improvements to it, lifting a couple of classes out of 3.x so as to cut down on unnecessary io overhead.  
Stats via FuzzyRay (Paul Varner), a 233mhz pentium with 256 megs and an amazing disk access speed of 9.74MB/sec.  All tests are with 2.0.53_rc5 as base.</p>

<p>emerge --metadata with existing full cache<table><tr><th>Version</th><th>real</th><th>user</th><th>sys</th></tr>
<tr><td>vanilla</td><td>9m30.580s</td>
<td>4m9.230s</td>
<td>0m17.850s</td></tr>
<tr><td>patched</td><td>5m43.876s</td>
<td>2m39.730s</td>
<td>0m13.610s</td></tr>
</table><br/>
emerge --metadata without cache<table><th>Version</th><th>real</th><th>user</th><th>sys</th></tr>
<tr><td>vanilla</td><td>35m30.164s</td>
<td>26m49.250s</td>
<td>1m23.410s</td></tr>
<tr><td>patched</td><td>11m59.595s</td>
<td>5m6.890s</td>
<td>0m36.930s</td></tr></table>

</p>
<p>Not too shabby.  Stats source available <a href="http://article.gmane.org/gmane.linux.gentoo.portage.devel/1123">here</a>.
Patch is available <a href="http://gentooexperimental.org/~ferringb/portage/2.0/3.0-cache-backport-experimental-7.patch">here</a>, 
and further feedback would be appreciated.</p>
<p>Be aware if you test it out, you're going to need to run a emerge --metadata after applying the patch to /usr/lib/portage/pym.  CVS $PORTDIR users, you're stuck running a regen.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-01T19_42_18.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-10.html#e2005-10-01T19_42_18.txt</link>
<title>portage 2.0.53 release candidate</title>
<dc:date>2005-10-01T19:42:18-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo</dc:subject>
<description><![CDATA[<p>Jason added a portage-2.0.53 release candidate p.masked to the tree earlier today- notable changes since .52
<ol>
<li>EAPI awareness.  Unset EAPI in an ebuild is EAPI=0, so no massive tree wide changes needed (grandfathered the existing tree in).</li>
<li>Support for upcoming rsync metadata changes, transparent switch over.</li>
<li>Glep31 checks, and enforcement.</li>
<li>CDEPEND metadata key is no longer looked at by the resolver (wasn't used).</li>
<li>SetUID/SetGID installed files will have their o+w yanked automatically on merging now, rather then complaining about it.</li>
<li>No more has_version/portageq in global scope.  Do it, and portage intentionally pukes on your ebuild during sourcing.</li>
<li>prelink md5 calculation optimization via zmedico.</li>
<li>Good collection of bug fixes, plus cleanup of a couple of messages emerge spits out so it's saner.</li>
</ol>
</p>
<p>Not the full list (generate the diff if you're after it, or raid the ChangeLog), but that's the notables.  Please test it :)</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-27T13_10_45.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-27T13_10_45.txt</link>
<title>python weirdness</title>
<dc:date>2005-09-27T13:10:45-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>General Gentoo, python</dc:subject>
<description><![CDATA[<p>A while back I wrote a tokenizing generator func for some core portage rewrite string processing; nothing incredibly fancy, just chunks up
strings dependant on splitters past in.  This serves as the basis for chunking up and processing depset syntax.  Example being: "dev-util/diffball bsdiff? ( dev-util/bsdiff )".
</p><p>Now, I thought the func was fairly tight, speedy enough.  Simple little sucker-
<blockquote><pre>
def iter_tokens(s, splitter=" "):
    """iterable yielding of splitting of a string"""
    pos = 0
    l = len(s)
    while pos < l:
        if s[pos] in splitter:
            pos += 1
            continue
        next_pos = pos + 1
        while next_pos < l and s[next_pos] not in splitter:
            next_pos+=1
        yield s[pos:next_pos]
        pos = next_pos + 1
</pre>
python -m timeit -s 'x="mamma said knock you out\n mama \t knocked\t you out\n";x*=10000;' 'list(iter_tokens(x, " \t\n"))'
</blockquote>Using that func, is 365ms per run (roughly).
Now granted, there is room for improvement, but at first glance, the only tricky spot is linear search of splitter- using a set there actually is a bit slower, due to overhead of creating said set.
</p>
<p>What <b>massively</b> gets my goat is that it's actually pretty damn slow in most real world usage compared to a seemingly primitive, and butt ugly (imo) aproach.
<blockquote><pre>
from itertools import ifilter
def iter_tokens(s, splitter=" "):
    l = len(splitter)
    if l > 1:
        if l == 3 and " " in splitter and "\t" in splitter and "\n" in splitter:
            return iter(s.split())
        for x in splitter[:-1]:
            s = s.replace(x, splitter[-1])
    return ifilter(None, s.split(splitter[-1]))
</pre>
python -m timeit -s 'x="mamma said knock you out\n mama \t knocked\t you out\n";x*=10000;' 'list(iter_tokens(x, " \t\n"))';
</blockquote>
Is faster.  <b>Much</b> faster.  Clocks in at 38.7ms.  Without the check for " \t\n", it clocks in at 61ms.</p>
<p>If it were a single split, still the replace hack is faster (although the difference between the two is minor enough).  So... that's weird, and bugged the hell out of me last night :)</p>
<p>Zac Medico's comments about the yield instantiating and returning another string instance probably are fairly on par.  Either way, it's not intuitive to me :)</p>
<p>Final comment on it, downside to the faster approach is that you have to do the processing up front, rather then JIT as the generator does- in the case of the code that uses this, it's not an issue though.  Haven't dug into the underlying python source to figure out why there's such a difference, so if someone knows kindly tell me so I spend my time doing something else ;)</p>
<p>Update: Tweaked the replace func and updated it's runtime since it was brain dead from experimentation at 3am, saner/simpler version of the replace loop is courtesy Andy Dustman for the replace cleanup.  The check for " \t\n" is a quicky addition from me, mainly since that is even faster.<br/>Note also that the faster approach I don't have issue with, I'm just rather amazed at the major difference in runtime for the two approaches.</p>]]></description>
</item>
<item rdf:about="http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-24T21_33_19.txt">
<link>http://gentooexperimental.org/~ferringb/blog/archives/2005-09.html#e2005-09-24T21_33_19.txt</link>
<title>Upcoming rsync cache changes</title>
<dc:date>2005-09-24T21:33:19-06:00</dc:date>
<dc:creator>Brian Harring</dc:creator>
<dc:subject>Portage news, General Gentoo</dc:subject>
<description><![CDATA[<p>Commited a variation of a patch I posted in this 
<a href="http://thread.gmane.org/gmane.linux.gentoo.portage.devel/907">thread</a> to stable earlier today.  Covers two things-</p>
<p>Detection of $PORTDIR/metadata/cache format- currently portage stable uses an ordered list of (implicit) key -> value; this makes it 
essentially impossible to ever remove a key, and makes addition of keys have a hard limit.  Bad.  So... the new format is an old format I hacked out 
a year back, flat_hash, (explicit) key -> value unordered.  Nothing hugely fancy, but does allow us to jam stuff in without issue.</p>
<p>Increased flexibility requires us to version the cache entry in some way, so that we know if entries are incompatible with the version of portage reading it.  Additionally, 
we should have been versioning the expected ebuild env (how it will be called, what funcs are available, etc) long ago.  EAPI is that; additions/extensions to the ebuild spec
result in a new EAPI standard, for example, src_configure addition is part of what EAPI=1 is.  With EAPI in the cache, we can know whether or not the local
portage version is <b>capable</b> of properly handling that cache entry.  A higher EAPI (later portage release) may add new metadata; any 
portage version that doesn't support that EAPI must in some way mark the entry as "I know of it, but I can't use this ebuild".</p>
<p>So... in that jumble, essentially the rsync metadata/cache auto-detection allows us to move over to a more flexible format without causing cache
horkages every time we change stuff (as has happened often enough), and EAPI allows us to to version those entries, so that EAPI aware portage versions
can protect themselves from doing something stupid.</p>
<p>That and a lot of emerge --metadata cleanups got stuck in, hopefully killing off any remaining failures during cache transfer ;)</p>
<p>Also dropped root requirement for emerge --metadata.  That always bugged the heck out of me, since it wasn't needed...</p>]]></description>
</item>
</rdf:RDF>
