Merge remote-tracking branch 'ry/v0.6' into v0.6-merge
authorisaacs <i@izs.me>
Fri, 4 May 2012 22:12:47 +0000 (15:12 -0700)
committerisaacs <i@izs.me>
Fri, 4 May 2012 22:12:47 +0000 (15:12 -0700)
Conflicts:
ChangeLog
Makefile
deps/npm/AUTHORS
deps/npm/html/api/bin.html
deps/npm/html/api/bugs.html
deps/npm/html/api/commands.html
deps/npm/html/api/config.html
deps/npm/html/api/deprecate.html
deps/npm/html/api/docs.html
deps/npm/html/api/edit.html
deps/npm/html/api/explore.html
deps/npm/html/api/help-search.html
deps/npm/html/api/init.html
deps/npm/html/api/install.html
deps/npm/html/api/link.html
deps/npm/html/api/load.html
deps/npm/html/api/ls.html
deps/npm/html/api/npm.html
deps/npm/html/api/outdated.html
deps/npm/html/api/owner.html
deps/npm/html/api/pack.html
deps/npm/html/api/prefix.html
deps/npm/html/api/prune.html
deps/npm/html/api/publish.html
deps/npm/html/api/rebuild.html
deps/npm/html/api/restart.html
deps/npm/html/api/root.html
deps/npm/html/api/run-script.html
deps/npm/html/api/search.html
deps/npm/html/api/shrinkwrap.html
deps/npm/html/api/start.html
deps/npm/html/api/stop.html
deps/npm/html/api/submodule.html
deps/npm/html/api/tag.html
deps/npm/html/api/test.html
deps/npm/html/api/uninstall.html
deps/npm/html/api/unpublish.html
deps/npm/html/api/update.html
deps/npm/html/api/version.html
deps/npm/html/api/view.html
deps/npm/html/api/whoami.html
deps/npm/html/doc/README.html
deps/npm/html/doc/adduser.html
deps/npm/html/doc/bin.html
deps/npm/html/doc/bugs.html
deps/npm/html/doc/build.html
deps/npm/html/doc/bundle.html
deps/npm/html/doc/cache.html
deps/npm/html/doc/changelog.html
deps/npm/html/doc/coding-style.html
deps/npm/html/doc/completion.html
deps/npm/html/doc/config.html
deps/npm/html/doc/deprecate.html
deps/npm/html/doc/developers.html
deps/npm/html/doc/disputes.html
deps/npm/html/doc/docs.html
deps/npm/html/doc/edit.html
deps/npm/html/doc/explore.html
deps/npm/html/doc/faq.html
deps/npm/html/doc/folders.html
deps/npm/html/doc/help-search.html
deps/npm/html/doc/help.html
deps/npm/html/doc/index.html
deps/npm/html/doc/init.html
deps/npm/html/doc/install.html
deps/npm/html/doc/json.html
deps/npm/html/doc/link.html
deps/npm/html/doc/list.html
deps/npm/html/doc/npm.html
deps/npm/html/doc/outdated.html
deps/npm/html/doc/owner.html
deps/npm/html/doc/pack.html
deps/npm/html/doc/prefix.html
deps/npm/html/doc/prune.html
deps/npm/html/doc/publish.html
deps/npm/html/doc/rebuild.html
deps/npm/html/doc/registry.html
deps/npm/html/doc/removing-npm.html
deps/npm/html/doc/restart.html
deps/npm/html/doc/root.html
deps/npm/html/doc/run-script.html
deps/npm/html/doc/scripts.html
deps/npm/html/doc/search.html
deps/npm/html/doc/semver.html
deps/npm/html/doc/shrinkwrap.html
deps/npm/html/doc/star.html
deps/npm/html/doc/start.html
deps/npm/html/doc/stop.html
deps/npm/html/doc/submodule.html
deps/npm/html/doc/tag.html
deps/npm/html/doc/test.html
deps/npm/html/doc/uninstall.html
deps/npm/html/doc/unpublish.html
deps/npm/html/doc/update.html
deps/npm/html/doc/version.html
deps/npm/html/doc/view.html
deps/npm/html/doc/whoami.html
deps/npm/man/man1/npm.1
deps/npm/man/man3/npm.3
deps/npm/package.json
doc/api/url.markdown
lib/http.js
src/node_version.h
test/simple/test-fs-sync-fd-leak.js

299 files changed:
1  2 
AUTHORS
ChangeLog
Makefile
deps/npm/.npmignore
deps/npm/AUTHORS
deps/npm/LICENSE
deps/npm/Makefile
deps/npm/bin/npm-cli.js
deps/npm/bin/npm-get-uid-gid.js
deps/npm/bin/npm.cmd
deps/npm/doc/api/ls.md
deps/npm/doc/cli/changelog.md
deps/npm/doc/cli/coding-style.md
deps/npm/doc/cli/config.md
deps/npm/doc/cli/developers.md
deps/npm/doc/cli/index.md
deps/npm/doc/cli/install.md
deps/npm/doc/cli/json.md
deps/npm/doc/cli/list.md
deps/npm/doc/cli/scripts.md
deps/npm/html/api/bin.html
deps/npm/html/api/bugs.html
deps/npm/html/api/commands.html
deps/npm/html/api/config.html
deps/npm/html/api/deprecate.html
deps/npm/html/api/docs.html
deps/npm/html/api/edit.html
deps/npm/html/api/explore.html
deps/npm/html/api/help-search.html
deps/npm/html/api/init.html
deps/npm/html/api/install.html
deps/npm/html/api/link.html
deps/npm/html/api/load.html
deps/npm/html/api/ls.html
deps/npm/html/api/npm.html
deps/npm/html/api/outdated.html
deps/npm/html/api/owner.html
deps/npm/html/api/pack.html
deps/npm/html/api/prefix.html
deps/npm/html/api/prune.html
deps/npm/html/api/publish.html
deps/npm/html/api/rebuild.html
deps/npm/html/api/restart.html
deps/npm/html/api/root.html
deps/npm/html/api/run-script.html
deps/npm/html/api/search.html
deps/npm/html/api/shrinkwrap.html
deps/npm/html/api/start.html
deps/npm/html/api/stop.html
deps/npm/html/api/submodule.html
deps/npm/html/api/tag.html
deps/npm/html/api/test.html
deps/npm/html/api/uninstall.html
deps/npm/html/api/unpublish.html
deps/npm/html/api/update.html
deps/npm/html/api/version.html
deps/npm/html/api/view.html
deps/npm/html/api/whoami.html
deps/npm/html/doc/README.html
deps/npm/html/doc/adduser.html
deps/npm/html/doc/bin.html
deps/npm/html/doc/bugs.html
deps/npm/html/doc/build.html
deps/npm/html/doc/bundle.html
deps/npm/html/doc/cache.html
deps/npm/html/doc/changelog.html
deps/npm/html/doc/coding-style.html
deps/npm/html/doc/completion.html
deps/npm/html/doc/config.html
deps/npm/html/doc/deprecate.html
deps/npm/html/doc/developers.html
deps/npm/html/doc/disputes.html
deps/npm/html/doc/docs.html
deps/npm/html/doc/edit.html
deps/npm/html/doc/explore.html
deps/npm/html/doc/faq.html
deps/npm/html/doc/folders.html
deps/npm/html/doc/help-search.html
deps/npm/html/doc/help.html
deps/npm/html/doc/index.html
deps/npm/html/doc/init.html
deps/npm/html/doc/install.html
deps/npm/html/doc/json.html
deps/npm/html/doc/link.html
deps/npm/html/doc/list.html
deps/npm/html/doc/npm.html
deps/npm/html/doc/outdated.html
deps/npm/html/doc/owner.html
deps/npm/html/doc/pack.html
deps/npm/html/doc/prefix.html
deps/npm/html/doc/prune.html
deps/npm/html/doc/publish.html
deps/npm/html/doc/rebuild.html
deps/npm/html/doc/registry.html
deps/npm/html/doc/removing-npm.html
deps/npm/html/doc/restart.html
deps/npm/html/doc/root.html
deps/npm/html/doc/run-script.html
deps/npm/html/doc/scripts.html
deps/npm/html/doc/search.html
deps/npm/html/doc/semver.html
deps/npm/html/doc/shrinkwrap.html
deps/npm/html/doc/star.html
deps/npm/html/doc/start.html
deps/npm/html/doc/stop.html
deps/npm/html/doc/submodule.html
deps/npm/html/doc/tag.html
deps/npm/html/doc/test.html
deps/npm/html/doc/uninstall.html
deps/npm/html/doc/unpublish.html
deps/npm/html/doc/update.html
deps/npm/html/doc/version.html
deps/npm/html/doc/view.html
deps/npm/html/doc/whoami.html
deps/npm/html/index.html
deps/npm/lib/bugs.js
deps/npm/lib/cache.js
deps/npm/lib/config.js
deps/npm/lib/docs.js
deps/npm/lib/init.js
deps/npm/lib/install.js
deps/npm/lib/link.js
deps/npm/lib/ls.js
deps/npm/lib/npm.js
deps/npm/lib/outdated.js
deps/npm/lib/rebuild.js
deps/npm/lib/search.js
deps/npm/lib/set.js
deps/npm/lib/unbuild.js
deps/npm/lib/uninstall.js
deps/npm/lib/utils/cmd-shim.js
deps/npm/lib/utils/completion/file-completion.js
deps/npm/lib/utils/config-defs.js
deps/npm/lib/utils/error-handler.js
deps/npm/lib/utils/excludes.js
deps/npm/lib/utils/fetch.js
deps/npm/lib/utils/find-prefix.js
deps/npm/lib/utils/get-agent.js
deps/npm/lib/utils/get.js
deps/npm/lib/utils/ini.js
deps/npm/lib/utils/lifecycle.js
deps/npm/lib/utils/link.js
deps/npm/lib/utils/mkdir-p.js
deps/npm/lib/utils/npm-registry-client/get.js
deps/npm/lib/utils/npm-registry-client/request.js
deps/npm/lib/utils/output.js
deps/npm/lib/utils/read-installed.js
deps/npm/lib/utils/read-json.js
deps/npm/lib/utils/set.js
deps/npm/lib/utils/tar.js
deps/npm/lib/utils/uid-number.js
deps/npm/lib/version.js
deps/npm/lib/view.js
deps/npm/man/man1/README.1
deps/npm/man/man1/adduser.1
deps/npm/man/man1/bin.1
deps/npm/man/man1/bugs.1
deps/npm/man/man1/build.1
deps/npm/man/man1/bundle.1
deps/npm/man/man1/cache.1
deps/npm/man/man1/changelog.1
deps/npm/man/man1/coding-style.1
deps/npm/man/man1/completion.1
deps/npm/man/man1/config.1
deps/npm/man/man1/deprecate.1
deps/npm/man/man1/developers.1
deps/npm/man/man1/disputes.1
deps/npm/man/man1/docs.1
deps/npm/man/man1/edit.1
deps/npm/man/man1/explore.1
deps/npm/man/man1/faq.1
deps/npm/man/man1/folders.1
deps/npm/man/man1/help-search.1
deps/npm/man/man1/help.1
deps/npm/man/man1/index.1
deps/npm/man/man1/init.1
deps/npm/man/man1/install.1
deps/npm/man/man1/json.1
deps/npm/man/man1/link.1
deps/npm/man/man1/list.1
deps/npm/man/man1/npm.1
deps/npm/man/man1/outdated.1
deps/npm/man/man1/owner.1
deps/npm/man/man1/pack.1
deps/npm/man/man1/prefix.1
deps/npm/man/man1/prune.1
deps/npm/man/man1/publish.1
deps/npm/man/man1/rebuild.1
deps/npm/man/man1/registry.1
deps/npm/man/man1/removing-npm.1
deps/npm/man/man1/restart.1
deps/npm/man/man1/root.1
deps/npm/man/man1/run-script.1
deps/npm/man/man1/scripts.1
deps/npm/man/man1/search.1
deps/npm/man/man1/semver.1
deps/npm/man/man1/star.1
deps/npm/man/man1/start.1
deps/npm/man/man1/stop.1
deps/npm/man/man1/submodule.1
deps/npm/man/man1/tag.1
deps/npm/man/man1/test.1
deps/npm/man/man1/uninstall.1
deps/npm/man/man1/unpublish.1
deps/npm/man/man1/update.1
deps/npm/man/man1/version.1
deps/npm/man/man1/view.1
deps/npm/man/man1/whoami.1
deps/npm/man/man3/bin.3
deps/npm/man/man3/bugs.3
deps/npm/man/man3/commands.3
deps/npm/man/man3/config.3
deps/npm/man/man3/deprecate.3
deps/npm/man/man3/docs.3
deps/npm/man/man3/edit.3
deps/npm/man/man3/explore.3
deps/npm/man/man3/help-search.3
deps/npm/man/man3/init.3
deps/npm/man/man3/install.3
deps/npm/man/man3/link.3
deps/npm/man/man3/load.3
deps/npm/man/man3/ls.3
deps/npm/man/man3/npm.3
deps/npm/man/man3/outdated.3
deps/npm/man/man3/owner.3
deps/npm/man/man3/pack.3
deps/npm/man/man3/prefix.3
deps/npm/man/man3/prune.3
deps/npm/man/man3/publish.3
deps/npm/man/man3/rebuild.3
deps/npm/man/man3/restart.3
deps/npm/man/man3/root.3
deps/npm/man/man3/run-script.3
deps/npm/man/man3/search.3
deps/npm/man/man3/start.3
deps/npm/man/man3/stop.3
deps/npm/man/man3/submodule.3
deps/npm/man/man3/tag.3
deps/npm/man/man3/test.3
deps/npm/man/man3/uninstall.3
deps/npm/man/man3/unpublish.3
deps/npm/man/man3/update.3
deps/npm/man/man3/version.3
deps/npm/man/man3/view.3
deps/npm/man/man3/whoami.3
deps/npm/node_modules/block-stream/package.json
deps/npm/node_modules/fast-list/.npmignore
deps/npm/node_modules/fast-list/.travis.yml
deps/npm/node_modules/fast-list/README.md
deps/npm/node_modules/fast-list/fast-list.js
deps/npm/node_modules/fast-list/package.json
deps/npm/node_modules/fstream/.npmignore
deps/npm/node_modules/fstream/lib/abstract.js
deps/npm/node_modules/fstream/lib/dir-reader.js
deps/npm/node_modules/fstream/lib/dir-writer.js
deps/npm/node_modules/fstream/lib/link-writer.js
deps/npm/node_modules/fstream/lib/proxy-reader.js
deps/npm/node_modules/fstream/lib/reader.js
deps/npm/node_modules/fstream/lib/writer.js
deps/npm/node_modules/fstream/package.json
deps/npm/node_modules/graceful-fs/graceful-fs.js
deps/npm/node_modules/graceful-fs/package.json
deps/npm/node_modules/inherits/LICENSE
deps/npm/node_modules/inherits/package.json
deps/npm/node_modules/minimatch/README.md
deps/npm/node_modules/minimatch/minimatch.js
deps/npm/node_modules/minimatch/package.json
deps/npm/node_modules/mkdirp/README.markdown
deps/npm/node_modules/mkdirp/index.js
deps/npm/node_modules/mkdirp/package.json
deps/npm/node_modules/read/lib/read.js
deps/npm/node_modules/read/package.json
deps/npm/node_modules/request/README.md
deps/npm/node_modules/request/forever.js
deps/npm/node_modules/request/main.js
deps/npm/node_modules/request/mimetypes.js
deps/npm/node_modules/request/oauth.js
deps/npm/node_modules/request/package.json
deps/npm/node_modules/request/vendor/cookie/index.js
deps/npm/node_modules/rimraf/AUTHORS
deps/npm/node_modules/rimraf/README.md
deps/npm/node_modules/rimraf/fiber.js
deps/npm/node_modules/rimraf/package.json
deps/npm/node_modules/rimraf/rimraf.js
deps/npm/node_modules/tar/lib/extract.js
deps/npm/node_modules/tar/package.json
deps/npm/node_modules/which/package.json
deps/npm/node_modules/which/which.js
deps/npm/package.json
deps/npm/scripts/index-build.js
deps/npm/test/packages/npm-test-env-reader/package.json
deps/npm/test/packages/npm-test-env-reader/test.sh
deps/npm/test/packages/npm-test-files/package.json
deps/npm/test/packages/npm-test-optional-deps/package.json
deps/uv/src/unix/error.c
doc/api/child_process.markdown
doc/api/url.markdown
lib/fs.js
test/simple/test-domain-implicit-fs.js

diff --cc AUTHORS
index 38de58b7cc9c40084ba5713398bfe1efa2dfd428,d6fbb80444808946a97895552a86626884e2c83d..14496bd7e3bb3065302ce31bb5a3ac859ec11bda
+++ b/AUTHORS
@@@ -268,36 -268,12 +268,41 @@@ Paddy Byers <paddy.byers@gmail.com
  Seth Fitzsimmons <seth@mojodna.net>
  Einar Otto Stangvik <einaros@gmail.com>
  Paul Vorbach <paul@vorb.de>
 -tedsuo <ted@radicaldesigns.org>
 +Luke Gallagher <notfornoone@gmail.com>
 +Tomasz Buchert <tomek.buchert@gmail.com>
 +Myles Byrne <myles@myles.id.au>
 +T.C. Hollingsworth <tchollingsworth@gmail.com>
 +Cam Pedersen <diffference@gmail.com>
 +Roly Fentanes <roly426@gmail.com>
 +Ted Young <ted@radicaldesigns.org>
  Joshua Holbrook <josh.holbrook@gmail.com>
 +Blake Miner <miner.blake@gmail.com>
 +Vincent Ollivier <contact@vincentollivier.com>
 +Jimb Esser <jimb@railgun3d.com>
 +Sambasiva Suda <sambasivarao@gmail.com>
 +Sadique Ali <sadiqalikm@gmail.com>
 +Dmitry Nizovtsev <dmitry@ukrteam.com>
 +Alex Kocharin <rlidwka@kocharin.ru>
 +Ming Liu <vmliu1@gmail.com>
 +Shea Levy <shea@shealevy.com>
 +Nao Iizuka <iizuka@kyu-mu.net>
 +Christian Ress <christian@ressonline.de>
  Rod Vagg <rod@vagg.org>
 +Matt Ezell <ezell.matt@gmail.com>
 +Charlie McConnell <charlie@charlieistheman.com>
 +Farid Neshat <FaridN_SOAD@yahoo.com>
 +Johannes Wüller <johanneswueller@gmail.com>
 +Erik Lundin <mjor.himself@gmail.com>
 +Mikael Bourges-Sevenier <mikeseven@gmail.com>
 +Yosef Dinerstein <yosefd@microsoft.com>
 +Nathan Friedly <nathan@nfriedly.com>
 +Aaron Jacobs <jacobsa@google.com>
 +Mustansir Golawala <mgolawala@gmail.com>
 +fukayatsu <fukayatsu@gmail.com>
 +Domenic Denicola <domenic@domenicdenicola.com>
  Bryan Cantrill <bryan@joyent.com>
+ lrn@chromium.org <lrn@chromium.org>
+ Dane Springmeyer <dane@dbsgeo.com>
+ Sambasiva Suda <sambasivarao@gmail.com>
+ Vincent Voyer <v@fasterize.com>
+ ANDO Takahiro <takahiro.ando@gmail.com>
diff --cc ChangeLog
index 1d4f8667d117c22738e546c82862734e261683cf,dc676bae841a67b657b3d2a856f4478937261554..b66faae59e1dc81505b3db30fd34f6a6255fd976
+++ b/ChangeLog
 -2012.05.04 Version 0.6.17 (stable)
 +2012.04.18, Version 0.7.8, (unstable)
 +
 +* Upgrade V8 to 3.9.24.9
 +
 +* Upgrade OpenSSL to 1.0.0f
 +
 +* Upgrade npm to 1.1.18
 +
 +* Show licenses in Binary installers
 +
 +* Domains (isaacs)
 +
 +* readline: rename "end" to "close" (Nathan Rajlich)
 +
 +* tcp: make getsockname() return address family as string (Shigeki Ohtsu)
 +
 +* http, https: fix .setTimeout() (ssuda)
 +
 +* os: add cross platform EOL character (Mustansir Golawala)
 +
 +* typed arrays: unexport SizeOfArrayElementForType() (Aaron Jacobs)
 +
 +* net: honor 'enable' flag in .setNoDelay() (Ben Noordhuis)
 +
 +* child_process: emit error when .kill fails (Andreas Madsen)
 +
 +* gyp: fix 'argument list too long' build error (Ben Noordhuis)
 +
 +* fs.WriteStream: Handle modifications to fs.open (isaacs)
 +
 +* repl, readline: Handle newlines better (Nathan Rajlich, Nathan Friedly)
 +
 +* build: target OSX 10.5 when building on darwin (Nathan Rajlich)
 +
 +* Fix #3052 Handle errors properly in zlib (isaacs)
 +
 +* build: add support for DTrace and postmortem (Dave Pacheco)
 +
 +* core: add reusable Slab allocator (Ben Noordhuis)
 +
 +
 +2012.03.30, Version 0.7.7 (unstable), 5cda2542fdb086f9fe5de889bea435a65e377dea
 +
 +* Upgrade V8 to 3.9.24.7
 +
 +* Upgrade npm to 1.1.15
 +
 +* Handle Emoji characters properly (Erik Corry, Bert Belder)
 +
 +* readline: migrate ansi/vt100 logic from tty to readline (Nathan Rajlich)
 +
 +* readline: Fix multiline handling (Alex Kocharin)
 +
 +* add a -i/--interactive flag to force the REPL (Nathan Rajlich)
 +
 +* debugger: add breakOnException command (Fedor Indutny)
 +
 +* cluster: kill workers when master dies (Andreas Madsen)
 +
 +* cluster: add graceful disconnect support (Andreas Madsen)
 +
 +* child_process: Separate 'close' event from 'exit' (Charlie McConnell)
 +
 +* typed arrays: add Uint8ClampedArray (Mikael Bourges-Sevenier)
 +
 +* buffer: Fix byte alignment issues (Ben Noordhuis, Erik Lundin)
 +
 +* tls: fix CryptoStream.setKeepAlive() (Shigeki Ohtsu)
 +
 +* Expose http parse error codes (Felix Geisendörfer)
 +
 +* events: don't delete the listeners array (Ben Noordhuis, Nathan Rajlich)
 +
 +* process: add process.config to view node's ./configure settings (Nathan Rajlich)
 +
 +* process: process.execArgv to see node's arguments (Micheil Smith)
 +
 +* process: fix process.title setter (Ben Noordhuis)
 +
 +* timers: handle negative or non-numeric timeout values (Ben Noordhuis)
 +
 +
 +2012.03.13, Version 0.7.6 (unstable), f06abda6f58e517349d1b63a2cbf5a8d04a03505
 +
 +* Upgrade v8 to 3.9.17
 +
 +* Upgrade npm to 1.1.8
 +  - Add support for os/cpu fields in package.json (Adam Blackburn)
 +  - Automatically node-gyp packages containing a binding.gyp
 +  - Fix failures unpacking in UNC shares
 +  - Never create un-listable directories
 +  - Handle cases where an optionalDependency fails to build
 +
 +* events: newListener emit correct fn when using 'once' (Roly Fentanes)
 +
 +* url: Ignore empty port component (Łukasz Walukiewicz)
 +
 +* module: replace 'children' array (isaacs)
 +
 +* tls: parse multiple values of a key in ssl certificate (Sambasiva Suda)
 +
 +* cluster: support passing of named pipes (Ben Noordhuis)
 +
 +* Windows: include syscall in fs errors (Bert Belder)
 +
 +* http: #2888 Emit end event only once (Igor Zinkovsky)
 +
 +* readline: add multiline support (Rlidwka)
 +
 +* process: add `process.hrtime()` (Nathan Rajlich)
 +
 +* net, http, https: add localAddress option (Dmitry Nizovtsev)
 +
 +* addon improvements (Nathan Rajlich)
 +
 +* build improvements (Ben Noordhuis, Sadique Ali, T.C. Hollingsworth, Nathan Rajlich)
 +
 +* add support for "SEARCH" request methods (Nathan Rajlich)
 +
 +* expose the zlib and http_parser version in process.versions (Nathan Rajlich)
 +
 +
 +2012.02.23, Version 0.7.5 (unstable), d384b8b0d2ab7f05465f0a3e15fe20b4e25b5f86
 +
 +* startup speed improvements (Maciej Małecki)
 +
 +* crypto: add function getDiffieHellman() (Tomasz Buchert)
 +
 +* buffer: support decoding of URL-safe base64 (Ben Noordhuis)
 +
 +* Make QueryString.parse() even faster (Brian White)
 +
 +* url: decode url entities in auth section (Ben Noordhuis)
 +
 +* http: support PURGE request method (Ben Noordhuis)
 +
 +* http: Generate Date headers on responses (Mark Nottingham)
 +
 +* Fix #2762: Add callback to close function. (Mikeal Rogers)
 +
 +* dgram: fix out-of-bound memory read (Ben Noordhuis)
 +
 +* repl: add automatic loading of built-in libs (Brandon Benvie)
 +
 +* repl: remove double calls where possible (Fedor Indutny)
 +
 +* Readline improvements. Related: #2737 #2756 (Colton Baker)
 +
 +* build: disable -fomit-frame-pointer on solaris (Dave Pacheco)
 +
 +* build: arch detection improvements (Nathan Rajlich)
 +
 +* build: Make a fat binary for the OS X `make pkg`. (Nathan Rajlich)
 +
 +* jslint src/ and lib/ on 'make test' (isaacs)
 +
 +
 +
 +2012.02.14, Version 0.7.4 (unstable), de21de920cf93ec40736ada3792a7f85f3eadeda
 +
 +* Upgrade V8 to 3.9.5
 +
 +* Upgrade npm to 1.1.1
 +
 +* build: Detect host_arch better (Karl Skomski)
 +
 +* debugger: export `debug_port` to `process` (Fedor Indutny)
 +
 +* api docs: CSS bug fixes (isaacs)
 +
 +* build: use -fPIC for native addons on UNIX (Nathan Rajlich)
 +
 +* Re-add top-level v8::Locker (Marcel Laverdet)
 +
 +* Move images out of the dist tarballs (isaacs)
 +
 +* libuv: Remove uv_export and uv_import (Ben Noordhuis)
 +
 +* build: Support x64 build on Windows (Igor Zinkovsky)
 +
 +
 +2012.02.07, Version 0.7.3 (unstable), 99059aad8d654acda4abcfaa68df182b50f2ec90
 +
 +* Upgrade V8 to 3.9.2
 +
 +* Revert support for isolates. (Ben Noordhuis)
 +
 +* cluster: Cleanup docs, event handling, and process.disconnect (Andreas Madsen)
 +
 +* gyp_addon: link with node.lib on Windows (Nathan Rajlich)
 +
 +* http: fix case where http-parser is freed twice (koichik)
 +
 +* Windows: disable RTTI and exceptions (Bert Belder)
 +
 +
 +2012.02.01, Version 0.7.2 (unstable), ec79acb3a6166e30f0bf271fbbfda1fb575b3321
 +
 +* Update V8 to 3.8.9
 +
 +* Support for sharing streams across Isolates (Igor Zinkovsky)
 +
 +* #2636 - Fix case where http_parsers are freed too early (koichik)
 +
 +* url: Support for IPv6 addresses in URLs (Łukasz Walukiewicz)
 +
 +* child_process: Add disconnect() method to child processes (Andreas Madsen)
 +
 +* fs: add O_EXCL support, exclusive open file (Ben Noordhuis)
 +
 +* fs: more specific error messages (Tj Holowaychuk)
 +
 +* tty: emit 'unknown' key event if key sequence not found (Dan VerWeire, Nathan Rajlich)
 +
 +* build: compile release build too if BUILDTYPE=Debug (Ben Noordhuis)
 +
 +* module: fix --debug-brk on symlinked scripts (Fedor Indutny)
 +
 +* zlib: fix `Failed to set dictionary` issue (Fedor Indutny)
 +
 +* waf: predict target arch for OS X (Fedor Indutny)
 +
 +
 +2012.01.23, Version 0.7.1 (unstable), a74354735ab5d5b0fa35a1e4ff7e653757d2069b
 +
 +* Update V8 to 3.8.8
 +
 +* Install node-waf by default (Fedor Indutny)
 +
 +* crypto: Add ability to turn off PKCS padding (Ingmar Runge)
 +
 +* v8: implement VirtualMemory class on SunOS (Ben Noordhuis)
 +
 +* Add cluster.setupMaster (Andreas Madsen)
 +
 +* move `path.exists*` to `fs.exists*` (Maciej Małecki)
 +
 +* typed arrays: set class name (Ben Noordhuis)
 +
 +* libuv bug fixes (Igor Zinkovsky, Ben Noordhuis, Dan VerWeire)
 +
 +
 +2012.01.16, Version 0.7.0 (unstable), 9cc55dca6f67a6096c858b841c677b0593404321
 +
 +* Upgrade V8 to 3.8.6
 +
 +* Use GYP build system on unix (Ben Noordhuis)
 +
 +* Experimenetal isolates support (Ben Noordhuis)
 +
 +* Improvements to Cluster API (Andreas Madsen)
 +
 +* Use isolates for internal debugger (Fedor Indutny)
 +
 +* Bug fixes
 +
 +
- 2012.04.09 Version 0.6.15 (stable)
++2012.05.04 Version 0.6.17 (stable), 4ced23deaf36493f4303a18f6fdce768c58becc0
+ * Upgrade npm to 1.1.21
+ * uv: Add support for EROFS errors (Ben Noordhuis, Maciej Małecki)
+ * uv: Add support for EIO and ENOSPC errors (Fedor Indutny)
+ * windows: Add support for EXDEV errors (Bert Belder)
+ * http: Fix client memory leaks (isaacs, Vincent Voyer)
+ * fs: fix file descriptor leak in sync functions (Ben Noordhuis)
+ * fs: fix ReadStream / WriteStream double close bug (Ben Noordhuis)
+ 2012.04.30 Version 0.6.16 (stable), a1d193963ddc80a27da5da01b59751e14e33d1d6
+ * Upgrade V8 to 3.6.6.25
+ * Upgrade npm to 1.1.19
+ * Windows: add mappings for UV_ENOENT (Bert Belder)
+ * linux: add IN_MOVE_SELF to inotify event mask (Ben Noordhuis)
+ * unix: call pipe handle connection cb on accept() error (Ben Noordhuis)
+ * unix: handle EWOULDBLOCK (Ben Noordhuis)
+ * map EWOULDBLOCK to UV_EAGAIN (Ben Noordhuis)
+ * Map ENOMEM to UV_ENOMEM (isaacs)
+ * Child process: support the `gid` and `uid` options (Bert Belder)
+ * test: cluster: add worker death event test (Ben Noordhuis)
+ * typo in node_http_parser (isaacs)
+ * http_parser: Eat CRLF between requests, even on connection:close. (Ben Noordhuis)
+ * don't check return value of unsetenv (Ben Noordhuis)
+ 2012.04.09 Version 0.6.15 (stable), f160a45b254e591eb33716311c92be533c6d86c4
  
  * Update npm to 1.1.16
  
diff --cc Makefile
Simple merge
index 5ddef356000e30f9dbf45e31e2f25b201bba4cee,5ddef356000e30f9dbf45e31e2f25b201bba4cee..6ab186883a59ee8e2709197c909a1280635af83c
@@@ -11,7 -11,7 +11,3 @@@ npm-debug.lo
  ./npmrc
  .gitignore
  release/
--
--# don't ignore .npmignore files
--# these are used in some tests.
--!.npmignore
index 8bd425c58d9781aafc6265a57989b4ac39d55267,a2b8141d701ad5a68d64071801cd0013d3d2eaff..c977af8c48bb5b5c5abd63a68bd678c3b97defb6
@@@ -51,16 -51,17 +51,3 @@@ Stephen Sugden <glurgle@gmail.com
  Gautham Pai <buzypi@gmail.com>
  David Trejo <david.daniel.trejo@gmail.com>
  Paul Vorbach <paul@vorb.de>
--George Ornbo <george@shapeshed.com>
--Tim Oxley <secoif@gmail.com>
--Tyler Green <tyler.green2@gmail.com>
--atomizer <danila.gerasimov@gmail.com>
--Rod Vagg <rod@vagg.org>
--Christian Howe <coderarity@gmail.com>
--Andrew Lunny <alunny@gmail.com>
--Henrik Hodne <dvyjones@binaryhex.com>
--Adam Blackburn <regality@gmail.com>
--Kris Windham <kriswindham@gmail.com>
--Jens Grunert <jens.grunert@gmail.com>
--Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
--Dalmais Maxence <github@maxired.fr>
 -Marcus Ekwall <marcus.ekwall@gmail.com>
index c94425929d3df15f653a83319090a502cda7ed14,c94425929d3df15f653a83319090a502cda7ed14..71ca385bdfe228cf2f1e938ca65a87447eb65264
@@@ -1,4 -1,4 +1,4 @@@
--Copyright 2009-2012, Isaac Z. Schlueter (the "Original Author")
++Copyright 2009, 2010, 2011 Isaac Z. Schlueter (the "Author")
  All rights reserved.
  
  MIT +no-false-attribs License
@@@ -20,9 -20,9 +20,9 @@@ by the recipients as they would use th
  containing modifications that substantially alter, remove, or
  disable functionality of the Software, outside of the documented
  configuration mechanisms provided by the Software, shall be
--modified such that the Original Author's bug reporting email
--addresses and urls are either replaced with the contact information
--of the parties responsible for the changes, or removed entirely.
++modified such that the Author's bug reporting email addresses and
++urls are either replaced with the contact information of the
++parties responsible for the changes, or removed entirely.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
@@@ -36,7 -36,7 +36,7 @@@ OTHER DEALINGS IN THE SOFTWARE
  
  Except where noted, this license applies to any and all software
  programs and associated documentation files created by the
--Original Author, when distributed with the Software.
++Author, when distributed with the Software.
  
  "Node.js" and "node" trademark Joyent, Inc. npm is not officially
  part of the Node.js project, and is neither owned by nor
@@@ -49,11 -49,11 +49,13 @@@ and are not covered by this license
  "npm Logo" created by Mathias Pettersson and Brian Hammond,
  used with permission.
  
++This program includes a BSDTar/LibArchive version 2.8.3-1 binary,
++originally distributed as part of the MinGW suite, compiled for
++Win32, according to the terms of the BSD license.
++See deps/basic-bsdtar-2.8.3-1-ming32-bin/basic-bsdtar.LICENSE.
++
  This program uses "node-uuid", Copyright (c) 2010 Robert Kieffer,
  according to the terms of the MIT license.
  
  This program uses "request", Copyright (c) 2011 Mikeal Rogers,
  according to the terms of the Apache license.
--
--This program uses "mkdirp",  Copyright (c) 2010 James Halliday,
--according to the terms of the MIT/X11 license.
index 19efd815c92b6c917a48c8b7d36c85d8c29fe05a,19efd815c92b6c917a48c8b7d36c85d8c29fe05a..415a1b3d6864282b4eb9ef248d19f652c76bce9e
@@@ -123,7 -123,7 +123,7 @@@ doc-publish: do
        rsync -vazu --stats --no-implied-dirs --delete html/api/ npmjs.org:/var/www/npmjs.org/public/api
  
  zip-publish: release
--      scp release/* npmjs.org:/var/www/npmjs.org/public/dist/
++      scp release/*.zip npmjs.org:/var/www/npmjs.org/public/dist/
  
  release:
        @bash scripts/release.sh
index f29437093e57c0c9c7d46aa53f9f1a7852cc1f92,f29437093e57c0c9c7d46aa53f9f1a7852cc1f92..e0b9f20bb84acc530c3cfd413698344550a204e0
@@@ -49,13 -49,13 +49,6 @@@ if (conf.version) 
    return
  }
  
--if (conf.versions) {
--  var v = process.versions
--  v.npm = npm.version
--  console.log(v)
--  return
--}
--
  log.info("npm@"+npm.version, "using")
  log.info("node@"+process.version, "using")
  
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..390e0f2fc9a821ede462c10f1f90f1e836ceed0d
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,16 @@@
++var argv = process.argv.slice(2)
++  , user = argv[0] || process.getuid()
++  , group = argv[1] || process.getgid()
++
++if (!isNaN(user)) user = +user
++if (!isNaN(group)) group = +group
++
++console.error([user, group])
++
++try {
++  process.setgid(group)
++  process.setuid(user)
++  console.log(JSON.stringify({uid:+process.getuid(), gid:+process.getgid()}))
++} catch (ex) {
++  console.log(JSON.stringify({error:ex.message,errno:ex.errno}))
++}
index 7720e20529ccb63c56755f3852cd98e55cb2ee2f,7720e20529ccb63c56755f3852cd98e55cb2ee2f..bac9e5f1c4c50e5a1b7ba5e2cd0876e897fde84e
@@@ -1,6 -1,6 +1,6 @@@
  :: Created by npm, please don't edit manually.\r
--@IF EXIST "%~dp0\node.exe" (\r
--  "%~dp0\node.exe" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*\r
++@IF EXIST "%~dp0"\"node.exe" (\r
++  "%~dp0"\"node.exe"  "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*\r
  ) ELSE (\r
--  node "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*\r
--)\r
++  node  "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*\r
++)
index ed890ff146941b30a305bca50759e125545275e1,ed890ff146941b30a305bca50759e125545275e1..a6c0a13821165f1a002ce5090c425f1974bddd99
@@@ -21,12 -21,12 +21,6 @@@ It will print out extraneous, missing, 
  If the silent parameter is set to true, nothing will be output to the screen,
  but the data will still be returned.
  
--Callback is provided an error if one occurred, the full data about which
--packages are installed and which dependencies they will receive, and a
--"lite" data object which just shows which versions are installed where.
--Note that the full data object is a circular structure, so care must be
--taken if it is serialized to JSON.
--
  ## CONFIGURATION
  
  ### long
index 64feeacda8113b7a29ab6d607043f1d62eaf5473,64feeacda8113b7a29ab6d607043f1d62eaf5473..0115405ca01d2345fddae35c1a0d81f7a580deea
@@@ -3,50 -3,50 +3,6 @@@ npm-changelog(1) -- Change
  
  ## HISTORY
  
--### 1.1.3, 1.1.4
--
--* Update request to support HTTPS-over-HTTP proxy tunneling
--* Throw on undefined envs in config settings
--* Update which to 1.0.5
--* Fix windows UNC busyloop in findPrefix
--* Bundle nested bundleDependencies properly
--* Alias adduser to add-user
--* Doc updates  (Christian Howe, Henrik Hodne, Andrew Lunny)
--* ignore logfd/outfd streams in makeEnv() (Rod Vagg)
--* shrinkwrap: Behave properly with url-installed deps
--* install: Support --save with url install targets
--* Support installing naked tars or single-file modules from urls etc.
--* init: Don't add engines section
--* Don't run make clean on rebuild
--* Added missing unicode replacement (atomizer)
--
--### 1.1.2
--
--Dave Pacheco (2):
--      add "npm shrinkwrap"
--
--Martin Cooper (1):
--      Fix #1753 Make a copy of the cached objects we'll modify.
--
--Tim Oxley (1):
--      correctly remove readme from default npm view command.
--
--Tyler Green (1):
--      fix #2187 set terminal columns to Infinity if 0
--
--isaacs (19):
--      update minimatch
--      update request
--      Experimental: single-file modules
--      Fix #2172 Don't remove global mans uninstalling local pkgs
--      Add --versions flag to show the version of node as well
--      Support --json flag for ls output
--      update request to 2.9.151
--
--### 1.1  
--* Replace system tar dependency with a JS tar
--* Continue to refine
--
  ### 1.0  
  * Greatly simplified folder structure 
  * Install locally (bundle by default) 
index 42ac1d785f80030ad0d0ba4d94b73ee6118b1b7e,42ac1d785f80030ad0d0ba4d94b73ee6118b1b7e..5315c575c18c219a63c454508996f55635cf30c9
@@@ -59,8 -59,8 +59,8 @@@ Don't use them except in four situation
  * `for (;;)` loops.  They're actually required.
  * null loops like: `while (something) ;` (But you'd better have a good
    reason for doing that.)
--* `case "foo": doSomething(); break`
--* In front of a leading `(` or `[` at the start of the line.
++* case "foo": doSomething(); break
++* In front of a leading ( or [ at the start of the line.
    This prevents the expression from being interpreted
    as a function call or property access, respectively.
  
index 3fd9cb82699e1d51054f25051002a05bf1777cb5,3fd9cb82699e1d51054f25051002a05bf1777cb5..2c6ca26c02b16039ecc4ffad62752ab506f640cb
@@@ -115,8 -115,8 +115,6 @@@ The following shorthands are parsed on 
  * `-l`: `--long`
  * `-desc`: `--description`
  * `-S`: `--save`
--* `-D`: `--save-dev`
--* `-O`: `--save-optional`
  * `-y`: `--yes`
  * `-n`: `--yes false`
  * `ll` and `la` commands: `ls --long`
@@@ -220,28 -220,28 +218,6 @@@ See also the `strict-ssl` config
  
  The location of npm's cache directory.  See `npm-cache(1)`
  
--### cache-max
--
--* Default: Infinity
--* Type: Number
--
--The maximum time (in seconds) to keep items in the registry cache before
--re-checking against the registry.
--
--Note that no purging is done unless the `npm cache clean` command is
--explicitly used, and that only GET requests use the cache.
--
--### cache-min
--
--* Default: 0
--* Type: Number
--
--The minimum time (in seconds) to keep items in the registry cache before
--re-checking against the registry.
--
--Note that no purging is done unless the `npm cache clean` command is
--explicitly used, and that only GET requests use the cache.
--
  ### color
  
  * Default: true on Posix, false on Windows
@@@ -360,13 -360,13 +336,6 @@@ user
  
  A proxy to use for outgoing https requests.
  
--### user-agent
--
--* Default: npm/{npm.version} node/{process.version}
--* Type: String
--
--Sets a User-Agent to the request header
--
  ### ignore
  
  * Default: ""
@@@ -384,7 -384,7 +353,7 @@@ The value `npm init` should use by defa
  
  ### init.author.name
  
--* Default: ""
++* Default: "0.0.0"
  * Type: String
  
  The value `npm init` should use by default for the package author's name.
@@@ -403,17 -403,17 +372,6 @@@ The value `npm init` should use by defa
  
  The value `npm init` should use by default for the package author's homepage.
  
--### json
--
--* Default: false
--* Type: Boolean
--
--Whether or not to output JSON data, rather than the normal output.
--
--This feature is currently experimental, and the output data structures
--for many commands is either not implemented in JSON yet, or subject to
--change.  Only the output from `npm ls --json` is currently valid.
--
  ### link
  
  * Default: false
@@@ -586,24 -586,24 +544,6 @@@ Save installed packages to a package.js
  
  Only works if there is already a package.json file present.
  
--### save-dev
--
--* Default: false
--* Type: Boolean
--
--Save installed packages to a package.json file as devDependencies.
--
--Only works if there is already a package.json file present.
--
--### save-optional
--
--* Default: false
--* Type: Boolean
--
--Save installed packages to a package.json file as optionalDependencies.
--
--Only works if there is already a package.json file present.
--
  ### searchopts
  
  * Default: ""
@@@ -742,16 -742,16 +682,6 @@@ If true, output the npm version and exi
  
  Only relevant when specified explicitly on the command line.
  
--### versions
--
--* Default: false
--* Type: boolean
--
--If true, output the npm version as well as node's `process.versions`
--hash, and exit successfully.
--
--Only relevant when specified explicitly on the command line.
--
  ### viewer
  
  * Default: "man" on Posix, "browser" on Windows
index 7ab905bfa0c2db5489b05607150f4e40f7d48b0d,7ab905bfa0c2db5489b05607150f4e40f7d48b0d..9123f35a33bd3f753aa82fce9635014ce816890d
@@@ -27,23 -27,23 +27,12 @@@ A package is
  * d) a `<name>@<version>` that is published on the registry with (c)
  * e) a `<name>@<tag>` that points to (d)
  * f) a `<name>` that has a "latest" tag satisfying (e)
--* g) a `git` url that, when cloned, results in (a).
  
  Even if you never publish your package, you can still get a lot of
  benefits of using npm if you just want to write a node program (a), and
  perhaps if you also want to be able to easily install it elsewhere
  after packing it up into a tarball (b).
  
--Git urls can be of the form:
--
--    git://github.com/user/project.git#commit-ish
--    git+ssh://user@hostname:project.git#commit-ish
--    git+http://user@hostname/project/blah.git#commit-ish
--    git+https://user@hostname/project/blah.git#commit-ish
--
--The `commit-ish` can be any tag, sha, or branch which can be supplied as
--an argument to `git checkout`.  The default is `master`.
--
  ## The package.json File
  
  You need to have a `package.json` file in the root of your project to do
index ee88f3d8f37a393de3ee92894543c9bc7bc7848f,ee88f3d8f37a393de3ee92894543c9bc7bc7848f..5a9b99be19630204e8630b336960a0a706524131
@@@ -170,10 -170,10 +170,6 @@@ npm-index(1) -- Index of all npm docume
  
   The semantic versioner for npm
  
--## npm-shrinkwrap(1)
--
-- Lock down dependency versions
--
  ## npm-star(1)
  
   Mark your favorite packages
  
   Search for packages
  
--## npm-shrinkwrap(3)
--
-- programmatically generate package shrinkwrap file
--
  ## npm-start(3)
  
   Start a package
index cfa95e722971d0c05ff69705d419a9a6fd85b026,cfa95e722971d0c05ff69705d419a9a6fd85b026..22eb8234e7b5f45bc3764a46b59e1d34a1af9f36
@@@ -7,17 -7,17 +7,14 @@@ npm-install(1) -- Install a packag
      npm install <tarball file>
      npm install <tarball url>
      npm install <folder>
--    npm install <name> [--save|--save-dev|--save-optional]
++    npm install <name>
      npm install <name>@<tag>
      npm install <name>@<version>
      npm install <name>@<version range>
--    npm install <name>@<version range>
  
  ## DESCRIPTION
  
--This command installs a package, and any packages that it depends on. If the
--package has a shrinkwrap file, the installation of dependencies will be driven
--by that. See npm-shrinkwrap(1).
++This command installs a package, and any packages that it depends on.
  
  A `package` is:
  
@@@ -36,116 -36,116 +33,88 @@@ after packing it up into a tarball (b)
  
  
  * `npm install` (in package directory, no arguments):
++  Install the dependencies in the local node_modules folder.
  
--    Install the dependencies in the local node_modules folder.
--
--    In global mode (ie, with `-g` or `--global` appended to the command),
--    it installs the current package context (ie, the current working
--    directory) as a global package.
--
++  In global mode (ie, with `-g` or `--global` appended to the command),
++  it installs the current package context (ie, the current working
++  directory) as a global package.
  
  * `npm install <folder>`:
--
--    Install a package that is sitting in a folder on the filesystem.
++  Install a package that is sitting in a folder on the filesystem.
  
  * `npm install <tarball file>`:
++  Install a package that is sitting on the filesystem.  Note: if you just want
++  to link a dev directory into your npm root, you can do this more easily by
++  using `npm link`.
  
--    Install a package that is sitting on the filesystem.  Note: if you just want
--    to link a dev directory into your npm root, you can do this more easily by
--    using `npm link`.
--
--    Example:
++  Example:
  
--          npm install ./package.tgz
++        npm install ./package.tgz
  
  * `npm install <tarball url>`:
++  Fetch the tarball url, and then install it.  In order to distinguish between
++  this and other options, the argument must start with "http://" or "https://"
  
--    Fetch the tarball url, and then install it.  In order to distinguish between
--    this and other options, the argument must start with "http://" or "https://"
--
--    Example:
--
--          npm install https://github.com/indexzero/forever/tarball/v0.5.6
--
--* `npm install <name> [--save|--save-dev|--save-optional]`:
--
--    Do a `<name>@<tag>` install, where `<tag>` is the "tag" config. (See
--    `npm-config(1)`.)
++  Example:
  
--    In most cases, this will install the latest version
--    of the module published on npm.
++        npm install https://github.com/indexzero/forever/tarball/v0.5.6
  
--    Example:
++* `npm install <name>`:
++  Do a `<name>@<tag>` install, where `<tag>` is the "tag" config. (See
++  `npm-config(1)`)
  
--          npm install sax
++  Example:
  
--    `npm install` takes 3 exclusive, optional flags which save or update
--    the package version in your main package.json:
++        npm install sax
  
--    * `--save`: Package will appear in your `dependencies`.
--
--    * `--save-dev`: Package will appear in your `devDependencies`.
--
--    * `--save-optional`: Package will appear in your `optionalDependencies`.
--
--    Examples:
--
--          npm install sax --save
--          npm install node-tap --save-dev
--          npm install dtrace-provider --save-optional
--
--
--    **Note**: If there is a file or folder named `<name>` in the current
--    working directory, then it will try to install that, and only try to
--    fetch the package by name if it is not valid.
++  **Note**: If there is a file or folder named `<name>` in the current
++  working directory, then it will try to install that, and only try to
++  fetch the package by name if it is not valid.
  
  * `npm install <name>@<tag>`:
++  Install the version of the package that is referenced by the specified tag.
++  If the tag does not exist in the registry data for that package, then this
++  will fail.
  
--    Install the version of the package that is referenced by the specified tag.
--    If the tag does not exist in the registry data for that package, then this
--    will fail.
--
--    Example:
++  Example:
  
--          npm install sax@latest
++        npm install sax@latest
  
  * `npm install <name>@<version>`:
++  Install the specified version of the package.  This will fail if the version
++  has not been published to the registry.
  
--    Install the specified version of the package.  This will fail if the version
--    has not been published to the registry.
++  Example:
  
--    Example:
--
--          npm install sax@0.1.1
++        npm install sax@0.1.1
  
  * `npm install <name>@<version range>`:
++  Install a version of the package matching the specified version range.  This
++  will follow the same rules for resolving dependencies described in `npm-json(1)`.
  
--    Install a version of the package matching the specified version range.  This
--    will follow the same rules for resolving dependencies described in `npm-json(1)`.
--
--    Note that most version ranges must be put in quotes so that your shell will
--    treat it as a single argument.
++  Note that most version ranges must be put in quotes so that your shell will
++  treat it as a single argument.
  
--    Example:
++  Example:
  
--          npm install sax@">=0.1.0 <0.2.0"
++        npm install sax@">=0.1.0 <0.2.0"
  
  * `npm install <git remote url>`:
  
--    Install a package by cloning a git remote url.  The format of the git
--    url is:
++  Install a package by cloning a git remote url.  The format of the git
++  url is:
  
--          <protocol>://[<user>@]<hostname><separator><path>[#<commit-ish>]
++        <protocol>://[<user>@]<hostname><separator><path>[#<commit-ish>]
  
--    `<protocol>` is one of `git`, `git+ssh`, `git+http`, or
--    `git+https`.  If no `<commit-ish>` is specified, then `master` is
--    used.
++  `<protocol>` is one of `git`, `git+ssh`, `git+http`, or
++  `git+https`.  If no `<commit-ish>` is specified, then `master` is
++  used.
  
--    Examples:
++  Examples:
  
--          git+ssh://git@github.com:isaacs/npm.git#v1.0.27
--          git+https://isaacs@github.com/isaacs/npm.git
--          git://github.com/isaacs/npm.git#v1.0.27
++        git+ssh://git@github.com:isaacs/npm.git#v1.0.27
++        git+https://isaacs@github.com/isaacs/npm.git
++        git://github.com/isaacs/npm.git#v1.0.27
  
  You may combine multiple arguments, and even multiple types of arguments.
  For example:
@@@ -230,4 -230,4 +199,3 @@@ affects a real use-case, it will be inv
  * npm-folders(1)
  * npm-tag(1)
  * npm-rm(1)
--* npm-shrinkwrap(1)
index ddd500e3b120b8a9763b2932a516b1e9197adb61,ddd500e3b120b8a9763b2932a516b1e9197adb61..5f6e7ef6212d078e30e0d4b097db2149b0a204c9
@@@ -332,7 -332,7 +332,6 @@@ is a semver compatible version identifi
  * `""` (just an empty string) Same as `*`
  * `version1 - version2` Same as `>=version1 <=version2`.
  * `range1 || range2` Passes if either range1 or range2 are satisfied.
--* `git...` See 'Git URLs as Dependencies' below
  
  For example, these are all valid:
  
@@@ -388,18 -388,18 +387,6 @@@ of a version range
  This tarball will be downloaded and installed locally to your package at
  install time.
  
--### Git URLs as Dependencies
--
--Git urls can be of the form:
--
--    git://github.com/user/project.git#commit-ish
--    git+ssh://user@hostname:project.git#commit-ish
--    git+http://user@hostname/project/blah.git#commit-ish
--    git+https://user@hostname/project/blah.git#commit-ish
--
--The `commit-ish` can be any tag, sha, or branch which can be supplied as
--an argument to `git checkout`.  The default is `master`.
--
  ## devDependencies
  
  If someone is planning on downloading and using your module in their
@@@ -428,7 -428,7 +415,7 @@@ node that your stuff works on
      { "engines" : { "node" : ">=0.1.27 <0.1.30" } }
  
  And, like with dependencies, if you don't specify the version (or if you
--specify "\*" as the version), then any version of node will do.
++specify "*" as the version), then any version of node will do.
  
  If you specify an "engines" field, then npm will require that "node" be
  somewhere on that list. If "engines" is omitted, then npm will just assume
@@@ -439,36 -439,36 +426,6 @@@ are capable of properly installing you
  
      { "engines" : { "npm" : "~1.0.20" } }
  
--## os
--
--You can specify which operating systems your
--module will run on:
--
--    "os" : [ "darwin", "linux" ]
--
--You can also blacklist instead of whitelist operating systems,
--just prepend the blacklisted os with a '!':
--
--    "os" : [ "!win32" ]
--
--The host operating system is determined by `process.platform`
--
--It is allowed to both blacklist, and whitelist, although there isn't any
--good reason to do this.
--
--## cpu
--
--If your code only runs on certain cpu architectures,
--you can specify which ones.
--
--    "cpu" : [ "x64", "ia32" ]
--
--Like the `os` option, you can also blacklist architectures:
--
--    "cpu" : [ "!arm", "!mips" ]
--
--The host architecture is determined by `process.arch`
--
  ## preferGlobal
  
  If your package is primarily a command-line application that should be
@@@ -485,7 -485,7 +442,7 @@@ to publish it
  
  This is a way to prevent accidental publication of private repositories.
  If you would like to ensure that a given package is only ever published
--to a specific registry (for example, an internal registry),
++to a speciic registry (for example, an internal registry),
  then use the `publishConfig` hash described below
  to override the `registry` config param at publish-time.
  
index 93d86cd8380e782048b74f1d8d77d4f695fb3b70,93d86cd8380e782048b74f1d8d77d4f695fb3b70..596349a815dee158de28c035652767b701aa3405
@@@ -22,13 -22,13 +22,6 @@@ When run as `ll` or `la`, it shows exte
  
  ## CONFIGURATION
  
--### json
--
--* Default: false
--* Type: Boolean
--
--Show information in JSON format.
--
  ### long
  
  * Default: false
index 3d33a839194f5b716c959bb919d4e203350e6cb7,3d33a839194f5b716c959bb919d4e203350e6cb7..64b3ec41a05a4f2d9df0e9a84c402c27aa7e6dcb
@@@ -62,20 -62,20 +62,6 @@@ Package scripts run in an environment w
  made available regarding the setup of npm and the current state of the
  process.
  
--
--### path
--
--If you depend on modules that define executable scripts, like test suites,
--then those executables will be added to the `PATH` for executing the scripts.
--So, if your package.json has this:
--
--    { "name" : "foo"
--    , "dependencies" : { "bar" : "0.1.x" }
--    , "scripts": { "start" : "bar ./test" } }
--
--then you could run `npm start` to execute the `bar` script, which is exported
--into the `node_modules/.bin` directory on `npm install`.
--
  ### package.json vars
  
  The package.json fields are tacked onto the `npm_package_` prefix. So, for
index bec86d5fc7805bdaa840029dd4581cf517fc34f8,2d659898ca87c0f750b80b829f2a14f3094f5ac7..c4392671df19191dd5806f465d73044118d32ce5
@@@ -19,7 -19,7 +19,7 @@@
  <p>This function should not be used programmatically.  Instead, just refer
  to the <code>npm.bin</code> member.</p>
  </div>
- <p id="footer">bin &mdash; npm@1.1.18</p>
 -<p id="footer">bin &mdash; npm@1.1.21</p>
++<p id="footer">bin &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 3dfdec74a199e3ad87dd0217f3c6385fef0da213,248e80370490d77025b3a62706eb94a3f89ef943..df2aaf6c30fb6d5da48d4237c2095c369658367a
@@@ -25,7 -25,7 +25,7 @@@ optional version number.</p
  <p>This command will launch a browser, so this command may not be the most
  friendly for programmatic use.</p>
  </div>
- <p id="footer">bugs &mdash; npm@1.1.18</p>
 -<p id="footer">bugs &mdash; npm@1.1.21</p>
++<p id="footer">bugs &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 6f051c6cd35587f97117c182bd15caffd1383fc1,442f06f0f230377899bee11a03c89a7575b914f7..cfdc5f1f5099beeeeb00b40ccf22bfd0d8ac5f68
@@@ -28,7 -28,7 +28,7 @@@ usage, or <code>man 3 npm-&lt;command&g
  
  <ul><li><a href="../doc/index.html">index(1)</a></li></ul>
  </div>
- <p id="footer">commands &mdash; npm@1.1.18</p>
 -<p id="footer">commands &mdash; npm@1.1.21</p>
++<p id="footer">commands &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 024e1a22ba8f04fdd57cc803924f2be8088504af,e833df494eb3163debc80454c93a92b20264798e..f7431f9afebc8c1fcac2a3e55b2d214ffdf83a2f
@@@ -33,7 -33,7 +33,7 @@@ functions instead.</p
  
  <ul><li><a href="../api/npm.html">npm(3)</a></li></ul>
  </div>
- <p id="footer">config &mdash; npm@1.1.18</p>
 -<p id="footer">config &mdash; npm@1.1.21</p>
++<p id="footer">config &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 7af3243b04999159b840c44b91551bd3731dd18a,3ae24825e40324cc9e4358427798e70ba1c58bbd..b68d13449e75d44d3b77f24676ea3f28a497d748
@@@ -30,7 -30,7 +30,7 @@@ install the package.</p></li></ul
  
  <ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../api/unpublish.html">unpublish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
  </div>
- <p id="footer">deprecate &mdash; npm@1.1.18</p>
 -<p id="footer">deprecate &mdash; npm@1.1.21</p>
++<p id="footer">deprecate &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 796107089180fe381126007723cf6019c26e0810,047236c8e6ca7777d7ad00d74831f2d0b1830f2f..00913e5f363961de4e3ac4c40785a51ef6af47b7
@@@ -25,7 -25,7 +25,7 @@@ optional version number.</p
  <p>This command will launch a browser, so this command may not be the most
  friendly for programmatic use.</p>
  </div>
- <p id="footer">docs &mdash; npm@1.1.18</p>
 -<p id="footer">docs &mdash; npm@1.1.21</p>
++<p id="footer">docs &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e013b14fe735d1659bbbc172dd8b4332ba4df01f,3bf153d1337de4023c6492197bf0fe2c83ac6be6..fbf2ff1cbab91b71231846658e4662cd63831be1
@@@ -30,7 -30,7 +30,7 @@@ to open. The package can optionally hav
  <p>Since this command opens an editor in a new process, be careful about where
  and how this is used.</p>
  </div>
- <p id="footer">edit &mdash; npm@1.1.18</p>
 -<p id="footer">edit &mdash; npm@1.1.21</p>
++<p id="footer">edit &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index f241b0e0da02f4ff8e7e518231efb9183b034257,c929960e720d04460094d5331b4b9e8c64a8e9ba..29fe1f20596009f47cc87bf831dc3baf9ae363c2
@@@ -24,7 -24,7 +24,7 @@@ sure to use <code>npm rebuild &lt;pkg&g
  
  <p>The first element in the 'args' parameter must be a package name.  After that is the optional command, which can be any number of strings. All of the strings will be combined into one, space-delimited command.</p>
  </div>
- <p id="footer">explore &mdash; npm@1.1.18</p>
 -<p id="footer">explore &mdash; npm@1.1.21</p>
++<p id="footer">explore &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 7c58bd3061fe098592fcd5b458ba2b9f0cbab1da,d5c6f046cd2d036a4bf03e7026c5dea6f7521bec..d784c426f2cf187bcf4c3c351d5cd89fc1dd4ca3
@@@ -32,7 -32,7 +32,7 @@@ Name of the file that matched</li></ul
  
  <p>The silent parameter is not neccessary not used, but it may in the future.</p>
  </div>
- <p id="footer">help-search &mdash; npm@1.1.18</p>
 -<p id="footer">help-search &mdash; npm@1.1.21</p>
++<p id="footer">help-search &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 4e039b6a2ddbd45202b4126b1e6bdc1a060194a2,30a409425f42aa33afbe6bcbcfff6bac52b501f0..1a45b58daf755a8f702772d572e454cebfd392e8
@@@ -35,7 -35,7 +35,7 @@@ then go ahead and use this programmatic
  
  <p><a href="../doc/json.html">json(1)</a></p>
  </div>
- <p id="footer">init &mdash; npm@1.1.18</p>
 -<p id="footer">init &mdash; npm@1.1.21</p>
++<p id="footer">init &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 6bcc25abee85bc68c48593634c878fe5aa03a5e9,c49f5f23750e1b83379602cb5d28e65b399ef87a..41d51b37c0e3606b3a974df3378afa437856e9af
@@@ -25,7 -25,7 +25,7 @@@ the name of a package to be installed.<
  <p>Finally, 'callback' is a function that will be called when all packages have been
  installed or when an error has been encountered.</p>
  </div>
- <p id="footer">install &mdash; npm@1.1.18</p>
 -<p id="footer">install &mdash; npm@1.1.21</p>
++<p id="footer">install &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 4c57a873a1da8e59cdfabe991f32097c50c41b9f,a4714a4add022c1fba90f21096ac0340f2007364..eb1151c17a20ce957ba16b7d3d14bc3692965206
@@@ -39,7 -39,7 +39,7 @@@ npm.commands.link('redis', cb)  # link-
  <p>Now, any changes to the redis package will be reflected in
  the package in the current working directory</p>
  </div>
- <p id="footer">link &mdash; npm@1.1.18</p>
 -<p id="footer">link &mdash; npm@1.1.21</p>
++<p id="footer">link &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index efa09a8b9263ba2b5cd889bfe6878a5e1049ff49,500e923878c8b1049023479099df9a1d438b7750..f134cfcb501e2034cc95f44fdced266f3a16a494
@@@ -32,7 -32,7 +32,7 @@@ config object.</p
  
  <p>For a list of all the available command-line configs, see <code>npm help config</code></p>
  </div>
- <p id="footer">load &mdash; npm@1.1.18</p>
 -<p id="footer">load &mdash; npm@1.1.21</p>
++<p id="footer">load &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 53b72eaad0a762ee5efacbce18bc1d872ff614cc,b59e502d2a7518a7e888ae0f7c58cb4e4da30974..d68d94579d791f13f8cd6881ec16ce62db250642
@@@ -28,12 -28,12 +28,6 @@@ like with any other command, such as <c
  <p>If the silent parameter is set to true, nothing will be output to the screen,
  but the data will still be returned.</p>
  
--<p>Callback is provided an error if one occurred, the full data about which
--packages are installed and which dependencies they will receive, and a
--"lite" data object which just shows which versions are installed where.
--Note that the full data object is a circular structure, so care must be
--taken if it is serialized to JSON.</p>
--
  <h2 id="CONFIGURATION">CONFIGURATION</h2>
  
  <h3 id="long">long</h3>
@@@ -59,7 -59,7 +53,7 @@@ project.</p
  This means that if a submodule a same dependency as a parent module, then the
  dependency will only be output once.</p>
  </div>
- <p id="footer">ls &mdash; npm@1.1.18</p>
 -<p id="footer">ls &mdash; npm@1.1.21</p>
++<p id="footer">ls &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 9c9e4e5029eca2793b529f0cdbf3cebfa5d7281b,5652c8f61876cfcab462eae6fe1d93efba5ad56b..f01571b28b3f8a54c07058f8b1b6505c0b77a97a
@@@ -24,7 -24,7 +24,7 @@@ npm.load(configObject, function (er, np
  
  <h2 id="VERSION">VERSION</h2>
  
- <p>1.1.18</p>
 -<p>1.1.21</p>
++<p>1.1.0-2</p>
  
  <h2 id="DESCRIPTION">DESCRIPTION</h2>
  
@@@ -91,7 -91,7 +91,7 @@@ method names.  Use the <code>npm.deref<
  
  <pre><code>var cmd = npm.deref("unp") // cmd === "unpublish"</code></pre>
  </div>
- <p id="footer">npm &mdash; npm@1.1.18</p>
 -<p id="footer">npm &mdash; npm@1.1.21</p>
++<p id="footer">npm &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 906641fb851b00225d6f15b2adb7d0de0a240122,5776a6153b9f75be3f320befb61de126dc48cda7..f145e17d9b020084befcdc1e174a735fbe75c814
@@@ -19,7 -19,7 +19,7 @@@ currently outdated.</p
  
  <p>If the 'packages' parameter is left out, npm will check all packages.</p>
  </div>
- <p id="footer">outdated &mdash; npm@1.1.18</p>
 -<p id="footer">outdated &mdash; npm@1.1.21</p>
++<p id="footer">outdated &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 25646e9ebca26bd0b933cf1a659d0e521f5f4bd5,86c1592b1a733955507d14ed563f1e0cca69b564..7829e5b098b5ed362b798f9370faf9b5331c08ee
@@@ -34,7 -34,7 +34,7 @@@ that is not implemented at this time.</
  
  <ul><li><a href="../api/publish.html">publish(3)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
  </div>
- <p id="footer">owner &mdash; npm@1.1.18</p>
 -<p id="footer">owner &mdash; npm@1.1.21</p>
++<p id="footer">owner &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index a8519f873f7c4597927a662c159368f305edad6f,93f8f6557bc3bb766a2ee7d38159b0abf82cd981..cc6cd870ad7c0311ced033356e11a4e86b9b3787
@@@ -25,7 -25,7 +25,7 @@@ overwritten the second time.</p
  
  <p>If no arguments are supplied, then npm packs the current package folder.</p>
  </div>
- <p id="footer">pack &mdash; npm@1.1.18</p>
 -<p id="footer">pack &mdash; npm@1.1.21</p>
++<p id="footer">pack &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e62fad4e154e0d24455fee3d479a47d5b4b614e5,d3e89ae56e7fe4883f6585c500ad9d1dd1e722d2..52c5c8d55abb271314d0591f1d4889e83a109351
@@@ -21,7 -21,7 +21,7 @@@
  
  <p>This function is not useful programmatically</p>
  </div>
- <p id="footer">prefix &mdash; npm@1.1.18</p>
 -<p id="footer">prefix &mdash; npm@1.1.21</p>
++<p id="footer">prefix &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e2f4cd999265809423f9f86e49c28ae078677d90,005c898ed7b790a66ba518416dd1c2864debdf68..e40426942a96272c800184f9cb80a9cd820ae528
@@@ -23,7 -23,7 +23,7 @@@
  <p>Extraneous packages are packages that are not listed on the parent
  package's dependencies list.</p>
  </div>
- <p id="footer">prune &mdash; npm@1.1.18</p>
 -<p id="footer">prune &mdash; npm@1.1.21</p>
++<p id="footer">prune &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 4fd1e0bc3bc3ae2434e097d02446b4737f831eca,046cbf1bcd774780fffda167ace1991670aeb26d..7e80a2cc1fc75c8dea292e096f5e781d959de625
@@@ -32,7 -32,7 +32,7 @@@ the registry.  Overwrites when the "for
  
  <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../api/owner.html">owner(3)</a></li></ul>
  </div>
- <p id="footer">publish &mdash; npm@1.1.18</p>
 -<p id="footer">publish &mdash; npm@1.1.21</p>
++<p id="footer">publish &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 2c91060a2a550bd501b33063eb81326365fbee0d,3573f3006a726125f9f563d2db9aefd3b5249580..271c85cf4b3ba7a48eb0c743bc6c212cec56df04
@@@ -22,7 -22,7 +22,7 @@@ the new binary. If no 'packages' parame
  
  <p>See <code>npm help build</code></p>
  </div>
- <p id="footer">rebuild &mdash; npm@1.1.18</p>
 -<p id="footer">rebuild &mdash; npm@1.1.21</p>
++<p id="footer">rebuild &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e75d6e89443c12cf6faea3a371f7cf730768e3af,7ae34f6c919f977b2e1856e538eded10fe1290d5..bbff37d955e2c25436d0e980f5087fa517997841
@@@ -27,7 -27,7 +27,7 @@@ in the <code>packages</code> parameter.
  
  <ul><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
  </div>
- <p id="footer">restart &mdash; npm@1.1.18</p>
 -<p id="footer">restart &mdash; npm@1.1.21</p>
++<p id="footer">restart &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index f9068f3c6a0041a98702fa86724202b52651bed0,7300437d0e71d24728ba006c884b58fbd41c2993..fe1e0ddd2424b4b3a93578d16cc57db956b9f99b
@@@ -21,7 -21,7 +21,7 @@@
  
  <p>This function is not useful programmatically.</p>
  </div>
- <p id="footer">root &mdash; npm@1.1.18</p>
 -<p id="footer">root &mdash; npm@1.1.21</p>
++<p id="footer">root &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 5828e2c458078cdfc66d38476f921c91bc03c3a4,bf26c372a11e9e68752bba33e12eabe7758d27bb..6fc2ed3b911140e91f4aa0d550c57a9f1162e739
@@@ -29,7 -29,7 +29,7 @@@ assumed to be the command to run. All o
  
  <ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../api/test.html">test(3)</a></li><li><a href="../api/start.html">start(3)</a></li><li><a href="../api/restart.html">restart(3)</a></li><li><a href="../api/stop.html">stop(3)</a></li></ul>
  </div>
- <p id="footer">run-script &mdash; npm@1.1.18</p>
 -<p id="footer">run-script &mdash; npm@1.1.21</p>
++<p id="footer">run-script &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index dc429dd583c69fb99dc1126b56bcdeffd8a40b5e,2da9d9fb3aa837aba6fd8111ff926a9582dd2cc5..dace13e2e0d070592c4961558b1c49e05da7e897
@@@ -32,7 -32,7 +32,7 @@@ excluded term (the "searchexclude" conf
  and doesn't try to read your mind (it doesn't do any verb tense matching or the
  like).</p>
  </div>
- <p id="footer">search &mdash; npm@1.1.18</p>
 -<p id="footer">search &mdash; npm@1.1.21</p>
++<p id="footer">search &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8022f043a64dcb7342629c66e98acf5c8367ba2e,2f08685b1faa2599f8aaf97427f7f3e93986b450..fb9d91fc4c787ef27ee7670b864835886213714c
@@@ -26,7 -26,7 +26,7 @@@ but the shrinkwrap file will still be w
  <p>Finally, 'callback' is a function that will be called when the shrinkwrap has
  been saved.</p>
  </div>
- <p id="footer">shrinkwrap &mdash; npm@1.1.18</p>
 -<p id="footer">shrinkwrap &mdash; npm@1.1.21</p>
++<p id="footer">shrinkwrap &mdash; npm@1.1.16</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8d126d2b5789b566f84355ef0524688bc2c622c6,9ab6bfd21adacd696548ebcd467498f362ad1516..28f6eb34fb2e6fcfd4f1d90b8685a35c95161faf
@@@ -19,7 -19,7 +19,7 @@@
  <p>npm can run tests on multiple packages. Just specify multiple packages
  in the <code>packages</code> parameter.</p>
  </div>
- <p id="footer">start &mdash; npm@1.1.18</p>
 -<p id="footer">start &mdash; npm@1.1.21</p>
++<p id="footer">start &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 0f5ae3f4c54630675c818cf2100027382b2417ec,191aaec46921ffc7b70fa2f5508f81ae7774ab90..d6fd91ce883dc0f35f9b18e9064306b92683ca81
@@@ -19,7 -19,7 +19,7 @@@
  <p>npm can run stop on multiple packages. Just specify multiple packages
  in the <code>packages</code> parameter.</p>
  </div>
- <p id="footer">stop &mdash; npm@1.1.18</p>
 -<p id="footer">stop &mdash; npm@1.1.21</p>
++<p id="footer">stop &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index eb314cb4381981c48bc1d7c78b4b41ce9bdf2609,35a48c7f47123723a9205be555bf8c3ddc044cf8..a9fed04a54fceccb2f0f2b7e9e8fb8574602fd90
@@@ -33,7 -33,7 +33,7 @@@ dependencies into the submodule folder.
  
  <ul><li>npm help json</li><li>git help submodule</li></ul>
  </div>
- <p id="footer">submodule &mdash; npm@1.1.18</p>
 -<p id="footer">submodule &mdash; npm@1.1.21</p>
++<p id="footer">submodule &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index b095e836da4de9e8e14c0ad963305198ecb4dda6,77109f6fcadf1d080f864beb00c73530d9ff97ae..c94f459de218e4038dfe897a494f6a6be17d9b31
@@@ -29,7 -29,7 +29,7 @@@ parameter is missing or falsey (empty)
  used. For more information about how to set this config, check
  <code>man 3 npm-config</code> for programmatic usage or <code>man npm-config</code> for cli usage.</p>
  </div>
- <p id="footer">tag &mdash; npm@1.1.18</p>
 -<p id="footer">tag &mdash; npm@1.1.21</p>
++<p id="footer">tag &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8ecf6512d842a6121aa4d29bad6d83a82c796bb0,a6ea69c941a768fe19d118652e20380919a89fff..d72d7cdf1c0d6a260ae6aa9826e27dcf9c4af24b
@@@ -22,7 -22,7 +22,7 @@@ true.</p
  <p>npm can run tests on multiple packages. Just specify multiple packages
  in the <code>packages</code> parameter.</p>
  </div>
- <p id="footer">test &mdash; npm@1.1.18</p>
 -<p id="footer">test &mdash; npm@1.1.21</p>
++<p id="footer">test &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index ff023b68b3d8fa298b97520d7eac8b642f2c6421,aa5d797d1211f6041facc2ed09986ff2c1bea296..1b86afc0122fde6802d44e19594068cd95c5eb17
@@@ -22,7 -22,7 +22,7 @@@ the name of a package to be uninstalled
  <p>Finally, 'callback' is a function that will be called when all packages have been
  uninstalled or when an error has been encountered.</p>
  </div>
- <p id="footer">uninstall &mdash; npm@1.1.18</p>
 -<p id="footer">uninstall &mdash; npm@1.1.21</p>
++<p id="footer">uninstall &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 1aef1c371026391d38472b3546420a2e3ee4a03e,3211d6aca8c1b277d2a334acfb8663f8269d014c..d5afd9a87fb6aaa60a2f3d2ae9101a77edb2a404
@@@ -26,7 -26,7 +26,7 @@@ is what is meant.</p
  <p>If no version is specified, or if all versions are removed then
  the root package entry is removed from the registry entirely.</p>
  </div>
- <p id="footer">unpublish &mdash; npm@1.1.18</p>
 -<p id="footer">unpublish &mdash; npm@1.1.21</p>
++<p id="footer">unpublish &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 0f4490553e3a6c4694bbd54d3c1e1b7171f0e686,7dcf3cefd1ba377822c493172da2c5780a740f7b..a9db9fa58a44b6a1e5d246612ed7d25ddcfab7d8
@@@ -18,7 -18,7 +18,7 @@@
  
  <p>The 'packages' argument is an array of packages to update. The 'callback' parameter will be called when done or when an error occurs.</p>
  </div>
- <p id="footer">update &mdash; npm@1.1.18</p>
 -<p id="footer">update &mdash; npm@1.1.21</p>
++<p id="footer">update &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 84e5618c7b27a2a55b601403c7ef384d34841902,e18618316eb1af12310773e9e65979d1717c1da1..4c4e906a216eb3faf5602360bd7fe207f632483c
@@@ -24,7 -24,7 +24,7 @@@ fail if the repo is not clean.</p
  parameter. The difference, however, is this function will fail if it does
  not have exactly one element. The only element should be a version number.</p>
  </div>
- <p id="footer">version &mdash; npm@1.1.18</p>
 -<p id="footer">version &mdash; npm@1.1.21</p>
++<p id="footer">version &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 78350def117b5169894d96812ab95792f2435fb4,1c14db9db8eae48b12bcd95ca151945de9bf4de9..d25d2db41916850ce88005da1c9d17581719197c
@@@ -99,7 -99,7 +99,7 @@@ the field name.</p
  
  <p>corresponding to the list of fields selected.</p>
  </div>
- <p id="footer">view &mdash; npm@1.1.18</p>
 -<p id="footer">view &mdash; npm@1.1.21</p>
++<p id="footer">view &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index de061a7588505034b068f6ffc5fd1002c6971af2,fb1de1a8b06b3fef2150a3c9bea4ecc4eb54a1e8..85b3134952129a6e25ee3f5bd8f675b1b259191f
@@@ -21,7 -21,7 +21,7 @@@
  
  <p>This function is not useful programmatically</p>
  </div>
- <p id="footer">whoami &mdash; npm@1.1.18</p>
 -<p id="footer">whoami &mdash; npm@1.1.21</p>
++<p id="footer">whoami &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 610356a714cc7a24328255a8dd204aa95b425d1c,5d0172029348a3825b464371858564bbc4b98ea4..b353238bfc63849c87aa92370f324214dfefbd74
@@@ -267,7 -267,7 +267,7 @@@ will no doubt tell you to put the outpu
  
  <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
  </div>
- <p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.18</p>
 -<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.21</p>
++<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index d39098d8b7dcc2f23edb05b52fc37758938f754d,3ec0580d2a300335244b450a2304d4109a141689..9757f703e6f0f92b0377b20323c6d02ef8faa3d2
@@@ -39,7 -39,7 +39,7 @@@ authorize on a new machine.</p
  
  <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li></ul>
  </div>
- <p id="footer">adduser &mdash; npm@1.1.18</p>
 -<p id="footer">adduser &mdash; npm@1.1.21</p>
++<p id="footer">adduser &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index a3f6d9e6dc17ae2e2fcb7d21093d6e173e61920c,b4b90d5416face8f8132f254be0c5a7f7f3c9560..582493e5759b6060b23d3aa401eb2be5186ddeb6
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">bin &mdash; npm@1.1.18</p>
 -<p id="footer">bin &mdash; npm@1.1.21</p>
++<p id="footer">bin &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 0802ecf38780de5f16477b987e3be8462aecb247,20d6a66bb4d7e5969376bb678d52fbdf37fc3d95..4653330968767223906db4149efff980302c9ca9
@@@ -36,7 -36,7 +36,7 @@@ config param.</p
  
  <ul><li><a href="../doc/docs.html">docs(1)</a></li><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
  </div>
- <p id="footer">bugs &mdash; npm@1.1.18</p>
 -<p id="footer">bugs &mdash; npm@1.1.21</p>
++<p id="footer">bugs &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 7b06b5c2ef08eca54a671e38f44783f93d37e78c,4930a22b34a8e69d80128e90b04e9ff994d8f897..d0709fb51da8e12742cca509777b10d142de3d13
@@@ -25,7 -25,7 +25,7 @@@ A folder containing a <code>package.jso
  
  <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
  </div>
- <p id="footer">build &mdash; npm@1.1.18</p>
 -<p id="footer">build &mdash; npm@1.1.21</p>
++<p id="footer">build &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8103455f47b0afa48d4effd8eca17bfd426baeb1,12acd35a210ce66515626ccede16fbc81ef3d29e..b449b4915429062770908987e45870837e2e23ce
@@@ -20,7 -20,7 +20,7 @@@ install packages into the local space.<
  
  <ul><li><a href="../doc/install.html">install(1)</a></li></ul>
  </div>
- <p id="footer">bundle &mdash; npm@1.1.18</p>
 -<p id="footer">bundle &mdash; npm@1.1.21</p>
++<p id="footer">bundle &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index fee53f14fa502df7ae579af109275f16ada36976,083f4818cd8aefee73f93fe755aafb0eccd79375..92fbf6467083957760eb86095eaf0531b497c8dc
@@@ -66,7 -66,7 +66,7 @@@ they do not make an HTTP request to th
  
  <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li></ul>
  </div>
- <p id="footer">cache &mdash; npm@1.1.18</p>
 -<p id="footer">cache &mdash; npm@1.1.21</p>
++<p id="footer">cache &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8d8df24f58c6d81881a20c48c22b6cb0bb14dd98,89737e4cebbb331a53d6e9b23886cbfa7d7e0de2..514b76258f600aba9a2097c52119a320b37faac8
  
  <h2 id="HISTORY">HISTORY</h2>
  
--<h3 id="1-1-3-1-1-4">1.1.3, 1.1.4</h3>
--
--<ul><li>Update request to support HTTPS-over-HTTP proxy tunneling</li><li>Throw on undefined envs in config settings</li><li>Update which to 1.0.5</li><li>Fix windows UNC busyloop in findPrefix</li><li>Bundle nested bundleDependencies properly</li><li>Alias adduser to add-user</li><li>Doc updates  (Christian Howe, Henrik Hodne, Andrew Lunny)</li><li>ignore logfd/outfd streams in makeEnv() (Rod Vagg)</li><li>shrinkwrap: Behave properly with url-installed deps</li><li>install: Support --save with url install targets</li><li>Support installing naked tars or single-file modules from urls etc.</li><li>init: Don't add engines section</li><li>Don't run make clean on rebuild</li><li>Added missing unicode replacement (atomizer)</li></ul>
--
--<h3 id="1-1-2">1.1.2</h3>
--
--<p>Dave Pacheco (2):
--      add "npm shrinkwrap"</p>
--
--<p>Martin Cooper (1):
--      Fix #1753 Make a copy of the cached objects we'll modify.</p>
--
--<p>Tim Oxley (1):
--      correctly remove readme from default npm view command.</p>
--
--<p>Tyler Green (1):
--      fix #2187 set terminal columns to Infinity if 0</p>
--
--<p>isaacs (19):
--      update minimatch
--      update request
--      Experimental: single-file modules
--      Fix #2172 Don't remove global mans uninstalling local pkgs
--      Add --versions flag to show the version of node as well
--      Support --json flag for ls output
--      update request to 2.9.151</p>
--
--<h3 id="1-1">1.1</h3>
--
--<ul><li>Replace system tar dependency with a JS tar</li><li>Continue to refine</li></ul>
--
  <h3 id="1-0">1.0</h3>
  
  <ul><li>Greatly simplified folder structure </li><li>Install locally (bundle by default) </li><li>Drastic rearchitecture</li></ul>
@@@ -65,7 -65,7 +34,7 @@@
  
  <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li></ul>
  </div>
- <p id="footer">changelog &mdash; npm@1.1.18</p>
 -<p id="footer">changelog &mdash; npm@1.1.21</p>
++<p id="footer">changelog &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index ec6c9f1ee3b47b6611406695f6002d0fc188d445,6579fabc996dd24718c3bb1ee0bb73fe75067978..1d05ff507fbd50cddc38492ecd05e4bab4ac59ae
@@@ -64,7 -64,7 +64,7 @@@ while (foo) 
  <p>Don't use them except in four situations:</p>
  
  <ul><li><code>for (;;)</code> loops.  They're actually required.</li><li>null loops like: <code>while (something) ;</code> (But you'd better have a good
--reason for doing that.)</li><li><code>case "foo": doSomething(); break</code></li><li>In front of a leading <code>(</code> or <code>[</code> at the start of the line.
++reason for doing that.)</li><li>case "foo": doSomething(); break</li><li>In front of a leading ( or [ at the start of the line.
  This prevents the expression from being interpreted
  as a function call or property access, respectively.</li></ul>
  
@@@ -191,7 -191,7 +191,7 @@@ set to anything."</p
  
  <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
  </div>
- <p id="footer">coding-style &mdash; npm@1.1.18</p>
 -<p id="footer">coding-style &mdash; npm@1.1.21</p>
++<p id="footer">coding-style &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 5964d571836a2610b8dc49c586984a3baa5e9b98,3d82750a432917c0149584ccb291e4114c1f8f66..386a2760aed2285d5c13cfe35f9ce4b39bae6e6b
@@@ -33,7 -33,7 +33,7 @@@ completions based on the arguments.</p
  
  <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
  </div>
- <p id="footer">completion &mdash; npm@1.1.18</p>
 -<p id="footer">completion &mdash; npm@1.1.21</p>
++<p id="footer">completion &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index ae2b8adb32cfaec5ef2cb3b6d1534a4528bc3d06,cc9a0dc22f1d5ab4285b1cd8e54a11beaa4356b9..c950154f241f8c6a63c6144802b7aba1cdffb8c4
@@@ -105,7 -105,7 +105,7 @@@ global config.</p
  
  <p>The following shorthands are parsed on the command-line:</p>
  
--<ul><li><code>-v</code>: <code>--version</code></li><li><code>-h</code>, <code>-?</code>, <code>--help</code>, <code>-H</code>: <code>--usage</code></li><li><code>-s</code>, <code>--silent</code>: <code>--loglevel silent</code></li><li><code>-q</code>, <code>--quiet</code>: <code>--loglevel warn</code></li><li><code>-d</code>: <code>--loglevel info</code></li><li><code>-dd</code>, <code>--verbose</code>: <code>--loglevel verbose</code></li><li><code>-ddd</code>: <code>--loglevel silly</code></li><li><code>-g</code>: <code>--global</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-m</code>: <code>--message</code></li><li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li><li><code>-reg</code>: <code>--registry</code></li><li><code>-v</code>: <code>--version</code></li><li><code>-f</code>: <code>--force</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-desc</code>: <code>--description</code></li><li><code>-S</code>: <code>--save</code></li><li><code>-D</code>: <code>--save-dev</code></li><li><code>-O</code>: <code>--save-optional</code></li><li><code>-y</code>: <code>--yes</code></li><li><code>-n</code>: <code>--yes false</code></li><li><code>ll</code> and <code>la</code> commands: <code>ls --long</code></li></ul>
++<ul><li><code>-v</code>: <code>--version</code></li><li><code>-h</code>, <code>-?</code>, <code>--help</code>, <code>-H</code>: <code>--usage</code></li><li><code>-s</code>, <code>--silent</code>: <code>--loglevel silent</code></li><li><code>-q</code>, <code>--quiet</code>: <code>--loglevel warn</code></li><li><code>-d</code>: <code>--loglevel info</code></li><li><code>-dd</code>, <code>--verbose</code>: <code>--loglevel verbose</code></li><li><code>-ddd</code>: <code>--loglevel silly</code></li><li><code>-g</code>: <code>--global</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-m</code>: <code>--message</code></li><li><code>-p</code>, <code>--porcelain</code>: <code>--parseable</code></li><li><code>-reg</code>: <code>--registry</code></li><li><code>-v</code>: <code>--version</code></li><li><code>-f</code>: <code>--force</code></li><li><code>-l</code>: <code>--long</code></li><li><code>-desc</code>: <code>--description</code></li><li><code>-S</code>: <code>--save</code></li><li><code>-y</code>: <code>--yes</code></li><li><code>-n</code>: <code>--yes false</code></li><li><code>ll</code> and <code>la</code> commands: <code>ls --long</code></li></ul>
  
  <p>If the specified configuration param resolves unambiguously to a known
  configuration parameter, then it is expanded to that configuration
@@@ -200,26 -200,26 +200,6 @@@ to trust only that specific signing aut
  
  <p>The location of npm's cache directory.  See <code><a href="../doc/cache.html">cache(1)</a></code></p>
  
--<h3 id="cache-max">cache-max</h3>
--
--<ul><li>Default: Infinity</li><li>Type: Number</li></ul>
--
--<p>The maximum time (in seconds) to keep items in the registry cache before
--re-checking against the registry.</p>
--
--<p>Note that no purging is done unless the <code>npm cache clean</code> command is
--explicitly used, and that only GET requests use the cache.</p>
--
--<h3 id="cache-min">cache-min</h3>
--
--<ul><li>Default: 0</li><li>Type: Number</li></ul>
--
--<p>The minimum time (in seconds) to keep items in the registry cache before
--re-checking against the registry.</p>
--
--<p>Note that no purging is done unless the <code>npm cache clean</code> command is
--explicitly used, and that only GET requests use the cache.</p>
--
  <h3 id="color">color</h3>
  
  <ul><li>Default: true on Posix, false on Windows</li><li>Type: Boolean or <code>"always"</code></li></ul>
@@@ -320,12 -320,12 +300,6 @@@ user.</p
  
  <p>A proxy to use for outgoing https requests.</p>
  
--<h3 id="user-agent">user-agent</h3>
--
--<ul><li>Default: npm/{npm.version} node/{process.version}</li><li>Type: String</li></ul>
--
--<p>Sets a User-Agent to the request header</p>
--
  <h3 id="ignore">ignore</h3>
  
  <ul><li>Default: ""</li><li>Type: string</li></ul>
@@@ -341,7 -341,7 +315,7 @@@ from packages when building tarballs.</
  
  <h3 id="init-author-name">init.author.name</h3>
  
--<ul><li>Default: ""</li><li>Type: String</li></ul>
++<ul><li>Default: "0.0.0"</li><li>Type: String</li></ul>
  
  <p>The value <code>npm init</code> should use by default for the package author's name.</p>
  
  
  <p>The value <code>npm init</code> should use by default for the package author's homepage.</p>
  
--<h3 id="json">json</h3>
--
--<ul><li>Default: false</li><li>Type: Boolean</li></ul>
--
--<p>Whether or not to output JSON data, rather than the normal output.</p>
--
--<p>This feature is currently experimental, and the output data structures
--for many commands is either not implemented in JSON yet, or subject to
--change.  Only the output from <code>npm ls --json</code> is currently valid.</p>
--
  <h3 id="link">link</h3>
  
  <ul><li>Default: false</li><li>Type: Boolean</li></ul>
@@@ -516,22 -516,22 +480,6 @@@ this as true.</p
  
  <p>Only works if there is already a package.json file present.</p>
  
--<h3 id="save-dev">save-dev</h3>
--
--<ul><li>Default: false</li><li>Type: Boolean</li></ul>
--
--<p>Save installed packages to a package.json file as devDependencies.</p>
--
--<p>Only works if there is already a package.json file present.</p>
--
--<h3 id="save-optional">save-optional</h3>
--
--<ul><li>Default: false</li><li>Type: Boolean</li></ul>
--
--<p>Save installed packages to a package.json file as optionalDependencies.</p>
--
--<p>Only works if there is already a package.json file present.</p>
--
  <h3 id="searchopts">searchopts</h3>
  
  <ul><li>Default: ""</li><li>Type: String</li></ul>
@@@ -653,15 -653,15 +601,6 @@@ this value.  Thus, the defaults are <co
  
  <p>Only relevant when specified explicitly on the command line.</p>
  
--<h3 id="versions">versions</h3>
--
--<ul><li>Default: false</li><li>Type: boolean</li></ul>
--
--<p>If true, output the npm version as well as node's <code>process.versions</code>
--hash, and exit successfully.</p>
--
--<p>Only relevant when specified explicitly on the command line.</p>
--
  <h3 id="viewer">viewer</h3>
  
  <ul><li>Default: "man" on Posix, "browser" on Windows</li><li>Type: path</li></ul>
@@@ -684,7 -684,7 +623,7 @@@ then answer "no" to any prompt.</p
  
  <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li></ul>
  </div>
- <p id="footer">config &mdash; npm@1.1.18</p>
 -<p id="footer">config &mdash; npm@1.1.21</p>
++<p id="footer">config &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 74b053ce8484befdd66ebdf7286839fa7dc5bb79,a79ca7c5cad804650542fd22d17d8796ba21e164..43f07a490fb4249b7229bfd3532b55a38a05fc50
@@@ -29,7 -29,7 +29,7 @@@ something like this:</p
  
  <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
  </div>
- <p id="footer">deprecate &mdash; npm@1.1.18</p>
 -<p id="footer">deprecate &mdash; npm@1.1.21</p>
++<p id="footer">deprecate &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index c4765ff9d081c4d3d622ee99f98029738961ff6f,6f86cc26a78b11a00ea0b45ac019469ba4d28153..ba3189bb60ac76d26cfa2dc393464658d38a330e
@@@ -28,23 -28,23 +28,13 @@@ topic, or <code>npm help thing</code> t
  
  <p>A package is:</p>
  
--<ul><li>a) a folder containing a program described by a package.json file</li><li>b) a gzipped tarball containing (a)</li><li>c) a url that resolves to (b)</li><li>d) a <code>&lt;name&gt;@&lt;version&gt;</code> that is published on the registry with (c)</li><li>e) a <code>&lt;name&gt;@&lt;tag&gt;</code> that points to (d)</li><li>f) a <code>&lt;name&gt;</code> that has a "latest" tag satisfying (e)</li><li>g) a <code>git</code> url that, when cloned, results in (a).</li></ul>
++<ul><li>a) a folder containing a program described by a package.json file</li><li>b) a gzipped tarball containing (a)</li><li>c) a url that resolves to (b)</li><li>d) a <code>&lt;name&gt;@&lt;version&gt;</code> that is published on the registry with (c)</li><li>e) a <code>&lt;name&gt;@&lt;tag&gt;</code> that points to (d)</li><li>f) a <code>&lt;name&gt;</code> that has a "latest" tag satisfying (e)</li></ul>
  
  <p>Even if you never publish your package, you can still get a lot of
  benefits of using npm if you just want to write a node program (a), and
  perhaps if you also want to be able to easily install it elsewhere
  after packing it up into a tarball (b).</p>
  
--<p>Git urls can be of the form:</p>
--
--<pre><code>git://github.com/user/project.git#commit-ish
--git+ssh://user@hostname:project.git#commit-ish
--git+http://user@hostname/project/blah.git#commit-ish
--git+https://user@hostname/project/blah.git#commit-ish</code></pre>
--
--<p>The <code>commit-ish</code> can be any tag, sha, or branch which can be supplied as
--an argument to <code>git checkout</code>.  The default is <code>master</code>.</p>
--
  <h2 id="The-package-json-File">The package.json File</h2>
  
  <p>You need to have a <code>package.json</code> file in the root of your project to do
@@@ -160,7 -160,7 +150,7 @@@ from a fresh checkout.</p
  
  <ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li></ul>
  </div>
- <p id="footer">developers &mdash; npm@1.1.18</p>
 -<p id="footer">developers &mdash; npm@1.1.21</p>
++<p id="footer">developers &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 68a626be65789b65e952b3b33886cf714974ca1d,721f7d06aff9eacd5bd807005227849b343073ec..074fa001e28744822ecdbc336a24b72348390ed6
@@@ -80,7 -80,7 +80,7 @@@ license statement)</li><li>Illegal cont
  
  <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
  </div>
- <p id="footer">disputes &mdash; npm@1.1.18</p>
 -<p id="footer">disputes &mdash; npm@1.1.21</p>
++<p id="footer">disputes &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 6ebcb41873252656bbdab200b69aab47060343cc,870dfa7f20e2a18f755e7805fb5c17e2556079d0..aad9a402c12090fc71eac2933813cf762ddb2a9c
@@@ -37,7 -37,7 +37,7 @@@ config param.</p
  
  <ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li></ul>
  </div>
- <p id="footer">docs &mdash; npm@1.1.18</p>
 -<p id="footer">docs &mdash; npm@1.1.21</p>
++<p id="footer">docs &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 8c9cc7587d854b4c483141af7806ea22dd3b2d7b,51ca677c66bce34d05231486168d204c0fb0814b..0a5371e16ffe0cd56fba0fa8b130810d50cfb146
@@@ -37,7 -37,7 +37,7 @@@ or <code>"notepad"</code> on Windows.</
  
  <ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/explore.html">explore(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">edit &mdash; npm@1.1.18</p>
 -<p id="footer">edit &mdash; npm@1.1.21</p>
++<p id="footer">edit &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index a44d335ec9e23fc70e986dd44c64576bf03972fe,e1f12bf43731b9e6bf3999686d5227163571abd2..6c29e11235c172719291ce74065cf63ece26a87f
@@@ -40,7 -40,7 +40,7 @@@ Windows</li><li>Type: path</li></ul
  
  <ul><li><a href="../doc/submodule.html">submodule(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/edit.html">edit(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
  </div>
- <p id="footer">explore &mdash; npm@1.1.18</p>
 -<p id="footer">explore &mdash; npm@1.1.21</p>
++<p id="footer">explore &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index aa8fa17a7f28ec2fbf16a4b35edce7742dc6883f,b5bed0c567e29500f2362da27930206ffddd5a54..d4853ac42fd9bd30c26bb495e0fc1ab23de95a8d
@@@ -241,7 -241,7 +241,7 @@@ We'll have someone kick it or something
  
  <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
  </div>
- <p id="footer">faq &mdash; npm@1.1.18</p>
 -<p id="footer">faq &mdash; npm@1.1.21</p>
++<p id="footer">faq &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index b670abf5ec6b5a53f0e401234d0d54e0d7eb68a3,127c452a5624be0e04fb788cff2d7d197e9594aa..987c5b8a860d45b49ea5c898a21958747df767b8
@@@ -205,7 -205,7 +205,7 @@@ cannot be found elsewhere.  See <code><
  
  <ul><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/pack.html">pack(1)</a></li><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li></ul>
  </div>
- <p id="footer">folders &mdash; npm@1.1.18</p>
 -<p id="footer">folders &mdash; npm@1.1.21</p>
++<p id="footer">folders &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 2dfa34071fe8a150ea65acf31f4c6c7680e0bf46,45fa05553266ef5946f32335c4026e2bbf87e144..92e8f2e54563a9914ac39ac3149034559dbd803d
@@@ -38,7 -38,7 +38,7 @@@ where the terms were found in the docum
  
  <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/help.html">help(1)</a></li></ul>
  </div>
- <p id="footer">help-search &mdash; npm@1.1.18</p>
 -<p id="footer">help-search &mdash; npm@1.1.21</p>
++<p id="footer">help-search &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e01dd04721dfc99dc5176d8f9ee37ce5ede8d92d,b4ee8a7703709d00f6f64bc503f7accbec93b408..576df1b25e8bc02d276097048d184f51a528b6df
@@@ -36,7 -36,7 +36,7 @@@ matches are equivalent to specifying a 
  
  <ul><li><a href="../doc/npm.html">npm(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/help-search.html">help-search(1)</a></li><li><a href="../doc/index.html">index(1)</a></li></ul>
  </div>
- <p id="footer">help &mdash; npm@1.1.18</p>
 -<p id="footer">help &mdash; npm@1.1.21</p>
++<p id="footer">help &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 5109af4736f529bf5e9a8a6afe822c7f933c54e7,a7e647ef47a91441b3a7949db963206fa3243826..cd527bb2ae69f6c5e41d2d2de6c2aa758bfbc686
  
  <p> The semantic versioner for npm</p>
  
--<h2 id="npm-shrinkwrap-1"><a href="../doc/shrinkwrap.html">shrinkwrap(1)</a></h2>
--
--<p> Lock down dependency versions</p>
--
  <h2 id="npm-star-1"><a href="../doc/star.html">star(1)</a></h2>
  
  <p> Mark your favorite packages</p>
  
  <p> Search for packages</p>
  
--<h2 id="npm-shrinkwrap-3"><a href="../api/shrinkwrap.html">shrinkwrap(3)</a></h2>
--
--<p> programmatically generate package shrinkwrap file</p>
--
  <h2 id="npm-start-3"><a href="../api/start.html">start(3)</a></h2>
  
  <p> Start a package</p>
  
  <p> Display npm username</p>
  </div>
- <p id="footer">index &mdash; npm@1.1.18</p>
 -<p id="footer">index &mdash; npm@1.1.21</p>
++<p id="footer">index &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index afa20aad36e618e332dccafcf6cd12abe40d9467,a090823499b46049109b969e65af11a4691577a0..fb895e7e61d18d27d10850cbb69c3382b14f0de7
@@@ -29,7 -29,7 +29,7 @@@ without a really good reason to do so.<
  
  <ul><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/version.html">version(1)</a></li></ul>
  </div>
- <p id="footer">init &mdash; npm@1.1.18</p>
 -<p id="footer">init &mdash; npm@1.1.21</p>
++<p id="footer">init &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e9ac77dec7f07ccea5f70523a74a28823a2ff56f,df9f5f513cbb17a3019fcd69f9c9c7007fe94aef..f059df50808bcc6172de30246cb3279f53151bc8
  npm install &lt;tarball file&gt;
  npm install &lt;tarball url&gt;
  npm install &lt;folder&gt;
--npm install &lt;name&gt; [--save|--save-dev|--save-optional]
++npm install &lt;name&gt;
  npm install &lt;name&gt;@&lt;tag&gt;
  npm install &lt;name&gt;@&lt;version&gt;
--npm install &lt;name&gt;@&lt;version range&gt;
  npm install &lt;name&gt;@&lt;version range&gt;</code></pre>
  
  <h2 id="DESCRIPTION">DESCRIPTION</h2>
  
--<p>This command installs a package, and any packages that it depends on. If the
--package has a shrinkwrap file, the installation of dependencies will be driven
--by that. See <a href="../doc/shrinkwrap.html">shrinkwrap(1)</a>.</p>
++<p>This command installs a package, and any packages that it depends on.</p>
  
  <p>A <code>package</code> is:</p>
  
@@@ -35,29 -35,29 +32,33 @@@ benefits of using npm if you just want 
  perhaps if you also want to be able to easily install it elsewhere
  after packing it up into a tarball (b).</p>
  
--<ul><li><p><code>npm install</code> (in package directory, no arguments):</p><p>Install the dependencies in the local node_modules folder.</p><p>In global mode (ie, with <code>-g</code> or <code>--global</code> appended to the command),
++<ul><li><p><code>npm install</code> (in package directory, no arguments):
++Install the dependencies in the local node_modules folder.</p><p>In global mode (ie, with <code>-g</code> or <code>--global</code> appended to the command),
  it installs the current package context (ie, the current working
--directory) as a global package.</p></li><li><p><code>npm install &lt;folder&gt;</code>:</p><p>Install a package that is sitting in a folder on the filesystem.</p></li><li><p><code>npm install &lt;tarball file&gt;</code>:</p><p>Install a package that is sitting on the filesystem.  Note: if you just want
++directory) as a global package.</p></li><li><p><code>npm install &lt;folder&gt;</code>:
++Install a package that is sitting in a folder on the filesystem.</p></li><li><p><code>npm install &lt;tarball file&gt;</code>:
++Install a package that is sitting on the filesystem.  Note: if you just want
  to link a dev directory into your npm root, you can do this more easily by
--using <code>npm link</code>.</p><p>Example:</p><pre><code>  npm install ./package.tgz</code></pre></li><li><p><code>npm install &lt;tarball url&gt;</code>:</p><p>Fetch the tarball url, and then install it.  In order to distinguish between
--this and other options, the argument must start with "http://" or "https://"</p><p>Example:</p><pre><code>  npm install https://github.com/indexzero/forever/tarball/v0.5.6</code></pre></li><li><p><code>npm install &lt;name&gt; [--save|--save-dev|--save-optional]</code>:</p><p>Do a <code>&lt;name&gt;@&lt;tag&gt;</code> install, where <code>&lt;tag&gt;</code> is the "tag" config. (See
--<code><a href="../doc/config.html">config(1)</a></code>.)</p><p>In most cases, this will install the latest version
--of the module published on npm.</p><p>Example:</p><p>      npm install sax</p><p><code>npm install</code> takes 3 exclusive, optional flags which save or update
--the package version in your main package.json:</p><ul><li><p><code>--save</code>: Package will appear in your <code>dependencies</code>.</p></li><li><p><code>--save-dev</code>: Package will appear in your <code>devDependencies</code>.</p></li><li><p><code>--save-optional</code>: Package will appear in your <code>optionalDependencies</code>.</p><p>Examples:</p><p>  npm install sax --save
--  npm install node-tap --save-dev
--  npm install dtrace-provider --save-optional</p><p><strong>Note</strong>: If there is a file or folder named <code>&lt;name&gt;</code> in the current
++using <code>npm link</code>.</p><p>Example:</p><pre><code>npm install ./package.tgz</code></pre></li><li><p><code>npm install &lt;tarball url&gt;</code>:
++Fetch the tarball url, and then install it.  In order to distinguish between
++this and other options, the argument must start with "http://" or "https://"</p><p>Example:</p><pre><code>npm install https://github.com/indexzero/forever/tarball/v0.5.6</code></pre></li><li><p><code>npm install &lt;name&gt;</code>:
++Do a <code>&lt;name&gt;@&lt;tag&gt;</code> install, where <code>&lt;tag&gt;</code> is the "tag" config. (See
++<code><a href="../doc/config.html">config(1)</a></code>)</p><p>Example:</p><pre><code>npm install sax</code></pre><p><strong>Note</strong>: If there is a file or folder named <code>&lt;name&gt;</code> in the current
  working directory, then it will try to install that, and only try to
--fetch the package by name if it is not valid.</p></li></ul></li><li><p><code>npm install &lt;name&gt;@&lt;tag&gt;</code>:</p><p>Install the version of the package that is referenced by the specified tag.
++fetch the package by name if it is not valid.</p></li><li><p><code>npm install &lt;name&gt;@&lt;tag&gt;</code>:
++Install the version of the package that is referenced by the specified tag.
  If the tag does not exist in the registry data for that package, then this
--will fail.</p><p>Example:</p><pre><code>  npm install sax@latest</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version&gt;</code>:</p><p>Install the specified version of the package.  This will fail if the version
--has not been published to the registry.</p><p>Example:</p><pre><code>  npm install sax@0.1.1</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version range&gt;</code>:</p><p>Install a version of the package matching the specified version range.  This
++will fail.</p><p>Example:</p><pre><code>npm install sax@latest</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version&gt;</code>:
++Install the specified version of the package.  This will fail if the version
++has not been published to the registry.</p><p>Example:</p><pre><code>npm install sax@0.1.1</code></pre></li><li><p><code>npm install &lt;name&gt;@&lt;version range&gt;</code>:
++Install a version of the package matching the specified version range.  This
  will follow the same rules for resolving dependencies described in <code><a href="../doc/json.html">json(1)</a></code>.</p><p>Note that most version ranges must be put in quotes so that your shell will
--treat it as a single argument.</p><p>Example:</p><p>      npm install sax@"&gt;=0.1.0 &lt;0.2.0"</p></li><li><p><code>npm install &lt;git remote url&gt;</code>:</p><p>Install a package by cloning a git remote url.  The format of the git
--url is:</p><p>      &lt;protocol&gt;://[&lt;user&gt;@]&lt;hostname&gt;&lt;separator&gt;&lt;path&gt;[#&lt;commit-ish&gt;]</p><p><code>&lt;protocol&gt;</code> is one of <code>git</code>, <code>git+ssh</code>, <code>git+http</code>, or
++treat it as a single argument.</p><p>Example:</p><pre><code>npm install sax@"&gt;=0.1.0 &lt;0.2.0"</code></pre></li><li><p><code>npm install &lt;git remote url&gt;</code>:</p><p>Install a package by cloning a git remote url.  The format of the git
++url is:</p><pre><code>&lt;protocol&gt;://[&lt;user&gt;@]&lt;hostname&gt;&lt;separator&gt;&lt;path&gt;[#&lt;commit-ish&gt;]</code></pre><p><code>&lt;protocol&gt;</code> is one of <code>git</code>, <code>git+ssh</code>, <code>git+http</code>, or
  <code>git+https</code>.  If no <code>&lt;commit-ish&gt;</code> is specified, then <code>master</code> is
--used.</p><p>Examples:</p><pre><code>  git+ssh://git@github.com:isaacs/npm.git#v1.0.27
--  git+https://isaacs@github.com/isaacs/npm.git
--  git://github.com/isaacs/npm.git#v1.0.27</code></pre></li></ul>
++used.</p><p>Examples:</p><pre><code>git+ssh://git@github.com:isaacs/npm.git#v1.0.27
++git+https://isaacs@github.com/isaacs/npm.git
++git://github.com/isaacs/npm.git#v1.0.27</code></pre></li></ul>
  
  <p>You may combine multiple arguments, and even multiple types of arguments.
  For example:</p>
@@@ -131,9 -131,9 +132,9 @@@ affects a real use-case, it will be inv
  
  <h2 id="SEE-ALSO">SEE ALSO</h2>
  
--<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/shrinkwrap.html">shrinkwrap(1)</a></li></ul>
++<ul><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/rebuild.html">rebuild(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li></ul>
  </div>
- <p id="footer">install &mdash; npm@1.1.18</p>
 -<p id="footer">install &mdash; npm@1.1.21</p>
++<p id="footer">install &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 686992b0cc2562958487ad08f571d4db73ad813f,480d6841275d9d85d903aca8dfd7b2fa25a89f93..54e29f8b736ddb42badc74862cbd40b69ae1724e
@@@ -311,7 -311,7 +311,7 @@@ space-separated descriptors, OR a rang
  <p>Version range descriptors may be any of the following styles, where "version"
  is a semver compatible version identifier.</p>
  
--<ul><li><code>version</code> Must match <code>version</code> exactly</li><li><code>=version</code> Same as just <code>version</code></li><li><code>&gt;version</code> Must be greater than <code>version</code></li><li><code>&gt;=version</code> etc</li><li><code>&lt;version</code></li><li><code>&lt;=version</code></li><li><code>~version</code> See 'Tilde Version Ranges' below</li><li><code>1.2.x</code> See 'X Version Ranges' below</li><li><code>http://...</code> See 'URLs as Dependencies' below</li><li><code>*</code> Matches any version</li><li><code>""</code> (just an empty string) Same as <code>*</code></li><li><code>version1 - version2</code> Same as <code>&gt;=version1 &lt;=version2</code>.</li><li><code>range1 || range2</code> Passes if either range1 or range2 are satisfied.</li><li><code>git...</code> See 'Git URLs as Dependencies' below</li></ul>
++<ul><li><code>version</code> Must match <code>version</code> exactly</li><li><code>=version</code> Same as just <code>version</code></li><li><code>&gt;version</code> Must be greater than <code>version</code></li><li><code>&gt;=version</code> etc</li><li><code>&lt;version</code></li><li><code>&lt;=version</code></li><li><code>~version</code> See 'Tilde Version Ranges' below</li><li><code>1.2.x</code> See 'X Version Ranges' below</li><li><code>http://...</code> See 'URLs as Dependencies' below</li><li><code>*</code> Matches any version</li><li><code>""</code> (just an empty string) Same as <code>*</code></li><li><code>version1 - version2</code> Same as <code>&gt;=version1 &lt;=version2</code>.</li><li><code>range1 || range2</code> Passes if either range1 or range2 are satisfied.</li></ul>
  
  <p>For example, these are all valid:</p>
  
@@@ -360,18 -360,18 +360,6 @@@ of a version range.</p
  <p>This tarball will be downloaded and installed locally to your package at
  install time.</p>
  
--<h3 id="Git-URLs-as-Dependencies">Git URLs as Dependencies</h3>
--
--<p>Git urls can be of the form:</p>
--
--<pre><code>git://github.com/user/project.git#commit-ish
--git+ssh://user@hostname:project.git#commit-ish
--git+http://user@hostname/project/blah.git#commit-ish
--git+https://user@hostname/project/blah.git#commit-ish</code></pre>
--
--<p>The <code>commit-ish</code> can be any tag, sha, or branch which can be supplied as
--an argument to <code>git checkout</code>.  The default is <code>master</code>.</p>
--
  <h2 id="devDependencies">devDependencies</h2>
  
  <p>If someone is planning on downloading and using your module in their
@@@ -411,36 -411,36 +399,6 @@@ are capable of properly installing you
  
  <pre><code>{ "engines" : { "npm" : "~1.0.20" } }</code></pre>
  
--<h2 id="os">os</h2>
--
--<p>You can specify which operating systems your
--module will run on:</p>
--
--<pre><code>"os" : [ "darwin", "linux" ]</code></pre>
--
--<p>You can also blacklist instead of whitelist operating systems,
--just prepend the blacklisted os with a '!':</p>
--
--<pre><code>"os" : [ "!win32" ]</code></pre>
--
--<p>The host operating system is determined by <code>process.platform</code></p>
--
--<p>It is allowed to both blacklist, and whitelist, although there isn't any
--good reason to do this.</p>
--
--<h2 id="cpu">cpu</h2>
--
--<p>If your code only runs on certain cpu architectures,
--you can specify which ones.</p>
--
--<pre><code>"cpu" : [ "x64", "ia32" ]</code></pre>
--
--<p>Like the <code>os</code> option, you can also blacklist architectures:</p>
--
--<pre><code>"cpu" : [ "!arm", "!mips" ]</code></pre>
--
--<p>The host architecture is determined by <code>process.arch</code></p>
--
  <h2 id="preferGlobal">preferGlobal</h2>
  
  <p>If your package is primarily a command-line application that should be
@@@ -457,7 -457,7 +415,7 @@@ to publish it.</p
  
  <p>This is a way to prevent accidental publication of private repositories.
  If you would like to ensure that a given package is only ever published
--to a specific registry (for example, an internal registry),
++to a speciic registry (for example, an internal registry),
  then use the <code>publishConfig</code> hash described below
  to override the <code>registry</code> config param at publish-time.</p>
  
@@@ -478,7 -478,7 +436,7 @@@ overridden.</p
  
  <ul><li><a href="../doc/semver.html">semver(1)</a></li><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/version.html">version(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/rm.html">rm(1)</a></li></ul>
  </div>
- <p id="footer">json &mdash; npm@1.1.18</p>
 -<p id="footer">json &mdash; npm@1.1.21</p>
++<p id="footer">json &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 10791fe94fdedc323643172103a62e6354e714f7,26768342111b1fd208e7b7b728338c58c58470fc..95cdbdd84679438af6e6294e39b3abdcf44d3bbf
@@@ -58,7 -58,7 +58,7 @@@ installation target into your project'
  
  <ul><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">link &mdash; npm@1.1.18</p>
 -<p id="footer">link &mdash; npm@1.1.21</p>
++<p id="footer">link &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 74862a6d4ef8b52d5aed1c7492a9086ab110b6ca,615d1119a594818cc5c7ee753c6978cc58b708a5..4d25dd7033dc6da7ccff3cbaead8187c1f43d983
@@@ -29,12 -29,12 +29,6 @@@ like with any other command, such as <c
  
  <h2 id="CONFIGURATION">CONFIGURATION</h2>
  
--<h3 id="json">json</h3>
--
--<ul><li>Default: false</li><li>Type: Boolean</li></ul>
--
--<p>Show information in JSON format.</p>
--
  <h3 id="long">long</h3>
  
  <ul><li>Default: false</li><li>Type: Boolean</li></ul>
@@@ -58,7 -58,7 +52,7 @@@ project.</p
  
  <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/link.html">link(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/update.html">update(1)</a></li></ul>
  </div>
- <p id="footer">list &mdash; npm@1.1.18</p>
 -<p id="footer">list &mdash; npm@1.1.21</p>
++<p id="footer">list &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 1ec20192c5ffa8614e911a2df6a9ba4987f2b2ef,5d80a30f13edabebef76e4ffa3555f7495db7439..ba12b6edabdfb26101928c5a2ebb1b42bbed487c
@@@ -14,7 -14,7 +14,7 @@@
  
  <h2 id="VERSION">VERSION</h2>
  
- <p>1.1.18</p>
 -<p>1.1.21</p>
++<p>1.1.0-2</p>
  
  <h2 id="DESCRIPTION">DESCRIPTION</h2>
  
@@@ -135,7 -135,7 +135,7 @@@ will no doubt tell you to put the outpu
  
  <ul><li><a href="../doc/help.html">help(1)</a></li><li><a href="../doc/faq.html">faq(1)</a></li><li><a href="../doc/README.html">README</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/index.html">index(1)</a></li><li><a href="../api/npm.html">npm(3)</a></li></ul>
  </div>
- <p id="footer">npm &mdash; npm@1.1.18</p>
 -<p id="footer">npm &mdash; npm@1.1.21</p>
++<p id="footer">npm &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e7940fd8e29f3b2b61722ee4ac7df022020ab3ba,0067966efb25445a30ef31a4bba2a01bc50b727d..63f6017441b1e3cf2ac0c86184cf0a95adbb6737
@@@ -21,7 -21,7 +21,7 @@@ packages are currently outdated.</p
  
  <ul><li><a href="../doc/update.html">update(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li></ul>
  </div>
- <p id="footer">outdated &mdash; npm@1.1.18</p>
 -<p id="footer">outdated &mdash; npm@1.1.21</p>
++<p id="footer">outdated &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 1265d51713edaf88a17c25b0f3ee2eebadb555d9,4a8a77ddc825c7e5c17dc5a02fbad7f0e7aa4a96..828307eeec983866d5ccd8f8df74e0b04bca1bbe
@@@ -34,7 -34,7 +34,7 @@@ that is not implemented at this time.</
  
  <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
  </div>
- <p id="footer">owner &mdash; npm@1.1.18</p>
 -<p id="footer">owner &mdash; npm@1.1.21</p>
++<p id="footer">owner &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index d49f2b4588d0424874be8682a7e83e13016c8598,290263cf1b868f15a9cb2bb723e9de3b03c2a9ce..6d77e17f9a65a3fb78b0f245974bb75e98831cfd
@@@ -29,7 -29,7 +29,7 @@@ overwritten the second time.</p
  
  <ul><li><a href="../doc/cache.html">cache(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">pack &mdash; npm@1.1.18</p>
 -<p id="footer">pack &mdash; npm@1.1.21</p>
++<p id="footer">pack &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 91df87a228e131e515180c5bcb6664416d3fbaab,dfa853df1e491bcd11aa8c96032b742ac8dea969..eca0805abe626bf27c3e95056eb1914c77f00d38
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/root.html">root(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">prefix &mdash; npm@1.1.18</p>
 -<p id="footer">prefix &mdash; npm@1.1.21</p>
++<p id="footer">prefix &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index c8ae0c632ce340ae59fb48e09017f57479c29d88,01474455cf55b12111d04bfca8c3d8cf57113511..fc2e919c7e5b5955d53f5240c80ba9bebbe4b35c
@@@ -25,7 -25,7 +25,7 @@@ package's dependencies list.</p
  
  <ul><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
  </div>
- <p id="footer">prune &mdash; npm@1.1.18</p>
 -<p id="footer">prune &mdash; npm@1.1.21</p>
++<p id="footer">prune &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 523d195d8468853957ede0df940bb27de3dc071a,ff1d113e3ecb84642da8ad4d71680c32044e49b4..46662fad0e87ff2903b4f110156cbe43dc6fcd1d
@@@ -29,7 -29,7 +29,7 @@@ the registry.  Overwrites when the "--f
  
  <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/tag.html">tag(1)</a></li></ul>
  </div>
- <p id="footer">publish &mdash; npm@1.1.18</p>
 -<p id="footer">publish &mdash; npm@1.1.21</p>
++<p id="footer">publish &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 206ac82a4d8e51fa9ba9332da4649ad46ab9c9d8,e6525296335886e055040196c5368fd8956fffd4..fea67ea0c6194038a7a50a199002e23a019befda
@@@ -25,7 -25,7 +25,7 @@@ the new binary.</p
  
  <ul><li><a href="../doc/build.html">build(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
  </div>
- <p id="footer">rebuild &mdash; npm@1.1.18</p>
 -<p id="footer">rebuild &mdash; npm@1.1.21</p>
++<p id="footer">rebuild &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 9748847c522a4bca165b7d378ef0911846ff2b90,786603edd0eeaa75ef58a76f46a67e91f5e03aa6..ed4455513a711bcf65f81f45ce7bf0d3738c82a0
@@@ -97,7 -97,7 +97,7 @@@ ask for help on the <a href="mailto:npm
  
  <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/disputes.html">disputes(1)</a></li></ul>
  </div>
- <p id="footer">registry &mdash; npm@1.1.18</p>
 -<p id="footer">registry &mdash; npm@1.1.21</p>
++<p id="footer">registry &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 0e8bfabddcfcef9a14e49254ae9fd25c34b89d10,4124f41a6a2544d9f6c14e8c00ca162c7a171f63..06109b0378f15a5a2e21eae5fd02c76fdaaf4d2d
@@@ -58,7 -58,7 +58,7 @@@ modules.  To track those down, you can 
  
  <ul><li><a href="../doc/README.html">README</a></li><li><a href="../doc/rm.html">rm(1)</a></li><li><a href="../doc/prune.html">prune(1)</a></li></ul>
  </div>
- <p id="footer">removing-npm &mdash; npm@1.1.18</p>
 -<p id="footer">removing-npm &mdash; npm@1.1.21</p>
++<p id="footer">removing-npm &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 44f987fe6512bfe0e4398a4ce17cdc7a4cf9d231,21990f067560f8683e35b1ecdbc050b61619c4e3..07fe2c36a3a90c9556cc48628fc4ecc2e02934de
@@@ -24,7 -24,7 +24,7 @@@ the "start" script.</p
  
  <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
  </div>
- <p id="footer">restart &mdash; npm@1.1.18</p>
 -<p id="footer">restart &mdash; npm@1.1.21</p>
++<p id="footer">restart &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 3cca20a70b85abd3c6fccd86a8628ffc70f3a656,a7874010ad69268981b787ebb5f0171f87d49f67..fb5bb965ed503a5a362613c9b799f98d5bda60d8
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/prefix.html">prefix(1)</a></li><li><a href="../doc/bin.html">bin(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">root &mdash; npm@1.1.18</p>
 -<p id="footer">root &mdash; npm@1.1.21</p>
++<p id="footer">root &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 14ce47ed0b29a29f633a3aa285aeea044642832d,d10e7353fc2b2f769d94cc672c1d99b9f5a2d27c..f9706a79d1e2abb3babcc897e96cc3f9d15f5274
@@@ -23,7 -23,7 +23,7 @@@ called directly, as well.</p
  
  <ul><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
  </div>
- <p id="footer">run-script &mdash; npm@1.1.18</p>
 -<p id="footer">run-script &mdash; npm@1.1.21</p>
++<p id="footer">run-script &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 11d75e10a01300e49e2b94ba62c38f7de409d15d,39a813998d12bbb87ce6a089078b7bbfe78c216e..16b3026d29c8e50366a959ec4daf52bc4bf2e8cc
@@@ -52,19 -52,19 +52,6 @@@ privileges.</p
  made available regarding the setup of npm and the current state of the
  process.</p>
  
--<h3 id="path">path</h3>
--
--<p>If you depend on modules that define executable scripts, like test suites,
--then those executables will be added to the <code>PATH</code> for executing the scripts.
--So, if your package.json has this:</p>
--
--<pre><code>{ "name" : "foo"
--, "dependencies" : { "bar" : "0.1.x" }
--, "scripts": { "start" : "bar ./test" } }</code></pre>
--
--<p>then you could run <code>npm start</code> to execute the <code>bar</code> script, which is exported
--into the <code>node_modules/.bin</code> directory on <code>npm install</code>.</p>
--
  <h3 id="package-json-vars">package.json vars</h3>
  
  <p>The package.json fields are tacked onto the <code>npm_package_</code> prefix. So, for
@@@ -177,7 -177,7 +164,7 @@@ will sudo the npm command in question.<
  
  <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/developers.html">developers(1)</a></li><li><a href="../doc/install.html">install(1)</a></li></ul>
  </div>
- <p id="footer">scripts &mdash; npm@1.1.18</p>
 -<p id="footer">scripts &mdash; npm@1.1.21</p>
++<p id="footer">scripts &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 67f3b6ec445e14785164f9fea65eb93f79a8004a,2fbcaf438a5e13ed5649b9c82e11b4a74d0aa4ed..dc451277db1e0964197cd801d97be50ea4e277c5
@@@ -24,7 -24,7 +24,7 @@@ expression characters must be escaped o
  
  <ul><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/view.html">view(1)</a></li></ul>
  </div>
- <p id="footer">search &mdash; npm@1.1.18</p>
 -<p id="footer">search &mdash; npm@1.1.21</p>
++<p id="footer">search &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 583f9b13e564dd8962863a8bc536942721844dff,909c55e5cf1165cbb0077c9c596e35e3a9f3d5c1..7ca3e4d6f73e77fe7e5bcd1b0b0cf8ffdb904240
@@@ -104,7 -104,7 +104,7 @@@ that satisfies the range, or null if no
  
  <ul><li><a href="../doc/json.html">json(1)</a></li></ul>
  </div>
- <p id="footer">semver &mdash; npm@1.1.18</p>
 -<p id="footer">semver &mdash; npm@1.1.21</p>
++<p id="footer">semver &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index ba6335d818c16e840d485ee0a17d5172333ab771,158ed099422f5986e76f3a7a47a0f665c2fe5658..a146e225630f2033b6bba7eef85835863d144c3b
@@@ -169,7 -169,7 +169,7 @@@ versions.</p
  
  <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
  </div>
- <p id="footer">shrinkwrap &mdash; npm@1.1.18</p>
 -<p id="footer">shrinkwrap &mdash; npm@1.1.21</p>
++<p id="footer">shrinkwrap &mdash; npm@1.1.16</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index a662e118084901edd3dbfe90d3113bff4e2a81f4,3aebbcdb4853c04855a8fc4bb0b75198d1c971f6..fac1ab74b5d7bbff7d876a626fdc169078b46a7c
@@@ -26,7 -26,7 +26,7 @@@ a vaguely positive way to show that yo
  
  <ul><li><a href="../doc/view.html">view(1)</a></li><li><a href="../doc/whoami.html">whoami(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
  </div>
- <p id="footer">star &mdash; npm@1.1.18</p>
 -<p id="footer">star &mdash; npm@1.1.21</p>
++<p id="footer">star &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 92613baeab5c137d8d5650f4f100aede41139649,f86e9d8465c88f871c6ca7931894ac7b01ccf71c..f9c7fe807790065893f268cb1747e6aebdc2b2bb
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
  </div>
- <p id="footer">start &mdash; npm@1.1.18</p>
 -<p id="footer">start &mdash; npm@1.1.21</p>
++<p id="footer">start &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 05e61013098bd72168170ad4b4c8212910aa6fe6,d3565a05ecd8ca7585af0ea5e5d135fcae34fd66..a954d8a9229c57886a888af5f15cb2d28d847075
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/test.html">test(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li></ul>
  </div>
- <p id="footer">stop &mdash; npm@1.1.18</p>
 -<p id="footer">stop &mdash; npm@1.1.21</p>
++<p id="footer">stop &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 3207241858b96ac12c00f22d9a900b050f3850e2,7f26dc91fb9a0d286ce118dd94cfbc361401d44a..0b4206e73598fd392ae3d642e08fb298751408f7
@@@ -33,7 -33,7 +33,7 @@@ dependencies into the submodule folder.
  
  <ul><li><a href="../doc/json.html">json(1)</a></li><li>git help submodule</li></ul>
  </div>
- <p id="footer">submodule &mdash; npm@1.1.18</p>
 -<p id="footer">submodule &mdash; npm@1.1.21</p>
++<p id="footer">submodule &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 3b299e2b569adcf17f6a41268473dc79d6bdd587,bfb5a58934e4e3523cc418e8e29b36a2941f7c9e..9976dc5c8caa744cba430290448403391d4184f8
@@@ -21,7 -21,7 +21,7 @@@
  
  <ul><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">tag &mdash; npm@1.1.18</p>
 -<p id="footer">tag &mdash; npm@1.1.21</p>
++<p id="footer">tag &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 2cc4f3dbdcb6ff1a5fb53c6c8a79ce30b4c0291d,51f7ee6ee7b16ac88d3b1e88affeff2c6f1f26c6..9209e40e0e5b3ad15df465568d21e82de1003155
@@@ -23,7 -23,7 +23,7 @@@ true.</p
  
  <ul><li><a href="../doc/run-script.html">run-script(1)</a></li><li><a href="../doc/scripts.html">scripts(1)</a></li><li><a href="../doc/start.html">start(1)</a></li><li><a href="../doc/restart.html">restart(1)</a></li><li><a href="../doc/stop.html">stop(1)</a></li></ul>
  </div>
- <p id="footer">test &mdash; npm@1.1.18</p>
 -<p id="footer">test &mdash; npm@1.1.21</p>
++<p id="footer">test &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 2223c0ca4a643b80f3cd1deee95dac66ad92304a,96cee41022fae071bf4e10331959f38abe121667..867e6af43a73c6c1d704a7bd15f4b18ab8ec6251
@@@ -22,7 -22,7 +22,7 @@@ on its behalf.</p
  
  <ul><li><a href="../doc/prune.html">prune(1)</a></li><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/config.html">config(1)</a></li></ul>
  </div>
- <p id="footer">uninstall &mdash; npm@1.1.18</p>
 -<p id="footer">uninstall &mdash; npm@1.1.21</p>
++<p id="footer">uninstall &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index bfae9b839786ed264829c02d7344864be269f4e9,573a9e2e1acea00b3abe2bd7aafedf2103ceaee0..51fa5811e5ec748497771dccf93d80da944535f3
@@@ -34,7 -34,7 +34,7 @@@ the root package entry is removed from 
  
  <ul><li><a href="../doc/deprecate.html">deprecate(1)</a></li><li><a href="../doc/publish.html">publish(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li><li><a href="../doc/owner.html">owner(1)</a></li></ul>
  </div>
- <p id="footer">unpublish &mdash; npm@1.1.18</p>
 -<p id="footer">unpublish &mdash; npm@1.1.21</p>
++<p id="footer">unpublish &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 98c2e9cd0059bee702c05d9b9792384463a0894e,eb1b20c7524694f5b35b9ce4c646642ae2dec60c..e41dbfb11b5e22a71ab5da0d3c882f0c5c7d9cf9
@@@ -23,7 -23,7 +23,7 @@@
  
  <ul><li><a href="../doc/install.html">install(1)</a></li><li><a href="../doc/outdated.html">outdated(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/folders.html">folders(1)</a></li><li><a href="../doc/list.html">list(1)</a></li></ul>
  </div>
- <p id="footer">update &mdash; npm@1.1.18</p>
 -<p id="footer">update &mdash; npm@1.1.21</p>
++<p id="footer">update &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index dbf5b105ff7952a23eb350c63402c77813ffa8b6,d85cad0343182b69a4a538a6bbf510d668df5ac1..63d93a3d94173da79cb454655f02482769254c5d
@@@ -31,7 -31,7 +31,7 @@@ will use it as a commit message when cr
  
  <ul><li><a href="../doc/init.html">init(1)</a></li><li><a href="../doc/json.html">json(1)</a></li><li><a href="../doc/semver.html">semver(1)</a></li></ul>
  </div>
- <p id="footer">version &mdash; npm@1.1.18</p>
 -<p id="footer">version &mdash; npm@1.1.21</p>
++<p id="footer">version &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 0d12ecf4b077f136087fccee314c65298ba40fbb,2327cf8fb4313bb9dfa92e035eee789bc1536f79..fe97f2e5d7445f72e38368ca6a37aae858d59fd0
@@@ -88,7 -88,7 +88,7 @@@ the field name.</p
  
  <ul><li><a href="../doc/search.html">search(1)</a></li><li><a href="../doc/registry.html">registry(1)</a></li><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/docs.html">docs(1)</a></li></ul>
  </div>
- <p id="footer">view &mdash; npm@1.1.18</p>
 -<p id="footer">view &mdash; npm@1.1.21</p>
++<p id="footer">view &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index e835c716c26bcd57158cc13d25baf959753d8b71,600c1893c5a641f55093b3978abc220771700e95..b4b2a9bb988259d1a90692df340c82747a0a2b06
@@@ -20,7 -20,7 +20,7 @@@
  
  <ul><li><a href="../doc/config.html">config(1)</a></li><li><a href="../doc/adduser.html">adduser(1)</a></li></ul>
  </div>
- <p id="footer">whoami &mdash; npm@1.1.18</p>
 -<p id="footer">whoami &mdash; npm@1.1.21</p>
++<p id="footer">whoami &mdash; npm@1.1.0-2</p>
  <script>
  ;(function () {
  var wrapper = document.getElementById("wrapper")
index 4a97cd3e7ab716520320d95f6b3f6cc85f89cb89,4a97cd3e7ab716520320d95f6b3f6cc85f89cb89..9ccf28e57ca4c7c60937fa038e1d2205e717f207
@@@ -59,14 -59,14 +59,11 @@@ code { background:#fff ; outline: 1px s
  <p>npm is a package manager for <a href="http://nodejs.org/">node</a>.  You can use it to install
    and publish your node programs.  It manages dependencies and does other cool stuff.</p>
  
--<h2>Easy Zero Line Install</h2>
++<h2>One Line Install</h2>
  
--<p><a href="http://nodejs.org/#download">Install Node.js</a> <br>
--(npm comes with it.)</p>
++<code>curl http://npmjs.org/install.sh | sh</code>
  
--<p>Because a one-line install is one too many.</p>
--
--<h2>Fancy Install</h2>
++<h2>More Than One Line Install</h2>
  
  <ol>
    <li><a href="https://github.com/isaacs/npm">Get the code.</a>
        says to do.
  </ol>
  
--<p>There's a pretty thorough install script at
--<a href="http://npmjs.org/install.sh">http://npmjs.org/install.sh</a></p>
--
--<p>For maximum security, make sure to thorougly inspect every
--program that you run on your computer!</p>
--
  <h2>Other Cool Stuff</h2>
  
  <ul>
index 7982746cfb206c3fe70e0ece82ef2f0d7d547af3,7982746cfb206c3fe70e0ece82ef2f0d7d547af3..a3a017cc02be6e4cbf458a9a78801e3b9c70953e
@@@ -28,7 -28,7 +28,7 @@@ function bugs (args, cb) 
      }
      if (repo) {
        if (Array.isArray(repo)) repo = repo.shift()
--      if (repo.hasOwnProperty("url")) repo = repo.url
++      if (repo.url) repo = repo.url
        log.verbose(repo, "repository")
        if (repo && repo.match(/^(https?:\/\/|git(:\/\/|@))github.com/)) {
          return open(repo.replace(/^git(@|:\/\/)/, "http://")
index b62e82dd1426b03c52ab95933e37d9e3054c775f,b62e82dd1426b03c52ab95933e37d9e3054c775f..3dc1fb3a0a3889e9512df1a7c253f81476b0e0b5
@@@ -3,10 -3,10 +3,11 @@@
  /*
  adding a folder:
  1. tar into tmp/random/package.tgz
--2. untar into tmp/random/contents/package, stripping one dir piece
--3. tar tmp/random/contents/package to cache/n/v/package.tgz
--4. untar cache/n/v/package.tgz into cache/n/v/package
--5. rm tmp/random
++2. untar into tmp/random/contents/{blah}
++3. rename {blah} to "package"
++4. tar tmp/random/contents/package to cache/n/v/package.tgz
++5. untar cache/n/v/package.tgz into cache/n/v/package
++6. rm tmp/random
  
  Adding a url:
  1. fetch to tmp/random/package.tgz
@@@ -31,7 -31,7 +32,7 @@@ exports.read = rea
  exports.clean = clean
  exports.unpack = unpack
  
--var mkdir = require("mkdirp")
++var mkdir = require("./utils/mkdir-p.js")
    , exec = require("./utils/exec.js")
    , fetch = require("./utils/fetch.js")
    , npm = require("./npm.js")
@@@ -49,7 -49,7 +50,6 @@@
    , tar = require("./utils/tar.js")
    , fileCompletion = require("./utils/completion/file-completion.js")
    , url = require("url")
--  , chownr = require("chownr")
  
  cache.usage = "npm cache add <tarball file>"
              + "\nnpm cache add <folder>"
@@@ -95,10 -95,10 +95,12 @@@ function cache (args, cb) 
  // if the pkg and ver are in the cache, then
  // just do a readJson and return.
  // if they're not, then fetch them from the registry.
++var cacheSeen = {}
  function read (name, ver, forceBypass, cb) {
    if (typeof cb !== "function") cb = forceBypass, forceBypass = true
    var jsonFile = path.join(npm.cache, name, ver, "package", "package.json")
    function c (er, data) {
++    if (!er) cacheSeen[data._id] = data
      if (data) deprCheck(data)
      return cb(er, data)
    }
      return addNamed(name, ver, c)
    }
  
++  if (name+"@"+ver in cacheSeen) {
++    return cb(null, cacheSeen[name+"@"+ver])
++  }
++
    readJson(jsonFile, function (er, data) {
      if (er) return addNamed(name, ver, c)
      deprCheck(data)
@@@ -120,13 -120,13 +126,9 @@@ function ls (args, cb) 
    output = output || require("./utils/output.js")
    args = args.join("/").split("@").join("/")
    if (args.substr(-1) === "/") args = args.substr(0, args.length - 1)
--  var prefix = npm.config.get("cache")
--  if (0 === prefix.indexOf(process.env.HOME)) {
--    prefix = "~" + prefix.substr(process.env.HOME.length)
--  }
    ls_(args, npm.config.get("depth"), function(er, files) {
      output.write(files.map(function (f) {
--      return path.join(prefix, f)
++      return path.join("~/.npm", f)
      }).join("\n").trim(), function (er) {
        return cb(er, files)
      })
@@@ -210,7 -210,7 +212,7 @@@ function add (args, cb) 
  
    // see if the spec is a url
    // otherwise, treat as name@version
--  var p = url.parse(spec) || {}
++  var p = url.parse(spec.replace(/^git\+/, "git")) || {}
    log.verbose(p, "parsed url")
  
    // it could be that we got name@http://blah
      case "https:":
        return addRemoteTarball(spec, null, name, cb)
      case "git:":
--    case "git+http:":
--    case "git+https:":
--    case "git+rsync:":
--    case "git+ftp:":
--    case "git+ssh:":
++    case "githttp:":
++    case "githttps:":
++    case "gitrsync:":
++    case "gitftp:":
++    case "gitssh:":
        //p.protocol = p.protocol.replace(/^git([^:])/, "$1")
        return addRemoteGit(spec, p, name, cb)
      default:
@@@ -634,7 -634,7 +636,7 @@@ function getCacheStat (cb) 
  }
  
  function makeCacheDir (cb) {
--  if (!process.getuid) return mkdir(npm.cache, cb)
++  if (!process.getuid) return mkdir(npm.cache, npm.modes.exec, cb)
  
    var uid = +process.getuid()
      , gid = +process.getgid()
    }
    if (uid !== 0 || !process.env.HOME) {
      cacheStat = {uid: uid, gid: gid}
--    return mkdir(npm.cache, afterMkdir)
++    return mkdir(npm.cache, npm.modes.exec, uid, gid, function (er) {
++      return cb(er, cacheStat)
++    })
    }
--
    fs.stat(process.env.HOME, function (er, st) {
      if (er) return log.er(cb, "homeless?")(er)
      cacheStat = st
      log.silly([st.uid, st.gid], "uid, gid for cache dir")
--    return mkdir(npm.cache, afterMkdir)
--  })
--
--  function afterMkdir (er, made) {
--    if (er || !cacheStat || isNaN(cacheStat.uid) || isNaN(cacheStat.gid)) {
--      return cb(er, cacheStat)
--    }
--
--    if (!made) return cb(er, cacheStat)
--
--    // ensure that the ownership is correct.
--    chownr(made, cacheStat.uid, cacheStat.gid, function (er) {
++    return mkdir(npm.cache, npm.modes.exec, st.uid, st.gid, function (er) {
        return cb(er, cacheStat)
      })
--  }
++  })
  }
  
  
@@@ -744,20 -744,20 +736,9 @@@ function addLocalDirectory (p, name, cb
        , tgz = placeDirect ? placed : tmptgz
        , doFancyCrap = p.indexOf(npm.tmp) !== 0
                      && p.indexOf(npm.cache) !== 0
--    getCacheStat(function (er, cs) {
--      mkdir(path.dirname(tgz), function (er, made) {
--        if (er) return cb(er)
--        tar.pack(tgz, p, data, doFancyCrap, function (er) {
--          if (er) return log.er(cb,"couldn't pack "+p+ " to "+tgz)(er)
--
--          if (er || !cs || isNaN(cs.uid) || isNaN(cs.gid)) return cb()
--
--          chownr(made || tgz, cs.uid, cs.gid, function (er) {
--            if (er) return cb(er)
--            addLocalTarball(tgz, name, cb)
--          })
--        })
--      })
++    tar.pack(tgz, p, data, doFancyCrap, function (er) {
++      if (er) return log.er(cb,"couldn't pack "+p+ " to "+tgz)(er)
++      addLocalTarball(tgz, name, cb)
      })
    })
  }
@@@ -766,15 -766,15 +747,36 @@@ function addTmpTarball (tgz, name, cb) 
    if (!cb) cb = name, name = ""
    getCacheStat(function (er, cs) {
      if (er) return cb(er)
--    var contents = path.dirname(tgz)
--    tar.unpack( tgz, path.resolve(contents, "package")
--              , null, null
--              , cs.uid, cs.gid
--              , function (er) {
--      if (er) {
--        return cb(er)
++    return addTmpTarball_(tgz, name, cs.uid, cs.gid, cb)
++  })
++}
++
++function addTmpTarball_ (tgz, name, uid, gid, cb) {
++  var contents = path.resolve(path.dirname(tgz))  // , "contents")
++  tar.unpack( tgz, path.resolve(contents, "package")
++            , null, null
++            , uid, gid
++            , function (er) {
++    if (er) return log.er(cb, "couldn't unpack "+tgz+" to "+contents)(er)
++    fs.readdir(contents, function (er, folder) {
++      if (er) return log.er(cb, "couldn't readdir "+contents)(er)
++      log.verbose(folder, "tarball contents")
++      if (folder.length > 1) {
++        folder = folder.filter(function (f) {
++          return !f.match(/^\.|^tmp\.tgz$/)
++        })
++      }
++      if (folder.length > 1) {
++        log.warn(folder.slice(1).join("\n")
++                ,"extra junk in folder, ignoring")
        }
--      addLocalDirectory(path.resolve(contents, "package"), name, cb)
++      if (!folder.length) return cb(new Error("Empty package tarball"))
++      folder = path.join(contents, folder[0])
++      var newName = path.join(contents, "package")
++      fs.rename(folder, newName, function (er) {
++        if (er) return log.er(cb, "couldn't rename "+folder+" to package")(er)
++        addLocalDirectory(newName, name, cb)
++      })
      })
    })
  }
@@@ -790,14 -790,14 +792,11 @@@ function unpack (pkg, ver, unpackTarget
        log.error("Could not read data for "+pkg+"@"+ver)
        return cb(er)
      }
--    npm.commands.unbuild([unpackTarget], function (er) {
--      if (er) return cb(er)
--      tar.unpack( path.join(npm.cache, pkg, ver, "package.tgz")
--                , unpackTarget
--                , dMode, fMode
--                , uid, gid
--                , cb )
--    })
++    tar.unpack( path.join(npm.cache, pkg, ver, "package.tgz")
++             , unpackTarget
++             , dMode, fMode
++             , uid, gid
++             , cb )
    })
  }
  
index a69c30ea699632f1f051a8815053090241420165,a69c30ea699632f1f051a8815053090241420165..6781679f1d18d50485afb7f0cc478d2f8caa257d
@@@ -2,12 -2,12 +2,10 @@@
  module.exports = config
  
  config.usage = "npm config set <key> <value>"
--             + "\nnpm config get [<key>]"
++             + "\nnpm config get <key>"
               + "\nnpm config delete <key>"
               + "\nnpm config list"
               + "\nnpm config edit"
--             + "\nnpm set <key> <value>"
--             + "\nnpm get [<key>]"
  
  var ini = require("./utils/ini.js")
    , log = require("./utils/log.js")
@@@ -115,9 -115,9 +113,6 @@@ function del (key, cb) 
  }
  
  function set (key, val, cb) {
--  if (key === undefined) {
--    return unknown("", cb)
--  }
    if (val === undefined) {
      if (key.indexOf("=") !== -1) {
        var k = key.split("=")
index 8af4c1bb66fdfebd3b6747a8e8bb92e2cb6d39f8,8af4c1bb66fdfebd3b6747a8e8bb92e2cb6d39f8..de9f71c65467815d74e2b48b647c9e168bc99f6b
@@@ -25,7 -25,7 +25,7 @@@ function docs (args, cb) 
      if (homepage) return open(homepage, cb)
      if (repo) {
        if (Array.isArray(repo)) repo = repo.shift()
--      if (repo.hasOwnProperty("url")) repo = repo.url
++      if (repo.url) repo = repo.url
        log.verbose(repo, "repository")
        if (repo) {
          return open(repo.replace(/^git(@|:\/\/)/, 'http://')
index 7cd7da8e27a932455f85d6dba438717076073216,7cd7da8e27a932455f85d6dba438717076073216..2ddb3e86fc6ab688b505d6c70c74de47312ebf80
@@@ -99,10 -99,10 +99,7 @@@ function init_ (data, folder, cb) 
            , function (er, r) {
                if (er) return cb(er)
                if (r !== "none") {
--                data.repository = (data.repository || {})
--                data.repository.url = r
--              } else {
--                delete data.repository
++                data.repository = (data.repository || {}).url = r
                }
                cb()
              }
          (data.scripts = data.scripts || {}).test = t
        }
      )
++    ( read
++    , [ { prompt: "What versions of node does it run on? "
++        , default: data.engines && data.engines.node || (eng) } ]
++    , function (nodever) {
++        (data.engines = data.engines || {}).node = nodever
++      }
++    )
      (cleanupPaths, [data, folder])
      (function (cb) {
        try { data = readJson.processJson(data) }
index 5873ca968e0efe2a2923bf2e947b79e59fbd33a2,5873ca968e0efe2a2923bf2e947b79e59fbd33a2..1fb6dc30c0a7a0dd6f0f5527972833782c6b90a4
@@@ -1,15 -1,15 +1,14 @@@
++
  // npm install <pkg> <pkg> <pkg>
  //
  // See doc/install.md for more description
  
--// Managing contexts...
--// there's a lot of state associated with an "install" operation, including
--// packages that are already installed, parent packages, current shrinkwrap, and
--// so on. We maintain this state in a "context" object that gets passed around.
--// every time we dive into a deeper node_modules folder, the "family" list that
--// gets passed along uses the previous "family" list as its __proto__.  Any
--// "resolved precise dependency" things that aren't already on this object get
--// added, and then that's passed to the next generation of installation.
++// Managing "family" lists...
++// every time we dive into a deeper node_modules folder, the "family"
++// list that gets passed along uses the previous "family" list as
++// it's __proto__.  Any "resolved precise dependency" things that aren't
++// already on this object get added, and then that's passed to the next
++// generation of installation.
  
  module.exports = install
  
@@@ -21,9 -21,9 +20,7 @@@ install.usage = "npm install <tarball f
                + "\nnpm install <pkg>@<version>"
                + "\nnpm install <pkg>@<version range>"
                + "\n\nCan specify one or more: npm install ./foo.tgz bar@stable /some/folder"
--              + "\nIf no argument is supplied and ./npm-shrinkwrap.json is "
--              + "\npresent, installs dependencies specified in the shrinkwrap."
--              + "\nOtherwise, installs dependencies from ./package.json."
++              + "\nInstalls dependencies in ./package.json if no argument supplied"
  
  install.completion = function (opts, cb) {
    // install can complete to a folder with a package.json, or any package.
@@@ -67,9 -67,9 +64,8 @@@ var npm = require("./npm.js"
    , relativize = require("./utils/relativize.js")
    , output
    , url = require("url")
--  , mkdir = require("mkdirp")
++  , mkdir = require("./utils/mkdir-p.js")
    , lifecycle = require("./utils/lifecycle.js")
--  , archy = require("archy")
  
  function install (args, cb_) {
  
      output = output || require("./utils/output.js")
  
      var tree = treeify(installed)
--      , pretty = prettify(tree, installed).trim()
--
--    if (pretty) output.write(pretty, afterWrite)
--    else afterWrite()
++      , pretty = prettify(tree, installed)
  
--    function afterWrite (er) {
++    output.write(pretty, function (er) {
        if (er) return cb_(er)
        save(where, installed, tree, pretty, cb_)
--    }
++    })
    }
  
    // the /path/to/node_modules/..
      })
    }
  
--  mkdir(where, function (er, made) {
++  mkdir(where, function (er) {
      if (er) return cb(er)
      // install dependencies locally by default,
      // or install current folder globally
      if (!args.length) {
        if (npm.config.get("global")) args = ["."]
--      else return readDependencies( null
--                                  , where
--                                  , { dev: !npm.config.get("production") }
--                                  , function (er, data) {
++      else return readJson( path.resolve(where, "package.json")
++                          , { dev: !npm.config.get("production") }
++                          , function (er, data) {
          if (er) return log.er(cb, "Couldn't read dependencies.")(er)
          var deps = Object.keys(data.dependencies || {})
          log.verbose([where, deps], "where, deps")
--        var context = { family: {}
--                      , ancestors: {}
--                      , explicit: false
--                      , parent: data
--                      , wrap: null }
--        context.family[data.name] = context.ancestors[data.name] = data.version
++        var family = {}
++          , ancestors = {}
++        family[data.name] = ancestors[data.name] = data.version
          installManyTop(deps.map(function (dep) {
            var target = data.dependencies[dep]
              , parsed = url.parse(target.replace(/^git\+/, "git"))
            target = dep + "@" + target
            return target
--        }), where, context, cb)
++        }), where, family, ancestors, false, data, cb)
        })
      }
  
      // initial "family" is the name:version of the root, if it's got
--    // a package.json file.
++    // a pacakge.json file.
      readJson(path.resolve(where, "package.json"), function (er, data) {
        if (er) data = null
--      var context = { family: {}
--                    , ancestors: {}
--                    , explicit: true
--                    , parent: data
--                    , wrap: null }
--      if (data) {
--        context.family[data.name] = context.ancestors[data.name] = data.version
--      }
++      var family = {}
++        , ancestors = {}
++      if (data) family[data.name] = ancestors[data.name] = data.version
        var fn = npm.config.get("global") ? installMany : installManyTop
--      fn(args, where, context, cb)
--    })
--  })
--}
--
--// reads dependencies for the package at "where". There are several cases,
--// depending on our current state and the package's configuration:
--//
--// 1. If "context" is specified, then we examine the context to see if there's a
--//    shrinkwrap there. In that case, dependencies are read from the shrinkwrap.
--// 2. Otherwise, if an npm-shrinkwrap.json file is present, dependencies are
--//    read from there.
--// 3. Otherwise, dependencies come from package.json.
--//
--// Regardless of which case we fall into, "cb" is invoked with a first argument
--// describing the full package (as though readJson had been used) but with
--// "dependencies" read as described above. The second argument to "cb" is the
--// shrinkwrap to use in processing this package's dependencies, which may be
--// "wrap" (in case 1) or a new shrinkwrap (in case 2).
--function readDependencies (context, where, opts, cb) {
--  var wrap = context ? context.wrap : null
--
--  readJson( path.resolve(where, "package.json")
--          , opts
--          , function (er, data) {
--    if (er)  return cb(er)
--
--    if (wrap) {
--      log.verbose([where, wrap], "readDependencies: using existing wrap")
--      var rv = {}
--      Object.keys(data).forEach(function (key) {
--        rv[key] = data[key]
--      })
--      rv.dependencies = {}
--      Object.keys(wrap).forEach(function (key) {
--        log.verbose([key, wrap[key]], "from wrap")
--        var w = wrap[key]
--        rv.dependencies[key] = w.from || w.version
--      })
--      log.verbose([rv.dependencies], "readDependencies: returned deps")
--      return cb(null, rv, wrap)
--    }
--
--    var wrapfile = path.resolve(where, "npm-shrinkwrap.json")
--
--    fs.readFile(wrapfile, "utf8", function (er, wrapjson) {
--      if (er) {
--        log.verbose("readDependencies: using package.json deps")
--        return cb(null, data, null)
--      }
--
--      try {
--        var newwrap = JSON.parse(wrapjson)
--      } catch (ex) {
--        return cb(ex)
--      }
--
--      log.info(wrapfile, "using shrinkwrap file")
--      var rv = {}
--      Object.keys(data).forEach(function (key) {
--        rv[key] = data[key]
--      })
--      rv.dependencies = {}
--      Object.keys(newwrap.dependencies || {}).forEach(function (key) {
--        var w = newwrap.dependencies[key]
--        rv.dependencies[key] = w.from || w.version
--      })
--      log.verbose([rv.dependencies], "readDependencies: returned deps")
--      return cb(null, rv, newwrap.dependencies)
++      fn(args, where, family, ancestors, true, data, cb)
      })
    })
  }
  // as dependencies to a package.json file.
  // This is experimental.
  function save (where, installed, tree, pretty, cb) {
--  if (!npm.config.get("save") &&
--      !npm.config.get("save-dev") &&
--      !npm.config.get("save-optional") ||
--      npm.config.get("global")) {
++  if (!npm.config.get("save") || npm.config.get("global")) {
      return cb(null, installed, tree, pretty)
    }
--
    // each item in the tree is a top-level thing that should be saved
    // to the package.json file.
    // The relevant tree shape is { <folder>: {what:<pkg>} }
    var saveTarget = path.resolve(where, "package.json")
      , things = Object.keys(tree).map(function (k) {
--        // if "what" was a url, then save that instead.
--        var t = tree[k]
--          , u = url.parse(t.from)
--          , w = t.what.split("@")
--        if (u && u.protocol) w[1] = t.from
--        return w
++        return tree[k].what.split("@")
        }).reduce(function (set, k) {
--        var rangeDescriptor = semver.valid(k[1]) &&
--                              semver.gte(k[1], "0.1.0")
--                            ? "~" : ""
++        var rangeDescriptor = semver.gte(k[1], "0.1.0") ? "~" : ""
          set[k[0]] = rangeDescriptor + k[1]
          return set
        }, {})
      } catch (ex) {
        er = ex
      }
--    if (er) {
--      return cb(null, installed, tree, pretty)
++    if (er) return cb(null, installed, tree, pretty)
  
--    }
--
--    var deps = npm.config.get("save-optional") ? "optionalDependencies"
--             : npm.config.get("save-dev") ? "devDependencies"
--             : "dependencies"
++    var deps = npm.config.get("dev") ? "devDependencies" : "dependencies"
++    deps = data[deps] = data[deps] || {}
  
--    data[deps] = data[deps] || {}
      Object.keys(things).forEach(function (t) {
--      data[deps][t] = things[t]
++      deps[t] = things[t]
      })
      data = JSON.stringify(data, null, 2) + "\n"
      fs.writeFile(saveTarget, data, function (er) {
  // Outputting *all* the installed modules is a bit confusing,
  // because the length of the path does not make it clear
  // that the submodules are not immediately require()able.
--// TODO: Show the complete tree, ls-style, but only if --long is provided
++// TODO: Show the complete tree, ls-style.
  function prettify (tree, installed) {
--  if (npm.config.get("json")) {
--    function red (set, kv) {
--      set[kv[0]] = kv[1]
--      return set
--    }
--
--    tree = Object.keys(tree).map(function (p) {
--      if (!tree[p]) return null
--      var what = tree[p].what.split("@")
--        , name = what.shift()
--        , version = what.join("@")
--        , o = { name: name, version: version, from: tree[p].from }
--      o.dependencies = tree[p].children.map(function P (dep) {
--         var what = dep.what.split("@")
--           , name = what.shift()
--           , version = what.join("@")
--           , o = { version: version, from: dep.from }
--         o.dependencies = dep.children.map(P).reduce(red, {})
--         return [name, o]
--       }).reduce(red, {})
--       return o
--    })
--
--    return JSON.stringify(tree, null, 2)
--  }
    if (npm.config.get("parseable")) return parseable(installed)
--
    return Object.keys(tree).map(function (p) {
--    return archy({ label: tree[p].what + " " + p
--                 , nodes: (tree[p].children || []).map(function P (c) {
--                     if (npm.config.get("long")) {
--                       return { label: c.what, nodes: c.children.map(P) }
--                     }
--                     var g = c.children.map(function (g) {
--                       return g.what
--                     }).join(", ")
--                     if (g) g = " (" + g + ")"
--                     return c.what + g
--                   })
--                 })
++    p = tree[p]
++    var c = ""
++    if (p.children && p.children.length) {
++      pref = "\n"
++      var l = p.children.pop()
++      c = p.children.map(function (c) {
++        var gc = c.children && c.children.length
++               ? " (" + c.children.map(function (gc) {
++                   return gc.what
++                 }).join(" ") + ")"
++               : ""
++        return "\n├── " + c.what + gc
++      }).join("") + "\n└── " + l.what
++    }
++    return [p.what, p.where, c].join(" ")
++
    }).join("\n")
  }
  
@@@ -348,13 -348,13 +226,11 @@@ function treeify (installed) 
        , parent = r[2]
        , where = r[1]
        , what = r[0]
--      , from = r[4]
      l[where] = { parentDir: parentDir
                 , parent: parent
                 , children: []
                 , where: where
--               , what: what
--               , from: from }
++               , what: what }
      return l
    }, {})
  
  
  // just like installMany, but also add the existing packages in
  // where/node_modules to the family object.
--function installManyTop (what, where, context, cb_) {
++function installManyTop (what, where, family, ancestors, explicit, parent, cb_) {
++
    function cb (er, d) {
--    if (context.explicit || er) return cb_(er, d)
++    if (explicit || er) return cb_(er, d)
      // since this wasn't an explicit install, let's build the top
      // folder, so that `npm install` also runs the lifecycle scripts.
      npm.commands.build([where], false, true, function (er) {
      })
    }
  
--  if (context.explicit) return next()
++  if (explicit) return next()
  
    readJson(path.join(where, "package.json"), function (er, data) {
      if (er) return next(er)
  
    function next (er) {
      if (er) return cb(er)
--    installManyTop_(what, where, context, cb)
++    installManyTop_(what, where, family, ancestors, explicit, parent, cb)
    }
  }
  
--function installManyTop_ (what, where, context, cb) {
++function installManyTop_ (what, where, family, ancestors, explicit, parent, cb) {
    var nm = path.resolve(where, "node_modules")
--    , names = context.explicit
++    , names = explicit
              ? what.map(function (w) { return w.split(/@/).shift() })
              : []
  
    fs.readdir(nm, function (er, pkgs) {
--    if (er) return installMany(what, where, context, cb)
++    if (er) return installMany(what, where, family, ancestors, explicit, parent, cb)
      pkgs = pkgs.filter(function (p) {
        return !p.match(/^[\._-]/)
++          && (!explicit || names.indexOf(p) === -1)
      })
      asyncMap(pkgs.map(function (p) {
        return path.resolve(nm, p, "package.json")
        // add all the existing packages to the family list.
        // however, do not add to the ancestors list.
        packages.forEach(function (p) {
--        context.family[p[0]] = p[1]
++        family[p[0]] = p[1]
        })
--      return installMany(what, where, context, cb)
++      return installMany(what, where, family, ancestors, explicit, parent, cb)
      })
    })
  }
  
--function installMany (what, where, context, cb) {
--  // readDependencies takes care of figuring out whether the list of
--  // dependencies we'll iterate below comes from an existing shrinkwrap from a
--  // parent level, a new shrinkwrap at this level, or package.json at this
--  // level, as well as which shrinkwrap (if any) our dependencies should use.
--  readDependencies(context, where, {}, function (er, data, wrap) {
++function installMany (what, where, family, ancestors, explicit, parent, cb) {
++  // 'npm install foo' should install the version of foo
++  // that satisfies the dep in the current folder.
++  // This will typically return immediately, since we already read
++  // this file family, and it'll be cached.
++  readJson(path.resolve(where, "package.json"), function (er, data) {
      if (er) data = {}
  
++    d = data.dependencies || {}
      var parent = data
  
--    var d = data.dependencies || {}
--
--    // if we're explicitly installing "what" into "where", then the shrinkwrap
--    // for "where" doesn't apply. This would be the case if someone were adding
--    // a new package to a shrinkwrapped package. (data.dependencies will not be
--    // used here except to indicate what packages are already present, so
--    // there's no harm in using that.)
--    if (context.explicit) wrap = null
--
      // what is a list of things.
      // resolve each one.
      asyncMap( what
--            , targetResolver(where, context, d)
++            , targetResolver(where, family, ancestors, explicit, d, parent)
              , function (er, targets) {
  
        if (er) return cb(er)
  
        // each target will be a data object corresponding
        // to a package, folder, or whatever that is in the cache now.
--      var newPrev = Object.create(context.family)
--        , newAnc = Object.create(context.ancestors)
++      var newPrev = Object.create(family)
++        , newAnc = Object.create(ancestors)
  
        newAnc[data.name] = data.version
        targets.forEach(function (t) {
          log.info(t._id, "into "+where)
        })
        asyncMap(targets, function (target, cb) {
--        log.info(target._id, "installOne")
--        var newWrap = wrap ? wrap[target.name].dependencies || {} : null
--        var newContext = { family: newPrev
--                         , ancestors: newAnc
--                         , parent: parent
--                         , explicit: false
--                         , wrap: newWrap }
--        installOne(target, where, newContext, cb)
++        log(target._id, "installOne")
++        installOne(target, where, newPrev, newAnc, parent, cb)
        }, cb)
      })
    })
  }
  
--function targetResolver (where, context, deps) {
--  var alreadyInstalledManually = context.explicit ? [] : null
++function targetResolver (where, family, ancestors, explicit, deps, parent) {
++  var alreadyInstalledManually = explicit ? [] : null
      , nm = path.resolve(where, "node_modules")
--    , parent = context.parent
--    , wrap = context.wrap
  
--  if (!context.explicit) fs.readdir(nm, function (er, inst) {
++  if (!explicit) fs.readdir(nm, function (er, inst) {
      if (er) return alreadyInstalledManually = []
      asyncMap(inst, function (pkg, cb) {
        readJson(path.resolve(nm, pkg, "package.json"), function (er, d) {
--        // error means it's not a package, most likely.
          if (er) return cb(null, [])
--
--        // if it's a bundled dep, then assume that anything there is valid.
--        // otherwise, make sure that it's a semver match with what we want.
--        var bd = parent.bundleDependencies
--        if (bd && bd.indexOf(d.name) !== -1 ||
--            semver.satisfies(d.version, deps[d.name] || "*")) {
++        if (semver.satisfies(d.version, deps[d.name] || "*")) {
            return cb(null, d.name)
          }
--
--        // something is there, but it's not satisfactory.  Clobber it.
          return cb(null, [])
        })
      }, function (er, inst) {
      if (!alreadyInstalledManually) return setTimeout(function () {
        resolver(what, cb)
      }, to++)
--
      // now we know what's been installed here manually,
      // or tampered with in some way that npm doesn't want to overwrite.
      if (alreadyInstalledManually.indexOf(what.split("@").shift()) !== -1) {
        return cb(null, [])
      }
  
--    // check for a version installed higher in the tree.
--    // If installing from a shrinkwrap, it must match exactly.
--    if (context.family[what]) {
--      if (wrap && wrap[what].version === context.family[what]) {
--        log.verbose(what, "using existing (matches shrinkwrap)")
--        return cb(null, [])
--      }
--    }
--
--    // if it's identical to its parent, then it's probably someone
--    // doing `npm install foo` inside of the foo project.  Print
--    // a warning, and skip it.
--    if (parent && parent.name === what && !npm.config.get("force")) {
--      log.warn("Refusing to install "+what+" as a dependency of itself"
--              ,"install")
++    if (family[what] && semver.satisfies(family[what], deps[what] || "")) {
        return cb(null, [])
      }
  
--    if (wrap) {
--      name = what.split(/@/).shift()
--      if (wrap[name]) {
--        var wrapTarget = wrap[name].from || wrap[name].version
--        log.verbose("resolving "+what+" to "+wrapTarget, "shrinkwrap")
--        what = name + "@" + wrapTarget
--      } else {
--        log.verbose("skipping "+what+" (not in shrinkwrap)", "shrinkwrap")
--      }
--    } else if (deps[what]) {
++    if (deps[what]) {
        what = what + "@" + deps[what]
      }
  
      cache.add(what, function (er, data) {
        if (er && parent && parent.optionalDependencies &&
--          parent.optionalDependencies.hasOwnProperty(what.split("@")[0])) {
++          parent.optionalDependencies.hasOwnProperty(what.split("@").shift())) {
          log.warn(what, "optional dependency failed, continuing")
--        log.verbose([what, er], "optional dependency failed, continuing")
          return cb(null, [])
        }
--
--      if (!er &&
--          data &&
--          !context.explicit &&
--          context.family[data.name] === data.version &&
--          !npm.config.get("force")) {
--        log.info(data.name + "@" + data.version, "already installed")
++      if (!er && data && family[data.name] === data.version) {
          return cb(null, [])
        }
--
--      if (data) data._from = what
--
        return cb(er, data)
      })
    }
  
  // we've already decided to install this.  if anything's in the way,
  // then uninstall it first.
--function installOne (target, where, context, cb) {
++function installOne (target, where, family, ancestors, parent, cb) {
    // the --link flag makes this a "link" command if it's at the
    // the top level.
    if (where === npm.prefix && npm.config.get("link")
        && !npm.config.get("global")) {
--    return localLink(target, where, context, cb)
++    return localLink(target, where, family, ancestors, parent, cb)
    }
--  installOne_(target, where, context, function (er, installedWhat) {
--
--    // check if this one is optional to its parent.
--    if (er && context.parent && context.parent.optionalDependencies &&
--        context.parent.optionalDependencies.hasOwnProperty(target.name)) {
--      log.warn(target._id, "optional dependency failed, continuing")
--      log.verbose([target._id, er], "optional dependency failed, continuing")
--      er = null
--    }
--
--    cb(er, installedWhat)
--  })
--
++  installOne_(target, where, family, ancestors, parent, cb)
  }
  
--function localLink (target, where, context, cb) {
++function localLink (target, where, family, ancestors, parent, cb) {
    log.verbose(target._id, "try to link")
    var jsonFile = path.resolve( npm.dir, target.name
                               , "package.json" )
--    , parent = context.parent
  
    readJson(jsonFile, function (er, data) {
      if (er || data._id === target._id) {
  
      } else {
        log.verbose(target._id, "install locally (no link)")
--      installOne_(target, where, context, cb)
++      installOne_(target, where, family, ancestors, parent, cb)
      }
    })
  }
@@@ -651,25 -651,25 +458,23 @@@ function resultList (target, where, par
    return [ target._id
           , targetFolder
           , prettyWhere && parentId
--         , parentId && prettyWhere
--         , target._from ]
++         , parentId && prettyWhere ]
  }
  
--function installOne_ (target, where, context, cb) {
++function installOne_ (target, where, family, ancestors, parent, cb) {
    var nm = path.resolve(where, "node_modules")
      , targetFolder = path.resolve(nm, target.name)
      , prettyWhere = relativize(where, process.cwd() + "/x")
--    , parent = context.parent
  
    if (prettyWhere === ".") prettyWhere = null
  
    chain
      ( [ [checkEngine, target]
--      , [checkPlatform, target]
--      , [checkCycle, target, context.ancestors]
++      , [checkCycle, target, ancestors]
        , [checkGit, targetFolder]
--      , [write, target, targetFolder, context] ]
++      , [write, target, targetFolder, family, ancestors] ]
      , function (er, d) {
++        log.verbose(target._id, "installOne cb")
          if (er) return cb(er)
          d.push(resultList(target, where, parent && parent._id))
          cb(er, d)
@@@ -694,58 -694,58 +499,6 @@@ function checkEngine (target, cb) 
    return cb()
  }
  
--function checkPlatform (target, cb) {
--  var platform = process.platform
--    , arch = process.arch
--    , osOk = true
--    , cpuOk = true
--    , force = npm.config.get("force")
--
--  if (force) {
--    return cb()
--  }
--
--  if (target.os) {
--    osOk = checkList(platform, target.os)
--  }
--  if (target.cpu) {
--    cpuOk = checkList(arch, target.cpu)
--  }
--  if (!osOk || !cpuOk) {
--    var er = new Error("Unsupported")
--    er.errno = npm.EBADPLATFORM
--    er.os = target.os || ['any']
--    er.cpu = target.cpu || ['any']
--    er.pkgid = target._id
--    return cb(er)
--  }
--  return cb()
--}
--
--function checkList (value, list) {
--  var tmp
--    , match = false
--    , blc = 0
--  if (typeof list === "string") {
--    list = [list]
--  }
--  if (list.length === 1 && list[0] === "any") {
--    return true;
--  }
--  for (var i = 0; i < list.length; ++i) {
--    tmp = list[i]
--    if (tmp[0] === '!') {
--      tmp = tmp.slice(1)
--      if (tmp === value) {
--        return false;
--      }
--      ++blc
--    } else {
--      match = match || tmp === value
--    }
--  }
--  return match || blc === list.length
--}
  
  function checkCycle (target, ancestors, cb) {
    // there are some very rare and pathological edge-cases where
    // A more correct, but more complex, solution would be to symlink
    // the deeper thing into the new location.
    // Will do that if anyone whines about this irl.
--  //
--  // Note: `npm install foo` inside of the `foo` package will abort
--  // earlier if `--force` is not set.  However, if it IS set, then
--  // we need to still fail here, but just skip the first level. Of
--  // course, it'll still fail eventually if it's a true cycle, and
--  // leave things in an undefined state, but that's what is to be
--  // expected when `--force` is used.  That is why getPrototypeOf
--  // is used *twice* here: to skip the first level of repetition.
--
--  var p = Object.getPrototypeOf(Object.getPrototypeOf(ancestors))
++
++  var p = Object.getPrototypeOf(ancestors)
      , name = target.name
      , version = target.version
    while (p && p !== Object.prototype && p[name] !== version) {
@@@ -811,17 -811,17 +556,16 @@@ function checkGit_ (folder, cb) 
    })
  }
  
--function write (target, targetFolder, context, cb_) {
++function write (target, targetFolder, family, ancestors, cb_) {
    var up = npm.config.get("unsafe-perm")
      , user = up ? null : npm.config.get("user")
      , group = up ? null : npm.config.get("group")
--    , family = context.family
  
    function cb (er, data) {
      // cache.unpack returns the data object, and all we care about
      // is the list of installed packages from that last thing.
      if (!er) return cb_(er, data)
--
++    log.error(target._id,"error installing")
      if (false === npm.config.get("rollback")) return cb_(er)
      npm.commands.unbuild([targetFolder], function (er2) {
        if (er2) log.error(er2, "error rolling back "+target._id)
      })
    }
  
--  var bundled = []
--
    chain
--    ( [ [ cache.unpack, target.name, target.version, targetFolder
++    ( [ [ npm.commands.unbuild, [targetFolder] ]
++      , [ cache.unpack, target.name, target.version, targetFolder
          , null, null, user, group ]
--      , [ fs, "writeFile"
--        , path.resolve(targetFolder, "package.json")
--        , JSON.stringify(target, null, 2) + "\n" ]
--      , [ lifecycle, target, "preinstall", targetFolder ]
--      , function (cb) {
--          if (!target.bundleDependencies) return cb()
--
--          var bd = path.resolve(targetFolder, "node_modules")
--          fs.readdir(bd, function (er, b) {
--            // nothing bundled, maybe
--            if (er) return cb()
--            bundled = b || []
--            cb()
--          })
--        } ]
++      , [ lifecycle, target, "preinstall", targetFolder ] ]
  
      // nest the chain so that we can throw away the results returned
      // up until this point, since we really don't care about it.
--    , function (er) {
++    , function (er) {
        if (er) return cb(er)
--
--      // before continuing to installing dependencies, check for a shrinkwrap.
--      readDependencies(context, targetFolder, {}, function (er, data, wrap) {
--        var deps = Object.keys(data.dependencies || {})
--
--        // don't install bundleDependencies, unless they're missing.
--        if (data.bundleDependencies) {
--          deps = deps.filter(function (d) {
--            return data.bundleDependencies.indexOf(d) === -1 ||
--                   bundled.indexOf(d) === -1
--          })
--        }
--
--        var newcontext = { family: family
--                         , ancestors: context.ancestors
--                         , parent: target
--                         , explicit: false
--                         , wrap: wrap }
--        installMany(deps.filter(function (d) {
--          // prefer to not install things that are satisfied by
--          // something in the "family" list, unless we're installing
--          // from a shrinkwrap.
--          return wrap || !semver.satisfies(family[d], data.dependencies[d])
--        }).map(function (d) {
--          var t = data.dependencies[d]
--            , parsed = url.parse(t.replace(/^git\+/, "git"))
--          t = d + "@" + t
--          return t
--        }), targetFolder, newcontext, function (er, d) {
--          log.verbose(targetFolder, "about to build")
--          if (er) return cb(er)
--          npm.commands.build( [targetFolder]
--                            , npm.config.get("global")
--                            , true
--                            , function (er) { return cb(er, d) })
--        })
++      var deps = Object.keys(target.dependencies || {})
++      installMany(deps.filter(function (d) {
++        // prefer to not install things that are satisfied by
++        // something in the "family" list.
++        return !semver.satisfies(family[d], target.dependencies[d])
++      }).map(function (d) {
++        var t = target.dependencies[d]
++          , parsed = url.parse(t.replace(/^git\+/, "git"))
++        t = d + "@" + t
++        return t
++      }), targetFolder, family, ancestors, false, target, function (er, d) {
++        log.verbose(targetFolder, "about to build")
++        if (er) return cb(er)
++        npm.commands.build( [targetFolder]
++                          , npm.config.get("global")
++                          , true
++                          , function (er) { return cb(er, d) })
        })
--    })
++    } )
  }
index 3049884cabc1d61c0e20bc8bdd08675ad026bd72,3049884cabc1d61c0e20bc8bdd08675ad026bd72..fea6606666cfab6c4d2654bfe97ef6ca36071427
@@@ -141,7 -141,7 +141,6 @@@ function resultPrinter (pkg, src, dest
    var where = relativize(dest, path.resolve(process.cwd(),"x"))
    rp = (rp || "").trim()
    src = (src || "").trim()
--  // XXX If --json is set, then look up the data from the package.json
    if (npm.config.get("parseable")) {
      return parseableOutput(dest, rp || src, cb)
    }
  }
  
  function parseableOutput (dest, rp, cb) {
--  // XXX this should match ls --parseable and install --parseable
--  // look up the data from package.json, format it the same way.
--  //
    // link is always effectively "long", since it doesn't help much to
    // *just* print the target folder.
    // However, we don't actually ever read the version number, so
index 276530c35427599acae0efab2e5ef24ef24faaf3,276530c35427599acae0efab2e5ef24ef24faaf3..33336cf63e2345f7a7a5ca1b62007cd15261774d
@@@ -13,7 -13,7 +13,6 @@@ var npm = require("./npm.js"
    , log = require("./utils/log.js")
    , relativize = require("./utils/relativize.js")
    , path = require("path")
--  , archy = require("archy")
  
  ls.usage = "npm ls"
  
@@@ -27,102 -27,102 +26,13 @@@ function ls (args, silent, cb) 
    var dir = path.resolve(npm.dir, "..")
  
    readInstalled(dir, function (er, data) {
--    var lite = getLite(bfsify(data))
--    if (er || silent) return cb(er, data, lite)
--
++    if (er || silent) return cb(er, data)
      var long = npm.config.get("long")
--      , json = npm.config.get("json")
--      , out
--    if (json) {
--      var seen = []
--      var d = long ? bfsify(data) : lite
--      // the raw data can be circular
--      out = JSON.stringify(d, function (k, o) {
--        if (typeof o === "object") {
--          if (-1 !== seen.indexOf(o)) return "[Circular]"
--          seen.push(o)
--        }
--        return o
--      }, 2)
--    } else if (npm.config.get("parseable")) {
--      out = makeParseable(bfsify(data), long, dir)
--    } else if (data) {
--      out = makeArchy(bfsify(data), long, dir)
--    }
--    output.write(out, function (er) { cb(er, data, lite) })
++    var out = makePretty(bfsify(data), long, dir).join("\n")
++    output.write(out, function (er) { cb(er, data) })
    })
  }
  
--function alphasort (a, b) {
--  a = a.toLowerCase()
--  b = b.toLowerCase()
--  return a > b ? 1
--       : a < b ? -1 : 0
--}
--
--function getLite (data, noname) {
--  var lite = {}
--    , maxDepth = npm.config.get("depth")
--    , url = require("url")
--
--  if (!noname && data.name) lite.name = data.name
--  if (data.version) lite.version = data.version
--  if (data.extraneous) {
--    lite.extraneous = true
--    lite.problems = lite.problems || []
--    lite.problems.push( "extraneous: "
--                      + data.name + "@" + data.version
--                      + " " + (data.path || "") )
--  }
--
--  if (data._from) {
--    var from = data._from
--    if (from.indexOf(data.name + "@") === 0) {
--      from = from.substr(data.name.length + 1)
--    }
--    var u = url.parse(from)
--    if (u.protocol) lite.from = from
--  }
--
--  if (data.invalid) {
--    lite.invalid = true
--    lite.problems = lite.problems || []
--    lite.problems.push( "invalid: "
--                      + data.name + "@" + data.version
--                      + " " + (data.path || "") )
--  }
--
--  if (data.dependencies) {
--    var deps = Object.keys(data.dependencies)
--    if (deps.length) lite.dependencies = deps.map(function (d) {
--      var dep = data.dependencies[d]
--      if (typeof dep === "string") {
--        lite.problems = lite.problems || []
--        var p
--        if (data.depth >= maxDepth) {
--          p = "max depth reached: "
--        } else {
--          p = "missing: "
--        }
--        p += d + "@" + dep
--          + ", required by "
--          + data.name + "@" + data.version
--        lite.problems.push(p)
--        return [d, { required: dep, missing: true }]
--      }
--      return [d, getLite(dep, true)]
--    }).reduce(function (deps, d) {
--      if (d[1].problems) {
--        lite.problems = lite.problems || []
--        lite.problems.push.apply(lite.problems, d[1].problems)
--      }
--      deps[d[0]] = d[1]
--      return deps
--    }, {})
--  }
--  return lite
--}
--
  function bfsify (root, current, queue, seen) {
    // walk over the data, and turn it from this:
    // +-- a
    // which looks nicer
    current = current || root
    queue = queue || []
--  seen = seen || [root]
++  seen = seen || []
    var deps = current.dependencies = current.dependencies || {}
    Object.keys(deps).forEach(function (d) {
      var dep = deps[d]
  }
  
  
--function makeArchy (data, long, dir) {
--  var out = makeArchy_(data, long, dir, 0)
--  return archy(out, "", { unicode: npm.config.get("unicode") })
--}
--
--function makeArchy_ (data, long, dir, depth, parent, d) {
--  if (typeof data === "string") {
--    if (depth < npm.config.get("depth")) {
--      // just missing
--      var p = parent.link || parent.path
--      log.warn("Unmet dependency in "+p, d+" "+data)
--      data = "\033[31;40mUNMET DEPENDENCY\033[0m " + d + " " + data
--    } else {
--      data = d+"@'"+ data +"' (max depth reached)"
--    }
--    return data
--  }
--
--  var out = {}
--  // the top level is a bit special.
--  out.label = data._id ? data._id + " " : ""
--  if (data.link) out.label += "-> " + data.link
--
--  if (data.invalid) {
--    if (data.realName !== data.name) out.label += " ("+data.realName+")"
--    out.label += " \033[31;40minvalid\033[0m"
--  }
--
--  if (data.extraneous && data.path !== dir) {
--    out.label += " \033[32;40mextraneous\033[0m"
--  }
--
--  if (long) {
--    if (dir === data.path) out.label += "\n" + dir
--    out.label += "\n" + getExtras(data, dir)
--  } else if (dir === data.path) {
--    out.label += dir
--  }
--
--  // now all the children.
--  out.nodes = Object.keys(data.dependencies || {})
--    .sort(alphasort).map(function (d) {
--      return makeArchy_(data.dependencies[d], long, dir, depth + 1, data, d)
--    })
--
--  if (out.nodes.length === 0 && data.path === dir) {
--    out.nodes = ["(empty)"]
--  }
--
--  return out
--}
--
--function getExtras (data, dir) {
--  var extras = []
--    , rel = relativize(data.path || "", dir)
--    , url = require("url")
--
--  if (data.description) extras.push(data.description)
--  if (data.repository) extras.push(data.repository.url)
--  if (data.homepage) extras.push(data.homepage)
--  if (data._from) {
--    var from = data._from
--    if (from.indexOf(data.name + "@") === 0) {
--      from = from.substr(data.name.length + 1)
++function makePretty (data, long, dir, prefix, list) {
++  var top = !list
++  list = list || []
++  prefix = prefix || ""
++  list.push(format(data, long, prefix, dir))
++  var deps = data.dependencies || {}
++    , childPref = prefix.split("├─").join("│ ")
++                        .split("└─").join("  ")
++    , depList = Object.keys(deps)
++    , depLast = depList.length - 1
++    , maxDepth = npm.config.get("depth")
++  Object.keys(deps).sort(function (a, b) {
++    return a > b ? 1 : -1
++  }).forEach(function (d, i) {
++    var depData = deps[d]
++    if (typeof depData === "string") {
++      if (data.depth < maxDepth) {
++        var p = data.link || data.path
++        log.warn("Unmet dependency in "+p, d+" "+deps[d])
++        depData = npm.config.get("parseable")
++                ? ( npm.config.get("long")
++                    ? path.resolve(data.path, "node_modules", d)
++                    + ":"+d+"@"+JSON.stringify(depData)+":INVALID:MISSING"
++                    : "" )
++                : "─ \033[31;40mUNMET DEPENDENCY\033[0m "+d+" "+depData
++      } else {
++        if (npm.config.get("parseable")) {
++          depData = path.resolve(data.path, "node_modules", d)
++                  + (npm.config.get("long")
++                    ? ":" + d + "@" + JSON.stringify(depData)
++                    + ":" // no realpath resolved
++                    + ":MAXDEPTH"
++                    : "")
++        } else {
++          depData = "─ "+d+"@'"+depData +"' (max depth reached)"
++        }
++      }
      }
--    var u = url.parse(from)
--    if (u.protocol) extras.push(from)
++    var c = i === depLast ? "└─" : "├─"
++    makePretty(depData, long, dir, childPref + c, list)
++  })
++  if (top && list.length === 1 && !data._id) {
++    if (!npm.config.get("parseable")) {
++      list.push("(empty)")
++    } else if (npm.config.get("long")) list[0] += ":EMPTY"
    }
--  return extras.join("\n")
--}
--
--
--function makeParseable (data, long, dir, depth, parent, d) {
--  depth = depth || 0
--
--  return [ makeParseable_(data, long, dir, depth, parent, d) ]
--  .concat(Object.keys(data.dependencies || {})
--    .sort(alphasort).map(function (d) {
--      return makeParseable(data.dependencies[d], long, dir, depth + 1, data, d)
--    }))
--  .join("\n")
++  return list.filter(function (l) { return l && l.trim() })
  }
  
--function makeParseable_ (data, long, dir, depth, parent, d) {
++function ugly (data) {
    if (typeof data === "string") {
--    if (data.depth < npm.config.get("depth")) {
--      var p = parent.link || parent.path
--      log.warn("Unmet dependency in "+p, d+" "+data)
--      data = npm.config.get("long")
--           ? path.resolve(parent.path, "node_modules", d)
--           + ":"+d+"@"+JSON.stringify(data)+":INVALID:MISSING"
--           : ""
--    } else {
--      data = path.resolve(data.path, "node_modules", d)
--           + (npm.config.get("long")
--             ? ":" + d + "@" + JSON.stringify(data)
--             + ":" // no realpath resolved
--             + ":MAXDEPTH"
--             : "")
--    }
--
      return data
    }
--
    if (!npm.config.get("long")) return data.path
  
    return data.path
         + (data.extraneous ? ":EXTRANEOUS" : "")
         + (data.invalid ? ":INVALID" : "")
  }
++
++function format (data, long, prefix, dir) {
++  if (npm.config.get("parseable")) return ugly(data)
++  if (typeof data === "string") {
++    return prefix + data
++  }
++//  console.log([data.path, dir], "relativize")
++  var depLen = Object.keys(data.dependencies).length
++    , space = prefix.split("├─").join("│ ")
++                    .split("└─").join("  ")
++            + (depLen ? "" : " ")
++    , rel = relativize(data.path || "", dir)
++    , l = prefix
++        + (rel === "." ? "" : depLen ? "┬ " : "─ ")
++        + (data._id ? data._id + " " : "")
++        + (data.link ? "-> " + data.link : "") + ""
++        + (rel === "." && !(long && data._id) ? dir : "")
++  if (data.invalid) {
++    if (data.realName !== data.name) l += " ("+data.realName+")"
++    l += " \033[31;40minvalid\033[0m"
++  }
++  if (data.extraneous && rel !== ".") {
++    l += " \033[32;40mextraneous\033[0m"
++  }
++  if (!long || !data._id) return l
++  var extras = []
++  if (rel !== ".") extras.push(rel)
++  else extras.push(dir)
++  if (data.description) extras.push(data.description)
++  if (data.repository) extras.push(data.repository.url)
++  if (data.homepage) extras.push(data.homepage)
++  extras = extras.filter(function (e) { return e })
++  var lastExtra = !depLen && extras.length - 1
++  l += extras.map(function (e, i) {
++    var indent = !depLen ? " " : "│ "
++    return "\n" + space + indent + e
++  }).join("")
++  return l
++}
index 2db21e34def8d2d64faa0ebd76dc66dacca429c2,2db21e34def8d2d64faa0ebd76dc66dacca429c2..de68393d395e9846b9fdf3e6e376855879f167b4
@@@ -17,6 -17,6 +17,8 @@@ require("path").SPLIT_CHAR = process.pl
  var EventEmitter = require("events").EventEmitter
    , npm = module.exports = new EventEmitter
    , config = require("./config.js")
++  , set = require("./utils/set.js")
++  , get = require("./utils/get.js")
    , ini = require("./utils/ini.js")
    , log = require("./utils/log.js")
    , fs = require("graceful-fs")
    , which = require("which")
    , semver = require("semver")
    , findPrefix = require("./utils/find-prefix.js")
--  , getUid = require("uid-number")
--  , mkdirp = require("mkdirp")
++  , getUid = require("./utils/uid-number.js")
++  , mkdir = require("./utils/mkdir-p.js")
    , slide = require("slide")
    , chain = slide.chain
  
--// /usr/local is often a read-only fs, which is not
--// well handled by node or mkdirp.  Just double-check
--// in the case of errors when making the prefix dirs.
--function mkdir (p, cb) {
--  mkdirp(p, function (er, made) {
--    // it could be that we couldn't create it, because it
--    // already exists, and is on a read-only fs.
--    if (er) {
--      return fs.stat(p, function (er2, st) {
--        if (er2 || !st.isDirectory()) return cb(er)
--        return cb(null, made)
--      })
--    }
--    return cb(er, made)
--  })
--}
--
  npm.commands = {}
  npm.ELIFECYCLE = {}
  npm.E404 = {}
@@@ -55,7 -55,7 +40,30 @@@ npm.EJSONPARSE = {
  npm.EISGIT = {}
  npm.ECYCLE = {}
  npm.ENOTSUP = {}
--npm.EBADPLATFORM = {}
++
++// HACK for windows
++if (process.platform === "win32") {
++  // stub in unavailable methods from process and fs binding
++  if (!process.getuid) process.getuid = function() {}
++  if (!process.getgid) process.getgid = function() {}
++  var fsBinding = process.binding("fs")
++  if (!fsBinding.chown) fsBinding.chown = function() {
++    var cb = arguments[arguments.length - 1]
++    if (typeof cb == "function") cb()
++  }
++
++  // patch rename/renameSync, but this should really be fixed in node
++  var _fsRename = fs.rename
++    , _fsPathPatch
++  _fsPathPatch = function(p) {
++    return p && p.replace(/\\/g, "/") || p;
++  }
++  fs.rename = function(p1, p2) {
++    arguments[0] = _fsPathPatch(p1)
++    arguments[1] = _fsPathPatch(p2)
++    return _fsRename.apply(fs, arguments);
++  }
++}
  
  try {
    // startup, ok to do this synchronously
@@@ -104,7 -104,7 +112,6 @@@ var commandCache = {
                , "unstar": "star" // same function
                , "apihelp" : "help"
                , "login": "adduser"
--              , "add-user": "adduser"
                }
  
    , aliasNames = Object.keys(aliases)
                , "unpublish"
                , "owner"
                , "deprecate"
--              , "shrinkwrap"
  
                , "help"
                , "help-search"
@@@ -303,7 -303,7 +309,7 @@@ function loadPrefix (npm, conf, cb) 
        })
      // the prefix MUST exist, or else nothing works.
      if (!npm.config.get("global")) {
--      mkdir(p, next)
++      mkdir(p, npm.modes.exec, null, null, true, next)
      } else {
        next(er)
      }
        , enumerable : true
        })
      // the prefix MUST exist, or else nothing works.
--    mkdir(gp, next)
++    mkdir(gp, npm.modes.exec, null, null, true, next)
    })
  
    var i = 2
index e883abd359756590a261c2252c08ded2db4b7916,e883abd359756590a261c2252c08ded2db4b7916..496dfbd426f402bda8d783b9dcec11cb8d77191c
@@@ -48,10 -48,10 +48,6 @@@ function makePretty (p) 
      , dir = path.resolve(p[0], "node_modules", dep)
      , has = p[2]
      , want = p[3]
--
--  // XXX add --json support
--  // Should match (more or less) the output of ls --json
--
    if (parseable) {
      var str = dir
      if (npm.config.get("long")) {
index 0e1d56a1de86d7b834c3c152e0b52424b9abdfd7,0e1d56a1de86d7b834c3c152e0b52424b9abdfd7..fc5f96825d5558f07f0c3bcf1d43f8b374c9050a
@@@ -31,6 -31,6 +31,7 @@@ function rebuild (args, cb) 
  
  function cleanBuild (folders, set, cb) {
    // https://github.com/isaacs/npm/issues/1872
++  // If there's a makefile, try 'make clean'
    // If there's a wscript, try 'node-waf clean'
    // But don't die on either of those if they fail.
    // Just a best-effort kind of deal.
@@@ -40,6 -40,6 +41,8 @@@
        if (er) return cb(er)
        if (files.indexOf("wscript") !== -1) {
          exec("node-waf", ["clean"], null, false, f, thenBuild)
++      } else if (files.indexOf("Makefile") !== -1) {
++        exec("make", ["clean"], null, false, f, thenBuild)
        } else thenBuild()
      })
      function thenBuild (er) {
index 213390eb086566d0735c4662693a50f23eaf0693,213390eb086566d0735c4662693a50f23eaf0693..92f4319f5870f302e58b3ef64cc4aa31f0d81a85
@@@ -137,8 -137,8 +137,7 @@@ function prettify (data, args) 
        , stdout = process.stdout
        , cols = !tty.isatty(stdout.fd) ? Infinity
               : stdout._handle ? stdout._handle.getWindowSize()[0]
--             : process.stdout.getWindowSize()[0]
--      cols = (cols == 0) ? Infinity : cols
++             : tty.getWindowSize()[1]
    } catch (ex) { cols = Infinity }
  
    // name, desc, author, keywords
index c83602ec1f6ce352cb391c2a770c03ff7d63257f,c83602ec1f6ce352cb391c2a770c03ff7d63257f..d8210951576a287ae9ab19b7090deaf8100c9f1b
@@@ -8,6 -8,6 +8,5 @@@ var npm = require("./npm.js"
  set.completion = npm.commands.config.completion
  
  function set (args, cb) {
--  if (!args.length) return cb(set.usage)
    npm.commands.config(["set"].concat(args), cb)
  }
index 771eddf7db26b488a3a439bf9e81b6f78a46b346,771eddf7db26b488a3a439bf9e81b6f78a46b346..f4bd008a66b086b94e5bd51462dfb8092b62ae09
@@@ -3,7 -3,7 +3,6 @@@ unbuild.usage = "npm unbuild <folder>\n
  
  var readJson = require("./utils/read-json.js")
    , rm = require("rimraf")
--  , gentlyRm = require("./utils/gently-rm.js")
    , npm = require("./npm.js")
    , path = require("path")
    , fs = require("graceful-fs")
@@@ -57,20 -57,20 +56,15 @@@ function rmBins (pkg, folder, parent, t
      if (process.platform === "win32") {
        rm(path.resolve(binRoot, b) + ".cmd", cb)
      } else {
--      gentlyRm( path.resolve(binRoot, b)
--              , !npm.config.get("force") && folder
--              , cb )
++      rm( path.resolve(binRoot, b)
++        , { gently: !npm.config.get("force") && folder }
++        , cb )
      }
    }, cb)
  }
  
  function rmMans (pkg, folder, parent, top, cb) {
--  if (!pkg.man
--      || !top
--      || process.platform === "win32"
--      || !npm.config.get("global")) {
--    return cb()
--  }
++  if (!pkg.man || !top || process.platform === "win32") return cb()
    var manRoot = path.resolve(npm.config.get("prefix"), "share", "man")
    asyncMap(pkg.man, function (man, cb) {
      var parseMan = man.match(/(.*)\.([0-9]+)(\.gz)?$/)
@@@ -84,8 -84,8 +78,8 @@@
                               : pkg.name + "-" + bn)
                               + "." + sxn + gz
                             )
--    gentlyRm( manDest
--            , !npm.config.get("force") && folder
--            , cb )
++    rm( manDest
++      , { gently: !npm.config.get("force") && folder }
++      , cb )
    }, cb)
  }
index 655e5eb968f5545af6d662d51cfba41ee08104aa,655e5eb968f5545af6d662d51cfba41ee08104aa..1b43607d6d4a2f278ad5cc5f73a28739f8e39e8b
@@@ -40,12 -40,12 +40,7 @@@ function uninstall (args, cb) 
  
  function uninstall_ (args, nm, cb) {
    asyncMap(args, function (arg, cb) {
--    // uninstall .. should not delete /usr/local/lib/node_modules/..
--    var p = path.join(path.resolve(nm), path.join("/", arg))
--    if (path.resolve(p) === nm) {
--      log.warn(arg, "uninstall: invalid argument")
--      return cb(null, [])
--    }
++    var p = path.resolve(nm, arg)
      fs.lstat(p, function (er) {
        if (er) {
          log.warn(arg, "Not installed in "+nm)
index e24da36f6d9052e40ad32182b8305f8a2f49137d,e24da36f6d9052e40ad32182b8305f8a2f49137d..a7892e8ee3d3b980470f15e3f903afa8fabdab99
@@@ -14,7 -14,7 +14,7 @@@ cmdShim.ifExists = cmdShimIfExist
  
  var fs = require("graceful-fs")
    , chain = require("slide").chain
--  , mkdir = require("mkdirp")
++  , mkdir = require("./mkdir-p.js")
    , rm = require("rimraf")
    , log = require("./log.js")
    , path = require("path")
@@@ -73,16 -73,16 +73,16 @@@ function writeShim_ (from, to, prog, ar
      target = ""
      shTarget = ""
    } else {
--    longProg = "\"%~dp0\\" + prog + ".exe\""
++    longProg = "\"%~dp0\"\\\"" + prog + ".exe\""
      shLongProg = "\"`dirname \"$0\"`/" + prog + "\""
      target = "\"%~dp0\\" + target + "\""
      shTarget = "\"`dirname \"$0\"`/" + shTarget + "\""
    }
  
--  // @IF EXIST "%~dp0\node.exe" (
++  // @IF EXIST "%~dp0"\"node.exe" (
    //   "%~dp0\node.exe" "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*
    // ) ELSE (
--  //   node "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*
++  //   node  "%~dp0\.\node_modules\npm\bin\npm-cli.js" %*
    // )
    var cmd
    if (longProg) {
index c1c241d682200a8dc491e4e9efa788952ac95ee7,c1c241d682200a8dc491e4e9efa788952ac95ee7..427efefb4448762fe152f9f79d01abd9c40370c8
@@@ -1,7 -1,7 +1,7 @@@
  module.exports = fileCompletion
  
  var find = require("../find.js")
--  , mkdir = require("mkdirp")
++  , mkdir = require("../mkdir-p.js")
    , path = require("path")
  
  function fileCompletion (root, req, depth, cb) {
index 18b47ecdb7c867ad6b2551c9541001b1517f6281,18b47ecdb7c867ad6b2551c9541001b1517f6281..d368c497264aa849cc79a0f1bb1d011178d53396
@@@ -9,7 -9,7 +9,6 @@@ var path = require("path"
    , os = require("os")
    , nopt = require("nopt")
    , log = require("./log.js")
--  , npm = require("../npm.js")
  
  function Octal () {}
  function validateOctal (data, k, val) {
@@@ -140,8 -140,8 +139,6 @@@ Object.defineProperty(exports, "default
      , cache : process.platform === "win32"
              ? path.resolve(process.env.APPDATA || home || temp, "npm-cache")
              : path.resolve( home || temp, ".npm")
--    , "cache-max": Infinity
--    , "cache-min": 0
  
      , color : process.platform !== "win32" || winColor
      , coverage: false
      , "init.author.name" : ""
      , "init.author.email" : ""
      , "init.author.url" : ""
--    , json: false
      , link: false
      , logfd : 2
      , loglevel : "http"
      , proxy : process.env.HTTP_PROXY || process.env.http_proxy || null
      , "https-proxy" : process.env.HTTPS_PROXY || process.env.https_proxy ||
                        process.env.HTTP_PROXY || process.env.http_proxy || null
--    , "user-agent" : "npm/" + npm.version + " node/" + process.version
      , "rebuild-bundle" : true
      , registry : "http" + (httpsOk ? "s" : "") + "://registry.npmjs.org/"
      , rollback : true
      , save : false
--    , "save-dev" : false
--    , "save-optional" : false
      , searchopts: ""
      , searchexclude: null
      , searchsort: "name"
      , userignorefile : path.resolve(home, ".npmignore")
      , umask: 022
      , version : false
--    , versions : false
      , viewer: process.platform === "win32" ? "browser" : "man"
      , yes: null
  
@@@ -228,8 -228,8 +220,6 @@@ exports.types 
    , browser : String
    , ca: [null, String]
    , cache : path
--  , "cache-max": Number
--  , "cache-min": Number
    , color : ["always", Boolean]
    , coverage: Boolean
    , depth : Number
    , globalignorefile: path
    , group : [Number, String]
    , "https-proxy" : [null, url]
--  , "user-agent" : String
    , ignore : String
    , "init.version" : [null, semver]
    , "init.author.name" : String
    , "init.author.email" : String
    , "init.author.url" : ["", url]
--  , json: Boolean
    , link: Boolean
    , logfd : [Number, Stream]
    , loglevel : ["silent","win","error","warn","http","info","verbose","silly"]
    , registry : [null, url]
    , rollback : Boolean
    , save : Boolean
--  , "save-dev" : Boolean
--  , "save-optional" : Boolean
    , searchopts : String
    , searchexclude: [null, String]
    , searchsort: [ "name", "-name"
    , userignorefile : path
    , umask: Octal
    , version : Boolean
--  , versions : Boolean
    , viewer: String
    , yes: [false, null, Boolean]
    , _exit : Boolean
@@@ -328,8 -328,8 +313,6 @@@ exports.shorthands 
    , porcelain : ["--parseable"]
    , g : ["--global"]
    , S : ["--save"]
--  , D : ["--save-dev"]
--  , O : ["--save-optional"]
    , y : ["--yes"]
    , n : ["--no-yes"]
    }
index 0cdc03facaa1f41a5d7b80dbe0d6ec10e5587092,0cdc03facaa1f41a5d7b80dbe0d6ec10e5587092..22d26d8d6c11bd9af3064a493a112a5cf4b8a4e4
@@@ -159,17 -159,17 +159,6 @@@ function errorHandler (er) 
                ].join("\n"))
      break
  
--  case npm.EBADPLATFORM:
--    er.code = "EBADPLATFORM"
--    log.error([er.message
--              ,"Not compatible with your operating system or architecture: "+er.pkgid
--              ,"Valid OS:    "+er.os.join(",")
--              ,"Valid Arch:  "+er.cpu.join(",")
--              ,"Actual OS:   "+process.platform
--              ,"Actual Arch: "+process.arch
--              ].join("\n"))
--    break
--
    case "EEXIST":
    case constants.EEXIST:
      log.error([er.message
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..75fe41c057b3d9ac075143b913c27440323e2b66
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,157 @@@
++// build up a set of exclude lists in order of precedence:
++// [ ["!foo", "bar"]
++// , ["foo", "!bar"] ]
++// being *included* will override a previous exclusion,
++// and being excluded will override a previous inclusion.
++//
++// Each time the tar file-list generator thingie enters a new directory,
++// it calls "addIgnoreFile(dir, list, cb)".  If an ignore file is found,
++// then it is added to the list and the cb() is called with an
++// child of the original list, so that we don't have
++// to worry about popping it off at the right time, since other
++// directories will continue to use the original parent list.
++//
++// If no ignore file is found, then the original list is returned.
++//
++// To start off with, ~/.{npm,git}ignore is added, as is
++// prefix/{npm,git}ignore, effectively treated as if they were in the
++// base package directory.
++
++exports.addIgnoreFile = addIgnoreFile
++exports.readIgnoreFile = readIgnoreFile
++exports.parseIgnoreFile = parseIgnoreFile
++exports.test = test
++exports.filter = filter
++
++var path = require("path")
++  , fs = require("graceful-fs")
++  , minimatch = require("minimatch")
++  , relativize = require("./relativize.js")
++  , log = require("./log.js")
++
++// todo: memoize
++
++// read an ignore file, or fall back to the
++// "gitBase" file in the same directory.
++function readIgnoreFile (file, gitBase, cb) {
++  //log.warn(file, "ignoreFile")
++  if (!file) return cb(null, "")
++  fs.readFile(file, function (er, data) {
++    if (!er || !gitBase) return cb(null, data || "")
++    var gitFile = path.resolve(path.dirname(file), gitBase)
++    fs.readFile(gitFile, function (er, data) {
++      return cb(null, data || "")
++    })
++  })
++}
++
++// read a file, and then return the list of patterns
++function parseIgnoreFile (file, gitBase, dir, cb) {
++  readIgnoreFile(file, gitBase, function (er, data) {
++    data = data ? data.toString("utf8") : ""
++
++    data = data.split(/[\r\n]+/).map(function (p) {
++      return p.trim()
++    }).filter(function (p) {
++      return p.length && p.charAt(0) !== "#"
++    })
++    data.dir = dir
++    return cb(er, data)
++  })
++}
++
++// add an ignore file to an existing list which can
++// then be passed to the test() function. If the ignore
++// file doesn't exist, then the list is unmodified. If
++// it is, then a concat-child of the original is returned,
++// so that this is suitable for walking a directory tree.
++function addIgnoreFile (file, gitBase, list, dir, cb) {
++  if (typeof cb !== "function") cb = dir, dir = path.dirname(file)
++  if (typeof cb !== "function") cb = list, list = []
++  parseIgnoreFile(file, gitBase, dir, function (er, data) {
++    if (!er && data) {
++      // package.json "files" array trumps everything
++      // Make sure it's always last.
++      if (list.length && list[list.length-1].packageFiles) {
++        list = list.concat([data, list.pop()])
++      } else {
++        list = list.concat([data])
++      }
++    }
++    cb(er, list)
++  })
++}
++
++
++// no IO
++// loop through the lists created in the functions above, and test to
++// see if a file should be included or not, given those exclude lists.
++function test (file, excludeList) {
++  if (path.basename(file) === "package.json") return true
++  // log.warn(file, "test file")
++  // log.warn(excludeList, "test list")
++  var incRe = /^\!(\!\!)*/
++    , excluded = false
++  for (var i = 0, l = excludeList.length; i < l; i ++) {
++    var excludes = excludeList[i]
++      , dir = excludes.dir
++
++    // chop the filename down to be relative to excludeDir
++    var rf = relativize(file, dir, true)
++    rf = rf.replace(/^\.?\//, "")
++    if (file.slice(-1) === "/") rf += "/"
++
++    // log.warn([file, rf], "rf")
++
++    for (var ii = 0, ll = excludes.length; ii < ll; ii ++) {
++      var ex = excludes[ii].replace(/^(!*)\//, "$1")
++        , inc = !!ex.match(incRe)
++
++      // log.warn([ex, rf], "ex, rf")
++      // excluding/including a dir excludes/includes all the files in it.
++      if (ex.slice(-1) === "/") ex += "**"
++
++      // if this is not an inclusion attempt, and someone else
++      // excluded it, then just continue, because there's nothing
++      // that can be done here to change the exclusion.
++      if (!inc && excluded) continue
++
++      // if it's an inclusion attempt, and the file has not been
++      // excluded, then skip it, because there's no need to try again.
++      if (inc && !excluded) continue
++
++      // if it matches the pattern, then it should be excluded.
++      excluded = !!minimatch(rf, ex, { matchBase: true })
++      // log.error([rf, ex, excluded], "rf, ex, excluded")
++
++      // if you include foo, then it also includes foo/bar.js
++      if (inc && excluded && ex.slice(-3) !== "/**") {
++        excluded = minimatch(rf, ex + "/**", { matchBase: true })
++        // log.warn([rf, ex + "/**", inc, excluded], "dir without /")
++      }
++
++      // if you exclude foo, then it also excludes foo/bar.js
++      if (!inc
++          && excluded
++          && ex.slice(-3) !== "/**"
++          && rf.slice(-1) === "/"
++          && excludes.indexOf(ex + "/**") === -1) {
++        // log.warn(ex + "/**", "adding dir-matching exclude pattern")
++        excludes.splice(ii, 1, ex, ex + "/**")
++        ll ++
++      }
++    }
++    // log.warn([rf, excluded, excludes], "rf, excluded, excludes")
++  }
++  // true if it *should* be included
++  // log.warn([file, excludeList, excluded], "file, excluded")
++  return !excluded
++}
++
++// returns a function suitable for Array#filter
++function filter (dir, list) { return function (file) {
++  file = file.trim()
++  var testFile = path.resolve(dir, file)
++  if (file.slice(-1) === "/") testFile += "/"
++  return file && test(testFile, list)
++}}
index bc1c095cdf062bed21a121deb9ab5c596c0c202d,bc1c095cdf062bed21a121deb9ab5c596c0c202d..ba1e567b1fdb4646ef90fee61b1727bfc0a0919f
@@@ -8,16 -8,16 +8,16 @@@ var request = require("request"
    , url = require("url")
    , log = require("./log.js")
    , path = require("path")
--  , mkdir = require("mkdirp")
--  , chownr = require("chownr")
++  , mkdir = require("./mkdir-p.js")
    , regHost
++  , getAgent = require("./get-agent.js")
  
  module.exports = fetch
  
  function fetch (remote, local, headers, cb) {
    if (typeof cb !== "function") cb = headers, headers = {}
    log.verbose(local, "fetch to")
--  mkdir(path.dirname(local), function (er, made) {
++  mkdir(path.dirname(local), function (er) {
      if (er) return cb(er)
      fetch_(remote, local, headers, cb)
    })
@@@ -57,9 -57,9 +57,8 @@@ function makeRequest (remote, fstr, hea
  
    request({ url: remote
            , proxy: proxy
++          , agent: getAgent(remote)
            , strictSSL: npm.config.get("strict-ssl")
--          , ca: remote.host === regHost ? npm.config.get("ca") : undefined
--          , headers: { "user-agent": npm.config.get("user-agent") }
            , onResponse: onResponse }).pipe(fstr)
    function onResponse (er, res) {
      if (er) return fstr.emit("error", er)
index bc2c9598dbb0dabaac96c7a32fda29bab45a5184,bc2c9598dbb0dabaac96c7a32fda29bab45a5184..320456c7eaae7b8c5cf0f607bce4164d8889630b
@@@ -45,9 -45,9 +45,6 @@@ function findPrefix_ (p, original, cb) 
        return cb(null, p)
      }
  
--    var d = path.dirname(p)
--    if (d === p) return cb(null, original)
--
--    return findPrefix_(d, original, cb)
++    return findPrefix_(path.dirname(p), original, cb)
    })
  }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4bc074f29bf844365aa066ef97ba00c4b9264dd3
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,62 @@@
++// get an http/https agent
++// This is necessary for the custom CA certs in http2,
++// especially while juggling multiple different registries.
++//
++// When using http2, the agent key is just the CA setting,
++// since it can manage socket pooling across different host:port
++// options.  When using the older implementation, the
++// key is ca:host:port combination.
++
++module.exports = getAgent
++
++var npm = require("../npm.js")
++  , url = require("url")
++  , agents = {}
++  , isHttp2 = !!require("http").globalAgent
++  , registry = url.parse(npm.config.get("registry") || "")
++  , regCA = npm.config.get("ca")
++
++function getAgent (remote) {
++  // If not doing https, then there's no CA cert to manage.
++  // on http2, this will use the default global agent.
++  // on http1, this is undefined, so it'll spawn based on
++  // host:port if necessary.
++  if (remote.protocol !== "https:") {
++    return require("http").globalAgent
++  }
++
++  if (typeof remote === "string") {
++    remote = url.parse(remote)
++  }
++
++  var ca
++  // if this is the registry, then use the configuration ca.
++  // otherwise, just use the built-in CAs that node has.
++  // todo: multi-registry support.
++  if (remote.hostname === registry.hostname
++      && remote.port === registry.port) {
++    ca = regCA
++  }
++
++  // no CA, just use the default agent.
++  if (!ca) {
++    return require("https").globalAgent
++  }
++
++  var hostname = remote.hostname
++    , port = remote.port
++    , key = agentKey(hostname, port, ca)
++
++  return agents[key] = agents[key] || getAgent_(hostname, port, ca)
++}
++
++function getAgent_ (hostname, port, ca) {
++  var Agent = require("https").Agent
++  return new Agent({ host: hostname
++                   , port: port
++                   , ca: ca })
++}
++
++function agentKey (hostname, port, ca) {
++  return JSON.stringify(isHttp2 ? ca : [hostname, port, ca])
++}
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3c5e4f099be3933a8e6e6c2c4d5ad5735df83856
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,6 @@@
++
++module.exports = get
++function get (obj, key) {
++  for (var i in obj) if (i.toLowerCase() === key.toLowerCase()) return obj[i]
++  return undefined
++}
index b033b6a04d11059f8435872d72b5bcef6231f0d6,b033b6a04d11059f8435872d72b5bcef6231f0d6..48d4f99edf4a2f117a2d7f17cce1154143ac66e3
@@@ -323,14 -323,14 +323,8 @@@ function envReplace (f) 
    if (typeof f !== "string" || !f) return f
  
    // replace any ${ENV} values with the appropriate environ.
--  var envExpr = /(\\*)\$\{([^}]+)\}/g
--  return f.replace(envExpr, function (orig, esc, name, i, s) {
--    esc = esc.length && esc.length % 2
--    if (esc) return orig
--    if (undefined === process.env[name]) {
--      throw new Error("Failed to replace env in config: "+orig)
--    }
--    return process.env[name]
++  return f.replace(/\$\{([^}]+)\}/g, function (orig, name, i, s) {
++    return process.env[name] || orig
    })
  }
  
index 92b086e699590da0e47196c21e1b0a5a1b714fdf,92b086e699590da0e47196c21e1b0a5a1b714fdf..970157349a75b5c6d02c9c74728aa7e3cd7691bb
@@@ -11,17 -11,17 +11,6 @@@ var log = require("./log.js"
    , chain = require("slide").chain
    , constants = require("constants")
    , output = require("./output.js")
--  , PATH = "PATH"
--
--// windows calls it's path "Path" usually, but this is not guaranteed.
--if (process.platform === "win32") {
--  PATH = "Path"
--  Object.keys(process.env).forEach(function (e) {
--    if (e.match(/^PATH$/i)) {
--      PATH = e
--    }
--  })
--}
  
  function lifecycle (pkg, stage, wd, unsafe, failOk, cb) {
    if (typeof cb !== "function") cb = failOk, failOk = false
@@@ -65,21 -65,21 +54,16 @@@ function checkForLink (pkg, cb) 
  }
  
  function lifecycle_ (pkg, stage, wd, env, unsafe, failOk, cb) {
--  var pathArr = []
++  var PATH = []
      , p = wd.split("node_modules")
      , acc = path.resolve(p.shift())
    p.forEach(function (pp) {
--    pathArr.unshift(path.join(acc, "node_modules", ".bin"))
++    PATH.unshift(path.join(acc, "node_modules", ".bin"))
      acc = path.join(acc, "node_modules", pp)
    })
--  pathArr.unshift(path.join(acc, "node_modules", ".bin"))
--
--  // we also unshift the bundled node-gyp-bin folder so that
--  // the bundled one will be used for installing things.
--  pathArr.unshift(path.join(__dirname, "..", "..", "bin", "node-gyp-bin"))
--
--  if (env[PATH]) pathArr.push(env[PATH])
--  env[PATH] = pathArr.join(process.platform === "win32" ? ";" : ":")
++  PATH.unshift(path.join(acc, "node_modules", ".bin"))
++  if (env.PATH) PATH.push(env.PATH)
++  env.PATH = PATH.join(process.platform === "win32" ? ";" : ":")
  
    var packageLifecycle = pkg.scripts && pkg.scripts.hasOwnProperty(stage)
  
@@@ -129,7 -129,7 +113,7 @@@ function runPackageLifecycle (pkg, env
      , cmd = env.npm_lifecycle_script
      , sh = "sh"
      , shFlag = "-c"
--
++  
    if (process.platform === "win32") {
      sh = "cmd"
      shFlag = "/c"
  
    log.verbose(unsafe, "unsafe-perm in lifecycle")
  
--  var note = "\n> " + pkg._id + " " + stage + " " + wd
--           + "\n> " + cmd + "\n"
--
--  output.write(note, function (er) {
++  output.write("\n> "+pkg._id+" " + stage+" "+wd+"\n> "+cmd+"\n", function (er) {
      if (er) return cb(er)
--
++    
      exec( sh, [shFlag, cmd], env, true, wd
          , user, group
          , function (er, code, stdout, stderr) {
@@@ -252,10 -252,10 +233,6 @@@ function makeEnv (data, prefix, env) 
        return
      }
      var value = ini.get(i)
--    if (/^(log|out)fd$/.test(i) && typeof value === "object") {
--      // not an fd, a stream
--      return
--    }
      if (!value) value = ""
      else if (typeof value !== "string") value = JSON.stringify(value)
  
index 7fa80d5e12e89b65bb1a96087630e9f754a8b8ae,7fa80d5e12e89b65bb1a96087630e9f754a8b8ae..9be1221f0ae6261a320daf87442018a956a9a9b4
@@@ -4,8 -4,8 +4,8 @@@ link.ifExists = linkIfExist
  
  var fs = require("graceful-fs")
    , chain = require("slide").chain
--  , mkdir = require("mkdirp")
--  , rm = require("./gently-rm.js")
++  , mkdir = require("./mkdir-p.js")
++  , rm = require("rimraf")
    , log = require("./log.js")
    , path = require("path")
    , relativize = require("./relativize.js")
@@@ -23,7 -23,7 +23,7 @@@ function link (from, to, gently, cb) 
    if (npm.config.get("force")) gently = false
    chain
      ( [ [fs, "stat", from]
--      , [rm, to, gently]
++      , [rm, to, { gently: gently }]
        , [mkdir, path.dirname(to)]
        , [fs, "symlink", relativize(from, to), to] ]
      , cb)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..cc2b465fb62fecea4c17ed264b6b09799f8a19dc
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,191 @@@
++
++var log = require("./log.js")
++  , fs = require("graceful-fs")
++  , path = require("path")
++  , npm = require("../npm.js")
++  , exec = require("./exec.js")
++  , uidNumber = require("./uid-number.js")
++  , umask = process.umask()
++  , umaskOrig = umask
++  , addedUmaskExit = false
++  , mkdirCache = {}
++
++module.exports = mkdir
++function mkdir (ensure, mode, uid, gid, noChmod, cb_) {
++  if (typeof cb_ !== "function") cb_ = noChmod, noChmod = null
++  if (typeof cb_ !== "function") cb_ = gid, gid = null
++  if (typeof cb_ !== "function") cb_ = uid, uid = null
++  if (typeof cb_ !== "function") cb_ = mode, mode = npm.modes.exec
++
++  if (mode & umask) {
++    log.verbose(mode.toString(8), "umasking from "+umask.toString(8))
++    process.umask(umask = 0)
++    if (!addedUmaskExit) {
++      addedUmaskExit = true
++      process.on("exit", function () { process.umask(umask = umaskOrig) })
++    }
++  }
++
++  ensure = path.resolve(ensure).replace(/\/+$/, '')
++
++  // mkdir("/") should not do anything, since that always exists.
++  if (!ensure
++      || ( process.platform === "win32"
++         && ensure.match(/^[a-zA-Z]:(\\|\/)?$/))) {
++    return cb_()
++  }
++
++  if (mkdirCache.hasOwnProperty(ensure)) {
++    return mkdirCache[ensure].push(cb_)
++  }
++  mkdirCache[ensure] = [cb_]
++
++  function cb (er) {
++    var cbs = mkdirCache[ensure]
++    delete mkdirCache[ensure]
++    cbs.forEach(function (c) { c(er) })
++  }
++
++  if (uid === null && gid === null) {
++    return mkdir_(ensure, mode, uid, gid, noChmod, cb)
++  }
++
++  uidNumber(uid, gid, function (er, uid, gid) {
++    if (er) return cb(er)
++    mkdir_(ensure, mode, uid, gid, noChmod, cb)
++  })
++}
++
++function mkdir_ (ensure, mode, uid, gid, noChmod, cb) {
++  // if it's already a dir, then just check the bits and owner.
++  fs.stat(ensure, function (er, s) {
++    if (s && s.isDirectory()) {
++      // check mode, uid, and gid.
++      if ((noChmod || (s.mode & mode) === mode)
++          && (typeof uid !== "number" || s.uid === uid)
++          && (typeof gid !== "number" || s.gid === gid)) return cb()
++      return done(ensure, mode, uid, gid, noChmod, cb)
++    }
++    return walkDirs(ensure, mode, uid, gid, noChmod, cb)
++  })
++}
++
++function done (ensure, mode, uid, gid, noChmod, cb) {
++  // now the directory has been created.
++  // chown it to the desired uid/gid
++  // Don't chown the npm.root dir, though, in case we're
++  // in unsafe-perm mode.
++  log.verbose("done: "+ensure+" "+mode.toString(8), "mkdir")
++
++  // only chmod if noChmod isn't set.
++  var d = done_(ensure, mode, uid, gid, cb)
++  if (noChmod) return d()
++  fs.chmod(ensure, mode, d)
++}
++
++function done_ (ensure, mode, uid, gid, cb) {
++  return function (er) {
++    if (er
++        || ensure === npm.dir
++        || typeof uid !== "number"
++        || typeof gid !== "number"
++        || npm.config.get("unsafe-perm")) return cb(er)
++    uid = Math.floor(uid)
++    gid = Math.floor(gid)
++    fs.chown(ensure, uid, gid, cb)
++  }
++}
++
++var pathSplit = process.platform === "win32" ? /\/|\\/ : "/"
++function walkDirs (ensure, mode, uid, gid, noChmod, cb) {
++  var dirs = ensure.split(pathSplit)
++    , walker = []
++    , foundUID = null
++    , foundGID = null
++
++  // gobble the "/" or C: first
++  walker.push(dirs.shift())
++
++  // The loop that goes through and stats each dir.
++  ;(function S (d) {
++    // no more directory steps left.
++    if (d === undefined) {
++      // do the chown stuff
++      return done(ensure, mode, uid, gid, noChmod, cb)
++    }
++
++    // get the absolute dir for the next piece being stat'd
++    walker.push(d)
++    var dir = walker.join(path.SPLIT_CHAR)
++
++    // stat callback lambda
++    fs.stat(dir, function STATCB (er, s) {
++      if (er) {
++        // the stat failed - directory does not exist.
++
++        log.verbose(er.message, "mkdir (expected) error")
++
++        // use the same uid/gid as the nearest parent, if not set.
++        if (foundUID !== null) uid = foundUID
++        if (foundGID !== null) gid = foundGID
++
++        // make the directory
++        fs.mkdir(dir, mode, function MKDIRCB (er) {
++          // since stat and mkdir are done as two separate syscalls,
++          // operating on a path rather than a file descriptor, it's
++          // possible that the directory didn't exist when we did
++          // the stat, but then *did* exist when we go to to the mkdir.
++          // If we didn't care about uid/gid, we could just mkdir
++          // repeatedly, failing on any error other than "EEXIST".
++          if (er && er.message.indexOf("EEXIST") === 0) {
++            return fs.stat(dir, STATCB)
++          }
++
++          // any other kind of error is not saveable.
++          if (er) return cb(er)
++
++          // at this point, we've just created a new directory successfully.
++
++          // if we care about permissions
++          if (!npm.config.get("unsafe-perm") // care about permissions
++              // specified a uid and gid
++              && uid !== null
++              && gid !== null ) {
++            // set the proper ownership
++            return fs.chown(dir, uid, gid, function (er) {
++              if (er) return cb(er)
++              // attack the next portion of the path.
++              S(dirs.shift())
++            })
++          } else {
++            // either we don't care about ownership, or it's already right.
++            S(dirs.shift())
++          }
++        }) // mkdir
++
++      } else {
++        // the stat succeeded.
++        if (s.isDirectory()) {
++          // if it's a directory, that's good.
++          // if the uid and gid aren't already set, then try to preserve
++          // the ownership on up the tree.  Things in ~ remain owned by
++          // the user, things in / remain owned by root, etc.
++          if (uid === null && typeof s.uid === "number") foundUID = s.uid
++          if (gid === null && typeof s.gid === "number") foundGID = s.gid
++
++          // move onto next portion of path
++          S(dirs.shift())
++
++        } else {
++          // the stat succeeded, but it's not a directory
++          log.verbose(dir, "mkdir exists")
++          log.silly(s, "stat("+dir+")")
++          log.verbose(s.isDirectory(), "isDirectory()")
++          cb(new Error("Failed to mkdir "+dir+": File exists"))
++        }// if (isDirectory) else
++      } // if (stat failed) else
++    }) // stat
++
++  // start the S function with the first item in the list of directories.
++  })(dirs.shift())
++}
index e0902f02769d69bd33a2226e9315b1966e71f241,e0902f02769d69bd33a2226e9315b1966e71f241..ae05ac1fc3ec78ace671cb6156fd6d93b2805677
@@@ -6,9 -6,9 +6,8 @@@ var GET = require("./request.js").GE
    , npm = require("../../npm.js")
    , path = require("path")
    , log = require("../log.js")
--  , mkdir = require("mkdirp")
++  , mkdir = require("../mkdir-p.js")
    , cacheStat = null
--  , chownr = require("chownr")
  
  function get (project, version, timeout, nofollow, staleOk, cb) {
    if (typeof cb !== "function") cb = staleOk, staleOk = false
@@@ -20,9 -20,9 +19,6 @@@
      throw new Error("No callback provided to registry.get")
    }
  
--  timeout = Math.min(timeout, npm.config.get("cache-max"))
--  timeout = Math.max(timeout, npm.config.get("cache-min"))
--
    if ( process.env.COMP_CWORD !== undefined
      && process.env.COMP_LINE !== undefined
      && process.env.COMP_POINT !== undefined
@@@ -140,7 -140,7 +136,7 @@@ function get_ (uri, timeout, cache, sta
  
      data = remoteData
      if (!data) {
--      er = er || new Error("failed to fetch from registry: " + uri)
++      er = new Error("failed to fetch from registry: " + uri)
      }
  
      if (er) return cb(er, data, raw, response)
@@@ -174,13 -174,13 +170,13 @@@ function saveToCache (cache, data, save
  }
  
  function saveToCache_ (cache, data, uid, gid, saved) {
--  mkdir(path.dirname(cache), function (er, made) {
++  mkdir(path.dirname(cache), npm.modes.exec, uid, gid, function (er) {
      if (er) return saved()
      fs.writeFile(cache, JSON.stringify(data), function (er) {
        if (er || uid === null || gid === null) {
          return saved()
        }
--      chownr(made || cache, uid, gid, saved)
++      fs.chown(cache, uid, gid, saved)
      })
    })
  }
index d5122629dd1e7be6e6eb41e6bb935050d9a504fd,d5122629dd1e7be6e6eb41e6bb935050d9a504fd..d98135e49e500f8218812e1801e684932362a9ea
@@@ -16,6 -16,6 +16,7 @@@ var npm = require("../../npm.js"
    , stream = require("stream")
    , Stream = stream.Stream
    , request = require("request")
++  , getAgent = require("../get-agent.js")
  
  function regRequest (method, where, what, etag, nofollow, cb_) {
    if (typeof cb_ !== "function") cb_ = nofollow, nofollow = false
@@@ -84,7 -84,7 +85,7 @@@
  function makeRequest (method, remote, where, what, etag, nofollow, cb) {
    var opts = { url: remote
               , method: method
--             , ca: npm.config.get("ca")
++             , agent: getAgent(remote)
               , strictSSL: npm.config.get("strict-ssl") }
      , headers = opts.headers = {}
    if (etag) {
@@@ -94,8 -94,8 +95,6 @@@
  
    headers.accept = "application/json"
  
--  headers["user-agent"] = npm.config.get("user-agent")
--
    opts.proxy = npm.config.get( remote.protocol === "https:"
                               ? "https-proxy" : "proxy" )
  
index b705153ad5a9f07e2c6c22a21ac4977a9fe66e26,b705153ad5a9f07e2c6c22a21ac4977a9fe66e26..00da9f69f7b4dd6b10261c2fdb8d2e00e8d5a4c2
@@@ -58,7 -58,7 +58,6 @@@ function write (args, stream, lf, cb) 
      if (!npm.config.get("unicode")) {
        arg = arg.replace(/└/g, "`")
                 .replace(/─/g, "-")
--               .replace(/│/g, "|")
                 .replace(/├/g, "+")
                 .replace(/┬/g, "-")
      }
index ff220943d64446f4d7431d82360d3afb108b11e2,ff220943d64446f4d7431d82360d3afb108b11e2..6c0ece25bc003564b40c9a71c871f14625f3e177
@@@ -94,7 -94,7 +94,6 @@@ var npm = require("../npm.js"
    , semver = require("semver")
    , readJson = require("./read-json.js")
    , log = require("./log.js")
--  , url = require("url")
  
  module.exports = readInstalled
  
@@@ -126,8 -126,8 +125,7 @@@ function readInstalled_ (folder, parent
    })
  
    readJson(path.resolve(folder, "package.json"), function (er, data) {
--    obj = copy(data)
--
++    obj = data
      if (!parent) {
        obj = obj || true
        er = null
@@@ -255,8 -255,8 +253,6 @@@ function findUnmet (obj) 
            continue
          }
          if ( typeof deps[d] === "string"
--            // url deps presumed innocent.
--            && !url.parse(deps[d]).protocol
              && !semver.satisfies(found.version, deps[d])) {
            // the bad thing will happen
            log.warn(obj.path + " requires "+d+"@'"+deps[d]
    return obj
  }
  
--function copy (obj) {
--  if (!obj || typeof obj !== 'object') return obj
--  if (Array.isArray(obj)) return obj.map(copy)
--
--  var o = {}
--  for (var i in obj) o[i] = copy(obj[i])
--  return o
--}
--
  if (module === require.main) {
    var util = require("util")
    console.error("testing")
index d1bba10f58a49d4d7dc448296c7ab99d6f345a28,d1bba10f58a49d4d7dc448296c7ab99d6f345a28..388d6727eb2ec81426463d27fe6061b2afd47cef
@@@ -34,33 -34,33 +34,8 @@@ function readJson (jsonFile, opts, cb) 
    var wscript = null
      , contributors = null
      , serverjs = null
--    , gypfile = null
  
--  if (opts.gypfile !== null && opts.gypfile !== undefined) {
--    gypfile = opts.gypfile
--    next()
--  } else {
--    var pkgdir = path.dirname(jsonFile)
--
--    function hasGyp (has) {
--      gypfile = opts.gypfile = has
--      next()
--    }
--
--    fs.readdir(pkgdir, function (er, gf) {
--      // this would be weird.
--      if (er) return hasGyp(false)
--
--      // see if there are any *.gyp files in there.
--      gf = gf.filter(function (f) {
--        return f.match(/\.gyp$/)
--      })
--      gf = gf[0]
--      return hasGyp(!!gf)
--    })
--  }
--
--  if (opts.wscript !== null && opts.wscript !== undefined) {
++  if (opts.wscript != null) {
      wscript = opts.wscript
      next()
    } else fs.readFile( path.join(path.dirname(jsonFile), "wscript")
@@@ -72,7 -72,7 +47,7 @@@
      next()
    })
  
--  if (opts.contributors !== null && opts.contributors !== undefined) {
++  if (opts.contributors != null) {
      contributors = opts.contributors
      next()
    } else fs.readFile( path.join(path.dirname(jsonFile), "AUTHORS")
@@@ -89,7 -89,7 +64,7 @@@
      next()
    })
  
--  if (opts.serverjs !== null && opts.serverjs !== undefined) {
++  if (opts.serverjs != null) {
      serverjs = opts.serverjs
      next()
    } else fs.stat( path.join(path.dirname(jsonFile), "server.js")
    })
  
    function next () {
--    if (wscript === null ||
--        contributors === null ||
--        gypfile === null ||
--        serverjs === null) {
++    if (wscript === null
++        || contributors === null
++        || serverjs === null) {
        return
      }
  
--    // XXX this api here is insane.  being internal is no excuse.
--    // please refactor.
--    var thenLoad = processJson(opts, function (er, data) {
++    fs.readFile(jsonFile, processJson(opts, function (er, data) {
        if (er) return cb(er)
        var doLoad = !(jsonFile.indexOf(npm.cache) === 0 &&
                       path.basename(path.dirname(jsonFile)) !== "package")
        if (!doLoad) return cb(er, data)
        loadPackageDefaults(data, path.dirname(jsonFile), cb)
--    })
--
--    fs.readFile(jsonFile, function (er, data) {
--      if (er && er.code === "ENOENT") {
--        // single-file module, maybe?
--        // check index.js for a /**package { ... } **/ section.
--        var indexFile = path.resolve(path.dirname(jsonFile), "index.js")
--        return fs.readFile(indexFile, function (er2, data) {
--          // if this doesn't work, then die with the original error.
--          if (er2) return cb(er)
--          data = parseIndex(data)
--          if (!data) return cb(er)
--          thenLoad(null, data)
--        })
--      }
--      thenLoad(er, data)
--    })
++    }))
    }
  }
  
--// sync. no io.
--// /**package { "name": "foo", "version": "1.2.3", ... } **/
--function parseIndex (data) {
--  data = data.toString()
--  data = data.split(/^\/\*\*package(?:\s|$)/m)
--  if (data.length < 2) return null
--  data = data[1]
--  data = data.split(/\*\*\/$/m)
--  if (data.length < 2) return null
--  data = data[0]
--  data = data.replace(/^\s*\*/mg, "")
--  return data
--}
--
  function processJson (opts, cb) {
    if (typeof cb !== "function") cb = opts, opts = {}
    if (typeof cb !== "function") {
  }
  
  function processJsonString (opts, cb) { return function (er, jsonString) {
--  if (er) return cb(er, jsonString)
    jsonString += ""
++  if (er) return cb(er, jsonString)
    var json
    try {
      json = JSON.parse(jsonString)
@@@ -246,12 -246,12 +188,11 @@@ function typoWarn (json) 
                    }
  
    if (typeof json.bugs === "object") {
--    // just go ahead and correct these.
      Object.keys(bugsTypos).forEach(function (d) {
        if (json.bugs.hasOwnProperty(d)) {
--        json.bugs[ bugsTypos[d] ] = json.bugs[d]
--        delete json.bugs[d]
--      }
++        log.warn( "package.json: bugs['" + d + "'] should probably be "
++                + "bugs['" + bugsTypos[d] + "']", json._id)
++        }
      })
    }
  
@@@ -359,15 -359,15 +300,6 @@@ function processObject (opts, cb) { ret
  
    var scripts = json.scripts || {}
  
--  // if it has a bindings.gyp, then build with node-gyp
--  if (opts.gypfile && !json.prebuilt) {
--    log.verbose([json.prebuilt, opts], "has bindings.gyp")
--    if (!scripts.install && !scripts.preinstall) {
--      scripts.install = "node-gyp rebuild"
--      json.scripts = scripts
--    }
--  }
--
    // if it has a wscript, then build it.
    if (opts.wscript && !json.prebuilt) {
      log.verbose([json.prebuilt, opts], "has wscript")
    if (opts.dev
        || npm.config.get("dev")
        || npm.config.get("npat")) {
++    // log.warn(json._id, "Adding devdeps")
      Object.keys(json.devDependencies || {}).forEach(function (d) {
        json.dependencies[d] = json.devDependencies[d]
      })
++    // log.warn(json.dependencies, "Added devdeps")
    }
  
    typoWarn(json)
  
  var depObjectifyWarn = {}
  function depObjectify (deps, d, id) {
++  if ((!deps || typeof deps !== "object" || Array.isArray(deps))
++      && !depObjectifyWarn[id+d]) {
++    log.warn( d + " field should be hash of <name>:<version-range> pairs"
++            , id )
++    depObjectifyWarn[id + d] = true
++  }
++
    if (!deps) return {}
    if (typeof deps === "string") {
      deps = deps.trim().split(/[\n\r\s\t ,]+/)
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..4d9241aab714d4f09fcfbfa49bae5df451cb4b0d
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++
++module.exports = set
++var get = require("./get.js")
++  , processJson = require("./read-json.js").processJson
++function set (obj, key, val) {
++  for (var i in obj) {
++    if (i.toLowerCase() === key.toLowerCase()) return obj[i] = val
++  }
++  obj[key] = val
++  if (!val) return
++  // if it's a package set, then assign all the versions.
++  if (val.versions) return Object.keys(val.versions).forEach(function (v) {
++    if (typeof val.versions[v] !== "object") return
++    set(obj, key+"@"+v, val.versions[v])
++  })
++  // Note that this doesn't put the dist-tags there, only updates the versions
++  if (key === val.name+"@"+val.version) {
++    processJson(val)
++    var reg = get(obj, val.name) || {}
++    reg.name = reg._id = val.name
++    set(obj, val.name, reg)
++    reg.versions = get(reg, "versions") || {}
++    if (!get(reg.versions, val.version)) set(reg.versions, val.version, val)
++  }
++}
index 415eb7f9e2f96cc234bcfdeafa1696d14c0ba5ae,415eb7f9e2f96cc234bcfdeafa1696d14c0ba5ae..f315bbf961bac41eab8cda9af3335d5724a7a67b
++// XXX lib/cache.js and this file need to be rewritten.
++
  // commands for packing and unpacking tarballs
  // this file is used by lib/cache.js
  
  var npm = require("../npm.js")
    , fs = require("graceful-fs")
++  , exec = require("./exec.js")
++  , find = require("./find.js")
++  , mkdir = require("./mkdir-p.js")
++  , asyncMap = require("slide").asyncMap
    , path = require("path")
    , log = require("./log.js")
--  , uidNumber = require("uid-number")
++  , uidNumber = require("./uid-number.js")
    , rm = require("rimraf")
    , readJson = require("./read-json.js")
    , relativize = require("./relativize.js")
    , cache = require("../cache.js")
++  , excludes = require("./excludes.js")
    , myUid = process.getuid && process.getuid()
    , myGid = process.getgid && process.getgid()
    , tar = require("tar")
    , zlib = require("zlib")
    , fstream = require("fstream")
--  , Packer = require("fstream-npm")
--
--if (process.env.SUDO_UID && myUid === 0) {
--  if (!isNaN(process.env.SUDO_UID)) myUid = +process.env.SUDO_UID
--  if (!isNaN(process.env.SUDO_GID)) myGid = +process.env.SUDO_GID
--}
  
  exports.pack = pack
  exports.unpack = unpack
++exports.makeList = makeList
  
  function pack (targetTarball, folder, pkg, dfc, cb) {
--  log.verbose([targetTarball, folder], "tar.pack")
    if (typeof cb !== "function") cb = dfc, dfc = true
++  folder = path.resolve(folder)
++
++  log.verbose(folder, "pack")
++
++  if (typeof pkg === "function") {
++    cb = pkg, pkg = null
++    return readJson(path.resolve(folder, "package.json"), function (er, pkg) {
++      if (er) return log.er(cb, "Couldn't find package.json in "+folder)(er)
++      pack(targetTarball, folder, pkg, dfc, cb)
++    })
++  }
++  log.verbose(folder+" "+targetTarball, "pack")
++  var parent = path.dirname(folder)
++    , addFolder = path.basename(folder)
++
++  var confEx = npm.config.get("ignore")
++  log.silly(folder, "makeList")
++  makeList(folder, pkg, dfc, function (er, files, cleanup) {
++    if (er) return cb(er)
++    // log.silly(files, "files")
++    return packFiles(targetTarball, parent, files, pkg, function (er) {
++      if (!cleanup || !cleanup.length) return cb(er)
++      // try to be a good citizen, even/especially in the event of failure.
++      cleanupResolveLinkDep(cleanup, function (er2) {
++        if (er || er2) {
++          if (er) log(er, "packing tarball")
++          if (er2) log(er2, "while cleaning up resolved deps")
++        }
++        return cb(er || er2)
++      })
++    })
++  })
++}
++
++function packFiles (targetTarball, parent, files, pkg, cb_) {
++
++  var p
++
++  files = files.map(function (f) {
++    p = f.split(/\/|\\/)[0]
++    return path.resolve(parent, f)
++  })
++
++  parent = path.resolve(parent, p)
++
++  var called = false
++  function cb (er) {
++    if (called) return
++    called = true
++    cb_(er)
++  }
  
    log.verbose(targetTarball, "tarball")
--  log.verbose(folder, "folder")
--  new Packer({ path: folder, type: "Directory", isDirectory: true })
--    .on("error", log.er(cb, "error reading "+folder))
++  log.verbose(parent, "parent")
++  fstream.Reader({ type: "Directory"
++                 , path: parent
++                 , filter: function () {
++                     // files should *always* get into tarballs
++                     // in a user-writable state, even if they're
++                     // being installed from some wackey vm-mounted
++                     // read-only filesystem.
++                     this.props.mode = this.props.mode | 0200
++                     var inc = -1 !== files.indexOf(this.path)
  
++                     // WARNING! Hackety hack!
++                     // XXX Fix this in a better way.
++                     // Rename .gitignore to .npmignore if there is not a
++                     // .npmignore file there already, the better to lock
++                     // down installed packages with git for deployment.
++                     if (this.basename === ".gitignore") {
++                       if (this.parent._entries.indexOf(".npmignore") !== -1) {
++                         return false
++                       }
++                       var d = path.dirname(this.path)
++                       this.basename = ".npmignore"
++                       this.path = path.join(d, ".npmignore")
++                     }
++                     return inc
++                   }
++                 })
++    .on("error", log.er(cb, "error reading "+parent))
      // By default, npm includes some proprietary attributes in the
      // package tarball.  This is sane, and allowed by the spec.
      // However, npm *itself* excludes these from its own package,
      .on("error", log.er(cb, "gzip error "+targetTarball))
      .pipe(fstream.Writer({ type: "File", path: targetTarball }))
      .on("error", log.er(cb, "Could not write "+targetTarball))
--    .on("close", function () {
--      cb()
--    })
++    .on("close", cb)
  }
  
  
  function unpack (tarball, unpackTarget, dMode, fMode, uid, gid, cb) {
--  log.verbose(tarball, "unpack")
    if (typeof cb !== "function") cb = gid, gid = null
    if (typeof cb !== "function") cb = uid, uid = null
    if (typeof cb !== "function") cb = fMode, fMode = npm.modes.file
  }
  
  function unpack_ ( tarball, unpackTarget, dMode, fMode, uid, gid, cb ) {
++  // If the desired target is /path/to/foo,
++  // then unpack into /path/to/.foo.npm/{something}
++  // rename that to /path/to/foo, and delete /path/to/.foo.npm
    var parent = path.dirname(unpackTarget)
      , base = path.basename(unpackTarget)
++    , tmp = path.resolve(parent, "___" + base + ".npm")
  
--  rm(unpackTarget, function (er) {
--    if (er) return cb(er)
--
++  mkdir(tmp, dMode || npm.modes.exec, uid, gid, function (er) {
++    log.verbose([uid, gid], "unpack_ uid, gid")
++    log.verbose(unpackTarget, "unpackTarget")
++    if (er) return log.er(cb, "Could not create "+tmp)(er)
++    // cp the gzip of the tarball, pipe the stdout into tar's stdin
      // gzip {tarball} --decompress --stdout \
      //   | tar -mvxpf - --strip-components=1 -C {unpackTarget}
--    gunzTarPerm( tarball, unpackTarget
++    gunzTarPerm( tarball, tmp
                 , dMode, fMode
                 , uid, gid
                 , function (er, folder) {
        if (er) return cb(er)
--      readJson(path.resolve(folder, "package.json"), cb)
++      log.verbose(folder, "gunzed")
++
++      rm(unpackTarget, function (er) {
++        if (er) return cb(er)
++        log.verbose(unpackTarget, "rm'ed")
++
++        moveIntoPlace(folder, unpackTarget, function (er) {
++          if (er) return cb(er)
++          log.verbose([folder, unpackTarget], "renamed")
++          // curse you, nfs!  It will lie and tell you that the
++          // mv is done, when in fact, it isn't.  In theory,
++          // reading the file should cause it to wait until it's done.
++          readJson( path.resolve(unpackTarget, "package.json")
++                  , function (er, data) {
++            // now we read the json, so we know it's there.
++            rm(tmp, function (er2) { cb(er || er2, data) })
++          })
++        })
++      })
      })
    })
  }
  
++// on Windows, A/V software can lock the directory, causing this
++// to fail with an EACCES.  Try again on failure, for up to 1 second.
++// XXX Fix this by not unpacking into a temp directory, instead just
++// renaming things on the way out of the tarball.
++function moveIntoPlace (folder, unpackTarget, cb) {
++  var start = Date.now()
++  fs.rename(folder, unpackTarget, function CB (er) {
++    if (er
++        && process.platform === "win32"
++        && er.code === "EACCES"
++        && Date.now() - start < 1000) {
++      return fs.rename(folder, unpackTarget, CB)
++    }
++    cb(er)
++  })
++}
  
--function gunzTarPerm (tarball, target, dMode, fMode, uid, gid, cb_) {
++
++function gunzTarPerm (tarball, tmp, dMode, fMode, uid, gid, cb) {
    if (!dMode) dMode = npm.modes.exec
    if (!fMode) fMode = npm.modes.file
    log.silly([dMode.toString(8), fMode.toString(8)], "gunzTarPerm modes")
  
--  var cbCalled = false
--  function cb (er) {
--    if (cbCalled) return
--    cbCalled = true
--    cb_(er, target)
--  }
--
--  var fst = fs.createReadStream(tarball)
++  fs.createReadStream(tarball)
++    .on("error", log.er(cb, "error reading "+tarball))
++    .pipe(zlib.Unzip())
++    .on("error", log.er(cb, "unzip error "+tarball))
++    .pipe(tar.Extract({ type: "Directory", path: tmp }))
++    .on("error", log.er(cb, "Failed unpacking "+tarball))
++    .on("close", afterUntar)
  
--  // figure out who we're supposed to be, if we're not pretending
--  // to be a specific user.
--  if (npm.config.get("unsafe-perm") && process.platform !== "win32") {
--    uid = myUid
--    gid = myGid
--  }
++  //
++  // XXX Do all this in an Extract filter.
++  //
++  function afterUntar (er) {
++    log.silly(er, "afterUntar")
++    // if we're not doing ownership management,
++    // then we're done now.
++    if (er) return log.er(cb, "Failed unpacking "+tarball)(er)
  
--  function extractEntry (entry) {
--    log.silly(entry.path, "extracting entry")
--    // never create things that are user-unreadable,
--    // or dirs that are user-un-listable. Only leads to headaches.
--    var originalMode = entry.mode = entry.mode || entry.props.mode
--    entry.mode = entry.mode | (entry.type === "Directory" ? dMode : fMode)
--    entry.mode = entry.mode & (~npm.modes.umask)
--    entry.props.mode = entry.mode
--    if (originalMode !== entry.mode) {
--      log.silly([entry.path, originalMode, entry.mode], "modified mode")
++    // HACK skip on windows
++    if (npm.config.get("unsafe-perm") && process.platform !== "win32") {
++      uid = process.getuid()
++      gid = process.getgid()
++      if (uid === 0) {
++        if (process.env.SUDO_UID) uid = +process.env.SUDO_UID
++        if (process.env.SUDO_GID) gid = +process.env.SUDO_GID
++      }
      }
  
--    // if there's a specific owner uid/gid that we want, then set that
--    if (process.platform !== "win32" &&
--        typeof uid === "number" &&
--        typeof gid === "number") {
--      entry.props.uid = entry.uid = uid
--      entry.props.gid = entry.gid = gid
++    if (process.platform === "win32") {
++      return fs.readdir(tmp, function (er, files) {
++        files = files.filter(function (f) {
++          return f && f.indexOf("\0") === -1
++        })
++        cb(er, files && path.resolve(tmp, files[0]))
++      })
      }
++
++    find(tmp, function (f) {
++      return f !== tmp
++    }, function (er, files) {
++      if (er) return cb(er)
++      asyncMap(files, function (f, cb) {
++        f = path.resolve(f)
++        log.silly(f, "asyncMap in gTP")
++        fs.lstat(f, function (er, stat) {
++
++          if (er || stat.isSymbolicLink()) return cb(er)
++          if (typeof uid === "number" && typeof gid === "number") {
++            fs.chown(f, uid, gid, chown)
++          } else chown()
++
++          function chown (er) {
++            if (er) return cb(er)
++            var mode = stat.isDirectory() ? dMode : fMode
++              , oldMode = stat.mode & 0777
++              , newMode = (oldMode | mode) & (~npm.modes.umask)
++            if (mode && newMode !== oldMode) {
++              log.silly(newMode.toString(8), "chmod "+path.basename(f))
++              fs.chmod(f, newMode, cb)
++            } else cb()
++          }
++        })
++      }, function (er) {
++
++        if (er) return cb(er)
++        if (typeof myUid === "number" && typeof myGid === "number") {
++          fs.chown(tmp, myUid, myGid, chown)
++        } else chown()
++
++        function chown (er) {
++          if (er) return cb(er)
++          fs.readdir(tmp, function (er, folder) {
++            folder = folder && folder.filter(function (f) {
++              return f && !f.match(/^\._/)
++            })
++            cb(er, folder && path.resolve(tmp, folder[0]))
++          })
++        }
++      })
++    })
++  }
++}
++
++function makeList (dir, pkg, dfc, cb) {
++  if (typeof cb !== "function") cb = dfc, dfc = true
++  if (typeof cb !== "function") cb = pkg, pkg = null
++  dir = path.resolve(dir)
++
++  if (!pkg.path) pkg.path = dir
++
++  var name = path.basename(dir)
++
++  // since this is a top-level traversal, get the user and global
++  // exclude files, as well as the "ignore" config setting.
++  var confIgnore = npm.config.get("ignore").trim()
++        .split(/[\n\r\s\t]+/)
++        .filter(function (i) { return i.trim() })
++    , userIgnore = npm.config.get("userignorefile")
++    , globalIgnore = npm.config.get("globalignorefile")
++    , userExclude
++    , globalExclude
++
++  confIgnore.dir = dir
++  confIgnore.name = "confIgnore"
++
++  var defIgnore = ["build/"]
++  defIgnore.dir = dir
++
++  // TODO: only look these up once, and cache outside this function
++  excludes.parseIgnoreFile( userIgnore, null, dir
++                          , function (er, uex) {
++    if (er) return cb(er)
++    userExclude = uex
++    next()
++  })
++
++  excludes.parseIgnoreFile( globalIgnore, null, dir
++                          , function (er, gex) {
++    if (er) return cb(er)
++    globalExclude = gex
++    next()
++  })
++
++  function next () {
++    if (!globalExclude || !userExclude) return
++    var exList = [ defIgnore, confIgnore, globalExclude, userExclude ]
++
++    makeList_(dir, pkg, exList, dfc, function (er, files, cleanup) {
++      if (er) return cb(er)
++      var dirLen = dir.replace(/(\/|\\)$/, "").length + 1
++      log.silly([dir, dirLen], "dir, dirLen")
++      files = files.map(function (file) {
++        return path.join(name, file.substr(dirLen))
++      })
++      return cb(null, files, cleanup)
++    })
    }
++}
++
++// Patterns ending in slashes will only match targets
++// ending in slashes.  To implement this, add a / to
++// the filename iff it lstats isDirectory()
++function readDir (dir, pkg, dfc, cb) {
++  fs.readdir(dir, function (er, files) {
++    if (er) return cb(er)
++    files = files.filter(function (f) {
++      return f && f.charAt(0) !== "/" && f.indexOf("\0") === -1
++    })
++    asyncMap(files, function (file, cb) {
++      fs.lstat(path.resolve(dir, file), function (er, st) {
++        if (er) return cb(null, [])
++        // if it's a directory, then tack "/" onto the name
++        // so that it can match dir-only patterns in the
++        // include/exclude logic later.
++        if (st.isDirectory()) return cb(null, file + "/")
++
++        // if it's a symlink, then we need to do some more
++        // complex stuff for GH-691
++        if (st.isSymbolicLink()) return readSymlink(dir, file, pkg, dfc, cb)
++
++        // otherwise, just let it on through.
++        return cb(null, file)
++      })
++    }, cb)
++  })
++}
++
++// just see where this link is pointing, and resolve relative paths.
++function shallowReal (link, cb) {
++  link = path.resolve(link)
++  fs.readlink(link, function (er, t) {
++    if (er) return cb(er)
++    return cb(null, path.resolve(path.dirname(link), t), t)
++  })
++}
++
++function readSymlink (dir, file, pkg, dfc, cb) {
++  var isNM = dfc
++           && path.basename(dir) === "node_modules"
++           && path.dirname(dir) === pkg.path
++  // see if this thing is pointing outside of the package.
++  // external symlinks are resolved for deps, ignored for other things.
++  // internal symlinks are allowed through.
++  var df = path.resolve(dir, file)
++  shallowReal(df, function (er, r, target) {
++    if (er) return cb(null, []) // wtf? exclude file.
++    if (r.indexOf(dir) === 0) return cb(null, file) // internal
++    if (!isNM) return cb(null, []) // external non-dep
++    // now the fun stuff!
++    fs.realpath(df, function (er, resolved) {
++      if (er) return cb(null, []) // can't add it.
++      readJson(path.resolve(resolved, "package.json"), function (er) {
++        if (er) return cb(null, []) // not a package
++        resolveLinkDep(dir, file, resolved, target, pkg, function (er, f, c) {
++          cb(er, f, c)
++        })
++      })
++    })
++  })
++}
  
--  var extractOpts = { type: "Directory", path: target, strip: 1 }
++// put the link back the way it was.
++function cleanupResolveLinkDep (cleanup, cb) {
++  // cut it out of the list, so that cycles will be broken.
++  if (!cleanup) return cb()
  
--  if (process.platform !== "win32" &&
--      typeof uid === "number" &&
--      typeof gid === "number") {
--    extractOpts.uid = uid
--    extractOpts.gid = gid
++  asyncMap(cleanup, function (d, cb) {
++    rm(d[1], function (er) {
++      if (er) return cb(er)
++      fs.symlink(d[0], d[1], cb)
++    })
++  }, cb)
++}
++
++function resolveLinkDep (dir, file, resolved, target, pkg, cb) {
++  // we've already decided that this is a dep that will be bundled.
++  // make sure the data reflects this.
++  var bd = pkg.bundleDependencies || pkg.bundledDependencies || []
++  delete pkg.bundledDependencies
++  pkg.bundleDependencies = bd
++  var f = path.resolve(dir, file)
++    , cleanup = [[target, f, resolved]]
++
++  if (bd.indexOf(file) === -1) {
++    // then we don't do this one.
++    // just move the symlink out of the way.
++    return rm(f, function (er) {
++      cb(er, file, cleanup)
++    })
    }
  
--  extractOpts.filter = function () {
--    // symbolic links are not allowed in packages.
--    if (this.type.match(/^.*Link$/)) {
--      log.warn( this.path.substr(target.length + 1)
--              + ' -> ' + this.linkpath
--              , "excluding symbolic link")
--      return false
++  rm(f, function (er) {
++    if (er) return cb(er)
++    cache.add(resolved, function (er, data) {
++      if (er) return cb(er)
++      cache.unpack(data.name, data.version, f, function (er, data) {
++        if (er) return cb(er)
++        // now clear out the cache entry, since it's weird, probably.
++        // pass the cleanup object along so that the thing getting the
++        // list of files knows what to clean up afterwards.
++        cache.clean([data._id], function (er) { cb(er, file, cleanup) })
++      })
++    })
++  })
++}
++
++// exList is a list of ignore lists.
++// Each exList item is an array of patterns of files to ignore
++//
++function makeList_ (dir, pkg, exList, dfc, cb) {
++  var files = null
++    , cleanup = null
++
++  readDir(dir, pkg, dfc, function (er, f, c) {
++    if (er) return cb(er)
++    cleanup = c
++    files = f.map(function (f) {
++      // no nulls in paths!
++      return f.split(/\0/)[0]
++    }).filter(function (f) {
++      // always remove all source control folders and
++      // waf/vim/OSX garbage.  this is a firm requirement.
++      return !( f === ".git/"
++             || f === ".lock-wscript"
++             || f === "CVS/"
++             || f === ".svn/"
++             || f === ".hg/"
++             || f.match(/^\..*\.swp/)
++             || f === ".DS_Store"
++             || f.match(/^\._/)
++             || f === "npm-debug.log"
++             || f === ""
++             || f.charAt(0) === "/"
++              )
++    })
++
++    // if (files.length > 0) files.push(".")
++
++    if (files.indexOf("package.json") !== -1 && dir !== pkg.path) {
++      // a package.json file starts the whole exclude/include
++      // logic all over.  Otherwise, a parent could break its
++      // deps with its files list or .npmignore file.
++      readJson(path.resolve(dir, "package.json"), function (er, data) {
++        if (!er && typeof data === "object") {
++          data.path = dir
++          return makeList(dir, data, dfc, function (er, files) {
++            // these need to be mounted onto the directory now.
++            cb(er, files && files.map(function (f) {
++              return path.resolve(path.dirname(dir), f)
++            }))
++          })
++        }
++        next()
++      })
++      //next()
++    } else next()
++
++    // add a local ignore file, if found.
++    if (files.indexOf(".npmignore") === -1
++        && files.indexOf(".gitignore") === -1) next()
++    else {
++      excludes.addIgnoreFile( path.resolve(dir, ".npmignore")
++                            , ".gitignore"
++                            , exList
++                            , dir
++                            , function (er, list) {
++        if (!er) exList = list
++        next(er)
++      })
      }
--    return true
--  }
++  })
  
++  var n = 2
++    , errState = null
++  function next (er) {
++    if (errState) return
++    if (er) return cb(errState = er, [], cleanup)
++    if (-- n > 0) return
  
--  fst.on("error", log.er(cb, "error reading "+tarball))
--  fst.on("data", function OD (c) {
--    // detect what it is.
--    // Then, depending on that, we'll figure out whether it's
--    // a single-file module, gzipped tarball, or naked tarball.
--    // gzipped files all start with 1f8b08
--    if (c[0] === 0x1F &&
--        c[1] === 0x8B &&
--        c[2] === 0x08) {
--      fst
--        .pipe(zlib.Unzip())
--        .on("error", log.er(cb, "unzip error "+tarball))
--        .pipe(tar.Extract(extractOpts))
--        .on("entry", extractEntry)
--        .on("error", log.er(cb, "untar error "+tarball))
--        .on("close", cb)
--    } else if (c.toString().match(/^package\//)) {
--      // naked tar
--      fst
--        .pipe(tar.Extract(extractOpts))
--        .on("entry", extractEntry)
--        .on("error", log.er(cb, "untar error "+tarball))
--        .on("close", cb)
++    if (!pkg) return cb(new Error("No package.json file in "+dir))
++    if (pkg.path === dir && pkg.files) {
++      pkg.files = pkg.files.filter(function (f) {
++        f = f.trim()
++        return f && f.charAt(0) !== "#"
++      })
++      if (!pkg.files.length) pkg.files = null
++    }
++    if (pkg.path === dir && pkg.files) {
++      // stuff on the files list MUST be there.
++      // ignore everything, then include the stuff on the files list.
++      var pkgFiles = ["*"].concat(pkg.files.map(function (f) {
++        return "!" + f
++      }))
++      pkgFiles.dir = dir
++      pkgFiles.packageFiles = true
++      exList.push(pkgFiles)
++    }
++
++    if (path.basename(dir) === "node_modules"
++        && pkg.path === path.dirname(dir)
++        && dfc) { // do fancy crap
++      files = filterNodeModules(files, pkg)
      } else {
--      // naked js file
--      var jsOpts = { path: path.resolve(target, "index.js") }
--
--      if (process.platform !== "win32" &&
--          typeof uid === "number" &&
--          typeof gid === "number") {
--        jsOpts.uid = uid
--        jsOpts.gid = gid
++      // If a directory is excluded, we still need to be
++      // able to *include* a file within it, and have that override
++      // the prior exclusion.
++      //
++      // This whole makeList thing probably needs to be rewritten
++      files = files.filter(function (f) {
++        return excludes.filter(dir, exList)(f) || f.slice(-1) === "/"
++      })
++    }
++
++
++    asyncMap(files, function (file, cb) {
++      // if this is a dir, then dive into it.
++      // otherwise, don't.
++      file = path.resolve(dir, file)
++
++      // in 0.6.0, fs.readdir can produce some really odd results.
++      // XXX: remove this and make the engines hash exclude 0.6.0
++      if (file.indexOf(dir) !== 0) {
++        return cb(null, [])
        }
  
--      fst
--        .pipe(fstream.Writer(jsOpts))
--        .on("error", log.er(cb, "copy error "+tarball))
--        .on("close", function () {
--          var j = path.resolve(target, "package.json")
--          readJson(j, function (er, d) {
--            if (er) {
--              log.error(tarball, "Not a package")
--              return cb(er)
--            }
--            fs.writeFile(j, JSON.stringify(d) + "\n", cb)
--          })
--        })
--    }
++      fs.lstat(file, function (er, st) {
++        if (er) return cb(er)
++        if (st.isDirectory()) {
++          return makeList_(file, pkg, exList, dfc, cb)
++        }
++        return cb(null, file)
++      })
++    }, function (er, files, c) {
++      if (c) cleanup = (cleanup || []).concat(c)
++      if (files.length > 0) files.push(dir)
++      return cb(er, files, cleanup)
++    })
++  }
++}
++
++// only include node_modules folder that are:
++// 1. not on the dependencies list or
++// 2. on the "bundleDependencies" list.
++function filterNodeModules (files, pkg) {
++  var bd = pkg.bundleDependencies || pkg.bundledDependencies || []
++    , deps = Object.keys(pkg.dependencies || {})
++             .filter(function (key) { return !pkg.dependencies[key].extraneous })
++             .concat(Object.keys(pkg.devDependencies || {}))
++
++  delete pkg.bundledDependencies
++  pkg.bundleDependencies = bd
  
--    // now un-hook, and re-emit the chunk
--    fst.removeListener("data", OD)
--    fst.emit("data", c)
++  return files.filter(function (f) {
++    f = f.replace(/\/$/, "")
++    return f.charAt(0) !== "."
++           && f.charAt(0) !== "_"
++           && bd.indexOf(f) !== -1
    })
  }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..3756275534ff39775fe7ea2763bc7d063415af2e
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,55 @@@
++module.exports = uidNumber
++
++// This module calls into bin/npm-get-uid-gid.js, which sets the
++// uid and gid to the supplied argument, in order to find out their
++// numeric value.  This can't be done in the main node process,
++// because otherwise npm would be running as that user.
++
++var exec = require("./exec.js")
++  , path = require("path")
++  , log = require("./log.js")
++  , constants = require("constants")
++  , npm = require("../npm.js")
++  , uidSupport = process.getuid && process.setuid
++  , uidCache = {}
++  , gidCache = {}
++
++function uidNumber (uid, gid, cb) {
++  if (!uidSupport || npm.config.get("unsafe-perm")) return cb()
++  if (typeof cb !== "function") cb = gid, gid = null
++  if (typeof cb !== "function") cb = uid, uid = null
++  if (gid == null) gid = process.getgid()
++  if (uid == null) uid = process.getuid()
++  if (!isNaN(gid)) gid = +gid
++  if (!isNaN(uid)) uid = +uid
++
++  if (uidCache[uid]) uid = uidCache[uid]
++  if (gidCache[gid]) gid = gidCache[gid]
++
++  if (typeof gid === "number" && typeof uid === "number") {
++    return cb(null, uid, gid)
++  }
++
++  var getter = path.join(__dirname, "..", "..", "bin", "npm-get-uid-gid.js")
++  return exec( process.execPath, [getter, uid, gid], process.env, false
++             , null, process.getuid(), process.getgid()
++             , function (er, code, out, err) {
++    if (er) return log.er(cb, "Could not get uid/gid "+err)(er)
++    log.silly(out, "output from getuid/gid")
++    out = JSON.parse(out+"")
++    if (out.error) {
++      if (!npm.config.get("unsafe-perm")) {
++        var er = new Error(out.error)
++        er.errno = out.errno
++        return cb(er)
++      } else {
++        return cb(null, +process.getuid(), +process.getgid())
++      }
++    }
++    if (isNaN(out.uid) || isNaN(out.gid)) return cb(new Error(
++      "Could not get uid/gid: "+JSON.stringify(out)))
++    uidCache[uid] = out.uid
++    uidCache[gid] = out.gid
++    cb(null, out.uid, out.gid)
++  })
++}
index febb56d73098ff971da4fbd3b5da9d1de4202ea8,febb56d73098ff971da4fbd3b5da9d1de4202ea8..f13d9e1b2e667237198c8e315171a5742e51924b
@@@ -63,6 -63,6 +63,6 @@@ function checkGit (data, cb) 
  }
  function write (data, cb) {
    fs.writeFile( path.join(process.cwd(), "package.json")
--              , new Buffer(JSON.stringify(data, null, 2) + "\n")
++              , new Buffer(JSON.stringify(data, null, 2))
                , cb )
  }
index 33a5d0df80fb4bc52c95251cffd451e02547b68a,33a5d0df80fb4bc52c95251cffd451e02547b68a..3e39f76de97674eb7e8288cff319645edc6e9a6d
@@@ -70,7 -70,7 +70,6 @@@ function view (args, silent, cb) 
      data.versions = Object.keys(data.versions).sort(semver.compare)
      if (!args.length) args = [""]
  
--    // remove readme unless we asked for it
      if (-1 === args.indexOf("readme")) {
        delete data.readme
      }
          delete versions[v]
        }
        if (semver.satisfies(v, version)) args.forEach(function (args) {
--        // remove readme unless we asked for it
--        if (-1 === args.indexOf("readme")) {
--          delete versions[v].readme
--        }
          results.push(showFields(data, versions[v], args))
        })
      })
index d3c019dab90a4102e6a135896c1f1b2e33960352,eaf6a41b840610f77c3bcdff0b280674a36ebf4f..a6c6243e171aea2d0a80a0282b047f25f675e400
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM" "1" "April 2012" "" ""
 -.TH "NPM" "1" "May 2012" "" ""
++.TH "NPM" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm\fR \-\- node package manager
index 082812cc585a5ea7464fe8d84c0dc31a09f7e220,63080da11eeb6d6cac18b0e4cbc566f9dc837bfa..301c95a3e0b847e435a13fffc2aaabca60c1a1d8
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-ADDUSER" "1" "April 2012" "" ""
 -.TH "NPM\-ADDUSER" "1" "May 2012" "" ""
++.TH "NPM\-ADDUSER" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-adduser\fR \-\- Add a registry user account
index 3f62258d169ba729fdb66258e60bce22e98a543d,ccb802aa352eaa590e887e64833682574f7822b9..6c3ff4a89e0f2a11603755cf22ef9db8f73ad20f
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BIN" "1" "April 2012" "" ""
 -.TH "NPM\-BIN" "1" "May 2012" "" ""
++.TH "NPM\-BIN" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-bin\fR \-\- Display npm bin folder
index 384384511fab012c03d2f140cac1aa092492bf44,1666c6437cce77555bfac7abdc27310eeab9bf11..55aeeb7efc911eebda794c23cce814231c413f8c
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BUGS" "1" "April 2012" "" ""
 -.TH "NPM\-BUGS" "1" "May 2012" "" ""
++.TH "NPM\-BUGS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
index 897781a480a5d22a053c77177a38884a69796dbe,1ddab40cb35f255a75fca26f5b4ef044626771c6..9c2d7bb18dfb73067e9d92bb8cf32c75c4de8f74
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BUILD" "1" "April 2012" "" ""
 -.TH "NPM\-BUILD" "1" "May 2012" "" ""
++.TH "NPM\-BUILD" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-build\fR \-\- Build a package
index 3fbe951c96d8ba825963db746b0457839d7a678d,5b5e4d2bf4e958f88b9a9e432b760d2e54a85d67..9a97ce95c5fe39d4ed3b0f7660ded3beb36a3db0
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BUNDLE" "1" "April 2012" "" ""
 -.TH "NPM\-BUNDLE" "1" "May 2012" "" ""
++.TH "NPM\-BUNDLE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-bundle\fR \-\- REMOVED
index 6168b5097e1581785a5429fcb7c85c44483a5d4c,6b828e7f2252889cd74ce31a9e9bc4c4438c0a2b..f4df1fa4b7bba3bfe39a23f1b3ce8f47bc75d04a
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-CACHE" "1" "April 2012" "" ""
 -.TH "NPM\-CACHE" "1" "May 2012" "" ""
++.TH "NPM\-CACHE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-cache\fR \-\- Manipulates packages cache
index d972a2955e9dc9791cf2aa9076269b492c713f8a,6cc8ff0c2289051901c301c492d389b14a486a36..a2112c86986fc461890a9d0a22058c2d3f64e54f
@@@ -1,95 -1,95 +1,13 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-CHANGELOG" "1" "April 2012" "" ""
 -.TH "NPM\-CHANGELOG" "1" "May 2012" "" ""
++.TH "NPM\-CHANGELOG" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-changelog\fR \-\- Changes
  .
  .SH "HISTORY"
  .
--.SS "1\.1\.3, 1\.1\.4"
--.
--.IP "\(bu" 4
--Update request to support HTTPS\-over\-HTTP proxy tunneling
--.
--.IP "\(bu" 4
--Throw on undefined envs in config settings
--.
--.IP "\(bu" 4
--Update which to 1\.0\.5
--.
--.IP "\(bu" 4
--Fix windows UNC busyloop in findPrefix
--.
--.IP "\(bu" 4
--Bundle nested bundleDependencies properly
--.
--.IP "\(bu" 4
--Alias adduser to add\-user
--.
--.IP "\(bu" 4
--Doc updates  (Christian Howe, Henrik Hodne, Andrew Lunny)
--.
--.IP "\(bu" 4
--ignore logfd/outfd streams in makeEnv() (Rod Vagg)
--.
--.IP "\(bu" 4
--shrinkwrap: Behave properly with url\-installed deps
--.
--.IP "\(bu" 4
--install: Support \-\-save with url install targets
--.
--.IP "\(bu" 4
--Support installing naked tars or single\-file modules from urls etc\.
--.
--.IP "\(bu" 4
--init: Don\'t add engines section
--.
--.IP "\(bu" 4
--Don\'t run make clean on rebuild
--.
--.IP "\(bu" 4
--Added missing unicode replacement (atomizer)
--.
--.IP "" 0
--.
--.SS "1\.1\.2"
--Dave Pacheco (2):
--      add "npm shrinkwrap"
--.
--.P
--Martin Cooper (1):
--      Fix #1753 Make a copy of the cached objects we\'ll modify\.
--.
--.P
--Tim Oxley (1):
--      correctly remove readme from default npm view command\.
--.
--.P
--Tyler Green (1):
--      fix #2187 set terminal columns to Infinity if 0
--.
--.P
--isaacs (19):
--      update minimatch
--      update request
--      Experimental: single\-file modules
--      Fix #2172 Don\'t remove global mans uninstalling local pkgs
--      Add \-\-versions flag to show the version of node as well
--      Support \-\-json flag for ls output
--      update request to 2\.9\.151
--.
--.SS "1\.1"
--.
--.IP "\(bu" 4
--Replace system tar dependency with a JS tar
--.
--.IP "\(bu" 4
--Continue to refine
--.
--.IP "" 0
--.
  .SS "1\.0"
  .
  .IP "\(bu" 4
index 8d5c60b3d05193661f3479a02cdde6e0289acc51,cb0f5abd21eee34966d511a7f5d05d75e33319af..2f63d8c005e58ac1b756d9ecee7914c115378836
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-CODING\-STYLE" "1" "April 2012" "" ""
 -.TH "NPM\-CODING\-STYLE" "1" "May 2012" "" ""
++.TH "NPM\-CODING\-STYLE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-coding-style\fR \-\- npm\'s "funny" coding style
@@@ -99,10 -99,10 +99,10 @@@ null loops like: \fBwhile (something) ;
  reason for doing that\.)
  .
  .IP "\(bu" 4
--\fBcase "foo": doSomething(); break\fR
++case "foo": doSomething(); break
  .
  .IP "\(bu" 4
--In front of a leading \fB(\fR or \fB[\fR at the start of the line\.
++In front of a leading ( or [ at the start of the line\.
  This prevents the expression from being interpreted
  as a function call or property access, respectively\.
  .
index 3f458933337c4c79636d6228c2e554ad8ca9b360,c593694faf3d2b1f5e2f04bdf990a5e15269cdd5..db423418c473277c2f121070b1a942790179c806
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-COMPLETION" "1" "April 2012" "" ""
 -.TH "NPM\-COMPLETION" "1" "May 2012" "" ""
++.TH "NPM\-COMPLETION" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-completion\fR \-\- Tab Completion for npm
index 65e09d0c46def5c5dc37e7ff3fcc946d4c15efd8,1407b2b724ee5fb7718d3c36ee5a040b03a39996..2e38c0f6f1ef1d219c7c254fb55e3fd0c354abca
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-CONFIG" "1" "April 2012" "" ""
 -.TH "NPM\-CONFIG" "1" "May 2012" "" ""
++.TH "NPM\-CONFIG" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-config\fR \-\- Manage the npm configuration file
@@@ -171,12 -171,12 +171,6 @@@ The following shorthands are parsed on 
  \fB\-S\fR: \fB\-\-save\fR
  .
  .IP "\(bu" 4
--\fB\-D\fR: \fB\-\-save\-dev\fR
--.
--.IP "\(bu" 4
--\fB\-O\fR: \fB\-\-save\-optional\fR
--.
--.IP "\(bu" 4
  \fB\-y\fR: \fB\-\-yes\fR
  .
  .IP "\(bu" 4
@@@ -363,42 -363,42 +357,6 @@@ Type: pat
  .P
  The location of npm\'s cache directory\.  See \fBnpm help cache\fR
  .
--.SS "cache\-max"
--.
--.IP "\(bu" 4
--Default: Infinity
--.
--.IP "\(bu" 4
--Type: Number
--.
--.IP "" 0
--.
--.P
--The maximum time (in seconds) to keep items in the registry cache before
--re\-checking against the registry\.
--.
--.P
--Note that no purging is done unless the \fBnpm cache clean\fR command is
--explicitly used, and that only GET requests use the cache\.
--.
--.SS "cache\-min"
--.
--.IP "\(bu" 4
--Default: 0
--.
--.IP "\(bu" 4
--Type: Number
--.
--.IP "" 0
--.
--.P
--The minimum time (in seconds) to keep items in the registry cache before
--re\-checking against the registry\.
--.
--.P
--Note that no purging is done unless the \fBnpm cache clean\fR command is
--explicitly used, and that only GET requests use the cache\.
--.
  .SS "color"
  .
  .IP "\(bu" 4
@@@ -609,19 -609,19 +567,6 @@@ Type: ur
  .P
  A proxy to use for outgoing https requests\.
  .
--.SS "user\-agent"
--.
--.IP "\(bu" 4
--Default: npm/{npm\.version} node/{process\.version}
--.
--.IP "\(bu" 4
--Type: String
--.
--.IP "" 0
--.
--.P
--Sets a User\-Agent to the request header
--.
  .SS "ignore"
  .
  .IP "\(bu" 4
@@@ -652,7 -652,7 +597,7 @@@ The value \fBnpm init\fR should use by 
  .SS "init\.author\.name"
  .
  .IP "\(bu" 4
--Default: ""
++Default: "0\.0\.0"
  .
  .IP "\(bu" 4
  Type: String
@@@ -688,24 -688,24 +633,6 @@@ Type: Strin
  .P
  The value \fBnpm init\fR should use by default for the package author\'s homepage\.
  .
--.SS "json"
--.
--.IP "\(bu" 4
--Default: false
--.
--.IP "\(bu" 4
--Type: Boolean
--.
--.IP "" 0
--.
--.P
--Whether or not to output JSON data, rather than the normal output\.
--.
--.P
--This feature is currently experimental, and the output data structures
--for many commands is either not implemented in JSON yet, or subject to
--change\.  Only the output from \fBnpm ls \-\-json\fR is currently valid\.
--.
  .SS "link"
  .
  .IP "\(bu" 4
@@@ -1013,38 -1013,38 +940,6 @@@ Save installed packages to a package\.j
  .P
  Only works if there is already a package\.json file present\.
  .
--.SS "save\-dev"
--.
--.IP "\(bu" 4
--Default: false
--.
--.IP "\(bu" 4
--Type: Boolean
--.
--.IP "" 0
--.
--.P
--Save installed packages to a package\.json file as devDependencies\.
--.
--.P
--Only works if there is already a package\.json file present\.
--.
--.SS "save\-optional"
--.
--.IP "\(bu" 4
--Default: false
--.
--.IP "\(bu" 4
--Type: Boolean
--.
--.IP "" 0
--.
--.P
--Save installed packages to a package\.json file as optionalDependencies\.
--.
--.P
--Only works if there is already a package\.json file present\.
--.
  .SS "searchopts"
  .
  .IP "\(bu" 4
@@@ -1286,23 -1286,23 +1181,6 @@@ If true, output the npm version and exi
  .P
  Only relevant when specified explicitly on the command line\.
  .
--.SS "versions"
--.
--.IP "\(bu" 4
--Default: false
--.
--.IP "\(bu" 4
--Type: boolean
--.
--.IP "" 0
--.
--.P
--If true, output the npm version as well as node\'s \fBprocess\.versions\fR
--hash, and exit successfully\.
--.
--.P
--Only relevant when specified explicitly on the command line\.
--.
  .SS "viewer"
  .
  .IP "\(bu" 4
index 918fd232439e68251be34f42a736998a25e7573b,08999d714e530c2d743e36adb0d4a0776d17264b..f0ba00bd2b75a89a39a78fe833d44e4a7c773db7
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DEPRECATE" "1" "April 2012" "" ""
 -.TH "NPM\-DEPRECATE" "1" "May 2012" "" ""
++.TH "NPM\-DEPRECATE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-deprecate\fR \-\- Deprecate a version of a package
index 9d2e759417279821b8f836a14054fa73beefa06b,669e7a40be387992b0d34c4701d84fb6178d5276..61e16edb6a35ec38cff2ffd0afba6e8667788ee4
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DEVELOPERS" "1" "April 2012" "" ""
 -.TH "NPM\-DEVELOPERS" "1" "May 2012" "" ""
++.TH "NPM\-DEVELOPERS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-developers\fR \-\- Developer Guide
@@@ -43,9 -43,9 +43,6 @@@ e) a \fB<name>@<tag>\fR that points to 
  .IP "\(bu" 4
  f) a \fB<name>\fR that has a "latest" tag satisfying (e)
  .
--.IP "\(bu" 4
--g) a \fBgit\fR url that, when cloned, results in (a)\.
--.
  .IP "" 0
  .
  .P
@@@ -54,25 -54,25 +51,6 @@@ benefits of using npm if you just want 
  perhaps if you also want to be able to easily install it elsewhere
  after packing it up into a tarball (b)\.
  .
--.P
--Git urls can be of the form:
--.
--.IP "" 4
--.
--.nf
--git://github\.com/user/project\.git#commit\-ish
--git+ssh://user@hostname:project\.git#commit\-ish
--git+http://user@hostname/project/blah\.git#commit\-ish
--git+https://user@hostname/project/blah\.git#commit\-ish
--.
--.fi
--.
--.IP "" 0
--.
--.P
--The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as
--an argument to \fBgit checkout\fR\|\.  The default is \fBmaster\fR\|\.
--.
  .SH "The package\.json File"
  You need to have a \fBpackage\.json\fR file in the root of your project to do
  much of anything with npm\.  That is basically the whole interface\.
index b74865f10659b9a9e362e2d8ce31707648790d95,e92893ac8369c0305fc8f9651b85c28c76ff15db..df52c524533edcd08ea849e13b464548f1bcc54e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DISPUTES" "1" "April 2012" "" ""
 -.TH "NPM\-DISPUTES" "1" "May 2012" "" ""
++.TH "NPM\-DISPUTES" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-disputes\fR \-\- Handling Module Name Disputes
index 00fa3915381c92bfe75a667620f2224cb9d670e1,57bbf61fdc3fc913727b0ede5ef6067bf7566ce5..7432cadde378e503df0bcf0115cf075daadafc95
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DOCS" "1" "April 2012" "" ""
 -.TH "NPM\-DOCS" "1" "May 2012" "" ""
++.TH "NPM\-DOCS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
index 742353d9a169be29a6b5bc094ea62e2b605d5d48,0c6db9d33d968d0a4c9d2669c5de2ce28e9ed584..56cffbb607f5c4d6aa72dd2541dc5b794c752bfa
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-EDIT" "1" "April 2012" "" ""
 -.TH "NPM\-EDIT" "1" "May 2012" "" ""
++.TH "NPM\-EDIT" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-edit\fR \-\- Edit an installed package
index 8b24eea66a73d057454ebc3808d8615fafdf3140,e6b5561ea72f505bcd6c4d5f5d534d01e2681012..06be08b6d42a275bf19e40d9c3de40461f03408e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-EXPLORE" "1" "April 2012" "" ""
 -.TH "NPM\-EXPLORE" "1" "May 2012" "" ""
++.TH "NPM\-EXPLORE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-explore\fR \-\- Browse an installed package
index 1d68c0496ac05a6113af2af639291f34dfc3f40b,1342f06d088306d05476eb715c296eec9889c342..0f8857ab109c821fa1a0b9fad2bc3fcff471ab74
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-FAQ" "1" "April 2012" "" ""
 -.TH "NPM\-FAQ" "1" "May 2012" "" ""
++.TH "NPM\-FAQ" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-faq\fR \-\- Frequently Asked Questions
index bebd033edcb82e61d642e20f192b40a6028acdfb,b4d5d29e2d2ac5e5294df8f8839a1dc3fe89f883..394f72d5cb77fc8eeeb400d02dd9945286ea64d2
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-FOLDERS" "1" "April 2012" "" ""
 -.TH "NPM\-FOLDERS" "1" "May 2012" "" ""
++.TH "NPM\-FOLDERS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-folders\fR \-\- Folder Structures Used by npm
index da5889bc8c6b3f0cf3fa0c1693f3b42a9fea8d76,c09538600c18e636f102c4edf6ecdd665d454750..b2959ab0e101bc57ab695e431e50bf997d147e5d
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-HELP\-SEARCH" "1" "April 2012" "" ""
 -.TH "NPM\-HELP\-SEARCH" "1" "May 2012" "" ""
++.TH "NPM\-HELP\-SEARCH" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-help-search\fR \-\- Search npm help documentation
index 247122183d38a42d60d63b51e4970653f10c7ade,b5872167899e55520a67bc35f17b4c57d916ec8f..5032a59f0b3fe1785aa6a4e3ba667bf3bb2de5d9
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-HELP" "1" "April 2012" "" ""
 -.TH "NPM\-HELP" "1" "May 2012" "" ""
++.TH "NPM\-HELP" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-help\fR \-\- Get help on npm
index 419652ced1d814b833df9f67766168c749e3dd2a,4b3c55ae1175c6666aa5001da478f4f5ba933c95..43265769c31b5207dcfa27008512ed52e2982aa0
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-INDEX" "1" "April 2012" "" ""
 -.TH "NPM\-INDEX" "1" "May 2012" "" ""
++.TH "NPM\-INDEX" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-index\fR \-\- Index of all npm documentation
  .SH "npm help semver"
   The semantic versioner for npm
  .
--.SH "npm help shrinkwrap"
-- Lock down dependency versions
--.
  .SH "npm help star"
   Mark your favorite packages
  .
  .SH "npm apihelp search"
   Search for packages
  .
--.SH "npm apihelp shrinkwrap"
-- programmatically generate package shrinkwrap file
--.
  .SH "npm apihelp start"
   Start a package
  .
index ff4d537cb285ce6f7f7efbffbc81c21bd5f9b849,71690aa16c20d9bdf279ee12b24fd0fa2e4e071b..1ab75cbcc091432152013301d0e92f19727d9cf5
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-INIT" "1" "April 2012" "" ""
 -.TH "NPM\-INIT" "1" "May 2012" "" ""
++.TH "NPM\-INIT" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-init\fR \-\- Interactively create a package\.json file
index a9d8431516de921f68e7e575a2b2eba9ca4103e1,9ab56a4a8e645dbcf8ead7fb3e81e036743fca2c..651ee1730755df9beefbb28ce9e369c572b78286
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-INSTALL" "1" "April 2012" "" ""
 -.TH "NPM\-INSTALL" "1" "May 2012" "" ""
++.TH "NPM\-INSTALL" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-install\fR \-\- Install a package
@@@ -13,18 -13,18 +13,15 @@@ npm install (with no args in a package 
  npm install <tarball file>
  npm install <tarball url>
  npm install <folder>
--npm install <name> [\-\-save|\-\-save\-dev|\-\-save\-optional]
++npm install <name>
  npm install <name>@<tag>
  npm install <name>@<version>
  npm install <name>@<version range>
--npm install <name>@<version range>
  .
  .fi
  .
  .SH "DESCRIPTION"
--This command installs a package, and any packages that it depends on\. If the
--package has a shrinkwrap file, the installation of dependencies will be driven
--by that\. See npm help shrinkwrap\.
++This command installs a package, and any packages that it depends on\.
  .
  .P
  A \fBpackage\fR is:
@@@ -60,8 -60,8 +57,6 @@@ after packing it up into a tarball (b)\
  .
  .IP "\(bu" 4
  \fBnpm install\fR (in package directory, no arguments):
--.
--.IP
  Install the dependencies in the local node_modules folder\.
  .
  .IP
@@@ -71,14 -71,14 +66,10 @@@ directory) as a global package\
  .
  .IP "\(bu" 4
  \fBnpm install <folder>\fR:
--.
--.IP
  Install a package that is sitting in a folder on the filesystem\.
  .
  .IP "\(bu" 4
  \fBnpm install <tarball file>\fR:
--.
--.IP
  Install a package that is sitting on the filesystem\.  Note: if you just want
  to link a dev directory into your npm root, you can do this more easily by
  using \fBnpm link\fR\|\.
@@@ -89,7 -89,7 +80,7 @@@ Example
  .IP "" 4
  .
  .nf
--  npm install \./package\.tgz
++npm install \./package\.tgz
  .
  .fi
  .
@@@ -98,8 -98,8 +89,6 @@@
  .
  .IP "\(bu" 4
  \fBnpm install <tarball url>\fR:
--.
--.IP
  Fetch the tarball url, and then install it\.  In order to distinguish between
  this and other options, the argument must start with "http://" or "https://"
  .
@@@ -109,7 -109,7 +98,7 @@@ Example
  .IP "" 4
  .
  .nf
--  npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6
++npm install https://github\.com/indexzero/forever/tarball/v0\.5\.6
  .
  .fi
  .
  
  .
  .IP "\(bu" 4
--\fBnpm install <name> [\-\-save|\-\-save\-dev|\-\-save\-optional]\fR:
--.
--.IP
--Do a \fB<name>@<tag>\fR install, where \fB<tag>\fR is the "tag" config\. (See \fBnpm help config\fR\|\.)
--.
--.IP
--In most cases, this will install the latest version
--of the module published on npm\.
++\fBnpm install <name>\fR:
++Do a \fB<name>@<tag>\fR install, where \fB<tag>\fR is the "tag" config\. (See \fBnpm help config\fR)
  .
  .IP
  Example:
  .
--.IP
--      npm install sax
--.
--.IP
--\fBnpm install\fR takes 3 exclusive, optional flags which save or update
--the package version in your main package\.json:
--.
--.IP "\(bu" 4
--\fB\-\-save\fR: Package will appear in your \fBdependencies\fR\|\.
--.
--.IP "\(bu" 4
--\fB\-\-save\-dev\fR: Package will appear in your \fBdevDependencies\fR\|\.
++.IP "" 4
  .
--.IP "\(bu" 4
--\fB\-\-save\-optional\fR: Package will appear in your \fBoptionalDependencies\fR\|\.
++.nf
++npm install sax
  .
--.IP
--Examples:
++.fi
  .
--.IP
--  npm install sax \-\-save
--  npm install node\-tap \-\-save\-dev
--  npm install dtrace\-provider \-\-save\-optional
++.IP "" 0
  .
  .IP
  \fBNote\fR: If there is a file or folder named \fB<name>\fR in the current
  working directory, then it will try to install that, and only try to
  fetch the package by name if it is not valid\.
--.
--.IP "" 0
--
  .
  .IP "\(bu" 4
  \fBnpm install <name>@<tag>\fR:
--.
--.IP
  Install the version of the package that is referenced by the specified tag\.
  If the tag does not exist in the registry data for that package, then this
  will fail\.
@@@ -175,7 -175,7 +138,7 @@@ Example
  .IP "" 4
  .
  .nf
--  npm install sax@latest
++npm install sax@latest
  .
  .fi
  .
  .
  .IP "\(bu" 4
  \fBnpm install <name>@<version>\fR:
--.
--.IP
  Install the specified version of the package\.  This will fail if the version
  has not been published to the registry\.
  .
@@@ -195,7 -195,7 +156,7 @@@ Example
  .IP "" 4
  .
  .nf
--  npm install sax@0\.1\.1
++npm install sax@0\.1\.1
  .
  .fi
  .
  .
  .IP "\(bu" 4
  \fBnpm install <name>@<version range>\fR:
--.
--.IP
  Install a version of the package matching the specified version range\.  This
  will follow the same rules for resolving dependencies described in \fBnpm help json\fR\|\.
  .
@@@ -216,8 -216,8 +175,15 @@@ treat it as a single argument\
  .IP
  Example:
  .
--.IP
--      npm install sax@">=0\.1\.0 <0\.2\.0"
++.IP "" 4
++.
++.nf
++npm install sax@">=0\.1\.0 <0\.2\.0"
++.
++.fi
++.
++.IP "" 0
++
  .
  .IP "\(bu" 4
  \fBnpm install <git remote url>\fR:
  Install a package by cloning a git remote url\.  The format of the git
  url is:
  .
--.IP
--      <protocol>://[<user>@]<hostname><separator><path>[#<commit\-ish>]
++.IP "" 4
++.
++.nf
++<protocol>://[<user>@]<hostname><separator><path>[#<commit\-ish>]
++.
++.fi
++.
++.IP "" 0
  .
  .IP
  \fB<protocol>\fR is one of \fBgit\fR, \fBgit+ssh\fR, \fBgit+http\fR, or \fBgit+https\fR\|\.  If no \fB<commit\-ish>\fR is specified, then \fBmaster\fR is
@@@ -239,9 -239,9 +211,9 @@@ Examples
  .IP "" 4
  .
  .nf
--  git+ssh://git@github\.com:isaacs/npm\.git#v1\.0\.27
--  git+https://isaacs@github\.com/isaacs/npm\.git
--  git://github\.com/isaacs/npm\.git#v1\.0\.27
++git+ssh://git@github\.com:isaacs/npm\.git#v1\.0\.27
++git+https://isaacs@github\.com/isaacs/npm\.git
++git://github\.com/isaacs/npm\.git#v1\.0\.27
  .
  .fi
  .
@@@ -398,8 -398,8 +370,5 @@@ npm help ta
  .IP "\(bu" 4
  npm help rm
  .
--.IP "\(bu" 4
--npm help shrinkwrap
--.
  .IP "" 0
  
index a2384ac33ed65ab9ce83792a5c7a0a8edeee01d3,25690428df91f4d906c2ead04a4c03b8fb287c58..73087c042c1cc17f9fb17bc9d48553b4087ad788
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-JSON" "1" "April 2012" "" ""
 -.TH "NPM\-JSON" "1" "May 2012" "" ""
++.TH "NPM\-JSON" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-json\fR \-\- Specifics of npm\'s package\.json handling
@@@ -466,9 -466,9 +466,6 @@@ is a semver compatible version identifi
  .IP "\(bu" 4
  \fBrange1 || range2\fR Passes if either range1 or range2 are satisfied\.
  .
--.IP "\(bu" 4
--\fBgit\.\.\.\fR See \'Git URLs as Dependencies\' below
--.
  .IP "" 0
  .
  .P
@@@ -557,25 -557,25 +554,6 @@@ of a version range\
  This tarball will be downloaded and installed locally to your package at
  install time\.
  .
--.SS "Git URLs as Dependencies"
--Git urls can be of the form:
--.
--.IP "" 4
--.
--.nf
--git://github\.com/user/project\.git#commit\-ish
--git+ssh://user@hostname:project\.git#commit\-ish
--git+http://user@hostname/project/blah\.git#commit\-ish
--git+https://user@hostname/project/blah\.git#commit\-ish
--.
--.fi
--.
--.IP "" 0
--.
--.P
--The \fBcommit\-ish\fR can be any tag, sha, or branch which can be supplied as
--an argument to \fBgit checkout\fR\|\.  The default is \fBmaster\fR\|\.
--.
  .SH "devDependencies"
  If someone is planning on downloading and using your module in their
  program, then they probably don\'t want or need to download and build
@@@ -631,67 -631,67 +609,6 @@@ are capable of properly installing you
  .
  .IP "" 0
  .
--.SH "os"
--You can specify which operating systems your
--module will run on:
--.
--.IP "" 4
--.
--.nf
--"os" : [ "darwin", "linux" ]
--.
--.fi
--.
--.IP "" 0
--.
--.P
--You can also blacklist instead of whitelist operating systems,
--just prepend the blacklisted os with a \'!\':
--.
--.IP "" 4
--.
--.nf
--"os" : [ "!win32" ]
--.
--.fi
--.
--.IP "" 0
--.
--.P
--The host operating system is determined by \fBprocess\.platform\fR
--.
--.P
--It is allowed to both blacklist, and whitelist, although there isn\'t any
--good reason to do this\.
--.
--.SH "cpu"
--If your code only runs on certain cpu architectures,
--you can specify which ones\.
--.
--.IP "" 4
--.
--.nf
--"cpu" : [ "x64", "ia32" ]
--.
--.fi
--.
--.IP "" 0
--.
--.P
--Like the \fBos\fR option, you can also blacklist architectures:
--.
--.IP "" 4
--.
--.nf
--"cpu" : [ "!arm", "!mips" ]
--.
--.fi
--.
--.IP "" 0
--.
--.P
--The host architecture is determined by \fBprocess\.arch\fR
--.
  .SH "preferGlobal"
  If your package is primarily a command\-line application that should be
  installed globally, then set this value to \fBtrue\fR to provide a warning
@@@ -708,7 -708,7 +625,7 @@@ to publish it\
  .P
  This is a way to prevent accidental publication of private repositories\.
  If you would like to ensure that a given package is only ever published
--to a specific registry (for example, an internal registry),
++to a speciic registry (for example, an internal registry),
  then use the \fBpublishConfig\fR hash described below
  to override the \fBregistry\fR config param at publish\-time\.
  .
index 1e4ac176f68113162d1aa257d1e485ee8029ca10,5f65c871401d50edd70cd0eab3eace11408d7b6d..83d73a55dc4e1d9e617bdf8965713566b3020413
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-LINK" "1" "April 2012" "" ""
 -.TH "NPM\-LINK" "1" "May 2012" "" ""
++.TH "NPM\-LINK" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-link\fR \-\- Symlink a package folder
index a629f7eef611cbdc2d41916e65d2d92f5188e898,763af1e27d66135a012636322412da8f9f33fdff..95c6362388d7f318edef80445e8cf132ef73a86d
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-LS" "1" "April 2012" "" ""
 -.TH "NPM\-LS" "1" "May 2012" "" ""
++.TH "NPM\-LS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-ls\fR \-\- List installed packages
@@@ -32,19 -32,19 +32,6 @@@ When run as \fBll\fR or \fBla\fR, it sh
  .
  .SH "CONFIGURATION"
  .
--.SS "json"
--.
--.IP "\(bu" 4
--Default: false
--.
--.IP "\(bu" 4
--Type: Boolean
--.
--.IP "" 0
--.
--.P
--Show information in JSON format\.
--.
  .SS "long"
  .
  .IP "\(bu" 4
index b85b940b2c7a234fd5402aaa82152775e554ca30,f2589dc1268cc074ed29b47c5ff96c7f8abf2f11..7d606a7c9a7bc26ee6eea1b632dd4f6502ac4539
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM" "1" "April 2012" "" ""
 -.TH "NPM" "1" "May 2012" "" ""
++.TH "NPM" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm\fR \-\- node package manager
@@@ -14,7 -14,7 +14,7 @@@ npm <command> [args
  .fi
  .
  .SH "VERSION"
- 1.1.18
 -1.1.21
++1.1.0-2
  .
  .SH "DESCRIPTION"
  npm is the package manager for the Node JavaScript platform\.  It puts
index a30dce9a19bd3bf92450f9bec53e5689dd9f4223,cb27b8cd26f0e8b47bf8dcd389225084ad331350..658d31106e86ceb549cc649e888db69f56116005
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-OUTDATED" "1" "April 2012" "" ""
 -.TH "NPM\-OUTDATED" "1" "May 2012" "" ""
++.TH "NPM\-OUTDATED" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-outdated\fR \-\- Check for outdated packages
index b91d382314b65e7bdd7a6bd66aa6aec98c8b9188,6ba46a11895ebcebf80f2afa4a419265ed50bb4e..719fd6633a6db4d286fabdb24a5bb3bb47fd6fc4
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-OWNER" "1" "April 2012" "" ""
 -.TH "NPM\-OWNER" "1" "May 2012" "" ""
++.TH "NPM\-OWNER" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-owner\fR \-\- Manage package owners
index 56eb667a8416a92cef627d68309cbccaaf55c33e,54fb1c11c9b553563a448aeff6c17cf79b11017e..578659d74d61e98cf88aa9f7ff628edf3abf61bd
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PACK" "1" "April 2012" "" ""
 -.TH "NPM\-PACK" "1" "May 2012" "" ""
++.TH "NPM\-PACK" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-pack\fR \-\- Create a tarball from a package
index 6284d683c31bd2f040f283f88dea5c5ea6b3b220,26e52d8cbbb4044f2e330606d8dcf88005870a99..235daa52b8135dc84b0085d963e3814d56c4d389
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PREFIX" "1" "April 2012" "" ""
 -.TH "NPM\-PREFIX" "1" "May 2012" "" ""
++.TH "NPM\-PREFIX" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-prefix\fR \-\- Display prefix
index 53fa1aebab547b9759a6ab036b6aa6b4e3891125,5d1aecbc99f94100670188f126da99706d7c162d..25c1abfdfca41c50a1f81b5407b0d10ef363b6e0
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PRUNE" "1" "April 2012" "" ""
 -.TH "NPM\-PRUNE" "1" "May 2012" "" ""
++.TH "NPM\-PRUNE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-prune\fR \-\- Remove extraneous packages
index ef16486f5436aa1f3b5bdd46e99c5aec2b0b9968,8ec2a1ed4dad347aa374c418ad4b6e8ad72918cf..51bc9495bb3b58a6985ee3358f290275a1bc4e03
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PUBLISH" "1" "April 2012" "" ""
 -.TH "NPM\-PUBLISH" "1" "May 2012" "" ""
++.TH "NPM\-PUBLISH" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-publish\fR \-\- Publish a package
index 4824951c494f5aabd2d5dd849fc769fa5cdbca61,b630729a72e61f779161ab1140f3b895bcc6f5e4..8836b1b9b2e195bddc1c8dda0456958a187ef998
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-REBUILD" "1" "April 2012" "" ""
 -.TH "NPM\-REBUILD" "1" "May 2012" "" ""
++.TH "NPM\-REBUILD" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-rebuild\fR \-\- Rebuild a package
index 757cd474870dbf94ce687450c2a523cdcb21fccf,187a946ac581a6bc0f643dfb20df13afc4db1510..e5b552eeecf2b6276fc0c1458cedfa45427dbf48
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-REGISTRY" "1" "April 2012" "" ""
 -.TH "NPM\-REGISTRY" "1" "May 2012" "" ""
++.TH "NPM\-REGISTRY" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-registry\fR \-\- The JavaScript Package Registry
index ff8412a9e9cf6f3964aaca1c22305e70696af673,601086cb937f40c563c894e81e4b92bd11c4b009..b8e7242517695d53ebecaacde42fe81f55b8c13c
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-REMOVAL" "1" "April 2012" "" ""
 -.TH "NPM\-REMOVAL" "1" "May 2012" "" ""
++.TH "NPM\-REMOVAL" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-removal\fR \-\- Cleaning the Slate
index 804593c5c487835eceb33513b407a0c067398e28,d74dc9283c530766f259d1ecf46965244e037857..a5fc7863e4a5529ba58621cc0ba29db209258a9e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-RESTART" "1" "April 2012" "" ""
 -.TH "NPM\-RESTART" "1" "May 2012" "" ""
++.TH "NPM\-RESTART" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-restart\fR \-\- Start a package
index 25ba27e7af65a1a42aa933d89c597d5d60f78abf,539a6d424a3a80a279192499eccfa5896a072861..6f0f8c051830469d25b0054a7de417045f193366
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-ROOT" "1" "April 2012" "" ""
 -.TH "NPM\-ROOT" "1" "May 2012" "" ""
++.TH "NPM\-ROOT" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-root\fR \-\- Display npm root
index 041b7018e60b09ec7facaade484572fdef4ee175,ec01fd3f4894c5fd5a77ec95a2d775e275ff41bb..1561bb9be906775b563b0fd4e4f45939b99ed779
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-RUN\-SCRIPT" "1" "April 2012" "" ""
 -.TH "NPM\-RUN\-SCRIPT" "1" "May 2012" "" ""
++.TH "NPM\-RUN\-SCRIPT" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-run-script\fR \-\- Run arbitrary package scripts
index 4f0b385167c838a4aaf47ebf78741899b01a7797,5216862aace8b48f1c72ea138c428eaf5df00ada..ff949bade4cd3f8ffcbdba377b100d6b0ff5ffe6
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SCRIPTS" "1" "April 2012" "" ""
 -.TH "NPM\-SCRIPTS" "1" "May 2012" "" ""
++.TH "NPM\-SCRIPTS" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-scripts\fR \-\- How npm handles the "scripts" field
@@@ -94,26 -94,26 +94,6 @@@ Package scripts run in an environment w
  made available regarding the setup of npm and the current state of the
  process\.
  .
--.SS "path"
--If you depend on modules that define executable scripts, like test suites,
--then those executables will be added to the \fBPATH\fR for executing the scripts\.
--So, if your package\.json has this:
--.
--.IP "" 4
--.
--.nf
--{ "name" : "foo"
--, "dependencies" : { "bar" : "0\.1\.x" }
--, "scripts": { "start" : "bar \./test" } }
--.
--.fi
--.
--.IP "" 0
--.
--.P
--then you could run \fBnpm start\fR to execute the \fBbar\fR script, which is exported
--into the \fBnode_modules/\.bin\fR directory on \fBnpm install\fR\|\.
--.
  .SS "package\.json vars"
  The package\.json fields are tacked onto the \fBnpm_package_\fR prefix\. So, for
  instance, if you had \fB{"name":"foo", "version":"1\.2\.5"}\fR in your package\.json
index c2015ed6f2ce1e0cb648fe912117baab55ae2c20,e57b30279f49f7554ef73d53c5210603f9e1222b..52a77841ac450c8454028e79734822646cf37c0e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SEARCH" "1" "April 2012" "" ""
 -.TH "NPM\-SEARCH" "1" "May 2012" "" ""
++.TH "NPM\-SEARCH" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-search\fR \-\- Search for packages
index 6cb1be072ddfd9b927a0ee89270be76161c4175e,9cb0ba28bfe9bafcaef97a280a93df910e64306a..892b03366b457ca76c21bf1cdd7ba78f060e33a3
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SEMVER" "1" "April 2012" "" ""
 -.TH "NPM\-SEMVER" "1" "May 2012" "" ""
++.TH "NPM\-SEMVER" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-semver\fR \-\- The semantic versioner for npm
index 9dd32b7fb59836f79abe2de911c91dfc6434fc8c,9f6f976899f8bc36f380ae6b51d1aa2c2f20e0b2..3a43c8c12db2898f6e10ed9970bb3bd389c047de
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-STAR" "1" "April 2012" "" ""
 -.TH "NPM\-STAR" "1" "May 2012" "" ""
++.TH "NPM\-STAR" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-star\fR \-\- Mark your favorite packages
index 83b07510052a26ed0f887f0ae3c05449f6c7f580,309404f33cb8b2047ea022118e4d271a790e5756..acc0fc465ba489875120baf8b30f8568b44285e6
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-START" "1" "April 2012" "" ""
 -.TH "NPM\-START" "1" "May 2012" "" ""
++.TH "NPM\-START" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-start\fR \-\- Start a package
index aace69a70869208bfa6c2e31e219411aabbe822f,182874f5f4b35c91968261c34caf10687a728f38..96d71ef986456c189445825af5c53ec8337c645b
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-STOP" "1" "April 2012" "" ""
 -.TH "NPM\-STOP" "1" "May 2012" "" ""
++.TH "NPM\-STOP" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-stop\fR \-\- Stop a package
index 26a1bd3503b68ec92969c9634d9aad40ce9d3392,7458a04ca9b336a14d06e3029d55d7dcd3e733cf..831a11f33f4711a387599a3ea80318f217c21ad0
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SUBMODULE" "1" "April 2012" "" ""
 -.TH "NPM\-SUBMODULE" "1" "May 2012" "" ""
++.TH "NPM\-SUBMODULE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-submodule\fR \-\- Add a package as a git submodule
index 48e23d4d165aab4806f1d0cf0758f189b4e5a4c7,ad1ba7c400ccf892f6172561887aab62c48247cb..b0573216c194079708d85548c2f191aafb1d59af
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-TAG" "1" "April 2012" "" ""
 -.TH "NPM\-TAG" "1" "May 2012" "" ""
++.TH "NPM\-TAG" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-tag\fR \-\- Tag a published version
index c09f456dd0e9dd0397e951d9f00370c645396cff,013a54b2ebc979a59a030adedecd37322e313fa5..1fc73a40853e724c1217582883e4d7c038a7a071
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-TEST" "1" "April 2012" "" ""
 -.TH "NPM\-TEST" "1" "May 2012" "" ""
++.TH "NPM\-TEST" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-test\fR \-\- Test a package
index d779b0bf4cd8606edee9094c9eb0dca2b84edff6,13ba2140941e6565d3ee014b59fa5229b0144f31..dd96d1725c950333a8f043df5ee7d8d80ad38d12
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-RM" "1" "April 2012" "" ""
 -.TH "NPM\-RM" "1" "May 2012" "" ""
++.TH "NPM\-RM" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-rm\fR \-\- Remove a package
index 4a7b96e89aebaef837568cfdce160f8e11b68aa1,309ff03aad16b352fffab4ae32781efe3b341f9a..22b93d141e5f0b7b6f7d78e497d17c63babd2b95
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-UNPUBLISH" "1" "April 2012" "" ""
 -.TH "NPM\-UNPUBLISH" "1" "May 2012" "" ""
++.TH "NPM\-UNPUBLISH" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-unpublish\fR \-\- Remove a package from the registry
index bdb703633ef89b35b5bd5eaebbd05a5a8686f081,758b8d1a738a9e09d0c84653a288e125671ac399..73cccbe4b43ac7d225064e940f48c922b674f7c4
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-UPDATE" "1" "April 2012" "" ""
 -.TH "NPM\-UPDATE" "1" "May 2012" "" ""
++.TH "NPM\-UPDATE" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-update\fR \-\- Update a package
index 80acf696f909a2d6fe488dd72fd2fdeb25392c94,b611ad66b7c83d07e330cb16fbfd4b351cd375cf..bc6275121d6dbd401093ef09a8458e3d112471ed
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-VERSION" "1" "April 2012" "" ""
 -.TH "NPM\-VERSION" "1" "May 2012" "" ""
++.TH "NPM\-VERSION" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-version\fR \-\- Bump a package version
index 0ecd6da51fd2d440ade5dd3758e5762f998f31a0,4206584eee652c6cb7e4d38fc591205df33a3e74..774fdba0070bcb6086c654075fadf0cabacf29e7
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-VIEW" "1" "April 2012" "" ""
 -.TH "NPM\-VIEW" "1" "May 2012" "" ""
++.TH "NPM\-VIEW" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-view\fR \-\- View registry info
index f47a0e84a91a844a0800eb70dccf54b73ba5a34b,62d9f87ba33ca4bb995494309827a9894449b29c..1d7f502bd841a4408950baeabfc1c876d4c9ca24
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-WHOAMI" "1" "April 2012" "" ""
 -.TH "NPM\-WHOAMI" "1" "May 2012" "" ""
++.TH "NPM\-WHOAMI" "1" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-whoami\fR \-\- Display npm username
index 268f75e6e3341fed4aae4fd865d2f975a6aedf10,c650e468d242c95af97ef3e801337971057a4f87..a3187233299a57ba236920bdc9f58b0384d694d8
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BIN" "3" "April 2012" "" ""
 -.TH "NPM\-BIN" "3" "May 2012" "" ""
++.TH "NPM\-BIN" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-bin\fR \-\- Display npm bin folder
index 38ee6a1ca57adb526e925c2bb4883df45fd0b934,d2ba4244c140d63f7a9025427bf16128f296db31..61deea7e7f315630edda45fb1a1c04826a0a9f63
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-BUGS" "3" "April 2012" "" ""
 -.TH "NPM\-BUGS" "3" "May 2012" "" ""
++.TH "NPM\-BUGS" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
index e8b8260e6325e16b5ca37730e5d105edbfaaec85,bb850ddccc82d661debc90197f15a920e65abe8e..38a6e0a426de9231dc8909f7b989694d02266277
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-COMMANDS" "3" "April 2012" "" ""
 -.TH "NPM\-COMMANDS" "3" "May 2012" "" ""
++.TH "NPM\-COMMANDS" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-commands\fR \-\- npm commands
index 6debd412eef3208b87c84516c2ce2a57915b22d0,777db9372130595654d3284f9d4d30850705894e..05e64b08edb1867d0af49bbfdf480175fc364b2e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-CONFIG" "3" "April 2012" "" ""
 -.TH "NPM\-CONFIG" "3" "May 2012" "" ""
++.TH "NPM\-CONFIG" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-config\fR \-\- Manage the npm configuration files
index b4b91612e007e5e5e9afae23ceea9bf0ad181103,9c071a66b2d27ea81ecf9f3c87922503be5d9661..2786d1ff80fb7b1276839c79204026e5e4acdca3
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DEPRECATE" "3" "April 2012" "" ""
 -.TH "NPM\-DEPRECATE" "3" "May 2012" "" ""
++.TH "NPM\-DEPRECATE" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-deprecate\fR \-\- Deprecate a version of a package
index a61b0df6c62c7439a6c416364d38664beea9a9af,78f55afbe5c51db7e2f8b652392674a237c8f4d5..200df585b7834d97056eecbf3b915bdf1f2e775a
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-DOCS" "3" "April 2012" "" ""
 -.TH "NPM\-DOCS" "3" "May 2012" "" ""
++.TH "NPM\-DOCS" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
index dc4b183e97ee0ec5ed82a1ece4bc97d3f85fee5f,743192d1c1be9bbd203b962964b5a9d4b934b806..5c6e5e71f8202d5a59ec4e9829bab2b2d0c29935
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-EDIT" "3" "April 2012" "" ""
 -.TH "NPM\-EDIT" "3" "May 2012" "" ""
++.TH "NPM\-EDIT" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-edit\fR \-\- Edit an installed package
index 8817ce00817d7a0f766b55c0dce45b3ed600cec2,d728918ea893b0541ea5bd0c03479731614fe473..c6443f3ef8b0d6d2c6fcde36539084c3e32657eb
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-EXPLORE" "3" "April 2012" "" ""
 -.TH "NPM\-EXPLORE" "3" "May 2012" "" ""
++.TH "NPM\-EXPLORE" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-explore\fR \-\- Browse an installed package
index d42d68e55e8a047dc564ca4af8010a863d9ee002,34312daac73bfbecb2dd45ffa310988bd45abd2e..61d54c1a1f36a8593c932b3e0a61898c1710c411
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-HELP\-SEARCH" "3" "April 2012" "" ""
 -.TH "NPM\-HELP\-SEARCH" "3" "May 2012" "" ""
++.TH "NPM\-HELP\-SEARCH" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-help-search\fR \-\- Search the help pages
index f751030a6c9379a051a1cea3eecc9e1aeadf3511,55ee2bfb4f16084a339ab454107c6609ad35cbcd..31f508d73f52eed8950e0251cf5f5a2c5d58026c
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "INIT" "3" "April 2012" "" ""
 -.TH "INIT" "3" "May 2012" "" ""
++.TH "INIT" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBinit\fR \-\- Interactively create a package\.json file
index 6a9cea4f1d182ca945b959cc43888aceaa7133f6,35adb9dc95615ae4683ae6d3fa8b907046850a5c..89d0eb9408634492f5c1a5e191902e0a46d93327
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-INSTALL" "3" "April 2012" "" ""
 -.TH "NPM\-INSTALL" "3" "May 2012" "" ""
++.TH "NPM\-INSTALL" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-install\fR \-\- install a package programmatically
index edc3905a9a5daae7839f3ca302a3a915ee87a699,fd09d3f51111019857faebab41a07f662195f180..dfe050cad5de8ae11bd853236adecbbf8b6c517b
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-LINK" "3" "April 2012" "" ""
 -.TH "NPM\-LINK" "3" "May 2012" "" ""
++.TH "NPM\-LINK" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-link\fR \-\- Symlink a package folder
index c44d9f1167ad914694d38a1a9ade7a26c23fe6e8,2bf6009d993da2e3892c45c44e54027793d5a672..fe47803146300268d4437265c12a6fc13c592041
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-LOAD" "3" "April 2012" "" ""
 -.TH "NPM\-LOAD" "3" "May 2012" "" ""
++.TH "NPM\-LOAD" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-load\fR \-\- Load config settings
index 2d45dde31210cc1e719f0faac4c57c54ce6649e9,2ec65b23fa452a634e5841702718ed1cf9638e6d..1c9e9ec118bbd26ba273d426a3d6cfcdb805e77e
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-LS" "3" "April 2012" "" ""
 -.TH "NPM\-LS" "3" "May 2012" "" ""
++.TH "NPM\-LS" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-ls\fR \-\- List installed packages
@@@ -31,13 -31,13 +31,6 @@@ It will print out extraneous, missing, 
  If the silent parameter is set to true, nothing will be output to the screen,
  but the data will still be returned\.
  .
--.P
--Callback is provided an error if one occurred, the full data about which
--packages are installed and which dependencies they will receive, and a
--"lite" data object which just shows which versions are installed where\.
--Note that the full data object is a circular structure, so care must be
--taken if it is serialized to JSON\.
--.
  .SH "CONFIGURATION"
  .
  .SS "long"
index ed3851ae85aef93878e1cb1d7bd22295b07fabb2,978bfab2e3aee4a64926b09c30a61538fdb5a61e..ff96d77780f92823cd116110cfc761be3420a9c9
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM" "3" "April 2012" "" ""
 -.TH "NPM" "3" "May 2012" "" ""
++.TH "NPM" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm\fR \-\- node package manager
@@@ -21,7 -21,7 +21,7 @@@ npm\.load(configObject, function (er, n
  .fi
  .
  .SH "VERSION"
- 1.1.18
 -1.1.21
++1.1.0-2
  .
  .SH "DESCRIPTION"
  This is the API documentation for npm\.
index 4c0bd4dbe9622aac64f4d2592499756d210a59b8,3173c55dfcad7629f792e37ecb81048a58b5c84b..68940b357a29b05d080d424cd181adef6218e974
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-OUTDATED" "3" "April 2012" "" ""
 -.TH "NPM\-OUTDATED" "3" "May 2012" "" ""
++.TH "NPM\-OUTDATED" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-outdated\fR \-\- Check for outdated packages
index 922769f76db63c8fa48cf8bfc5dfa4b2cd7c1a48,6deea4501eb0f16c25818b8cdf4245f7e8a6dc27..7da0e4a95023b39fa7b9d051aa13c0769db05ba5
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-OWNER" "3" "April 2012" "" ""
 -.TH "NPM\-OWNER" "3" "May 2012" "" ""
++.TH "NPM\-OWNER" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-owner\fR \-\- Manage package owners
index 5c0547996378d522537d7627bb3bc3350391ffc5,2a8bafddd8e75bf8e1031dfd20dd2ba81e8fc9aa..9b336612787598b6efeb314dce5ceb784e8591c3
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PACK" "3" "April 2012" "" ""
 -.TH "NPM\-PACK" "3" "May 2012" "" ""
++.TH "NPM\-PACK" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-pack\fR \-\- Create a tarball from a package
index 3ba398aa3e9ca13210529ec4ca5fc74c317d9d2a,c1fdfea49a78b216deea99d6c068fc8ae703d6a5..6f1db94cbe86c9740e4a931edf36a4031512b4ad
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PREFIX" "3" "April 2012" "" ""
 -.TH "NPM\-PREFIX" "3" "May 2012" "" ""
++.TH "NPM\-PREFIX" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-prefix\fR \-\- Display prefix
index 566f57e8a5f3aeeb263554ca16fb83a31019d999,a49d129c3d66dd3b0086c2ed1be562a1ab180012..16b4d93b7fd169bd6f415049bea2a36a6714adc8
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PRUNE" "3" "April 2012" "" ""
 -.TH "NPM\-PRUNE" "3" "May 2012" "" ""
++.TH "NPM\-PRUNE" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-prune\fR \-\- Remove extraneous packages
index edddf21b97942e75aa5a7983d710deba91b2ee99,499bd0344f13fa3d01666c63041cecb9c5d36c52..41280810f8a1ffa37a03b91911ba4a7b49babda2
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-PUBLISH" "3" "April 2012" "" ""
 -.TH "NPM\-PUBLISH" "3" "May 2012" "" ""
++.TH "NPM\-PUBLISH" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-publish\fR \-\- Publish a package
index a20d55cedddabc42c266be8b90cbcb40aeb19752,6b8fb8cf566a3950864723d4645033c881abb8a9..3f284c9b9acedc1a3a63bb72583de73a349b26b6
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-REBUILD" "3" "April 2012" "" ""
 -.TH "NPM\-REBUILD" "3" "May 2012" "" ""
++.TH "NPM\-REBUILD" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-rebuild\fR \-\- Rebuild a package
index 3530cf9192f2b235938be784f1714a06eb2aae51,747c27f1eb4a270327c6ed674840f8b916d2415a..43939557efb79f90f936d98f048eb515b9fe0506
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-RESTART" "3" "April 2012" "" ""
 -.TH "NPM\-RESTART" "3" "May 2012" "" ""
++.TH "NPM\-RESTART" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-restart\fR \-\- Start a package
index 8fa00a0f79b0988b6cc0a23a6a82c99b788a886f,99a5b903d2750a582d45aebc64ead1a1d9334553..07c1b0cdd83e445ece3540b915f2c625b1bc4c39
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-ROOT" "3" "April 2012" "" ""
 -.TH "NPM\-ROOT" "3" "May 2012" "" ""
++.TH "NPM\-ROOT" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-root\fR \-\- Display npm root
index 4ace64ed532786530a083f5df43ed50a97f5448c,9ceb7b30e9beafa38a0f0a9cff6ba6338b722e1a..b5f03e270d3d65299cdd79a76e72024c299c2739
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-RUN\-SCRIPT" "3" "April 2012" "" ""
 -.TH "NPM\-RUN\-SCRIPT" "3" "May 2012" "" ""
++.TH "NPM\-RUN\-SCRIPT" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-run-script\fR \-\- Run arbitrary package scripts
index 9afb739b7d57c36973c3f45661e0744e4125bf39,f56eb4b9073bdb94255dafcbf4af7bc270b9170e..4c4a4a2d0e6a38bd8fd03bc0fe2f0b2ff5fddc6f
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SEARCH" "3" "April 2012" "" ""
 -.TH "NPM\-SEARCH" "3" "May 2012" "" ""
++.TH "NPM\-SEARCH" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-search\fR \-\- Search for packages
index 1d05cdee8db27f9afae5ab06cdb8c1dde00c545c,29dd95e879b469f2ae2bb49a0b521ce022bddc75..a050305ef784db4023ba8d5b82810dd98643b46d
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-START" "3" "April 2012" "" ""
 -.TH "NPM\-START" "3" "May 2012" "" ""
++.TH "NPM\-START" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-start\fR \-\- Start a package
index 5514b4ee3decc334bcf0fe9e033ace310237f2a7,1e4fcf269595c5edb5ea19f7a1ed3adeaabedaa8..302d72756b6358ec020d4812c3149c69bea57e26
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-STOP" "3" "April 2012" "" ""
 -.TH "NPM\-STOP" "3" "May 2012" "" ""
++.TH "NPM\-STOP" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-stop\fR \-\- Stop a package
index 24f4c14d425e24f7043a4b6db03fbfd8ab66831f,44eb54473b290d9fe3d4026fde13645f175c70f4..8c60894b12438839972c8de37bd3ca2ee23aa6a9
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-SUBMODULE" "3" "April 2012" "" ""
 -.TH "NPM\-SUBMODULE" "3" "May 2012" "" ""
++.TH "NPM\-SUBMODULE" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-submodule\fR \-\- Add a package as a git submodule
index e3f7e4916255952f57144b0d8d800decca58061b,cd95a8c7cdc3e9d083119719faf99c7550e056c8..ab48222d1d0a31e0801f1b987b1bdd685193574c
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-TAG" "3" "April 2012" "" ""
 -.TH "NPM\-TAG" "3" "May 2012" "" ""
++.TH "NPM\-TAG" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-tag\fR \-\- Tag a published version
index 9614b92e85ef6b08372dba010d92edd7c22a1257,7a8b3a839c8b4cb72cfac61a24ca66230926c3a4..3b9514a988231ecca640b6ed603284ad2ebab6fd
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-TEST" "3" "April 2012" "" ""
 -.TH "NPM\-TEST" "3" "May 2012" "" ""
++.TH "NPM\-TEST" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-test\fR \-\- Test a package
index acc26cde17da33a1cc6e5900f4199e41cb831a96,5a6f8f75018568398095262643ba9f67f03406c1..0349773b6876bebea9fe9a3a42940645ed322803
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-UNINSTALL" "3" "April 2012" "" ""
 -.TH "NPM\-UNINSTALL" "3" "May 2012" "" ""
++.TH "NPM\-UNINSTALL" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-uninstall\fR \-\- uninstall a package programmatically
index ac35cb83a669cfcb691846e05b3eb2a8bf476dd2,0a0e0f31ab0da631c8a1c6c008795d985e77b1dc..91e66771cc52ff5c0e5ec599e04bb402716d94c4
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-UNPUBLISH" "3" "April 2012" "" ""
 -.TH "NPM\-UNPUBLISH" "3" "May 2012" "" ""
++.TH "NPM\-UNPUBLISH" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-unpublish\fR \-\- Remove a package from the registry
index ded33bd86bc328f9cc80cc9e6d6878511797e0d6,f0543fcd0626ba69f6fce3207d343680980d1cdd..299006b51fc6916555c245d9d6e006d250f9b0ca
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-UPDATE" "3" "April 2012" "" ""
 -.TH "NPM\-UPDATE" "3" "May 2012" "" ""
++.TH "NPM\-UPDATE" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-update\fR \-\- Update a package
index b9015ebed3765f6c4e18114c137b5582825b915a,8c7fcb834c9a63c44d789ac8e0a5053e92446fe9..1925688c28beb1cf2fce93bf1f0ae01cf5ccb15a
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-VERSION" "3" "April 2012" "" ""
 -.TH "NPM\-VERSION" "3" "May 2012" "" ""
++.TH "NPM\-VERSION" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-version\fR \-\- Bump a package version
index 3e8e4a60f34092b27e95535bcf9840d01c79c84e,b507561691e18373b42b730c501c55aefac8d5a5..d3485f6b8ddb45cfcf5e00f0b569d13f9e40e53c
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-VIEW" "3" "April 2012" "" ""
 -.TH "NPM\-VIEW" "3" "May 2012" "" ""
++.TH "NPM\-VIEW" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-view\fR \-\- View registry info
index d4beb9ce4fabeb052e30a2ac7830428cdc70588a,8262b2af4f8e2303fc07c52705c2d8282fa275fb..58d3462db486ebcb1a5c5d32c0eeb7d23a16bea0
@@@ -1,7 -1,7 +1,7 @@@
  .\" Generated with Ronnjs/v0.1
  .\" http://github.com/kapouer/ronnjs/
  .
- .TH "NPM\-WHOAMI" "3" "April 2012" "" ""
 -.TH "NPM\-WHOAMI" "3" "May 2012" "" ""
++.TH "NPM\-WHOAMI" "3" "January 2012" "" ""
  .
  .SH "NAME"
  \fBnpm-whoami\fR \-\- Display npm username
index 1080b6bc9a1d38989bca3248c7b7a4f3695963ef,1080b6bc9a1d38989bca3248c7b7a4f3695963ef..203961a144715b9d32b8d0a6cd3504c930b98ece
@@@ -2,13 -2,13 +2,13 @@@
    "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
    "name": "block-stream",
    "description": "a stream of blocks",
--  "version": "0.0.5",
++  "version": "0.0.4",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/block-stream.git"
    },
    "engines": {
--    "node": "0.4 || ~0.5.8 || 0.6 || 0.7"
++    "node": "0.4 || ~0.5.8 || 0.6"
    },
    "main": "block-stream.js",
    "dependencies": {
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..c2658d7d1b31848c3b71960543cb0368e56cd4c7
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,1 @@@
++node_modules/
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..f1d0f13c8a54d0f8d78f86a1f9348f3c59750694
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,4 @@@
++language: node_js
++node_js:
++  - 0.4
++  - 0.6
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..88a842ef0e0ac18e6d06ae09a281d4e3281b8101
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,116 @@@
++# The Problem
++
++You've got some thing where you need to push a bunch of stuff into a
++queue and then shift it out.  Or, maybe it's a stack, and you're just
++pushing and popping it.
++
++Arrays work for this, but are a bit costly performance-wise.
++
++# The Solution
++
++A linked-list implementation that takes advantage of what v8 is good at:
++creating objects with a known shape.
++
++This is faster for this use case.  How much faster?  About 50%.
++
++    $ node bench.js
++    benchmarking /Users/isaacs/dev-src/js/fast-list/bench.js
++    Please be patient.
++    { node: '0.6.2-pre',
++      v8: '3.6.6.8',
++      ares: '1.7.5-DEV',
++      uv: '0.1',
++      openssl: '0.9.8l' }
++    Scores: (bigger is better)
++
++    new FastList()
++    Raw:
++     > 22556.39097744361
++     > 23054.755043227666
++     > 22770.398481973436
++     > 23414.634146341465
++     > 23099.133782483157
++    Average (mean) 22979.062486293868
++
++    []
++    Raw:
++     > 12195.121951219513
++     > 12184.508268059182
++     > 12173.91304347826
++     > 12216.404886561955
++     > 12184.508268059182
++    Average (mean) 12190.891283475617
++
++    new Array()
++    Raw:
++     > 12131.715771230503
++     > 12184.508268059182
++     > 12216.404886561955
++     > 12195.121951219513
++     > 11940.298507462687
++    Average (mean) 12133.609876906768
++
++    Winner: new FastList()
++    Compared with next highest ([]), it's:
++    46.95% faster
++    1.88 times as fast
++    0.28 order(s) of magnitude faster
++
++    Compared with the slowest (new Array()), it's:
++    47.2% faster
++    1.89 times as fast
++    0.28 order(s) of magnitude faster
++
++This lacks a lot of features that arrays have:
++
++1. You can't specify the size at the outset.
++2. It's not indexable.
++3. There's no join, concat, etc.
++
++If any of this matters for your use case, you're probably better off
++using an Array object.
++
++## Installing
++
++```
++npm install fast-list
++```
++
++## API
++
++```javascript
++var FastList = require("fast-list")
++var list = new FastList()
++list.push("foo")
++list.unshift("bar")
++list.push("baz")
++console.log(list.length) // 2
++console.log(list.pop()) // baz
++console.log(list.shift()) // bar
++console.log(list.shift()) // foo
++```
++
++### Methods
++
++* `push`: Just like Array.push, but only can take a single entry
++* `pop`: Just like Array.pop
++* `shift`: Just like Array.shift
++* `unshift`: Just like Array.unshift, but only can take a single entry
++* `drop`: Drop all entries
++* `item(n)`: Retrieve the nth item in the list.  This involves a walk
++  every time.  It's very slow.  If you find yourself using this,
++  consider using a normal Array instead.
++* `map(fn, thisp)`: Like `Array.prototype.map`.  Returns a new FastList.
++* `reduce(fn, startValue, thisp)`: Like `Array.prototype.reduce`
++* `forEach(fn, this)`: Like `Array.prototype.forEach`
++* `filter(fn, thisp)`: Like `Array.prototype.filter`. Returns a new
++  FastList.
++* `slice(start, end)`: Retrieve an array of the items at this position.
++  This involves a walk every time.  It's very slow.  If you find
++  yourself using this, consider using a normal Array instead.
++
++### Members
++
++* `length`: The number of things in the list.  Note that, unlike
++  Array.length, this is not a getter/setter, but rather a counter that
++  is internally managed.  Setting it can only cause harm.
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..692db0df8f53d0511536d5dd599f11e57577c859
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,144 @@@
++;(function() { // closure for web browsers
++
++function Item (data, prev, next) {
++  this.next = next
++  if (next) next.prev = this
++  this.prev = prev
++  if (prev) prev.next = this
++  this.data = data
++}
++
++function FastList () {
++  if (!(this instanceof FastList)) return new FastList
++  this._head = null
++  this._tail = null
++  this.length = 0
++}
++
++FastList.prototype =
++{ push: function (data) {
++    this._tail = new Item(data, this._tail, null)
++    if (!this._head) this._head = this._tail
++    this.length ++
++  }
++
++, pop: function () {
++    if (this.length === 0) return undefined
++    var t = this._tail
++    this._tail = t.prev
++    if (t.prev) {
++      t.prev = this._tail.next = null
++    }
++    this.length --
++    if (this.length === 1) this._head = this._tail
++    else if (this.length === 0) this._head = this._tail = null
++    return t.data
++  }
++
++, unshift: function (data) {
++    this._head = new Item(data, null, this._head)
++    if (!this._tail) this._tail = this._head
++    this.length ++
++  }
++
++, shift: function () {
++    if (this.length === 0) return undefined
++    var h = this._head
++    this._head = h.next
++    if (h.next) {
++      h.next = this._head.prev = null
++    }
++    this.length --
++    if (this.length === 1) this._tail = this._head
++    else if (this.length === 0) this._head = this._tail = null
++    return h.data
++  }
++
++, item: function (n) {
++    if (n < 0) n = this.length + n
++    var h = this._head
++    while (n-- > 0 && h) h = h.next
++    return h ? h.data : undefined
++  }
++
++, slice: function (n, m) {
++    if (!n) n = 0
++    if (!m) m = this.length
++    if (m < 0) m = this.length + m
++    if (n < 0) n = this.length + n
++
++    if (m === n) {
++      return []
++    }
++
++    if (m < n) {
++      throw new Error("invalid offset: "+n+","+m+" (length="+this.length+")")
++    }
++
++    var len = m - n
++      , ret = new Array(len)
++      , i = 0
++      , h = this._head
++    while (n-- > 0 && h) h = h.next
++    while (i < len && h) {
++      ret[i++] = h.data
++      h = h.next
++    }
++    return ret
++  }
++
++, drop: function () {
++    FastList.call(this)
++  }
++
++, forEach: function (fn, thisp) {
++    var p = this._head
++      , i = 0
++      , len = this.length
++    while (i < len && p) {
++      fn.call(thisp || this, p.data, i, this)
++      p = p.next
++      i ++
++    }
++  }
++
++, map: function (fn, thisp) {
++    var n = new FastList()
++    this.forEach(function (v, i, me) {
++      n.push(fn.call(thisp || me, v, i, me))
++    })
++    return n
++  }
++
++, filter: function (fn, thisp) {
++    var n = new FastList()
++    this.forEach(function (v, i, me) {
++      if (fn.call(thisp || me, v, i, me)) n.push(v)
++    })
++    return n
++  }
++
++, reduce: function (fn, val, thisp) {
++    var i = 0
++      , p = this._head
++      , len = this.length
++    if (!val) {
++      i = 1
++      val = p && p.data
++      p = p && p.next
++    }
++    while (i < len && p) {
++      val = fn.call(thisp || this, val, p.data, this)
++      i ++
++      p = p.next
++    }
++    return val
++  }
++}
++
++if ("undefined" !== typeof(exports)) module.exports = FastList
++else if ("function" === typeof(define) && define.amd) {
++  define("FastList", function() { return FastList })
++} else (function () { return this })().FastList = FastList
++
++})()
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..9bcc6b41337a74904fa42887d273bfcdbc410e3f
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,20 @@@
++{
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
++  "name": "fast-list",
++  "description": "A fast linked list (good for queues, stacks, etc.)",
++  "version": "1.0.2",
++  "repository": {
++    "type": "git",
++    "url": "git://github.com/isaacs/fast-list.git"
++  },
++  "main": "fast-list.js",
++  "dependencies": {},
++  "devDependencies": {
++    "bench": "~0.3.2",
++    "tap": "~0.1.0"
++  },
++  "scripts": {
++    "test": "tap test.js",
++    "bench": "node bench.js"
++  }
++}
index 494272a81afb6f29e423cce250d2b3dfe9b5f3f3,494272a81afb6f29e423cce250d2b3dfe9b5f3f3..66880db1ab8145b211a49bb339dc42a4d178d027
@@@ -1,5 -1,5 +1,3 @@@
  .*.swp
++examples/deep-copy
  node_modules/
--examples/deep-copy/
--examples/path/
--examples/filter-copy/
index 5675d4a1b1fcac770ef3c5f6510e612b11d08fc4,5675d4a1b1fcac770ef3c5f6510e612b11d08fc4..add48b945de9ba8a9bbccca2069d4f0afab9fad4
@@@ -20,11 -20,11 +20,6 @@@ Abstract.prototype.on = function (ev, f
    return this
  }
  
--Abstract.prototype.abort = function () {
--  this._aborted = true
--  this.emit("abort")
--}
--
  Abstract.prototype.destroy = function () {}
  
  Abstract.prototype.warn = function (msg, code) {
index 6a418c0bc1d69eaaea5f17df80049cddfdb31f1b,6a418c0bc1d69eaaea5f17df80049cddfdb31f1b..ab990d150175acd4d55da39334f8fe73f5e356c2
@@@ -11,7 -11,7 +11,6 @@@ var fs = require("graceful-fs"
    , mkdir = require("mkdirp")
    , path = require("path")
    , Reader = require("./reader.js")
--  , assert = require("assert").ok
  
  inherits(DirReader, Reader)
  
@@@ -25,42 -25,42 +24,25 @@@ function DirReader (props) 
      throw new Error("Non-directory type "+ props.type)
    }
  
--  me.entries = null
++  me._entries = null
    me._index = -1
    me._paused = false
    me._length = -1
  
--  if (props.sort) {
--    this.sort = props.sort
--  }
--
    Reader.call(this, props)
  }
  
  DirReader.prototype._getEntries = function () {
    var me = this
--
--  // race condition.  might pause() before calling _getEntries,
--  // and then resume, and try to get them a second time.
--  if (me._gotEntries) return
--  me._gotEntries = true
--
    fs.readdir(me._path, function (er, entries) {
      if (er) return me.error(er)
--
--    me.entries = entries
--
--    me.emit("entries", entries)
--    if (me._paused) me.once("resume", processEntries)
--    else processEntries()
--
--    function processEntries () {
--      me._length = me.entries.length
--      if (typeof me.sort === "function") {
--        me.entries = me.entries.sort(me.sort.bind(me))
--      }
--      me._read()
++    me._entries = entries
++    me._length = entries.length
++    // console.error("DR %s sort =", me.path, me.props.sort)
++    if (typeof me.props.sort === "function") {
++      me._entries.sort(me.props.sort)
      }
++    me._read()
    })
  }
  
@@@ -68,7 -68,7 +50,7 @@@
  DirReader.prototype._read = function () {
    var me = this
  
--  if (!me.entries) return me._getEntries()
++  if (!me._entries) return me._getEntries()
  
    if (me._paused || me._currentEntry || me._aborted) {
      // console.error("DR paused=%j, current=%j, aborted=%j", me._paused, !!me._currentEntry, me._aborted)
@@@ -76,7 -76,7 +58,7 @@@
    }
  
    me._index ++
--  if (me._index >= me.entries.length) {
++  if (me._index >= me._length) {
      if (!me._ended) {
        me._ended = true
        me.emit("end")
    // ok, handle this one, then.
  
    // save creating a proxy, by stat'ing the thing now.
--  var p = path.resolve(me._path, me.entries[me._index])
--  assert(p !== me._path)
--  assert(me.entries[me._index])
--
++  var p = path.resolve(me._path, me._entries[me._index])
    // set this to prevent trying to _read() again in the stat time.
    me._currentEntry = p
    fs[ me.props.follow ? "stat" : "lstat" ](p, function (er, stat) {
      if (er) return me.error(er)
  
--    var who = me._proxy || me
--
--    stat.path = p
--    stat.basename = path.basename(p)
--    stat.dirname = path.dirname(p)
--    var childProps = me.getChildProps.call(who, stat)
--    childProps.path = p
--    childProps.basename = path.basename(p)
--    childProps.dirname = path.dirname(p)
--
--    var entry = Reader(childProps, stat)
++    var entry = Reader({ path: p
++                       , depth: me.depth + 1
++                       , root: me.root || me._proxy || me
++                       , parent: me._proxy || me
++                       , follow: me.follow
++                       , filter: me.filter
++                       , sort: me.props.sort
++                       }, stat)
  
      // console.error("DR Entry", p, stat.size)
  
      // This nomenclature is not completely final.
  
      entry.on("pause", function (who) {
--      if (!me._paused && !entry._disowned) {
++      if (!me._paused) {
          me.pause(who)
        }
      })
  
      entry.on("resume", function (who) {
--      if (me._paused && !entry._disowned) {
++      if (me._paused) {
          me.resume(who)
        }
      })
  
--    entry.on("stat", function (props) {
--      me.emit("_entryStat", entry, props)
--      if (entry._aborted) return
--      if (entry._paused) entry.once("resume", function () {
--        me.emit("entryStat", entry, props)
--      })
--    })
--
      entry.on("ready", function EMITCHILD () {
        // console.error("DR emit child", entry._path)
        if (me._paused) {
        if (entry.type === "Socket") {
          me.emit("socket", entry)
        } else {
--        me.emitEntry(entry)
++        me.emit("entry", entry)
++        me.emit("child", entry)
        }
      })
  
      var ended = false
      entry.on("close", onend)
--    entry.on("disown", onend)
      function onend () {
        if (ended) return
        ended = true
        me.emit("childEnd", entry)
        me.emit("entryEnd", entry)
        me._currentEntry = null
--      if (!me._paused) {
--        me._read()
--      }
++      me._read()
      }
  
--    // XXX Remove this.  Works in node as of 0.6.2 or so.
++    // XXX Make this work in node.
      // Long filenames should not break stuff.
      entry.on("error", function (er) {
        if (entry._swallowErrors) {
    })
  }
  
--DirReader.prototype.disown = function (entry) {
--  entry.emit("beforeDisown")
--  entry._disowned = true
--  entry.parent = entry.root = null
--  if (entry === this._currentEntry) {
--    this._currentEntry = null
--  }
--  entry.emit("disown")
--}
--
--DirReader.prototype.getChildProps = function (stat) {
--  return { depth: this.depth + 1
--         , root: this.root || this
--         , parent: this
--         , follow: this.follow
--         , filter: this.filter
--         , sort: this.props.sort
--         }
--}
--
  DirReader.prototype.pause = function (who) {
    var me = this
    if (me._paused) return
@@@ -239,11 -239,11 +185,8 @@@ DirReader.prototype.resume = function (
    }
  
    if (me._currentEntry) {
--    if (me._currentEntry.resume) me._currentEntry.resume(who)
++    if (me._currentEntry.resume) {
++      me._currentEntry.resume(who)
++    }
    } else me._read()
  }
--
--DirReader.prototype.emitEntry = function (entry) {
--  this.emit("entry", entry)
--  this.emit("child", entry)
--}
index 7073b883ea282eea6c7630972c4a928ae7a78e3c,7073b883ea282eea6c7630972c4a928ae7a78e3c..01920244c133be4be9854cc6b8a6dd278ce45c93
@@@ -37,7 -37,7 +37,6 @@@ DirWriter.prototype._create = function 
      // ready to start getting entries!
      me.ready = true
      me.emit("ready")
--    me._process()
    })
  }
  
@@@ -100,9 -100,9 +99,7 @@@ DirWriter.prototype._process = functio
    // don't allow recursive copying
    var p = entry
    do {
--    var pp = p._path || p.path
--    if (pp === me.root._path || pp === me._path ||
--        (pp && pp.indexOf(me._path) === 0)) {
++    if (p._path === me.root._path || p._path === me._path) {
        // console.error("DW Exit (recursive)", entry.basename, me._path)
        me._processing = false
        if (entry._collected) entry.pipe()
    // get rid of any ../../ shenanigans
    props.path = path.join(me.path, path.join("/", p))
  
--  // if i have a filter, the child should inherit it.
--  props.filter = me.filter
--
    // all the rest of the stuff, copy over from the source.
    Object.keys(entry.props).forEach(function (k) {
      if (!props.hasOwnProperty(k)) {
index 5c8f1e7012899d9e6f44cc31c9713c59624a1510,5c8f1e7012899d9e6f44cc31c9713c59624a1510..8a9816380053689c92b22596b8bbbca001766f0d
@@@ -4,6 -4,6 +4,7 @@@ module.exports = LinkWrite
  var fs = require("graceful-fs")
    , Writer = require("./writer.js")
    , inherits = require("inherits")
++  , collect = require("./collect.js")
    , path = require("path")
    , rimraf = require("rimraf")
  
index a0ece34a26828d542e28034f17dbf0df7c117d9a,a0ece34a26828d542e28034f17dbf0df7c117d9a..f99b28fe553eb5239cf41908c00971b51600e873
@@@ -59,11 -59,11 +59,7 @@@ ProxyReader.prototype._addProxy = funct
      , "close"
      , "linkpath"
      , "entry"
--    , "entryEnd"
--    , "child"
--    , "childEnd"
      , "warn"
--    , "stat"
      ].forEach(function (ev) {
        // console.error("~~ proxy event", ev, me.path)
        proxy.on(ev, me.emit.bind(me, ev))
index e4e1b482cf6a313c3bcb6ece22675a3ea6e5a12b,e4e1b482cf6a313c3bcb6ece22675a3ea6e5a12b..6aa67ada78e9750ff16dffe4d53110e8cbad383f
@@@ -187,38 -187,38 +187,19 @@@ Reader.prototype._stat = function (curr
      // if the filter doesn't pass, then just skip over this one.
      // still have to emit end so that dir-walking can move on.
      if (me.filter) {
--      var who = me._proxy || me
        // special handling for ProxyReaders
--      if (!me.filter.call(who, who, props)) {
--        if (!me._disowned) {
--          me.abort()
--          me.emit("end")
--          me.emit("close")
--        }
--        return
--      }
--    }
--
--    // last chance to abort or disown before the flow starts!
--    var events = ["_stat", "stat", "ready"]
--    var e = 0
--    ;(function go () {
--      if (me._aborted) {
++      if (!me.filter.call(me._proxy || me)) {
++        me._aborted = true
          me.emit("end")
          me.emit("close")
          return
        }
++    }
  
--      if (me._paused) {
--        me.once("resume", go)
--        return
--      }
++    me.emit("ready", props)
  
--      var ev = events[e ++]
--      if (!ev) return me._read()
--      me.emit(ev, props)
--      go()
--    })()
++    // if it's a directory, then we'll be emitting "entry" events.
++    me._read()
    }
  }
  
index 243f6b64e891ca2a63d2d09dd2491490f18753ed,243f6b64e891ca2a63d2d09dd2491490f18753ed..dde29fd7b22131c09d74095b848d236922d3967f
@@@ -98,8 -98,8 +98,6 @@@ function Writer (props, current) 
    me._buffer = []
    me.ready = false
  
--  me.filter = typeof props.filter === "function" ? props.filter: null
--
    // start the ball rolling.
    // this checks what's there already, and then calls
    // me._create() to call the impl-specific creation stuff.
@@@ -123,19 -123,19 +121,11 @@@ Writer.prototype._stat = function (curr
    var me = this
      , props = me.props
      , stat = props.follow ? "stat" : "lstat"
--    , who = me._proxy || me
  
    if (current) statCb(null, current)
    else fs[stat](me._path, statCb)
  
    function statCb (er, current) {
--    if (me.filter && !me.filter.call(who, who, current)) {
--      me._aborted = true
--      me.emit("end")
--      me.emit("close")
--      return
--    }
--
      // if it's not there, great.  We'll just create it.
      // if it is there, then we'll need to change whatever differs
      if (er || !current) {
@@@ -166,83 -166,83 +156,13 @@@ function create (me) 
  
    // XXX Need to clobber non-dirs that are in the way,
    // unless { clobber: false } in the props.
--  mkdir(path.dirname(me._path), Writer.dirmode, function (er, made) {
++  mkdir(path.dirname(me._path), Writer.dirmode, function (er) {
      // console.error("W created", path.dirname(me._path), er)
      if (er) return me.error(er)
--
--    // later on, we have to set the mode and owner for these
--    me._madeDir = made
--    return me._create()
++    me._create()
    })
  }
  
--function endChmod (me, want, current, path, cb) {
--    var wantMode = want.mode
--      , chmod = want.follow || me.type !== "SymbolicLink"
--              ? "chmod" : "lchmod"
--
--  if (!fs[chmod]) return cb()
--  if (typeof wantMode !== "number") return cb()
--
--  var curMode = current.mode & 0777
--  wantMode = wantMode & 0777
--  if (wantMode === curMode) return cb()
--
--  fs[chmod](path, wantMode, cb)
--}
--
--
--function endChown (me, want, current, path, cb) {
--  // Don't even try it unless root.  Too easy to EPERM.
--  if (process.platform === "win32") return cb()
--  if (!process.getuid || !process.getuid() === 0) return cb()
--  if (typeof want.uid !== "number" &&
--      typeof want.gid !== "number" ) return cb()
--
--  if (current.uid === want.uid &&
--      current.gid === want.gid) return cb()
--
--  var chown = (me.props.follow || me.type !== "SymbolicLink")
--            ? "chown" : "lchown"
--  if (!fs[chown]) return cb()
--
--  if (typeof want.uid !== "number") want.uid = current.uid
--  if (typeof want.gid !== "number") want.gid = current.gid
--
--  fs[chown](path, want.uid, want.gid, cb)
--}
--
--function endUtimes (me, want, current, path, cb) {
--  if (!fs.utimes || process.platform === "win32") return cb()
--
--  var utimes = (want.follow || me.type !== "SymbolicLink")
--             ? "utimes" : "lutimes"
--
--  if (utimes === "lutimes" && !fs[utimes]) {
--    utimes = "utimes"
--  }
--
--  if (!fs[utimes]) return cb()
--
--  var curA = current.atime
--    , curM = current.mtime
--    , meA = want.atime
--    , meM = want.mtime
--
--  if (meA === undefined) meA = curA
--  if (meM === undefined) meM = curM
--
--  if (!isDate(meA)) meA = new Date(meA)
--  if (!isDate(meM)) meA = new Date(meM)
--
--  if (meA.getTime() === curA.getTime() &&
--      meM.getTime() === curM.getTime()) return cb()
--
--  fs[utimes](path, meA, meM, cb)
--}
--
--
--// XXX This function is beastly.  Break it up!
  Writer.prototype._finish = function () {
    var me = this
  
    return
  
    function setProps (current) {
--    endChmod(me, me.props, current, me._path, next("chmod"))
--    endChown(me, me.props, current, me._path, next("chown"))
--    endUtimes(me, me.props, current, me._path, next("chown"))
--  }
++    // console.error(" W setprops", me._path)
++    // mode
++    var wantMode = me.props.mode
++      , chmod = me.props.follow || me.type !== "SymbolicLink"
++              ? "chmod" : "lchmod"
  
--  function next (what) {
--    todo ++
--    return function (er) {
--      // console.error("   W Finish", what, todo)
--      if (errState) return
--      if (er) {
--        er.fstream_finish_call = what
--        return me.error(errState = er)
--      }
--      if (--todo > 0) return
--      if (done) return
--      done = true
--
--      // we may still need to set the mode/etc. on some parent dirs
--      // that were created previously.  delay end/close until then.
--      if (!me._madeDir) return end()
--      else endMadeDir(me, me._path, end)
--
--      function end (er) {
--        if (er) {
--          er.fstream_finish_call = "setupMadeDir"
--          return me.error(er)
++    if (fs[chmod] && typeof wantMode === "number") {
++      wantMode = wantMode & 0777
++      todo ++
++      // console.error(" W chmod", wantMode.toString(8), me.basename, "\r")
++      fs[chmod](me._path, wantMode, next(chmod))
++    }
++
++    // uid, gid
++    // Don't even try it unless root.  Too easy to EPERM.
++    if (process.platform !== "win32" &&
++        process.getuid && process.getuid() === 0 &&
++        ( typeof me.props.uid === "number" ||
++          typeof me.props.gid === "number" )) {
++      var chown = (me.props.follow || me.type !== "SymbolicLink")
++                ? "chown" : "lchown"
++      if (fs[chown]) {
++        if (typeof me.props.uid !== "number") me.props.uid = current.uid
++        if (typeof me.props.gid !== "number") me.props.gid = current.gid
++        if (me.props.uid !== current.uid || me.props.gid !== current.gid) {
++          todo ++
++          // console.error(" W chown", me.props.uid, me.props.gid, me.basename)
++          fs[chown](me._path, me.props.uid, me.props.gid, next("chown"))
          }
--        // all the props have been set, so we're completely done.
--        me.emit("end")
--        me.emit("close")
        }
      }
--  }
--}
  
--function endMadeDir (me, p, cb) {
--  var made = me._madeDir
--  // everything *between* made and path.dirname(me._path)
--  // needs to be set up.  Note that this may just be one dir.
--  var d = path.dirname(p)
++    // atime, mtime.
++    if (fs.utimes && process.platform !== "win32") {
++      var utimes = (me.props.follow || me.type !== "SymbolicLink")
++                 ? "utimes" : "lutimes"
  
--  endMadeDir_(me, d, function (er) {
--    if (er) return cb(er)
--    if (d === made) {
--      return cb()
--    }
--    endMadeDir(me, d, cb)
--  })
--}
++      if (utimes === "lutimes" && !fs[utimes]) {
++        utimes = "utimes"
++      }
++
++      var curA = current.atime
++        , curM = current.mtime
++        , meA = me.props.atime
++        , meM = me.props.mtime
  
--function endMadeDir_ (me, p, cb) {
--  var dirProps = {}
--  Object.keys(me.props).forEach(function (k) {
--    dirProps[k] = me.props[k]
++      if (meA === undefined) meA = curA
++      if (meM === undefined) meM = curM
  
--    // only make non-readable dirs if explicitly requested.
--    if (k === "mode" && me.type !== "Directory") {
--      dirProps[k] = dirProps[k] | 0111
++      if (!isDate(meA)) meA = new Date(meA)
++      if (!isDate(meM)) meA = new Date(meM)
++
++      if (meA.getTime() !== curA.getTime() ||
++          meM.getTime() !== curM.getTime()) {
++        todo ++
++        // console.error(" W utimes", meA, meM, me.basename)
++        fs[utimes](me._path, meA, meM, next("utimes"))
++      }
      }
--  })
  
--  var todo = 3
--  , errState = null
--  fs.stat(p, function (er, current) {
--    if (er) return cb(errState = er)
--    endChmod(me, dirProps, current, p, next)
--    endChown(me, dirProps, current, p, next)
--    endUtimes(me, dirProps, current, p, next)
--  })
++    // finally, handle the case if there was nothing to do.
++    if (todo === 0) {
++      // console.error(" W nothing to do", me.basename)
++      next("nothing to do")()
++    }
++  }
  
--  function next (er) {
++  function next (what) { return function (er) {
++    // console.error("   W Finish", what, todo)
      if (errState) return
--    if (er) return cb(errState = er)
--    if (-- todo === 0) return cb()
--  }
++    if (er) {
++      er.fstream_finish_call = what
++      return me.error(errState = er)
++    }
++    if (--todo > 0) return
++    if (done) return
++    done = true
++
++    // all the props have been set, so we're completely done.
++    me.emit("end")
++    me.emit("close")
++  }}
  }
  
  Writer.prototype.pipe = function () {
index 2be498e095bdc5f3993e9abf03ccc6cfc8d2a4db,2be498e095bdc5f3993e9abf03ccc6cfc8d2a4db..eb8561532c9625a06d4d991158985e591e95f7f7
@@@ -1,42 -1,42 +1,26 @@@
  {
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me/"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
    "name": "fstream",
    "description": "Advanced file system stream things",
--  "version": "0.1.18",
++  "version": "0.1.11",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/fstream.git"
    },
    "main": "fstream.js",
    "engines": {
--    "node": ">=0.6"
++    "node": "0.5 || 0.6 || 0.7"
    },
    "dependencies": {
--    "rimraf": "2",
--    "mkdirp": "0.3",
++    "rimraf": "~1.0.8",
++    "mkdirp": "~0.1.0",
      "graceful-fs": "~1.1.2",
      "inherits": "~1.0.0"
    },
    "devDependencies": {
--    "tap": ""
++    "tap": "0.1"
    },
    "scripts": {
      "test": "tap examples/*.js"
--  },
--  "license": "BSD",
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "fstream@0.1.18",
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.13",
--  "_nodeVersion": "v0.7.7-pre",
--  "_defaultsLoaded": true,
--  "_from": "fstream@~0.1.17"
++  }
  }
index ecbda31a5a5da09d3d33c39fcb3aea1864255bfb,ecbda31a5a5da09d3d33c39fcb3aea1864255bfb..7467f304a20678da330213b116ace8eabf3be9e9
@@@ -6,7 -6,7 +6,8 @@@ var fs = require("fs"
  // there is such a thing as TOO graceful.
  if (fs.open === gracefulOpen) return
  
--var queue = []
++var FastList = require("fast-list")
++  , queue = new FastList()
    , curOpen = 0
    , constants = require("constants")
  
@@@ -209,67 -209,67 +210,3 @@@ if (!fs.lutimes) 
      fs.lutimesSync = function () {}
    }
  }
--
--
--// https://github.com/isaacs/node-graceful-fs/issues/4
--// Chown should not fail on einval or eperm if non-root.
--
--fs.chown = chownFix(fs.chown)
--fs.fchown = chownFix(fs.fchown)
--fs.lchown = chownFix(fs.lchown)
--
--fs.chownSync = chownFixSync(fs.chownSync)
--fs.fchownSync = chownFixSync(fs.fchownSync)
--fs.lchownSync = chownFixSync(fs.lchownSync)
--
--function chownFix (orig) {
--  if (!orig) return orig
--  return function (target, uid, gid, cb) {
--    return orig.call(fs, target, uid, gid, function (er, res) {
--      if (chownErOk(er)) er = null
--      cb(er, res)
--    })
--  }
--}
--
--function chownFixSync (orig) {
--  if (!orig) return orig
--  return function (target, uid, gid) {
--    try {
--      return orig.call(fs, target, uid, gid)
--    } catch (er) {
--      if (!chownErOk(er)) throw er
--    }
--  }
--}
--
--function chownErOk (er) {
--  // if there's no getuid, or if getuid() is something other than 0,
--  // and the error is EINVAL or EPERM, then just ignore it.
--  // This specific case is a silent failure in cp, install, tar,
--  // and most other unix tools that manage permissions.
--  // When running as root, or if other types of errors are encountered,
--  // then it's strict.
--  if (!er || (!process.getuid || process.getuid() !== 0)
--      && (er.code === "EINVAL" || er.code === "EPERM")) return true
--}
--
--
--
--// on Windows, A/V software can lock the directory, causing this
--// to fail with an EACCES or EPERM if the directory contains newly
--// created files.  Try again on failure, for up to 1 second.
--if (process.platform === "win32") {
--  var rename_ = fs.rename
--  fs.rename = function rename (from, to, cb) {
--    var start = Date.now()
--    rename_(from, to, function CB (er) {
--      if (er
--          && (er.code === "EACCES" || er.code === "EPERM")
--          && Date.now() - start < 1000) {
--        return rename_(from, to, CB)
--      }
--      cb(er)
--    })
--  }
--}
index 757d3014c8614265c1e93ddd9a6f577f227c91fa,757d3014c8614265c1e93ddd9a6f577f227c91fa..ec72affa139e2edaffafd95062b55a27e91d53c6
@@@ -1,31 -1,31 +1,18 @@@
  {
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
    "name": "graceful-fs",
    "description": "fs monkey-patching to avoid EMFILE and other problems",
--  "version": "1.1.8",
++  "version": "1.1.2",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/node-graceful-fs.git"
    },
    "main": "graceful-fs.js",
    "engines": {
--    "node": ">=0.4.0"
++    "node": "0.4 || 0.5 || 0.6"
    },
--  "devDependencies": {},
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
++  "dependencies": {
++    "fast-list": "1"
    },
--  "_id": "graceful-fs@1.1.8",
--  "dependencies": {},
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.10",
--  "_nodeVersion": "v0.7.7-pre",
--  "_defaultsLoaded": true,
--  "_from": "graceful-fs@~1.1.1"
++  "devDependencies": {}
  }
index 5a8e332545f667aab9bf3a17f11dba27c70b656a,5a8e332545f667aab9bf3a17f11dba27c70b656a..c78c4f6618373f52e31bf3ec082227a3ad1dc3dc
@@@ -1,14 -1,14 +1,26 @@@
--            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
--                    Version 2, December 2004
++Copyright 2011 Isaac Z. Schlueter (the "Author")
++All rights reserved.
  
-- Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
++General Public Obviousness License
  
-- Everyone is permitted to copy and distribute verbatim or modified
-- copies of this license document, and changing it is allowed as long
-- as the name is changed.
++The Author asserts that this software and associated documentation
++files (the "Software"), while the Author's original creation, is
++nonetheless obvious, trivial, unpatentable, and implied by the
++context in which the software was created.  If you sat down and
++thought about the problem for an hour or less, you'd probably
++come up with exactly this solution.
  
--            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
--   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
++Permission is granted to use this software in any way
++whatsoever, with the following restriction:
  
--  0. You just DO WHAT THE FUCK YOU WANT TO.
++You may not release the Software under a more restrictive license
++than this one.
  
++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
++EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
++OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
++NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
++HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
++WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
++FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++OTHER DEALINGS IN THE SOFTWARE.
index b5499c1ec86077f2ad7179313e4ca1f2b1c7ed9f,b5499c1ec86077f2ad7179313e4ca1f2b1c7ed9f..7dc32771b93d1f9f84aa0cfd0369272d01cfc78f
@@@ -1,44 -1,44 +1,8 @@@
--{
--  "name": "inherits",
--  "description": "A tiny simple way to do classic inheritance in js",
--  "version": "1.0.0",
--  "keywords": [
--    "inheritance",
--    "class",
--    "klass",
--    "oop",
--    "object-oriented"
--  ],
--  "main": "./inherits.js",
--  "repository": {
--    "type": "git",
--    "url": "git://github.com/isaacs/inherits.git"
--  },
--  "license": {
--    "type": "WTFPL2"
--  },
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me/"
--  },
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "inherits@1.0.0",
--  "dependencies": {},
--  "devDependencies": {},
--  "optionalDependencies": {},
--  "engines": {
--    "node": "*"
--  },
--  "_engineSupported": true,
--  "_npmVersion": "1.1.10",
--  "_nodeVersion": "v0.7.7-pre",
--  "_defaultsLoaded": true,
--  "dist": {
--    "shasum": "12dbc03c9f7c203289234b214a7d05a311d71450"
--  },
--  "_from": "git://github.com/isaacs/inherits"
--}
++{ "name" : "inherits"
++, "description": "A tiny simple way to do classic inheritance in js"
++, "version" : "1.0.0"
++, "keywords" : ["inheritance", "class", "klass", "oop", "object-oriented"]
++, "main" : "./inherits.js"
++, "repository" : "https://github.com/isaacs/inherits"
++, "license": { "type": "GPOL", "url": "https://raw.github.com/isaacs/inherits/master/LICENSE" }
++, "author" : "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)" }
index 6fd07d2e9745e3119322d7402377e5304a9dc4d0,6fd07d2e9745e3119322d7402377e5304a9dc4d0..d5f97234cd9c880ab931276581d9beed5fd7cb34
@@@ -60,12 -60,12 +60,11 @@@ thing in a path part.  That is, `a/**/b
  `a/**b` will not.  **Note that this is different from the way that `**` is
  handled by ruby's `Dir` class.**
  
--If an escaped pattern has no matches, and the `nonull` flag is set,
++If an escaped pattern has no matches, and the `null` flag is not set,
  then minimatch.match returns the pattern as-provided, rather than
  interpreting the character escapes.  For example,
  `minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
--`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
--that it does not resolve escaped pattern characters.
++`"*a?"`.
  
  If brace expansion is not disabled, then it is performed before any
  other interpretation of the glob pattern.  Thus, a pattern like
@@@ -148,8 -148,8 +147,8 @@@ var javascripts = fileList.filter(minim
  ### minimatch.match(list, pattern, options)
  
  Match against the list of
--files, in the style of fnmatch or glob.  If nothing is matched, and
--options.nonull is set, then return a list containing the pattern itself.
++files, in the style of fnmatch or glob.  If nothing is matched, then
++return the pattern (unless `{ null: true }` in the options.)
  
  ```javascript
  var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
@@@ -211,8 -211,8 +210,3 @@@ comment
  ### nonegate
  
  Suppress the behavior of treating a leading `!` character as negation.
--
--### flipNegate
--
--Returns from negate expressions the same as if they were not negated.
--(Ie, true on a hit, false on a miss.)
index 1ca08104ee26b3eeac97923274abe1881d418fa4,1ca08104ee26b3eeac97923274abe1881d418fa4..768c8ebac7d064108e98803ce37140487d481de2
@@@ -4,6 -4,6 +4,7 @@@ minimatch.Minimatch = Minimatc
  var LRU = require("lru-cache")
    , cache = minimatch.cache = new LRU(100)
    , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
++  , pathSplit = process.platform === "win32" ? /\\|\// : "/"
  
  var path = require("path")
    // any single thing other than /
@@@ -129,7 -129,7 +130,7 @@@ function make () 
    this.parseNegate()
  
    // step 2: expand braces
--  var set = this.globSet = this.braceExpand()
++  var set = this.braceExpand()
  
    if (options.debug) console.error(this.pattern, set)
  
    // These will be regexps, except in the case of "**", which is
    // set to the GLOBSTAR object for globstar behavior,
    // and will not contain any / characters
--  set = this.globParts = set.map(function (s) {
++  set = set.map(function (s) {
      return s.split(slashSplit)
    })
  
++  // step 4: if we have a defined root, then patterns starting with ""
++  // get attached to that.  If we have a defined cwd, then patterns
++  // *not* starting with "" get attached to that.
++  // Exception 1: on windows, a pattern like //\?/c:/ or c:/ will
++  // not get anything prefixed to it.
++  // Exception 2: If matchBase is set, and it's just a filename,
++  // then don't prefix anything onto it, since it'll only match
++  // files with that basename anyhow.
++  set = set.map(function (p) {
++    if (process.platform === "win32" &&
++        ( (p[0] === "" && p[1] === "" && p[2] === "\\?") // unc
++        || (p[0].match(/^[a-zA-Z]:$/)) )) {
++      return p
++    }
++    if (options.matchBase && p.length === 1) return p
++    // do prefixing.
++    if (options.root && p[0] === "") {
++      return options.root.split(pathSplit).concat(p)
++    }
++    if (options.cwd && p[0] !== "") {
++      return options.cwd.split(pathSplit).concat(p)
++    }
++    return p
++  })
++
++
    if (options.debug) console.error(this.pattern, set)
  
    // glob --> regexps
@@@ -518,8 -518,8 +545,7 @@@ function parse (pattern, isSub) 
          patternListStack.push({ type: plType
                                , start: i - 1
                                , reStart: re.length })
--        // negation is (?:(?!js)[^/]*)
--        re += stateChar === "!" ? "(?:(?!" : "(?:"
++        re += stateChar === "!" ? "(?!" : "(?:"
          stateChar = false
          continue
  
          hasMagic = true
          re += ")"
          plType = patternListStack.pop().type
--        // negation is (?:(?!js)[^/]*)
--        // The others are (?:<pattern>)<type>
          switch (plType) {
--          case "!":
--            re += "[^/]*?)"
--            break
            case "?":
            case "+":
            case "*": re += plType
++          case "!": // already handled by the start
            case "@": break // the default anyway
          }
          continue
@@@ -764,12 -764,12 +786,13 @@@ function match (f, partial) 
    if (this.comment) return false
    if (this.empty) return f === ""
  
--  if (f === "/" && partial) return true
--
    var options = this.options
  
    // first, normalize any slash-separated path parts.
    // f = path.normalize(f)
++  var absolute = isAbsolute(f)
++
++  // console.error(this.pattern, f, absolute)
  
    // windows: need to use /, not \
    // On other platforms, \ is a valid (albeit bad) filename char.
  
    // treat the test path as a set of pathparts.
    f = f.split(slashSplit)
--  if (options.debug) {
--    console.error(this.pattern, "split", f)
--  }
++  // console.error(this.pattern, "split", f)
  
    // just ONE of the pattern sets in this.set needs to match
    // in order for it to be valid.  If negating, then just one
      var pattern = set[i]
      var hit = this.matchOne(f, pattern, partial)
      if (hit) {
--      if (options.flipNegate) return true
        return !this.negate
      }
    }
  
    // didn't get any hits.  this is success if it's a negative
    // pattern, failure otherwise.
--  if (options.flipNegate) return false
    return this.negate
  }
  
@@@ -984,3 -984,3 +1003,19 @@@ function globUnescape (s) 
  function regExpEscape (s) {
    return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
  }
++
++
++function isAbsolute (p) {
++  if (process.platform !== "win32") return p.charAt(0) === "/"
++
++  // yanked from node/lib/path.js
++  var splitDeviceRe =
++    /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?([\\\/])?([\s\S]*?)$/
++
++  var result = p.match(splitDeviceRe)
++    , device = result[1] || ""
++    , isUnc = device && device.charAt(1) !== ":"
++    , isAbs = !!result[2] || isUnc // UNC always absolute
++
++  return isAbs
++}
index 1bcb3d43e61a318f233643bf81868a250f66c694,1bcb3d43e61a318f233643bf81868a250f66c694..92ccac5fb982bdabf073e9fbc5a6ba8cf83b5ab6
@@@ -1,12 -1,12 +1,8 @@@
  {
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
    "name": "minimatch",
    "description": "a glob matcher in javascript",
--  "version": "0.2.2",
++  "version": "0.1.3",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/minimatch.git"
      "lru-cache": "~1.0.5"
    },
    "devDependencies": {
--    "tap": ""
++    "tap": "~0.1.3"
    },
--  "licenses": [
++  "licenses" : [
      {
--      "type": "MIT",
--      "url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
++      "type" : "MIT",
++      "url" : "http://github.com/isaacs/minimatch/raw/master/LICENSE"
      }
--  ],
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "minimatch@0.2.2",
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.12",
--  "_nodeVersion": "v0.7.7-pre",
--  "_defaultsLoaded": true,
--  "_from": "minimatch@0"
++  ]
  }
index b4dd75fdc6857bddfa7d044fb016d506b26ede63,b4dd75fdc6857bddfa7d044fb016d506b26ede63..0393c4ea535864fda3ad5e334e96ffe3d2d84663
@@@ -3,14 -3,14 +3,14 @@@ mkdir
  
  Like `mkdir -p`, but in node.js!
  
--example
++Example
  =======
  
  pow.js
  ------
      var mkdirp = require('mkdirp');
      
--    mkdirp('/tmp/foo/bar/baz', function (err) {
++    mkdirp('/tmp/foo/bar/baz', 0755, function (err) {
          if (err) console.error(err)
          else console.log('pow!')
      });
@@@ -19,36 -19,36 +19,3 @@@ Outpu
      pow!
  
  And now /tmp/foo/bar/baz exists, huzzah!
--
--methods
--=======
--
--var mkdirp = require('mkdirp');
--
--mkdirp(dir, mode, cb)
-----------------------
--
--Create a new directory and any necessary subdirectories at `dir` with octal
--permission string `mode`.
--
--If `mode` isn't specified, it defaults to `0777 & (~process.umask())`.
--
--mkdirp.sync(dir, mode)
------------------------
--
--Synchronously create a new directory and any necessary subdirectories at `dir`
--with octal permission string `mode`.
--
--If `mode` isn't specified, it defaults to `0777 & (~process.umask())`.
--
--install
--=======
--
--With [npm](http://npmjs.org) do:
--
--    npm install mkdirp
--
--license
--=======
--
--MIT/X11
index 871488f63f752e9bac11e11684660bc67605a036,871488f63f752e9bac11e11684660bc67605a036..6602801463aa8eca1be8a2490f4cf629a64dd320
@@@ -4,28 -4,28 +4,17 @@@ var fs = require('fs')
  module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
  
  function mkdirP (p, mode, f) {
--    if (typeof mode === 'function' || mode === undefined) {
--        f = mode;
--        mode = 0777 & (~process.umask());
--    }
--
--    // secret passalong argument.
--    var made = arguments[3] || null;
--
      var cb = f || function () {};
      if (typeof mode === 'string') mode = parseInt(mode, 8);
      p = path.resolve(p);
  
      fs.mkdir(p, mode, function (er) {
--        if (!er) {
--            made = made || p;
--            return cb(null, made);
--        }
++        if (!er) return cb();
          switch (er.code) {
              case 'ENOENT':
--                mkdirP(path.dirname(p), mode, function (er, made) {
--                    if (er) cb(er, made);
--                    else mkdirP(p, mode, cb, made);
++                mkdirP(path.dirname(p), mode, function (er) {
++                    if (er) cb(er);
++                    else mkdirP(p, mode, cb);
                  });
                  break;
  
                  fs.stat(p, function (er2, stat) {
                      // if the stat fails, then that's super weird.
                      // let the original EEXIST be the failure reason.
--                    if (er2 || !stat.isDirectory()) cb(er, made)
--                    else cb(null, made);
++                    if (er2 || !stat.isDirectory()) cb(er)
++                    else if ((stat.mode & 0777) !== mode) fs.chmod(p, mode, cb);
++                    else cb();
                  });
                  break;
  
              default:
--                cb(er, made);
++                cb(er);
                  break;
          }
      });
  }
--
--mkdirP.sync = function sync (p, mode) {
--    if (mode === undefined) {
--        mode = 0777 & (~process.umask());
--    }
--
--    // secret passalong argument
--    var made = arguments[2] || null;
--
--    if (typeof mode === 'string') mode = parseInt(mode, 8);
--    p = path.resolve(p);
--
--    try {
--        fs.mkdirSync(p, mode);
--        made = made || p;
--    }
--    catch (err0) {
--        switch (err0.code) {
--            case 'ENOENT' :
--                made = sync(path.dirname(p), mode, made);
--                sync(p, mode, made);
--                break;
--
--            case 'EEXIST' :
--                var stat;
--                try {
--                    stat = fs.statSync(p);
--                }
--                catch (err1) {
--                    throw err0;
--                }
--                if (!stat.isDirectory()) throw err0;
--                break;
--            default :
--                throw err0
--                break;
--        }
--    }
--
--    return made;
--};
index 2a40503c5f8cb500f0b20057431b01182ba8402b,2a40503c5f8cb500f0b20057431b01182ba8402b..99149f747d97b4cc95837991b1fbefef671b2666
@@@ -1,44 -1,44 +1,23 @@@
  {
--  "name": "mkdirp",
--  "description": "Recursively mkdir, like `mkdir -p`",
--  "version": "0.3.0",
--  "author": {
--    "name": "James Halliday",
--    "email": "mail@substack.net",
--    "url": "http://substack.net"
--  },
--  "main": "./index",
--  "keywords": [
--    "mkdir",
--    "directory"
--  ],
--  "repository": {
--    "type": "git",
--    "url": "git://github.com/substack/node-mkdirp.git"
--  },
--  "scripts": {
--    "test": "tap test/*.js"
--  },
--  "devDependencies": {
--    "tap": "0.2"
--  },
--  "license": "MIT/X11",
--  "engines": {
--    "node": "*"
--  },
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "mkdirp@0.3.0",
--  "dependencies": {},
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.13",
--  "_nodeVersion": "v0.7.7-pre",
--  "_defaultsLoaded": true,
--  "dist": {
--    "shasum": "a3cc6816e78b84f570caf9d95cb7368dc5d0bab8"
--  },
--  "_from": "../mkdirp"
++    "name" : "mkdirp",
++    "description" : "Recursively mkdir, like `mkdir -p`",
++    "version" : "0.1.0",
++    "author" : "James Halliday <mail@substack.net> (http://substack.net)",
++    "main" : "./index",
++    "keywords" : [
++        "mkdir",
++        "directory"
++    ],
++    "repository" : {
++        "type" : "git",
++        "url" : "http://github.com/substack/node-mkdirp.git"
++    },
++    "scripts" : {
++        "test" : "tap test/*.js"
++    },
++    "devDependencies" : {
++        "tap" : "0.0.x"
++    },
++    "license" : "MIT/X11",
++    "engines": { "node": "*" }
  }
index ba2ef0ae78cd5c9ea62d8f4b6c0ea8c7221f532b,ba2ef0ae78cd5c9ea62d8f4b6c0ea8c7221f532b..246044bcd993efbf24ea384f567fbc86f2f0368f
@@@ -5,14 -5,14 +5,6 @@@ var buffer = "
    , tty = require("tty")
    , StringDecoder = require("string_decoder").StringDecoder
  
--function raw (mode) {
--  try {
--    process.stdin.setRawMode(mode)
--  } catch (e) {
--    tty.setRawMode(mode)
--  }
--}
--
  function read (opts, cb) {
    if (!cb) cb = opts, opts = {}
  
@@@ -33,7 -33,7 +25,7 @@@
      cb = (function (cb) {
        var called = false
        var t = setTimeout(function () {
--        raw(false)
++        tty.setRawMode(false)
          process.stdout.write("\n")
          if (def) done(null, def)
          else done(new Error("timeout"))
@@@ -117,7 -117,7 +109,7 @@@ function rawRead (def, timeout, delim, 
      , val = ""
      , decoder = new StringDecoder
  
--  raw(true)
++  tty.setRawMode(true)
    stdin.resume()
    stdin.on("error", cb)
    stdin.on("data", function D (c) {
  
        case "\u0004": // EOF
        case delim:
--        raw(false)
++        tty.setRawMode(false)
          stdin.removeListener("data", D)
          stdin.removeListener("error", cb)
          val = val.trim() || def
          return cb(null, val)
  
        case "\u0003": case "\0": // ^C or other signal abort
--        raw(false)
++        tty.setRawMode(false)
          stdin.removeListener("data", D)
          stdin.removeListener("error", cb)
          stdin.pause()
index f206a719b3850e10c927cb94b300bc4c5e3c5922,f206a719b3850e10c927cb94b300bc4c5e3c5922..bc05577aac48417aa53c55f01cdd5a1adf1f05eb
@@@ -1,28 -1,28 +1,16 @@@
  {
    "name": "read",
--  "version": "0.0.2",
++  "version": "0.0.1",
    "main": "lib/read.js",
    "dependencies": {},
    "devDependencies": {},
    "engines": {
      "node": ">=0.6"
    },
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me/"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
    "description": "read(1) for node programs",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/read.git"
--  },
--  "license": "BSD",
--  "_id": "read@0.0.2",
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.15",
--  "_nodeVersion": "v0.7.7",
--  "_defaultsLoaded": true,
--  "_from": "read@0"
++  }
  }
index e5839b50e68c73a376f6f3cd17bd33b5e1e21dc2,e5839b50e68c73a376f6f3cd17bd33b5e1e21dc2..4ea89f794afa787f3cdf149c25dd3bc631d5a302
@@@ -38,7 -38,7 +38,7 @@@ request('http://google.com/doodle.png')
  You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types, in this case `application/json`, and use the proper content-type in the PUT request if one is not already provided in the headers.
  
  ```javascript
--fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
++fs.readStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
  ```
  
  Request can also pipe to itself. When doing so the content-type and content-length will be preserved in the PUT headers.
@@@ -146,7 -146,7 +146,6 @@@ request.post({url:url, oauth:oauth}, fu
  The first argument can be either a url or an options object. The only required option is uri, all others are optional.
  
  * `uri` || `url` - fully qualified uri or a parsed url object from url.parse()
--* `qs` - object containing querystring values to be appended to the uri
  * `method` - http method, defaults to GET
  * `headers` - http headers, defaults to {}
  * `body` - entity body for POST and PUT requests. Must be buffer or string.
  * `json` - sets `body` but to JSON representation of value and adds `Content-type: application/json` header.
  * `multipart` - (experimental) array of objects which contains their own headers and `body` attribute. Sends `multipart/related` request. See example below.
  * `followRedirect` - follow HTTP 3xx responses as redirects. defaults to true.
--* `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects. defaults to false.
  * `maxRedirects` - the maximum number of redirects to follow, defaults to 10.
  * `onResponse` - If true the callback will be fired on the "response" event instead of "end". If a function it will be called on "response" and not effect the regular semantics of the main callback on "end".
  * `encoding` - Encoding to be used on `setEncoding` of response data. If set to `null`, the body is returned as a Buffer.
index ac853c0d289a653bcc0ac2661e55eb979296a3ef,ac853c0d289a653bcc0ac2661e55eb979296a3ef..e6531a21b330aad62b3641427adb2ec9728cba2e
@@@ -1,11 -1,11 +1,8 @@@
  module.exports = ForeverAgent
--ForeverAgent.SSL = ForeverAgentSSL
  
  var util = require('util')
    , Agent = require('http').Agent
    , net = require('net')
--  , tls = require('tls')
--  , AgentSSL = require('https').Agent
  
  function ForeverAgent(options) {
    var self = this
        socket.destroy();
      }
    })
--
++  self.createConnection = net.createConnection
  }
  util.inherits(ForeverAgent, Agent)
  
  ForeverAgent.defaultMinSockets = 5
  
--
--ForeverAgent.prototype.createConnection = net.createConnection
  ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest
  ForeverAgent.prototype.addRequest = function(req, host, port) {
    var name = host + ':' + port
@@@ -87,17 -87,17 +82,3 @@@ ForeverAgent.prototype.removeSocket = f
      this.createSocket(name, host, port).emit('free');
    }
  }
--
--function ForeverAgentSSL (options) {
--  ForeverAgent.call(this, options)
--}
--util.inherits(ForeverAgentSSL, ForeverAgent)
--
--ForeverAgentSSL.prototype.createConnection = createConnectionSSL
--ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest
--
--function createConnectionSSL (port, host, options) {
--  options.port = port
--  options.host = host
--  return tls.connect(options)
--}
index 5a6bd9eb047c73adfa8830c63f31684b8fa6fd0c,5a6bd9eb047c73adfa8830c63f31684b8fa6fd0c..a25393ec3edfe6364882644d112ead739c37daae
@@@ -1,4 -1,4 +1,4 @@@
--// Copyright 2010-2012 Mikeal Rogers
++// Copyright 2010-2011 Mikeal Rogers
  //
  //    Licensed under the Apache License, Version 2.0 (the "License");
  //    you may not use this file except in compliance with the License.
@@@ -26,7 -26,7 +26,6 @@@ var http = require('http'
    , Cookie = require('./vendor/cookie')
    , CookieJar = require('./vendor/cookie/jar')
    , cookieJar = new CookieJar
--  , tunnel = require('./tunnel')
    ;
    
  if (process.logging) {
@@@ -68,9 -68,9 +67,7 @@@ function isReadStream (rs) 
  
  function copy (obj) {
    var o = {}
--  Object.keys(obj).forEach(function (i) {
--    o[i] = obj[i]
--  })
++  for (var i in obj) o[i] = obj[i]
    return o
  }
  
@@@ -86,31 -86,31 +83,24 @@@ function Request (options) 
    if (typeof options === 'string') {
      options = {uri:options}
    }
--  
--  var reserved = Object.keys(Request.prototype)
++
    for (var i in options) {
--    if (reserved.indexOf(i) === -1) {
--      this[i] = options[i]
--    } else {
--      if (typeof options[i] === 'function') {
--        delete options[i]
--      }
--    }
++    this[i] = options[i]
    }
--  options = copy(options)
--  
--  this.init(options)
++  if (!this.pool) this.pool = globalPool
++  this.dests = []
++  this.__isRequestRequest = true
  }
  util.inherits(Request, stream.Stream)
--Request.prototype.init = function (options) {
++Request.prototype.getAgent = function (host, port) {
++  if (!this.pool[host+':'+port]) {
++    this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port})
++  }
++  return this.pool[host+':'+port]
++}
++Request.prototype.request = function () {
    var self = this
--  
--  if (!options) options = {}
--  
--  if (!self.pool) self.pool = globalPool
--  self.dests = []
--  self.__isRequestRequest = true
--  
++
    // Protect against double callback
    if (!self._callback && self.callback) {
      self._callback = self.callback
    }
    if (self.proxy) {
      if (typeof self.proxy == 'string') self.proxy = url.parse(self.proxy)
--
--    // do the HTTP CONNECT dance using koichik/node-tunnel
--    if (http.globalAgent && self.uri.protocol === "https:") {
--      var tunnelFn = self.proxy.protocol === "http:"
--                   ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
--
--      var tunnelOptions = { proxy: { host: self.proxy.hostname
--                                   , port: +self.proxy.port
--                                   , proxyAuth: self.proxy.auth }
--                          , ca: this.ca }
--
--      self.agent = tunnelFn(tunnelOptions)
--      self.tunnel = true
--    }
    }
  
    self._redirectsFollowed = self._redirectsFollowed || 0
    self.maxRedirects = (self.maxRedirects !== undefined) ? self.maxRedirects : 10
    self.followRedirect = (self.followRedirect !== undefined) ? self.followRedirect : true
--  self.followAllRedirects = (self.followAllRedirects !== undefined) ? self.followAllRedirects : false;
--  if (self.followRedirect || self.followAllRedirects)
++  if (self.followRedirect)
      self.redirects = self.redirects || []
  
    self.headers = self.headers ? copy(self.headers) : {}
  
--  self.setHost = false
++  var setHost = false
    if (!self.headers.host) {
      self.headers.host = self.uri.hostname
      if (self.uri.port) {
             !(self.uri.port === 443 && self.uri.protocol === 'https:') )
        self.headers.host += (':'+self.uri.port)
      }
--    self.setHost = true
++    setHost = true
++  }
++
++  if (self.jar === false) {
++    // disable cookies
++    var cookies = false;
++    self._disableCookies = true;
++  } else if (self.jar) {
++    // fetch cookie from the user defined cookie jar
++    var cookies = self.jar.get({ url: self.uri.href })
++  } else {
++    // fetch cookie from the global cookie jar
++    var cookies = cookieJar.get({ url: self.uri.href })
++  }
++  if (cookies) {
++    var cookieString = cookies.map(function (c) {
++      return c.name + "=" + c.value;
++    }).join("; ");
++    
++    self.headers.Cookie = cookieString;
    }
--  
--  self.jar(self._jar || options.jar)
  
    if (!self.uri.pathname) {self.uri.pathname = '/'}
    if (!self.uri.port) {
      else if (self.uri.protocol == 'https:') {self.uri.port = 443}
    }
  
--  if (self.proxy && !self.tunnel) {
++  if (self.proxy) {
      self.port = self.proxy.port
      self.host = self.proxy.hostname
    } else {
      delete self.callback
    }
  
--  self.clientErrorHandler = function (error) {
--    if (self._aborted) return
--    
--    if (self.setHost) delete self.headers.host
--    if (self.req._reusedSocket && error.code === 'ECONNRESET'
--        && self.agent.addRequestNoreuse) {
--      self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
++  var clientErrorHandler = function (error) {
++    if (setHost) delete self.headers.host
++    if (self.req._reusedSocket && error.code === 'ECONNRESET') {
++      self.agent = {addRequest: ForeverAgent.prototype.addRequestNoreuse.bind(self.agent)}
        self.start()
        self.req.end()
        return
      }
--    if (self.timeout && self.timeoutTimer) {
--        clearTimeout(self.timeoutTimer);
--        self.timeoutTimer = null;
--    }
++    if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer)
      self.emit('error', error)
    }
    if (self.onResponse) self.on('error', function (e) {self.onResponse(e)})
    if (self.callback) self.on('error', function (e) {self.callback(e)})
  
--  if (options.form) {
--    self.form(options.form)
--  }
--
--  if (options.oauth) {
--    self.oauth(options.oauth)
++  if (self.form) {
++    self.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'
++    self.body = qs.stringify(self.form).toString('utf8')
++  }
++
++  if (self.oauth) {
++    var form
++    if (self.headers['content-type'] && 
++        self.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) ===
++          'application/x-www-form-urlencoded' 
++       ) {
++      form = qs.parse(self.body)
++    } 
++    if (self.uri.query) {
++      form = qs.parse(self.uri.query)
++    } 
++    if (!form) form = {}
++    var oa = {}
++    for (var i in form) oa[i] = form[i]
++    for (var i in self.oauth) oa['oauth_'+i] = self.oauth[i]
++    if (!oa.oauth_version) oa.oauth_version = '1.0'
++    if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString()
++    if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '')
++    
++    oa.oauth_signature_method = 'HMAC-SHA1'
++    
++    var consumer_secret = oa.oauth_consumer_secret
++    delete oa.oauth_consumer_secret
++    var token_secret = oa.oauth_token_secret
++    delete oa.oauth_token_secret
++    
++    var baseurl = self.uri.protocol + '//' + self.uri.host + self.uri.pathname
++    var signature = oauth.hmacsign(self.method, baseurl, oa, consumer_secret, token_secret)
++    
++    // oa.oauth_signature = signature
++    for (var i in form) {
++      if ( i.slice(0, 'oauth_') in self.oauth) {
++        // skip 
++      } else {
++        delete oa['oauth_'+i]
++      }
++    }
++    self.headers.authorization = 
++      'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',')
++    self.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"'  
    }
  
    if (self.uri.auth && !self.headers.authorization) {
      self.headers.authorization = "Basic " + toBase64(self.uri.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':'))
    }
--  if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) {
++  if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization']) {
      self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':'))
    }
  
--  if (options.qs) self.qs(options.qs)
--
    if (self.uri.path) {
      self.path = self.uri.path
    } else {
  
    if (self.path.length === 0) self.path = '/'
  
--  if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
++  if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
++
++  if (self.json) {
++    self.headers['content-type'] = 'application/json'
++    if (typeof self.json === 'boolean') {
++      if (typeof self.body === 'object') self.body = JSON.stringify(self.body)
++    } else {
++      self.body = JSON.stringify(self.json)
++    }
++
++  } else if (self.multipart) {
++    self.body = []
++
++    if (!self.headers['content-type']) {
++      self.headers['content-type'] = 'multipart/related;boundary="frontier"';
++    } else {
++      self.headers['content-type'] = self.headers['content-type'].split(';')[0] + ';boundary="frontier"';
++    }
++
++    if (!self.multipart.forEach) throw new Error('Argument error, options.multipart.')
  
--  if (options.json) {
--    self.json(options.json)
--  } else if (options.multipart) {
--    self.multipart(options.multipart)
++    self.multipart.forEach(function (part) {
++      var body = part.body
++      if(!body) throw Error('Body attribute missing in multipart.')
++      delete part.body
++      var preamble = '--frontier\r\n'
++      Object.keys(part).forEach(function(key){
++        preamble += key + ': ' + part[key] + '\r\n'
++      })
++      preamble += '\r\n'
++      self.body.push(new Buffer(preamble))
++      self.body.push(new Buffer(body))
++      self.body.push(new Buffer('\r\n'))
++    })
++    self.body.push(new Buffer('--frontier--'))
    }
  
    if (self.body) {
      }
    }
  
--  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
++  var protocol = self.proxy ? self.proxy.protocol : self.uri.protocol
      , defaultModules = {'http:':http, 'https:':https}
      , httpModules = self.httpModules || {}
      ;
  
    if (!self.httpModule) throw new Error("Invalid protocol")
  
--  if (options.ca) self.ca = options.ca
--
--  if (!self.agent) {
--    if (options.agentOptions) self.agentOptions = options.agentOptions
--
--    if (options.agentClass) {
--      self.agentClass = options.agentClass
--    } else if (options.forever) {
--      self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
--    } else {
--      self.agentClass = self.httpModule.Agent
--    }
--  }
--
    if (self.pool === false) {
      self.agent = false
    } else {
--    self.agent = self.agent || self.getAgent()
      if (self.maxSockets) {
        // Don't use our pooling if node has the refactored client
++      self.agent = self.agent || self.httpModule.globalAgent || self.getAgent(self.host, self.port)
        self.agent.maxSockets = self.maxSockets
      }
      if (self.pool.maxSockets) {
        // Don't use our pooling if node has the refactored client
++      self.agent = self.agent || self.httpModule.globalAgent || self.getAgent(self.host, self.port)
        self.agent.maxSockets = self.pool.maxSockets
      }
    }
  
++  self.start = function () {
++    self._started = true
++    self.method = self.method || 'GET'
++    self.href = self.uri.href
++    if (log) log('%method %href', self)
++    self.req = self.httpModule.request(self, function (response) {
++      self.response = response
++      response.request = self
++
++      if (self.httpModule === https &&
++          self.strictSSL &&
++          !response.client.authorized) {
++        var sslErr = response.client.authorizationError
++        self.emit('error', new Error('SSL Error: '+ sslErr))
++        return
++      }
++
++      if (setHost) delete self.headers.host
++      if (self.timeout && self.timeoutTimer) clearTimeout(self.timeoutTimer)
++      
++      if (response.headers['set-cookie'] && (!self._disableCookies)) {
++        response.headers['set-cookie'].forEach(function(cookie) {
++          if (self.jar) self.jar.add(new Cookie(cookie))
++          else cookieJar.add(new Cookie(cookie))
++        })
++      }
++
++      if (response.statusCode >= 300 &&
++          response.statusCode < 400  &&
++          self.followRedirect     &&
++          self.method !== 'PUT' &&
++          self.method !== 'POST' &&
++          response.headers.location) {
++        if (self._redirectsFollowed >= self.maxRedirects) {
++          self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop."))
++          return
++        }
++        self._redirectsFollowed += 1
++
++        if (!isUrl.test(response.headers.location)) {
++          response.headers.location = url.resolve(self.uri.href, response.headers.location)
++        }
++        self.uri = response.headers.location
++        self.redirects.push(
++          { statusCode : response.statusCode
++          , redirectUri: response.headers.location 
++          }
++        )
++        delete self.req
++        delete self.agent
++        delete self._started
++        if (self.headers) {
++          delete self.headers.host
++        }
++        if (log) log('Redirect to %uri', self)
++        request(self, self.callback)
++        return // Ignore the rest of the response
++      } else {
++        self._redirectsFollowed = self._redirectsFollowed || 0
++        // Be a good stream and emit end when the response is finished.
++        // Hack to emit end on close because of a core bug that never fires end
++        response.on('close', function () {
++          if (!self._ended) self.response.emit('end')
++        })
++
++        if (self.encoding) {
++          if (self.dests.length !== 0) {
++            console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.")
++          } else {
++            response.setEncoding(self.encoding)
++          }
++        }
++
++        self.pipeDest = function (dest) {
++          if (dest.headers) {
++            dest.headers['content-type'] = response.headers['content-type']
++            if (response.headers['content-length']) {
++              dest.headers['content-length'] = response.headers['content-length']
++            }
++          }
++          if (dest.setHeader) {
++            for (var i in response.headers) {
++              dest.setHeader(i, response.headers[i])
++            }
++            dest.statusCode = response.statusCode
++          }
++          if (self.pipefilter) self.pipefilter(response, dest)
++        }
++
++        self.dests.forEach(function (dest) {
++          self.pipeDest(dest)
++        })
++
++        response.on("data", function (chunk) {
++          self._destdata = true
++          self.emit("data", chunk)
++        })
++        response.on("end", function (chunk) {
++          self._ended = true
++          self.emit("end", chunk)
++        })
++        response.on("close", function () {self.emit("close")})
++
++        self.emit('response', response)
++
++        if (self.onResponse) {
++          self.onResponse(null, response)
++        }
++        if (self.callback) {
++          var buffer = []
++          var bodyLen = 0
++          self.on("data", function (chunk) {
++            buffer.push(chunk)
++            bodyLen += chunk.length
++          })
++          self.on("end", function () {
++            if (buffer.length && Buffer.isBuffer(buffer[0])) {
++              var body = new Buffer(bodyLen)
++              var i = 0
++              buffer.forEach(function (chunk) {
++                chunk.copy(body, i, 0, chunk.length)
++                i += chunk.length
++              })
++              if (self.encoding === null) {
++                response.body = body
++              } else {
++                response.body = body.toString()
++              }
++            } else if (buffer.length) {
++              response.body = buffer.join('')
++            }
++
++            if (self.json) {
++              try {
++                response.body = JSON.parse(response.body)
++              } catch (e) {}
++            }
++
++            self.callback(null, response, response.body)
++          })
++        }
++      }
++    })
++
++    if (self.timeout && !self.timeoutTimer) {
++      self.timeoutTimer = setTimeout(function() {
++        self.req.abort()
++        var e = new Error("ETIMEDOUT")
++        e.code = "ETIMEDOUT"
++        self.emit("error", e)
++      }, self.timeout)
++    }
++    
++    self.req.on('error', clientErrorHandler)
++  }
++
    self.once('pipe', function (src) {
      if (self.ntick) throw new Error("You cannot pipe to this stream after the first nextTick() after creation of the request stream.")
      self.src = src
    })
  
    process.nextTick(function () {
--    if (self._aborted) return
--    
      if (self.body) {
        if (Array.isArray(self.body)) {
          self.body.forEach(function(part) {
      self.ntick = true
    })
  }
--
--// Must call this when following a redirect from https to http or vice versa
--// Attempts to keep everything as identical as possible, but update the
--// httpModule, Tunneling agent, and/or Forever Agent in use.
--Request.prototype._updateProtocol = function () {
--  var self = this
--  var protocol = self.uri.protocol
--
--  if (protocol === 'https:') {
--    // previously was doing http, now doing https
--    // if it's https, then we might need to tunnel now.
--    if (self.proxy) {
--      self.tunnel = true
--      var tunnelFn = self.proxy.protocol === 'http:'
--                   ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
--      var tunnelOptions = { proxy: { host: self.proxy.hostname
--                                   , post: +self.proxy.port
--                                   , proxyAuth: self.proxy.auth }
--                          , ca: self.ca }
--      self.agent = tunnelFn(tunnelOptions)
--      return
--    }
--
--    self.httpModule = https
--    switch (self.agentClass) {
--      case ForeverAgent:
--        self.agentClass = ForeverAgent.SSL
--        break
--      case http.Agent:
--        self.agentClass = https.Agent
--        break
--      default:
--        // nothing we can do.  Just hope for the best.
--        return
--    }
--
--    // if there's an agent, we need to get a new one.
--    if (self.agent) self.agent = self.getAgent()
--
--  } else {
--    if (log) log('previously https, now http')
--    // previously was doing https, now doing http
--    // stop any tunneling.
--    if (self.tunnel) self.tunnel = false
--    self.httpModule = http
--    switch (self.agentClass) {
--      case ForeverAgent.SSL:
--        self.agentClass = ForeverAgent
--        break
--      case https.Agent:
--        self.agentClass = http.Agent
--        break
--      default:
--        // nothing we can do.  just hope for the best
--        return
--    }
--
--    // if there's an agent, then get a new one.
--    if (self.agent) {
--      self.agent = null
--      self.agent = self.getAgent()
--    }
--  }
--}
--
--Request.prototype.getAgent = function () {
--  var Agent = this.agentClass
--  var options = {}
--  if (this.agentOptions) {
--    for (var i in this.agentOptions) {
--      options[i] = this.agentOptions[i]
--    }
--  }
--  if (this.ca) options.ca = this.ca
--
--  var poolKey = ''
--
--  // different types of agents are in different pools
--  if (Agent !== this.httpModule.Agent) {
--    poolKey += Agent.name
--  }
--
--  if (!this.httpModule.globalAgent) {
--    // node 0.4.x
--    options.host = this.host
--    options.port = this.port
--    if (poolKey) poolKey += ':'
--    poolKey += this.host + ':' + this.port
--  }
--
--  // ca option is only relevant if proxy or destination are https
--  var proxy = this.proxy
--  if (typeof proxy === 'string') proxy = url.parse(proxy)
--  var caRelevant = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'
--  if (options.ca && caRelevant) {
--    if (poolKey) poolKey += ':'
--    poolKey += options.ca
--  }
--
--  if (!poolKey && Agent === this.httpModule.Agent && this.httpModule.globalAgent) {
--    // not doing anything special.  Use the globalAgent
--    return this.httpModule.globalAgent
--  }
--
--  // we're using a stored agent.  Make sure it's protocol-specific
--  poolKey = this.uri.protocol + poolKey
--
--  // already generated an agent for this setting
--  if (this.pool[poolKey]) return this.pool[poolKey]
--
--  return this.pool[poolKey] = new Agent(options)
--}
--
--Request.prototype.start = function () {
--  var self = this
--  
--  if (self._aborted) return
--  
--  self._started = true
--  self.method = self.method || 'GET'
--  self.href = self.uri.href
--  if (log) log('%method %href', self)
--  self.req = self.httpModule.request(self, function (response) {
--    if (self._aborted) return
--    if (self._paused) response.pause()
--    
--    self.response = response
--    response.request = self
--
--    if (self.httpModule === https &&
--        self.strictSSL &&
--        !response.client.authorized) {
--      var sslErr = response.client.authorizationError
--      self.emit('error', new Error('SSL Error: '+ sslErr))
--      return
--    }
--
--    if (self.setHost) delete self.headers.host
--    if (self.timeout && self.timeoutTimer) {
--        clearTimeout(self.timeoutTimer);
--        self.timeoutTimer = null;
--    }  
--    
--    if (response.headers['set-cookie'] && (!self._disableCookies)) {
--      response.headers['set-cookie'].forEach(function(cookie) {
--        if (self._jar) self._jar.add(new Cookie(cookie))
--        else cookieJar.add(new Cookie(cookie))
--      })
--    }
--
--    if (response.statusCode >= 300 && response.statusCode < 400  &&
--        (self.followAllRedirects ||
--         (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST' && self.method !== 'DELETE'))) &&
--        response.headers.location) {
--      if (self._redirectsFollowed >= self.maxRedirects) {
--        self.emit('error', new Error("Exceeded maxRedirects. Probably stuck in a redirect loop."))
--        return
--      }
--      self._redirectsFollowed += 1
--
--      if (!isUrl.test(response.headers.location)) {
--        response.headers.location = url.resolve(self.uri.href, response.headers.location)
--      }
--
--      var uriPrev = self.uri
--      self.uri = url.parse(response.headers.location)
--
--      // handle the case where we change protocol from https to http or vice versa
--      if (self.uri.protocol !== uriPrev.protocol) {
--        self._updateProtocol()
--      }
--
--      self.redirects.push(
--        { statusCode : response.statusCode
--        , redirectUri: response.headers.location 
--        }
--      )
--      self.method = 'GET'; // Force all redirects to use GET
--      delete self.req
--      delete self.agent
--      delete self._started
--      delete self.body
--      if (self.headers) {
--        delete self.headers.host
--      }
--      if (log) log('Redirect to %uri', self)
--      self.init()
--      return // Ignore the rest of the response
--    } else {
--      self._redirectsFollowed = self._redirectsFollowed || 0
--      // Be a good stream and emit end when the response is finished.
--      // Hack to emit end on close because of a core bug that never fires end
--      response.on('close', function () {
--        if (!self._ended) self.response.emit('end')
--      })
--
--      if (self.encoding) {
--        if (self.dests.length !== 0) {
--          console.error("Ingoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.")
--        } else {
--          response.setEncoding(self.encoding)
--        }
--      }
--
--      self.dests.forEach(function (dest) {
--        self.pipeDest(dest)
--      })
--
--      response.on("data", function (chunk) {
--        self._destdata = true
--        self.emit("data", chunk)
--      })
--      response.on("end", function (chunk) {
--        self._ended = true
--        self.emit("end", chunk)
--      })
--      response.on("close", function () {self.emit("close")})
--
--      self.emit('response', response)
--
--      if (self.onResponse) {
--        self.onResponse(null, response)
--      }
--      if (self.callback) {
--        var buffer = []
--        var bodyLen = 0
--        self.on("data", function (chunk) {
--          buffer.push(chunk)
--          bodyLen += chunk.length
--        })
--        self.on("end", function () {
--          if (self._aborted) return
--          
--          if (buffer.length && Buffer.isBuffer(buffer[0])) {
--            var body = new Buffer(bodyLen)
--            var i = 0
--            buffer.forEach(function (chunk) {
--              chunk.copy(body, i, 0, chunk.length)
--              i += chunk.length
--            })
--            if (self.encoding === null) {
--              response.body = body
--            } else {
--              response.body = body.toString()
--            }
--          } else if (buffer.length) {
--            response.body = buffer.join('')
--          }
--
--          if (self._json) {
--            try {
--              response.body = JSON.parse(response.body)
--            } catch (e) {}
--          }
--
--          self.callback(null, response, response.body)
--        })
--      }
--    }
--  })
--
--  if (self.timeout && !self.timeoutTimer) {
--    self.timeoutTimer = setTimeout(function() {
--      self.req.abort()
--      var e = new Error("ETIMEDOUT")
--      e.code = "ETIMEDOUT"
--      self.emit("error", e)
--    }, self.timeout)
--    
--    // Set additional timeout on socket - in case if remote
--    // server freeze after sending headers
--    if (self.req.setTimeout) { // only works on node 0.6+
--      self.req.setTimeout(self.timeout, function(){
--          if (self.req) {
--              self.req.abort()
--              var e = new Error("ESOCKETTIMEDOUT")
--              e.code = "ESOCKETTIMEDOUT"
--              self.emit("error", e)
--          }
--      })
--    }
--  }
--  
--  self.req.on('error', self.clientErrorHandler)
--  
--  self.emit('request', self.req)
--}
--
--Request.prototype.abort = function() {
--  this._aborted = true;
--  
--  if (this.req) {
--    this.req.abort()
--  }
--  else if (this.response) {
--    this.response.abort()
--  }
--  
--  this.emit("abort")
--}
--
--Request.prototype.pipeDest = function (dest) {
--  var response = this.response
--  // Called after the response is received
--  if (dest.headers) {
--    dest.headers['content-type'] = response.headers['content-type']
--    if (response.headers['content-length']) {
--      dest.headers['content-length'] = response.headers['content-length']
--    }
--  }
--  if (dest.setHeader) {
--    for (var i in response.headers) {
--      dest.setHeader(i, response.headers[i])
--    }
--    dest.statusCode = response.statusCode
--  }
--  if (this.pipefilter) this.pipefilter(response, dest)
--}
--
--// Composable API
--Request.prototype.setHeader = function (name, value, clobber) {
--  if (clobber === undefined) clobber = true
--  if (clobber || !this.headers.hasOwnProperty(name)) this.headers[name] = value
--  else this.headers[name] += ',' + value
--  return this
--}
--Request.prototype.setHeaders = function (headers) {
--  for (i in headers) {this.setHeader(i, headers[i])}
--  return this
--}
--Request.prototype.qs = function (q, clobber) {
--  var base
--  if (!clobber && this.uri.query) base = qs.parse(this.uri.query)
--  else base = {}
--  
--  for (var i in q) {
--    base[i] = q[i]
--  }
--  
--  this.uri = url.parse(this.uri.href.split('?')[0] + '?' + qs.stringify(base))
--  this.url = this.uri
--  
--  return this
--}
--Request.prototype.form = function (form) {
--  this.headers['content-type'] = 'application/x-www-form-urlencoded; charset=utf-8'
--  this.body = qs.stringify(form).toString('utf8')
--  return this
--}
--Request.prototype.multipart = function (multipart) {
--  var self = this
--  self.body = []
--
--  if (!self.headers['content-type']) {
--    self.headers['content-type'] = 'multipart/related;boundary="frontier"';
--  } else {
--    self.headers['content-type'] = self.headers['content-type'].split(';')[0] + ';boundary="frontier"';
--  }
--
--  if (!multipart.forEach) throw new Error('Argument error, options.multipart.')
--
--  multipart.forEach(function (part) {
--    var body = part.body
--    if(!body) throw Error('Body attribute missing in multipart.')
--    delete part.body
--    var preamble = '--frontier\r\n'
--    Object.keys(part).forEach(function(key){
--      preamble += key + ': ' + part[key] + '\r\n'
--    })
--    preamble += '\r\n'
--    self.body.push(new Buffer(preamble))
--    self.body.push(new Buffer(body))
--    self.body.push(new Buffer('\r\n'))
--  })
--  self.body.push(new Buffer('--frontier--'))
--  return self
--}
--Request.prototype.json = function (val) {
--  this.setHeader('content-type', 'application/json')
--  this.setHeader('accept', 'application/json')
--  this._json = true
--  if (typeof val === 'boolean') {
--    if (typeof this.body === 'object') this.body = JSON.stringify(this.body)
--  } else {
--    this.body = JSON.stringify(val)
--  }
--  return this
--}
--Request.prototype.oauth = function (_oauth) {
--  var form
--  if (this.headers['content-type'] && 
--      this.headers['content-type'].slice(0, 'application/x-www-form-urlencoded'.length) ===
--        'application/x-www-form-urlencoded' 
--     ) {
--    form = qs.parse(this.body)
--  }
--  if (this.uri.query) {
--    form = qs.parse(this.uri.query)
--  } 
--  if (!form) form = {}
--  var oa = {}
--  for (var i in form) oa[i] = form[i]
--  for (var i in _oauth) oa['oauth_'+i] = _oauth[i]
--  if (!oa.oauth_version) oa.oauth_version = '1.0'
--  if (!oa.oauth_timestamp) oa.oauth_timestamp = Math.floor( (new Date()).getTime() / 1000 ).toString()
--  if (!oa.oauth_nonce) oa.oauth_nonce = uuid().replace(/-/g, '')
--  
--  oa.oauth_signature_method = 'HMAC-SHA1'
--  
--  var consumer_secret = oa.oauth_consumer_secret
--  delete oa.oauth_consumer_secret
--  var token_secret = oa.oauth_token_secret
--  delete oa.oauth_token_secret
--  
--  var baseurl = this.uri.protocol + '//' + this.uri.host + this.uri.pathname
--  var signature = oauth.hmacsign(this.method, baseurl, oa, consumer_secret, token_secret)
--  
--  // oa.oauth_signature = signature
--  for (var i in form) {
--    if ( i.slice(0, 'oauth_') in _oauth) {
--      // skip 
--    } else {
--      delete oa['oauth_'+i]
--    }
--  }
--  this.headers.authorization = 
--    'OAuth '+Object.keys(oa).sort().map(function (i) {return i+'="'+oauth.rfc3986(oa[i])+'"'}).join(',')
--  this.headers.authorization += ',oauth_signature="'+oauth.rfc3986(signature)+'"'
--  return this
--}
--Request.prototype.jar = function (jar) {
--  var cookies
--  
--  if (this._redirectsFollowed === 0) {
--    this.originalCookieHeader = this.headers.cookie
--  }
--  
--  if (jar === false) {
--    // disable cookies
--    cookies = false;
--    this._disableCookies = true;
--  } else if (jar) {
--    // fetch cookie from the user defined cookie jar
--    cookies = jar.get({ url: this.uri.href })
--  } else {
--    // fetch cookie from the global cookie jar
--    cookies = cookieJar.get({ url: this.uri.href })
--  }
--  
--  if (cookies && cookies.length) {
--    var cookieString = cookies.map(function (c) {
--      return c.name + "=" + c.value
--    }).join("; ")
--
--    if (this.originalCookieHeader) {
--      // Don't overwrite existing Cookie header
--      this.headers.cookie = this.originalCookieHeader + '; ' + cookieString
--    } else {
--      this.headers.cookie = cookieString
--    }
--  }
--  this._jar = jar
--  return this
--}
--
--
--// Stream API
--Request.prototype.pipe = function (dest, opts) {
++Request.prototype.pipe = function (dest) {
    if (this.response) {
      if (this._destdata) {
        throw new Error("You cannot pipe after data has been emitted from the response.")
      } else if (this._ended) {
        throw new Error("You cannot pipe after the response has been ended.")
      } else {
--      stream.Stream.prototype.pipe.call(this, dest, opts)
++      stream.Stream.prototype.pipe.call(this, dest)
        this.pipeDest(dest)
        return dest
      }
    } else {
      this.dests.push(dest)
--    stream.Stream.prototype.pipe.call(this, dest, opts)
++    stream.Stream.prototype.pipe.call(this, dest)
      return dest
    }
  }
  Request.prototype.write = function () {
    if (!this._started) this.start()
++  if (!this.req) throw new Error("This request has been piped before http.request() was called.")
    this.req.write.apply(this.req, arguments)
  }
--Request.prototype.end = function (chunk) {
--  if (chunk) this.write(chunk)
++Request.prototype.end = function () {
    if (!this._started) this.start()
--  this.req.end()
++  if (!this.req) throw new Error("This request has been piped before http.request() was called.")
++  this.req.end.apply(this.req, arguments)
  }
  Request.prototype.pause = function () {
--  if (!this.response) this._paused = true
--  else this.response.pause.apply(this.response, arguments)
++  if (!this.response) throw new Error("This request has been piped before http.request() was called.")
++  this.response.pause.apply(this.response, arguments)
  }
  Request.prototype.resume = function () {
--  if (!this.response) this._paused = false
--  else this.response.resume.apply(this.response, arguments)
--}
--Request.prototype.destroy = function () {
--  if (!this._ended) this.end()
++  if (!this.response) throw new Error("This request has been piped before http.request() was called.")
++  this.response.resume.apply(this.response, arguments)
  }
  
--// organize params for post, put, head, del
--function initParams(uri, options, callback) {
--  if ((typeof options === 'function') && !callback) callback = options;
--  if (typeof options === 'object') {
--    options.uri = uri;
--  } else if (typeof uri === 'string') {
--    options = {uri:uri};
--  } else {
--    options = uri;
--    uri = options.uri;
--  }
--  return { uri: uri, options: options, callback: callback };
--}
--
--function request (uri, options, callback) {
--  if (typeof uri === 'undefined') throw new Error('undefined is not a valid uri or options object.')
--  if ((typeof options === 'function') && !callback) callback = options;
--  if (typeof options === 'object') {
--    options.uri = uri;
--  } else if (typeof uri === 'string') {
--    options = {uri:uri};
--  } else {
--    options = uri;
--  }
--
--  if (callback) options.callback = callback;
++function request (options, callback) {
++  if (typeof options === 'string') options = {uri:options}
++  if (callback) options.callback = callback
    var r = new Request(options)
++  r.request()
    return r
  }
  
@@@ -886,12 -886,12 +588,12 @@@ module.exports = reques
  
  request.defaults = function (options) {
    var def = function (method) {
--    var d = function (uri, opts, callback) {
--      var params = initParams(uri, opts, callback);
++    var d = function (opts, callback) {
++      if (typeof opts === 'string') opts = {uri:opts}
        for (var i in options) {
--        if (params.options[i] === undefined) params.options[i] = options[i]
++        if (opts[i] === undefined) opts[i] = options[i]
        }
--      return method(params.uri, params.options, params.callback)
++      return method(opts, callback)
      }
      return d
    }
  
  request.forever = function (agentOptions, optionsArg) {
    var options = {}
--  if (optionsArg) {
++  if (agentOptions) {
      for (option in optionsArg) {
        options[option] = optionsArg[option]
      }
    }
--  if (agentOptions) options.agentOptions = agentOptions
--  options.forever = true
++  options.agent = new ForeverAgent(agentOptions)
    return request.defaults(options)
  }
  
  request.get = request
--request.post = function (uri, options, callback) {
--  var params = initParams(uri, options, callback);
--  params.options.method = 'POST';
--  return request(params.uri || null, params.options, params.callback)
--}
--request.put = function (uri, options, callback) {
--  var params = initParams(uri, options, callback);
--  params.options.method = 'PUT'
--  return request(params.uri || null, params.options, params.callback)
--}
--request.head = function (uri, options, callback) {
--  var params = initParams(uri, options, callback);
--  params.options.method = 'HEAD'
--  if (params.options.body || 
--      params.options.requestBodyStream || 
--      (params.options.json && typeof params.options.json !== 'boolean') || 
--      params.options.multipart) {
++request.post = function (options, callback) {
++  if (typeof options === 'string') options = {uri:options}
++  options.method = 'POST'
++  return request(options, callback)
++}
++request.put = function (options, callback) {
++  if (typeof options === 'string') options = {uri:options}
++  options.method = 'PUT'
++  return request(options, callback)
++}
++request.head = function (options, callback) {
++  if (typeof options === 'string') options = {uri:options}
++  options.method = 'HEAD'
++  if (options.body || options.requestBodyStream || options.json || options.multipart) {
      throw new Error("HTTP HEAD requests MUST NOT include a request body.")
    }
--  return request(params.uri || null, params.options, params.callback)
++  return request(options, callback)
  }
--request.del = function (uri, options, callback) {
--  var params = initParams(uri, options, callback);
--  params.options.method = 'DELETE'
--  return request(params.uri || null, params.options, params.callback)
++request.del = function (options, callback) {
++  if (typeof options === 'string') options = {uri:options}
++  options.method = 'DELETE'
++  return request(options, callback)
  }
  request.jar = function () {
    return new CookieJar
  }
  request.cookie = function (str) {
--  if (str && str.uri) str = str.uri
    if (typeof str !== 'string') throw new Error("The cookie function only accepts STRING as param")
    return new Cookie(str)
  }
index 59b21b419c211b5ca1c151dbcc2f0376e79d966f,59b21b419c211b5ca1c151dbcc2f0376e79d966f..86910064c999181e2acab1ee48670b62852b0093
@@@ -1,6 -1,6 +1,5 @@@
  // from http://github.com/felixge/node-paperboy
  exports.types = {
--  "3gp":"video/3gpp",
    "aiff":"audio/x-aiff",
    "arj":"application/x-arj-compressed",
    "asf":"video/x-ms-asf",
    "lzh":"application/octet-stream",
    "m":"text/plain",
    "m3u":"audio/x-mpegurl",
--  "m4v":"video/mp4",
    "man":"application/x-troff-man",
    "me":"application/x-troff-me",
    "midi":"audio/midi",
    "mif":"application/x-mif",
    "mime":"www/mime",
--  "mkv":"  video/x-matrosk",
    "movie":"video/x-sgi-movie",
++  "mustache":"text/plain",
    "mp4":"video/mp4",
--  "mp41":"video/mp4",
--  "mp42":"video/mp4",
    "mpg":"video/mpeg",
    "mpga":"audio/mpeg",
    "ms":"application/x-troff-ms",
--  "mustache":"text/plain",
    "nc":"application/x-netcdf",
    "oda":"application/oda",
    "ogm":"application/ogg",
    "vrm":"x-world/x-vrml",
    "wav":"audio/x-wav",
    "wax":"audio/x-ms-wax",
--  "webm":"video/webm",
    "wma":"audio/x-ms-wma",
    "wmv":"video/x-ms-wmv",
    "wmx":"video/x-ms-wmx",
    "xpm":"image/x-xpixmap",
    "xwd":"image/x-xwindowdump",
    "xyz":"chemical/x-pdb",
--  "zip":"application/zip"
++  "zip":"application/zip",
  };
  
  exports.lookup = function(ext, defaultType) {
index 31b9dc65fe3902b1751b3e3c9eb3ca8352830a09,31b9dc65fe3902b1751b3e3c9eb3ca8352830a09..25db66977531925b4b60add4b00bb5e390c28e5b
@@@ -19,7 -19,7 +19,7 @@@ function rfc3986 (str) 
  function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret, body) {
    // adapted from https://dev.twitter.com/docs/auth/oauth
    var base = 
--    (httpMethod || 'GET') + "&" +
++    httpMethod + "&" +
      encodeURIComponent(  base_uri ) + "&" +
      Object.keys(params).sort().map(function (i) {
        // big WTF here with the escape + encoding but it's what twitter wants
index 0e6ddc5d8505e2f81601b1380525568b3ba50052,0e6ddc5d8505e2f81601b1380525568b3ba50052..e7b899a8b1b5b7ca4a2caa02a7732b32e6f1df71
@@@ -1,45 -1,45 +1,15 @@@
--{
--  "name": "request",
--  "description": "Simplified HTTP request client.",
--  "tags": [
--    "http",
--    "simple",
--    "util",
--    "utility"
--  ],
--  "version": "2.9.153",
--  "author": {
--    "name": "Mikeal Rogers",
--    "email": "mikeal.rogers@gmail.com"
--  },
--  "repository": {
--    "type": "git",
--    "url": "git://github.com/mikeal/request.git"
--  },
--  "bugs": {
--    "url": "http://github.com/mikeal/request/issues"
--  },
--  "engines": [
--    "node >= 0.3.6"
--  ],
--  "main": "./main",
--  "scripts": {
--    "test": "node tests/run.js"
--  },
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "request@2.9.153",
--  "dependencies": {},
--  "devDependencies": {},
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.8",
--  "_nodeVersion": "v0.6.12",
--  "_defaultsLoaded": true,
--  "dist": {
--    "shasum": "6f07c2ba3acfbe0cfe941f43647102740f05ff73"
--  },
--  "_from": "../request"
++{ "name" : "request"
++, "description" : "Simplified HTTP request client."
++, "tags" : ["http", "simple", "util", "utility"]
++, "version" : "2.9.3"
++, "author" : "Mikeal Rogers <mikeal.rogers@gmail.com>"
++, "repository" :
++  { "type" : "git"
++  , "url" : "http://github.com/mikeal/request.git"
++  }
++, "bugs" :
++  { "url" : "http://github.com/mikeal/request/issues" }
++, "engines" : ["node >= 0.3.6"]
++, "main" : "./main"
++, "scripts": { "test": "bash tests/run.sh" }
  }
index ff44b3e6292297f56331176928356210f755179c,ff44b3e6292297f56331176928356210f755179c..1eb2eaa22088d692c18b3e1df0e79c71162c3048
@@@ -21,27 -21,27 +21,22 @@@ var url = require('url')
  var Cookie = exports = module.exports = function Cookie(str, req) {
    this.str = str;
  
++  // First key is the name
++  this.name = str.substr(0, str.indexOf('=')).trim();
++
    // Map the key/val pairs
    str.split(/ *; */).reduce(function(obj, pair){
     var p = pair.indexOf('=');
--   var key = p > 0 ? pair.substring(0, p).trim() : pair.trim();
--   var lowerCasedKey = key.toLowerCase();
--   var value = p > 0 ? pair.substring(p + 1).trim() : true;
--
--   if (!obj.name) {
--    // First key is the name
--    obj.name = key;
--    obj.value = value;
--   }
--   else if (lowerCasedKey === 'httponly') {
--    obj.httpOnly = value;
--   }
--   else {
--    obj[lowerCasedKey] = value;
--   }
++   if(p > 0)
++    obj[pair.substring(0, p).trim()] = pair.substring(p + 1).trim();
++   else
++    obj[pair.trim()] = true;
     return obj;
    }, this);
  
++  // Assign value
++  this.value = this[this.name];
++
    // Expires
    this.expires = this.expires
      ? new Date(this.expires)
index 247b75437378b5a08a7e89a4059d562f6d1ffefc,247b75437378b5a08a7e89a4059d562f6d1ffefc..008cbe7dd9a19b2e61c4eea341a33aa7e7eee7bc
@@@ -3,4 -3,4 +3,3 @@@ Isaac Z. Schlueter <i@izs.me> (http://b
  Wayne Larsen <wayne@larsen.st> (http://github.com/wvl)
  ritch <skawful@gmail.com>
  Marcel Laverdet
--Yosef Dinerstein <yosefd@microsoft.com>
index 96ce9b2a0bdae6384d9cd9fc3334e7773579fc95,96ce9b2a0bdae6384d9cd9fc3334e7773579fc95..99983dc43716cab1750ab5bcddd8f217d100cd46
@@@ -4,7 -4,7 +4,7 @@@ Install with `npm install rimraf`, or j
  
  ## API
  
--`rimraf(f, callback)`
++`rimraf(f, [options,] callback)`
  
  The callback will be called with an error if there is one.  Certain
  errors are handled for you:
  * `EMFILE` - If too many file descriptors get opened, rimraf will
    patiently wait until more become available.
  
++## Options
++
++The options object is optional.  These fields are respected:
++
++* `maxBusyTries` -  The number of times to retry a file or folder in the
++  event of an `EBUSY` error.  The default is 3.
++* `gently` - If provided a `gently` path, then rimraf will only delete
++  files and folders that are beneath this path, and only delete symbolic
++  links that point to a place within this path.  (This is very important
++  to npm's use-case, and shows rimraf's pedigree.)
++
  
  ## rimraf.sync
  
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..8812a6b44984fd0cab6adff103fab741e64b5b1a
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,86 @@@
++// fiber/future port originally written by Marcel Laverdet
++// https://gist.github.com/1131093
++// I updated it to bring to feature parity with cb version.
++// The bugs are probably mine, not Marcel's.
++// -- isaacs
++
++var path = require('path')
++  , fs = require('fs')
++  , Future = require('fibers/future')
++
++// Create future-returning fs functions
++var fs2 = {}
++for (var ii in fs) {
++  fs2[ii] = Future.wrap(fs[ii])
++}
++
++// Return a future which just pauses for a certain amount of time
++
++function timer (ms) {
++  var future = new Future
++  setTimeout(function () {
++    future.return()
++  }, ms)
++  return future
++}
++
++function realish (p) {
++  return path.resolve(path.dirname(fs2.readlink(p)))
++}
++
++// for EMFILE backoff.
++var timeout = 0
++  , EMFILE_MAX = 1000
++
++function rimraf_ (p, opts) {
++  opts = opts || {}
++  opts.maxBusyTries = opts.maxBusyTries || 3
++  if (opts.gently) opts.gently = path.resolve(opts.gently)
++  var busyTries = 0
++
++  // exits by throwing or returning.
++  // loops on handled errors.
++  while (true) {
++    try {
++      var stat = fs2.lstat(p).wait()
++
++      // check to make sure that symlinks are ours.
++      if (opts.gently) {
++        var rp = stat.isSymbolicLink() ? realish(p) : path.resolve(p)
++        if (rp.indexOf(opts.gently) !== 0) {
++          var er = new Error("Refusing to delete: "+p+" not in "+opts.gently)
++          er.errno = require("constants").EEXIST
++          er.code = "EEXIST"
++          er.path = p
++          throw er
++        }
++      }
++
++      if (!stat.isDirectory()) return fs2.unlink(p).wait()
++
++      var rimrafs = fs2.readdir(p).wait().map(function (file) {
++        return rimraf(path.join(p, file), opts)
++      })
++
++      Future.wait(rimrafs)
++      fs2.rmdir(p).wait()
++      timeout = 0
++      return
++
++    } catch (er) {
++      if (er.message.match(/^EMFILE/) && timeout < EMFILE_MAX) {
++        timer(timeout++).wait()
++      } else if (er.message.match(/^EBUSY/)
++                 && busyTries < opt.maxBusyTries) {
++        timer(++busyTries * 100).wait()
++      } else if (er.message.match(/^ENOENT/)) {
++        // already gone
++        return
++      } else {
++        throw er
++      }
++    }
++  }
++}
++
++var rimraf = module.exports = rimraf_.future()
index 952bc8af9fc5aba74dcd7254071269e992383403,952bc8af9fc5aba74dcd7254071269e992383403..2b69536ef982e0569e81acba48f8b4b17c70f1d7
@@@ -1,10 -1,10 +1,9 @@@
  {"name":"rimraf"
--,"version":"2.0.1"
++,"version":"1.0.9"
  ,"main":"rimraf.js"
  ,"description":"A deep deletion module for node (like `rm -rf`)"
  ,"author":"Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)"
  ,"license":
    {"type":"MIT", "url": "https://github.com/isaacs/rimraf/raw/master/LICENSE"}
--,"optionalDependencies":{"graceful-fs":"~1.1"}
  ,"repository":"git://github.com/isaacs/rimraf.git"
  ,"scripts":{"test":"cd test && bash run.sh"}}
index 67d018ab4a3a3a1d22f643d3d53666fce41aa5f7,67d018ab4a3a3a1d22f643d3d53666fce41aa5f7..e8104e9e4b3bf8e7fa1d232d2ade3bc41e2578a2
@@@ -16,30 -16,30 +16,34 @@@ var lstat = process.platform === "win32
  
  // for EMFILE handling
  var timeout = 0
--exports.EMFILE_MAX = 1000
--exports.BUSYTRIES_MAX = 3
++  , EMFILE_MAX = 1000
  
--function rimraf (p, cb) {
++function rimraf (p, opts, cb) {
++  if (typeof opts === "function") cb = opts, opts = {}
  
    if (!cb) throw new Error("No callback passed to rimraf()")
++  if (!opts) opts = {}
  
    var busyTries = 0
++  opts.maxBusyTries = opts.maxBusyTries || 3
  
--  rimraf_(p, function CB (er) {
++  if (opts.gently) opts.gently = path.resolve(opts.gently)
++
++  rimraf_(p, opts, function CB (er) {
      if (er) {
--      if (er.code === "EBUSY" && busyTries < exports.BUSYTRIES_MAX) {
--        var time = (exports.BUSYTRIES_MAX - busyTries) * 100
++      if (er.code === "EBUSY" && busyTries < opts.maxBusyTries) {
++        var time = (opts.maxBusyTries - busyTries) * 100
          busyTries ++
          // try again, with the same exact callback as this one.
          return setTimeout(function () {
--          rimraf_(p, CB)
++          rimraf_(p, opts, CB)
          })
        }
  
        // this one won't happen if graceful-fs is used.
--      if (er.code === "EMFILE" && timeout < exports.EMFILE_MAX) {
++      if (er.code === "EMFILE" && timeout < EMFILE_MAX) {
          return setTimeout(function () {
--          rimraf_(p, CB)
++          rimraf_(p, opts, CB)
          }, timeout ++)
        }
  
@@@ -52,8 -52,8 +56,9 @@@
    })
  }
  
--function rimraf_ (p, cb) {
++function rimraf_ (p, opts, cb) {
    fs[lstat](p, function (er, s) {
++    // if the stat fails, then assume it's already gone.
      if (er) {
        // already gone
        if (er.code === "ENOENT") return cb()
        return cb(er)
      }
  
--    return rm_(p, s, false, cb)
++    // don't delete that don't point actually live in the "gently" path
++    if (opts.gently) return clobberTest(p, s, opts, cb)
++    return rm_(p, s, opts, cb)
    })
  }
  
--
--var myGid = function myGid () {
--  var g = process.getuid && process.getgid()
--  myGid = function myGid () { return g }
--  return g
--}
--
--var myUid = function myUid () {
--  var u = process.getuid && process.getuid()
--  myUid = function myUid () { return u }
--  return u
--}
--
--
--function writable (s) {
--  var mode = s.mode || 0777
--    , uid = myUid()
--    , gid = myGid()
--  return (mode & 0002)
--      || (gid === s.gid && (mode & 0020))
--      || (uid === s.uid && (mode & 0200))
--}
--
--function rm_ (p, s, didWritableCheck, cb) {
--  if (!didWritableCheck && !writable(s)) {
--    // make file writable
--    // user/group/world, doesn't matter at this point
--    // since it's about to get nuked.
--    return fs.chmod(p, s.mode | 0222, function (er) {
--      if (er) return cb(er)
--      rm_(p, s, true, cb)
--    })
--  }
--
--  if (!s.isDirectory()) {
--    return fs.unlink(p, cb)
--  }
--
--  // directory
++function rm_ (p, s, opts, cb) {
++  if (!s.isDirectory()) return fs.unlink(p, cb)
    fs.readdir(p, function (er, files) {
      if (er) return cb(er)
      asyncForEach(files.map(function (f) {
        return path.join(p, f)
      }), function (file, cb) {
--      rimraf(file, cb)
++      rimraf(file, opts, cb)
      }, function (er) {
        if (er) return cb(er)
        fs.rmdir(p, cb)
    })
  }
  
++function clobberTest (p, s, opts, cb) {
++  var gently = opts.gently
++  if (!s.isSymbolicLink()) next(null, path.resolve(p))
++  else realish(p, next)
++
++  function next (er, rp) {
++    if (er) return rm_(p, s, cb)
++    if (rp.indexOf(gently) !== 0) return clobberFail(p, gently, cb)
++    else return rm_(p, s, opts, cb)
++  }
++}
++
++function realish (p, cb) {
++  fs.readlink(p, function (er, r) {
++    if (er) return cb(er)
++    return cb(null, path.resolve(path.dirname(p), r))
++  })
++}
++
++function clobberFail (p, g, cb) {
++  var er = new Error("Refusing to delete: "+p+" not in "+g)
++    , constants = require("constants")
++  er.errno = constants.EEXIST
++  er.code = "EEXIST"
++  er.path = p
++  return cb(er)
++}
++
  function asyncForEach (list, fn, cb) {
    if (!list.length) cb()
    var c = list.length
@@@ -139,13 -139,13 +137,7 @@@ function rimrafSync (p) 
      if (er.code === "ENOENT") return
      throw er
    }
--
--  if (!writable(s)) {
--    fs.chmodSync(p, s.mode | 0222)
--  }
--
    if (!s.isDirectory()) return fs.unlinkSync(p)
--
    fs.readdirSync(p).forEach(function (f) {
      rimrafSync(path.join(p, f))
    })
index c34a81e21f85120f949ca7bc4c49b22bcc03d5dd,c34a81e21f85120f949ca7bc4c49b22bcc03d5dd..e45974c723f07e627c1698ad7ec7596f22708fc5
@@@ -24,10 -24,10 +24,6 @@@ function Extract (opts) 
    opts.type = "Directory"
    opts.Directory = true
  
--  // similar to --strip or --strip-components
--  opts.strip = +opts.strip
--  if (!opts.strip || opts.strip <= 0) opts.strip = 0
--
    this._fst = fstream.Writer(opts)
  
    this.pause()
    // of the tarball.  So, they need to be resolved against
    // the target directory in order to be created properly.
    me.on("entry", function (entry) {
--    // if there's a "strip" argument, then strip off that many
--    // path components.
--    if (opts.strip) {
--      var p = entry.path.split("/").slice(opts.strip).join("/")
--      entry.path = entry.props.path = p
--      if (entry.linkpath) {
--        var lp = entry.linkpath.split("/").slice(opts.strip).join("/")
--        entry.linkpath = entry.props.linkpath = lp
--      }
--    }
      if (entry.type !== "Link") return
      entry.linkpath = entry.props.linkpath =
        path.join(opts.path, path.join("/", entry.props.linkpath))
index 849d0d69180bc189ea9f8a221846d6d24a3eb4f6,849d0d69180bc189ea9f8a221846d6d24a3eb4f6..aa53022c643580887d7928576fa364442df8e889
@@@ -1,12 -1,12 +1,8 @@@
  {
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me/"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
    "name": "tar",
    "description": "tar for node",
--  "version": "0.1.13",
++  "version": "0.1.12",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/node-tar.git"
    "devDependencies": {
      "tap": "0.x",
      "rimraf": "1.x"
--  },
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "tar@0.1.13",
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.4",
--  "_nodeVersion": "v0.7.6-pre",
--  "_defaultsLoaded": true,
--  "dist": {
--    "shasum": "804bdaaacaab928ec1c9bbd8b848a042c3adacb2"
--  },
--  "_from": "tar@0.1.13"
++  }
  }
index c45dafee92832e67ccfaf32d84f01fcb84c708ce,c45dafee92832e67ccfaf32d84f01fcb84c708ce..02990697f7beb0942461a273e0e5ab7d81869121
@@@ -1,34 -1,34 +1,17 @@@
  {
--  "author": {
--    "name": "Isaac Z. Schlueter",
--    "email": "i@izs.me",
--    "url": "http://blog.izs.me"
--  },
++  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
    "name": "which",
    "description": "Like which(1) unix command. Find the first instance of an executable in the PATH.",
--  "version": "1.0.5",
++  "version": "1.0.2",
    "repository": {
      "type": "git",
      "url": "git://github.com/isaacs/node-which.git"
    },
    "main": "which.js",
--  "bin": {
--    "which": "./bin/which"
--  },
++  "bin": "./bin/which",
    "engines": {
      "node": "*"
    },
    "dependencies": {},
--  "devDependencies": {},
--  "_npmUser": {
--    "name": "isaacs",
--    "email": "i@izs.me"
--  },
--  "_id": "which@1.0.5",
--  "optionalDependencies": {},
--  "_engineSupported": true,
--  "_npmVersion": "1.1.2",
--  "_nodeVersion": "v0.7.6-pre",
--  "_defaultsLoaded": true,
--  "_from": "which@1"
++  "devDependencies": {}
  }
index db7e8f74dc73d6897f0844be7a274dbf54f326d5,db7e8f74dc73d6897f0844be7a274dbf54f326d5..b124ead672f74f8cfb59edf85d608c98952ce187
@@@ -4,7 -4,7 +4,6 @@@ which.sync = whichSyn
  var path = require("path")
    , fs
    , COLON = process.platform === "win32" ? ";" : ":"
--  , isExe
  
  try {
    fs = require("graceful-fs")
    fs = require("fs")
  }
  
--if (process.platform == "win32") {
--  // On windows, there is no good way to check that a file is executable
--  isExe = function isExe () { return true }
--} else {
--  isExe = function isExe (mod, uid, gid) {
--    //console.error(mod, uid, gid);
--    //console.error("isExe?", (mod & 0111).toString(8))
--    var ret = (mod & 0001)
--        || (mod & 0010) && process.getgid && gid === process.getgid()
--        || (mod & 0100) && process.getuid && uid === process.getuid()
--    //console.error("isExe?", ret)
--    return ret
--  }
--}
--
--
++// console.log(process.execPath)
++// console.log(process.argv)
  
++function isExe (mod, uid, gid) {
++  //console.error("isExe?", (mod & 0111).toString(8))
++  var ret = (mod & 0001)
++      || (mod & 0010) && process.getgid && gid === process.getgid()
++      || (mod & 0100) && process.getuid && uid === process.getuid()
++  //console.error("isExe?", ret)
++  return ret
++}
  function which (cmd, cb) {
--  if (isAbsolute(cmd)) return cb(null, cmd)
++  if (cmd.charAt(0) === "/") return cb(null, cmd)
    var pathEnv = (process.env.PATH || "").split(COLON)
      , pathExt = [""]
    if (process.platform === "win32") {
      pathEnv.push(process.cwd())
      pathExt = (process.env.PATHEXT || ".EXE").split(COLON)
--    if (cmd.indexOf(".") !== -1) pathExt.unshift("")
    }
    //console.error("pathEnv", pathEnv)
    ;(function F (i, l) {
    })(0, pathEnv.length)
  }
  
++
  function whichSync (cmd) {
--  if (isAbsolute(cmd)) return cmd
++  if (cmd.charAt(0) === "/") return cmd
    var pathEnv = (process.env.PATH || "").split(COLON)
--    , pathExt = [""]
--  if (process.platform === "win32") {
--    pathEnv.push(process.cwd())
--    pathExt = (process.env.PATHEXT || ".EXE").split(COLON)
--    if (cmd.indexOf(".") !== -1) pathExt.unshift("")
--  }
    for (var i = 0, l = pathEnv.length; i < l; i ++) {
      var p = path.join(pathEnv[i], cmd)
--    for (var j = 0, ll = pathExt.length; j < ll; j ++) {
--      var cur = p + pathExt[j]
--      var stat
--      try { stat = fs.statSync(cur) } catch (ex) {}
--      if (stat &&
--          stat.isFile() &&
--          isExe(stat.mode, stat.uid, stat.gid)) return cur
--    }
++    if (p === process.execPath) return p
++    var stat
++    try { stat = fs.statSync(p) } catch (ex) {}
++    if (stat && isExe(stat.mode, stat.uid, stat.gid)) return p
    }
    throw new Error("not found: "+cmd)
  }
--
--var isAbsolute = process.platform === "win32" ? absWin : absUnix
--
--function absWin (p) {
--  if (absUnix(p)) return true
--  // pull off the device/UNC bit from a windows path.
--  // from node's lib/path.js
--  var splitDeviceRe =
--        /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?([\\\/])?/
--    , result = splitDeviceRe.exec(p)
--    , device = result[1] || ''
--    , isUnc = device && device.charAt(1) !== ':'
--    , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute
--
--  return isAbsolute
--}
--
--function absUnix (p) {
--  return p.charAt(0) === "/" || p === ""
--}
index 87be4559dcd31dd1ce8d4a11e6c1141803828792,6510a03e8aa31ca652822632e6e351e2c7a9472f..55a2adf4c9847ce38d66045c1d4288acef3e9eb8
@@@ -10,7 -10,7 +10,7 @@@
      "install",
      "package.json"
    ],
-   "version": "1.1.18",
 -  "version": "1.1.21",
++  "version": "1.1.0-2",
    "preferGlobal": true,
    "config": {
      "publishtest": false
      "slide": "1",
      "abbrev": "1",
      "graceful-fs": "~1.1.1",
--    "minimatch": "~0.2",
++    "minimatch": "0",
      "nopt": "1",
      "node-uuid": "~1.3",
      "proto-list": "1",
--    "rimraf": "2",
++    "rimraf": "1",
      "request": "~2.9",
      "which": "1",
      "tar": "~0.1.12",
--    "fstream": "~0.1.17",
++    "fstream": "~0.1.5",
      "block-stream": "*",
      "inherits": "1",
--    "mkdirp": "0.3",
++    "mkdirp": "0.1",
++    "fast-list": "~1.0.1",
      "read": "0",
--    "lru-cache": "1",
--    "node-gyp": "~0.4.1",
--    "fstream-npm": "0 >=0.0.5",
--    "uid-number": "0",
--    "archy": "0",
--    "chownr": "0"
++    "lru-cache": "1"
    },
    "bundleDependencies": [
      "slide",
      "block-stream",
      "inherits",
      "mkdirp",
++    "fast-list",
      "read",
--    "lru-cache",
--    "node-gyp",
--    "fstream-npm",
--    "uid-number",
--    "archy",
--    "chownr"
++    "lru-cache"
    ],
    "devDependencies": {
      "ronn": "https://github.com/isaacs/ronnjs/tarball/master"
index 551bb1d563623033d17f1d5aa140cec187812879,551bb1d563623033d17f1d5aa140cec187812879..b3c19a03a19859db303f7656878beb2542b06822
@@@ -12,7 -12,7 +12,6 @@@ fs.readdir(api, done("api")
  
  function done (which) { return function (er, docs) {
    if (er) throw er
--  docs.sort()
    if (which === "api") apidocs = docs
    else clidocs = docs
  
index 99d7fc930702846089eb6e8b4679dc96a3dd2a12,99d7fc930702846089eb6e8b4679dc96a3dd2a12..ddd5c91abd855897a880e8c9b24bb46caef3ea99
@@@ -1,14 -1,14 +1,14 @@@
  { "name":"npm-test-env-reader"
  , "version" : "1.2.3"
  , "scripts" :
--  { "install"       : "node test.js"
--  , "preinstall"    : "node test.js"
--  , "preuninstall"  : "node test.js"
--  , "postuninstall" : "node test.js"
--  , "test"          : "node test.js"
--  , "stop"          : "node test.js"
--  , "start"         : "node test.js"
--  , "restart"       : "node test.js"
--  , "foo"           : "node test.js"
++  { "install"       : "./test.sh"
++  , "preinstall"    : "./test.sh"
++  , "preuninstall"  : "./test.sh"
++  , "postuninstall" : "./test.sh"
++  , "test"          : "./test.sh"
++  , "stop"          : "./test.sh"
++  , "start"         : "./test.sh"
++  , "restart"       : "./test.sh"
++  , "foo"           : "./test.sh"
    }
  }
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..b4ca4374edaba901b42c3bc7dbcbcf499509c258
new file mode 100755 (executable)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,3 @@@
++#!/usr/bin/env sh
++env | grep npm | sort | uniq
++echo PATH=$PATH
index 2afa12dc560fc086c9ad063b2de932152c174c43,2afa12dc560fc086c9ad063b2de932152c174c43..7c067828e20faef436b8ef033b8b13738179c1f5
@@@ -5,6 -5,6 +5,5 @@@
    , "sub/include"
    , "sub/include2"
    , "sub/include4"
--  , "test.sh"
--  , ".npmignore" ]
++  , "test.sh" ]
  , "scripts":{"test":"bash test.sh"}}
index 56c6f09ed015fdde6e00e1b855e844a1bf10bd33,56c6f09ed015fdde6e00e1b855e844a1bf10bd33..ebcd56832daa0ea61835854132458422ea688934
@@@ -1,12 -1,12 +1,10 @@@
  { "name": "npm-test-optional-deps"
  , "version": "1.2.5"
--, "scripts": { "test": "node test.js" }
  , "optionalDependencies":
    { "npm-test-foobarzaaakakaka": "http://example.com/"
    , "dnode": "10.999.14234"
--  , "sax": "0.3.5"
++  , "sax": "*"
    , "999 invalid name": "1.2.3"
    , "glob": "some invalid version 99 #! $$ x y z"
--  , "npm-test-failer":"*"
    }
  }
Simple merge
Simple merge
index 7eb417dbddd2ed914ec0bcc996b5f181ab202d71,326aaf481d1c6bd363a9234a7ed78143bb03dc68..8e6a63d3bbceb2e5f3f920695580a1a35bd20a92
@@@ -65,12 -79,14 +79,14 @@@ Take a parsed URL object, and return a 
  
  * `href` will be ignored.
  * `protocol`is treated the same with or without the trailing `:` (colon).
-   * The protocols `http`, `https`, `ftp`, `gopher`, `file` will be postfixed with `://` (colon-slash-slash).
-   * All other protocols `mailto`, `xmpp`, `aim`, `sftp`, `foo`, etc will be postfixed with `:` (colon)
- * `auth` will only be used if `host` is absent.
+   * The protocols `http`, `https`, `ftp`, `gopher`, `file` will be
+     postfixed with `://` (colon-slash-slash).
+   * All other protocols `mailto`, `xmpp`, `aim`, `sftp`, `foo`, etc will
+     be postfixed with `:` (colon)
+ * `auth` will be used if present.
  * `hostname` will only be used if `host` is absent.
  * `port` will only be used if `host` is absent.
 -* `host` will be used in place of `auth`, `hostname`, and `port`
 +* `host` will be used in place of `hostname` and `port`
  * `pathname` is treated the same with or without the leading `/` (slash)
  * `search` will be used in place of `query`
  * `query` (object; see `querystring`) will only be used if `search` is absent.
diff --cc lib/fs.js
Simple merge
index 0000000000000000000000000000000000000000,0000000000000000000000000000000000000000..34e951a768399ce042d32bef3a975885a1ae86fd
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,79 @@@
++// Copyright Joyent, Inc. and other Node contributors.
++//
++// Permission is hereby granted, free of charge, to any person obtaining a
++// copy of this software and associated documentation files (the
++// "Software"), to deal in the Software without restriction, including
++// without limitation the rights to use, copy, modify, merge, publish,
++// distribute, sublicense, and/or sell copies of the Software, and to permit
++// persons to whom the Software is furnished to do so, subject to the
++// following conditions:
++//
++// The above copyright notice and this permission notice shall be included
++// in all copies or substantial portions of the Software.
++//
++// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
++// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
++// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
++// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
++// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
++// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
++// USE OR OTHER DEALINGS IN THE SOFTWARE.
++
++
++// Simple tests of most basic domain functionality.
++
++var common = require('../common');
++var assert = require('assert');
++var domain = require('domain');
++var events = require('events');
++var caught = 0;
++var expectCaught = 1;
++
++var d = new domain.Domain();
++var e = new events.EventEmitter();
++
++d.on('error', function(er) {
++  console.error('caught', er);
++  switch (er.message) {
++    case "ENOENT, open 'this file does not exist'":
++      assert.equal(er.domain, d);
++      assert.equal(er.domain_thrown, true);
++      assert.ok(!er.domain_emitter);
++      assert.equal(er.code, 'ENOENT');
++      assert.equal(er.path, 'this file does not exist');
++      assert.equal(typeof er.errno, 'number');
++      break;
++
++    default:
++      console.error('unexpected error, throwing %j', er.message);
++      throw er;
++  }
++
++  caught++;
++});
++
++process.on('exit', function() {
++  console.error('exit');
++  assert.equal(caught, expectCaught);
++  console.log('ok');
++});
++
++
++// implicit handling of thrown errors while in a domain, via the
++// single entry points of ReqWrap and MakeCallback.  Even if
++// we try very hard to escape, there should be no way to, even if
++// we go many levels deep through timeouts and multiple IO calls.
++// Everything that happens between the domain.enter() and domain.exit()
++// calls will be bound to the domain, even if multiple levels of
++// handles are created.
++d.run(function() {
++  setTimeout(function() {
++    var fs = require('fs');
++    fs.readdir(__dirname, function() {
++      fs.open('this file does not exist', 'r', function(er) {
++        if (er) throw er;
++        throw new Error('should not get here!');
++      });
++    });
++  }, 100);
++});