Skip to content

Commit dea2a06

Browse files
author
Aaron Chambers
committed
Merge pull request #8 from strange-studios/implement-activate-hook
[WIP] Implement `activate` hook
2 parents 7031618 + 44813a6 commit dea2a06

File tree

5 files changed

+313
-43
lines changed

5 files changed

+313
-43
lines changed

index.js

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,34 @@ module.exports = {
2626
});
2727
}
2828

29-
function _beginMessage(ui, indexPath) {
29+
function _beginUploadMessage(ui, indexPath) {
3030
ui.write(blue('| '));
3131
ui.write(blue('- Uploading `' + indexPath + '`\n'));
3232

3333
return Promise.resolve();
3434
}
3535

36+
function _beginActivateMessage(ui, revisionKey) {
37+
ui.write(blue('| '));
38+
ui.write(blue('- Activating revision `' + revisionKey + '`\n'));
39+
40+
return Promise.resolve();
41+
}
42+
3643
function _successMessage(ui, key) {
3744
ui.write(blue('| '));
3845
ui.write(blue('- Uploaded with key `' + key + '`\n'));
3946

4047
return Promise.resolve(key);
4148
}
4249

50+
function _activationSuccessMessage(ui, revisionKey) {
51+
ui.write(blue('| '));
52+
ui.write(blue('- ✔ Activated revision `' + revisionKey + '`\n'));
53+
54+
return Promise.resolve();
55+
}
56+
4357
function _errorMessage(ui, error) {
4458
ui.write(blue('| '));
4559
ui.write(red('- ' + error + '`\n'));
@@ -56,30 +70,56 @@ module.exports = {
5670
var config = deployment.config[this.name] = deployment.config[this.name] || {};
5771
var projectName = deployment.project.name();
5872

59-
return validateConfig(ui, config, projectName)
60-
.then(function() {
61-
ui.write(blue('| '));
62-
ui.writeLine(blue('- config ok'));
63-
});
73+
return this._resolvePipelineData(config, context)
74+
.then(validateConfig.bind(this, ui, config, projectName));
6475
},
6576

6677
upload: function(context) {
67-
var deployment = context.deployment;
68-
var ui = deployment.ui;
69-
var config = deployment.config[this.name] || {};
70-
var redis = context.redisClient || new Redis(config);
71-
var tag = context.tag;
78+
var deployment = context.deployment;
79+
var ui = deployment.ui;
80+
var config = deployment.config[this.name] || {};
81+
var redis = context.redisClient || new Redis(config);
82+
var revisionKey = this._resolveConfigValue('revisionKey', config, context);
7283

7384
var filePattern = config.filePattern;
7485

75-
return _beginMessage(ui, filePattern)
86+
return _beginUploadMessage(ui, filePattern)
7687
.then(_readFileContents.bind(this, filePattern))
77-
.then(redis.upload.bind(redis, config.keyPrefix, tag))
88+
.then(redis.upload.bind(redis, config.keyPrefix, revisionKey))
7889
.then(_successMessage.bind(this, ui))
7990
.then(function(key) {
8091
return { redisKey: key }
8192
})
8293
.catch(_errorMessage.bind(this, ui));
94+
},
95+
96+
activate: function(context) {
97+
var deployment = context.deployment;
98+
var ui = deployment.ui;
99+
var config = deployment.config[this.name] || {};
100+
var redis = context.redisClient || new Redis(config);
101+
var revisionKey = this._resolveConfigValue('revisionKey', config, context);
102+
103+
return _beginActivateMessage(ui, revisionKey)
104+
.then(redis.activate.bind(redis, config.keyPrefix, revisionKey))
105+
.then(_activationSuccessMessage.bind(this, ui, revisionKey))
106+
.catch(_errorMessage.bind(this, ui));
107+
},
108+
109+
_resolvePipelineData: function(config, context) {
110+
config.revisionKey = config.revisionKey || function(context) {
111+
return context.deployment.commandLineArgs.revisionKey || context.revisionKey;
112+
};
113+
114+
return Promise.resolve();
115+
},
116+
117+
_resolveConfigValue: function(key, config, context) {
118+
if(typeof config[key] === 'function') {
119+
return config[key](context);
120+
}
121+
122+
return config[key];
83123
}
84124
};
85125
}

