aboutsummaryrefslogtreecommitdiffstats
path: root/build
diff options
context:
space:
mode:
authorFelix Nagel <info@felixnagel.com>2013-07-01 23:23:50 +0200
committerFelix Nagel <info@felixnagel.com>2013-07-01 23:23:50 +0200
commitc571f7bea9ce7a4bb0db717cd4aec0b803b43d79 (patch)
tree43505c53232eed697666ac87a123a5e249e55b84 /build
parentb9fa8f7a8c1f00ec987447feebae66f9563138d8 (diff)
parent4ed52cba6555660268210ef76c38101d9dfef8df (diff)
downloadjquery-ui-c571f7bea9ce7a4bb0db717cd4aec0b803b43d79.tar.gz
jquery-ui-c571f7bea9ce7a4bb0db717cd4aec0b803b43d79.zip
Merge branch 'master' into selectmenu
Diffstat (limited to 'build')
-rw-r--r--build/release/release.js219
-rw-r--r--build/tasks/build.js82
2 files changed, 190 insertions, 111 deletions
diff --git a/build/release/release.js b/build/release/release.js
index 3cbee64b7..c1c10a418 100644
--- a/build/release/release.js
+++ b/build/release/release.js
@@ -4,12 +4,14 @@
// Usage:
// stable release: node release.js
// pre-release: node release.js --pre-release {version}
-// test run: node release.js --remote=user/repo
+// test run: node release.js --remote={repo}
+// - repo: "/tmp/repo" (filesystem), "user/repo" (github), "http://mydomain/repo.git" (another domain)
"use strict";
-var baseDir, repoDir, prevVersion, newVersion, nextVersion, tagTime, preRelease, repo,
+var baseDir, downloadBuilder, repoDir, prevVersion, newVersion, nextVersion, tagTime, preRelease, repo,
fs = require( "fs" ),
+ path = require( "path" ),
rnewline = /\r?\n/,
branch = "master";
@@ -25,7 +27,8 @@ walk([
confirm,
section( "building release" ),
- buildRelease,
+ buildReleaseBranch,
+ buildPackage,
section( "pushing tag" ),
confirmReview,
@@ -66,13 +69,6 @@ function cloneRepo() {
if ( exec( "npm install" ).code !== 0 ) {
abort( "Error installing dependencies." );
}
- // We need download.jqueryui.com in order to generate themes.
- // We only generate themes for stable releases.
- if ( !preRelease ) {
- if ( exec( "npm install download.jqueryui.com" ).code !== 0 ) {
- abort( "Error installing dependencies." );
- }
- }
echo();
}
@@ -109,8 +105,7 @@ function getVersions() {
if ( preRelease ) {
newVersion = preRelease;
- // Note: prevVersion is not currently used for pre-releases. The TODO
- // below about 1.10.0 applies here as well.
+ // Note: prevVersion is not currently used for pre-releases.
prevVersion = nextVersion = currentVersion;
} else {
newVersion = currentVersion.substr( 0, currentVersion.length - 3 );
@@ -119,15 +114,14 @@ function getVersions() {
minor = parseInt( parts[ 1 ], 10 );
patch = parseInt( parts[ 2 ], 10 );
- // TODO: handle 1.10.0
- // Also see comment above about pre-releases
- if ( patch === 0 ) {
- abort( "This script is not smart enough to handle the 1.10.0 release." );
+ if ( minor === 0 && patch === 0 ) {
+ abort( "This script is not smart enough to handle major release (eg. 2.0.0)." );
+ } else if ( patch === 0 ) {
+ prevVersion = git( "for-each-ref --count=1 --sort=-authordate --format='%(refname:short)' refs/tags/" + [ major, minor - 1 ].join( "." ) + "*" ).trim();
+ } else {
+ prevVersion = [ major, minor, patch - 1 ].join( "." );
}
- prevVersion = patch === 0 ?
- [ major, minor - 1, 0 ].join( "." ) :
- [ major, minor, patch - 1 ].join( "." );
nextVersion = [ major, minor, patch + 1 ].join( "." ) + "pre";
}
@@ -135,9 +129,8 @@ function getVersions() {
echo( "After the release, the version will be " + nextVersion.cyan + "." );
}
-function buildRelease() {
- var pkg,
- releaseTask = preRelease ? "release" : "release_cdn";
+function buildReleaseBranch() {
+ var pkg;
echo( "Creating " + "release".cyan + " branch..." );
git( "checkout -b release", "Error creating release branch." );
@@ -158,12 +151,6 @@ function buildRelease() {
}
echo();
- echo( "Building release..." );
- if ( exec( "grunt " + releaseTask ).code !== 0 ) {
- abort( "Error building release." );
- }
- echo();
-
echo( "Committing release artifacts..." );
git( "add *.jquery.json", "Error adding manifest files to git." );
git( "commit -am 'Tagging the " + newVersion + " release.'",
@@ -175,6 +162,173 @@ function buildRelease() {
tagTime = git( "log -1 --format='%ad'", "Error getting tag timestamp." ).trim();
}
+function buildPackage( callback ) {
+ if( preRelease ) {
+ return buildPreReleasePackage( callback );
+ } else {
+ return buildCDNPackage( callback );
+ }
+}
+
+function buildPreReleasePackage( callback ) {
+ var build, files, jqueryUi, packer, target, targetZip;
+
+ echo( "Build pre-release Package" );
+
+ jqueryUi = new downloadBuilder.JqueryUi( path.resolve( "." ) );
+ build = new downloadBuilder.Builder( jqueryUi, ":all:" );
+ packer = new downloadBuilder.Packer( build, null, {
+ addTests: true,
+ bundleSuffix: "",
+ skipDocs: true,
+ skipTheme: true
+ });
+ target = "../" + jqueryUi.pkg.name + "-" + jqueryUi.pkg.version;
+ targetZip = target + ".zip";
+
+ return walk([
+ function( callback ) {
+ echo( "Building release files" );
+ packer.pack(function( error, _files ) {
+ if( error ) {
+ abort( error.stack );
+ }
+ files = _files.map(function( file ) {
+
+ // Strip first path
+ file.path = file.path.replace( /^[^\/]*\//, "" );
+ return file;
+
+ }).filter(function( file ) {
+
+ // Filter development-bundle content only
+ return (/^development-bundle/).test( file.path );
+ }).map(function( file ) {
+
+ // Strip development-bundle
+ file.path = file.path.replace( /^development-bundle\//, "" );
+ return file;
+
+ });
+ return callback();
+ });
+ },
+ function() {
+ downloadBuilder.util.createZip( files, targetZip, function( error ) {
+ if ( error ) {
+ abort( error.stack );
+ }
+ echo( "Built zip package at " + path.relative( "../..", targetZip ).cyan );
+ return callback();
+ });
+ }
+ ]);
+}
+
+function buildCDNPackage( callback ) {
+ var build, output, target, targetZip,
+ add = function( file ) {
+ output.push( file );
+ },
+ jqueryUi = new downloadBuilder.JqueryUi( path.resolve( "." ) ),
+ themeGallery = downloadBuilder.themeGallery( jqueryUi );
+
+ echo( "Build CDN Package" );
+
+ build = new downloadBuilder.Builder( jqueryUi, ":all:" );
+ output = [];
+ target = "../" + jqueryUi.pkg.name + "-" + jqueryUi.pkg.version + "-cdn";
+ targetZip = target + ".zip";
+
+ [ "AUTHORS.txt", "MIT-LICENSE.txt", "package.json" ].map(function( name ) {
+ return build.get( name );
+ }).forEach( add );
+
+ // "ui/*.js"
+ build.componentFiles.filter(function( file ) {
+ return (/^ui\//).test( file.path );
+ }).forEach( add );
+
+ // "ui/*.min.js"
+ build.componentMinFiles.filter(function( file ) {
+ return (/^ui\//).test( file.path );
+ }).forEach( add );
+
+ // "i18n/*.js"
+ build.i18nFiles.rename( /^ui\//, "" ).forEach( add );
+ build.i18nMinFiles.rename( /^ui\//, "" ).forEach( add );
+ build.bundleI18n.into( "i18n/" ).forEach( add );
+ build.bundleI18nMin.into( "i18n/" ).forEach( add );
+
+ build.bundleJs.forEach( add );
+ build.bundleJsMin.forEach( add );
+
+ walk( themeGallery.map(function( theme ) {
+ return function( callback ) {
+ var themeCssOnlyRe, themeDirRe,
+ folderName = theme.folderName(),
+ packer = new downloadBuilder.Packer( build, theme, {
+ skipDocs: true
+ });
+ // TODO improve code by using custom packer instead of download packer (Packer)
+ themeCssOnlyRe = new RegExp( "development-bundle/themes/" + folderName + "/jquery.ui.theme.css" );
+ themeDirRe = new RegExp( "css/" + folderName );
+ packer.pack(function( error, files ) {
+ if ( error ) {
+ abort( error.stack );
+ }
+ // Add theme files.
+ files
+ // Pick only theme files we need on the bundle.
+ .filter(function( file ) {
+ if ( themeCssOnlyRe.test( file.path ) || themeDirRe.test( file.path ) ) {
+ return true;
+ }
+ return false;
+ })
+ // Convert paths the way bundle needs
+ .map(function( file ) {
+ file.path = file.path
+
+ // Remove initial package name eg. "jquery-ui-1.10.0.custom"
+ .split( "/" ).slice( 1 ).join( "/" )
+
+ .replace( /development-bundle\/themes/, "css" )
+ .replace( /css/, "themes" )
+
+ // Make jquery-ui-1.10.0.custom.css into jquery-ui.css, or jquery-ui-1.10.0.custom.min.css into jquery-ui.min.css
+ .replace( /jquery-ui-.*?(\.min)*\.css/, "jquery-ui$1.css" );
+
+ return file;
+ }).forEach( add );
+ return callback();
+ });
+ };
+ }).concat([function() {
+ var crypto = require( "crypto" );
+
+ // Create MD5 manifest
+ output.push({
+ path: "MANIFEST",
+ data: output.sort(function( a, b ) {
+ return a.path.localeCompare( b.path );
+ }).map(function( file ) {
+ var md5 = crypto.createHash( "md5" );
+ md5.update( file.data );
+ return file.path + " " + md5.digest( "hex" );
+ }).join( "\n" )
+ });
+
+ downloadBuilder.util.createZip( output, targetZip, function( error ) {
+ if ( error ) {
+ abort( error.stack );
+ }
+ echo( "Built zip CDN package at " + path.relative( "../..", targetZip ).cyan );
+ return callback();
+ });
+ }]));
+}
+
function pushRelease() {
echo( "Pushing release to GitHub..." );
git( "push --tags", "Error pushing tags to GitHub." );
@@ -358,7 +512,11 @@ function writePackage( pkg ) {
function bootstrap( fn ) {
getRemote(function( remote ) {
- repo = "git@github.com:" + remote + ".git";
+ if ( (/:/).test( remote ) || fs.existsSync( remote ) ) {
+ repo = remote;
+ } else {
+ repo = "git@github.com:" + remote + ".git";
+ }
_bootstrap( fn );
});
}
@@ -419,7 +577,7 @@ function _bootstrap( fn ) {
fs.mkdirSync( baseDir );
console.log( "Installing dependencies..." );
- require( "child_process" ).exec( "npm install shelljs colors", function( error ) {
+ require( "child_process" ).exec( "npm install shelljs colors download.jqueryui.com@1.10.3-4", function( error ) {
if ( error ) {
console.log( error );
return process.exit( 1 );
@@ -427,6 +585,7 @@ function _bootstrap( fn ) {
require( "shelljs/global" );
require( "colors" );
+ downloadBuilder = require( "download.jqueryui.com" );
fn();
});
diff --git a/build/tasks/build.js b/build/tasks/build.js
index ca36ff998..4d803df77 100644
--- a/build/tasks/build.js
+++ b/build/tasks/build.js
@@ -2,8 +2,7 @@ module.exports = function( grunt ) {
"use strict";
-var path = require( "path" ),
- fs = require( "fs" );
+var fs = require( "fs" );
function expandFiles( files ) {
return grunt.util._.pluck( grunt.file.expandMapping( files ), "src" ).filter(function(filepath) {
@@ -132,85 +131,6 @@ grunt.registerMultiTask( "copy", "Copy files to destination folder and replace @
}
});
-
-grunt.registerMultiTask( "zip", "Create a zip file for release", function() {
- var done = this.async(),
- dest = this.data.dest;
- grunt.util.spawn({
- cmd: "zip",
- args: [ "-r", dest, this.data.src ],
- opts: {
- cwd: "dist"
- }
- }, function( err ) {
- if ( err ) {
- grunt.log.error( err );
- done();
- return;
- }
- grunt.log.writeln( "Zipped " + dest );
- done();
- });
-});
-
-grunt.registerMultiTask( "md5", "Create list of md5 hashes for CDN uploads", function() {
- // remove dest file before creating it, to make sure itself is not included
- if ( fs.existsSync( this.data.dest ) ) {
- fs.unlinkSync( this.data.dest );
- }
- var crypto = require( "crypto" ),
- dir = this.filesSrc + "/",
- hashes = [];
- expandFiles( dir + "**/*" ).forEach(function( fileName ) {
- var hash = crypto.createHash( "md5" );
- hash.update( grunt.file.read( fileName, "ascii" ) );
- hashes.push( fileName.replace( dir, "" ) + " " + hash.digest( "hex" ) );
- });
- grunt.file.write( this.data.dest, hashes.join( "\n" ) + "\n" );
- grunt.log.writeln( "Wrote " + this.data.dest + " with " + hashes.length + " hashes" );
-});
-
-grunt.registerTask( "generate_themes", function() {
- var download, done,
- distFolder = "dist/" + grunt.template.process( grunt.config( "files.dist" ), grunt.config() ),
- target = "dist/" + grunt.template.process( grunt.config( "files.themes" ), grunt.config() ) + "/";
-
- try {
- require.resolve( "download.jqueryui.com" );
- } catch( error ) {
- throw new Error( "You need to manually install download.jqueryui.com for this task to work" );
- }
-
- download = require( "download.jqueryui.com" )({
- config: {
- "jqueryUi": {
- "stable": { "path": path.resolve( __dirname + "/../../" + distFolder ) }
- },
- "jquery": "skip"
- }
- });
-
- done = this.async();
- download.buildThemesBundle(function( error, files ) {
- if ( error ) {
- grunt.log.error( error );
- return done( false );
- }
-
- done(
- files.every(function( file ) {
- try {
- grunt.file.write( target + file.path, file.data );
- } catch( err ) {
- grunt.log.error( err );
- return false;
- }
- return true;
- }) && grunt.log.writeln( "Generated at " + target )
- );
- });
-});
-
grunt.registerTask( "clean", function() {
require( "rimraf" ).sync( "dist" );
});