diff --git a/bin/core/imag-tag/src/main.rs b/bin/core/imag-tag/src/main.rs index d291af69..f07b8b25 100644 --- a/bin/core/imag-tag/src/main.rs +++ b/bin/core/imag-tag/src/main.rs @@ -57,6 +57,7 @@ extern crate env_logger; use std::path::PathBuf; use std::io::Write; +use std::io::Read; use libimagrt::runtime::Runtime; use libimagrt::setup::generate_runtime_setup; @@ -82,19 +83,45 @@ fn main() { "Direct interface to the store. Use with great care!", build_ui); - let id = rt.cli().value_of("id").map(PathBuf::from).unwrap(); // enforced by clap + let ids : Vec = rt + .cli() + .values_of("id") + .map(|vals| { + vals.map(PathBuf::from).collect() + }).unwrap_or_else(|| { + if !rt.cli().is_present("ids-from-stdin") { + error!("No ids"); + ::std::process::exit(1) + } + + let stdin = rt.stdin().unwrap_or_else(|| { + error!("Cannot get handle to stdin"); + ::std::process::exit(1) + }); + + let mut buf = String::new(); + let _ = stdin.lock().read_to_string(&mut buf).unwrap_or_else(|_| { + error!("Failed to read from stdin"); + ::std::process::exit(1) + }); + + buf.lines().map(PathBuf::from).collect() + }); + rt.cli() .subcommand_name() .map(|name| match name { - "list" => list(id, &rt), - "remove" => { + "list" => for id in ids { + list(id, &rt) + }, + "remove" => for id in ids { let id = PathBuf::from(id); let add = None; let rem = get_remove_tags(rt.cli()); debug!("id = {:?}, add = {:?}, rem = {:?}", id, add, rem); alter(&rt, id, add, rem); }, - "add" => { + "add" => for id in ids { let id = PathBuf::from(id); let add = get_add_tags(rt.cli()); let rem = None; diff --git a/bin/core/imag-tag/src/ui.rs b/bin/core/imag-tag/src/ui.rs index 48c1bd11..ec1a565f 100644 --- a/bin/core/imag-tag/src/ui.rs +++ b/bin/core/imag-tag/src/ui.rs @@ -25,11 +25,19 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { app.arg(Arg::with_name("id") .index(1) .takes_value(true) - .required(true) - .multiple(false) + .required(false) + .multiple(true) .value_name("ID") .help("Entry to use")) + .arg(Arg::with_name("ids-from-stdin") + .long("ids-from-stdin") + .short("I") + .takes_value(false) + .required(false) + .multiple(false) + .help("Read store ids to tag from stdin")) + .subcommand(SubCommand::with_name("add") .about("Add tags") .version("0.1")