You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							110 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							110 lines
						
					
					
						
							2.8 KiB
						
					
					
				| #!/usr/bin/env node | |
|  | |
| 'use strict' | |
| 
 | |
| /*! | |
|  * Script to update version number references in the project. | |
|  * Copyright 2017 The Bootstrap Authors | |
|  * Copyright 2017 Twitter, Inc. | |
|  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
|  */ | |
| 
 | |
| /* global Set */ | |
| 
 | |
| var fs = require('fs') | |
| var path = require('path') | |
| var sh = require('shelljs') | |
| sh.config.fatal = true | |
| var sed = sh.sed | |
| 
 | |
| // Blame TC39... https://github.com/benjamingr/RegExp.escape/issues/37 | |
| RegExp.quote = function (string) { | |
|   return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&') | |
| } | |
| RegExp.quoteReplacement = function (string) { | |
|   return string.replace(/[$]/g, '$$') | |
| } | |
| 
 | |
| var DRY_RUN = false | |
| 
 | |
| function walkAsync(directory, excludedDirectories, fileCallback, errback) { | |
|   if (excludedDirectories.has(path.parse(directory).base)) { | |
|     return | |
|   } | |
|   fs.readdir(directory, function (err, names) { | |
|     if (err) { | |
|       errback(err) | |
|       return | |
|     } | |
|     names.forEach(function (name) { | |
|       var filepath = path.join(directory, name) | |
|       fs.lstat(filepath, function (err, stats) { | |
|         if (err) { | |
|           process.nextTick(errback, err) | |
|           return | |
|         } | |
|         if (stats.isSymbolicLink()) { | |
|           return | |
|         } | |
|         else if (stats.isDirectory()) { | |
|           process.nextTick(walkAsync, filepath, excludedDirectories, fileCallback, errback) | |
|         } | |
|         else if (stats.isFile()) { | |
|           process.nextTick(fileCallback, filepath) | |
|         } | |
|       }) | |
|     }) | |
|   }) | |
| } | |
| 
 | |
| function replaceRecursively(directory, excludedDirectories, allowedExtensions, original, replacement) { | |
|   original = new RegExp(RegExp.quote(original), 'g') | |
|   replacement = RegExp.quoteReplacement(replacement) | |
|   var updateFile = !DRY_RUN ? function (filepath) { | |
|     if (allowedExtensions.has(path.parse(filepath).ext)) { | |
|       sed('-i', original, replacement, filepath) | |
|     } | |
|   } : function (filepath) { | |
|     if (allowedExtensions.has(path.parse(filepath).ext)) { | |
|       console.log('FILE: ' + filepath) | |
|     } | |
|     else { | |
|       console.log('EXCLUDED:' + filepath) | |
|     } | |
|   } | |
|   walkAsync(directory, excludedDirectories, updateFile, function (err) { | |
|     console.error('ERROR while traversing directory!:') | |
|     console.error(err) | |
|     process.exit(1) | |
|   }) | |
| } | |
| 
 | |
| function main(args) { | |
|   if (args.length !== 2) { | |
|     console.error('USAGE: change-version old_version new_version') | |
|     console.error('Got arguments:', args) | |
|     process.exit(1) | |
|   } | |
|   var oldVersion = args[0] | |
|   var newVersion = args[1] | |
|   var EXCLUDED_DIRS = new Set([ | |
|     '.git', | |
|     'node_modules', | |
|     'vendor' | |
|   ]) | |
|   var INCLUDED_EXTENSIONS = new Set([ | |
|     // This extension whitelist is how we avoid modifying binary files | |
|     '', | |
|     '.css', | |
|     '.html', | |
|     '.js', | |
|     '.json', | |
|     '.md', | |
|     '.scss', | |
|     '.txt', | |
|     '.yml' | |
|   ]) | |
|   replaceRecursively('.', EXCLUDED_DIRS, INCLUDED_EXTENSIONS, oldVersion, newVersion) | |
| } | |
| 
 | |
| main(process.argv.slice(2))
 |