diff options
| author | Tobias Bosch | 2014-02-04 10:25:10 -0800 | 
|---|---|---|
| committer | Igor Minar | 2014-02-04 16:20:22 -0800 | 
| commit | 8761ddc0e382f48fa0317c88bd6426997d24037f (patch) | |
| tree | c4fe2feced1044285a3517793bac31ea69fcd504 /lib | |
| parent | 058842ad04009c306f9ac1403f3b8e354af523bd (diff) | |
| download | angular.js-8761ddc0e382f48fa0317c88bd6426997d24037f.tar.bz2 | |
chore(release): be able to release any commit
The version information is now stored only in the tags.
By this we are able to release commits in the past, which
have already been tested, so we don't need a code freeze
or run tests any more. This is also the first step for
letting Travis do the releases in the future.
The package.json now contains the new
property 'branchVersion' that defines which tags are
valid on this branch.
Closes #6116
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;      } | 
