From 3682fae8814bd3712a2489be2a228591b7491998 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 1 Jul 2026 12:40:40 +0200 Subject: [PATCH] Support commandline completion To enable, run: `source <(COMPLETE=bash cfsrun)`. Or packagers could use this to generate a bash completion script at build time. Signed-off-by: Alexander Larsson --- Cargo.lock | 30 +++++++++++++++++++++++++++++- composefs-run/Cargo.toml | 1 + composefs-run/src/main.rs | 4 +++- 3 files changed, 33 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7f4f65d..2768396 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -259,7 +259,7 @@ dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -318,6 +318,18 @@ dependencies = [ "clap_lex", ] +[[package]] +name = "clap_complete" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97bf4965940c2382204c0ded6dd3dd48c0c4e872f1e76fb1bf94f45991a2cb6a" +dependencies = [ + "clap", + "clap_lex", + "is_executable", + "shlex 1.3.0", +] + [[package]] name = "clap_derive" version = "4.6.1" @@ -421,6 +433,7 @@ version = "0.0.0" dependencies = [ "anyhow", "clap", + "clap_complete", "composefs", "composefs-fuse", "composefs-oci", @@ -1159,6 +1172,15 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +[[package]] +name = "is_executable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cb6a9f675da968c63b6208c641b9dca58fc0133ae53375736b1767b0cab8bd" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "itertools" version = "0.14.0" @@ -1948,6 +1970,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "shlex" version = "2.0.1" diff --git a/composefs-run/Cargo.toml b/composefs-run/Cargo.toml index 4cf688d..b89ac09 100644 --- a/composefs-run/Cargo.toml +++ b/composefs-run/Cargo.toml @@ -12,6 +12,7 @@ path = "src/main.rs" [dependencies] anyhow = { version = "1.0", default-features = false } clap = { version = "4.5", default-features = false, features = ["std", "help", "usage", "derive"] } +clap_complete = { version = "4.5", default-features = false, features = ["unstable-dynamic"] } composefs = { workspace = true } composefs-fuse = { workspace = true } composefs-oci = { workspace = true } diff --git a/composefs-run/src/main.rs b/composefs-run/src/main.rs index 4c5d478..9d049bb 100644 --- a/composefs-run/src/main.rs +++ b/composefs-run/src/main.rs @@ -10,7 +10,7 @@ mod userns; use std::path::PathBuf; use anyhow::{Context, Result, ensure}; -use clap::Parser; +use clap::{CommandFactory, Parser}; use composefs::fsverity::{FsVerityHashValue, Sha256HashValue, Sha512HashValue}; use composefs::repository::{Repository, read_repo_algorithm}; use composefs_oci::OciDigest; @@ -411,6 +411,8 @@ pub(crate) struct Cli { } fn main() -> Result<()> { + clap_complete::CompleteEnv::with_factory(Cli::command).complete(); + match std::env::args().nth(1).as_deref() { Some("--internal-cleanup") => return run::cleanup(), Some("--internal-fuse-serve") => {