From 3fbfb1941919cc50b5b9fe39e37088fde2cf7b5b Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 5 Feb 2019 00:55:30 +0100 Subject: [PATCH 1/3] Add runtime feature: Ignore id reporting This feature gives the users of the Runtime API the possibility to check whether the user wants the ID reporting to be ignored as well (and more important) to override the default behaviour where the runtime assumes that if STDOUT is a pipe, it is a pipe to an imag command. Before, this would not have been possible: imag contact find Jonas --json | jq 'map(.fullname)' because the runtime automatically prints the output of the command to stderr and the touched IDs to stdout. But now with this change, a user can override this default behaviour and do: imag contact --ignore-ids find Jonas --json | jq 'map(.fullname)' Signed-off-by: Matthias Beyer --- lib/core/libimagrt/src/runtime.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/lib/core/libimagrt/src/runtime.rs b/lib/core/libimagrt/src/runtime.rs index 47346693..1fa0429f 100644 --- a/lib/core/libimagrt/src/runtime.rs +++ b/lib/core/libimagrt/src/runtime.rs @@ -62,6 +62,8 @@ pub struct Runtime<'a> { has_output_pipe: bool, has_input_pipe: bool, + + ignore_ids: bool } impl<'a> Runtime<'a> { @@ -146,9 +148,11 @@ impl<'a> Runtime<'a> { let has_output_pipe = !atty::is(atty::Stream::Stdout); let has_input_pipe = !atty::is(atty::Stream::Stdin); + let ignore_ids = matches.is_present(Runtime::arg_ignore_ids_name()); debug!("has output pipe = {}", has_output_pipe); debug!("has input pipe = {}", has_input_pipe); + debug!("ignore ids = {}", ignore_ids); store_result.map(|store| Runtime { cli_matches: matches, @@ -158,6 +162,7 @@ impl<'a> Runtime<'a> { has_output_pipe, has_input_pipe, + ignore_ids, }) .context(err_msg("Cannot instantiate runtime")) .map_err(Error::from) @@ -247,6 +252,13 @@ impl<'a> Runtime<'a> { .takes_value(true) .value_name("LOGDESTS")) + .arg(Arg::with_name(Runtime::arg_ignore_ids_name()) + .long(Runtime::arg_ignore_ids_name()) + .help("Do not assume that the output is a pipe to another imag command. This overrides the default behaviour where imag only prints the IDs of the touched entries to stdout if stdout is a pipe.") + .long_help("Without this flag, imag assumes that if stdout is a pipe, the command imag pipes to is also an imag command. Thus, it prints the IDs of the processed entries to stdout and automatically redirects the command output to stderr. By providing this flag, this behaviour gets overridden: The IDs are not printed at all and the normal output is printed to stdout.") + .required(false) + .takes_value(false)) + } /// Get the argument names of the Runtime which are available @@ -260,9 +272,15 @@ impl<'a> Runtime<'a> { Runtime::arg_runtimepath_name(), Runtime::arg_storepath_name(), Runtime::arg_editor_name(), + Runtime::arg_ignore_ids_name(), ] } + /// Get the normal-output argument name for the Runtime + pub fn arg_ignore_ids_name() -> &'static str { + "ignore-ids" + } + /// Get the verbosity argument name for the Runtime pub fn arg_verbosity_name() -> &'static str { "verbosity" @@ -461,8 +479,15 @@ impl<'a> Runtime<'a> { self.has_output_pipe } + /// Check whether the runtime ignores touched ids + /// + /// "Ignoring" in this context means whether the runtime prints them or not. + pub fn ignore_ids(&self) -> bool { + self.ignore_ids + } + pub fn stdout(&self) -> OutputProxy { - if self.output_is_pipe() { + if self.output_is_pipe() && !self.ignore_ids { OutputProxy::Err(::std::io::stderr()) } else { OutputProxy::Out(::std::io::stdout()) @@ -585,7 +610,7 @@ impl<'a> Runtime<'a> { fn report_touched_id(&self, id: &StoreId, output: &mut StdoutLock) -> Result<()> { use std::io::Write; - if self.output_is_pipe() { + if self.output_is_pipe() && !self.ignore_ids { trace!("Reporting: {} to {:?}", id, output); writeln!(output, "{}", id)?; } From 4c0baa58f40235a41ccd5b73018286ccc00ab5b9 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 5 Feb 2019 00:59:30 +0100 Subject: [PATCH 2/3] Add argument forwarding for --ignore-ids Signed-off-by: Matthias Beyer --- bin/core/imag/src/main.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/core/imag/src/main.rs b/bin/core/imag/src/main.rs index e1997e95..23b80785 100644 --- a/bin/core/imag/src/main.rs +++ b/bin/core/imag/src/main.rs @@ -419,6 +419,9 @@ fn forward_commandline_arguments(m: &ArgMatches, scmd: &mut Vec) { push(Some("editor"), Runtime::arg_editor_name(), m , scmd); + push(Some("ignore-ids"), + Runtime::arg_ignore_ids_name(), m , scmd); + push(None , Runtime::arg_logdest_name() , m , scmd); } From e4ef6f064937d18cb841525e6f54f67de028bf7d Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Tue, 5 Feb 2019 01:03:39 +0100 Subject: [PATCH 3/3] Remove log-destination-override features This removes the feature to be able to override log destinations from the commandline. This feature is removed because the --override-config feature from the runtime already contains this functionality. It is a little more complex to use, though this is a feature hardly used at all, so I rather go for less code (less complexity) here than feature bloat. Signed-off-by: Matthias Beyer --- bin/core/imag/src/main.rs | 3 --- lib/core/libimagrt/src/logger.rs | 17 +---------------- lib/core/libimagrt/src/runtime.rs | 12 ------------ 3 files changed, 1 insertion(+), 31 deletions(-) diff --git a/bin/core/imag/src/main.rs b/bin/core/imag/src/main.rs index 23b80785..f866794c 100644 --- a/bin/core/imag/src/main.rs +++ b/bin/core/imag/src/main.rs @@ -421,8 +421,5 @@ fn forward_commandline_arguments(m: &ArgMatches, scmd: &mut Vec) { push(Some("ignore-ids"), Runtime::arg_ignore_ids_name(), m , scmd); - - push(None , Runtime::arg_logdest_name() , m , scmd); - } diff --git a/lib/core/libimagrt/src/logger.rs b/lib/core/libimagrt/src/logger.rs index 2b71d577..cf4f975e 100644 --- a/lib/core/libimagrt/src/logger.rs +++ b/lib/core/libimagrt/src/logger.rs @@ -280,8 +280,8 @@ fn translate_destinations(raw: &Vec) -> Result> { fn aggregate_global_destinations(matches: &ArgMatches, config: Option<&Value>) -> Result> { - match config { + None => Ok(vec![LogDestination::default()]), Some(cfg) => cfg .read("imag.logging.destinations") .map_err(Error::from) @@ -293,21 +293,6 @@ fn aggregate_global_destinations(matches: &ArgMatches, config: Option<&Value>) Error::from(err_msg(msg)) }) .and_then(translate_destinations), - None => { - if let Some(values) = matches.value_of(Runtime::arg_logdest_name()) { - // parse logdest specification from commandline - - values.split(",") - .fold(Ok(vec![]), move |acc, dest| { - acc.and_then(|mut v| { - v.push(translate_destination(dest)?); - Ok(v) - }) - }) - } else { - Ok(vec![ LogDestination::default() ]) - } - } } } diff --git a/lib/core/libimagrt/src/runtime.rs b/lib/core/libimagrt/src/runtime.rs index 1fa0429f..5fb367dc 100644 --- a/lib/core/libimagrt/src/runtime.rs +++ b/lib/core/libimagrt/src/runtime.rs @@ -245,13 +245,6 @@ impl<'a> Runtime<'a> { .required(false) .takes_value(true)) - .arg(Arg::with_name(Runtime::arg_logdest_name()) - .long(Runtime::arg_logdest_name()) - .help("Override the logging destinations from the configuration: values can be seperated by ',', a value of '-' marks the stderr output, everything else is expected to be a path") - .required(false) - .takes_value(true) - .value_name("LOGDESTS")) - .arg(Arg::with_name(Runtime::arg_ignore_ids_name()) .long(Runtime::arg_ignore_ids_name()) .help("Do not assume that the output is a pipe to another imag command. This overrides the default behaviour where imag only prints the IDs of the touched entries to stdout if stdout is a pipe.") @@ -344,11 +337,6 @@ impl<'a> Runtime<'a> { self } - /// Get the argument name for the logging destination - pub fn arg_logdest_name() -> &'static str { - "logging-destinations" - } - #[cfg(feature = "pub_logging_initialization")] pub fn init_logger(matches: &ArgMatches, config: Option<&Value>) { Self::_init_logger(matches, config)