6 * Script to update version number references in the project.
7 * Copyright 2015 Twitter, Inc.
8 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10 var fs = require('fs');
11 var path = require('path');
12 var sh = require('shelljs');
13 sh.config.fatal = true;
16 // Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
17 RegExp.quote = function (string) {
18 return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
20 RegExp.quoteReplacement = function (string) {
21 return string.replace(/[$]/g, '$$');
26 function walkAsync(directory, excludedDirectories, fileCallback, errback) {
27 if (excludedDirectories.has(path.parse(directory).base)) {
30 fs.readdir(directory, function (err, names) {
35 names.forEach(function (name) {
36 var filepath = path.join(directory, name);
37 fs.lstat(filepath, function (err, stats) {
39 process.nextTick(errback, err);
42 if (stats.isSymbolicLink()) {
45 else if (stats.isDirectory()) {
46 process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback);
48 else if (stats.isFile()) {
49 process.nextTick(fileCallback, filepath);
56 function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
57 original = new RegExp(RegExp.quote(original), 'g');
58 replacement = RegExp.quoteReplacement(replacement);
59 var updateFile = !DRY_RUN ? function (filepath) {
60 if (allowedExtensions.has(path.parse(filepath).ext)) {
61 sed('-i', original, replacement, filepath);
63 } : function (filepath) {
64 if (allowedExtensions.has(path.parse(filepath).ext)) {
65 console.log('FILE: ' + filepath);
68 console.log('EXCLUDED:' + filepath);
71 walkAsync(directory, excludedDirectories, updateFile, function (err) {
72 console.error('ERROR while traversing directory!:');
79 if (args.length !== 2) {
80 console.error('USAGE: change-version old_version new_version');
81 console.error('Got arguments:', args);
84 var oldVersion = args[0];
85 var newVersion = args[1];
86 var EXCLUDED_DIRS = new Set([
91 var INCLUDED_EXTENSIONS = new Set([
92 // This extension whitelist is how we avoid modifying binary files
106 replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion);
109 main(process.argv.slice(2));