Skip to content
This repository has been archived by the owner on Aug 11, 2022. It is now read-only.

Commit

Permalink
Fail when a package isn't found in the registry. Add support for inst…
Browse files Browse the repository at this point in the history
…alling a local tarball, so that registry-install can replace install
  • Loading branch information
isaacs committed May 3, 2010
1 parent 8f20337 commit 78ceb96
Showing 1 changed file with 53 additions and 32 deletions.
85 changes: 53 additions & 32 deletions lib/registry-install.js
Expand Up @@ -76,23 +76,29 @@ function registryInstall (pkglist, cb) {
return F(pkglist.shift())
}
seen[pkg] = true
if (pkg.match(/^https?:\/\//)) {
return fetchTarball(pkg, function (er, data) {
log(data, "fetched tarball")
if (!npm.get(data._id)) npm.set(data)
installedPackages[data.name] = installedPackages[data.name] || {}
installedPackages[data.name][data.version] = data
installReg[data.name] = installReg[data.name] || {}
installReg[data.name][data.version] = data
installList.push(path.join(data.name, data.version))
// also make sure to get any dependencies.
if (data.dependencies) for (var dep in data.dependencies) {
dep = dep.trim()+"@"+data.dependencies[dep]
if (!seen[dep]) pkglist.push(dep)
}
F(pkglist.shift())
})

function tarballHandler (er, data) {
log(data, "fetched tarball")
npm.set(data)
installedPackages[data.name] = installedPackages[data.name] || {}
installedPackages[data.name][data.version] = data
installReg[data.name] = installReg[data.name] || {}
installReg[data.name][data.version] = data
installList.push(path.join(data.name, data.version))
// also make sure to get any dependencies.
if (data.dependencies) for (var dep in data.dependencies) {
dep = dep.trim()+"@"+data.dependencies[dep]
if (!seen[dep]) pkglist.push(dep)
}
F(pkglist.shift())
}
if (pkg.match(/^(file:|\.|\/)/)) {
pkg = pkg.replace(/^file:(\/\/)?/, '')
if (pkg.charAt(0) !== "/") pkg = path.join(process.cwd(), pkg)
return installLocalTarball(pkg, tarballHandler)
}
if (pkg.match(/^https?:\/\//)) return fetchTarball(pkg, tarballHandler)

// now we know it's not a URL, so handle it like a tag, version, or range.
pkg = pkg.split("@")
var name = pkg[0]
Expand All @@ -103,10 +109,10 @@ function registryInstall (pkglist, cb) {
pkg = pkg.join("@")
if (tag) {
tag = ver || defTag
log(tag, "registry-install tag")
// must fetch data to know how to solve this.
var data = npm.get(name)
if (!data) return registry.get(name, function (er, data) {
if (!data) er = new Error("not found in registry: "+name)
if (er) return cb(er)
npm.set(name, data)
seen[pkg] = false
Expand Down Expand Up @@ -137,6 +143,7 @@ function registryInstall (pkglist, cb) {
}
var data = npm.get(name)
if (!data) return registry.get(name, function (er, data) {
if (!data) er = new Error("not found in registry: "+name)
if (er) return cb(er)
npm.set(name, data)
seen[pkg] = false
Expand Down Expand Up @@ -177,6 +184,7 @@ function registryInstall (pkglist, cb) {
// new thing. fetch from registry. favor stable version.
var data = npm.get(name)
if (!data) return registry.get(pkg, function (er, data) {
if (!data) er = new Error("not found in registry: "+pkg)
if (er) return cb(er)
npm.set(name, data)
seen[pkg] = false
Expand Down Expand Up @@ -205,29 +213,42 @@ function registryInstall (pkglist, cb) {
// download the tarball, and move the contents into
// the appropriate name/version folder.
function fetchTarball (tarball, cb) {
var folder = path.join(npm.tmp, tarball.replace(/[^a-zA-Z0-9]/g, "-")+"-"+
Date.now()+"-"+Math.random())
, target = folder + ".tgz"
var target = path.join(npm.tmp, tarball.replace(/[^a-zA-Z0-9]/g, "-")+"-"+
Date.now()+"-"+Math.random()) + ".tgz"
chain
( [mkdir, npm.tmp]
, [mkdir, folder]
, [fetch, tarball, target]
, [unpackTar, target, folder]
, function (er) {
, function (er, ok) {
if (er) return cb(er)
readJson(path.join(folder, "package.json"), function (er,data) {
log(data, "readJson from "+folder)
chain
( [moveIntoPlace, folder, data]
, [log, "moved into place", "fuckererrrr"]
, [rm, folder]
, [rm, target]
, function (er) { return cb(er, data) }
)
installLocalTarball(target, function (er, data) {
if (er) return cb(er)
rm(target, function (er) {
if (er) return cb(er)
cb(data)
})
})
}
)
}
function installLocalTarball (tarball, cb) {
var folder = path.join(npm.tmp, tarball.replace(/[^a-zA-Z0-9]/g, "-")+"-"+
Date.now()+"-"+Math.random())
chain
( [mkdir, folder]
, [unpackTar, target, folder]
, function (er) {
if (er) return cb(er)
readJson(path.join(folder, "package.json"), function (er,data) {
chain
( [moveIntoPlace, folder, data]
, [rm, folder]
, function (er) { return cb(er, data) }
)
})
}
)

}

function unpackTar (tarball, unpackTarget, cb) {
exec("tar", ["xzvf", tarball, "--strip", "1", "-C", unpackTarget], cb)
Expand Down

0 comments on commit 78ceb96

Please sign in to comment.