diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/grunt/utils.js | 86 |
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; } |
