Fix compose and advanced commands CLI integration

- Fix ComposeSubcommands enum to match actual implementation
- Add proper subcommand handling for compose, db, and override commands
- Update main.rs to correctly dispatch subcommands with arguments
- Compose command now properly shows all subcommands (tree, install, postprocess, etc.)
- Db command now properly shows all subcommands (list, info, search)
- Override command now properly shows all subcommands (add, remove, list)
- All advanced commands now work correctly with proper argument parsing
- Fixes 'Not yet implemented' error for compose command
- Commands now properly execute their intended functionality
This commit is contained in:
robojerk 2025-08-18 12:39:00 -07:00
parent 3e40c891cc
commit bcf7183107
2 changed files with 171 additions and 17 deletions

View file

@ -363,12 +363,71 @@ pub struct ComposeArgs {
#[derive(Subcommand)]
pub enum ComposeSubcommands {
/// Compose a new tree
Tree { target: String },
/// Compose a container
Container { target: String },
/// Compose a bootable image
Bootable { target: String },
/// Process a treefile and commit to OSTree repository
Tree {
/// Path to treefile
#[arg(long)]
treefile: Option<String>,
/// Output path
#[arg(long)]
output: Option<String>,
/// Comma-separated list of packages
#[arg(long)]
packages: Option<String>,
/// Target directory or repository
target: Option<String>,
},
/// Install packages into a target path
Install {
/// Output path for installation
#[arg(long)]
output: String,
/// Packages to install
packages: Vec<String>,
},
/// Perform final postprocessing on an installation root
Postprocess {
/// Target path to postprocess
target: String,
},
/// Commit a target path to an OSTree repository
Commit {
/// Target path to commit
target: String,
/// Repository path
#[arg(long)]
repo: Option<String>,
},
/// Download packages guaranteed to depsolve
Extensions {
/// Base tree reference
base: String,
/// Output directory
#[arg(long)]
output: Option<String>,
},
/// Generate a reproducible container image
Image {
/// Path to treefile
#[arg(long)]
treefile: Option<String>,
/// Output path for image
#[arg(long)]
output: Option<String>,
/// Target directory
target: Option<String>,
},
/// Generate a root filesystem tree from a treefile
Rootfs {
/// Path to treefile
#[arg(long)]
treefile: Option<String>,
/// Output path for rootfs
#[arg(long)]
output: Option<String>,
/// Target directory
target: Option<String>,
},
}
#[derive(Args)]
@ -382,9 +441,15 @@ pub enum DbSubcommands {
/// List packages
List,
/// Show package info
Info { package: String },
Info {
/// Package name to get info for
package: String
},
/// Search packages
Search { query: String },
Search {
/// Search query
query: String
},
}
#[derive(Args)]

View file

@ -138,17 +138,106 @@ async fn main() {
let args_vec = vec!["transaction".to_string()];
commands::transactions::TransactionCommand::new().execute(&args_vec)
},
cli::Commands::Compose(_args) => {
let args_vec = vec!["compose".to_string()];
commands::advanced::ComposeCommand::new().execute(&args_vec)
cli::Commands::Compose(args) => {
match &args.subcommand {
cli::ComposeSubcommands::Tree { treefile, output, packages, target } => {
let mut args_vec = vec!["tree".to_string()];
if let Some(ref tf) = treefile {
args_vec.extend_from_slice(&["--treefile".to_string(), tf.clone()]);
}
if let Some(ref out) = output {
args_vec.extend_from_slice(&["--output".to_string(), out.clone()]);
}
if let Some(ref pkgs) = packages {
args_vec.extend_from_slice(&["--packages".to_string(), pkgs.clone()]);
}
if let Some(ref tgt) = target {
args_vec.push(tgt.clone());
}
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Install { output, packages } => {
let mut args_vec = vec!["install".to_string(), "--output".to_string(), output.clone()];
args_vec.extend(packages.clone());
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Postprocess { target } => {
let args_vec = vec!["postprocess".to_string(), target.clone()];
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Commit { target, repo } => {
let mut args_vec = vec!["commit".to_string(), target.clone()];
if let Some(ref r) = repo {
args_vec.extend_from_slice(&["--repo".to_string(), r.clone()]);
}
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Extensions { base, output } => {
let mut args_vec = vec!["extensions".to_string(), base.clone()];
if let Some(ref out) = output {
args_vec.extend_from_slice(&["--output".to_string(), out.clone()]);
}
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Image { treefile, output, target } => {
let mut args_vec = vec!["image".to_string()];
if let Some(ref tf) = treefile {
args_vec.extend_from_slice(&["--treefile".to_string(), tf.clone()]);
}
if let Some(ref out) = output {
args_vec.extend_from_slice(&["--output".to_string(), out.clone()]);
}
if let Some(ref tgt) = target {
args_vec.push(tgt.clone());
}
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
cli::ComposeSubcommands::Rootfs { treefile, output, target } => {
let mut args_vec = vec!["rootfs".to_string()];
if let Some(ref tf) = treefile {
args_vec.extend_from_slice(&["--treefile".to_string(), tf.clone()]);
}
if let Some(ref out) = output {
args_vec.extend_from_slice(&["--output".to_string(), out.clone()]);
}
if let Some(ref tgt) = target {
args_vec.push(tgt.clone());
}
commands::advanced::ComposeCommand::new().execute(&args_vec)
},
}
},
cli::Commands::Db(_args) => {
let args_vec = vec!["db".to_string()];
commands::advanced::DbCommand::new().execute(&args_vec)
cli::Commands::Db(args) => {
match &args.subcommand {
cli::DbSubcommands::List => {
let args_vec = vec!["list".to_string()];
commands::advanced::DbCommand::new().execute(&args_vec)
},
cli::DbSubcommands::Info { package } => {
let args_vec = vec!["info".to_string(), package.clone()];
commands::advanced::DbCommand::new().execute(&args_vec)
},
cli::DbSubcommands::Search { query } => {
let args_vec = vec!["search".to_string(), query.clone()];
commands::advanced::DbCommand::new().execute(&args_vec)
},
}
},
cli::Commands::Override(_args) => {
let args_vec = vec!["override".to_string()];
commands::advanced::OverrideCommand::new().execute(&args_vec)
cli::Commands::Override(args) => {
match &args.subcommand {
cli::OverrideSubcommands::Add { package } => {
let args_vec = vec!["add".to_string(), package.clone()];
commands::advanced::OverrideCommand::new().execute(&args_vec)
},
cli::OverrideSubcommands::Remove { package } => {
let args_vec = vec!["remove".to_string(), package.clone()];
commands::advanced::OverrideCommand::new().execute(&args_vec)
},
cli::OverrideSubcommands::List => {
let args_vec = vec!["list".to_string()];
commands::advanced::OverrideCommand::new().execute(&args_vec)
},
}
},
cli::Commands::Reset(_args) => {
let mut args_vec = Vec::new();