feat: add output pipeline

This commit is contained in:
2026-08-23 05:54:38 +05:00
parent 27cf814c39
commit eeb5aa9e84
6 changed files with 173 additions and 93 deletions
+2 -62
View File
@@ -1,5 +1,6 @@
mod cli;
mod config;
mod deploy;
mod local;
mod ssh;
mod sync;
@@ -43,66 +44,5 @@ fn run(cli: &cli::Cli) -> Result<()> {
.get(name)
.with_context(|| format!("project '{name}' not found in {}", path.display()))?;
let target = match &project.user {
Some(user) => format!("{user}@{}:{}", project.host, project.port.unwrap_or(22)),
None => format!("{}:{}", project.host, project.port.unwrap_or(22)),
};
println!(
"deploying '{name}' to {target}: {} local cmd(s), {} sync rule(s), {} remote cmd(s)",
project.local.as_ref().map_or(0, |c| c.commands.len()),
project.sync.len(),
project.remote.as_ref().map_or(0, |c| c.commands.len()),
);
let local_cmds = project
.local
.as_ref()
.map_or([].as_slice(), |c| c.commands.as_slice());
let remote_cmds = project
.remote
.as_ref()
.map_or([].as_slice(), |c| c.commands.as_slice());
if cli.dry_run {
println!("dry-run plan:");
for cmd in local_cmds {
println!(" local : {cmd}");
}
for rule in &project.sync {
println!(
" sync : {} -> {}",
rule.source.display(),
rule.target.display()
);
}
for cmd in remote_cmds {
println!(" remote: {cmd}");
}
} else {
local::run_commands(local_cmds, &project.workdir)?;
println!("[Local] done: {} cmd(s) succeeded", local_cmds.len());
let needs_session = !project.sync.is_empty() || !remote_cmds.is_empty();
let mut session = None;
if needs_session {
let target = ssh::Target {
host_alias: project.host.clone(),
user: project.user.clone(),
port: project.port,
key_path: project.key_path.clone(),
};
let resolved = ssh::resolve(&target)?;
session = Some(ssh::connect(&resolved)?);
}
if let Some(session) = session.as_mut() {
for rule in &project.sync {
sync::upload(session, &rule.source, &rule.target.to_string_lossy())?;
}
for cmd in remote_cmds {
session.exec(cmd)?;
}
println!("[Remote] done: {} cmd(s) succeeded", remote_cmds.len());
}
}
Ok(())
deploy::deploy(name, project, cli.dry_run)
}