summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2018-03-24 08:26:36 +0100
committerGitHub <noreply@github.com>2018-03-24 08:26:36 +0100
commitec2f87afaded5f05ba57e450df626eb8b6541765 (patch)
treebe645443fc09daa7255d3c1d4b32869b2446f07e
parent0600f1d5f9606b9c8d7ed940b2c26fc81191e673 (diff)
parent742975466562fd7a76ddf1c16db53cfc510dbf0c (diff)
downloadimag-ec2f87afaded5f05ba57e450df626eb8b6541765.zip
imag-ec2f87afaded5f05ba57e450df626eb8b6541765.tar.gz
Merge pull request #1372 from matthiasbeyer/libimagrt/edit-stdin-devtty
libimagrt: Pass /dev/tty as stdin to editor
-rw-r--r--lib/core/libimagrt/src/error.rs1
-rw-r--r--lib/core/libimagrt/src/runtime.rs12
-rw-r--r--lib/entry/libimagentryedit/src/edit.rs25
3 files changed, 21 insertions, 17 deletions
diff --git a/lib/core/libimagrt/src/error.rs b/lib/core/libimagrt/src/error.rs
index cfba9a8..35331c6 100644
--- a/lib/core/libimagrt/src/error.rs
+++ b/lib/core/libimagrt/src/error.rs
@@ -23,6 +23,7 @@ error_chain! {
}
foreign_links {
+ IO(::std::io::Error);
TomlDeError(::toml::de::Error);
TomlQueryError(::toml_query::error::Error);
HandlebarsTemplateError(::handlebars::TemplateError);
diff --git a/lib/core/libimagrt/src/runtime.rs b/lib/core/libimagrt/src/runtime.rs
index 1e29f96..8cb4521 100644
--- a/lib/core/libimagrt/src/runtime.rs
+++ b/lib/core/libimagrt/src/runtime.rs
@@ -39,6 +39,7 @@ use io::OutputProxy;
use libimagerror::trace::*;
use libimagstore::store::Store;
use libimagstore::file_abstraction::InMemoryFileAbstraction;
+use libimagutil::debug_result::DebugResult;
use spec::CliSpec;
/// The Runtime object
@@ -454,7 +455,7 @@ impl<'a> Runtime<'a> {
}
/// Get a editor command object which can be called to open the $EDITOR
- pub fn editor(&self) -> Option<Command> {
+ pub fn editor(&self) -> Result<Option<Command>, RuntimeError> {
self.cli()
.value_of("editor")
.map(String::from)
@@ -466,18 +467,19 @@ impl<'a> Runtime<'a> {
})
})
.or(env::var("EDITOR").ok())
- .map(|s| {debug!("Editing with '{}'", s); s})
+ .ok_or_else(|| RuntimeErrorKind::IOError.into())
+ .map_dbg(|s| format!("Editing with '{}'", s))
.and_then(|s| {
let mut split = s.split(" ");
let command = split.next();
if command.is_none() {
- return None
+ return Ok(None)
}
let mut c = Command::new(command.unwrap()); // secured above
c.args(split);
- c.stdin(::std::process::Stdio::null());
+ c.stdin(::std::fs::File::open("/dev/tty")?);
c.stderr(::std::process::Stdio::inherit());
- Some(c)
+ Ok(Some(c))
})
}
diff --git a/lib/entry/libimagentryedit/src/edit.rs b/lib/entry/libimagentryedit/src/edit.rs
index 6802eaa..b2d4538 100644
--- a/lib/entry/libimagentryedit/src/edit.rs
+++ b/lib/entry/libimagentryedit/src/edit.rs
@@ -72,18 +72,19 @@ impl EditHeader for Entry {
pub fn edit_in_tmpfile(rt: &Runtime, s: &mut String) -> Result<()> {
use libimagutil::edit::edit_in_tmpfile_with_command;
- rt.editor()
- .ok_or(EE::from_kind(EditErrorKind::NoEditor))
- .and_then(|editor| {
- edit_in_tmpfile_with_command(editor, s)
- .chain_err(|| EditErrorKind::IOError)
- .and_then(|worked| {
- if !worked {
- Err(EditErrorKind::ProcessExitFailure.into())
- } else {
- Ok(())
- }
- })
+ let editor = rt
+ .editor()
+ .chain_err(|| EditErrorKind::NoEditor)?
+ .ok_or_else(|| EE::from_kind(EditErrorKind::NoEditor))?;
+
+ edit_in_tmpfile_with_command(editor, s)
+ .chain_err(|| EditErrorKind::IOError)
+ .and_then(|worked| {
+ if !worked {
+ Err(EditErrorKind::ProcessExitFailure.into())
+ } else {
+ Ok(())
+ }
})
}