This repository has been archived by the owner on Sep 18, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
96 lines (76 loc) · 2.27 KB
/
index.js
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
/* jshint node: true */
'use strict';
var async = require('async');
var attachmate = require('attachmate');
var debug = require('debug')('steelmesh-appsync');
var fs = require('fs');
var mkdirp = require('mkdirp');
var path = require('path');
var semver = require('semver');
/**
# steelmesh-appsync
This module is responsible for querying a remote CouchDB db instance and
downloading any updated apps down to the local filesystem.
## Example Usage
<<< examples/sync.js
**/
module.exports = function(db, opts) {
var baseUrl = db.config.url + '/' + db.config.db;
var targetPath = (opts || {}).targetPath || process.cwd();
function compareAndSync(appFolder, pkg, app, callback) {
var version = (pkg || {}).version;
db.get(app.id, function(err, body) {
if (err) {
return callback(err);
}
// if we have a version and the version not greater than the local
// version do nothing (but don't error)
if (version && (! semver.gt(body.version, version))) {
debug('not downloading - newer version exists in ' + appFolder);
return callback();
}
mkdirp(appFolder, function(err) {
if (err) {
return callback(err);
}
attachmate.download(baseUrl + '/' + app.id, appFolder, function(err) {
callback(err, appFolder);
});
});
});
}
function getPackageData(appFolder, callback) {
var pkg;
fs.exists(appFolder, function(exists) {
if (! exists) {
return callback();
}
try {
pkg = require(path.resolve(appFolder, 'package.json'));
}
catch (e) {
return callback(new Error('Cannot sync - package.json missing or invalid in ' + appFolder));
}
callback(null, pkg);
});
}
function sync(app, callback) {
var appFolder = path.resolve(targetPath, app.id);
debug('attempting to sync: ' + appFolder);
getPackageData(appFolder, function(err, pkg) {
if (err) {
return callback(err);
}
compareAndSync(appFolder, pkg, app, callback);
});
}
return function(callback) {
// list the items in the db
db.list(function(err, body) {
if (err) {
return callback(err);
}
async.map(body.rows || [], sync, callback);
});
};
};