1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 | 1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
3
3
3
3
3
423
423
423
423
423
279
125
69
69
3
1
1
1
1
1
1
1
1
1
1
| var async = require('async');
var which = require('which');
var exec = require('child_process').exec;
var fs = require('fs-extra');
var resolve = require('mongodb-download-url');
var versions = require('mongodb-version-list');
var semver = require('semver');
var defaults = require('lodash.defaults');
var path = require('./lib/path');
var config = require('./lib/config');
var activate = require('./lib/activate');
var download = require('./lib/download');
var extract = require('./lib/extract');
var debug = require('debug')('mongodb-version-manager');
var VERSION = /[0-9]+\.[0-9]+\.[0-9]+([-_\.][a-zA-Z0-9]+)?/;
activate.addToPath(path.join(path.current(), 'bin'));
module.exports = function(opts, fn) {
if (typeof opts === 'function') {
fn = opts;
opts = {};
} else if (typeof opts === 'string') {
opts = {
version: opts
};
}
opts.version = opts.version || process.env.MONGODB_VERSION;
module.exports.use(opts, fn);
};
module.exports.config = config;
module.exports.path = function(fn) {
fn(null, path.join(path.current({
name: 'mongodb'
}), 'bin'));
};
module.exports.installed = function(fn) {
fs.readdir(path.base({
name: 'mongodb'
}), function(err, files) {
files = files || [];
if (err) return fn(null, files);
fn(null, files.filter(function(f) {
return VERSION.test(f);
}));
});
};
module.exports.resolve = resolve;
module.exports.available = function(opts, fn) {
opts = defaults(opts || {}, {
stable: false,
unstable: false,
rc: false
});
debug('options for avilable', opts);
versions(function(err, res) {
Iif (err) return fn(err);
res = res.map(function(v) {
return semver.parse(v);
})
.filter(function(v) {
v.stable = v.minor % 2 === 0;
v.unstable = !v.stable;
v.rc = v.prerelease.length > 0;
if (!opts.rc && v.rc) return false;
if (!opts.stable && v.stable) return false;
if (!opts.unstable && v.unstable) return false;
return true;
})
.map(function(v) {
return v.version;
});
fn(null, res);
});
};
module.exports.is = function(s, done) {
module.exports.current(function(err, v) {
if (err) return done(err);
done(null, semver.satisfies(v, s));
});
};
module.exports.current = function(fn) {
which('mongod', function(err, mongod_bin) {
Iif (err || !mongod_bin) {
return fn(null);
}
exec(mongod_bin + ' --version', function(err, stdout) {
Iif (err) return fn(err);
var shellVersion = stdout
.toString('utf-8')
.split('\n')[0]
.split(',')[0]
.replace('db version v', '');
fn(null, shellVersion);
});
});
};
module.exports.install = function(version, done) {
resolve({
version: version
}, function(err, pkg) {
if (err) return done(err);
async.series([download.bind(null, pkg), extract.bind(null, pkg)], done);
});
};
module.exports.use = function(opts, done) {
resolve(opts, function(err, pkg) {
if (err) return done(err);
module.exports.current(function(err, v) {
if (err) return done(err);
if (pkg.version === v) {
debug('already using ' + v);
return done(null, pkg);
}
async.series([
download.bind(null, pkg),
extract.bind(null, pkg),
activate.bind(null, pkg)
], function(err) {
if (err) return done(err);
return done(null, pkg);
});
});
});
};
|