Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
node_modules/*
mite_test_home/*
mite.sublime-workspace
.idea
11 changes: 7 additions & 4 deletions .mite
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
{
"ignorePaths": [
"**/*"
]
}
"host": "localhost",
"port": 3306,
"user": "whiteboard",
"password": "fnb1015",
"dialect": "mysql",
"database": "miteTest"
}
16 changes: 10 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,21 +55,25 @@ mite uses a lot of `git` style subcommands. You can execute mite commands from a

**create** - creates a new empty migration in the `migrations/` directory.

**up** - runs any unexecuted migrations. The status must not be dirty prior to runing `mite up`
**up** - runs any unexecuted migrations. The status must not be dirty prior to running `mite up`.

**stepup** - run the first unexecuted migration
**do file-name** - runs the specified migration. The status must not be dirty.

**undo file-name** - reverses the specified migration. The status must not be dirty.

**stepup** - run the first unexecuted migration.

**down** - run the down migrations from the current *head* all the way down to the first migration. This is destructive and should never be run in a production environment.

**stepdown** - run the down of the last executed migration. This is destructive and should never be run in a production environment.

**submodules** - list all submodules
**submodules** - list all submodules.

**compare** - list the current disk hash + the tracked hash of all migrations
**compare** - list the current disk hash + the tracked hash of all migrations.

**help** - print usage information
**help** - print usage information.

**help [command]** - print usage information for a specific command
**help [command]** - print usage information for a specific command.


## Configuration
Expand Down
10 changes: 10 additions & 0 deletions database/createDB
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Remove any existing instance of miteTest database.
drop database `miteTest`;
# Create a new instance of miteTest database.
CREATE DATABASE `miteTest`;
# Grant access to the database.
grant all privileges on `miteTest`.* to whiteboard@localhost identified by 'fnb1015';
# ---------------------------------------------------------------------------------------------------------------------
# Load copy of database for testing.
use miteTest;
source miteTest.sql
12 changes: 12 additions & 0 deletions database/miteTest.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
DROP TABLE IF EXISTS `Files`;
CREATE TABLE `Files` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`filename` varchar(2048) NOT NULL,
`fileSize` int(11) DEFAULT NULL,
`userId` char(36) DEFAULT NULL,
`createdAt` datetime NOT NULL,
`updatedAt` datetime NOT NULL,
`visibleToAll` tinyint(1) DEFAULT '1',
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
52 changes: 52 additions & 0 deletions lib/cli/do.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
var Mite = require("../mite"),
reporter = require("./reporter"),
MigrationProvider = require("../migrationProvider");

var cliUtil = require("./util"),
printMigrationList = cliUtil.printMigrationList,
connectionError = cliUtil.connectionError,
handleUninitialized = cliUtil.handleUninitialized;

module.exports = DoCommand;

function DoCommand(fileName) {
this.fileName= fileName;
}

DoCommand.prototype.preExecute = function(config) {
var mite = new Mite(config);

return mite.connect()
.fail(connectionError)
.then(mite._requireInit.bind(mite))
.fail(handleUninitialized)
.then(function(){
return mite;
});
};

DoCommand.prototype.execute = function(mite) {
var opts = {
submodule: mite.config.name
},
provider = new MigrationProvider(mite.config.migrationRoot, opts),
executed = function(key) {
reporter.success("do: %s...", key);
};

mite.on("migrationExecuted", executed);

return mite.doMigration(provider.getMigrations(), this.fileName, opts).then(function(doStatus) {
if(doStatus.error){
reporter.err(doStatus.error);
} else if (doStatus.updated) {
reporter.success("complete");
} else if (!doStatus.updated && doStatus.wasClean) {
reporter.warn("no migration executed. status was clean");
} else if (doStatus.dirtyMigrations) {
printMigrationList("no migration executed. status is dirty. fix it.", "err", doStatus.dirtyMigrations, "err");
}

mite.removeListener("migrationExecuted", executed);
});
};
22 changes: 21 additions & 1 deletion lib/cli/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ var UpCommand = require("./up"),
StatusCommand = require("./status"),
CreateCommand = require("./create"),
StepUpCommand = require("./stepUp"),
DoCommand = require("./do"),
UnDoCommand = require("./undo"),
StepDownCommand = require("./stepDown"),
InitCommand = require("./init"),
DownCommand = require("./down"),
Expand Down Expand Up @@ -60,9 +62,11 @@ var upCli = program
.command("up")
.description("run all unexecuted migrations")
.option("-a --all", "execute an up on all submodules and then the main project migrations")
.option("-f --force","force the up action")
.action(function() {
runCommand(new UpCommand({
all: upCli.all
all: upCli.all,
force: upCli.force
}));
});

Expand All @@ -77,6 +81,22 @@ program
runCommand(new StepUpCommand());
});