lib/redis.js

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,50 @@ module.exports = CoreObject.extend({
2323
this._allowOverwrite = options.allowOverwrite;
2424
},
2525

26-
upload: function(/*keyPrefix, tag, value*/) {
26+
upload: function(/*keyPrefix, revisionKey, value*/) {
2727
var args = Array.prototype.slice.call(arguments);
2828

29-
var keyPrefix = args.shift();
30-
var value = args.pop();
31-
var tag = args[0] || 'default';
32-
var redisKey = keyPrefix + ':' + tag;
29+
var keyPrefix = args.shift();
30+
var value = args.pop();
31+
var revisionKey = args[0] || 'default';
32+
var redisKey = keyPrefix + ':' + revisionKey;
3333

3434
var maxEntries = this._maxNumberOfRecentUploads;
3535

3636
return Promise.resolve()
3737
.then(this._uploadIfKeyDoesNotExist.bind(this, redisKey, value))
38-
.then(this._updateRecentUploadsList.bind(this, keyPrefix, tag))
38+
.then(this._updateRecentUploadsList.bind(this, keyPrefix, revisionKey))
3939
.then(this._trimRecentUploadsList.bind(this, keyPrefix, maxEntries))
4040
.then(function() {
4141
return redisKey;
4242
});
4343
},
4444

45-
_uploadIfKeyDoesNotExist: function(redisKey, value) {
45+
activate: function(keyPrefix, revisionKey) {
46+
var currentKey = keyPrefix + ':current';
47+
48+
return Promise.resolve()
49+
.then(this._listRevisions.bind(this, keyPrefix))
50+
.then(this._validateRevisionKey.bind(this, revisionKey))
51+
.then(this._activateRevisionKey.bind(this, currentKey, revisionKey));
52+
},
53+
54+
_listRevisions: function(keyPrefix) {
4655
var client = this._client;
56+
return client.lrange(keyPrefix, 0, this._maxNumberOfRecentUploads - 1);
57+
},
58+
59+
_validateRevisionKey: function(revisionKey, revisions) {
60+
return revisions.indexOf(revisionKey) > -1 ? Promise.resolve() : Promise.reject('`' + revisionKey + '` is not a valid revision key');
61+
},
62+
63+
_activateRevisionKey: function(currentKey, revisionKey) {
64+
var client = this._client;
65+
return client.set(currentKey, revisionKey);
66+
},
67+
68+
_uploadIfKeyDoesNotExist: function(redisKey, value) {
69+
var client = this._client;
4770
var allowOverwrite = !!this._allowOverwrite;
4871

4972
return Promise.resolve()
@@ -60,9 +83,9 @@ module.exports = CoreObject.extend({
6083
})
6184
},
6285

63-
_updateRecentUploadsList: function(keyPrefix, tag) {
86+
_updateRecentUploadsList: function(keyPrefix, revisionKey) {
6487
var client = this._client;
65-
return client.lpush(keyPrefix, tag);
88+
return client.lpush(keyPrefix, revisionKey);
6689
},
6790

6891
_trimRecentUploadsList: function(keyPrefix, maxEntries) {

lib/utilities/validate-config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,8 @@ module.exports = function(ui, config, projectName) {
3333
applyDefaultConfigIfNecessary(config, configKey, defaultConfig, ui);
3434
});
3535

36+
ui.write(blue('| '));
37+
ui.writeLine(blue('- config ok'));
38+
3639
return Promise.resolve();
3740
}

0 commit comments

Comments
 (0)