Upgrade npm to 1.1.3
authorisaacs <i@izs.me>
Fri, 2 Mar 2012 17:31:24 +0000 (09:31 -0800)
committerisaacs <i@izs.me>
Fri, 2 Mar 2012 17:31:46 +0000 (09:31 -0800)
* 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)

220 files changed:
deps/npm/AUTHORS
deps/npm/Makefile
deps/npm/doc/cli/changelog.md
deps/npm/doc/cli/coding-style.md
deps/npm/doc/cli/developers.md
deps/npm/doc/cli/json.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/lib/cache.js
deps/npm/lib/init.js
deps/npm/lib/install.js
deps/npm/lib/ls.js
deps/npm/lib/npm.js
deps/npm/lib/rebuild.js
deps/npm/lib/utils/fetch.js
deps/npm/lib/utils/find-prefix.js
deps/npm/lib/utils/get-agent.js [deleted file]
deps/npm/lib/utils/ini.js
deps/npm/lib/utils/lifecycle.js
deps/npm/lib/utils/npm-registry-client/request.js
deps/npm/lib/utils/output.js
deps/npm/lib/utils/tar.js
deps/npm/lib/version.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/shrinkwrap.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/shrinkwrap.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/request/forever.js
deps/npm/node_modules/request/main.js
deps/npm/node_modules/request/package.json
deps/npm/node_modules/request/tunnel.js [new file with mode: 0644]
deps/npm/node_modules/which/package.json
deps/npm/node_modules/which/which.js
deps/npm/package.json
deps/npm/test/packages/npm-test-shrinkwrap/npm-shrinkwrap.json [new file with mode: 0644]
deps/npm/test/packages/npm-test-shrinkwrap/package.json [new file with mode: 0644]
deps/npm/test/packages/npm-test-shrinkwrap/test.sh [new file with mode: 0644]

index b1b915a..86899d4 100644 (file)
@@ -54,3 +54,8 @@ 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>
index 415a1b3..19efd81 100644 (file)
@@ -123,7 +123,7 @@ doc-publish: doc
        rsync -vazu --stats --no-implied-dirs --delete html/api/ npmjs.org:/var/www/npmjs.org/public/api
 
 zip-publish: release
