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