mirror of
https://github.com/meteor/meteor.git
synced 2026-05-02 03:01:46 -04:00
Merge branch 'release-1.4'
This commit is contained in:
10
.travis.yml
10
.travis.yml
@@ -1,6 +1,6 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- "0.10"
|
||||
- "4.0"
|
||||
cache:
|
||||
directories:
|
||||
- "dev_bundle"
|
||||
@@ -9,3 +9,11 @@ cache:
|
||||
install: ./meteor --get-ready
|
||||
script: TEST_PACKAGES_EXCLUDE="less" ./packages/test-in-console/run.sh
|
||||
sudo: false
|
||||
env:
|
||||
- CXX=g++-4.8
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-4.8
|
||||
|
||||
45
History.md
45
History.md
@@ -1,5 +1,47 @@
|
||||
## v.NEXT
|
||||
|
||||
## v1.4
|
||||
|
||||
* Node has been upgraded to 4.4.7.
|
||||
|
||||
* The `meteor-babel` npm package has been upgraded to 0.11.7.
|
||||
|
||||
* The `reify` npm package has been upgraded to 0.3.6.
|
||||
|
||||
* The `bcrypt` npm package has been upgraded to 0.8.7.
|
||||
|
||||
* Nested `import` declarations are now enabled for package code as well as
|
||||
application code. 699cf1f38e9b2a074169515d23983f74148c7223
|
||||
|
||||
* Meteor has been upgraded to support Mongo 3.2 by default (the bundled version
|
||||
used by `meteor run` has been upgraded). Internally it now uses the 2.2.4
|
||||
version of the `mongodb` npm driver, and has been tested against at Mongo 3.2
|
||||
server. [Issue #6957](https://github.com/meteor/meteor/issues/6957)
|
||||
|
||||
Mongo 3.2 defaults to the new WiredTiger storage engine. You can update your
|
||||
database following the instructions here:
|
||||
https://docs.mongodb.com/v3.0/release-notes/3.0-upgrade/.
|
||||
In development, you can also just use `meteor reset` to remove your old
|
||||
database, and Meteor will create a new WiredTiger database for you. The Mongo
|
||||
driver will continue to work with the old MMAPv1 storage engine however.
|
||||
|
||||
The new version of the Mongo driver has been tested with MongoDB versions from
|
||||
2.6 up. Mongo 2.4 has now reached end-of-life
|
||||
(https://www.mongodb.com/support-policy), and is no longer supported.
|
||||
|
||||
* Custom Mongo options can now be specified using the
|
||||
`Mongo.setConnectionOptions(options)` API.
|
||||
[#7277](https://github.com/meteor/meteor/pull/7277)
|
||||
|
||||
* On the server, cursor.count() now takes a single argument `applySkipLimit`
|
||||
(see the corresponding [Mongo documentation]
|
||||
(http://mongodb.github.io/node-mongodb-native/2.1/api/Cursor.html#count))
|
||||
|
||||
* Fix for regression caused by #5837 which incorrectly rewrote
|
||||
network-path references (e.g. `//domain.com/image.gif`) in CSS URLs.
|
||||
[#7416](https://github.com/meteor/meteor/issues/7416)
|
||||
* Added Angular2 boilerplate example [#7364](https://github.com/meteor/meteor/pull/7363)
|
||||
|
||||
## v1.3.5.1
|
||||
|
||||
* This release fixed a small bug in 1.3.5 that prevented updating apps
|
||||
@@ -95,6 +137,9 @@
|
||||
* `App.appendToConfig` allows adding custom tags to config.xml.
|
||||
[#7307](https://github.com/meteor/meteor/pull/7307)
|
||||
|
||||
* When using `ROOT_URL` with a path, relative CSS URLs are rewriten
|
||||
accordingly. [#5837](https://github.com/meteor/meteor/issues/5837)
|
||||
|
||||
* Fixed bugs:
|
||||
[#7149](https://github.com/meteor/meteor/issues/7149)
|
||||
[#7296](https://github.com/meteor/meteor/issues/7296)
|
||||
|
||||
2
meteor
2
meteor
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
BUNDLE_VERSION=0.6.19
|
||||
BUNDLE_VERSION=4.1.4
|
||||
|
||||
# OS Check. Put here because here is where we download the precompiled
|
||||
# bundles that are arch specific.
|
||||
|
||||
@@ -1260,9 +1260,9 @@ Ap.insertUserDoc = function (options, user) {
|
||||
// https://jira.mongodb.org/browse/SERVER-3069 will get fixed one day
|
||||
if (e.name !== 'MongoError') throw e;
|
||||
if (e.code !== 11000) throw e;
|
||||
if (e.err.indexOf('emails.address') !== -1)
|
||||
if (e.errmsg.indexOf('emails.address') !== -1)
|
||||
throw new Meteor.Error(403, "Email already exists.");
|
||||
if (e.err.indexOf('username') !== -1)
|
||||
if (e.errmsg.indexOf('username') !== -1)
|
||||
throw new Meteor.Error(403, "Username already exists.");
|
||||
// XXX better error reporting for services.facebook.id duplicate, etc
|
||||
throw e;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "A user account system",
|
||||
version: "1.2.8"
|
||||
version: "1.2.9"
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Package.describe({
|
||||
summary: "Password support for accounts",
|
||||
version: "1.1.13"
|
||||
version: "1.2.12"
|
||||
});
|
||||
|
||||
Package.onUse(function(api) {
|
||||
api.use('npm-bcrypt@=0.8.6_3');
|
||||
api.use('npm-bcrypt@=0.8.7');
|
||||
|
||||
api.use([
|
||||
'accounts-base',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Login service for Twitter accounts",
|
||||
version: "1.0.10"
|
||||
version: "1.1.11"
|
||||
});
|
||||
|
||||
Package.onUse(function(api) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Update the client when new client code is available",
|
||||
version: '1.2.11'
|
||||
version: '1.3.11'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
@@ -76,22 +76,6 @@ BCp.processOneFileForTarget = function (inputFile, source) {
|
||||
extraFeatures.jscript = targetCouldBeInternetExplorer8;
|
||||
}
|
||||
|
||||
if (inputFile.isPackageFile()) {
|
||||
// When compiling package files, handle import/export syntax using
|
||||
// the official Babel plugin, so that package authors won't publish
|
||||
// code that relies on module.import and module.export, because such
|
||||
// code would fail on Meteor versions before 1.3.3. When compiling
|
||||
// application files, however, it's fine to rely on module.import
|
||||
// and module.export, and the developer experience will be much
|
||||
// better for it: faster compilation, real variables, import
|
||||
// statements inside conditional statements, etc.
|
||||
//
|
||||
// TODO Remove this once we are confident enough developers have
|
||||
// updated to a version of Meteor that supports module.import and
|
||||
// module.export.
|
||||
extraFeatures.legacyModules = true;
|
||||
}
|
||||
|
||||
var babelOptions = Babel.getDefaultOptions(extraFeatures);
|
||||
|
||||
this.inferExtraBabelOptions(inputFile, babelOptions, cacheDeps);
|
||||
|
||||
@@ -6,7 +6,7 @@ Package.describe({
|
||||
// isn't possible because you can't publish a non-recommended
|
||||
// release with package versions that don't have a pre-release
|
||||
// identifier at the end (eg, -dev)
|
||||
version: '6.8.5'
|
||||
version: '6.9.0'
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
Package.describe({
|
||||
name: "babel-runtime",
|
||||
summary: "Runtime support for output of Babel transpiler",
|
||||
version: '0.1.9_1',
|
||||
version: '0.1.10',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'caching-compiler',
|
||||
version: '1.0.6',
|
||||
version: '1.1.6',
|
||||
summary: 'An easy way to make compiler plugins cache',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Javascript dialect with fewer braces and semicolons",
|
||||
version: "1.1.4"
|
||||
version: "1.2.3"
|
||||
});
|
||||
|
||||
Package.registerBuildPlugin({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Given the set of the constraints, picks a satisfying configuration",
|
||||
version: "1.0.27"
|
||||
version: "1.1.0"
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
16
packages/ddp-client/.npm/package/npm-shrinkwrap.json
generated
16
packages/ddp-client/.npm/package/npm-shrinkwrap.json
generated
@@ -1,19 +1,19 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"faye-websocket": {
|
||||
"version": "0.9.4",
|
||||
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.4.tgz",
|
||||
"from": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.4.tgz",
|
||||
"version": "0.11.0",
|
||||
"resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.0.tgz",
|
||||
"from": "faye-websocket@0.11.0",
|
||||
"dependencies": {
|
||||
"websocket-driver": {
|
||||
"version": "0.5.4",
|
||||
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.4.tgz",
|
||||
"from": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.4.tgz",
|
||||
"version": "0.6.4",
|
||||
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.4.tgz",
|
||||
"from": "websocket-driver@>=0.5.1",
|
||||
"dependencies": {
|
||||
"websocket-extensions": {
|
||||
"version": "0.1.1",
|
||||
"resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz",
|
||||
"from": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.1.tgz"
|
||||
"from": "websocket-extensions@>=0.1.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -27,7 +27,7 @@
|
||||
"permessage-deflate": {
|
||||
"version": "0.1.3",
|
||||
"resolved": "https://registry.npmjs.org/permessage-deflate/-/permessage-deflate-0.1.3.tgz",
|
||||
"from": "https://registry.npmjs.org/permessage-deflate/-/permessage-deflate-0.1.3.tgz"
|
||||
"from": "permessage-deflate@0.1.3"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
Package.describe({
|
||||
summary: "Meteor's latency-compensated distributed data client",
|
||||
version: '1.2.9',
|
||||
version: '1.3.0',
|
||||
documentation: null
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
"faye-websocket": "0.9.4",
|
||||
"faye-websocket": "0.11.0",
|
||||
"lolex": "1.4.0",
|
||||
"permessage-deflate": "0.1.3"
|
||||
});
|
||||
|
||||
@@ -211,7 +211,7 @@ Tinytest.addAsync(
|
||||
Meteor.methods({
|
||||
testResolvedPromise(arg) {
|
||||
const invocation1 = DDP._CurrentInvocation.get();
|
||||
return new Promise.resolve(arg).then(result => {
|
||||
return Promise.resolve(arg).then(result => {
|
||||
const invocation2 = DDP._CurrentInvocation.get();
|
||||
// This equality holds because Promise callbacks are bound to the
|
||||
// dynamic environment where .then was called.
|
||||
@@ -223,7 +223,7 @@ Meteor.methods({
|
||||
},
|
||||
|
||||
testRejectedPromise(arg) {
|
||||
return new Promise.resolve(arg).then(result => {
|
||||
return Promise.resolve(arg).then(result => {
|
||||
throw new Meteor.Error(result + " raised Meteor.Error");
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Meteor's latency-compensated distributed data server",
|
||||
version: '1.2.10',
|
||||
version: '1.3.9',
|
||||
documentation: null
|
||||
});
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: "ecmascript-runtime",
|
||||
version: "0.2.12",
|
||||
version: "0.3.12",
|
||||
summary: "Polyfills for new ECMAScript 2015 APIs like Map and Set",
|
||||
git: "https://github.com/meteor/ecmascript-runtime",
|
||||
documentation: "README.md"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'ecmascript',
|
||||
version: '0.4.8',
|
||||
version: '0.5.7',
|
||||
summary: 'Compiler plugin that supports ES2015+ in all .js files',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Send email messages",
|
||||
version: "1.0.16"
|
||||
version: "1.1.16"
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: "es5-shim",
|
||||
version: "4.5.13",
|
||||
version: "4.6.13",
|
||||
summary: "Shims and polyfills to improve ECMAScript 5 support",
|
||||
documentation: "README.md"
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Make HTTP calls to remote servers",
|
||||
version: '1.1.8'
|
||||
version: '1.2.8'
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'jshint',
|
||||
version: '1.0.5',
|
||||
version: '1.1.5',
|
||||
summary: 'Lint all your JavaScript files with JSHint.',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'less',
|
||||
version: '2.6.5',
|
||||
version: '2.7.4',
|
||||
summary: 'Leaner CSS language',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Logging facility.",
|
||||
version: '1.0.14'
|
||||
version: '1.1.14'
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "The Meteor command-line tool",
|
||||
version: '1.3.5_1'
|
||||
version: '1.4.0'
|
||||
});
|
||||
|
||||
Package.includeTool();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Package.describe({
|
||||
summary: "Core Meteor environment",
|
||||
version: '1.1.16'
|
||||
version: '1.2.16'
|
||||
});
|
||||
|
||||
Package.registerBuildPlugin({
|
||||
|
||||
@@ -136,8 +136,9 @@ var rewriteRules = function (rules, mergedCssPath) {
|
||||
|
||||
|
||||
// We don't rewrite URLs starting with a protocol definition such as
|
||||
// http, https, or data.
|
||||
if (resource.protocol !== null) {
|
||||
// http, https, or data, or those with network-path references
|
||||
// i.e. //img.domain.com/cat.gif
|
||||
if (resource.protocol !== null || resource.href.startsWith('//')) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "CSS minifier",
|
||||
version: "1.1.13"
|
||||
version: "1.2.13"
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -78,6 +78,7 @@ Tinytest.add("minifier-css - url rewriting with media queries (ast rule recursio
|
||||
t("'/image.png'", "'image.png'", 'single quoted url');
|
||||
t('"./../image.png"', '"packages/image.png"', 'quoted parent directory');
|
||||
t('http://i.imgur.com/fBcdJIh.gif', 'http://i.imgur.com/fBcdJIh.gif', 'complete URL');
|
||||
t('//i.imgur.com/fBcdJIh.gif', '//i.imgur.com/fBcdJIh.gif', 'network-path reference');
|
||||
t('"http://i.imgur.com/fBcdJIh.gif"', '"http://i.imgur.com/fBcdJIh.gif"', 'complete quoted URL');
|
||||
t('data:image/png;base64,iVBORw0K=', 'data:image/png;base64,iVBORw0K=', 'data URI');
|
||||
t('http://', 'http://', 'malformed URL');
|
||||
@@ -90,6 +91,7 @@ Tinytest.add("minifier-css - url rewriting with media queries (ast rule recursio
|
||||
t('"/image.png"', '"image.png"', 'double quoted url');
|
||||
t("'/image.png'", "'image.png'", 'single quoted url');
|
||||
t('http://i.imgur.com/fBcdJIh.gif', 'http://i.imgur.com/fBcdJIh.gif', 'complete URL');
|
||||
t('//i.imgur.com/fBcdJIh.gif', '//i.imgur.com/fBcdJIh.gif', 'network-path reference');
|
||||
t('"http://i.imgur.com/fBcdJIh.gif"', '"http://i.imgur.com/fBcdJIh.gif"', 'complete quoted URL');
|
||||
t('data:image/png;base64,iVBORw0K=', 'data:image/png;base64,iVBORw0K=', 'data URI');
|
||||
t('http://', 'http://', 'malformed URL');
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "JavaScript minifier",
|
||||
version: "1.1.13"
|
||||
version: "1.2.13"
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: "modules-runtime",
|
||||
version: "0.6.5",
|
||||
version: "0.7.5",
|
||||
summary: "CommonJS module system",
|
||||
git: "https://github.com/benjamn/install",
|
||||
documentation: "README.md"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: "modules",
|
||||
version: "0.6.5",
|
||||
version: "0.7.5",
|
||||
summary: "CommonJS module system",
|
||||
documentation: "README.md"
|
||||
});
|
||||
|
||||
@@ -317,7 +317,7 @@ _.extend(Mongo.Collection.prototype, {
|
||||
},
|
||||
|
||||
/**
|
||||
* @summary Finds the first document that matches the selector, as ordered by sort and skip options.
|
||||
* @summary Finds the first document that matches the selector, as ordered by sort and skip options. Returns `undefined` if no matching document is found.
|
||||
* @locus Anywhere
|
||||
* @method findOne
|
||||
* @memberOf Mongo.Collection
|
||||
@@ -537,7 +537,7 @@ Mongo.Collection.prototype.insert = function insert(doc, callback) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Modify one or more documents in the collection. Returns the number of affected documents.
|
||||
* @summary Modify one or more documents in the collection. Returns the number of matched documents.
|
||||
* @locus Anywhere
|
||||
* @method update
|
||||
* @memberOf Mongo.Collection
|
||||
|
||||
10
packages/mongo/connection_options.js
Normal file
10
packages/mongo/connection_options.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* @summary Allows for user specified connection options
|
||||
* @example http://mongodb.github.io/node-mongodb-native/2.1/reference/connecting/connection-settings/
|
||||
* @locus Server
|
||||
* @param {Object} options User specified Mongo connection options
|
||||
*/
|
||||
Mongo.setConnectionOptions = function setConnectionOptions (options) {
|
||||
check(options, Object);
|
||||
Mongo._connectionOptions = options;
|
||||
}
|
||||
@@ -130,7 +130,8 @@ MongoConnection = function (url, options) {
|
||||
self._observeMultiplexers = {};
|
||||
self._onFailoverHook = new Hook;
|
||||
|
||||
var mongoOptions = {db: {safe: true}, server: {}, replSet: {}};
|
||||
var mongoOptions = _.extend({db: {safe: true}, server: {}, replSet: {}},
|
||||
Mongo._connectionOptions);
|
||||
|
||||
// Set autoReconnect to true, unless passed on the URL. Why someone
|
||||
// would want to set autoReconnect to false, I'm not really sure, but
|
||||
@@ -151,8 +152,8 @@ MongoConnection = function (url, options) {
|
||||
mongoOptions.db.native_parser = false;
|
||||
}
|
||||
|
||||
// XXX maybe we should have a better way of allowing users to configure the
|
||||
// underlying Mongo driver
|
||||
// Internally the oplog connections specify their own poolSize
|
||||
// which we don't want to overwrite with any user defined value
|
||||
if (_.has(options, 'poolSize')) {
|
||||
// If we just set this for "server", replSet will override it. If we just
|
||||
// set it for replSet, it will be ignored if we're not using a replSet.
|
||||
@@ -180,8 +181,10 @@ MongoConnection = function (url, options) {
|
||||
}
|
||||
|
||||
// First, figure out what the current primary is, if any.
|
||||
if (db.serverConfig._state.master)
|
||||
self._primary = db.serverConfig._state.master.name;
|
||||
if (db.serverConfig.isMasterDoc) {
|
||||
self._primary = db.serverConfig.isMasterDoc.primary;
|
||||
}
|
||||
|
||||
db.serverConfig.on(
|
||||
'joined', Meteor.bindEnvironment(function (kind, doc) {
|
||||
if (kind === 'primary') {
|
||||
@@ -408,8 +411,11 @@ MongoConnection.prototype._remove = function (collection_name, selector,
|
||||
|
||||
try {
|
||||
var collection = self.rawCollection(collection_name);
|
||||
var wrappedCallback = function(err, driverResult) {
|
||||
callback(err, transformResult(driverResult).numberAffected);
|
||||
};
|
||||
collection.remove(replaceTypes(selector, replaceMeteorAtomWithMongo),
|
||||
{safe: true}, callback);
|
||||
{safe: true}, wrappedCallback);
|
||||
} catch (e) {
|
||||
write.committed();
|
||||
throw e;
|
||||
@@ -553,19 +559,24 @@ MongoConnection.prototype._update = function (collection_name, selector, mod,
|
||||
} else {
|
||||
collection.update(
|
||||
mongoSelector, mongoMod, mongoOpts,
|
||||
bindEnvironmentForWrite(function (err, result, extra) {
|
||||
bindEnvironmentForWrite(function (err, result) {
|
||||
if (! err) {
|
||||
if (result && options._returnObject) {
|
||||
result = { numberAffected: result };
|
||||
var meteorResult = transformResult(result);
|
||||
if (meteorResult && options._returnObject) {
|
||||
// If this was an upsert() call, and we ended up
|
||||
// inserting a new doc and we know its id, then
|
||||
// return that id as well.
|
||||
if (options.upsert && knownId &&
|
||||
! extra.updatedExisting)
|
||||
result.insertedId = knownId;
|
||||
|
||||
if (options.upsert && meteorResult.insertedId && knownId) {
|
||||
meteorResult.insertedId = knownId;
|
||||
}
|
||||
callback(err, meteorResult);
|
||||
} else {
|
||||
callback(err, meteorResult.numberAffected);
|
||||
}
|
||||
} else {
|
||||
callback(err);
|
||||
}
|
||||
callback(err, result);
|
||||
}));
|
||||
}
|
||||
} catch (e) {
|
||||
@@ -591,6 +602,29 @@ var isModificationMod = function (mod) {
|
||||
return isModify;
|
||||
};
|
||||
|
||||
var transformResult = function (driverResult) {
|
||||
var meteorResult = { numberAffected: 0 };
|
||||
if (driverResult) {
|
||||
mongoResult = driverResult.result;
|
||||
|
||||
// On updates with upsert:true, the inserted values come as a list of
|
||||
// upserted values -- even with options.multi, when the upsert does insert,
|
||||
// it only inserts one element.
|
||||
if (mongoResult.upserted) {
|
||||
meteorResult.numberAffected += mongoResult.upserted.length;
|
||||
|
||||
if (mongoResult.upserted.length == 1) {
|
||||
meteorResult.insertedId = mongoResult.upserted[0]._id;
|
||||
}
|
||||
} else {
|
||||
meteorResult.numberAffected = mongoResult.n;
|
||||
}
|
||||
}
|
||||
|
||||
return meteorResult;
|
||||
};
|
||||
|
||||
|
||||
var NUM_OPTIMISTIC_TRIES = 3;
|
||||
|
||||
// exposed for testing
|
||||
@@ -599,13 +633,13 @@ MongoConnection._isCannotChangeIdError = function (err) {
|
||||
// checks should work, but just to be safe...
|
||||
if (err.code === 13596)
|
||||
return true;
|
||||
if (err.err.indexOf("cannot change _id of a document") === 0)
|
||||
if (err.errmsg.indexOf("cannot change _id of a document") === 0)
|
||||
return true;
|
||||
|
||||
// Now look for what it looks like in Mongo 2.6. We don't use the error code
|
||||
// here, because the error code we observed it producing (16837) appears to be
|
||||
// a far more generic error code based on examining the source.
|
||||
if (err.err.indexOf("The _id field cannot be changed") === 0)
|
||||
if (err.errmsg.indexOf("The _id field cannot be changed") === 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@@ -691,14 +725,15 @@ var simulateUpsertWithInsertedId = function (collection, selector, mod,
|
||||
} else {
|
||||
collection.update(selector, mod, mongoOptsForUpdate,
|
||||
bindEnvironmentForWrite(function (err, result) {
|
||||
if (err)
|
||||
if (err) {
|
||||
callback(err);
|
||||
else if (result)
|
||||
} else if (result && result.result.n != 0) {
|
||||
callback(null, {
|
||||
numberAffected: result
|
||||
numberAffected: result.result.n
|
||||
});
|
||||
else
|
||||
} else {
|
||||
doConditionalInsert();
|
||||
}
|
||||
}));
|
||||
}
|
||||
};
|
||||
@@ -720,8 +755,8 @@ var simulateUpsertWithInsertedId = function (collection, selector, mod,
|
||||
}
|
||||
} else {
|
||||
callback(null, {
|
||||
numberAffected: result,
|
||||
insertedId: insertedId
|
||||
numberAffected: result.result.upserted.length,
|
||||
insertedId: insertedId,
|
||||
});
|
||||
}
|
||||
}));
|
||||
@@ -1054,9 +1089,9 @@ _.extend(SynchronousCursor.prototype, {
|
||||
return self.map(_.identity);
|
||||
},
|
||||
|
||||
count: function () {
|
||||
count: function (applySkipLimit: false) {
|
||||
var self = this;
|
||||
return self._synchronousCount().wait();
|
||||
return self._synchronousCount(applySkipLimit).wait();
|
||||
},
|
||||
|
||||
// This method is NOT wrapped in Cursor.
|
||||
|
||||
@@ -310,6 +310,16 @@ Tinytest.addAsync("mongo-livedata - basics, " + idGeneration, function (test, on
|
||||
test.equal(coll.findOne({run: run}, {sort: {x: -1}, skip: 1}).x, 1);
|
||||
|
||||
|
||||
// Regression test for https://github.com/meteor/meteor/issues/7436
|
||||
// - ensure applySkipLimit defaults to false for count()
|
||||
// Note that the current behavior is inconsistent on the client.
|
||||
// (https://github.com/meteor/meteor/issues/1201)
|
||||
if (Meteor.isServer) {
|
||||
test.equal(coll.find({run: run}, {limit: 1}).count(), 2);
|
||||
test.equal(coll.find({run: run}, {limit: 1}).count(true), 1);
|
||||
test.equal(coll.find({run: run}, {limit: 1}).count(false), 2);
|
||||
}
|
||||
|
||||
var cur = coll.find({run: run}, {sort: ["x"]});
|
||||
var total = 0;
|
||||
var index = 0;
|
||||
@@ -3236,7 +3246,7 @@ Meteor.isServer && Tinytest.add(
|
||||
|
||||
Meteor.isServer && Tinytest.add("mongo-livedata - npm modules", function (test) {
|
||||
// Make sure the version number looks like a version number.
|
||||
test.matches(MongoInternals.NpmModules.mongodb.version, /^1\.(\d+)\.(\d+)/);
|
||||
test.matches(MongoInternals.NpmModules.mongodb.version, /^2\.(\d+)\.(\d+)/);
|
||||
test.equal(typeof(MongoInternals.NpmModules.mongodb.module), 'function');
|
||||
test.equal(typeof(MongoInternals.NpmModules.mongodb.module.connect),
|
||||
'function');
|
||||
@@ -3345,3 +3355,87 @@ if (Meteor.isClient) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (Meteor.isServer) {
|
||||
Tinytest.add('mongo update/upsert - returns nMatched as numberAffected', function (test, onComplete) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('update_nmatched'+collName);
|
||||
|
||||
coll.insert({animal: 'cat', legs: 4});
|
||||
coll.insert({animal: 'dog', legs: 4});
|
||||
coll.insert({animal: 'echidna', legs: 4});
|
||||
coll.insert({animal: 'platypus', legs: 4});
|
||||
coll.insert({animal: 'starfish', legs: 5});
|
||||
|
||||
var affected = coll.update({legs: 4}, {$set: {category: 'quadruped'}})
|
||||
test.equal(affected, 1);
|
||||
|
||||
//Changes only 3 but matched 4 documents
|
||||
var affected = coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true})
|
||||
test.equal(affected, 4);
|
||||
|
||||
//Again, changes nothing but returns nModified
|
||||
var affected = coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true})
|
||||
test.equal(affected, 4);
|
||||
|
||||
//upsert:true changes nothing, 4 modified
|
||||
var affected = coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true, upsert:true})
|
||||
test.equal(affected, 4);
|
||||
|
||||
//upsert method works as upsert:true
|
||||
var result = coll.upsert({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true})
|
||||
test.equal(result.numberAffected, 4);
|
||||
});
|
||||
|
||||
Tinytest.addAsync('mongo livedata - update/upsert callback returns nMatched as numberAffected', function (test, onComplete) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('update_nmatched'+collName);
|
||||
|
||||
coll.insert({animal: 'cat', legs: 4});
|
||||
coll.insert({animal: 'dog', legs: 4});
|
||||
coll.insert({animal: 'echidna', legs: 4});
|
||||
coll.insert({animal: 'platypus', legs: 4});
|
||||
coll.insert({animal: 'starfish', legs: 5});
|
||||
|
||||
var test1 = function () {
|
||||
coll.update({legs: 4}, {$set: {category: 'quadruped'}}, function (err, result) {
|
||||
test.equal(result, 1);
|
||||
test2();
|
||||
})
|
||||
}
|
||||
|
||||
var test2 = function () {
|
||||
//Changes only 3 but matched 4 documents
|
||||
coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true}, function (err, result) {
|
||||
test.equal(result, 4);
|
||||
test3();
|
||||
});
|
||||
}
|
||||
|
||||
var test3 = function () {
|
||||
//Again, changes nothing but returns nModified
|
||||
coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true}, function (err, result) {
|
||||
test.equal(result, 4);
|
||||
test4();
|
||||
});
|
||||
}
|
||||
|
||||
var test4 = function () {
|
||||
//upsert:true changes nothing, 4 modified
|
||||
coll.update({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true, upsert:true}, function (err, result) {
|
||||
test.equal(result, 4);
|
||||
test5();
|
||||
});
|
||||
}
|
||||
|
||||
var test5 = function () {
|
||||
//upsert method works as upsert:true
|
||||
coll.upsert({legs: 4}, {$set: {category: 'quadruped'}}, {multi: true}, function (err, result) {
|
||||
test.equal(result.numberAffected, 4);
|
||||
onComplete();
|
||||
});
|
||||
}
|
||||
|
||||
test1();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -207,12 +207,14 @@ _.extend(OplogHandle.prototype, {
|
||||
|
||||
// Now, make sure that there actually is a repl set here. If not, oplog
|
||||
// tailing won't ever find anything!
|
||||
// More on the isMasterDoc
|
||||
// https://docs.mongodb.com/manual/reference/command/isMaster/
|
||||
var f = new Future;
|
||||
self._oplogLastEntryConnection.db.admin().command(
|
||||
{ ismaster: 1 }, f.resolver());
|
||||
var isMasterDoc = f.wait();
|
||||
if (!(isMasterDoc && isMasterDoc.documents && isMasterDoc.documents[0] &&
|
||||
isMasterDoc.documents[0].setName)) {
|
||||
|
||||
if (!(isMasterDoc && isMasterDoc.setName)) {
|
||||
throw Error("$MONGO_OPLOG_URL must be set to the 'local' database of " +
|
||||
"a Mongo replica set");
|
||||
}
|
||||
@@ -321,5 +323,13 @@ _.extend(OplogHandle.prototype, {
|
||||
var sequencer = self._catchingUpFutures.shift();
|
||||
sequencer.future.return();
|
||||
}
|
||||
},
|
||||
|
||||
//Methods used on tests to dinamically change TOO_FAR_BEHIND
|
||||
_defineTooFarBehind: function(value) {
|
||||
TOO_FAR_BEHIND = value;
|
||||
},
|
||||
_resetTooFarBehind: function() {
|
||||
TOO_FAR_BEHIND = process.env.METEOR_OPLOG_TOO_FAR_BEHIND || 2000;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -63,6 +63,14 @@ process.env.MONGO_OPLOG_URL && testAsyncMulti(
|
||||
|
||||
// Fill collection with lots of irrelevant objects (red cats) and some
|
||||
// relevant ones (blue dogs).
|
||||
|
||||
// After updating to mongo 3.2 with the 2.1.18 driver it was no longer
|
||||
// possible to make this test fail with TOO_FAR_BEHIND = 2000.
|
||||
// The documents waiting to be processed would hardly go beyond 1000
|
||||
// using mongo 3.2 with WiredTiger
|
||||
MongoInternals.defaultRemoteCollectionDriver().mongo
|
||||
._oplogHandle._defineTooFarBehind(800);
|
||||
|
||||
self.IRRELEVANT_SIZE = 15000;
|
||||
self.RELEVANT_SIZE = 10;
|
||||
var docs = [];
|
||||
@@ -140,6 +148,10 @@ process.env.MONGO_OPLOG_URL && testAsyncMulti(
|
||||
var self = this;
|
||||
test.isTrue(self.skipped);
|
||||
|
||||
//This gets the TOO_FAR_BEHIND back to its initial value
|
||||
MongoInternals.defaultRemoteCollectionDriver().mongo
|
||||
._oplogHandle._resetTooFarBehind();
|
||||
|
||||
self.skipHandle.stop();
|
||||
self.subHandle.stop();
|
||||
self.collection.remove({});
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
Package.describe({
|
||||
summary: "Adaptor for using MongoDB and Minimongo over DDP",
|
||||
version: '1.1.9_1'
|
||||
version: '1.1.10'
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
@@ -74,6 +74,7 @@ Package.onUse(function (api) {
|
||||
api.addFiles('local_collection_driver.js', ['client', 'server']);
|
||||
api.addFiles('remote_collection_driver.js', 'server');
|
||||
api.addFiles('collection.js', ['client', 'server']);
|
||||
api.addFiles('connection_options.js', 'server');
|
||||
});
|
||||
|
||||
Package.onTest(function (api) {
|
||||
@@ -84,6 +85,7 @@ Package.onTest(function (api) {
|
||||
// XXX test order dependency: the allow_tests "partial allow" test
|
||||
// fails if it is run before mongo_livedata_tests.
|
||||
api.addFiles('mongo_livedata_tests.js', ['client', 'server']);
|
||||
api.addFiles('upsert_compatibility_test.js', 'server');
|
||||
api.addFiles('allow_tests.js', ['client', 'server']);
|
||||
api.addFiles('collection_tests.js', ['client', 'server']);
|
||||
api.addFiles('observe_changes_tests.js', ['client', 'server']);
|
||||
|
||||
151
packages/mongo/upsert_compatibility_test.js
Normal file
151
packages/mongo/upsert_compatibility_test.js
Normal file
@@ -0,0 +1,151 @@
|
||||
Tinytest.add('mongo livedata - native upsert - id type MONGO with MODIFIERS update', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'MONGO'});
|
||||
|
||||
coll.insert({foo: 1});
|
||||
var result = coll.upsert({foo: 1}, {$set: {foo:2}});
|
||||
var updated = coll.findOne({foo: 2});
|
||||
|
||||
test.equal(result.insertedId, undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(updated._id instanceof Mongo.ObjectID);
|
||||
|
||||
delete updated['_id'];
|
||||
test.equal(EJSON.equals(updated, {foo: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type MONGO with MODIFIERS insert', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'MONGO'});
|
||||
|
||||
var result = coll.upsert({foo: 1}, {$set: {bar:2}});
|
||||
var inserted = coll.findOne({foo: 1});
|
||||
|
||||
test.isTrue(result.insertedId !== undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(inserted._id instanceof Mongo.ObjectID);
|
||||
test.equal(inserted._id, result.insertedId)
|
||||
|
||||
delete inserted['_id'];
|
||||
test.equal(EJSON.equals(inserted, {foo: 1, bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type MONGO PLAIN OBJECT update', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'MONGO'});
|
||||
|
||||
coll.insert({foo: 1, baz: 42});
|
||||
var result = coll.upsert({foo: 1}, {bar:2});
|
||||
var updated = coll.findOne({bar: 2});
|
||||
|
||||
test.isTrue(result.insertedId === undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(updated._id instanceof Mongo.ObjectID);
|
||||
|
||||
delete updated['_id'];
|
||||
test.equal(EJSON.equals(updated, {bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type MONGO PLAIN OBJECT insert', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'MONGO'});
|
||||
|
||||
var result = coll.upsert({foo: 1}, {bar:2});
|
||||
var inserted = coll.findOne({bar: 2});
|
||||
|
||||
test.isTrue(result.insertedId !== undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(inserted._id instanceof Mongo.ObjectID);
|
||||
test.isTrue(result.insertedId instanceof Mongo.ObjectID);
|
||||
test.equal(inserted._id, result.insertedId);
|
||||
|
||||
delete inserted['_id'];
|
||||
test.equal(EJSON.equals(inserted, {bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type STRING with MODIFIERS update', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'STRING'});
|
||||
|
||||
coll.insert({foo: 1});
|
||||
var result = coll.upsert({foo: 1}, {$set: {foo:2}});
|
||||
var updated = coll.findOne({foo: 2});
|
||||
|
||||
test.equal(result.insertedId, undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(typeof updated._id === 'string');
|
||||
|
||||
delete updated['_id'];
|
||||
test.equal(EJSON.equals(updated, {foo: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type STRING with MODIFIERS insert', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'STRING'});
|
||||
|
||||
var result = coll.upsert({foo: 1}, {$set: {bar:2}});
|
||||
var inserted = coll.findOne({foo: 1});
|
||||
|
||||
test.isTrue(result.insertedId !== undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(typeof inserted._id === 'string');
|
||||
test.equal(inserted._id, result.insertedId);
|
||||
|
||||
delete inserted['_id'];
|
||||
test.equal(EJSON.equals(inserted, {foo: 1, bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type STRING PLAIN OBJECT update', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'STRING'});
|
||||
|
||||
coll.insert({foo: 1, baz: 42});
|
||||
var result = coll.upsert({foo: 1}, {bar:2});
|
||||
var updated = coll.findOne({bar: 2});
|
||||
|
||||
test.isTrue(result.insertedId === undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(typeof updated._id === 'string');
|
||||
|
||||
delete updated['_id'];
|
||||
test.equal(EJSON.equals(updated, {bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - id type STRING PLAIN OBJECT insert', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'STRING'});
|
||||
|
||||
var result = coll.upsert({foo: 1}, {bar:2});
|
||||
var inserted = coll.findOne({bar: 2});
|
||||
|
||||
test.isTrue(result.insertedId !== undefined);
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(typeof inserted._id === 'string');
|
||||
test.equal(inserted._id, result.insertedId);
|
||||
|
||||
delete inserted['_id'];
|
||||
test.equal(EJSON.equals(inserted, {bar: 2}), true);
|
||||
});
|
||||
|
||||
Tinytest.add('mongo livedata - native upsert - MONGO passing id insert', function (test) {
|
||||
var collName = Random.id();
|
||||
var coll = new Mongo.Collection('native_upsert_'+collName, {idGeneration: 'MONGO'});
|
||||
|
||||
var result = coll.upsert({foo: 1}, {_id: 'meu id'});
|
||||
var inserted = coll.findOne({_id: 'meu id'});
|
||||
|
||||
test.equal(result.insertedId, 'meu id');
|
||||
test.equal(result.numberAffected, 1);
|
||||
|
||||
test.isTrue(typeof inserted._id === 'string');
|
||||
|
||||
test.equal(EJSON.equals(inserted, {_id: 'meu id'}), true);
|
||||
});
|
||||
@@ -1,21 +1,19 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"bcrypt": {
|
||||
"version": "0.8.6",
|
||||
"resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-0.8.6.tgz",
|
||||
"from": "bcrypt@0.8.6",
|
||||
"dependencies": {
|
||||
"bindings": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
|
||||
"from": "bindings@1.2.1"
|
||||
},
|
||||
"nan": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.2.1.tgz",
|
||||
"from": "nan@2.2.1"
|
||||
}
|
||||
}
|
||||
"version": "0.8.7",
|
||||
"resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-0.8.7.tgz",
|
||||
"from": "bcrypt@0.8.7"
|
||||
},
|
||||
"bindings": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
|
||||
"from": "bindings@1.2.1"
|
||||
},
|
||||
"nan": {
|
||||
"version": "2.3.5",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.3.5.tgz",
|
||||
"from": "nan@2.3.5"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
meteor@1.1.16
|
||||
npm-bcrypt@0.8.6_3
|
||||
npm-bcrypt@0.8.7
|
||||
underscore@1.0.9
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
Package.describe({
|
||||
summary: "Wrapper around the bcrypt npm package",
|
||||
version: '0.8.6_3',
|
||||
version: '0.8.7',
|
||||
documentation: null
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
bcrypt: '0.8.6'
|
||||
bcrypt: '0.8.7'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
@@ -1,14 +1,21 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"node-aes-gcm": {
|
||||
"version": "0.1.5",
|
||||
"resolved": "https://registry.npmjs.org/node-aes-gcm/-/node-aes-gcm-0.1.5.tgz",
|
||||
"from": "node-aes-gcm@0.1.5",
|
||||
"meteor-node-aes-gcm": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/meteor-node-aes-gcm/-/meteor-node-aes-gcm-0.1.7.tgz",
|
||||
"from": "meteor-node-aes-gcm@0.1.7",
|
||||
"dependencies": {
|
||||
"nan": {
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-1.9.0.tgz",
|
||||
"from": "nan@>=1.7.0 <2.0.0"
|
||||
"node-aes-gcm": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/node-aes-gcm/-/node-aes-gcm-0.1.7.tgz",
|
||||
"from": "node-aes-gcm@0.1.7",
|
||||
"dependencies": {
|
||||
"nan": {
|
||||
"version": "2.3.3",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.3.3.tgz",
|
||||
"from": "nan@>=2.3.0 <2.4.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
Package.describe({
|
||||
summary: "Wrapper around the node-aes-gcm npm package",
|
||||
version: '0.1.5_2',
|
||||
version: '0.1.7_4',
|
||||
documentation: null
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
'node-aes-gcm': '0.1.5'
|
||||
'meteor-node-aes-gcm': '0.1.7'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
api.use("modules@0.6.1");
|
||||
api.export('NpmModuleNodeAesGcm', 'server');
|
||||
api.addFiles('wrapper.js', 'server');
|
||||
});
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
try {
|
||||
NpmModuleNodeAesGcm = Npm.require('node-aes-gcm');
|
||||
NpmModuleNodeAesGcm = require('meteor-node-aes-gcm');
|
||||
} catch (err) {
|
||||
if (process.platform === "win32" &&
|
||||
err.message.match(/specified module could not be found/)) {
|
||||
// the user probably doesn't have OpenSSL installed.
|
||||
throw new Error(
|
||||
"Couldn't load the package 'npm-node-aes-gcm'. This is probably because you " +
|
||||
"Couldn't load the package 'meteor-node-aes-gcm'. This is probably because you " +
|
||||
"don't have OpenSSL installed. See the README for details and directions: " +
|
||||
"https://github.com/meteor/meteor/blob/devel/packages/non-core/npm-node-aes-gcm/README.md");
|
||||
} else {
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
112
packages/npm-mongo/.npm/package/npm-shrinkwrap.json
generated
112
packages/npm-mongo/.npm/package/npm-shrinkwrap.json
generated
@@ -1,60 +1,64 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"bson": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/bson/-/bson-0.5.2.tgz",
|
||||
"from": "bson@>=0.5.1 <0.6.0"
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"from": "core-util-is@>=1.0.0 <1.1.0"
|
||||
},
|
||||
"es6-promise": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
|
||||
"from": "es6-promise@3.0.2"
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
|
||||
"from": "inherits@>=2.0.1 <2.1.0"
|
||||
},
|
||||
"isarray": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
|
||||
"from": "isarray@0.0.1"
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "1.4.39",
|
||||
"resolved": "https://github.com/meteor/node-mongodb-native/tarball/9c7441e87fbec059dc0b70bbb70734404b994d71",
|
||||
"from": "https://github.com/meteor/node-mongodb-native/tarball/9c7441e87fbec059dc0b70bbb70734404b994d71",
|
||||
"dependencies": {
|
||||
"bson": {
|
||||
"version": "0.2.18",
|
||||
"resolved": "https://github.com/meteor/js-bson/tarball/0103b53",
|
||||
"from": "https://github.com/meteor/js-bson/tarball/0103b53",
|
||||
"dependencies": {
|
||||
"nan": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/nan/-/nan-1.5.1.tgz",
|
||||
"from": "https://registry.npmjs.org/nan/-/nan-1.5.1.tgz"
|
||||
}
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
|
||||
"from": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
|
||||
"dependencies": {
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
|
||||
"from": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
|
||||
},
|
||||
"inherits": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
|
||||
"from": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz"
|
||||
},
|
||||
"isarray": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
|
||||
"from": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz",
|
||||
"from": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz"
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "0.10.31",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
|
||||
"from": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz"
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||
"from": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
"version": "2.2.4",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.4.tgz",
|
||||
"from": "mongodb@2.2.4"
|
||||
},
|
||||
"mongodb-core": {
|
||||
"version": "2.0.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.0.6.tgz",
|
||||
"from": "mongodb-core@2.0.6"
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "1.0.31",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.31.tgz",
|
||||
"from": "readable-stream@1.0.31"
|
||||
},
|
||||
"require_optional": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.0.tgz",
|
||||
"from": "require_optional@>=1.0.0 <1.1.0"
|
||||
},
|
||||
"resolve-from": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
|
||||
"from": "resolve-from@>=2.0.0 <3.0.0"
|
||||
},
|
||||
"semver": {
|
||||
"version": "5.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
|
||||
"from": "semver@>=5.1.0 <6.0.0"
|
||||
},
|
||||
"string_decoder": {
|
||||
"version": "0.10.31",
|
||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
|
||||
"from": "string_decoder@>=0.10.0 <0.11.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,17 +3,12 @@
|
||||
|
||||
Package.describe({
|
||||
summary: "Wrapper around the mongo npm package",
|
||||
version: '1.4.45',
|
||||
version: '1.5.45',
|
||||
documentation: null
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
// 1.4.32 (and bson 0.2.18) with optional native dependencies (bson native
|
||||
// piece and kerberos) ripped out, which means we don't have to do the
|
||||
// publish-for-arch dance every time we make a Meteor release.
|
||||
// XXX move the npm dependency into a non-core versioned package and allow
|
||||
// it to use C++ bson
|
||||
mongodb: "https://github.com/meteor/node-mongodb-native/tarball/9c7441e87fbec059dc0b70bbb70734404b994d71"
|
||||
mongodb: "2.2.4"
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
Package.describe({
|
||||
summary: "Encrypt account secrets stored in the database",
|
||||
version: '1.0.13'
|
||||
version: '1.1.13'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
api.use("npm-node-aes-gcm@=0.1.5_2");
|
||||
api.use("npm-node-aes-gcm@=0.1.7_4");
|
||||
|
||||
api.export("OAuthEncryption", ["server"]);
|
||||
api.use([
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: "promise",
|
||||
version: "0.7.3",
|
||||
version: "0.8.3",
|
||||
summary: "ECMAScript 2015 Promise polyfill with Fiber support",
|
||||
git: "https://github.com/meteor/promise",
|
||||
documentation: "README.md"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'standard-minifier-css',
|
||||
version: '1.0.8',
|
||||
version: '1.1.8',
|
||||
summary: 'Standard css minifier used with Meteor apps by default.',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
name: 'standard-minifier-js',
|
||||
version: '1.0.8',
|
||||
version: '1.1.8',
|
||||
summary: 'Standard javascript minifiers used with Meteor apps by default.',
|
||||
documentation: 'README.md'
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Package.describe({
|
||||
version: '1.0.12',
|
||||
version: '1.1.11',
|
||||
// Brief, one-line summary of the package.
|
||||
summary: 'Define static page content in .html files',
|
||||
git: 'https://github.com/meteor/meteor',
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: 'Expressive, dynamic, robust CSS',
|
||||
version: "2.512.5"
|
||||
version: "2.513.4"
|
||||
});
|
||||
|
||||
Package.registerBuildPlugin({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Allows templates to be defined in .html files",
|
||||
version: '1.1.14'
|
||||
version: '1.2.13'
|
||||
});
|
||||
|
||||
// Today, this package is closely intertwined with Handlebars, meaning
|
||||
|
||||
@@ -10,7 +10,7 @@ export PATH=$METEOR_HOME:$PATH
|
||||
|
||||
export URL='http://localhost:4096/'
|
||||
|
||||
exec 3< <(meteor test-packages --driver-package test-in-console -p 4096 --exclude $TEST_PACKAGES_EXCLUDE)
|
||||
exec 3< <(meteor test-packages --driver-package test-in-console -p 4096 --exclude ${TEST_PACKAGES_EXCLUDE:-''})
|
||||
EXEC_PID=$!
|
||||
|
||||
sed '/test-in-console listening$/q' <&3
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Dependency tracker to allow reactive callbacks",
|
||||
version: '1.0.15'
|
||||
version: '1.1.0'
|
||||
});
|
||||
|
||||
Package.onUse(function (api) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Twitter OAuth flow",
|
||||
version: '1.1.11'
|
||||
version: '1.1.12'
|
||||
});
|
||||
|
||||
Package.onUse(function(api) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "Serves a Meteor app over HTTP",
|
||||
version: '1.2.11'
|
||||
version: '1.3.10'
|
||||
});
|
||||
|
||||
Npm.depends({connect: "2.30.2",
|
||||
|
||||
@@ -222,8 +222,10 @@ WebApp._timeoutAdjustmentRequestCallback = function (req, res) {
|
||||
// Insert our new finish listener to run BEFORE the existing one which removes
|
||||
// the response from the socket.
|
||||
var finishListeners = res.listeners('finish');
|
||||
// XXX Apparently in Node 0.12 this event is now called 'prefinish'.
|
||||
// XXX Apparently in Node 0.12 this event was called 'prefinish'.
|
||||
// https://github.com/joyent/node/commit/7c9b6070
|
||||
// But it has switched back to 'finish' in Node v4:
|
||||
// https://github.com/nodejs/node/pull/1411
|
||||
res.removeAllListeners('finish');
|
||||
res.on('finish', function () {
|
||||
res.setTimeout(SHORT_SOCKET_TIMEOUT);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
Package.describe({
|
||||
summary: "An XML builder for node.js similar to java-xmlbuilder.",
|
||||
version: '2.4.13'
|
||||
version: '2.5.13'
|
||||
});
|
||||
|
||||
Npm.depends({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"track": "METEOR",
|
||||
"version": "1.3.5.1-rc.1",
|
||||
"version": "1.4-rc.2",
|
||||
"recommended": false,
|
||||
"official": false,
|
||||
"description": "Meteor"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"track": "METEOR",
|
||||
"version": "1.3.5.1",
|
||||
"version": "1.4",
|
||||
"recommended": false,
|
||||
"official": true,
|
||||
"description": "The Official Meteor Distribution"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
require 'tmpdir'
|
||||
|
||||
mongo_install_urls = {
|
||||
"3.2.6" => "https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.2.6.tgz",
|
||||
"3.0.5" => "https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.0.5.tgz",
|
||||
"2.6.10" => "http://downloads.mongodb.org/osx/mongodb-osx-x86_64-2.6.10.tgz",
|
||||
"2.4.14" => "http://downloads.mongodb.org/osx/mongodb-osx-x86_64-2.4.14.tgz"
|
||||
@@ -16,15 +17,19 @@ mongo_port = "12345"
|
||||
|
||||
dirname = File.dirname(__FILE__)
|
||||
path_to_test_in_console = File.realpath File.join dirname, "..", "..", "packages", "test-in-console", "run.sh"
|
||||
path_to_output = File.realpath File.join dirname, "..", "..", "mongo-test-output"
|
||||
path_to_output = File.join dirname, "..", "..", "mongo-test-output"
|
||||
|
||||
unless Dir[path_to_output]
|
||||
unless Dir[path_to_output] != []
|
||||
Dir.mkdir path_to_output
|
||||
end
|
||||
|
||||
path_to_output = File.realpath path_to_output
|
||||
|
||||
puts "Putting output in: #{path_to_output}/"
|
||||
|
||||
["3.0.5", "2.6.10", "2.4.14"].each do |mongo_version|
|
||||
test_env = "TEST_PACKAGES_EXCLUDE=\"less\""
|
||||
|
||||
["3.2.6", "3.0.5", "2.6.10", "2.4.14"].each do |mongo_version|
|
||||
puts "Installing and testing with Mongo #{mongo_version}..."
|
||||
|
||||
Dir.mktmpdir "mongo_install" do |mongo_install_dir|
|
||||
@@ -43,7 +48,7 @@ puts "Putting output in: #{path_to_output}/"
|
||||
|
||||
puts "Running test-in-console from: #{path_to_test_in_console}"
|
||||
puts "Passing #{mongo_env}"
|
||||
`#{mongo_env} bash #{path_to_test_in_console} > #{path_to_output}/#{mongo_version}.txt`
|
||||
`#{test_env} #{mongo_env} bash #{path_to_test_in_console} > #{path_to_output}/#{mongo_version}.txt`
|
||||
|
||||
# Kill Mongo
|
||||
Process.kill "TERM", pid
|
||||
|
||||
@@ -5,7 +5,8 @@ set -u
|
||||
|
||||
UNAME=$(uname)
|
||||
ARCH=$(uname -m)
|
||||
NODE_VERSION=0.10.46
|
||||
MONGO_VERSION=3.2.6
|
||||
NODE_VERSION=4.4.7
|
||||
NPM_VERSION=3.10.5
|
||||
|
||||
if [ "$UNAME" == "Linux" ] ; then
|
||||
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -u
|
||||
|
||||
MONGO_VERSION="2.6.7"
|
||||
|
||||
source "$(dirname $0)/build-dev-bundle-common.sh"
|
||||
echo CHECKOUT DIR IS "$CHECKOUT_DIR"
|
||||
echo BUILDING MONGO "v$MONGO_VERSION" IN "$DIR"
|
||||
|
||||
# Checkout and build mongodb.
|
||||
# We want to build a binary that includes SSL support but does not depend on a
|
||||
# particular version of openssl on the host system.
|
||||
|
||||
OPENSSL="openssl-1.0.2"
|
||||
OPENSSL_URL="http://www.openssl.org/source/$OPENSSL.tar.gz"
|
||||
wget $OPENSSL_URL || curl -O $OPENSSL_URL
|
||||
tar xzf $OPENSSL.tar.gz
|
||||
|
||||
cd $OPENSSL
|
||||
if [ "$UNAME" == "Linux" ]; then
|
||||
./config --prefix="$DIR/build/openssl-out" no-shared
|
||||
else
|
||||
# This configuration line is taken from Homebrew formula:
|
||||
# https://github.com/mxcl/homebrew/blob/master/Library/Formula/openssl.rb
|
||||
./Configure no-shared zlib-dynamic --prefix="$DIR/build/openssl-out" darwin64-x86_64-cc enable-ec_nistp_64_gcc_128
|
||||
fi
|
||||
make install
|
||||
|
||||
# To see the mongo changelog, go to http://www.mongodb.org/downloads,
|
||||
# click 'changelog' under the current version, then 'release notes' in
|
||||
# the upper right.
|
||||
cd "$DIR/build"
|
||||
|
||||
# We use Meteor fork since we added some changes to the building script.
|
||||
# Our patches allow us to link most of the libraries statically.
|
||||
git clone --branch "ssl-r$MONGO_VERSION" --depth 1 \
|
||||
git://github.com/meteor/mongo.git
|
||||
cd mongo
|
||||
rm -rf .git
|
||||
|
||||
# Compile
|
||||
|
||||
MONGO_FLAGS="--ssl --release -j4 "
|
||||
MONGO_FLAGS+="--cpppath=$DIR/build/openssl-out/include --libpath=$DIR/build/openssl-out/lib "
|
||||
|
||||
if [ "$OS" == "osx" ]; then
|
||||
# NOTE: '--64' option breaks the compilation, even it is on by default on x64 mac: https://jira.mongodb.org/browse/SERVER-5575
|
||||
MONGO_FLAGS+="--openssl=$DIR/build/openssl-out/lib "
|
||||
/usr/local/bin/scons $MONGO_FLAGS mongo mongod
|
||||
elif [ "$OS" == "linux" ]; then
|
||||
MONGO_FLAGS+="--no-glibc-check --prefix=./ "
|
||||
if [ "$ARCH" == "x86_64" ]; then
|
||||
MONGO_FLAGS+="--64"
|
||||
fi
|
||||
scons $MONGO_FLAGS mongo mongod
|
||||
else
|
||||
echo "We don't know how to compile mongo for this platform"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Done with scons build"
|
||||
|
||||
# Copy binaries
|
||||
mkdir -p "$DIR/mongodb/bin"
|
||||
cp mongo "$DIR/mongodb/bin/"
|
||||
cp mongod "$DIR/mongodb/bin/"
|
||||
|
||||
# Copy mongodb distribution information
|
||||
find ./distsrc -maxdepth 1 -type f -exec cp '{}' ../mongodb \;
|
||||
|
||||
cd "$DIR"
|
||||
stripBinary mongodb/bin/mongo
|
||||
stripBinary mongodb/bin/mongod
|
||||
|
||||
echo BUNDLING
|
||||
|
||||
cd "$DIR"
|
||||
rm -rf build
|
||||
tar czvf "${CHECKOUT_DIR}/mongo_${PLATFORM}_v${MONGO_VERSION}.tar.gz" .
|
||||
|
||||
echo DONE
|
||||
@@ -29,12 +29,12 @@ var packageJson = {
|
||||
"source-map-support": "https://github.com/meteor/node-source-map-support/tarball/1912478769d76e5df4c365e147f25896aee6375e",
|
||||
semver: "4.1.0",
|
||||
request: "2.47.0",
|
||||
fstream: "https://github.com/meteor/fstream/tarball/d11b9ec4a13918447c8af7559c243c190744dd1c",
|
||||
fstream: "https://github.com/meteor/fstream/tarball/cf4ea6c175355cec7bee38311e170d08c4078a5d",
|
||||
tar: "1.0.2",
|
||||
kexec: "2.0.2",
|
||||
"source-map": "0.5.3",
|
||||
"browserstack-webdriver": "2.41.1",
|
||||
"node-inspector": "0.7.4",
|
||||
"node-inspector": "0.12.8",
|
||||
chalk: "0.5.1",
|
||||
sqlite3: "3.1.3",
|
||||
netroute: "1.0.2",
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# determine the platform
|
||||
# use 32bit by default
|
||||
$PLATFORM = "windows_x86"
|
||||
$MONGO_VERSION = "2.6.7"
|
||||
$NODE_VERSION = "0.10.46"
|
||||
$MONGO_VERSION = "3.2.6"
|
||||
$NODE_VERSION = "4.4.7"
|
||||
$NPM_VERSION = "3.10.5"
|
||||
$PYTHON_VERSION = "2.7.10" # For node-gyp
|
||||
|
||||
@@ -37,7 +37,7 @@ $shell = New-Object -com shell.application
|
||||
|
||||
# download node
|
||||
# same node on 32bit vs 64bit?
|
||||
$node_link = "http://nodejs.org/dist/v${NODE_VERSION}/node.exe"
|
||||
$node_link = "http://nodejs.org/dist/v${NODE_VERSION}/win-x86/node.exe"
|
||||
$webclient.DownloadFile($node_link, "$DIR\bin\node.exe")
|
||||
|
||||
# On Windows we provide a reliable version of python.exe for use by
|
||||
@@ -67,6 +67,10 @@ rm -Recurse -Force $npm_zip
|
||||
# add bin to the front of the path so we can use our own node for building
|
||||
$env:PATH = "${DIR}\bin;${env:PATH}"
|
||||
|
||||
# Make sure node-gyp knows how to find its build tools.
|
||||
$env:PYTHON = "${DIR}\python\python.exe"
|
||||
$env:GYP_MSVS_VERSION = "2015"
|
||||
|
||||
# Install the version of npm that we're actually going to expose from the
|
||||
# dev bundle. Note that we use npm@1.4.12 to install npm@${NPM_VERSION}.
|
||||
cd "${DIR}\lib"
|
||||
@@ -145,8 +149,8 @@ cd "$DIR\.."
|
||||
# rename the folder with the devbundle
|
||||
cmd /c rename "$DIR" "dev_bundle_${PLATFORM}_${BUNDLE_VERSION}"
|
||||
|
||||
cmd /c 7z.exe a -ttar dev_bundle.tar "dev_bundle_${PLATFORM}_${BUNDLE_VERSION}"
|
||||
cmd /c 7z.exe a -tgzip "${CHECKOUT_DIR}\dev_bundle_${PLATFORM}_${BUNDLE_VERSION}.tar.gz" dev_bundle.tar
|
||||
& "C:\Program Files*\7-zip\7z.exe" a -ttar dev_bundle.tar "dev_bundle_${PLATFORM}_${BUNDLE_VERSION}"
|
||||
& "C:\Program Files*\7-zip\7z.exe" a -tgzip "${CHECKOUT_DIR}\dev_bundle_${PLATFORM}_${BUNDLE_VERSION}.tar.gz" dev_bundle.tar
|
||||
del dev_bundle.tar
|
||||
cmd /c rmdir "dev_bundle_${PLATFORM}_${BUNDLE_VERSION}" /s /q
|
||||
|
||||
|
||||
@@ -24,18 +24,18 @@ NODE_URL="https://nodejs.org/dist/v${NODE_VERSION}/${NODE_TGZ}"
|
||||
echo "Downloading Node from ${NODE_URL}"
|
||||
curl "${NODE_URL}" | tar zx --strip-components 1
|
||||
|
||||
# Update these values after building the dev-bundle-mongo Jenkins project.
|
||||
# Also make sure to update MONGO_VERSION in generate-dev-bundle.ps1.
|
||||
MONGO_VERSION=2.6.7
|
||||
MONGO_BUILD_NUMBER=6
|
||||
MONGO_TGZ="mongo_${PLATFORM}_v${MONGO_VERSION}.tar.gz"
|
||||
if [ -f "${CHECKOUT_DIR}/${MONGO_TGZ}" ] ; then
|
||||
tar zxf "${CHECKOUT_DIR}/${MONGO_TGZ}"
|
||||
else
|
||||
MONGO_URL="https://${S3_HOST}/dev-bundle-mongo-${MONGO_BUILD_NUMBER}/${MONGO_TGZ}"
|
||||
echo "Downloading Mongo from ${MONGO_URL}"
|
||||
curl "${MONGO_URL}" | tar zx
|
||||
fi
|
||||
# Download Mongo from mongodb.com
|
||||
MONGO_NAME="mongodb-${OS}-${ARCH}-${MONGO_VERSION}"
|
||||
MONGO_TGZ="${MONGO_NAME}.tgz"
|
||||
MONGO_URL="http://fastdl.mongodb.org/${OS}/${MONGO_TGZ}"
|
||||
echo "Downloading Mongo from ${MONGO_URL}"
|
||||
curl "${MONGO_URL}" | tar zx
|
||||
|
||||
# Put Mongo binaries in the right spot (mongodb/bin)
|
||||
mkdir -p mongodb/bin
|
||||
mv "${MONGO_NAME}/bin/mongod" mongodb/bin
|
||||
mv "${MONGO_NAME}/bin/mongo" mongodb/bin
|
||||
rm -rf "${MONGO_NAME}"
|
||||
|
||||
# export path so we use the downloaded node and npm
|
||||
export PATH="$DIR/bin:$PATH"
|
||||
|
||||
@@ -213,9 +213,11 @@ the top level (probably because they are fired off asynchronously).
|
||||
|
||||
Some initial work has been done to make constraint solving fast in the typical
|
||||
case where a previous solution exists in `APP/.meteor/versions`, but there is
|
||||
possible room for improvement. For example, the previous solution could be
|
||||
checked without invoking the logic solver at all, though the manual logic would
|
||||
have to match closely.
|
||||
possible room for improvement.
|
||||
|
||||
<strike>For example, the previous solution could be checked without
|
||||
invoking the logic solver at all, though the manual logic would have to
|
||||
match closely.</strike> [Implemented](https://github.com/meteor/meteor/compare/ea236fc9da99a1679b6205dce3a7008617e660e5...69b100d21a33fd7ca58fc2fe2d8997ade4a36af6)!
|
||||
|
||||
Time spent reading from the packages database (a SQLite file) could be understood
|
||||
better and improved by batching queries, reading less data, or using SQLite
|
||||
|
||||
@@ -1408,10 +1408,12 @@ var maybeUpdateRelease = function (options) {
|
||||
// mention that fact.
|
||||
// XXX error handling.
|
||||
|
||||
// Figuring out which release to use to update the app is slightly more
|
||||
// complicated, because we have to run the constraint solver. So, we need to
|
||||
// try multiple releases, defined by the various options passed in.
|
||||
var releaseVersionsToTry;
|
||||
// Previously we attempted to figure out the newest release that is compatible
|
||||
// with the users non-core version constraints. Now we simply update them
|
||||
// to the newest and if they get a conflict, they are left with a
|
||||
// .meteor/packages to work on to get a resolution (with more useful info)
|
||||
|
||||
var releaseVersion;
|
||||
if (options.patch) {
|
||||
// Can't make a patch update if you are not running from a current
|
||||
// release. In fact, you are doing something wrong, so we should tell you
|
||||
@@ -1451,20 +1453,20 @@ var maybeUpdateRelease = function (options) {
|
||||
}
|
||||
// Great, we found a patch version. You can only have one latest patch for
|
||||
// a string of releases, so there is just one release to try.
|
||||
releaseVersionsToTry = [updateTo];
|
||||
releaseVersion = updateTo;
|
||||
} else if (release.explicit) {
|
||||
// You have explicitly specified a release, and we have springboarded to
|
||||
// it. So, we will use that release to update you to itself, if we can.
|
||||
releaseVersionsToTry = [release.current.getReleaseVersion()];
|
||||
releaseVersion = release.current.getReleaseVersion();
|
||||
} else {
|
||||
// We are not doing a patch update, or a specific release update, so we need
|
||||
// to try all recommended releases on our track, whose order key is greater
|
||||
// than the app's.
|
||||
releaseVersionsToTry = getLaterReleaseVersions(
|
||||
releaseVersion = getLaterReleaseVersions(
|
||||
projectContext.releaseFile.releaseTrack,
|
||||
projectContext.releaseFile.releaseVersion);
|
||||
projectContext.releaseFile.releaseVersion)[0];
|
||||
|
||||
if (! releaseVersionsToTry.length) {
|
||||
if (! releaseVersion) {
|
||||
// We could not find any releases newer than the one that we are on, on
|
||||
// that track, so we are done.
|
||||
Console.info(
|
||||
@@ -1475,48 +1477,7 @@ var maybeUpdateRelease = function (options) {
|
||||
}
|
||||
}
|
||||
|
||||
var didPrintMessages = false;
|
||||
var solutionReleaseVersion = _.find(releaseVersionsToTry, function (versionToTry) {
|
||||
var releaseRecord = catalog.official.getReleaseVersion(
|
||||
releaseTrack, versionToTry);
|
||||
if (!releaseRecord) {
|
||||
throw Error("missing release record?");
|
||||
}
|
||||
|
||||
// Reset the project context and pretend we're using the potential release.
|
||||
projectContext.reset({ releaseForConstraints: releaseRecord });
|
||||
var messages = buildmessage.capture(function () {
|
||||
projectContext.resolveConstraints();
|
||||
});
|
||||
if (messages.hasMessages()) {
|
||||
// To avoid overloading the user, we only print messages for the first
|
||||
// release version we try (which should be the latest)
|
||||
if (!didPrintMessages) {
|
||||
Console.info(
|
||||
"Update to release", releaseTrack + "@" + versionToTry,
|
||||
"is impossible:");
|
||||
Console.info(messages.formatMessages());
|
||||
didPrintMessages = true;
|
||||
}
|
||||
// Nope, this release didn't work.
|
||||
return false;
|
||||
}
|
||||
|
||||
// Yay, it worked!
|
||||
return true;
|
||||
});
|
||||
|
||||
var newerAvailable = false;
|
||||
if (! solutionReleaseVersion) {
|
||||
Console.info(
|
||||
"This project is at the latest release which is compatible with your " +
|
||||
"current package constraints.");
|
||||
return 0;
|
||||
} else if (solutionReleaseVersion !== releaseVersionsToTry[0]) {
|
||||
newerAvailable = true;
|
||||
}
|
||||
|
||||
var solutionReleaseName = releaseTrack + '@' + solutionReleaseVersion;
|
||||
var releaseName = `${releaseTrack}@${releaseVersion}`;
|
||||
|
||||
// We could at this point springboard to solutionRelease (which is no newer
|
||||
// than the release we are currently running), but there's no super-clear
|
||||
@@ -1527,6 +1488,11 @@ var maybeUpdateRelease = function (options) {
|
||||
var upgraders = require('../upgraders.js');
|
||||
var upgradersToRun = upgraders.upgradersToRun(projectContext);
|
||||
|
||||
// Update every package in .meteor/packages to be (semver)>= the version
|
||||
// set for that package in the release we are updating to
|
||||
var releaseRecord = catalog.official.getReleaseVersion(releaseTrack, releaseVersion);
|
||||
projectContext.projectConstraintsFile.updateReleaseConstraints(releaseRecord);
|
||||
|
||||
// Download and build packages and write the new versions to .meteor/versions.
|
||||
// XXX It's a little weird that we do a full preparation for build
|
||||
// (downloading packages, building packages, etc) when we might be about
|
||||
@@ -1537,7 +1503,7 @@ var maybeUpdateRelease = function (options) {
|
||||
projectContext.prepareProjectForBuild();
|
||||
});
|
||||
|
||||
projectContext.writeReleaseFileAndDevBundleLink(solutionReleaseName);
|
||||
projectContext.writeReleaseFileAndDevBundleLink(releaseName);
|
||||
|
||||
projectContext.packageMapDelta.displayOnConsole({
|
||||
title: ("Changes to your project's package version selections from " +
|
||||
@@ -1546,11 +1512,6 @@ var maybeUpdateRelease = function (options) {
|
||||
|
||||
Console.info(files.pathBasename(options.appDir) + ": updated to " +
|
||||
projectContext.releaseFile.displayReleaseName + ".");
|
||||
if (newerAvailable) {
|
||||
Console.info(
|
||||
"(Newer releases are available but are not compatible with your " +
|
||||
"current package constraints.)");
|
||||
}
|
||||
|
||||
// Now run the upgraders.
|
||||
// XXX should we also run upgraders on other random commands, in case there
|
||||
@@ -1653,27 +1614,9 @@ main.registerCommand({
|
||||
} else {
|
||||
upgradePackageNames = options.args;
|
||||
}
|
||||
// We want to use the project's release for constraints even if we are
|
||||
// currently running a newer release (eg if we ran 'meteor update --patch' and
|
||||
// updated to an older patch release). (If the project has release 'none'
|
||||
// because this is just 'updating packages', this can be null. Also, if we're
|
||||
// running from a checkout this should be null even if the file doesn't say
|
||||
// 'none'.)
|
||||
var releaseRecordForConstraints = null;
|
||||
if (!files.inCheckout()
|
||||
&& projectContext.releaseFile.normalReleaseSpecified()) {
|
||||
releaseRecordForConstraints = catalog.official.getReleaseVersion(
|
||||
projectContext.releaseFile.releaseTrack,
|
||||
projectContext.releaseFile.releaseVersion);
|
||||
if (! releaseRecordForConstraints) {
|
||||
throw Error("unknown release " +
|
||||
projectContext.releaseFile.displayReleaseName);
|
||||
}
|
||||
}
|
||||
|
||||
// Try to resolve constraints, allowing the given packages to be upgraded.
|
||||
projectContext.reset({
|
||||
releaseForConstraints: releaseRecordForConstraints,
|
||||
upgradePackageNames: upgradePackageNames,
|
||||
upgradeIndirectDepPatchVersions: upgradeIndirectDepPatchVersions
|
||||
});
|
||||
@@ -1721,21 +1664,9 @@ main.registerCommand({
|
||||
topLevelPkgSet[constraint.package] = true;
|
||||
});
|
||||
|
||||
var releaseConstrainedPkgSet = {}; // pinned core packages (to skip)
|
||||
// check releaseRecordForConstraints is not null, e.g. possible
|
||||
// when running meteor from checkout
|
||||
if (releaseRecordForConstraints) {
|
||||
_.each(releaseRecordForConstraints.packages, function (v, packageName) {
|
||||
releaseConstrainedPkgSet[packageName] = true;
|
||||
});
|
||||
}
|
||||
|
||||
var nonlatestDirectDeps = [];
|
||||
var nonlatestIndirectDeps = [];
|
||||
projectContext.packageMap.eachPackage(function (name, info) {
|
||||
if (_.has(releaseConstrainedPkgSet, name)) {
|
||||
return;
|
||||
}
|
||||
var selectedVersion = info.version;
|
||||
var catalog = projectContext.projectCatalog;
|
||||
var latestVersion = getNewerVersion(name, selectedVersion, catalog);
|
||||
|
||||
@@ -325,6 +325,14 @@ function doRunCommand(options) {
|
||||
appPort = appPortMatch[2] ? parseInt(appPortMatch[2]) : null;
|
||||
}
|
||||
|
||||
if (options.production) {
|
||||
Console.warn(
|
||||
"Warning: The --production flag should only be used to simulate production " +
|
||||
"bundling for testing purposes. Use meteor build to create a bundle for " +
|
||||
"production deployment. See: https://guide.meteor.com/deployment.html"
|
||||
);
|
||||
}
|
||||
|
||||
if (options['raw-logs']) {
|
||||
runLog.setRawLogs(true);
|
||||
}
|
||||
@@ -703,6 +711,15 @@ main.registerCommand({
|
||||
return;
|
||||
}
|
||||
|
||||
// Also, write package version constraints from the current release
|
||||
// If we are on a checkout, we don't need to do this as running from
|
||||
// checkout still pins all package versions and if the user updates
|
||||
// to a real release, the packages file will subsequently get updated
|
||||
if (!release.current.isCheckout()) {
|
||||
projectContext.projectConstraintsFile
|
||||
.updateReleaseConstraints(release.current._manifest);
|
||||
}
|
||||
|
||||
// Any upgrader that is in this version of Meteor doesn't need to be run on
|
||||
// this project.
|
||||
var upgraders = require('../upgraders.js');
|
||||
|
||||
@@ -14,4 +14,7 @@ export const EXAMPLE_REPOSITORIES = {
|
||||
'repo': 'https://github.com/meteor/todos',
|
||||
'branch': 'react',
|
||||
},
|
||||
'angular2-boilerplate': {
|
||||
repo: 'https://github.com/bsliran/angular2-meteor-base'
|
||||
}
|
||||
};
|
||||
|
||||
@@ -145,7 +145,7 @@ DEp.connectToChildProcess = function connectToChildProcess(child) {
|
||||
// port (not debugPort!), and create a connection to that port so that
|
||||
// the child process can communicate with node-inspector.
|
||||
child.stderr.on("data", function onData(buffer) {
|
||||
var match = /debugger listening on port (\d+)/
|
||||
var match = /debugger listening on port (\d+)/i
|
||||
.exec(buffer.toString("utf8"));
|
||||
if (match) {
|
||||
child.stderr.removeListener("data", onData);
|
||||
|
||||
@@ -59,7 +59,7 @@ import { isTestFilePath } from './test-files.js';
|
||||
// Cache the (slightly post-processed) results of linker.fullLink.
|
||||
const CACHE_SIZE = process.env.METEOR_LINKER_CACHE_SIZE || 1024*1024*100;
|
||||
const CACHE_DEBUG = !! process.env.METEOR_TEST_PRINT_LINKER_CACHE_DEBUG;
|
||||
const LINKER_CACHE_SALT = 8; // Increment this number to force relinking.
|
||||
const LINKER_CACHE_SALT = 9; // Increment this number to force relinking.
|
||||
const LINKER_CACHE = new LRU({
|
||||
max: CACHE_SIZE,
|
||||
// Cache is measured in bytes. We don't care about servePath.
|
||||
|
||||
@@ -29,7 +29,7 @@ var compiler = exports;
|
||||
// dependencies. (At least for now, packages only used in target creation (eg
|
||||
// minifiers) don't require you to update BUILT_BY, though you will need to quit
|
||||
// and rerun "meteor run".)
|
||||
compiler.BUILT_BY = 'meteor/21';
|
||||
compiler.BUILT_BY = 'meteor/22';
|
||||
|
||||
// This is a list of all possible architectures that a build can target. (Client
|
||||
// is expanded into 'web.browser' and 'web.cordova')
|
||||
|
||||
@@ -1621,6 +1621,19 @@ _.extend(Isopack.prototype, {
|
||||
servePath: prelinkFile.servePath || undefined
|
||||
};
|
||||
if (prelinkFile.sourceMap) {
|
||||
// It appears in node v0.10.x, `new Buffer({someobject: 1})`
|
||||
// would be silently swallowed. (leaving an empty buffer)
|
||||
// In node v4+ this same code throws an error.
|
||||
// XX - Not 100% sure what prelinkFile.sourceMap _can_ be,
|
||||
// so here's some exhaustive checking of things buffer
|
||||
// _will_ accept.
|
||||
var acceptedByBuffer = _.isString(prelinkFile.sourceMap)
|
||||
|| _.isNumber(prelinkFile.sourceMap)
|
||||
|| _.isArray(prelinkFile.sourceMap)
|
||||
|| (prelinkFile.sourceMap instanceof Buffer);
|
||||
if (!acceptedByBuffer) {
|
||||
prelinkFile.sourceMap = JSON.stringify(prelinkFile.sourceMap);
|
||||
}
|
||||
// Write the source map.
|
||||
|
||||
if (typeof prelinkFile.sourceMap !== "string") {
|
||||
|
||||
@@ -60,8 +60,7 @@ var STAGE = {
|
||||
_.extend(ProjectContext.prototype, {
|
||||
reset: function (moreOptions, resetOptions) {
|
||||
var self = this;
|
||||
// Allow overriding some options until the next call to reset; used by
|
||||
// 'meteor update' code to try various values of releaseForConstraints.
|
||||
// Allow overriding some options until the next call to reset;
|
||||
var options = _.extend({}, self.originalOptions, moreOptions);
|
||||
// This is options that are actually directed at reset itself.
|
||||
resetOptions = resetOptions || {};
|
||||
@@ -142,21 +141,6 @@ _.extend(ProjectContext.prototype, {
|
||||
// to using the web.browser slice instead or make a common 'web' slice).
|
||||
self._forceIncludeCordovaUnibuild = options.forceIncludeCordovaUnibuild;
|
||||
|
||||
// If explicitly specified as null, use no release for constraints.
|
||||
// If specified non-null, should be a release version catalog record.
|
||||
// If not specified, defaults to release.current.
|
||||
//
|
||||
// Note that NONE of these cases are "use the release from
|
||||
// self.releaseFile"; after all, if you are explicitly running `meteor
|
||||
// --release foo` it will override what is found in .meteor/releases.
|
||||
if (_.has(options, 'releaseForConstraints')) {
|
||||
self._releaseForConstraints = options.releaseForConstraints || null;
|
||||
} else if (release.current.isCheckout()) {
|
||||
self._releaseForConstraints = null;
|
||||
} else {
|
||||
self._releaseForConstraints = release.current.getCatalogReleaseData();
|
||||
}
|
||||
|
||||
if (resetOptions.preservePackageMap && self.packageMap) {
|
||||
self._cachedVersionsBeforeReset = self.packageMap.toVersionMap();
|
||||
// packageMapFile should always exist if packageMap does
|
||||
@@ -386,19 +370,8 @@ _.extend(ProjectContext.prototype, {
|
||||
|
||||
// Let's also make sure we have a minimal gitignore.
|
||||
var gitignorePath = files.pathJoin(self.projectDir, '.meteor', '.gitignore');
|
||||
try {
|
||||
var lines = files.readFile(gitignorePath, "utf8").split("\n");
|
||||
} catch (e) {
|
||||
if (e.code !== "ENOENT") throw e;
|
||||
lines = [""];
|
||||
}
|
||||
|
||||
var needLocal = lines.indexOf("local") < 0;
|
||||
var needDevBundle = lines.indexOf("dev_bundle") < 0;
|
||||
if (needDevBundle || needLocal) {
|
||||
if (needDevBundle) lines.unshift("dev_bundle");
|
||||
if (needLocal) lines.unshift("local");
|
||||
files.writeFileAtomically(gitignorePath, lines.join("\n"));
|
||||
if (! files.exists(gitignorePath)) {
|
||||
files.writeFileAtomically(gitignorePath, 'local\n');
|
||||
}
|
||||
},
|
||||
|
||||
@@ -690,7 +663,6 @@ _.extend(ProjectContext.prototype, {
|
||||
|
||||
self._addAppConstraints(depsAndConstraints);
|
||||
self._addLocalPackageConstraints(depsAndConstraints);
|
||||
self._addReleaseConstraints(depsAndConstraints);
|
||||
return depsAndConstraints;
|
||||
},
|
||||
|
||||
@@ -717,19 +689,6 @@ _.extend(ProjectContext.prototype, {
|
||||
});
|
||||
},
|
||||
|
||||
_addReleaseConstraints: function (depsAndConstraints) {
|
||||
var self = this;
|
||||
if (! self._releaseForConstraints)
|
||||
return;
|
||||
_.each(self._releaseForConstraints.packages, function (version, packageName) {
|
||||
var constraint = utils.parsePackageConstraint(
|
||||
packageName + "@=" + version);
|
||||
// Add a constraint ("this is the only version available") but no
|
||||
// dependency (we don't automatically use all local packages!)
|
||||
depsAndConstraints.constraints.push(constraint);
|
||||
});
|
||||
},
|
||||
|
||||
_getAnticipatedPrereleases: function (rootConstraints, cachedVersions) {
|
||||
var self = this;
|
||||
|
||||
@@ -1023,6 +982,18 @@ _.extend(exports.ProjectConstraintsFile.prototype, {
|
||||
}));
|
||||
},
|
||||
|
||||
// For every package we already have, update the constraint to be semver>=
|
||||
// the constraint from the release
|
||||
updateReleaseConstraints: function (releaseRecord) {
|
||||
this.addConstraints(
|
||||
_.compact(_.map(releaseRecord.packages, (version, packageName) => {
|
||||
if (this.getConstraint(packageName)) {
|
||||
return utils.parsePackageConstraint(packageName + '@' + version);
|
||||
}
|
||||
}))
|
||||
);
|
||||
},
|
||||
|
||||
// The packages in packagesToRemove are expected to actually be in the file;
|
||||
// if you want to provide different output for packages in the file vs not,
|
||||
// you should have already done that.
|
||||
|
||||
@@ -843,8 +843,14 @@ _.extend(AppRunner.prototype, {
|
||||
// Notify the server that new client assets have been added to the
|
||||
// build.
|
||||
self._refreshing = true;
|
||||
appProcess.proc.send({ refresh: 'client' });
|
||||
self._refreshing = false;
|
||||
// ChildProcess.prototype.send used to be synchronous, but is now
|
||||
// asynchronous: https://github.com/nodejs/node/pull/2620
|
||||
appProcess.proc.send({
|
||||
refresh: 'client'
|
||||
}, err => {
|
||||
self._refreshing = false;
|
||||
if (err) throw err;
|
||||
});
|
||||
|
||||
// Establish a watcher on the new files.
|
||||
setupClientWatcher();
|
||||
|
||||
@@ -7,6 +7,7 @@ var child_process = require('child_process');
|
||||
|
||||
var _ = require('underscore');
|
||||
var isopackets = require('../tool-env/isopackets.js');
|
||||
var Console = require('../console/console.js').Console;
|
||||
|
||||
// Given a Mongo URL, open an interative Mongo shell on this terminal
|
||||
// on that database.
|
||||
@@ -36,24 +37,33 @@ var runMongoShell = function (url) {
|
||||
};
|
||||
|
||||
// Start mongod with a dummy replSet and wait for it to listen.
|
||||
var spawnMongod = function (mongodPath, port, dbPath, replSetName) {
|
||||
var child_process = require('child_process');
|
||||
function spawnMongod(mongodPath, port, dbPath, replSetName) {
|
||||
const child_process = require('child_process');
|
||||
|
||||
mongodPath = files.convertToOSPath(mongodPath);
|
||||
dbPath = files.convertToOSPath(dbPath);
|
||||
|
||||
return child_process.spawn(mongodPath, [
|
||||
// nb: cli-test.sh and findMongoPids make strong assumptions about the
|
||||
// order of the arguments! Check them before changing any arguments.
|
||||
'--bind_ip', '127.0.0.1',
|
||||
'--smallfiles',
|
||||
'--port', port,
|
||||
'--dbpath', dbPath,
|
||||
// Use an 8MB oplog rather than 256MB. Uses less space on disk and
|
||||
// initializes faster. (Not recommended for production!)
|
||||
'--oplogSize', '8',
|
||||
'--replSet', replSetName
|
||||
], {
|
||||
const args = [
|
||||
// nb: cli-test.sh and findMongoPids make strong assumptions about the
|
||||
// order of the arguments! Check them before changing any arguments.
|
||||
'--bind_ip', '127.0.0.1',
|
||||
'--port', port,
|
||||
'--dbpath', dbPath,
|
||||
// Use an 8MB oplog rather than 256MB. Uses less space on disk and
|
||||
// initializes faster. (Not recommended for production!)
|
||||
'--oplogSize', '8',
|
||||
'--replSet', replSetName
|
||||
];
|
||||
|
||||
// Use mmapv1 on windows, as our binary doesn't support WT
|
||||
if (process.platform === "win32") {
|
||||
args.push('--storageEngine', 'mmapv1', '--smallfiles');
|
||||
} else {
|
||||
// The WT journal seems to be at least 300MB, which is just too much
|
||||
args.push('--nojournal');
|
||||
}
|
||||
|
||||
return child_process.spawn(mongodPath, args, {
|
||||
// Apparently in some contexts, Mongo crashes if your locale isn't set up
|
||||
// right. I wasn't able to reproduce it, but many people on #4019
|
||||
// were. Let's default a couple environment variables to English UTF-8 if
|
||||
@@ -65,7 +75,7 @@ var spawnMongod = function (mongodPath, port, dbPath, replSetName) {
|
||||
LC_ALL: 'en_US.UTF-8'
|
||||
}, process.env)
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
// Find all running Mongo processes that were started by this program
|
||||
// (even by other simultaneous runs of this program). If passed,
|
||||
@@ -521,7 +531,7 @@ var launchMongo = function (options) {
|
||||
var stdoutOnData = fiberHelpers.bindEnvironment(function (data) {
|
||||
// note: don't use "else ifs" in this, because 'data' can have multiple
|
||||
// lines
|
||||
if (/config from self or any seed \(EMPTYCONFIG\)/.test(data)) {
|
||||
if (/\[initandlisten\] Did not find local replica set configuration document at startup/.test(data)) {
|
||||
replSetReadyToBeInitiated = true;
|
||||
maybeReadyToTalk();
|
||||
}
|
||||
@@ -531,7 +541,7 @@ var launchMongo = function (options) {
|
||||
maybeReadyToTalk();
|
||||
}
|
||||
|
||||
if (/ \[rsMgr\] replSet (PRIMARY|SECONDARY)/.test(data)) {
|
||||
if (/ \[rsSync\] transition to primary complete/.test(data)) {
|
||||
replSetReady = true;
|
||||
maybeReadyToTalk();
|
||||
}
|
||||
@@ -540,6 +550,19 @@ var launchMongo = function (options) {
|
||||
detectedErrors.freeSpace = true;
|
||||
}
|
||||
|
||||
// Running against a old mmapv1 engine, probably from pre-mongo-3.2 Meteor
|
||||
if (/created by the 'mmapv1' storage engine, so setting the active storage engine to 'mmapv1'/.test(data)) {
|
||||
Console.warn();
|
||||
Console.warn('Your development database is using mmapv1, '
|
||||
+ 'the old, pre-MongoDB 3.0 database engine. '
|
||||
+ 'You should consider upgrading to Wired Tiger, the new engine. '
|
||||
+ 'The easiest way to do so in development is to run '
|
||||
+ Console.command('meteor reset') + '. '
|
||||
+ "If you'd like to migrate your database, please consult "
|
||||
+ Console.url('https://docs.mongodb.org/v3.0/release-notes/3.0-upgrade/'))
|
||||
Console.warn();
|
||||
}
|
||||
|
||||
if (/Invalid or no user locale set/.test(data)) {
|
||||
detectedErrors.badLocale = true;
|
||||
}
|
||||
@@ -588,38 +611,26 @@ var launchMongo = function (options) {
|
||||
});
|
||||
}
|
||||
|
||||
var initiateResult = yieldingMethod(
|
||||
db.admin(), 'command', {replSetInitiate: configuration});
|
||||
try {
|
||||
var initiateResult = yieldingMethod(
|
||||
db.admin(), 'command', {replSetInitiate: configuration});
|
||||
} catch (e) {
|
||||
if (e.message !== 'already initialized') {
|
||||
throw Error("rs.initiate error: " + e.message);
|
||||
}
|
||||
}
|
||||
|
||||
if (stopped) {
|
||||
return;
|
||||
}
|
||||
// why this isn't in the error is unclear.
|
||||
if (initiateResult && initiateResult.documents
|
||||
&& initiateResult.documents[0]
|
||||
&& initiateResult.documents[0].errmsg) {
|
||||
var err = initiateResult.documents[0].errmsg;
|
||||
if (err !== "already initialized") {
|
||||
throw Error("rs.initiate error: " +
|
||||
initiateResult.documents[0].errmsg);
|
||||
}
|
||||
}
|
||||
|
||||
// XXX timeout eventually?
|
||||
while (!stopped) {
|
||||
var status = yieldingMethod(db.admin(), 'command',
|
||||
{replSetGetStatus: 1});
|
||||
if (!(status && status.documents && status.documents[0])) {
|
||||
throw status;
|
||||
}
|
||||
status = status.documents[0];
|
||||
if (!status.ok) {
|
||||
if (status.startupStatus === 6) { // "SOON"
|
||||
utils.sleepMs(20);
|
||||
continue;
|
||||
}
|
||||
throw status.errmsg;
|
||||
}
|
||||
// See http://docs.mongodb.org/manual/reference/replica-states/
|
||||
// for information about the various states.
|
||||
var status = yieldingMethod(
|
||||
db.admin(), 'command', {replSetGetStatus: 1});
|
||||
|
||||
// See https://docs.mongodb.com/manual/reference/replica-states/
|
||||
// for information on various states
|
||||
|
||||
// Are any of the members starting up or recovering?
|
||||
if (_.any(status.members, function (member) {
|
||||
@@ -633,7 +644,6 @@ var launchMongo = function (options) {
|
||||
|
||||
// Is the intended primary currently a secondary? (It passes through
|
||||
// that phase briefly.)
|
||||
|
||||
if (status.members[0].stateStr === 'SECONDARY') {
|
||||
utils.sleepMs(20);
|
||||
continue;
|
||||
@@ -800,7 +810,6 @@ _.extend(MRp, {
|
||||
self.suppressExitMessage = false;
|
||||
},
|
||||
});
|
||||
|
||||
// It has successfully started up, so if it exits after this point, that
|
||||
// actually is an interesting fact and we shouldn't suppress it.
|
||||
self.suppressExitMessage = false;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
var _ = require("underscore");
|
||||
var os = require("os");
|
||||
var path = require("path");
|
||||
var assert = require("assert");
|
||||
|
||||
// All of these functions are attached to files.js for the tool;
|
||||
// they live here because we need them in boot.js as well to avoid duplicating
|
||||
@@ -73,6 +74,8 @@ var convertToStandardLineEndings = function (fileContents) {
|
||||
// forward slashes)
|
||||
var wrapPathFunction = function (name, partialPaths) {
|
||||
var f = path[name];
|
||||
assert.strictEqual(typeof f, "function");
|
||||
|
||||
return function (/* args */) {
|
||||
if (process.platform === 'win32') {
|
||||
var args = _.toArray(arguments);
|
||||
@@ -101,12 +104,11 @@ files.pathResolve = wrapPathFunction("resolve");
|
||||
files.pathDirname = wrapPathFunction("dirname");
|
||||
files.pathBasename = wrapPathFunction("basename");
|
||||
files.pathExtname = wrapPathFunction("extname");
|
||||
// The path.isAbsolute function is implemented in Node v4.
|
||||
files.pathIsAbsolute = wrapPathFunction("isAbsolute");
|
||||
files.pathSep = '/';
|
||||
files.pathDelimiter = ':';
|
||||
files.pathOsDelimiter = path.delimiter;
|
||||
files.pathIsAbsolute = function (path) {
|
||||
return toPosixPath(path).charAt(0) === '/';
|
||||
};
|
||||
|
||||
files.convertToStandardPath = convertToStandardPath;
|
||||
files.convertToOSPath = convertToOSPath;
|
||||
|
||||
1
tools/static-assets/skel/.meteor/.gitignore
vendored
1
tools/static-assets/skel/.meteor/.gitignore
vendored
@@ -1,2 +1 @@
|
||||
local
|
||||
dev_bundle
|
||||
|
||||
@@ -23,12 +23,12 @@ var originalMasterName = null;
|
||||
steps.initialized = function () {
|
||||
// Great, we got the first thing. Let's get another thing.
|
||||
C.insert({step: 'next'});
|
||||
var master = C.rawDatabase().serverConfig._state.master;
|
||||
var master = C.rawDatabase().serverConfig.isMasterDoc;
|
||||
if (!master) {
|
||||
console.log("No master in initialized?");
|
||||
process.exit(1);
|
||||
}
|
||||
originalMasterName = master.name;
|
||||
originalMasterName = master.primary;
|
||||
console.log("Master starts as", originalMasterName);
|
||||
};
|
||||
|
||||
@@ -49,16 +49,16 @@ steps.next = function () {
|
||||
|
||||
steps.steppedDown = function () {
|
||||
console.log("Write succeeded after stepdown.");
|
||||
var master = C.rawDatabase().serverConfig._state.master;
|
||||
var master = C.rawDatabase().serverConfig.isMasterDoc;
|
||||
if (!master) {
|
||||
console.log("No master in steppedDown?");
|
||||
process.exit(1);
|
||||
}
|
||||
if (master.name === originalMasterName) {
|
||||
if (master.primary === originalMasterName) {
|
||||
console.log("Master didn't change?");
|
||||
process.exit(1);
|
||||
}
|
||||
console.log("Master ended as", master.name);
|
||||
console.log("Master ended as", master.primary);
|
||||
console.log("SUCCESS");
|
||||
process.exit(0);
|
||||
};
|
||||
|
||||
@@ -11,3 +11,4 @@ notices-for-facebook-graph-api-2
|
||||
1.2.0-cordova-changes
|
||||
1.2.0-breaking-changes
|
||||
1.3.0-split-minifiers-package
|
||||
1.3.5-remove-old-dev-bundle-link
|
||||
|
||||
@@ -1 +1 @@
|
||||
METEOR@1.3.4.4
|
||||
METEOR@1.3.5.1
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
allow-deny@1.0.5
|
||||
autoupdate@1.2.11
|
||||
avital:mocha@2.1.0_10
|
||||
babel-compiler@6.8.4
|
||||
babel-compiler@6.8.5
|
||||
babel-runtime@0.1.9_1
|
||||
base64@1.0.9
|
||||
binary-heap@1.0.9
|
||||
@@ -14,14 +14,14 @@ caching-html-compiler@1.0.6
|
||||
callback-hook@1.0.9
|
||||
check@1.2.3
|
||||
client-only-ecmascript@0.0.1
|
||||
coffeescript@1.1.3
|
||||
coffeescript@1.1.4
|
||||
ddp@1.2.5
|
||||
ddp-client@1.2.9
|
||||
ddp-common@1.2.6
|
||||
ddp-server@1.2.9
|
||||
ddp-server@1.2.10
|
||||
deps@1.0.12
|
||||
diff-sequence@1.0.6
|
||||
ecmascript@0.4.7
|
||||
ecmascript@0.4.8
|
||||
ecmascript-runtime@0.2.12
|
||||
ejson@1.0.12
|
||||
es5-shim@4.5.13
|
||||
@@ -68,12 +68,12 @@ spacebars@1.0.12
|
||||
spacebars-compiler@1.0.12
|
||||
standard-minifier-css@1.0.8
|
||||
standard-minifier-js@1.0.8
|
||||
templating@1.1.13
|
||||
templating@1.1.14
|
||||
templating-tools@1.0.4
|
||||
tmeasday:test-reporter-helpers@0.2.1
|
||||
tracker@1.0.14
|
||||
tracker@1.0.15
|
||||
ui@1.0.11
|
||||
underscore@1.0.9
|
||||
url@1.0.10
|
||||
webapp@1.2.10
|
||||
webapp@1.2.11
|
||||
webapp-hashing@1.0.9
|
||||
|
||||
1
tools/tests/apps/very-simple-app-with-no-package-constraints/.meteor/.gitignore
vendored
Normal file
1
tools/tests/apps/very-simple-app-with-no-package-constraints/.meteor/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
local
|
||||
@@ -0,0 +1,6 @@
|
||||
# Meteor packages used by this project, one per line.
|
||||
#
|
||||
# 'meteor add' and 'meteor remove' will edit this file for you,
|
||||
# but you can also edit it by hand.
|
||||
|
||||
meteor-base # Packages every Meteor app needs to have
|
||||
@@ -0,0 +1 @@
|
||||
none
|
||||
@@ -0,0 +1,7 @@
|
||||
<head>
|
||||
<title>Hello</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<h1>Welcome to Meteor!</h1>
|
||||
</body>
|
||||
@@ -34,7 +34,7 @@ var recommend = function (sandbox, version) {
|
||||
selftest.define("autoupdate", ['checkout', 'custom-warehouse'], function () {
|
||||
var s = new Sandbox({
|
||||
warehouse: {
|
||||
v1: { recommended: true},
|
||||
v1: { recommended: true },
|
||||
v2: { recommended: true },
|
||||
v3: { },
|
||||
v4: { }
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
var selftest = require('../tool-testing/selftest.js');
|
||||
var Sandbox = selftest.Sandbox;
|
||||
const SIMPLE_WAREHOUSE = { v1: { recommended: true } };
|
||||
|
||||
selftest.define("create", function () {
|
||||
var s = new Sandbox;
|
||||
// We need a warehouse so the tool doesn't think we are running from checkout
|
||||
var s = new Sandbox({ warehouse: SIMPLE_WAREHOUSE });
|
||||
|
||||
// Can we create an app? Yes!
|
||||
var run = s.run("create", "foobar");
|
||||
@@ -11,8 +13,14 @@ selftest.define("create", function () {
|
||||
run.match("To run your new app");
|
||||
run.expectExit(0);
|
||||
|
||||
// Now, can we run it?
|
||||
// Test that the release constraints have been written to .meteor/packages
|
||||
s.cd("foobar");
|
||||
const packages = s.read(".meteor/packages");
|
||||
if (!packages.match('meteor-base@')) {
|
||||
selftest.fail("Failed to add a version specifier to `meteor-base` package");
|
||||
}
|
||||
|
||||
// Now, can we run it?
|
||||
run = s.run();
|
||||
run.waitSecs(15);
|
||||
run.match("foobar");
|
||||
|
||||
@@ -36,7 +36,7 @@ var testMeteorMongo = function (appDir) {
|
||||
mongoRun.match('connecting to: 127.0.0.1');
|
||||
// Note: when mongo shell's input is not a tty, there is no prompt.
|
||||
mongoRun.write('db.version()\n');
|
||||
mongoRun.match(/2\.6\.\d+/);
|
||||
mongoRun.match(/3\.2\.\d+/);
|
||||
mongoRun.stop();
|
||||
|
||||
run.stop();
|
||||
|
||||
@@ -82,7 +82,7 @@ selftest.define("source maps from built meteor tool", ['checkout', 'custom-wareh
|
||||
|
||||
var run = s.run("throw-error");
|
||||
run.matchErr(matchPathRegexp('\\(/tools/cli/commands\\.js:' + lineNumber));
|
||||
run.expectExit(8);
|
||||
run.expectExit(1);
|
||||
});
|
||||
|
||||
selftest.define("source maps from a build plugin implementation", ['checkout', 'custom-warehouse'], function () {
|
||||
|
||||
53
tools/tests/update-tests.js
Normal file
53
tools/tests/update-tests.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import selftest, { Sandbox } from '../tool-testing/selftest.js';
|
||||
import catalog from '../packaging/catalog/catalog.js';
|
||||
|
||||
const DEFAULT_RELEASE_TRACK = catalog.DEFAULT_TRACK;
|
||||
const SIMPLE_WAREHOUSE = {
|
||||
v1: { },
|
||||
v2: { recommended: true }
|
||||
};
|
||||
|
||||
selftest.define("'meteor update' adds constraints to `.meteor/packages`", () => {
|
||||
const s = new Sandbox({
|
||||
warehouse: SIMPLE_WAREHOUSE,
|
||||
fakeMongo: true
|
||||
});
|
||||
|
||||
s.createApp("myapp", "very-simple-app-with-no-package-constraints", {
|
||||
release: DEFAULT_RELEASE_TRACK + '@v1'
|
||||
});
|
||||
s.cd("myapp");
|
||||
|
||||
run = s.run("update");
|
||||
run.match("updated to Meteor v2");
|
||||
run.expectExit(0);
|
||||
|
||||
const packages = s.read(".meteor/packages");
|
||||
if (!packages.match('meteor-base@')) {
|
||||
selftest.fail("Failed to add a version specifier to `meteor-base` package");
|
||||
}
|
||||
});
|
||||
|
||||
selftest.define("'meteor update' alters constraints in `.meteor/packages`", () => {
|
||||
const s = new Sandbox({
|
||||
warehouse: SIMPLE_WAREHOUSE,
|
||||
fakeMongo: true
|
||||
});
|
||||
|
||||
s.createApp("myapp", "very-simple-app-with-no-package-constraints", {
|
||||
release: DEFAULT_RELEASE_TRACK + '@v1'
|
||||
});
|
||||
s.cd("myapp");
|
||||
|
||||
// change the package file to be an old version
|
||||
s.write('.meteor/packages', 'meteor-base@0.0.1');
|
||||
|
||||
run = s.run("update");
|
||||
run.match("updated to Meteor v2");
|
||||
run.expectExit(0);
|
||||
|
||||
const packages = s.read(".meteor/packages");
|
||||
if (packages.match('meteor-base@0.0.1')) {
|
||||
selftest.fail("Failed to update the version specifier for the `meteor-base` package");
|
||||
}
|
||||
});
|
||||
@@ -227,7 +227,7 @@ the guide about breaking changes here:`,
|
||||
packagesFile.writeIfModified();
|
||||
},
|
||||
|
||||
"1.3.5-remove-old-dev-bundle-link": function (projectContext) {
|
||||
"1.4.0-remove-old-dev-bundle-link": function (projectContext) {
|
||||
const oldDevBundleLink =
|
||||
files.pathJoin(projectContext.projectDir, ".meteor", "dev_bundle");
|
||||
files.rm_recursive(oldDevBundleLink);
|
||||
|
||||
Reference in New Issue
Block a user