-       scp release/*.zip npmjs.org:/var/www/npmjs.org/public/dist/
+       scp release/* npmjs.org:/var/www/npmjs.org/public/dist/
 
 release:
        @bash scripts/release.sh
index 0115405..7c3a124 100644 (file)
@@ -3,6 +3,50 @@ npm-changelog(1) -- Changes
 
 ## HISTORY
 
+### 1.1.3
+
+* 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 5315c57..42ac1d7 100644 (file)
@@ -59,8 +59,8 @@ Don't use them except in four situations:
 * `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 9123f35..7ab905b 100644 (file)
@@ -27,12 +27,23 @@ 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 5f6e7ef..0ded878 100644 (file)
@@ -332,6 +332,7 @@ is a semver compatible version identifier.
 * `""` (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:
 
@@ -387,6 +388,18 @@ 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
index 64b3ec4..3d33a83 100644 (file)
@@ -62,6 +62,20 @@ Package scripts run in an environment where many pieces of information are
 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 f532874..8008d21 100644 (file)
@@ -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.2</p>
+<p id="footer">bin &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 75479a4..0844b34 100644 (file)
@@ -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.2</p>
+<p id="footer">bugs &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 26febd8..96a4260 100644 (file)
@@ -28,7 +28,7 @@ usage, or <code>man 3 npm-&lt;command&gt;</code> for programmatic usage.</p>
 
 <ul><li><a href="../doc/index.html">index(1)</a></li></ul>
 </div>
-<p id="footer">commands &mdash; npm@1.1.2</p>
+<p id="footer">commands &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index df58ade..9290da5 100644 (file)
@@ -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.2</p>
+<p id="footer">config &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ea1298a..1d02701 100644 (file)
@@ -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.2</p>
+<p id="footer">deprecate &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 14214d7..e2d94a2 100644 (file)
@@ -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.2</p>
+<p id="footer">docs &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 21ff933..3e252d7 100644 (file)
@@ -30,7 +30,7 @@ to open. The package can optionally have a version number attached.</p>
 <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.2</p>
+<p id="footer">edit &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8c02a51..8e2e708 100644 (file)
@@ -24,7 +24,7 @@ sure to use <code>npm rebuild &lt;pkg&gt;</code> if you make any changes.</p>
 
 <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.2</p>
+<p id="footer">explore &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 37068ac..219c438 100644 (file)
@@ -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.2</p>
+<p id="footer">help-search &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f07d214..d32ff17 100644 (file)
@@ -35,7 +35,7 @@ then go ahead and use this programmatically.</p>
 
 <p><a href="../doc/json.html">json(1)</a></p>
 </div>
-<p id="footer">init &mdash; npm@1.1.2</p>
+<p id="footer">init &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bdcac42..55925df 100644 (file)
@@ -25,7 +25,7 @@ the name of a package to be installed.</p>
 <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.2</p>
+<p id="footer">install &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 86e377a..441806c 100644 (file)
@@ -39,7 +39,7 @@ npm.commands.link('redis', cb)  # link-install the package</code></pre>
 <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.2</p>
+<p id="footer">link &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b2a1a9d..cd008a4 100644 (file)
@@ -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.2</p>
+<p id="footer">load &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 159d9c2..fbbd702 100644 (file)
@@ -59,7 +59,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.2</p>
+<p id="footer">ls &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3e923fc..92441e0 100644 (file)
@@ -24,7 +24,7 @@ npm.load(configObject, function (er, npm) {
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.1.2</p>
+<p>1.1.3</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -91,7 +91,7 @@ method names.  Use the <code>npm.deref</code> method to find the real name.</p>
 
 <pre><code>var cmd = npm.deref("unp") // cmd === "unpublish"</code></pre>
 </div>
-<p id="footer">npm &mdash; npm@1.1.2</p>
+<p id="footer">npm &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4febbeb..edf82ba 100644 (file)
@@ -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.2</p>
+<p id="footer">outdated &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d7708b1..6ce7270 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <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.2</p>
+<p id="footer">owner &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4b6b9da..eb9a0a8 100644 (file)
@@ -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.2</p>
+<p id="footer">pack &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b159e67..6eda687 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">prefix &mdash; npm@1.1.2</p>
+<p id="footer">prefix &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 09c9456..0abc18c 100644 (file)
@@ -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.2</p>
+<p id="footer">prune &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4d57cde..230af6c 100644 (file)
@@ -32,7 +32,7 @@ the registry.  Overwrites when the "force" environment variable is set.</p>
 
 <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.2</p>
+<p id="footer">publish &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5a16961..c3824cc 100644 (file)
@@ -22,7 +22,7 @@ the new binary. If no 'packages' parameter is specify, every package will be reb
 
 <p>See <code>npm help build</code></p>
 </div>
-<p id="footer">rebuild &mdash; npm@1.1.2</p>
+<p id="footer">rebuild &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5baee57..7dcda95 100644 (file)
@@ -27,7 +27,7 @@ in the <code>packages</code> parameter.</p>
 
 <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.2</p>
+<p id="footer">restart &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index bfad92b..23d2e0b 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically.</p>
 </div>
-<p id="footer">root &mdash; npm@1.1.2</p>
+<p id="footer">root &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index df45596..89fed2b 100644 (file)
@@ -29,7 +29,7 @@ assumed to be the command to run. All other elements are ignored.</p>
 
 <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.2</p>
+<p id="footer">run-script &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ac0cbd3..e24e00a 100644 (file)
@@ -32,7 +32,7 @@ excluded term (the "searchexclude" config). The search is case insensitive
 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.2</p>
+<p id="footer">search &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1a4ef61..628a107 100644 (file)
@@ -26,7 +26,7 @@ but the shrinkwrap file will still be written.</p>
 <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.2</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6830137..1d96267 100644 (file)
@@ -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.2</p>
+<p id="footer">start &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d6ddfa9..a169b88 100644 (file)
@@ -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.2</p>
+<p id="footer">stop &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 401514d..ad0c146 100644 (file)
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
 
 <ul><li>npm help json</li><li>git help submodule</li></ul>
 </div>
-<p id="footer">submodule &mdash; npm@1.1.2</p>
+<p id="footer">submodule &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1c21554..b0b2e3f 100644 (file)
@@ -29,7 +29,7 @@ parameter is missing or falsey (empty), the default froom the config will be
 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.2</p>
+<p id="footer">tag &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 51bd264..55a79c6 100644 (file)
@@ -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.2</p>
+<p id="footer">test &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 98dc686..caedf8a 100644 (file)
@@ -22,7 +22,7 @@ the name of a package to be uninstalled.</p>
 <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.2</p>
+<p id="footer">uninstall &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2179840..e50d530 100644 (file)
@@ -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.2</p>
+<p id="footer">unpublish &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6383e2a..95d0bbf 100644 (file)
@@ -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.2</p>
+<p id="footer">update &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9a4fcae..6b1ae99 100644 (file)
@@ -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.2</p>
+<p id="footer">version &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5303658..22ed424 100644 (file)
@@ -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.2</p>
+<p id="footer">view &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index b1321a0..f7bf2d4 100644 (file)
@@ -21,7 +21,7 @@
 
 <p>This function is not useful programmatically</p>
 </div>
-<p id="footer">whoami &mdash; npm@1.1.2</p>
+<p id="footer">whoami &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3aefa2d..c385dd2 100644 (file)
@@ -267,7 +267,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <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.2</p>
+<p id="footer"><a href="../doc/README.html">README</a> &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2af866e..5fb9379 100644 (file)
@@ -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.2</p>
+<p id="footer">adduser &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 21b1a57..c825d1d 100644 (file)
@@ -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.2</p>
+<p id="footer">bin &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 78a8b00..aa6ec8b 100644 (file)
@@ -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.2</p>
+<p id="footer">bugs &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index fc1df5d..9a3ee37 100644 (file)
@@ -25,7 +25,7 @@ A folder containing a <code>package.json</code> file in its root.</li></ul>
 
 <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.2</p>
+<p id="footer">build &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 744496d..1e44e7f 100644 (file)
@@ -20,7 +20,7 @@ install packages into the local space.</p>
 
 <ul><li><a href="../doc/install.html">install(1)</a></li></ul>
 </div>
-<p id="footer">bundle &mdash; npm@1.1.2</p>
+<p id="footer">bundle &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index da793c4..3ccbf3e 100644 (file)
@@ -66,7 +66,7 @@ they do not make an HTTP request to the registry.</p>
 
 <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.2</p>
+<p id="footer">cache &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1ff71c1..2f1874a 100644 (file)
 
 <h2 id="HISTORY">HISTORY</h2>
 
+<h3 id="1-1-3">1.1.3</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>
@@ -34,7 +65,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.2</p>
+<p id="footer">changelog &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 6b33e6c..2f3e724 100644 (file)
@@ -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>case "foo": doSomething(); break</li><li>In front of a leading ( or [ at the start of the line.
+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.
 This prevents the expression from being interpreted
 as a function call or property access, respectively.</li></ul>
 
@@ -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.2</p>
+<p id="footer">coding-style &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 07427ae..70fdcad 100644 (file)
@@ -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.2</p>
+<p id="footer">completion &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 301ff3c..53f1ae5 100644 (file)
@@ -642,7 +642,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.2</p>
+<p id="footer">config &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e0e410e..59ce9c0 100644 (file)
@@ -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.2</p>
+<p id="footer">deprecate &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 406f342..c79bc57 100644 (file)
@@ -28,13 +28,23 @@ topic, or <code>npm help thing</code> to see the same information.</p>
 
 <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></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><li>g) a <code>git</code> url that, when cloned, results in (a).</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
@@ -150,7 +160,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.2</p>
+<p id="footer">developers &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index ab7ba21..f7a34aa 100644 (file)
@@ -80,7 +80,7 @@ license statement)</li><li>Illegal content.</li></ol>
 
 <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.2</p>
+<p id="footer">disputes &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 2a1bc68..7c07681 100644 (file)
@@ -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.2</p>
+<p id="footer">docs &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7f62e29..4dcf28b 100644 (file)
@@ -37,7 +37,7 @@ or <code>"notepad"</code> on Windows.</li><li>Type: path</li></ul>
 
 <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.2</p>
+<p id="footer">edit &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1e5d24a..020dea5 100644 (file)
@@ -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.2</p>
+<p id="footer">explore &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4a8cb1a..f4696aa 100644 (file)
@@ -241,7 +241,7 @@ We'll have someone kick it or something.</p>
 
 <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.2</p>
+<p id="footer">faq &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 0533ed5..9e72f13 100644 (file)
@@ -205,7 +205,7 @@ cannot be found elsewhere.  See <code><a href="../doc/json.html">json(1)</a></co
 
 <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.2</p>
+<p id="footer">folders &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index f7504c4..143d253 100644 (file)
@@ -38,7 +38,7 @@ where the terms were found in the documentation.</p>
 
 <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.2</p>
+<p id="footer">help-search &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7c27afa..6d3bfcd 100644 (file)
@@ -36,7 +36,7 @@ matches are equivalent to specifying a topic name.</p>
 
 <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.2</p>
+<p id="footer">help &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e34ecde..9e8059a 100644 (file)
 
 <p> Display npm username</p>
 </div>
-<p id="footer">index &mdash; npm@1.1.2</p>
+<p id="footer">index &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c483eed..7ad3754 100644 (file)
@@ -29,7 +29,7 @@ without a really good reason to do so.</p>
 
 <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.2</p>
+<p id="footer">init &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7521efb..082d370 100644 (file)
@@ -136,7 +136,7 @@ affects a real use-case, it will be investigated.</p>
 
 <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>
 </div>
-<p id="footer">install &mdash; npm@1.1.2</p>
+<p id="footer">install &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 26fbaf8..1d32a8a 100644 (file)
@@ -311,7 +311,7 @@ space-separated descriptors, OR a range like "fromVersion - toVersion"</p>
 <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></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><li><code>git...</code> See 'Git URLs as Dependencies' below</li></ul>
 
 <p>For example, these are all valid:</p>
 
@@ -360,6 +360,18 @@ 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
@@ -436,7 +448,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.2</p>
+<p id="footer">json &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 618b7e1..5614252 100644 (file)
@@ -58,7 +58,7 @@ installation target into your project's <code>node_modules</code> folder.</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/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.2</p>
+<p id="footer">link &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 98eb8ec..c4d2644 100644 (file)
@@ -58,7 +58,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.2</p>
+<p id="footer">list &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 8fb1d5e..d4dfe7f 100644 (file)
@@ -14,7 +14,7 @@
 
 <h2 id="VERSION">VERSION</h2>
 
-<p>1.1.2</p>
+<p>1.1.3</p>
 
 <h2 id="DESCRIPTION">DESCRIPTION</h2>
 
@@ -135,7 +135,7 @@ will no doubt tell you to put the output in a gist or email.</p>
 
 <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.2</p>
+<p id="footer">npm &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7cfd6c5..7727903 100644 (file)
@@ -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.2</p>
+<p id="footer">outdated &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index de4d405..f2c5f1b 100644 (file)
@@ -34,7 +34,7 @@ that is not implemented at this time.</p>
 
 <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.2</p>
+<p id="footer">owner &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 9d86e1c..e323f5a 100644 (file)
@@ -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.2</p>
+<p id="footer">pack &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 823bdc1..e367d5b 100644 (file)
@@ -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.2</p>
+<p id="footer">prefix &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 666e875..f51a9df 100644 (file)
@@ -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.2</p>
+<p id="footer">prune &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 4285c43..da55861 100644 (file)
@@ -29,7 +29,7 @@ the registry.  Overwrites when the "--force" flag is set.</p>
 
 <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.2</p>
+<p id="footer">publish &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e73b242..f18cc99 100644 (file)
@@ -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.2</p>
+<p id="footer">rebuild &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3eaef2e..31d8ee8 100644 (file)
@@ -97,7 +97,7 @@ ask for help on the <a href="mailto:npm-@googlegroups.com">npm-@googlegroups.com
 
 <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.2</p>
+<p id="footer">registry &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e0a3a56..fb7c450 100644 (file)
@@ -58,7 +58,7 @@ modules.  To track those down, you can do the following:</p>
 
 <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.2</p>
+<p id="footer">removing-npm &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5e007b2..388b785 100644 (file)
@@ -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.2</p>
+<p id="footer">restart &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1631238..1a3dbfb 100644 (file)
@@ -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.2</p>
+<p id="footer">root &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 04dcb48..6d39434 100644 (file)
@@ -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.2</p>
+<p id="footer">run-script &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index d4aa666..4745fcb 100644 (file)
@@ -52,6 +52,19 @@ 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
@@ -164,7 +177,7 @@ will sudo the npm command in question.</li></ul>
 
 <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.2</p>
+<p id="footer">scripts &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 7f02fd1..8811d8e 100644 (file)
@@ -24,7 +24,7 @@ expression characters must be escaped or quoted in most shells.)</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/view.html">view(1)</a></li></ul>
 </div>
-<p id="footer">search &mdash; npm@1.1.2</p>
+<p id="footer">search &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 5fd5247..e5ee1e7 100644 (file)
@@ -104,7 +104,7 @@ that satisfies the range, or null if none of them do.</li></ul>
 
 <ul><li><a href="../doc/json.html">json(1)</a></li></ul>
 </div>
-<p id="footer">semver &mdash; npm@1.1.2</p>
+<p id="footer">semver &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 1acaf8c..640db89 100644 (file)
@@ -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.2</p>
+<p id="footer">shrinkwrap &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index a5e1ec3..8631a63 100644 (file)
@@ -26,7 +26,7 @@ a vaguely positive way to show that you care.</p>
 
 <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.2</p>
+<p id="footer">star &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 27d0749..f7c7c76 100644 (file)
@@ -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.2</p>
+<p id="footer">start &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 25cd521..89bc9c2 100644 (file)
@@ -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.2</p>
+<p id="footer">stop &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 031c0df..7eb2ffb 100644 (file)
@@ -33,7 +33,7 @@ dependencies into the submodule folder.</p>
 
 <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.2</p>
+<p id="footer">submodule &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 090aac2..e02111d 100644 (file)
@@ -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.2</p>
+<p id="footer">tag &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e8f4f37..fb0c5cd 100644 (file)
@@ -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.2</p>
+<p id="footer">test &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 46e6f30..006de7a 100644 (file)
@@ -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.2</p>
+<p id="footer">uninstall &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 0d33a1c..8fd6a45 100644 (file)
@@ -34,7 +34,7 @@ the root package entry is removed from the registry entirely.</p>
 
 <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.2</p>
+<p id="footer">unpublish &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 96b229c..b758db0 100644 (file)
@@ -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.2</p>
+<p id="footer">update &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 42a107e..034ee60 100644 (file)
@@ -31,7 +31,7 @@ will use it as a commit message when creating a version commit.</p>
 
 <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.2</p>
+<p id="footer">version &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index c15841e..efafbcf 100644 (file)
@@ -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.2</p>
+<p id="footer">view &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index e4b70b4..a7dc4be 100644 (file)
@@ -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.2</p>
+<p id="footer">whoami &mdash; npm@1.1.3</p>
 <script>
 ;(function () {
 var wrapper = document.getElementById("wrapper")
index 3dc1fb3..ddc4903 100644 (file)
@@ -752,12 +752,14 @@ function addTmpTarball (tgz, name, cb) {
 }
 
 function addTmpTarball_ (tgz, name, uid, gid, cb) {
-  var contents = path.resolve(path.dirname(tgz))  // , "contents")
+  var contents = path.dirname(tgz)
   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)
+    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")
@@ -792,11 +794,14 @@ function unpack (pkg, ver, unpackTarget, dMode, fMode, uid, gid, cb) {
       log.error("Could not read data for "+pkg+"@"+ver)
       return cb(er)
     }
-    tar.unpack( path.join(npm.cache, pkg, ver, "package.tgz")
-             , unpackTarget
-             , dMode, fMode
-             , uid, gid
-             , cb )
+    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 )
+    })
   })
 }
 
index 2ddb3e8..1c64d97 100644 (file)
@@ -146,13 +146,6 @@ function init_ (data, folder, 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 b493775..19d03d5 100644 (file)
@@ -183,7 +183,9 @@ function readDependencies (context, where, opts, cb) {
       })
       rv.dependencies = {}
       Object.keys(wrap).forEach(function (key) {
-        rv.dependencies[key] = wrap[key].version
+        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)
@@ -210,7 +212,8 @@ function readDependencies (context, where, opts, cb) {
       })
       rv.dependencies = {}
       Object.keys(newwrap.dependencies).forEach(function (key) {
-        rv.dependencies[key] = newwrap.dependencies[key].version
+        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)
@@ -225,14 +228,22 @@ function save (where, installed, tree, pretty, cb) {
   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) {
-        return tree[k].what.split("@")
+        // 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
       }).reduce(function (set, k) {
-        var rangeDescriptor = semver.gte(k[1], "0.1.0") ? "~" : ""
+        var rangeDescriptor = semver.valid(k[1]) &&
+                              semver.gte(k[1], "0.1.0")
+                            ? "~" : ""
         set[k[0]] = rangeDescriptor + k[1]
         return set
       }, {})
@@ -309,11 +320,13 @@ 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 }
+               , what: what
+               , from: from }
     return l
   }, {})
 
@@ -368,7 +381,6 @@ function installManyTop_ (what, where, context, cb) {
     if (er) return installMany(what, where, context, cb)
     pkgs = pkgs.filter(function (p) {
       return !p.match(/^[\._-]/)
-          && (!context.explicit || names.indexOf(p) === -1)
     })
     asyncMap(pkgs.map(function (p) {
       return path.resolve(nm, p, "package.json")
@@ -429,7 +441,7 @@ function installMany (what, where, context, cb) {
         log.info(t._id, "into "+where)
       })
       asyncMap(targets, function (target, cb) {
-        log(target._id, "installOne")
+        log.info(target._id, "installOne")
         var newWrap = wrap ? wrap[target.name].dependencies || {} : null
         var newContext = { family: newPrev
                          , ancestors: newAnc
@@ -469,6 +481,7 @@ function targetResolver (where, context, deps) {
     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) {
@@ -479,13 +492,9 @@ function targetResolver (where, context, deps) {
     // 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("using existing "+what+" (matches shrinkwrap)")
-        return cb(null, [])
-      }
 
-      if (!wrap && semver.satisfies(context.family[what], deps[what] || "")) {
-        log.verbose("using existing "+what+" (no shrinkwrap)")
+      if (wrap && wrap[what].version == context.family[what]) {
+        log.verbose(what, "using existing (matches shrinkwrap)")
         return cb(null, [])
       }
     }
@@ -493,10 +502,11 @@ function targetResolver (where, context, deps) {
     if (wrap) {
       name = what.split(/@/).shift()
       if (wrap[name]) {
-        log.verbose("shrinkwrap: resolving "+what+" to "+wrap[name].version)
-        what = name + "@" + wrap[name].version
+        var wrapTarget = wrap[name].from || wrap[name].version
+        log.verbose("resolving "+what+" to "+wrapTarget, "shrinkwrap")
+        what = name + "@" + wrapTarget
       } else {
-        log.verbose("shrinkwrap: skipping "+what+" (not in shrinkwrap)")
+        log.verbose("skipping "+what+" (not in shrinkwrap)", "shrinkwrap")
       }
     } else if (deps[what]) {
       what = what + "@" + deps[what]
@@ -504,13 +514,21 @@ function targetResolver (where, context, deps) {
 
     cache.add(what, function (er, data) {
       if (er && parent && parent.optionalDependencies &&
-          parent.optionalDependencies.hasOwnProperty(what.split("@").shift())) {
+          parent.optionalDependencies.hasOwnProperty(what.split("@")[0])) {
         log.warn(what, "optional dependency failed, continuing")
         return cb(null, [])
       }
-      if (!er && data && context.family[data.name] === data.version) {
+
+      if (!er &&
+          data &&
+          context.family[data.name] === data.version &&
+          !npm.config.get("force")) {
+        log.info(data.name + "@" + data.version, "already installed")
         return cb(null, [])
       }
+
+      if (data) data._from = what
+
       return cb(er, data)
     })
   }
@@ -575,7 +593,8 @@ function resultList (target, where, parentId) {
   return [ target._id
          , targetFolder
          , prettyWhere && parentId
-         , parentId && prettyWhere ]
+         , parentId && prettyWhere
+         , target._from ]
 }
 
 function installOne_ (target, where, context, cb) {
@@ -693,9 +712,11 @@ function write (target, targetFolder, context, cb_) {
   }
 
   chain
-    ( [ [ npm.commands.unbuild, [targetFolder] ]
-      , [ cache.unpack, target.name, target.version, 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 ] ]
 
     // nest the chain so that we can throw away the results returned
index a4ffc33..274d0f2 100644 (file)
@@ -53,6 +53,7 @@ function ls (args, silent, cb) {
 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
@@ -64,6 +65,15 @@ function getLite (data, noname) {
                       + " " + (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 || []
index 5319708..1defb88 100644 (file)
@@ -112,6 +112,7 @@ var commandCache = {}
               , "unstar": "star" // same function
               , "apihelp" : "help"
               , "login": "adduser"
+              , "add-user": "adduser"
               }
 
   , aliasNames = Object.keys(aliases)
index fc5f968..0e1d56a 100644 (file)
@@ -31,7 +31,6 @@ 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.
@@ -41,8 +40,6 @@ function cleanBuild (folders, set, cb) {
       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 ba1e567..935e820 100644 (file)
@@ -10,7 +10,6 @@ var request = require("request")
   , path = require("path")
   , mkdir = require("./mkdir-p.js")
   , regHost
-  , getAgent = require("./get-agent.js")
 
 module.exports = fetch
 
@@ -57,8 +56,8 @@ function makeRequest (remote, fstr, headers) {
 
   request({ url: remote
           , proxy: proxy
-          , agent: getAgent(remote)
           , strictSSL: npm.config.get("strict-ssl")
+          , ca: remote.host === regHost ? npm.config.get("ca") : undefined
           , onResponse: onResponse }).pipe(fstr)
   function onResponse (er, res) {
     if (er) return fstr.emit("error", er)
index 320456c..bc2c959 100644 (file)
@@ -45,6 +45,9 @@ function findPrefix_ (p, original, cb) {
       return cb(null, p)
     }
 
-    return findPrefix_(path.dirname(p), original, cb)
+    var d = path.dirname(p)
+    if (d === p) return cb(null, original)
+
+    return findPrefix_(d, original, cb)
   })
 }
diff --git a/deps/npm/lib/utils/get-agent.js b/deps/npm/lib/utils/get-agent.js
deleted file mode 100644 (file)
index 4bc074f..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-// 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 48d4f99..b033b6a 100644 (file)
@@ -323,8 +323,14 @@ function envReplace (f) {
   if (typeof f !== "string" || !f) return f
 
   // replace any ${ENV} values with the appropriate environ.
-  return f.replace(/\$\{([^}]+)\}/g, function (orig, name, i, s) {
-    return process.env[name] || orig
+  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]
   })
 }
 
index 51ad7ba..085dcc8 100644 (file)
@@ -247,6 +247,10 @@ 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 d98135e..5213c79 100644 (file)
@@ -16,7 +16,6 @@ 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
@@ -85,7 +84,7 @@ function regRequest (method, where, what, etag, nofollow, cb_) {
 function makeRequest (method, remote, where, what, etag, nofollow, cb) {
   var opts = { url: remote
              , method: method
-             , agent: getAgent(remote)
+             , ca: npm.config.get("ca")
              , strictSSL: npm.config.get("strict-ssl") }
     , headers = opts.headers = {}
   if (etag) {
index 00da9f6..b705153 100644 (file)
@@ -58,6 +58,7 @@ function write (args, stream, lf, cb) {
     if (!npm.config.get("unicode")) {
       arg = arg.replace(/â””/g, "`")
                .replace(/─/g, "-")
+               .replace(/│/g, "|")
                .replace(/├/g, "+")
                .replace(/┬/g, "-")
     }
index f315bbf..8a1bab0 100644 (file)
@@ -203,19 +203,57 @@ function gunzTarPerm (tarball, tmp, dMode, fMode, uid, gid, cb) {
   if (!fMode) fMode = npm.modes.file
   log.silly([dMode.toString(8), fMode.toString(8)], "gunzTarPerm modes")
 
-  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)
-
-  //
-  // XXX Do all this in an Extract filter.
-  //
+  var fst = fs.createReadStream(tarball)
+
+  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) {
+      var extracter = tar.Extract({ type: "Directory", path: tmp })
+      fst
+        .pipe(zlib.Unzip())
+        .on("error", log.er(cb, "unzip error "+tarball))
+        .pipe(tar.Extract({ type: "Directory", path: tmp }))
+        .on("error", log.er(cb, "untar error "+tarball))
+        .on("close", afterUntar)
+    } else if (c.toString().match(/^package\//)) {
+      // naked tar
+      fst
+        .pipe(tar.Extract({ type: "Directory", path: tmp }))
+        .on("error", log.er(cb, "untar error "+tarball))
+        .on("close", afterUntar)
+    } else {
+      // naked js file
+      fst
+        .pipe(fstream.Writer({ path: path.resolve(tmp, "package/index.js") }))
+        .on("error", log.er(cb, "copy error "+tarball))
+        .on("close", function () {
+          var j = path.resolve(tmp, "package/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", function (er) {
+              if (er) return cb(er)
+              return afterUntar()
+            })
+          })
+        })
+    }
+
+    // now un-hook, and re-emit the chunk
+    fst.removeListener("data", OD)
+    fst.emit("data", c)
+  })
+
   function afterUntar (er) {
-    log.silly(er, "afterUntar")
+    log.silly(er || "ok", "afterUntar")
     // if we're not doing ownership management,
     // then we're done now.
     if (er) return log.er(cb, "Failed unpacking "+tarball)(er)
@@ -542,7 +580,11 @@ function makeList_ (dir, pkg, exList, dfc, cb) {
 
     if (path.basename(dir) === "node_modules"
         && pkg.path === path.dirname(dir)
-        && dfc) { // do fancy crap
+        // do fancy crap
+        && dfc
+        // not already part of a bundled dependency
+        && path.basename(path.dirname(pkg.path)) !== "node_modules") {
+      log.verbose(dir, "doing fancy crap")
       files = filterNodeModules(files, pkg)
     } else {
       // If a directory is excluded, we still need to be
index f13d9e1..febb56d 100644 (file)
@@ -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))
+              , new Buffer(JSON.stringify(data, null, 2) + "\n")
               , cb )
 }
index 981f698..7815aec 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM" "1" "February 2012" "" ""
+.TH "NPM" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm\fR \-\- node package manager
index 1640e5c..40082f9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-ADDUSER" "1" "February 2012" "" ""
+.TH "NPM\-ADDUSER" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-adduser\fR \-\- Add a registry user account
index 09a0508..1f07014 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BIN" "1" "February 2012" "" ""
+.TH "NPM\-BIN" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-bin\fR \-\- Display npm bin folder
index 24713e2..01e01d6 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BUGS" "1" "February 2012" "" ""
+.TH "NPM\-BUGS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
index 9c4591c..541dd49 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BUILD" "1" "February 2012" "" ""
+.TH "NPM\-BUILD" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-build\fR \-\- Build a package
index 61973b8..6ff0908 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BUNDLE" "1" "February 2012" "" ""
+.TH "NPM\-BUNDLE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-bundle\fR \-\- REMOVED
index 07e1411..f185ea9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-CACHE" "1" "February 2012" "" ""
+.TH "NPM\-CACHE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-cache\fR \-\- Manipulates packages cache
index f6c968e..7af6709 100644 (file)
@@ -1,13 +1,95 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-CHANGELOG" "1" "February 2012" "" ""
+.TH "NPM\-CHANGELOG" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-changelog\fR \-\- Changes
 .
 .SH "HISTORY"
 .
+.SS "1\.1\.3"
+.
+.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 ac56410..25d53aa 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-CODING\-STYLE" "1" "February 2012" "" ""
+.TH "NPM\-CODING\-STYLE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-coding-style\fR \-\- npm\'s "funny" coding style
@@ -99,10 +99,10 @@ null loops like: \fBwhile (something) ;\fR (But you\'d better have a good
 reason for doing that\.)
 .
 .IP "\(bu" 4
-case "foo": doSomething(); break
+\fBcase "foo": doSomething(); break\fR
 .
 .IP "\(bu" 4
-In front of a leading ( or [ at the start of the line\.
+In front of a leading \fB(\fR or \fB[\fR at the start of the line\.
 This prevents the expression from being interpreted
 as a function call or property access, respectively\.
 .
index a9634bd..4acded6 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-COMPLETION" "1" "February 2012" "" ""
+.TH "NPM\-COMPLETION" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-completion\fR \-\- Tab Completion for npm
index 82f38fe..830a9a6 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-CONFIG" "1" "February 2012" "" ""
+.TH "NPM\-CONFIG" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-config\fR \-\- Manage the npm configuration file
index fd4ced7..46670bc 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DEPRECATE" "1" "February 2012" "" ""
+.TH "NPM\-DEPRECATE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-deprecate\fR \-\- Deprecate a version of a package
index 949718e..465b038 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DEVELOPERS" "1" "February 2012" "" ""
+.TH "NPM\-DEVELOPERS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-developers\fR \-\- Developer Guide
@@ -43,6 +43,9 @@ e) a \fB<name>@<tag>\fR that points to (d)
 .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
@@ -51,6 +54,25 @@ 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
+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 138b820..eb14276 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DISPUTES" "1" "February 2012" "" ""
+.TH "NPM\-DISPUTES" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-disputes\fR \-\- Handling Module Name Disputes
index 79ec121..292042d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DOCS" "1" "February 2012" "" ""
+.TH "NPM\-DOCS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
index 55b4e0c..b64f80a 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-EDIT" "1" "February 2012" "" ""
+.TH "NPM\-EDIT" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-edit\fR \-\- Edit an installed package
index 8190524..8aa212c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-EXPLORE" "1" "February 2012" "" ""
+.TH "NPM\-EXPLORE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-explore\fR \-\- Browse an installed package
index a674d46..1443fd7 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-FAQ" "1" "February 2012" "" ""
+.TH "NPM\-FAQ" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-faq\fR \-\- Frequently Asked Questions
index 08a47b5..f043ce2 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-FOLDERS" "1" "February 2012" "" ""
+.TH "NPM\-FOLDERS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-folders\fR \-\- Folder Structures Used by npm
index 21b1279..2dbc634 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-HELP\-SEARCH" "1" "February 2012" "" ""
+.TH "NPM\-HELP\-SEARCH" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-help-search\fR \-\- Search npm help documentation
index 3d4a4b8..ce2dd99 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-HELP" "1" "February 2012" "" ""
+.TH "NPM\-HELP" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-help\fR \-\- Get help on npm
index bc1c2c6..5dc7acb 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-INDEX" "1" "February 2012" "" ""
+.TH "NPM\-INDEX" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-index\fR \-\- Index of all npm documentation
index 547bcc0..c7c3e21 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-INIT" "1" "February 2012" "" ""
+.TH "NPM\-INIT" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-init\fR \-\- Interactively create a package\.json file
index 9667656..c0069f2 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-INSTALL" "1" "February 2012" "" ""
+.TH "NPM\-INSTALL" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-install\fR \-\- Install a package
index 470719e..66d167d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-JSON" "1" "February 2012" "" ""
+.TH "NPM\-JSON" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-json\fR \-\- Specifics of npm\'s package\.json handling
@@ -466,6 +466,9 @@ is a semver compatible version identifier\.
 .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
@@ -554,6 +557,25 @@ 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
index cac1ff7..374d5a8 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-LINK" "1" "February 2012" "" ""
+.TH "NPM\-LINK" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-link\fR \-\- Symlink a package folder
index d531dce..df6aae0 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-LS" "1" "February 2012" "" ""
+.TH "NPM\-LS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-ls\fR \-\- List installed packages
index 6ae5610..a7ec8cf 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM" "1" "February 2012" "" ""
+.TH "NPM" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm\fR \-\- node package manager
@@ -14,7 +14,7 @@ npm <command> [args]
 .fi
 .
 .SH "VERSION"
-1.1.2
+1.1.3
 .
 .SH "DESCRIPTION"
 npm is the package manager for the Node JavaScript platform\.  It puts
index 8797722..b693c7e 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-OUTDATED" "1" "February 2012" "" ""
+.TH "NPM\-OUTDATED" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-outdated\fR \-\- Check for outdated packages
index 4ad3a40..017e0b7 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-OWNER" "1" "February 2012" "" ""
+.TH "NPM\-OWNER" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-owner\fR \-\- Manage package owners
index 82d7c17..77928f9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PACK" "1" "February 2012" "" ""
+.TH "NPM\-PACK" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-pack\fR \-\- Create a tarball from a package
index e19180e..c8989a5 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PREFIX" "1" "February 2012" "" ""
+.TH "NPM\-PREFIX" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-prefix\fR \-\- Display prefix
index b56a9c2..adcc29d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PRUNE" "1" "February 2012" "" ""
+.TH "NPM\-PRUNE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-prune\fR \-\- Remove extraneous packages
index c983db4..8b16883 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PUBLISH" "1" "February 2012" "" ""
+.TH "NPM\-PUBLISH" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-publish\fR \-\- Publish a package
index 3094268..fe3fe77 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-REBUILD" "1" "February 2012" "" ""
+.TH "NPM\-REBUILD" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-rebuild\fR \-\- Rebuild a package
index 28868a6..9232489 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-REGISTRY" "1" "February 2012" "" ""
+.TH "NPM\-REGISTRY" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-registry\fR \-\- The JavaScript Package Registry
index a18340f..9d85506 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-REMOVAL" "1" "February 2012" "" ""
+.TH "NPM\-REMOVAL" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-removal\fR \-\- Cleaning the Slate
index 487116d..cd5d11e 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-RESTART" "1" "February 2012" "" ""
+.TH "NPM\-RESTART" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-restart\fR \-\- Start a package
index 7626d3a..28fbc52 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-ROOT" "1" "February 2012" "" ""
+.TH "NPM\-ROOT" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-root\fR \-\- Display npm root
index 05c43f8..7474610 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-RUN\-SCRIPT" "1" "February 2012" "" ""
+.TH "NPM\-RUN\-SCRIPT" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-run-script\fR \-\- Run arbitrary package scripts
index 003f8b7..d8c5b66 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SCRIPTS" "1" "February 2012" "" ""
+.TH "NPM\-SCRIPTS" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-scripts\fR \-\- How npm handles the "scripts" field
@@ -94,6 +94,26 @@ Package scripts run in an environment where many pieces of information are
 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 b5c3d1e..815452c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SEARCH" "1" "February 2012" "" ""
+.TH "NPM\-SEARCH" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-search\fR \-\- Search for packages
index 6ac638e..3cd98ff 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SEMVER" "1" "February 2012" "" ""
+.TH "NPM\-SEMVER" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-semver\fR \-\- The semantic versioner for npm
index 8328b62..37630d9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SHRINKWRAP" "1" "February 2012" "" ""
+.TH "NPM\-SHRINKWRAP" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-shrinkwrap\fR \-\- Lock down dependency versions
index d409626..cd9204e 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-STAR" "1" "February 2012" "" ""
+.TH "NPM\-STAR" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-star\fR \-\- Mark your favorite packages
index 91ea22d..1307707 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-START" "1" "February 2012" "" ""
+.TH "NPM\-START" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-start\fR \-\- Start a package
index 7a95400..188af67 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-STOP" "1" "February 2012" "" ""
+.TH "NPM\-STOP" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-stop\fR \-\- Stop a package
index 07ffcff..cee5f33 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SUBMODULE" "1" "February 2012" "" ""
+.TH "NPM\-SUBMODULE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-submodule\fR \-\- Add a package as a git submodule
index 654ffbb..e5ac519 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-TAG" "1" "February 2012" "" ""
+.TH "NPM\-TAG" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-tag\fR \-\- Tag a published version
index 4b1748c..a24e2d0 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-TEST" "1" "February 2012" "" ""
+.TH "NPM\-TEST" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-test\fR \-\- Test a package
index 81c1049..7005ba1 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-RM" "1" "February 2012" "" ""
+.TH "NPM\-RM" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-rm\fR \-\- Remove a package
index 41301de..4b8bc86 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-UNPUBLISH" "1" "February 2012" "" ""
+.TH "NPM\-UNPUBLISH" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-unpublish\fR \-\- Remove a package from the registry
index 9471997..ba3e8b6 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-UPDATE" "1" "February 2012" "" ""
+.TH "NPM\-UPDATE" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-update\fR \-\- Update a package
index 80cc888..1395591 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-VERSION" "1" "February 2012" "" ""
+.TH "NPM\-VERSION" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-version\fR \-\- Bump a package version
index 5a5375d..c874ff4 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-VIEW" "1" "February 2012" "" ""
+.TH "NPM\-VIEW" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-view\fR \-\- View registry info
index 2d38727..06d221d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-WHOAMI" "1" "February 2012" "" ""
+.TH "NPM\-WHOAMI" "1" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-whoami\fR \-\- Display npm username
index c2016d9..7aaa11b 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BIN" "3" "February 2012" "" ""
+.TH "NPM\-BIN" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-bin\fR \-\- Display npm bin folder
index ae6d5d4..6d61dcd 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-BUGS" "3" "February 2012" "" ""
+.TH "NPM\-BUGS" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-bugs\fR \-\- Bugs for a package in a web browser maybe
index 64b0a69..c23016d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-COMMANDS" "3" "February 2012" "" ""
+.TH "NPM\-COMMANDS" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-commands\fR \-\- npm commands
index d238226..d18739b 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-CONFIG" "3" "February 2012" "" ""
+.TH "NPM\-CONFIG" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-config\fR \-\- Manage the npm configuration files
index 535ba5a..2448ab3 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DEPRECATE" "3" "February 2012" "" ""
+.TH "NPM\-DEPRECATE" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-deprecate\fR \-\- Deprecate a version of a package
index b06876e..8373f6d 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-DOCS" "3" "February 2012" "" ""
+.TH "NPM\-DOCS" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-docs\fR \-\- Docs for a package in a web browser maybe
index 5435838..3f79022 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-EDIT" "3" "February 2012" "" ""
+.TH "NPM\-EDIT" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-edit\fR \-\- Edit an installed package
index 742e359..0d4ee62 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-EXPLORE" "3" "February 2012" "" ""
+.TH "NPM\-EXPLORE" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-explore\fR \-\- Browse an installed package
index 06f4da0..291037a 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-HELP\-SEARCH" "3" "February 2012" "" ""
+.TH "NPM\-HELP\-SEARCH" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-help-search\fR \-\- Search the help pages
index 60d7242..3a4434c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "INIT" "3" "February 2012" "" ""
+.TH "INIT" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBinit\fR \-\- Interactively create a package\.json file
index 432d166..0c0ee97 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-INSTALL" "3" "February 2012" "" ""
+.TH "NPM\-INSTALL" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-install\fR \-\- install a package programmatically
index 1007a70..45c15dc 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-LINK" "3" "February 2012" "" ""
+.TH "NPM\-LINK" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-link\fR \-\- Symlink a package folder
index de5876d..9d9df2c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-LOAD" "3" "February 2012" "" ""
+.TH "NPM\-LOAD" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-load\fR \-\- Load config settings
index 6b597ed..74736d4 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-LS" "3" "February 2012" "" ""
+.TH "NPM\-LS" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-ls\fR \-\- List installed packages
index 01e6329..57d861c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM" "3" "February 2012" "" ""
+.TH "NPM" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm\fR \-\- node package manager
@@ -21,7 +21,7 @@ npm\.load(configObject, function (er, npm) {
 .fi
 .
 .SH "VERSION"
-1.1.2
+1.1.3
 .
 .SH "DESCRIPTION"
 This is the API documentation for npm\.
index 2c86405..258db10 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-OUTDATED" "3" "February 2012" "" ""
+.TH "NPM\-OUTDATED" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-outdated\fR \-\- Check for outdated packages
index 68f5b74..edb734e 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-OWNER" "3" "February 2012" "" ""
+.TH "NPM\-OWNER" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-owner\fR \-\- Manage package owners
index 8c2c441..e279d61 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PACK" "3" "February 2012" "" ""
+.TH "NPM\-PACK" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-pack\fR \-\- Create a tarball from a package
index 3becffa..8a01d63 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PREFIX" "3" "February 2012" "" ""
+.TH "NPM\-PREFIX" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-prefix\fR \-\- Display prefix
index 61f0a80..1aec7d7 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PRUNE" "3" "February 2012" "" ""
+.TH "NPM\-PRUNE" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-prune\fR \-\- Remove extraneous packages
index 06b1667..060c31e 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-PUBLISH" "3" "February 2012" "" ""
+.TH "NPM\-PUBLISH" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-publish\fR \-\- Publish a package
index 87d6b67..7cacbe9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-REBUILD" "3" "February 2012" "" ""
+.TH "NPM\-REBUILD" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-rebuild\fR \-\- Rebuild a package
index 33be8ae..2032a7c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-RESTART" "3" "February 2012" "" ""
+.TH "NPM\-RESTART" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-restart\fR \-\- Start a package
index 840a8b6..a1d6295 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-ROOT" "3" "February 2012" "" ""
+.TH "NPM\-ROOT" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-root\fR \-\- Display npm root
index 39c4edd..597f7d9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-RUN\-SCRIPT" "3" "February 2012" "" ""
+.TH "NPM\-RUN\-SCRIPT" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-run-script\fR \-\- Run arbitrary package scripts
index 48dbe69..7626321 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SEARCH" "3" "February 2012" "" ""
+.TH "NPM\-SEARCH" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-search\fR \-\- Search for packages
index 34112f8..10354ed 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SHRINKWRAP" "3" "February 2012" "" ""
+.TH "NPM\-SHRINKWRAP" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-shrinkwrap\fR \-\- programmatically generate package shrinkwrap file
index 13f9f91..531dfa2 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-START" "3" "February 2012" "" ""
+.TH "NPM\-START" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-start\fR \-\- Start a package
index e2a51ba..e139ee9 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-STOP" "3" "February 2012" "" ""
+.TH "NPM\-STOP" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-stop\fR \-\- Stop a package
index 2ef5bd0..d691b7c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-SUBMODULE" "3" "February 2012" "" ""
+.TH "NPM\-SUBMODULE" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-submodule\fR \-\- Add a package as a git submodule
index fc655e5..855c174 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-TAG" "3" "February 2012" "" ""
+.TH "NPM\-TAG" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-tag\fR \-\- Tag a published version
index d83cb65..07be782 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-TEST" "3" "February 2012" "" ""
+.TH "NPM\-TEST" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-test\fR \-\- Test a package
index 393842e..756ddad 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-UNINSTALL" "3" "February 2012" "" ""
+.TH "NPM\-UNINSTALL" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-uninstall\fR \-\- uninstall a package programmatically
index 7edd2b0..d3e3a75 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-UNPUBLISH" "3" "February 2012" "" ""
+.TH "NPM\-UNPUBLISH" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-unpublish\fR \-\- Remove a package from the registry
index 68ec9d9..d8a096a 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-UPDATE" "3" "February 2012" "" ""
+.TH "NPM\-UPDATE" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-update\fR \-\- Update a package
index 2d0a513..20ee415 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-VERSION" "3" "February 2012" "" ""
+.TH "NPM\-VERSION" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-version\fR \-\- Bump a package version
index b3f8190..f9c253b 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-VIEW" "3" "February 2012" "" ""
+.TH "NPM\-VIEW" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-view\fR \-\- View registry info
index 1254499..fd2ee1c 100644 (file)
@@ -1,7 +1,7 @@
 .\" Generated with Ronnjs/v0.1
 .\" http://github.com/kapouer/ronnjs/
 .
-.TH "NPM\-WHOAMI" "3" "February 2012" "" ""
+.TH "NPM\-WHOAMI" "3" "March 2012" "" ""
 .
 .SH "NAME"
 \fBnpm-whoami\fR \-\- Display npm username
index e6531a2..ac853c0 100644 (file)
@@ -1,8 +1,11 @@
 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
@@ -34,12 +37,14 @@ function ForeverAgent(options) {
       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
@@ -82,3 +87,17 @@ ForeverAgent.prototype.removeSocket = function(s, name, host, port) {
     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 5c14264..f651202 100644 (file)
@@ -26,6 +26,7 @@ var http = require('http')
   , Cookie = require('./vendor/cookie')
   , CookieJar = require('./vendor/cookie/jar')
   , cookieJar = new CookieJar
+  , tunnel = require('./tunnel')
   ;
   
 if (process.logging) {
@@ -133,6 +134,20 @@ Request.prototype.init = function (options) {
   }
   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:") {
+      self.tunnel = true
+      var tunnelFn = self.proxy.protocol === "http:"
+                   ? tunnel.httpsOverHttp : tunnel.httpsOverHttps
+
+      var tunnelOptions = { proxy: { host: self.proxy.hostname
+                                   , port: +self.proxy.port }
+                          , ca: this.ca }
+
+      self.agent = tunnelFn(tunnelOptions)
+      self.tunnel = true
+    }
   }
 
   self._redirectsFollowed = self._redirectsFollowed || 0
@@ -163,7 +178,7 @@ Request.prototype.init = function (options) {
     else if (self.uri.protocol == 'https:') {self.uri.port = 443}
   }
 
-  if (self.proxy) {
+  if (self.proxy && !self.tunnel) {
     self.port = self.proxy.port
     self.host = self.proxy.hostname
   } else {
@@ -177,9 +192,12 @@ Request.prototype.init = function (options) {
   }
 
   self.clientErrorHandler = function (error) {
+    if (self._aborted) return
+    
     if (self.setHost) delete self.headers.host
-    if (self.req._reusedSocket && error.code === 'ECONNRESET') {
-      self.agent = {addRequest: ForeverAgent.prototype.addRequestNoreuse.bind(self.agent)}
+    if (self.req._reusedSocket && error.code === 'ECONNRESET'
+        && self.agent.addRequestNoreuse) {
+      self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
       self.start()
       self.req.end()
       return
@@ -204,7 +222,7 @@ Request.prototype.init = function (options) {
   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']) {
+  if (self.proxy && self.proxy.auth && !self.headers['proxy-authorization'] && !self.tunnel) {
     self.headers['proxy-authorization'] = "Basic " + toBase64(self.proxy.auth.split(':').map(function(item){ return qs.unescape(item)}).join(':'))
   }
 
@@ -218,7 +236,7 @@ Request.prototype.init = function (options) {
 
   if (self.path.length === 0) self.path = '/'
 
-  if (self.proxy) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
+  if (self.proxy && !self.tunnel) self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
 
   if (options.json) {
     self.json(options.json)
@@ -247,7 +265,7 @@ Request.prototype.init = function (options) {
     }
   }
 
-  var protocol = self.proxy ? self.proxy.protocol : self.uri.protocol
+  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
     , defaultModules = {'http:':http, 'https:':https}
     , httpModules = self.httpModules || {}
     ;
@@ -255,17 +273,30 @@ Request.prototype.init = function (options) {
 
   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
     }
   }
@@ -295,6 +326,8 @@ Request.prototype.init = function (options) {
   })
 
   process.nextTick(function () {
+    if (self._aborted) return
+    
     if (self.body) {
       if (Array.isArray(self.body)) {
         self.body.forEach(function(part) {
@@ -314,19 +347,61 @@ Request.prototype.init = function (options) {
     self.ntick = true
   })
 }
-Request.prototype.getAgent = function (host, port) {
-  if (!this.pool[host+':'+port]) {
-    this.pool[host+':'+port] = new this.httpModule.Agent({host:host, port:port})
+
+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
   }
-  return this.pool[host+':'+port]
+
+  if (options.ca) {
+    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
+  }
+
+  // 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
 
@@ -353,7 +428,7 @@ Request.prototype.start = function () {
 
     if (response.statusCode >= 300 && response.statusCode < 400  &&
         (self.followAllRedirects ||
-         (self.followRedirect && (self.method !== 'PUT' && self.method !== 'POST'))) &&
+         (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."))
@@ -423,6 +498,8 @@ Request.prototype.start = function () {
           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
@@ -439,7 +516,7 @@ Request.prototype.start = function () {
             response.body = buffer.join('')
           }
 
-          if (self.json) {
+          if (self._json) {
             try {
               response.body = JSON.parse(response.body)
             } catch (e) {}
@@ -461,20 +538,36 @@ Request.prototype.start = function () {
     
     // Set additional timeout on socket - in case if remote
     // server freeze after sending headers
-    self.req.setTimeout(self.timeout, function(){
-        if (self.req) {
-            self.req.abort()
-            var e = new Error("ESOCKETTIMEDOUT")
-            e.code = "ESOCKETTIMEDOUT"
-            self.emit("error", e)
-        }
-    });
+    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
@@ -554,6 +647,7 @@ Request.prototype.multipart = function (multipart) {
 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 {
@@ -659,22 +753,20 @@ Request.prototype.pipe = function (dest, opts) {
 }
 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)
   if (!this._started) this.start()
-  if (!this.req) throw new Error("This request has been piped before http.request() was called.")
   this.req.end()
 }
 Request.prototype.pause = function () {
-  if (!this.response) throw new Error("This request has been piped before http.request() was called.")
-  this.response.pause.apply(this.response, arguments)
+  if (!this.response) this._paused = true
+  else this.response.pause.apply(this.response, arguments)
 }
 Request.prototype.resume = function () {
-  if (!this.response) throw new Error("This request has been piped before http.request() was called.")
-  this.response.resume.apply(this.response, arguments)
+  if (!this.response) this._paused = false
+  else this.response.resume.apply(this.response, arguments)
 }
 Request.prototype.destroy = function () {
   if (!this._ended) this.end()
@@ -735,12 +827,13 @@ request.defaults = function (options) {
 
 request.forever = function (agentOptions, optionsArg) {
   var options = {}
-  if (agentOptions) {
+  if (optionsArg) {
     for (option in optionsArg) {
       options[option] = optionsArg[option]
     }
   }
-  options.agent = new ForeverAgent(agentOptions)
+  if (agentOptions) options.agentOptions = agentOptions
+  options.forever = true
   return request.defaults(options)
 }
 
@@ -758,7 +851,10 @@ request.put = function (uri, options, callback) {
 request.head = function (uri, options, callback) {
   var params = initParams(uri, options, callback);
   params.options.method = 'HEAD'
-  if (options.body || options.requestBodyStream || options.json || options.multipart) {
+  if (params.options.body || 
+      params.options.requestBodyStream || 
+      (params.options.json && typeof params.options.json !== 'boolean') || 
+      params.options.multipart) {
     throw new Error("HTTP HEAD requests MUST NOT include a request body.")
   }
   return request(params.uri, params.options, params.callback)
index 305cf16..4a62c5a 100644 (file)
@@ -1,15 +1,45 @@
-{ "name" : "request"
-, "description" : "Simplified HTTP request client."
-, "tags" : ["http", "simple", "util", "utility"]
-, "version" : "2.9.151"
-, "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": "node tests/run.js" }
+{
+  "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.2",
+  "_nodeVersion": "v0.7.6-pre",
+  "_defaultsLoaded": true,
+  "dist": {
+    "shasum": "d1f4855a90a9e69bf6cd2a68503e253cc4a27a71"
+  },
+  "_from": "request@~2.9"
 }
diff --git a/deps/npm/node_modules/request/tunnel.js b/deps/npm/node_modules/request/tunnel.js
new file mode 100644 (file)
index 0000000..453786c
--- /dev/null
@@ -0,0 +1,229 @@
+'use strict';
+
+var net = require('net');
+var tls = require('tls');
+var http = require('http');
+var https = require('https');
+var events = require('events');
+var assert = require('assert');
+var util = require('util');
+
+
+exports.httpOverHttp = httpOverHttp;
+exports.httpsOverHttp = httpsOverHttp;
+exports.httpOverHttps = httpOverHttps;
+exports.httpsOverHttps = httpsOverHttps;
+
+
+function httpOverHttp(options) {
+  var agent = new TunnelingAgent(options);
+  agent.request = http.request;
+  return agent;
+}
+
+function httpsOverHttp(options) {
+  var agent = new TunnelingAgent(options);
+  agent.request = http.request;
+  agent.createSocket = createSecureSocket;
+  return agent;
+}
+
+function httpOverHttps(options) {
+  var agent = new TunnelingAgent(options);
+  agent.request = https.request;
+  return agent;
+}
+
+function httpsOverHttps(options) {
+  var agent = new TunnelingAgent(options);
+  agent.request = https.request;
+  agent.createSocket = createSecureSocket;
+  return agent;
+}
+
+
+function TunnelingAgent(options) {
+  var self = this;
+  self.options = options || {};
+  self.proxyOptions = self.options.proxy || {};
+  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets;
+  self.requests = [];
+  self.sockets = [];
+
+  self.on('free', function onFree(socket, host, port) {
+    for (var i = 0, len = self.requests.length; i < len; ++i) {
+      var pending = self.requests[i];
+      if (pending.host === host && pending.port === port) {
+        // Detect the request to connect same origin server,
+        // reuse the connection.
+        self.requests.splice(i, 1);
+        pending.request.onSocket(socket);
+        return;
+      }
+    }
+    socket.destroy();
+    self.removeSocket(socket);
+  });
+}
+util.inherits(TunnelingAgent, events.EventEmitter);
+
+TunnelingAgent.prototype.addRequest = function addRequest(req, host, port) {
+  var self = this;
+
+  if (self.sockets.length >= this.maxSockets) {
+    // We are over limit so we'll add it to the queue.
+    self.requests.push({host: host, port: port, request: req});
+    return;
+  }
+
+  // If we are under maxSockets create a new one.
+  self.createSocket({host: host, port: port, request: req}, function(socket) {
+    socket.on('free', onFree);
+    socket.on('close', onCloseOrRemove);
+    socket.on('agentRemove', onCloseOrRemove);
+    req.onSocket(socket);
+
+    function onFree() {
+      self.emit('free', socket, host, port);
+    }
+
+    function onCloseOrRemove(err) {
+      self.removeSocket();
+      socket.removeListener('free', onFree);
+      socket.removeListener('close', onCloseOrRemove);
+      socket.removeListener('agentRemove', onCloseOrRemove);
+    }
+  });
+};
+
+TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
+  var self = this;
+  var placeholder = {};
+  self.sockets.push(placeholder);
+
+  var connectOptions = mergeOptions({}, self.proxyOptions, {
+    method: 'CONNECT',
+    path: options.host + ':' + options.port,
+    agent: false
+  });
+  if (connectOptions.proxyAuth) {
+    connectOptions.headers = connectOptions.headers || {};
+    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
+        new Buffer(connectOptions.proxyAuth).toString('base64');
+  }
+
+  debug('making CONNECT request');
+  var connectReq = self.request(connectOptions);
+  connectReq.useChunkedEncodingByDefault = false; // for v0.6
+  connectReq.once('response', onResponse); // for v0.6
+  connectReq.once('upgrade', onUpgrade);   // for v0.6
+  connectReq.once('connect', onConnect);   // for v0.7 or later
+  connectReq.once('error', onError);
+  connectReq.end();
+
+  function onResponse(res) {
+    // Very hacky. This is necessary to avoid http-parser leaks.
+    res.upgrade = true;
+  }
+
+  function onUpgrade(res, socket, head) {
+    // Hacky.
+    process.nextTick(function() {
+      onConnect(res, socket, head);
+    });
+  }
+
+  function onConnect(res, socket, head) {
+    connectReq.removeAllListeners();
+    socket.removeAllListeners();
+
+    if (res.statusCode === 200) {
+      assert.equal(head.length, 0);
+      debug('tunneling connection has established');
+      self.sockets[self.sockets.indexOf(placeholder)] = socket;
+      cb(socket);
+    } else {
+      debug('tunneling socket could not be established, statusCode=%d',
+            res.statusCode);
+      var error = new Error('tunneling socket could not be established, ' +
+                            'sutatusCode=' + res.statusCode);
+      error.code = 'ECONNRESET';
+      options.request.emit('error', error);
+      self.removeSocket(placeholder);
+    }
+  }
+
+  function onError(cause) {
+    connectReq.removeAllListeners();
+
+    debug('tunneling socket could not be established, cause=%s\n',
+          cause.message, cause.stack);
+    var error = new Error('tunneling socket could not be established, ' +
+                          'cause=' + cause.message);
+    error.code = 'ECONNRESET';
+    options.request.emit('error', error);
+    self.removeSocket(placeholder);
+  }
+};
+
+TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
+  var pos = this.sockets.indexOf(socket)
+  if (pos === -1) {
+    return;
+  }
+  this.sockets.splice(pos, 1);
+
+  var pending = this.requests.shift();
+  if (pending) {
+    // If we have pending requests and a socket gets closed a new one
+    // needs to be created to take over in the pool for the one that closed.
+    this.createSocket(pending, function(socket) {
+      pending.request.onSocket(socket);
+    });
+  }
+};
+
+function createSecureSocket(options, cb) {
+  var self = this;
+  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
+    // 0 is dummy port for v0.6
+    var secureSocket = tls.connect(0, mergeOptions({}, self.options, {
+      socket: socket
+    }));
+    cb(secureSocket);
+  });
+}
+
+
+function mergeOptions(target) {
+  for (var i = 1, len = arguments.length; i < len; ++i) {
+    var overrides = arguments[i];
+    if (typeof overrides === 'object') {
+      var keys = Object.keys(overrides);
+      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
+        var k = keys[j];
+        if (overrides[k] !== undefined) {
+          target[k] = overrides[k];
+        }
+      }
+    }
+  }
+  return target;
+}
+
+
+var debug;
+if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
+  debug = function() {
+    var args = Array.prototype.slice.call(arguments);
+    if (typeof args[0] === 'string') {
+      args[0] = 'TUNNEL: ' + args[0];
+    } else {
+      args.unshift('TUNNEL:');
+    }
+    console.error.apply(console, args);
+  }
+} else {
+  debug = function() {};
+}
+exports.debug = debug; // for test
index ea26853..c45dafe 100644 (file)
@@ -1,17 +1,34 @@
 {
-  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
+  "author": {
+    "name": "Isaac Z. Schlueter",
+    "email": "i@izs.me",
+    "url": "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.3",
+  "version": "1.0.5",
   "repository": {
     "type": "git",
     "url": "git://github.com/isaacs/node-which.git"
   },
   "main": "which.js",
-  "bin": "./bin/which",
+  "bin": {
+    "which": "./bin/which"
+  },
   "engines": {
     "node": "*"
   },
   "dependencies": {},
-  "devDependencies": {}
+  "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"
 }
index 634e3af..db7e8f7 100644 (file)
@@ -27,13 +27,16 @@ if (process.platform == "win32") {
   }
 }
 
+
+
 function which (cmd, cb) {
-  if (cmd.charAt(0) === "/") return cb(null, cmd)
+  if (isAbsolute(cmd)) 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) {
@@ -57,14 +60,14 @@ function which (cmd, cb) {
   })(0, pathEnv.length)
 }
 
-
 function whichSync (cmd) {
-  if (cmd.charAt(0) === "/") return cmd
+  if (isAbsolute(cmd)) 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)
@@ -79,3 +82,23 @@ function whichSync (cmd) {
   }
   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 25d30fb..7d5fe97 100644 (file)
@@ -10,7 +10,7 @@
     "install",
     "package.json"
   ],
-  "version": "1.1.2",
+  "version": "1.1.3",
   "preferGlobal": true,
   "config": {
     "publishtest": false
diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/npm-shrinkwrap.json b/deps/npm/test/packages/npm-test-shrinkwrap/npm-shrinkwrap.json
new file mode 100644 (file)
index 0000000..c4f7fbf
--- /dev/null
@@ -0,0 +1,43 @@
+{
+  "name": "npm-test-shrinkwrap",
+  "version": "0.0.0",
+  "dependencies": {
+    "npm-test-single-file": {
+      "version": "1.2.3",
+      "from": "https://raw.github.com/gist/1837112/index.js"
+    },
+    "glob": {
+      "version": "3.1.4",
+      "from": "git://github.com/isaacs/node-glob.git",
+      "dependencies": {
+        "minimatch": {
+          "version": "0.2.0",
+          "dependencies": {
+            "lru-cache": {
+              "version": "1.0.5"
+            }
+          }
+        },
+        "graceful-fs": {
+          "version": "1.1.5",
+          "dependencies": {
+            "fast-list": {
+              "version": "1.0.2"
+            }
+          }
+        },
+        "inherits": {
+          "version": "1.0.0"
+        }
+      }
+    },
+    "minimatch": {
+      "version": "0.1.5",
+      "dependencies": {
+        "lru-cache": {
+          "version": "1.0.5"
+        }
+      }
+    }
+  }
+}
diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/package.json b/deps/npm/test/packages/npm-test-shrinkwrap/package.json
new file mode 100644 (file)
index 0000000..34a8abc
--- /dev/null
@@ -0,0 +1,13 @@
+{
+  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
+  "name": "npm-test-shrinkwrap",
+  "version": "0.0.0",
+  "dependencies": {
+    "npm-test-single-file": "https://raw.github.com/gist/1837112/index.js",
+    "glob": "git://github.com/isaacs/node-glob.git",
+    "minimatch": "~0.1.0"
+  },
+  "scripts": {
+    "test": "bash test.sh"
+  }
+}
diff --git a/deps/npm/test/packages/npm-test-shrinkwrap/test.sh b/deps/npm/test/packages/npm-test-shrinkwrap/test.sh
new file mode 100644 (file)
index 0000000..f756f5b
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# ensure that we get the npm being tested, not some global thing.
+npmbin=$npm_config_prefix/bin/npm
+npm () {
+  node $npmbin "$@"
+}
+
+# work around the weird env we're in, as part of npm's test
+export npm_config_prefix=$PWD
+unset npm_config_global
+unset npm_config_depth
+
+out=$(diff <(npm ls --json) npm-shrinkwrap.json)
+if [ "$out" != "" ]; then
+  echo "Didn't get expected packages" >&2
+  echo "$out" >&2
+  exit 1
+fi
+echo "ok"