diff --git a/Justfile b/Justfile index 00261b0..3ded805 100644 --- a/Justfile +++ b/Justfile @@ -34,20 +34,33 @@ test: format: mix format - -regen-migrations migration_name: - #!/bin/bash +# Usage: +# just regen-migrations migration_name [commit_hash] +# If commit_hash is given, rollback & delete the migrations from that commit. +# Otherwise, rollback & delete all untracked migrations. +regen-migrations migration_name commit_hash='': + #!/usr/bin/env bash set -euo pipefail - # Get count of untracked migrations - N_MIGRATIONS=$(git ls-files --others priv/repo/migrations | wc -l) - # Rollback untracked migrations - mix ash_postgres.rollback -n $N_MIGRATIONS - # Delete untracked migrations and snapshots - git ls-files --others priv/repo/migrations | xargs rm - git ls-files --others priv/resource_snapshots | xargs rm - # Regenerate migrations - mix ash.codegen --name {{migration_name}} - # Run migrations if flag - if echo $* | grep -e "-m" -q; then - mix ash.migrate + # Pick migrations either from the given commit or untracked files + if [ -n "{{commit_hash}}" ]; then + echo "→ Rolling back migrations from commit {{commit_hash}}" + MIG_FILES=$(git show --name-only --pretty=format: "{{commit_hash}}" \ + | grep -E "^priv/repo/migrations/|^priv/resource_snapshots") + else + echo "→ Rolling back all untracked migrations" + MIG_FILES=$(git ls-files --others priv/repo/migrations) fi + + # Roll back in Ash + COUNT=$(echo "$MIG_FILES" | wc -l) + mix ash_postgres.rollback -n "$COUNT" + + # Remove the migration files + echo removing $MIG_FILES + echo "$MIG_FILES" | xargs rm -f + + # Also clean up any untracked resource snapshots + git ls-files --others priv/resource_snapshots | xargs rm -f + + # Generate a fresh migration + mix ash.codegen --name "{{migration_name}}"