Add option 'filePrefix' to tighten which files are classed as patch files
This commit is contained in:
Родитель
060ad14a61
Коммит
4a99cfd2f8
|
@ -19,6 +19,7 @@ var options = {
|
||||||
dir : path.join(__dirname, 'schema'),
|
dir : path.join(__dirname, 'schema'),
|
||||||
patchKey : 'schema-patch-level',
|
patchKey : 'schema-patch-level',
|
||||||
patchLevel : 4,
|
patchLevel : 4,
|
||||||
|
filePrefix : 'patch',
|
||||||
metaTable : 'metadata',
|
metaTable : 'metadata',
|
||||||
mysql : mysql,
|
mysql : mysql,
|
||||||
}
|
}
|
||||||
|
@ -56,6 +57,7 @@ Specific options for `mysql-patcher`:
|
||||||
* patchKey : string - the name of the row in the metaTable which stores the current patch
|
* patchKey : string - the name of the row in the metaTable which stores the current patch
|
||||||
* createDatabase : true/false - tries to create the database if it doesn't exist (default: false)
|
* createDatabase : true/false - tries to create the database if it doesn't exist (default: false)
|
||||||
* reversePatchAllowed : true/false - allow reverse patching to take place (default: false)
|
* reversePatchAllowed : true/false - allow reverse patching to take place (default: false)
|
||||||
|
* filePrefix : string - the patchfile prefix to look for e.g. patch-001-002.sql (default: 'patch')
|
||||||
|
|
||||||
## Database Patch Files ##
|
## Database Patch Files ##
|
||||||
|
|
||||||
|
@ -113,6 +115,7 @@ UPDATE metadata SET value = '1' WHERE name = 'schema-patch-level';
|
||||||
|
|
||||||
### Pending ###
|
### Pending ###
|
||||||
|
|
||||||
|
* added option 'filePrefix' to tighten which files are classed as patch files
|
||||||
* fixed a test related to access for an unknown user
|
* fixed a test related to access for an unknown user
|
||||||
|
|
||||||
### v0.6.1 - 2015-02-02 ###
|
### v0.6.1 - 2015-02-02 ###
|
||||||
|
|
53
index.js
53
index.js
|
@ -9,6 +9,7 @@ var path = require('path')
|
||||||
// npm
|
// npm
|
||||||
var async = require('async')
|
var async = require('async')
|
||||||
var clone = require('clone')
|
var clone = require('clone')
|
||||||
|
var glob = require('glob')
|
||||||
|
|
||||||
// globals for this package
|
// globals for this package
|
||||||
var noop = Function.prototype // a No Op function
|
var noop = Function.prototype // a No Op function
|
||||||
|
@ -40,6 +41,7 @@ function Patcher(options) {
|
||||||
this.options.reversePatchAllowed = this.options.reversePatchAllowed || false
|
this.options.reversePatchAllowed = this.options.reversePatchAllowed || false
|
||||||
this.options.patchKey = this.options.patchKey || 'patch'
|
this.options.patchKey = this.options.patchKey || 'patch'
|
||||||
this.options.createDatabase = this.options.createDatabase || false
|
this.options.createDatabase = this.options.createDatabase || false
|
||||||
|
this.options.filePrefix = this.options.filePrefix || 'patch'
|
||||||
|
|
||||||
// set this on the connection since we can have multiple statements
|
// set this on the connection since we can have multiple statements
|
||||||
// in every patch
|
// in every patch
|
||||||
|
@ -191,33 +193,60 @@ Patcher.prototype.readDbPatchLevel = function readDbPatchLevel(callback) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractBaseAndLevels(filename) {
|
||||||
|
var basename = path.basename(filename, '.sql')
|
||||||
|
var parts = basename.split('-')
|
||||||
|
|
||||||
|
if ( parts.length < 3 ) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( parts.length > 3 ) {
|
||||||
|
parts = [ parts.slice(0, parts.length - 2).join('-'), parts[parts.length-2], parts[parts.length-1] ]
|
||||||
|
}
|
||||||
|
|
||||||
|
// now parts is of length 3
|
||||||
|
return {
|
||||||
|
base : parts[0],
|
||||||
|
from : parseInt(parts[1], 10) || 0, // fixes parseInt('a', 10) => NaN
|
||||||
|
to : parseInt(parts[2], 10) || 0, // fixes parseInt('b', 10) => NaN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Patcher.prototype.readPatchFiles = function readPatchFiles(callback) {
|
Patcher.prototype.readPatchFiles = function readPatchFiles(callback) {
|
||||||
|
|
||||||
this.patches = {}
|
this.patches = {}
|
||||||
|
|
||||||
fs.readdir(this.options.dir, (function(err, files) {
|
var globSpec = path.join(this.options.dir, this.options.filePrefix) + '-*-*.sql'
|
||||||
|
glob(globSpec, (function(err, files) {
|
||||||
if (err) return callback(err)
|
if (err) return callback(err)
|
||||||
|
|
||||||
files = files.map((function(filename) {
|
|
||||||
return path.join(this.options.dir, filename)
|
|
||||||
}).bind(this))
|
|
||||||
|
|
||||||
async.eachLimit(
|
async.eachLimit(
|
||||||
files,
|
files,
|
||||||
10,
|
10,
|
||||||
(function(filename, done) {
|
(function(filename, done) {
|
||||||
var m = filename.match(/-(\d+)-(\d+)\.sql$/)
|
|
||||||
if ( !m ) {
|
var info = extractBaseAndLevels(filename)
|
||||||
return done(new Error('Unknown file format: ' + filename))
|
if ( !info ) {
|
||||||
|
// don't look at this file since it doesn't match the spec
|
||||||
|
return done()
|
||||||
}
|
}
|
||||||
|
|
||||||
var from = parseInt(m[1], 10)
|
// check the base is what we expect
|
||||||
var to = parseInt(m[2], 10)
|
if ( info.base !== this.options.filePrefix ) {
|
||||||
this.patches[from] = this.patches[from] || {}
|
return done()
|
||||||
|
}
|
||||||
|
|
||||||
|
// check we have a 'from' and 'to'
|
||||||
|
if ( info.from === 0 && info.to === 0 ) {
|
||||||
|
return done()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.patches[info.from] = this.patches[info.from] || {}
|
||||||
|
|
||||||
fs.readFile(filename, { encoding : 'utf8' }, (function(err, data) {
|
fs.readFile(filename, { encoding : 'utf8' }, (function(err, data) {
|
||||||
if (err) return done(err)
|
if (err) return done(err)
|
||||||
this.patches[from][to] = data
|
this.patches[info.from][info.to] = data
|
||||||
done()
|
done()
|
||||||
}).bind(this))
|
}).bind(this))
|
||||||
}).bind(this),
|
}).bind(this),
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
"async": "^0.9.0",
|
"async": "^0.9.0",
|
||||||
"bluebird": "^2.3.0",
|
"bluebird": "^2.3.0",
|
||||||
"clone": "^0.1.18",
|
"clone": "^0.1.18",
|
||||||
|
"glob": "^5.0.3",
|
||||||
"xtend": "^4.0.0"
|
"xtend": "^4.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
This file is ignored, since we tell mysql-patcher to look for files with a particular filename.
|
|
@ -0,0 +1 @@
|
||||||
|
This file is also ignored since it has the wrong extension (even though the basename look okay).
|
|
@ -0,0 +1 @@
|
||||||
|
-- This file is ignored since the <from> and <to> parts of the filename are non-numeric.
|
|
@ -0,0 +1 @@
|
||||||
|
-- This file is ignored since it does not begin with the required prefix. ie. <prefix>-<from>-<to>.sql.
|
Загрузка…
Ссылка в новой задаче