diff --git a/django/core/management/commands/makemigrations.py b/django/core/management/commands/makemigrations.py index db011f9802..2153198751 100644 --- a/django/core/management/commands/makemigrations.py +++ b/django/core/management/commands/makemigrations.py @@ -172,7 +172,12 @@ class Command(BaseCommand): # Describe the migration writer = MigrationWriter(migration) if self.verbosity >= 1: - self.stdout.write(" %s:\n" % (self.style.MIGRATE_LABEL(writer.filename),)) + # Display a relative path if it's below the current working + # directory, or an absolute path otherwise. + migration_string = os.path.relpath(writer.path) + if migration_string.startswith('..'): + migration_string = writer.path + self.stdout.write(" %s:\n" % (self.style.MIGRATE_LABEL(migration_string),)) for operation in migration.operations: self.stdout.write(" - %s\n" % operation.describe()) if not self.dry_run: diff --git a/docs/intro/tutorial02.txt b/docs/intro/tutorial02.txt index 1e3c1accf7..f6272d479c 100644 --- a/docs/intro/tutorial02.txt +++ b/docs/intro/tutorial02.txt @@ -227,7 +227,7 @@ You should see something similar to the following: .. code-block:: text Migrations for 'polls': - 0001_initial.py: + polls/migrations/0001_initial.py: - Create model Choice - Create model Question - Add field question to choice diff --git a/docs/ref/contrib/gis/tutorial.txt b/docs/ref/contrib/gis/tutorial.txt index cc2df71ec1..89365442c0 100644 --- a/docs/ref/contrib/gis/tutorial.txt +++ b/docs/ref/contrib/gis/tutorial.txt @@ -239,7 +239,7 @@ create a database migration: $ python manage.py makemigrations Migrations for 'world': - 0001_initial.py: + world/migrations/0001_initial.py: - Create model WorldBorder Let's look at the SQL that will generate the table for the ``WorldBorder`` diff --git a/docs/releases/1.10.txt b/docs/releases/1.10.txt index 10a517f82d..64b92a26b6 100644 --- a/docs/releases/1.10.txt +++ b/docs/releases/1.10.txt @@ -199,6 +199,9 @@ Management Commands command exit with a non-zero status when model changes without migrations are detected. +* :djadmin:`makemigrations` now displays the path to the migration files that + it generates. + Migrations ^^^^^^^^^^ diff --git a/docs/topics/migrations.txt b/docs/topics/migrations.txt index 24491c6632..5312b956ba 100644 --- a/docs/topics/migrations.txt +++ b/docs/topics/migrations.txt @@ -115,7 +115,7 @@ a field and remove a model - and then run :djadmin:`makemigrations`:: $ python manage.py makemigrations Migrations for 'books': - 0003_auto.py: + books/migrations/0003_auto.py: - Alter field author on book Your models will be scanned and compared to the versions currently diff --git a/tests/migrations/test_commands.py b/tests/migrations/test_commands.py index a95d26b071..1ef749e0b3 100644 --- a/tests/migrations/test_commands.py +++ b/tests/migrations/test_commands.py @@ -1009,6 +1009,18 @@ class MakeMigrationsTests(MigrationTestBase): with self.temporary_migration_module(module="migrations.test_migrations_no_changes"): call_command("makemigrations", "--check", "migrations", verbosity=0) + def test_makemigrations_migration_path_output(self): + """ + makemigrations should print the relative paths to the migrations unless + they are outside of the current tree, in which case the absolute path + should be shown. + """ + out = six.StringIO() + apps.register_model('migrations', UnicodeModel) + with self.temporary_migration_module() as migration_dir: + call_command("makemigrations", "migrations", stdout=out) + self.assertIn(os.path.join(migration_dir, '0001_initial.py'), out.getvalue()) + class SquashMigrationsTests(MigrationTestBase): """