From: Mike Bayer Date: Wed, 8 Aug 2012 15:12:04 +0000 (-0400) Subject: - [bug] Improved error message when specifiying X-Git-Tag: rel_0_3_6~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=046d0b701b921d0167c04fe8c9dfd8c41ec21ecd;p=thirdparty%2Fsqlalchemy%2Falembic.git - [bug] Improved error message when specifiying non-ordered revision identifiers to cover the case when the "higher" rev is None, improved message overall. #66 --- diff --git a/CHANGES b/CHANGES index 4fe2e7dd..6cc63927 100644 --- a/CHANGES +++ b/CHANGES @@ -30,6 +30,11 @@ type_ is not, i.e. there's no net change in type. #62 +- [bug] Improved error message when specifiying + non-ordered revision identifiers to cover + the case when the "higher" rev is None, + improved message overall. #66 + 0.3.5 ===== - [bug] Fixed issue whereby reflected server defaults diff --git a/alembic/command.py b/alembic/command.py index 518d6240..163c92cf 100644 --- a/alembic/command.py +++ b/alembic/command.py @@ -124,7 +124,6 @@ def downgrade(config, revision, sql=False, tag=None): """Revert to a previous version.""" script = ScriptDirectory.from_config(config) - starting_rev = None if ":" in revision: if not sql: diff --git a/alembic/script.py b/alembic/script.py index 286a3d43..e888a3e4 100644 --- a/alembic/script.py +++ b/alembic/script.py @@ -155,14 +155,16 @@ class ScriptDirectory(object): def _iterate_revisions(self, upper, lower): lower = self.get_revision(lower) upper = self.get_revision(upper) + orig = lower.revision if lower else 'base', \ + upper.revision if upper else 'base' script = upper while script != lower: + if script is None and lower is not None: + raise util.CommandError( + "Revision %s is not an ancestor of %s" % orig) yield script downrev = script.down_revision script = self._revision_map[downrev] - if script is None and lower is not None: - raise util.CommandError( - "Couldn't find revision %s" % downrev) def _upgrade_revs(self, destination, current_rev): revs = self.iterate_revisions(destination, current_rev) diff --git a/tests/test_revision_paths.py b/tests/test_revision_paths.py index dedfa8bc..cfb4affa 100644 --- a/tests/test_revision_paths.py +++ b/tests/test_revision_paths.py @@ -2,6 +2,9 @@ from tests import clear_staging_env, staging_env, eq_, ne_, \ assert_raises_message from alembic import util +env = None +a, b, c, d, e = None, None, None, None, None +cfg = None def setup(): global env @@ -122,3 +125,18 @@ def test_invalid_relative_downgrade_path(): r"Relative revision \+2 didn't produce 2 migrations", env._downgrade_revs, "+2", b.revision ) + +def test_invalid_move_rev_to_none(): + assert_raises_message( + util.CommandError, + "Revision %s is not an ancestor of base" % b.revision, + env._downgrade_revs, b.revision[0:3], None + ) + +def test_invalid_move_higher_to_lower(): + assert_raises_message( + util.CommandError, + "Revision %s is not an ancestor of %s" % (c.revision, b.revision), + env._downgrade_revs, c.revision[0:4], b.revision + ) + diff --git a/tests/test_sql_script.py b/tests/test_sql_script.py index af9b1361..1d84cb7d 100644 --- a/tests/test_sql_script.py +++ b/tests/test_sql_script.py @@ -2,9 +2,12 @@ from __future__ import with_statement from tests import clear_staging_env, staging_env, \ _no_sql_testing_config, sqlite_db, eq_, ne_, capture_context_buffer, \ - three_rev_fixture + three_rev_fixture, assert_raises_message from alembic import command, util +cfg = None +a, b, c = None, None, None + def setup(): global cfg, env env = staging_env() @@ -66,7 +69,6 @@ def test_version_to_middle(): assert "DROP STEP 2" in buf.getvalue() assert "DROP STEP 1" not in buf.getvalue() - def test_stamp(): with capture_context_buffer() as buf: command.stamp(cfg, "head", sql=True)