Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Grunt version #3108

Merged
merged 3 commits into from
Feb 20, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Kibana 4.1.0-snapshot
# Kibana <!--version-->4.1.0-snapshot<!--/version-->

[![Build Status](https://travis-ci.org/elasticsearch/kibana.svg?branch=master)](https://travis-ci.org/elasticsearch/kibana?branch=master)

Expand Down
2 changes: 1 addition & 1 deletion tasks/config/simplemocha.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ module.exports = {
ignoreLeaks: false,
reporter: 'dot'
},
all: { src: ['<%= root %>/test/server/unit/**/*.js']}
all: { src: ['<%= root %>/test/unit/{server,tasks}/**/*.js'] }
};
84 changes: 0 additions & 84 deletions tasks/render_readme.js

This file was deleted.

134 changes: 134 additions & 0 deletions tasks/utils/updateVersion.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
var _ = require('lodash');

module.exports = updateVersion;

var versions = [
'major',
'minor',
'patch',
'tag'
];

/**
* change the version based on a basic expression
*
* Expressions have two pieces, the version piece to
* set and the new value. If the version peice is not
* "tag" then the new value can be left of and the preivous
* value will simply be incremented by one. if the version
* peice is tag, some special rules apply:
* 1. leaving the value empty will remove a tag
* 2. adding a new tag bumps the minor version
*
* examples:
*
* expr: minor
* 1.4.1 => 1.5.0
*
* expr: minor=10
* 1.5.5 => 1.10.0
*
* expr: major=4
* 0.0.1 => 4.0.0
*
* expr: tag=beta2
* 4.0.0-beta1 => 4.0.0-beta2
*
* expr: tag=snapshot
* 4.0.0 => 4.1.0-snapshot
*
* expr: tag=
* 4.0.0-rc1 => 4.0.0
*
*/
function updateVersion(version, expr) {
expr = String(expr).split('=');

var change = {
name: expr[0],
val: expr[1] || null
};

if (!_.contains(versions, change.name)) {
throw new Error('version update expression needs to start with one of ' + versions.join(', '));
}

if (change.name === 'tag' && change.val) {
change.val = change.val.toLowerCase();
}

// parse the current version
var parts = _.chain(version.split('.'))

// ensure that their are three pieces, either x.x.x or x.x.x-y
.tap(function (versionNumbers) {
if (versionNumbers.length !== 3) {
throw new Error('Version number "' + version + '" should have two dots, like 4.1.0');
}
})

// describe all of the version parts with a name, parse
// the numbers, and extract tag from patch
.transform(function (parts, v, i) {
var name = versions[i];

if (name !== 'patch') {
parts[name] = _.parseInt(v);
return;
}

// patch is two parts, a version number and an optional tag
v = v.split('-');
parts.patch = _.parseInt(v.shift());
parts.tag = v.join('-');
}, {})

// sanity check
.tap(function (parts) {

var valid = true;
valid = valid && _.isNumber(parts.major);
valid = valid && _.isNumber(parts.minor);
valid = valid && _.isNumber(parts.patch);
valid = valid && _.isString(parts.tag);

if (!valid) {
throw new Error('Unable to parse version "' + version + '"');
}

})

// perform the change on parts
.tap(function (parts) {
if (change.name === 'tag' && change.val && !parts.tag) {
// special operation that doesn't follow the natural rules
parts.minor += 1;
parts.patch = 0;
parts.tag = change.val;
return;
}

// since the version parts are in order from left to right, the update
// reset all of the values to the right of it:
//
// 0.12.3-beta -> 1.0.0 (increment major, reset everything else)

// primary update
if (change.name === 'tag') {
parts[change.name] = change.val;
} else {
parts[change.name] = (change.val == null) ? parts[change.name] + 1 : change.val;
}

// properties that are zero-d by the previous update
var emptyUpdates = versions.slice(versions.indexOf(change.name) + 1);
while (emptyUpdates.length) {
parts[emptyUpdates.shift()] = '';
}
})
.value();

return (parts.major || 0) + '.' +
(parts.minor || 0) + '.' +
(parts.patch || 0) + (parts.tag ? '-' + parts.tag : '');
}
48 changes: 48 additions & 0 deletions tasks/version.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
module.exports = function (grunt) {
var root = require('path').resolve.bind(null, __dirname, '..');
var updateVersion = require('./utils/updateVersion');

var README_PATH = root('README.md');
var PKG_JSON_PATH = root('package.json');
var START = '<!--version-->';
var END = '<!--/version-->';

grunt.registerTask('version', function (updateExpr) {
var oldVersion = grunt.config.get('pkg.version');
var version = updateVersion(oldVersion, updateExpr);
grunt.log.debug('switching from %s to %s', oldVersion, version);

// update grunt config
grunt.config.set('pkg.version', version);

// write back to package.json
var pkgJson = grunt.file.read(PKG_JSON_PATH);
pkgJson = pkgJson.replace(JSON.stringify(oldVersion), JSON.stringify(version));
grunt.file.write(PKG_JSON_PATH, pkgJson);
grunt.log.ok('updated package.json', version);

// write the readme
var input = grunt.file.read(README_PATH);
var readme = '';

var startI, endI, before;
while (input.length) {
startI = input.indexOf(START);
endI = input.indexOf(END);
if (endI < startI) throw new Error('version tag mismatch in ' + input);

if (startI < 0) {
readme += input;
break;
}

before = input.substr(0, startI);
input = input.substr(endI ? endI + END.length : startI);

readme += before + START + version + END;
}

grunt.file.write(README_PATH, readme);
grunt.log.ok('updated readme', version);
});
};
33 changes: 33 additions & 0 deletions test/unit/tasks/utils/updateVersion.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
var updateVersion = require('../../../../tasks/utils/updateVersion');

describe('tasks/utils/updateVersion', function () {

it('applies a basic "minor" update', function () {
expect(updateVersion('1.4.1', 'minor')).to.be('1.5.0');
});

it('accepts a number for a version name', function () {
expect(updateVersion('1.5.5', 'minor=10')).to.be('1.10.0');
});

it('clears the tag and updates all lower version ids', function () {
expect(updateVersion('0.0.1-beta2', 'major=4')).to.be('4.0.0');
});

it('updates just a tag', function () {
expect(updateVersion('4.0.0-beta1', 'tag=beta2')).to.be('4.0.0-beta2');
});

it('clears a tag', function () {
expect(updateVersion('4.0.0-rc1', 'tag=')).to.be('4.0.0');
});

it('adds a tag, bumping the minor version', function () {
expect(updateVersion('4.0.0', 'tag=snapshot')).to.be('4.1.0-snapshot');
});

it('changes a tag', function () {
expect(updateVersion('4.1.0-snapshot', 'tag=rc1')).to.be('4.1.0-rc1');
});

});