UNPKG

6.32 kBJavaScriptView Raw
1var DDPClient = require('ddp');
2var Config = require('./config');
3var path = require('path');
4var fs = require('fs');
5var _ = require('underscore');
6var spawn = require('child_process').spawn;
7var exec = require('child_process').exec;
8var git = require('./utils/git');
9var _ = require('underscore');
10var prompt = require('prompt');
11var meteoriteArgs = require('optimist').argv;
12var version = require('../package').version;
13
14var writeUserTokenFile = function(user) {
15 var cfg = {
16 user: user
17 };
18 var filePath = path.join(process.env.HOME, '.mrt.cfg');
19
20 fs.writeFileSync(filePath, JSON.stringify(cfg));
21 fs.chmodSync(filePath, '0600');
22};
23
24var readUserTokenFile = function() {
25 var filePath = path.join(process.env.HOME, '.mrt.cfg');
26
27 var fileContents = fs.readFileSync(filePath);
28 return JSON.parse(fileContents);
29};
30
31Atmosphere = {
32 publish: function(fn) {
33
34 if (meteoriteArgs._.length !== 2)
35 throw "Usage: mrt publish <path>";
36
37 var packagePath = meteoriteArgs._[1];
38 var config = new Config(path.resolve(packagePath));
39 var versionName = 'v' + config.version;
40
41 // check that the version we are releasing is tagged in the repo
42 git.tagExists(versionName, packagePath, function(err, exists) {
43 if (err || !exists)
44 throw("Tag " + versionName + " doesn't exist in repository, please add!");
45
46 // TODO Validation
47
48 Atmosphere.login(function(ddpclient) {
49 meteoriteArgs.verbose && console.log("Publishing...");
50 ddpclient.call("publish", [config], function(err) {
51 if (err) {
52 console.log('Error:', err.reason);
53
54 if (err.details && err.details.length > 0) {
55 _.each(err.details, function(errMessage) {
56 console.log(' ' + errMessage);
57 });
58 }
59
60 process.exit();
61 }
62 meteoriteArgs.verbose && console.log("Published.");
63 console.log("Done!");
64 fn();
65 });
66 });
67 });
68 },
69
70 release: function(fn) {
71 var config = new Config(process.cwd());
72 var versionName = 'v' + config.version;
73
74 if (meteoriteArgs._.length !== 2)
75 throw "Usage: mrt release <path>";
76
77 // check clean first
78 exec('git diff --exit-code', function (err, stdout, stderr) {
79 if (err && err.code === 1)
80 throw "There are files that need to be committed first.";
81
82 exec('git tag', function (err, stdout, stderr) {
83 if (stdout.indexOf(versionName) >= 0)
84 throw "This tag has already been committed to the repo.";
85
86 console.log('Adding tag and pushing repo');
87 spawn('git', ['tag', versionName]).on('exit', function() {
88 spawn('git', ['push']).on('exit', function() {
89 spawn('git', ['push', '--tags']).on('exit', function() {
90 Atmosphere.publish(fn);
91 });
92 });
93 });
94 });
95 });
96
97 },
98
99 // first stab at this: just grab _all_ the package meta data from the server, and go from there
100 packages: function(fn) {
101 if (Atmosphere._packages)
102 return fn(Atmosphere._packages);
103
104 Atmosphere.connect(function(ddpclient) {
105
106 meteoriteArgs.verbose && console.log("Getting packages...");
107 ddpclient.subscribe("allPackages", [], function() {
108 meteoriteArgs.verbose && console.log("Got packages.");
109
110 fn(Atmosphere._packages = ddpclient.collections.packages);
111 });
112 });
113 },
114
115 // find the info about a specific named package
116 package: function(name, fn) {
117 Atmosphere.packages(function(defns) {
118 fn(_.find(defns, function(d) { return d.name === name; }));
119 });
120 },
121
122 connect: function(fn) {
123 meteoriteArgs.repoHost = meteoriteArgs.repoHost || 'atmosphere.meteor.com';
124 meteoriteArgs.repoPort = meteoriteArgs.repoPort || 443;
125 var use_ssl = (meteoriteArgs.repoPort === 443) ? true : false;
126 var ddpclient = new DDPClient({
127 port: meteoriteArgs.repoPort,
128 host: meteoriteArgs.repoHost,
129 use_ssl: use_ssl
130 });
131
132 meteoriteArgs.verbose && console.log("Connecting to " + meteoriteArgs.repoHost + ":" + meteoriteArgs.repoPort + "...");
133
134 ddpclient.connect(function(err) {
135 if (err) {
136 console.log("Connection to Atmosphere server failed!".red);
137 console.log("Please ensure you are running the latest version of Meteorite".red);
138 console.log(" npm install -g meteorite".red);
139 console.log("If problems persist, please report here: http://github.com/oortcloud/meteorite/issues".red);
140 process.exit();
141 }
142
143 meteoriteArgs.verbose && console.log("Connected..");
144 fn(ddpclient);
145 });
146 },
147
148 login: function(fn) {
149
150 Atmosphere.connect(function(ddpclient) {
151 prompt.start();
152
153 prompt.message = "";
154 prompt.delimiter = "";
155
156 var showPrompt = function() {
157 prompt.get({
158 properties: {
159 username: {
160 description: 'username: ',
161 required: true
162 },
163 password: {
164 description: 'password: ',
165 required: true,
166 hidden: true
167 }
168 }
169 }, function (err, input) {
170 ddpclient.call('login', ['mrt', version, {
171 password: input.password,
172 user: {
173 username: input.username
174 }
175 }], function(err, user) {
176 if (err) {
177 console.log('Error:', err.reason);
178 process.exit();
179 }
180
181 writeUserTokenFile(user);
182
183 fn(ddpclient);
184 });
185 });
186
187 };
188
189 var user;
190 try {
191 user = readUserTokenFile().user;
192 } catch(e) {}
193
194 if (user && user.token) {
195 meteoriteArgs.verbose && console.log("Logging in...");
196 ddpclient.call('login', ['mrt', version, {
197 resume: user.token
198 }], function(err, user) {
199 if (err) {
200 meteoriteArgs.verbose && console.log("Failed.");
201 showPrompt();
202 } else {
203 meteoriteArgs.verbose && console.log("Logged in.");
204 fn(ddpclient);
205 }
206 });
207 } else {
208 showPrompt();
209 }
210
211 });
212 }
213};
214
215module.exports = Atmosphere;