PMXBOT Log file Viewer

Help | Karma | Search:

#pypa-dev logs for Wednesday the 6th of May, 2015

(Back to #pypa-dev overview) (Back to channel listing) (Animate logs)
[00:23:03] <tchaypo> lifeless: this would be https://github.com/pypa/pip/pull/2716 ?
[00:25:20] <lifeless> context?
[00:26:01] <tchaypo> “my 988 WIP"
[00:27:19] <lifeless> probably
[02:48:15] <tchaypo> trying to run pip’s tests on my own machine, I’m finding that it assumes a few things
[02:48:40] <tchaypo> eg, some of the functional tests assume it has subversion executables, other tests assume hg executables
[02:53:21] <tchaypo> I can’t see anything that installing these in travis, so I’m assuming the travis environment must just happen to come with those things installed
[03:14:49] <tchaypo> Am I missing something
[03:43:38] <tchaypo> aside from a ? at the end of that question
[06:04:56] <tchaypo> 540 passed, 9 skipped, 1 warnings in 2392.13 seconds
[06:04:58] <tchaypo> hallelujah
[06:34:31] <lifeless> tchaypo: travis vm's have a base set of tools
[06:34:34] <lifeless> tchaypo: they document this
[06:46:20] <tchaypo> http://docs.travis-ci.com/user/ci-environment/#Environment-common-to-all-VM-images
[06:47:20] <tchaypo> subversion and mercurial were two things I had to install on my machine; the third was bzr, which I don’t see listed there or in the travis setup stuff
[07:47:55] <ronny> people still use bzr?
[07:48:35] <ronny> lifeless: btw, did you notice the talk about using unpacked wheels like zip-unsafe eggs yesterday?
[07:52:11] <lifeless> ronny: I didn't
[07:53:29] <ronny> lifeless: i see, i have a rough plan to make setuptools/pip support unpacked wheel as if they where unpacked eggs, then remove the need for eggs in setup_requires/install_requires when wheels are availiable
[07:55:18] <lifeless> ronny: ah
[07:55:42] <lifeless> ronny: that seems similar to what I'll be doing in my setup_requires branch
[07:55:55] <lifeless> ronny: I'm working up a good cache of such things at the moment
[08:00:24] <ronny> lifeless: thats why i thought it wuld be a good idea to talk a bit, in part since you seem to have actual work time on the topic
[08:00:49] <lifeless> ronny: so pr 2617 is my current WIP on the cache - heading up the resolver path t the moment
[08:01:23] <lifeless> the resolver needs a cache because it's going to be examining multiple versions for dep data before it can decide which one to choose and that needs to be cheap
[08:02:11] <lifeless> for my setup-requires work
[08:02:16] <lifeless> my intent is to leverage the same cache
[08:02:24] <lifeless> which will have unpacked wheels || unpacked sdists in it
[08:02:49] <lifeless> (with egg_info run in the sdists)
[08:02:51] <ronny> unpacked sdsit seems a bad idea, they are very free in layouts
[08:03:05] <lifeless> well
[08:03:09] <ronny> (src folder seems to be a common problem)
[08:03:29] <lifeless> the next bit I hadn't written :)
[08:03:38] <lifeless> is to install to a unique dir
[08:03:47] <lifeless> using some machinery pip already has
[08:03:55] <lifeless> each thing, when its needed for a setup-requires
[08:03:56] <ronny> thats bascially unpacked wheels/eggs in a nutshell
[08:03:59] <lifeless> yup
[08:04:09] <lifeless> thats why I say it sounds similar :)
[08:05:39] <lifeless> setuptools uses a persistent .eggs cache dir where setup.py was run
[08:05:54] <lifeless> this means that in pip install scenarios, you end up building the setup_requires many times, once per package that has it
[08:06:05] <lifeless> so a single unified cache will be better on that metric
[08:06:18] <lifeless> OTOH it won't (at least initially) be persistent across pip invocations
[08:06:42] <lifeless> so if using it with pip install -e . -- aka setup.py develop - it will grab the deps more often
[08:06:50] <lifeless> this should be mitigated by the wheel autobuilding though
[08:07:01] <lifeless> (which I'll have hooked into the cache)
[08:07:19] <lifeless> since we won't need to do C stuff, just unpack a wheel from the users ~/.cache
[08:09:24] <ronny> lifeless: i also plan to teach setuptools itself to treat wheels as zip-unsafe eggs
[08:09:37] <lifeless> ronny: that would be nice
[08:09:56] <lifeless> ronny: something I think would be good is a way to request setup_requires statically from setuptools without invoking setup.py
[08:10:22] <lifeless> ronny: e.g. python -m setuptools list-setup-requires .
[08:10:35] <lifeless> -> a json list of strings
[08:10:36] <ronny> lifeless: there also is a plan for invoking setuptools without implicit easy_install
[08:10:36] <lifeless> or something
[08:10:56] <lifeless> ronny: yes, its tied in
[08:11:06] <lifeless> I plan to work on those aspects once I've got all the bits in pip lined up
[08:11:12] <lifeless> changing the interface pip uses to query is easy
[08:11:13] <ronny> lifeless: i made some issues to setuptools recently dealing with no implicit easy_install and no implicit setup_requires
[08:11:18] <lifeless> refactoring all the plumbing not so much
[08:11:41] <ronny> i really dislike pbr tho, its really totally openstackish
[08:11:53] <ronny> but i will need a whie before gumby elf is done
[08:12:10] <lifeless> ronny: pbr's not really part of this discussion though, is it?
[08:12:26] <ronny> yes
[08:12:31] <lifeless> how so?
[08:12:49] <ronny> i meant to agree to your negation
[08:12:53] <lifeless> ah cool
[08:13:10] <ronny> in german it kinda works that way, in english one better uses the word true
[08:14:40] <ronny> lifeless: we should get together with jason and donal and figure a common scheme for caching downloaded python packages, (in particular to avoid re-downloads when one deals with a devpi based pypi mirror)
[08:15:42] <lifeless> ronny: won't devpi cache them for you in that situation?
[08:16:09] <lifeless> ronny: I'd really like to just deprecate easy-install in setuptools, so that it can get out of the business of installing other packages
[08:16:15] <lifeless> then we can focus on pip for thaat
[08:16:23] <lifeless> and setuptools for building and installing the one local package
[08:17:03] <ronny> lifeless: hmm, true, i suppose once setuptools can list setup-requires and avoid implicit easy_install its doable
[08:17:10] <ronny> lifeless: but before, it needs to stay
[08:17:29] <lifeless> right
[08:17:40] <lifeless> thus why I'm working on pip first
[08:17:43] <lifeless> :)
[08:21:47] <ronny> workign on pip is a lot more easy, it has a sane codebase ^^
[08:22:39] <ronny> lifeless: btw, there was support for static setup_requires in sdists for a release, but pkg_resources is broken in some situations wrt distribute
[08:28:37] <lifeless> ronny: static as in setup.cfg?
[08:28:42] <lifeless> ronny: or some other form ?
[08:29:00] <ronny> lifeless: put into egg info thats part of the sdist
[08:29:43] <lifeless> ronny: interesting, ok.
[08:29:50] <lifeless> I thought that was there already
[08:29:54] <ronny> as setup_requires.txt
[08:30:08] <lifeless> anyhow, I am aiming to solve the developer story
[08:30:10] <lifeless> so pre-sdist
[08:30:17] <lifeless> which pip needs too for git+ etc installs
[08:30:25] <ronny> lifeless: it was removed due to distribute + setuptools
[08:31:38] <ronny> lifeless: i still think opt out of easy_install + list via an option is a better way than setup.cfg additions that require a extra tool to function
[08:31:55] <lifeless> ronny: I think both of these things are combinable
[08:32:06] <lifeless> ronny: they address different parts of the problem
[08:32:30] <lifeless> ronny: setup.cfg addresses 'cannot import setup.py because of missing requires' - it lets you write plain old python without the crazy gymnastics
[08:32:55] <lifeless> ronny: opting out of easy install and returning a list provides a contract that can work for existing setup.py using setup_requires
[08:33:06] <lifeless> ronny: (and also for ones where folk put it in setup.cfg)
[08:34:01] <ronny> lifeless: a setup.py that does not run plainly is broken to begin with ^^
[08:38:39] <lifeless> ronny: lots of the packages I looked at choose to write regular python rather than gymnastics python
[08:38:50] <lifeless> ronny: and just error out if their deps are not available
[08:39:25] <lifeless> ronny: so, I agree that its broken in the sense that 'python setup.py ...' fails for them in a clean venv with nothing installed
[08:39:53] <lifeless> ronny: but I don't agree that they are broken in principle: we've not delivered a good environment for them
[08:46:53] <ronny> lifeless: well, setuptools is quiirky - a setup.py erroring out instead of running is broken
[08:47:10] <ronny> lifeless: in particular all those packages that import not yet installed dependencies
[08:47:49] <ronny> many of them would be instantly fixed by just parsing the version from foopkg.version instead of importing
[08:50:32] <lifeless> ronny: so setup_requires addresses not yet installed deps
[08:51:16] <lifeless> ronny: but you have to use gymnastics to defer actual importing, which is fixable by setup.cfg, and thats why a bunch of folk are interested in setup.cfg
[08:51:18] <ronny> lifeless: they dont quite work if the code in question imports before even calling setup
[08:51:19] <lifeless> I get that you're not
[08:52:33] <ronny> lifeless: im just against tools that are already a mess getting even more messy to work around people messing things up
[08:53:28] <lifeless> ronny: they're messy because they attempted to be too clever; I want to offer people a way to avoid that
[08:53:43] <ronny> by being even more clever?
[08:53:48] <lifeless> by being less clever
[08:55:31] <ronny> lifeless: you added another layer of abstraction, instead of enabling the tools to opt out of cleverness
[08:56:16] <lifeless> I don't follow
[08:56:51] <lifeless> .win 143
[08:57:13] <ronny> lifeless: the static setup requires in setup.py adds a new layer of absttraction in different tools while not even remotely repairing the original problem or providing ways to better work with it
[08:57:53] <lifeless> I think we're going to have to agree to disagree
[08:57:53] <ronny> suddenly pip needs to know about extra file format,s easy_install needs a extra thing to deal with them, and the base situation of tricky gymnastic for the details is unchanged
[08:58:24] <lifeless> pip doesn't need to know the file format (setuptools will know)
[08:58:40] <lifeless> easy_install doesn't need to deal with them (because by this point pip will be able to own that)
[08:59:05] <lifeless> the tricky gynamnastics can be somewhat unwound, and at least the potential for clearer things is enabled
[09:04:20] <ronny> i think we are missing out on details, we should talk about it at a different point in time, but from my pov you are solving the problem at the wrong position thus adding technical debt and format cuft that will have to stay around for decades
[09:05:24] <tomprince> Clearly, adding an ad-hoc thing is something that will need to be maintained long-term.
[09:05:56] <tomprince> But I think that supporting static metadata of that kind is something that people will want to support in the sdist 2.0 world (whatever format that ends up taking).
[09:06:37] <tomprince> So the additional code will just be to handle the reading the ad-hoc data and converting it internally to sdist 2.0.
[09:06:49] <tomprince> (There is going to be a bunch of code to support legacy sdists anyway).
[09:08:21] <ronny> ...
[09:08:41] <lifeless> there's also d2to1 already out there that supports the static format
[09:08:44] <lifeless> its not a new format
[09:08:58] <tomprince> `python setup.py` not working without dependencies isn't clearly broken. It breaks some peoples expectations (obviously, from this conversation). But it is the same as './configure; make; make install' not working without dependencies.
[09:09:34] <ronny> tomprince: configure tells you whats missing, setup.py just raises a confusing exception
[09:09:40] <tomprince> And it is a small fairly straightforward incremntal improvement that can be implemented well now.
[09:10:44] <tomprince> And the point of adding support for setup_requires in setup.cfg is so nobody need trip over that, or controt themselves to avoid that.
[09:11:50] <tomprince> https://github.com/pyca/cryptography/blob/master/setup.py#L146-L250 is clearly a code smell, and people shouldn't be forced to do something like that just to work-around setuptools.
[09:12:38] <tomprince> And, in any case, the ecosystem appears to be moving (deliberately) to a world where nobody ever runs 'setup.py' by hand anyway.
[09:13:08] <ronny> tomprince: yes, but adding workarounds on top of workarounds instead of making the workarounds unnecessary seems to be the easy way out that just adds technical debt
[09:14:36] <ronny> the last item of that kind was distribute, and that is creating such a mess that we still cant have setup_requires in the sdist metadata
[09:14:39] <tomprince> Well, this is partly a work-around, and partly a step in the right direction of making all the metadata declarative.
[09:14:42] <lifeless> I'm happy to dig in more later, right now I have to sleep
[09:15:00] <lifeless> and since pip has basic requirements that need to be present in all the proposed designs
[09:15:21] <lifeless> (resolver, setup_requires semantic handling independent of build system && query method)
[09:15:26] <ronny> lifeless: sleep well
[09:15:50] <lifeless> I don' tthink there's a lot to be gained by worrying about stuff much beyond that horizon, unless we think we can eliminate pip needing those things
[09:15:56] <lifeless> [which noone has suggested AFAICT]
[09:16:47] <tomprince> And, in any case, the bulk of the work is getting pip to handle setup_requires, however it gets that data from the sdist, whether that is by piling hack on top of setuptools or by reading a bit of static metadata.
[09:21:23] <tomprince> ronny: In any case, it seems you are arguing against adding "hacks" in pip by adding "hacks" in setuptools.
[09:22:46] <ronny> tomprince: to give pip full controll, setuptools needs an complete easy_install opt out anyway
[09:27:08] <ronny> tomprince: my plan is to propperly teach setuptools to deal with setup_requires printing, and having computed arguments for setup
[12:57:28] <dstufft> I don't feel too bad about adding a setup.cfg "hack" that we can eventually isolate to the "here's the legacy setuptools hack builder thing for the old and busted way" when we implement the ability to have different build tools.
[12:58:00] <dstufft> lifeless: I'm sure you're asleep, but looking through your PR now
[13:33:02] <ronny> hmk
[13:33:31] <ronny> dstufft: i think within the next 2 weeks i'll have a different build tool ^^
[19:28:37] <dstufft> lifeless: you around?
[19:29:04] <lifeless> dstufft: very
[19:29:09] <lifeless> dstufft: at least until C wakes up :)
[19:30:16] <dstufft> lifeless: hey! So trying to grok RequirementCache - Is this just a mapping of reuqirements (ignoring for a moment that it's a little more complicated than just a straight mapping) to a build location so that we reuse a build location if we've already downloaded + unpacked a thing?
[19:30:20] <lifeless> dstufft: which might be ~now - I'll be out for 90m until she's down at Kindy
[19:30:29] <dstufft> lifeless: that's fine too :)
[19:32:52] <lifeless> so no
[19:33:20] <lifeless> both setup-requires and resolver workloads require the ability to reuse a not-yet-installed package
[19:33:39] <lifeless> the former case is for packages with the same setup-requires as install-requires
[19:33:50] <lifeless> (and for multiple packages with a common setup-requires)
[19:33:58] <lifeless> the latter case is for backtracking
[19:34:32] <lifeless> given A and A' that both require B, if we have to backtrack from the A to the A' branch, we don't want to re-process B
[19:34:49] <lifeless> so the old build dir layout had requirements as dir/$name
[19:34:54] <lifeless> but A and A' would collide there
[19:35:16] <dstufft> lifeless: right, but REquirementsCache here doesn't itself actually do anything but map requirements to build dirs right?
[19:35:37] <lifeless> dstufft: oh, in terms of responsibilities
[19:35:47] <dstufft> yea
[19:35:49] <lifeless> dstufft: I think it will also end up owning the list of available versions of a package
[19:36:25] <lifeless> (we don't want to hit the indices when A fails to find A'
[19:37:01] <lifeless> we could make it a layer over the finder
[19:37:09] <lifeless> but I am thinking of it more as an adjacent thing
[19:37:35] <dstufft> lifeless: ok
[19:37:59] <lifeless> one of the confounded bits I haven't really tackled yet is that req_to_install is both a concrete version of a package
[19:38:03] <lifeless> and a constraint
[19:38:17] <lifeless> my intent is to push the concrete stuff into the CachedRequirement class
[19:38:33] <lifeless> and the other stuff sideways into a constraint
[19:38:46] <lifeless> or possibly change in-place
[19:38:47] <dstufft> yea, req_to_install does a whoel bunch of stuff
[19:39:04] <lifeless> but anyhow, one class for constraints, one for 'things that may or may not satisfy'
[19:39:35] <lifeless> there's a lot of hidden interactions so its taking me a while to context switch in each time I pick up the work :(
[19:39:41] <lifeless> I need a few uninterrupted days
[19:40:21] <dstufft> lifeless: we have InstallationCandidate somewhere too
[19:40:34] <lifeless> without the PSF blowing up, or being sick, or $$$
[19:40:35] <lifeless> $other I mean
[19:40:53] <lifeless> thats in index
[19:40:56] <lifeless> yeah
[19:41:06] <lifeless> its however just project,version,location
[19:41:43] <lifeless> also lol, we appear to have two copies of it
[19:41:48] <lifeless> one in req_requirement, one in index
[19:41:53] <lifeless> I don't think thats a local fubar
[19:42:36] <lifeless> one of the layering issues is that the index doesn't know about editables
[19:42:45] <lifeless> so I-C isn't suited for that case
[19:43:06] <lifeless> IC seems more like 'RequirementVersion' or something, shrug.
[19:45:32] <dstufft> lifeless: I'm not the greatest at naming things :)
[19:47:27] <lifeless> dstufft: :). C is up, I willping you when I get back from dropping her at kindy
[19:47:30] <dstufft> lifeless: so right now it looks OK, I'm a little concerned that the RequirementsCache might be better off as just a function (or a method since it needs to hold some state for the actual physical disk location of the tmp dir) that can turn a requirement into a build path, but I see you have two lookup functions but aren't using them that I can see yet, so I may just not be seeing future plans
[19:47:35] <dstufft> lifeless: see ya!
[19:59:56] <agronholm> dstufft: did you get jython working?
[20:01:12] <dstufft> agronholm: I have it installed and working yes, I didn't get the tests running yet since there's a bit of a chicken/egg problem with tox and virtualenv and I got distracted by filling out paperwork
[20:01:58] <agronholm> yeah you're going to have to run the tests somewhat manually
[20:02:13] <agronholm> given the unique circumstances
[21:39:42] <lifeless> dstufft: so yes, its still exploratory
[22:31:03] <lifeless> dstufft: ping
[22:31:11] <dstufft> lifeless: hi!
[22:31:18] <lifeless> dstufft: indent_log
[22:31:34] <lifeless> dstufft: we have some stuff in process_file indented and some not
[22:31:39] <lifeless> should I care a lot about this?
[22:31:56] <lifeless> erm, _prepare_file
[22:32:42] <dstufft> the rhyme and reason behind what is and isn't indented is before my time, I don't think anyone is going to hardline any one stance, as long as the output makes sense
[22:32:51] <lifeless> cool
[22:33:22] <lifeless> one other thing I'd like to do
[22:33:31] <lifeless> is to front-load all the editable and source req handling
[22:33:43] <lifeless> since AIUI they can only be in requirements.txt // direct input
[22:33:54] <lifeless> and we can get rid of all the special handling of named/unnamed in the inner loop
[22:34:26] <dstufft> yes I think that's right
[22:34:36] <dstufft> even with dependency links it's not an editable
[22:34:46] <lifeless> and they are deprecated right?
[22:35:09] <lifeless> are they deprecated enough to remove now?
[22:35:23] <dstufft> we can't remove them because there is a use case for them where we don't have the replacement done yet
[22:35:28] <dstufft> they are deprecated though
[22:35:38] <lifeless> whats the use case and the design replacement?
[22:37:14] <dstufft> "I'm a company with internal projects and I'd rather not have to setup an index and develop tooling to create artifacts for all our internal projects and i'd rather just have them all install from their git sources"
[22:38:12] <lifeless> aww cry. (sorry, had to)
[22:38:26] <lifeless> is there a designed replacement, and how does it differ from an index?
[22:38:51] <dstufft> the replacement is being able to essentially do ``install_requires=["internalthing @ git+https://github.com/dstufft/internalhing.git"]``.. synax might be wrong on that
[22:38:58] <dstufft> and then PyPI would just reject uploads that have that
[22:39:11] <dstufft> so you can't use it on things you release to PyPI, so it'd only be for internal
[22:39:14] <dstufft> sec let me get the real synax
[22:39:15] <lifeless> oh god
[22:39:29] <lifeless> so, perhaps this has been discussed to death
[22:39:32] <lifeless> and if so, sorry
[22:39:44] <lifeless> but an index is at its heart name:metadataforname
[22:39:59] <dstufft> https://www.python.org/dev/peps/pep-0440/#direct-references
[22:40:02] <lifeless> PyPI is name:[versions_with_content]
[22:40:40] <lifeless> wouldn't an index of name:VCS-location be feasible?
[22:41:12] <lifeless> less repetition and thus less fragile
[22:41:57] <tomprince> You need somewhere to host that index, which you don't need, if each package can have that information in it.
[22:42:34] <lifeless> tomprince: you need somewhere to host the git data too
[22:43:16] <lifeless> tomprince: I can totally get the overhead of maintaining pacakge building etc stuff, but a single simple name:value index can be hosted on a github page, for instance
[22:43:28] <lifeless> anyhow, if its already done to death, fine
[22:43:44] <lifeless> I don't want to open old wounds
[22:44:49] <dstufft> lifeless: so you can do that, but it's more work for people who want to do this workflow. It's essentially just letting people work "index-less" by encoding direct references directly in their dependency metadata, a lot of companies are using this ability internally. I generally agree it's not super hard, but I don't believe supporting it is super hard to do (you just essentially skip the index step for that one) and it helps out some class
[22:44:49] <dstufft> of user
[22:45:10] <lifeless> k
[22:45:29] <dstufft> we actually had them removed for a short while
[22:45:31] <dstufft> in develop
[22:45:32] <lifeless> what I want is to be in a position where we're referencing stuff by name always
[22:45:44] <dstufft> and people noticed really quick and opened tickets
[22:45:59] <dstufft> lifeless: so direct references in pep 440 mandate you include a name
[22:46:13] <dstufft> the format is NAME @ LOCATION
[22:46:16] <lifeless> yah
[22:46:20] <lifeless> so, I can deal
[22:46:49] <dstufft> nothing has implemented direct references yet so if we need to change them, it shouldn't be very hard to do so
[22:59:06] <lifeless> dstufft: processing/collecting/obtaining
[22:59:11] <lifeless> dstufft: do we care about that distinction?
[22:59:38] <dstufft> lifeless: don't think we care
[23:21:44] <lifeless> dstufft: to confirm, SpecifierSet is for the algebra about one requirement
[23:22:43] <dstufft> lifeless: you mean it doesn't cross cut for "foo" and "bar"? then yes
[23:25:54] <lifeless> thought so, just being paranoid :)
[23:26:55] <dstufft> it's "set" because it implements the ,
[23:27:14] <dstufft> it's really a container type for multiple Specifier instances, where a Specifier is like >=1.0
[23:31:31] <lifeless> what about extras
[23:31:37] <lifeless> if you depend on foo[bar]
[23:31:42] <lifeless> and another thing depends on foo[quux]
[23:32:01] <lifeless> do you say foo[bar] >= 1.0
[23:32:23] <lifeless> nevermind, off on a tangent
[23:34:17] <lifeless> however this matters
[23:34:24] <lifeless> dstufft: is there a concept of [!bar] ?
[23:34:34] <lifeless> e.g. if A has two extras, foo and bar
[23:34:51] <lifeless> and B: ['A[foo] >1.0']
[23:35:03] <lifeless> and C: ['A[bar, !foo] > 1.0']
[23:35:20] <lifeless> do we select A 2.0 with [foo,bar] as its extras
[23:35:27] <lifeless> or do we select A 2.0 [bar]
[23:35:36] <lifeless> or do we error ?
[23:35:44] <lifeless> assuming the user asked for B, C
[23:38:25] <dstufft> lifeless: not currently, in the future we have wildcards (not wildcards like *foo, but just "*" for, all extras) and we have exclusion like A[foo,-bar] where (currently in PEP 426 at least) the exclusion operator says "do not install this extra at all, even if someone else asks for it"
[23:39:05] <dstufft> lifeless: I should note, this is all in PEP 426 which hasn't been accepted or tested for actual sensibility yet
[23:39:32] <lifeless> ok
[23:39:33] <lifeless> so
[23:39:50] <lifeless> right now, we only have the simple [foo,bar]
[23:39:56] <lifeless> so if I just union all the damn things
[23:40:01] <lifeless> we're good?
[23:41:47] <dstufft> lifeless: ya
[23:41:54] <dstufft> we can deal with PEP 426 later
[23:45:56] <lifeless> I'm going to regress the tracability stuff somewhat with this
[23:46:07] <lifeless> I can't detangle all the dimensions at once well enough
[23:46:22] <lifeless> I'll be happy to add it back in after (even as part of the initial merge)
[23:46:30] <lifeless> just describing the dev arc, setting expectations
[23:46:50] <dstufft> lifeless: ok
[23:47:12] <lifeless> the reason being that X from Y is really X from Y and Z
[23:47:19] <lifeless> except when we backtrack
[23:47:22] <lifeless> and - mind assplode
[23:54:33] <lifeless> dstufft: this is fantasy code, but seeking your thoughts:
[23:54:34] <lifeless> http://paste.ubuntu.com/11001395/