diff --git a/README.md b/README.md index 3e1e413f..4993bae1 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ using the matched rule and runs it. Rules enabled by default are as follows: * `cpp11` – add missing `-std=c++11` to `g++` or `clang++`; * `dry` – fix repetitions like "git git push"; * `django_south_ghost` – adds `--delete-ghost-migrations` to failed because ghosts django south migration; +* `django_south_merge` – adds `--merge` to inconsistent django south migration; * `fix_alt_space` – replaces Alt+Space with Space character; * `git_add` – fix *"Did you forget to 'git add'?"*; * `git_checkout` – creates the branch before checking-out; diff --git a/tests/rules/test_django_south_ghost.py b/tests/rules/test_django_south_ghost.py index af87eef5..70fc8903 100644 --- a/tests/rules/test_django_south_ghost.py +++ b/tests/rules/test_django_south_ghost.py @@ -27,13 +27,13 @@ def stderr(): south.exceptions.GhostMigrations: ! These migrations are in the database but not on disk: - - - - - - - + + + + + + + ! I'm not trusting myself; either fix this yourself by fiddling ! with the south_migrationhistory table, or pass --delete-ghost-migrations ! to South to have it delete ALL of these records (this may not be good). diff --git a/tests/rules/test_django_south_merge.py b/tests/rules/test_django_south_merge.py new file mode 100644 index 00000000..c0426122 --- /dev/null +++ b/tests/rules/test_django_south_merge.py @@ -0,0 +1,43 @@ +import pytest +from thefuck.rules.django_south_merge import match, get_new_command +from tests.utils import Command + + +@pytest.fixture +def stderr(): + return '''Running migrations for app: + ! Migration app:0003_auto... should not have been applied before app:0002_auto__add_field_query_due_date_ but was. +Traceback (most recent call last): + File "/home/nvbn/work/.../bin/python", line 42, in + exec(compile(__file__f.read(), __file__, "exec")) + File "/home/nvbn/work/.../app/manage.py", line 34, in + execute_from_command_line(sys.argv) + File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 443, in execute_from_command_line + utility.execute() + File "/home/nvbn/work/.../lib/django/core/management/__init__.py", line 382, in execute + self.fetch_command(subcommand).run_from_argv(self.argv) + File "/home/nvbn/work/.../lib/django/core/management/base.py", line 196, in run_from_argv + self.execute(*args, **options.__dict__) + File "/home/nvbn/work/.../lib/django/core/management/base.py", line 232, in execute + output = self.handle(*args, **options) + File "/home/nvbn/work/.../app/lib/south/management/commands/migrate.py", line 108, in handle + ignore_ghosts = ignore_ghosts, + File "/home/nvbn/work/.../app/lib/south/migration/__init__.py", line 207, in migrate_app + raise exceptions.InconsistentMigrationHistory(problems) +south.exceptions.InconsistentMigrationHistory: Inconsistent migration history +The following options are available: + --merge: will just attempt the migration ignoring any potential dependency conflicts. +''' + + +def test_match(stderr): + assert match(Command('./manage.py migrate', stderr=stderr), None) + assert match(Command('python manage.py migrate', stderr=stderr), None) + assert not match(Command('./manage.py migrate'), None) + assert not match(Command('app migrate', stderr=stderr), None) + assert not match(Command('./manage.py test', stderr=stderr), None) + + +def test_get_new_command(): + assert get_new_command(Command('./manage.py migrate auth'), None) \ + == './manage.py migrate auth --merge' diff --git a/thefuck/rules/django_south_merge.py b/thefuck/rules/django_south_merge.py new file mode 100644 index 00000000..bef05970 --- /dev/null +++ b/thefuck/rules/django_south_merge.py @@ -0,0 +1,8 @@ +def match(command, settings): + return 'manage.py' in command.script and \ + 'migrate' in command.script \ + and '--merge: will just attempt the migration' in command.stderr + + +def get_new_command(command, settings): + return u'{} --merge'.format(command.script)