Archived
1
0
Fork 0
This repository has been archived on 2024-07-25. You can view files and clone it, but cannot push or open issues or pull requests.
migra/migra-cli/src/opts.rs
Dmitriy Pleshevskiy f98dd4f0c8 feat: single transaction
I added a single transaction option for apply, upgrade, and
downgrade commands, which wraps all migrations into a single
transaction. This gives you the ability to safely roll up
migrations and, if some unforeseen situation occurs, roll them back.

Unfortunately if there is an error in syntax, mysql will not
rollback the migration and commits automatically :( I will
research this issue.

Closes #2
2021-04-24 01:58:19 +03:00

106 lines
2.7 KiB
Rust

use std::path::PathBuf;
use structopt::clap;
pub use structopt::StructOpt;
#[derive(Debug, StructOpt, Clone)]
#[structopt(bin_name = "migra", name = "Migra")]
pub(crate) struct AppOpt {
#[structopt(name = "config", short, long)]
pub config_path: Option<PathBuf>,
#[structopt(subcommand)]
pub command: Command,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) enum Command {
Init,
Apply(ApplyCommandOpt),
Make(MakeCommandOpt),
#[structopt(name = "list", visible_alias = "ls")]
List,
#[structopt(name = "upgrade", visible_alias = "up")]
Upgrade(UpgradeCommandOpt),
#[structopt(name = "downgrade", visible_alias = "down")]
Downgrade(DowngradeCommandOpt),
Completions(CompletionsShell),
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) struct TransactionOpts {
#[structopt(long = "single-transaction")]
pub single_transaction: bool,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) struct ApplyCommandOpt {
#[structopt(parse(from_os_str), required = true)]
pub file_paths: Vec<PathBuf>,
#[structopt(flatten)]
pub transaction_opts: TransactionOpts,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) struct MakeCommandOpt {
/// Name of the migration to create in specify directory.
#[structopt(parse(from_str))]
pub migration_name: String,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) struct UpgradeCommandOpt {
/// Name of the existing migration that will update the schema
/// in the database.
#[structopt(long = "name")]
pub migration_name: Option<String>,
/// How many existing migrations do we have to update.
#[structopt(long = "number", short = "n")]
pub migrations_number: Option<usize>,
#[structopt(flatten)]
pub transaction_opts: TransactionOpts,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) struct DowngradeCommandOpt {
/// How many applied migrations do we have to rollback.
#[structopt(long = "number", short = "n", default_value = "1")]
pub migrations_number: usize,
/// Rolls back all applied migrations. Ignores --number option.
#[structopt(long = "all")]
pub all_migrations: bool,
#[structopt(flatten)]
pub transaction_opts: TransactionOpts,
}
#[derive(Debug, StructOpt, Clone)]
pub(crate) enum CompletionsShell {
Bash,
Fish,
Zsh,
PowerShell,
Elvish,
}
impl From<CompletionsShell> for clap::Shell {
fn from(shell: CompletionsShell) -> Self {
match shell {
CompletionsShell::Bash => Self::Bash,
CompletionsShell::Fish => Self::Fish,
CompletionsShell::Zsh => Self::Zsh,
CompletionsShell::PowerShell => Self::PowerShell,
CompletionsShell::Elvish => Self::Elvish,
}
}
}