defmodule Mix.Tasks.Dripdrop.Gen.Migration do
@moduledoc """
Generates a host migration that applies pending DripDrop schema upgrades.
Migration files are vendored under `priv/dripdrop/sql/versions/`. The
generated host migration calls `DripDrop.Migration.up/0`, which applies any
vendored SQL versions newer than the database's recorded
`dripdrop.dripdrop_version`.
"""
@shortdoc "Generates an Ecto wrapper migration for DripDrop upgrades"
use Mix.Task
alias DripDrop.MixHelpers
@impl Mix.Task
def run(args) do
{opts, _args, _invalid} = OptionParser.parse(args, switches: [repo: :string])
repo = MixHelpers.resolve_repo(opts[:repo])
migrations_dir = MixHelpers.migrations_dir(repo)
File.mkdir_p!(migrations_dir)
path = Path.join(migrations_dir, "#{MixHelpers.timestamp()}_upgrade_dripdrop.exs")
File.write!(path, migration_content(repo))
Mix.shell().info("Created migration: #{path}")
end
defp migration_content(repo) do
"""
defmodule #{inspect(repo)}.Migrations.UpgradeDripdrop do
@moduledoc \"\"\"
Applies pending DripDrop library migrations.
Generated by: `mix dripdrop.gen.migration`
DripDrop migrations are vendored as versioned SQL under
`priv/dripdrop/sql/versions`. `DripDrop.Migration.up/0` applies any
version newer than the database's current `dripdrop.dripdrop_version`.
\"\"\"
use Ecto.Migration
def up do
DripDrop.Migration.up()
end
def down do
DripDrop.Migration.down()
end
end
"""
end
end