@@ -26,7 +26,11 @@ module.exports = function(grunt) {
26
26
] ,
27
27
// Task configuration.
28
28
clean : {
29
- build : [ 'build' ]
29
+ build : [ 'build' ] ,
30
+ release : [ 'release' ]
31
+ } ,
32
+ changelog : {
33
+ dest : 'CHANGELOG'
30
34
} ,
31
35
concat : {
32
36
core : {
@@ -103,6 +107,30 @@ module.exports = function(grunt) {
103
107
dest : 'build/<%= pkg.name %>-wsh.js'
104
108
}
105
109
} ,
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
+ } ,
106
134
jshint : {
107
135
options : {
108
136
curly : true ,
@@ -165,12 +193,16 @@ module.exports = function(grunt) {
165
193
grunt . loadNpmTasks ( 'grunt-contrib-jshint' ) ;
166
194
grunt . loadNpmTasks ( 'grunt-contrib-watch' ) ;
167
195
grunt . loadNpmTasks ( 'grunt-contrib-clean' ) ;
196
+ grunt . loadNpmTasks ( 'grunt-contrib-copy' ) ;
197
+ grunt . loadNpmTasks ( 'grunt-include-replace' ) ;
168
198
169
199
// Default task.
170
200
grunt . registerTask ( 'default' , [ 'test' ] ) ;
171
201
172
- grunt . registerTask ( 'test' , [ 'clean' , 'jshint' , 'concat' , 'yuitest' ] ) ;
202
+ grunt . registerTask ( 'test' , [ 'clean:build ' , 'jshint' , 'concat' , 'yuitest' ] ) ;
173
203
204
+ grunt . registerTask ( 'release' , [ 'test' , 'clean:release' , 'copy:release' , 'includereplace' , 'changelog' ] ) ;
205
+
174
206
//Run the YUITest suite
175
207
grunt . registerMultiTask ( 'yuitest' , 'Run the YUITests for the project' , function ( ) {
176
208
/*jshint evil:true, node: true */
@@ -226,4 +258,73 @@ module.exports = function(grunt) {
226
258
TestRunner . subscribe ( TestRunner . COMPLETE_EVENT , reportResults ) ;
227
259
TestRunner . run ( ) ;
228
260
} ) ;
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
+ } ) ;
229
330
} ;
0 commit comments