program
.command("do")
.description("run the specified migration; syntax: do file-name")
.action(function(fileName) {
console.log("do: fileName="+fileName);
runCommand(new DoCommand(fileName));
});

program
.command("undo")
.description("reverse the specified migration; syntax: undo file-name")
.action(function(fileName) {
console.log("undo: fileName="+fileName);
runCommand(new UnDoCommand(fileName));
});

var downCli = program
.command("down")
.description("run all the down migrations")
Expand Down
2 changes: 1 addition & 1 deletion lib/cli/status.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ StatusCommand.prototype._printStatus = function(status) {

if (status.dirtyMigrations) {
var messages = status.dirtyMigrations.map(function(dirtyMigration) {
return dirtyMigration.key + ":: expected [" + dirtyMigration.hash + "]";
return dirtyMigration.key + ":: expected [" + dirtyMigration.hash + "] " + (dirtyMigration.explanation ? dirtyMigration.explanation : "");
});

printMigrationList("dirty migrations:", "info", messages, "err");
Expand Down
52 changes: 52 additions & 0 deletions lib/cli/undo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
var Mite = require("../mite"),
reporter = require("./reporter"),
MigrationProvider = require("../migrationProvider");

var cliUtil = require("./util"),
printMigrationList = cliUtil.printMigrationList,
connectionError = cliUtil.connectionError,
handleUninitialized = cliUtil.handleUninitialized;

module.exports = UnDoCommand;

function UnDoCommand(fileName) {
this.fileName= fileName;
}

UnDoCommand.prototype.preExecute = function(config) {
var mite = new Mite(config);

return mite.connect()
.fail(connectionError)
.then(mite._requireInit.bind(mite))
.fail(handleUninitialized)
.then(function(){
return mite;
});
};

UnDoCommand.prototype.execute = function(mite) {
var opts = {
submodule: mite.config.name
},
provider = new MigrationProvider(mite.config.migrationRoot, opts),
executed = function(key) {
reporter.success("undo: %s...", key);
};

mite.on("migrationExecuted", executed);

return mite.undoMigration(provider.getMigrations(), this.fileName, opts).then(function(undoStatus) {
if(undoStatus.error){
reporter.err(undoStatus.error);
} else if (undoStatus.updated) {
reporter.success("complete");
} else if (!undoStatus.updated && undoStatus.wasClean) {
reporter.warn("no migration executed. status was clean");
} else if (undoStatus.dirtyMigrations) {
printMigrationList("no migration executed. status is dirty. fix it.", "err", undoStatus.dirtyMigrations, "err");
}

mite.removeListener("migrationExecuted", executed);
});
};
20 changes: 15 additions & 5 deletions lib/cli/up.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ var Mite = require("../mite"),
submoduleProviderFactory = require("../submoduleProviderFactory"),
SubmoduleTree = require("../submoduleTree"),
_ = require("underscore"),
util = require("util"),
q = require("q");

var cliUtil = require("./util"),
Expand All @@ -15,7 +16,8 @@ module.exports = UpCommand;

function UpCommand(opts) {
this.options = _.extend({
all: false
all: false,
force: false
}, opts);
}

Expand Down Expand Up @@ -80,7 +82,8 @@ UpCommand.prototype.execute = function(mite) {

UpCommand.prototype._up = function(mite) {
var opts = {
submodule: mite.config.name
submodule: mite.config.name,
force: this.options.force
},
provider = new MigrationProvider(mite.config.migrationRoot, opts),
notifier = function(migrationKey) {
Expand All @@ -90,10 +93,17 @@ UpCommand.prototype._up = function(mite) {
mite.on("migrationExecuted", notifier);

var p = mite.up(provider.getMigrations(), opts).then(function(upStatus) {
if (!upStatus.updated && upStatus.wasClean) {
reporter.warn("no migrations executed. status is clean.");
if(upStatus.someExecuted){
reporter.warn("No migrations executed. The following migrations have already been performed.");
reporter.warn("Conflict list: "+upStatus.conflictList.join(','));
reporter.warn("Use -f (or --force) flag to force execution or 'undo' the migrations listed.");
}else if (!upStatus.updated && upStatus.wasClean) {
reporter.warn("No migrations executed. status is clean.");
} else if (!upStatus.updated && upStatus.dirtyMigrations) {
printMigrationList("no migrations executed. there are dirty migrations. fix it.", "err", upStatus.dirtyMigrations, "err");
reporter.warn("No migrations executed. There are dirty migrations. Please fix the problem(s).");
_.each(upStatus.dirtyMigrations,function(dm){
reporter.warn(util.format(" dirty: key=%s hash=%s explanation=%s",dm.key,dm.hash,dm.explanation))
});
} else if (upStatus.updated) {
reporter.success("complete");
}
Expand Down
Loading