+ two workarounds to get me going on Windows; will be turned into something more organized
* moved initialization of project objects into project-list.js: a) default git url defined in same file as projects; b) need to do it only once
* moved getProject(..) there as well, as initProject(project); made gitUrl a truly optional prop of a project object
+ comment on optional require ./local.js
+ method skip() on project objects, kind of conditional commenting out entire projects.
+ method skipDep(depName,depVersion) on project objects, to decide on a per (project, dependency) basis whether to skip the dep install; allows for additional action to be taken such as get it from somewhere else than thru npm
+ in preparation to move helper functions out of project-list.js: plain copy lib/util.js of project-list.js
  That way I hope to have git see the file history and a future blame will not stop at this commit.
  As of http://markpasc.livejournal.com/186489.html this should reveal the fact:
    git log -C -C --name-status --no-walk
* Refactoring: moved devDir, platformIsWindows() (now: IfOnWin()) and skipOnWindows(..) (now: IfOnWin.AndNameIn(..)) into lib/util.js
+ util.partialApply(..) for partial function application: yields a function that, when invoked, will get the arguments passed to partialApply plus the arguments from the invocation
+ verb Then for our mini DSL, chainable with IfOnWin and AndNameIn; this is for taking some custom action for particular projects and/or npm-dependencies
  usage: Then(f [, arg1 [, arg2 [...]]]), f being the action to take if the condition (the function on which you called .Then) returns true.
         If the condition returns false then f is NOT invoked at all and false is returned as the overall result
         Otherwise the result of partially applying f to any additional args will be invoked passing parameters from the current call and the return value
         of that is the overall result.
* moved warning about skipped npm-dependencies back into buster-dev-tools.js, AndNameIn should *not* be used for side-effects (use the new Then instead)
+ some more helper functions such as assert1stArgIsFunction(..) and toArray(..) (for turning arguments into a regular array)
* buster-dev-tools.js calls project.skipDep("foo@x.y.z"), rather than .skipDep("foo", "x.y.z") as before
* partialApply expects exactly 2 args now: 1st function, 2nd array of arguments to partially apply the 1st arg to
* split up AndNameIn into
  a) the connective And (similar to then, taking a function and optional params that are partially applied), chainable with And and Then
  b) function itMatches(..) for matching semver compliant dependencies / TODO: use npm's semver for this instead of home-brew
- removed unused parameter start of toArray(..)
* project-list.js: put interesting cases on top, including comments
* refactoring: renamed depMatches to itMatches
+ simple util functions onWindows, onMacOS, onLinux; NOT exporting platformIs anymore, only used internally within util.js
* removed IfOnWindows, introducing new connective *If*, chainable with And and Then, to be used with e.g. onWindows
* organized src a bit (sections "Exported helpers", "Internal helpers" and "Logic")
+ util function installDummy, for putting in a minimal package.json in order to prevent npm from trying to install it
* using it for for the contextify workaround on win (dependency of buster-html-doc, thru jsdom)
* moved helper functions directoryExists and quote from buster-dev-tools.js to util.js
+ helper function fileExists, analogous to directoryExists
+ tests for True, False, If, .And and .Then
* split up utilities/helpers from the former util.js into dev-util.js (general), fn-helpers.js (re functions) and connectives.js (True, False, If, .And, .Then)
* renamed dev-util function installDummy to installNpmDummy, to make more clear what it's for
* .gitignoring *.bak files, my editor keeps producing 'em
+ fn-helper-test, dev-util-test (quite some still deferred)
* fixed: partialApply would throw TypeError instead of Error with wrong msg if not passed exactly 2 args
* refactoring: no need to implement `If` by hand - it's simply And.bind(True)
* partialApply(f, args) accepts empty args array and returns just f in that case
* partialApply now simply expects a function as first arg and optionally any number of additional args (before: f and *array of additional args*)
* fixed typo: onMacOS instead of onMaxOS
* refactoring: based "connective" And on Then, removed bogus DEBUG stuff from connectives.js
- inlined assert1stArgIsFunction into partialApply, was the only place it was used
* Connectives always return proper booleans, not just trueish/falsish
+ test "partialApply leaves `this` dynamically scoped"
+ tests for installNpmDummy, directoryExists and fileExists
+/* dev-util exports dependencyKinds (regular, dev, opt); whether to install or not install such is now defined in project-list.js (using new helper fn isOptionalDep),
    not hard-coded anymore in lib/buster-dev-tools.js
- removed toArray() altogether, simply say [].slice.call(..)
+ added buster-dev-tools itself to project-list.js (see https://github.com/busterjs/buster-dev-tools/pull/7 )
+ tests for itMatches and isOptionalDep
* refactored connectives tests to yield more useful feedback in case of failure:
  - separate tests for each truth value in connectives truth table tests
  - only a single test for which properties should be exposed and which shouldn't (prints list of actual / expected props)
+ tests for onWindows, onMacOS, onLinux