diff --git a/.gitignore b/.gitignore index 10c58cf685..465cdb4633 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ validation-report.json # Folders to ignore node_modules +bower_components diff --git a/.travis.yml b/.travis.yml index 9f2371887f..775a7f15aa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - 0.8 + - 0.10 before_script: - gem install jekyll - npm install -g grunt-cli diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 96b7732b0d..f00f3b780e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,7 +17,7 @@ We only accept issues that are bug reports or feature requests. Bugs must be iso ## Pull requests -- CSS changes must be done in `.less` files first, never just the compiled `.css` files +- CSS changes must be done in `.less` files first, never just in the compiled `.css` files - If modifying the `.less` files, always recompile and commit the compiled files `bootstrap.css` and `bootstrap.min.css` - Try not to pollute your pull request with unintended changes--keep them simple and small - Try to share which browsers your code has been tested in before submitting a pull request @@ -59,3 +59,21 @@ We only accept issues that are bug reports or feature requests. Bugs must be iso With v3.1, we're moving from the Apache 2 to the MIT license for the Bootstrap code (not the docs). We're in the process of collecting permissions from all Bootstrap contributors with code still part of the project to make this happen. For details, please see [#2054](https://github.com/twbs/bootstrap/issues/2054). By contributing your code, you agree to dual-license your contribution under the [Apache 2](https://github.com/twbs/bootstrap/blob/master/LICENSE) and [MIT](https://github.com/twbs/bootstrap/blob/master/MIT) licenses. + + + +## Release checklist + +1. Close ship list issue for the release. +2. Close the milestone for the release. +3. Open new release issue that includes this checklist. +4. Ping folks to coordinate release (mainly @jdorfman for BootstrapCDN). +5. Update version numbers using `grunt change-version-number --oldver=A.B.C --newver=X.Y.Z`. Review the changes and stage them manually. +6. Run `grunt` one last time. +7. Push to `master` branch. +8. Merge `master` into `gh-pages`. +9. Generate `bootstrap-X.Y.Z-dist.zip` file for release. +10. Create release on GitHub with `/dist/` folder and release notes. +11. Push `gh-pages`. +12. Publish blog post. +13. Tweet tweet. diff --git a/Gruntfile.js b/Gruntfile.js index 97f4ec4c0a..beacc3cc87 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -3,6 +3,7 @@ module.exports = function(grunt) { "use strict"; + RegExp.quote = require('regexp-quote') var btoa = require('btoa') // Project configuration. grunt.initConfig({ @@ -10,11 +11,9 @@ module.exports = function(grunt) { // Metadata. pkg: grunt.file.readJSON('package.json'), banner: '/*!\n' + - ' * Bootstrap v<%= pkg.version %> by @fat and @mdo\n' + + ' * Bootstrap v<%= pkg.version %> (http://getbootstrap.com)\n' + ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + ' * Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' + - ' *\n' + - ' * Designed and built with all the love in the world by @mdo and @fat.\n' + ' */\n\n', jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n', @@ -134,8 +133,8 @@ module.exports = function(grunt) { options: { reset: true, relaxerror: [ - "Bad value X-UA-Compatible for attribute http-equiv on element meta.", - "Element img is missing required attribute src." + "Bad value X-UA-Compatible for attribute http-equiv on element meta.", + "Element img is missing required attribute src." ] }, files: { @@ -156,6 +155,17 @@ module.exports = function(grunt) { files: 'less/*.less', tasks: ['recess'] } + }, + + sed: { + versionNumber: { + pattern: (function () { + var old = grunt.option('oldver') + return old ? RegExp.quote(old) : old + })(), + replacement: grunt.option('newver'), + recursive: true + } } }); @@ -173,6 +183,7 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-html-validation'); grunt.loadNpmTasks('grunt-jekyll'); grunt.loadNpmTasks('grunt-recess'); + grunt.loadNpmTasks('grunt-sed'); // Docs HTML validation task grunt.registerTask('validate-html', ['jekyll', 'validation']); @@ -203,6 +214,11 @@ module.exports = function(grunt) { // Default task. grunt.registerTask('default', ['test', 'dist', 'build-customizer']); + // Version numbering task. + // grunt change-version-number --oldver=A.B.C --newver=X.Y.Z + // This can be overzealous, so its changes should always be manually reviewed! + grunt.registerTask('change-version-number', ['sed']); + // task for building customizer grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () { var fs = require('fs') diff --git a/README.md b/README.md index 2db1acc86f..72a3935d93 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ To get started, check out ! Three quick start options are available: -* [Download the latest release](https://github.com/twbs/bootstrap/releases/tag/v3.0.0). +* [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.0.2.zip). * Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. * Install with [Bower](http://bower.io): `bower install bootstrap`. diff --git a/_config.yml b/_config.yml index 4881bac45a..0433cf0d99 100644 --- a/_config.yml +++ b/_config.yml @@ -11,15 +11,15 @@ exclude: [".editorconfig", ".gitignore", "bower.json", "composer.json", port: 9001 # Custom vars -current_version: 3.0.1 +current_version: 3.0.2 repo: https://github.com/twbs/bootstrap -download_source: https://github.com/twbs/bootstrap/archive/v3.0.1.zip -download_dist: https://github.com/twbs/bootstrap/releases/download/v3.0.1/bootstrap-3.0.1-dist.zip +download_source: https://github.com/twbs/bootstrap/archive/v3.0.2.zip +download_dist: https://github.com/twbs/bootstrap/releases/download/v3.0.2/bootstrap-3.0.2-dist.zip blog: http://blog.getbootstrap.com expo: http://expo.getbootstrap.com -cdn_css: //netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap.min.css -cdn_theme_css: //netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap-theme.min.css -cdn_js: //netdna.bootstrapcdn.com/bootstrap/3.0.1/js/bootstrap.min.js +cdn_css: //netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css +cdn_theme_css: //netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap-theme.min.css +cdn_js: //netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js diff --git a/_includes/footer.html b/_includes/footer.html index 7f9f8f103b..56518ac49f 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,10 +1,9 @@ - + - @@ -18,6 +17,21 @@ {% endif %} +{% comment %} + Inject Twitter widgets asynchronously. Snippet snipped from Twitter's + JS interface site: https://dev.twitter.com/docs/tfw-javascript + + * "js.async=1;" added to add async attribute to the generated script tag. +{% endcomment %} + +