@@ -26,7 +26,11 @@ module.exports = function(grunt) {
2626 ] ,
2727 // Task configuration.
2828 clean : {
29- build : [ 'build' ]
29+ build : [ 'build' ] ,
30+ release : [ 'release' ]
31+ } ,
32+ changelog : {
33+ dest : 'CHANGELOG'
3034 } ,
3135 concat : {
3236 core : {
@@ -103,6 +107,30 @@ module.exports = function(grunt) {
103107 dest : 'build/<%= pkg.name %>-wsh.js'
104108 }
105109 } ,
110+ copy : {
111+ release : {
112+ files : {
113+ 'build' : 'release' ,
114+ 'release/npm/package.json' : 'package.json'
115+ }
116+ }
117+ } ,
118+ includereplace : {
119+ release : {
120+ options : {
121+ // Global variables available in all files
122+ globals : {
123+ VERSION : '<%= pkg.version %>'
124+ } ,
125+ prefix : '@' ,
126+ suffix : '@'
127+ } ,
128+ // Files to perform replacements and includes with
129+ src : 'build/**/*.*' ,
130+ // Destinaion directory to copy files to
131+ dest : 'release/'
132+ }
133+ } ,
106134 jshint : {
107135 options : {
108136 curly : true ,
@@ -165,12 +193,16 @@ module.exports = function(grunt) {
165193 grunt . loadNpmTasks ( 'grunt-contrib-jshint' ) ;
166194 grunt . loadNpmTasks ( 'grunt-contrib-watch' ) ;
167195 grunt . loadNpmTasks ( 'grunt-contrib-clean' ) ;
196+ grunt . loadNpmTasks ( 'grunt-contrib-copy' ) ;
197+ grunt . loadNpmTasks ( 'grunt-include-replace' ) ;
168198
169199 // Default task.
170200 grunt . registerTask ( 'default' , [ 'test' ] ) ;
171201
172- grunt . registerTask ( 'test' , [ 'clean' , 'jshint' , 'concat' , 'yuitest' ] ) ;
202+ grunt . registerTask ( 'test' , [ 'clean:build ' , 'jshint' , 'concat' , 'yuitest' ] ) ;
173203
204+ grunt . registerTask ( 'release' , [ 'test' , 'clean:release' , 'copy:release' , 'includereplace' , 'changelog' ] ) ;
205+
174206 //Run the YUITest suite
175207 grunt . registerMultiTask ( 'yuitest' , 'Run the YUITests for the project' , function ( ) {
176208 /*jshint evil:true, node: true */
@@ -226,4 +258,73 @@ module.exports = function(grunt) {
226258 TestRunner . subscribe ( TestRunner . COMPLETE_EVENT , reportResults ) ;
227259 TestRunner . run ( ) ;
228260 } ) ;
261+
262+ grunt . registerMultiTask ( 'changelog' , 'Write the changlog file' , function ( ) {
263+ var done = this . async ( ) ;
264+ var lastTag ;
265+ var files = this . filesSrc ;
266+
267+
268+ grunt . util . spawn ( {
269+ cmd : 'git' ,
270+ args : [ 'tag' ]
271+ } , function ( error , result , code ) {
272+ //Find the latest git tag
273+ var tags = result . stdout . split ( "\n" ) ,
274+ semver = tags [ 0 ] . replace ( 'v' , '' ) . split ( '.' ) ,
275+ major = parseInt ( semver [ 0 ] , 10 ) ,
276+ minor = parseInt ( semver [ 1 ] , 10 ) ,
277+ patch = parseInt ( semver [ 2 ] , 10 ) ;
278+
279+ //A simple array sort can't be used because of the comparison of
280+ //the strings '0.9.9' > '0.9.10'
281+ for ( var i = 1 , len = tags . length ; i < len ; i ++ ) {
282+ semver = tags [ i ] . replace ( 'v' , '' ) . split ( '.' ) ;
283+
284+ var currentMajor = parseInt ( semver [ 0 ] , 10 ) ;
285+ if ( currentMajor < major ) {
286+ continue ;
287+ } else if ( currentMajor > major ) {
288+ major = currentMajor ;
289+ }
290+
291+ var currentMinor = parseInt ( semver [ 1 ] , 10 ) ;
292+ if ( currentMinor < minor ) {
293+ continue ;
294+ } else if ( currentMinor > minor ) {
295+ minor = currentMinor ;
296+ }
297+
298+ var currentPatch = parseInt ( semver [ 2 ] , 10 ) ;
299+ if ( currentPatch < patch ) {
300+ continue ;
301+ } else if ( currentPatch > patch ) {
302+ patch = currentPatch ;
303+ }
304+ }
305+
306+ lastTag = 'v' + major + '.' + minor + '.' + patch ;
307+
308+ grunt . verbose . write ( 'Last tag: ' + lastTag ) . writeln ( ) ;
309+
310+ //
311+ grunt . util . spawn ( {
312+ cmd : 'git' ,
313+ args : [ 'log' , '--pretty=format:"* %s (%an)"' , lastTag + '..HEAD' ]
314+ } , function ( error , result , code ) {
315+ var prettyPrint = result . stdout . split ( '\"\n\"' ) . join ( '\n' ) . replace ( / \" $ / , '' ) . replace ( / ^ \" / , '' ) ;
316+
317+ grunt . verbose . writeln ( ) . write ( prettyPrint ) . writeln ( ) ;
318+
319+ var template = '<%= grunt.template.today("mmmm d, yyyy") %> - v<%= pkg.version %>\n\n' +
320+ prettyPrint + '\n\n' +
321+ grunt . file . read ( files [ 0 ] ) ;
322+
323+ grunt . file . write ( files [ 0 ] , grunt . template . process ( template ) ) ;
324+
325+ done ( ) ;
326+ } ) ;
327+ } ) ;
328+
329+ } ) ;
229330} ;
0 commit comments