Skip to content

Instantly share code, notes, and snippets.

@tristanstraub
Created June 2, 2014 01:13
Show Gist options
  • Save tristanstraub/8392e557f972d012c4b6 to your computer and use it in GitHub Desktop.
Save tristanstraub/8392e557f972d012c4b6 to your computer and use it in GitHub Desktop.
async = require 'async'
_ = require 'lodash'
glob = require 'glob'
path = require 'path'
expect = require 'expect.js'
fs = require 'fs'
migrationFilePattern = /^(\d+)(-.*[.]coffee)/
getAllMigrations = ->
files = glob.sync path.resolve(__dirname, '../../scripts/migrate/migrations', '*.coffee')
return files
.map((p) -> [p, path.basename p])
.filter(([p, basename]) -> migrationFilePattern.test basename)
.map(([p, basename]) -> p)
getNewMigrations = (cb) ->
child = require('child_process')
.execFile('git',
"diff --name-only master -- #{path.resolve(__dirname, '../../scripts/migrate/migrations')}".split(' '))
allTheFiles = []
child.on 'close', ->
cb null, allTheFiles
child.stdout.on 'data', (data) ->
files = _.compact data.split('\n')
allTheFiles = files.map (p) -> path.resolve('../../', p)
getLastNumber = (files) ->
_.last _.sortBy files.map(path.basename).map((x) -> +x.split('-')[0])
formatNumber = (number) ->
('00' + number)[-3..]
renumberFile = (file, number) ->
[all, oldNumber, suffix] = file.match(migrationFilePattern)
return "#{formatNumber(number)}#{suffix}"
# Returns [{file: newFile:}]
renumberFiles = (files, lastNumber) ->
return files.map (f, i) ->
{newFile: path.resolve(path.dirname(f), renumberFile(path.basename(f), lastNumber + 1 + i)), file: f}
renameFile = ({file, newFile}, cb) ->
console.log 'Rename', file, '->', newFile
fs.rename file, newFile, cb
renameFiles = (files, cb) ->
async.mapSeries files, renameFile, cb
main = ->
getNewMigrations (err, newFiles) ->
if err then throw err
allFiles = getAllMigrations()
existingFiles = _.difference allFiles, newFiles
lastNumber = getLastNumber(existingFiles)
renumberedFiles = renumberFiles _.sortBy(newFiles, path.basename), lastNumber
renameFiles renumberedFiles, (err) ->
if err then throw err
process.exit()
if require.main is module
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment