diff --git a/lib/meteor.js b/lib/meteor.js index 23fb679b26..fcacd7bae5 100644 --- a/lib/meteor.js +++ b/lib/meteor.js @@ -82,8 +82,6 @@ Fiber(function () { // found in the warehouse, or null if warehouse has no releases var releaseVersion = null; var calculateReleaseVersion = function (argv) { - ensureSomeRelease(); - if (!files.usesWarehouse()) { if (argv.release) { console.error("Cannot specify --release when running meteor from a git checkout."); @@ -94,6 +92,8 @@ Fiber(function () { return 'none'; } + ensureSomeRelease(); + // If a release was specified explicitly on the command line, that's the one // to use. if (argv.release) diff --git a/lib/warehouse.js b/lib/warehouse.js index f3a20c2b6a..021f20fcc7 100644 --- a/lib/warehouse.js +++ b/lib/warehouse.js @@ -25,8 +25,9 @@ var _ = require("underscore"); // XXX do we really need this __dirname dance? Doesn't // require("./files.js") work? -var files = require(path.join(__dirname, "files.js")); -var project = require(path.join(__dirname, "project.js")); +var files = require('./files.js'); +var project = require('./project.js')); +var updater = require('./updater.js'); var PACKAGES_URLBASE = 'https://packages.meteor.com'; @@ -77,11 +78,14 @@ var warehouse = module.exports = { } }, + _latestReleaseSymlinkPath: function () { + return path.join(warehouse.getWarehouseDir(), 'releases', 'latest'); + }, + // look in the warehouse for the latest release version. if no // releases are found, return null. latestRelease: function() { - var latestReleaseSymlink = path.join( - warehouse.getWarehouseDir(), 'releases', 'latest'); + var latestReleaseSymlink = warehouse._latestReleaseSymlinkPath(); try { return fs.readlinkSync(latestReleaseSymlink); } catch (e) { @@ -89,13 +93,23 @@ var warehouse = module.exports = { } }, + // XXX make errors prettier fetchLatestRelease: function () { var manifest = Future.wrap(updater.get_manifest)().wait(); - var release = manifest.releases.stable; // XXX in the future support release channels - this._populateWarehouseForRelease(release); - // xcxc write getReleaseDir(); -//xcxc fs.symlinkSync(); to temp, random filename - // xcxc rename + // XXX in the future support release channels other than stable + var releaseName = manifest.releases.stable; + if (!releaseName) { + console.error("No stable release found."); + process.exit(1); + } + + warehouse._populateWarehouseForRelease(releaseName); + var latestReleaseSymlink = warehouse._latestReleaseSymlinkPath(); + var tmpSymlink = latestReleaseSymlink + ".tmp" + warehouse._randomToken(); + // You can't directly symlink over an existing symlink, but you can rename + // over it. + fs.symlinkSync(releaseName, tmpSymlink); + fs.renameSync(tmpSymlink, latestReleaseSymlink); }, existsInWarehouse: function (name, version) {