Skip to content

Commit d9cf7ec

Browse files
committed
chore: add script to update version number references in the project
1 parent 61efd72 commit d9cf7ec

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

build/change-version.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/usr/bin/env node
2+
3+
'use strict'
4+
5+
/*!
6+
* Script to update version number references in the project.
7+
* Copyright 2017 The Bootstrap Authors
8+
* Copyright 2017 Twitter, Inc.
9+
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
10+
*/
11+
12+
/* global Set */
13+
14+
const fs = require('fs')
15+
const path = require('path')
16+
const sh = require('shelljs')
17+
sh.config.fatal = true
18+
const sed = sh.sed
19+
20+
// Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37
21+
RegExp.quote = (string) => string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&')
22+
RegExp.quoteReplacement = (string) => string.replace(/[$]/g, '$$')
23+
24+
const DRY_RUN = false
25+
26+
function walkAsync(directory, excludedDirectories, fileCallback, errback) {
27+
if (excludedDirectories.has(path.parse(directory).base)) {
28+
return
29+
}
30+
fs.readdir(directory, (err, names) => {
31+
if (err) {
32+
errback(err)
33+
return
34+
}
35+
names.forEach((name) => {
36+
const filepath = path.join(directory, name)
37+
fs.lstat(filepath, (err, stats) => {
38+
if (err) {
39+
process.nextTick(errback, err)
40+
return
41+
}
42+
if (stats.isSymbolicLink()) {
43+
return
44+
}
45+
else if (stats.isDirectory()) {
46+
process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback)
47+
}
48+
else if (stats.isFile()) {
49+
process.nextTick(fileCallback, filepath)
50+
}
51+
})
52+
})
53+
})
54+
}
55+
56+
function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) {
57+
original = new RegExp(RegExp.quote(original), 'g')
58+
replacement = RegExp.quoteReplacement(replacement)
59+
const updateFile = !DRY_RUN ? (filepath) => {
60+
if (allowedExtensions.has(path.parse(filepath).ext)) {
61+
sed('-i', original, replacement, filepath)
62+
}
63+
} : (filepath) => {
64+
if (allowedExtensions.has(path.parse(filepath).ext)) {
65+
console.log(`FILE: ${filepath}`)
66+
}
67+
else {
68+
console.log(`EXCLUDED:${filepath}`)
69+
}
70+
}
71+
walkAsync(directory, excludedDirectories, updateFile, (err) => {
72+
console.error('ERROR while traversing directory!:')
73+
console.error(err)
74+
process.exit(1)
75+
})
76+
}
77+
78+
function main(args) {
79+
if (args.length !== 2) {
80+
console.error('USAGE: change-version old_version new_version')
81+
console.error('Got arguments:', args)
82+
process.exit(1)
83+
}
84+
const oldVersion = args[0]
85+
const newVersion = args[1]
86+
const EXCLUDED_DIRS = new Set([
87+
'.git',
88+
'node_modules',
89+
'vendor'
90+
])
91+
const INCLUDED_EXTENSIONS = new Set([
92+
// This extension whitelist is how we avoid modifying binary files
93+
'',
94+
'.css',
95+
'.html',
96+
'.js',
97+
'.json',
98+
'.md',
99+
'.scss',
100+
'.txt',
101+
'.yml'
102+
])
103+
replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion)
104+
}
105+
106+
main(process.argv.slice(2))

0 commit comments

Comments
 (0)