aboutsummaryrefslogtreecommitdiffstats
path: root/lib/grunt/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/grunt/utils.js')
-rw-r--r--lib/grunt/utils.js86
1 files changed, 69 insertions, 17 deletions
diff --git a/lib/grunt/utils.js b/lib/grunt/utils.js
index 7b772c34..24788bff 100644
--- a/lib/grunt/utils.js
+++ b/lib/grunt/utils.js
@@ -2,6 +2,7 @@ var fs = require('fs');
var shell = require('shelljs');
var grunt = require('grunt');
var spawn = require('child_process').spawn;
+var semver = require('semver');
var version;
var CSP_CSS_HEADER = '/* Include this file in your html if you are using the CSP mode. */\n\n';
@@ -32,31 +33,82 @@ module.exports = {
getVersion: function(){
if (version) return version;
-
var package = JSON.parse(fs.readFileSync('package.json', 'UTF-8'));
- var match = package.version.match(/^([^\-]*)(?:\-(.+))?$/);
- var semver = match[1].split('.');
+ try {
+
+ var gitTag = getTagOfCurrentCommit();
+ var semVerVersion, codeName, fullVersion;
+ if (gitTag) {
+ // tagged release
+ fullVersion = semVerVersion = semver.valid(gitTag);
+ codeName = getTaggedReleaseCodeName(gitTag);
+ } else {
+ // snapshot release
+ semVerVersion = getSnapshotVersion();
+ fullVersion = semVerVersion + '-' + getSnapshotSuffix();
+ codeName = 'snapshot'
+ }
+
+ var versionParts = semVerVersion.match(/(\d+)\.(\d+)\.(\d+)/);
+
+ version = {
+ full: fullVersion,
+ major: versionParts[1],
+ minor: versionParts[2],
+ dot: versionParts[3],
+ codename: codeName,
+ cdn: package.cdnVersion
+ };
- var fullVersion = match[1];
+ return version;
- if (match[2]) {
- fullVersion += '-';
- fullVersion += (match[2] == 'snapshot') ? getSnapshotSuffix() : match[2];
+ } catch (e) {
+ grunt.fail.warn(e);
}
- version = {
- full: fullVersion,
- major: semver[0],
- minor: semver[1],
- dot: semver[2].replace(/rc\d+/, ''),
- codename: package.codename,
- cdn: package.cdnVersion
- };
+ function getTagOfCurrentCommit() {
+ var gitTagResult = shell.exec('git describe --exact-match', {silent:true});
+ var gitTagOutput = gitTagResult.output.trim();
+ var branchVersionPattern = new RegExp(package.branchVersion.replace('.', '\\.').replace('*', '\\d+'));
+ if (gitTagResult.code === 0 && gitTagOutput.match(branchVersionPattern)) {
+ return gitTagOutput;
+ } else {
+ return null;
+ }
+ }
- return version;
+ function getTaggedReleaseCodeName(tagName) {
+ var tagMessage = shell.exec('git cat-file -p '+ tagName +' | grep "codename"', {silent:true}).output;
+ var codeName = tagMessage && tagMessage.match(/codename\((.*)\)/)[1];
+ if (!codeName) {
+ throw new Error("Could not extract release code name. The message of tag "+tagName+
+ " must match '*codename(some release name)*'");
+ }
+ return codeName;
+ }
+
+ function getSnapshotVersion() {
+ var oldTags = shell.exec('git tag -l v'+package.branchVersion, {silent:true}).output.trim().split('\n');
+ // ignore non semver versions.
+ oldTags = oldTags.filter(function(version) {
+ return version && semver.valid(version);
+ });
+ if (oldTags.length) {
+ oldTags.sort(semver.compare);
+ semVerVersion = oldTags[oldTags.length-1];
+ if (semVerVersion.indexOf('-') !== -1) {
+ semVerVersion = semver.inc(semVerVersion, 'prerelease');
+ } else {
+ semVerVersion = semver.inc(semVerVersion, 'patch');
+ }
+ } else {
+ semVerVersion = semver.valid(package.branchVersion.replace(/\*/g, '0'));
+ }
+ return semVerVersion;
+ }
function getSnapshotSuffix() {
- var jenkinsBuild = process.env.BUILD_NUMBER || 'local';
+ var jenkinsBuild = process.env.TRAVIS_BUILD_NUMBER || process.env.BUILD_NUMBER || 'local';
var hash = shell.exec('git rev-parse --short HEAD', {silent: true}).output.replace('\n', '');
return 'build.'+jenkinsBuild+'+sha.'+hash;
}