Merge pull request #1020 from matthiasbeyer/rewrite-imag-bin
Rewrite imag binary without parallelization stuff
This commit is contained in:
commit
4475e09457
2 changed files with 54 additions and 72 deletions
|
@ -23,7 +23,6 @@ libimagutil = { path = "../libimagutil" }
|
||||||
[dependencies]
|
[dependencies]
|
||||||
version = "2.0"
|
version = "2.0"
|
||||||
walkdir = "0.1"
|
walkdir = "0.1"
|
||||||
crossbeam = "0.2"
|
|
||||||
clap = "2.*"
|
clap = "2.*"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
|
|
||||||
|
|
123
bin/src/main.rs
123
bin/src/main.rs
|
@ -17,7 +17,6 @@
|
||||||
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
//
|
//
|
||||||
|
|
||||||
extern crate crossbeam;
|
|
||||||
extern crate clap;
|
extern crate clap;
|
||||||
#[macro_use] extern crate version;
|
#[macro_use] extern crate version;
|
||||||
#[macro_use] extern crate log;
|
#[macro_use] extern crate log;
|
||||||
|
@ -33,7 +32,6 @@ use std::process::Stdio;
|
||||||
use std::io::ErrorKind;
|
use std::io::ErrorKind;
|
||||||
|
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
use crossbeam::*;
|
|
||||||
use clap::{Arg, AppSettings, SubCommand};
|
use clap::{Arg, AppSettings, SubCommand};
|
||||||
|
|
||||||
use libimagrt::runtime::Runtime;
|
use libimagrt::runtime::Runtime;
|
||||||
|
@ -42,7 +40,7 @@ use libimagerror::trace::trace_error;
|
||||||
/// Returns the helptext, putting the Strings in cmds as possible
|
/// Returns the helptext, putting the Strings in cmds as possible
|
||||||
/// subcommands into it
|
/// subcommands into it
|
||||||
fn help_text(cmds: Vec<String>) -> String {
|
fn help_text(cmds: Vec<String>) -> String {
|
||||||
let text = format!(r#"
|
format!(r#"
|
||||||
|
|
||||||
_
|
_
|
||||||
(_)_ __ ___ __ _ __ _
|
(_)_ __ ___ __ _ __ _
|
||||||
|
@ -72,59 +70,43 @@ fn help_text(cmds: Vec<String>) -> String {
|
||||||
|
|
||||||
imag is free software. It is released under the terms of LGPLv2.1
|
imag is free software. It is released under the terms of LGPLv2.1
|
||||||
|
|
||||||
(c) 2016 Matthias Beyer and contributors"#, imagbins = cmds.into_iter()
|
(c) 2016 Matthias Beyer and contributors"#,
|
||||||
.map(|cmd| format!("\t{}\n", cmd))
|
imagbins = cmds
|
||||||
.fold(String::new(), |s, c| {
|
.into_iter()
|
||||||
let s = s + c.as_str();
|
.map(|cmd| format!("\t{}\n", cmd))
|
||||||
s
|
.fold(String::new(), |s, c| {
|
||||||
}));
|
let s = s + c.as_str();
|
||||||
text
|
s
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the list of imag-* executables found in $PATH
|
/// Returns the list of imag-* executables found in $PATH
|
||||||
fn get_commands() -> Vec<String> {
|
fn get_commands() -> Vec<String> {
|
||||||
let path = env::var("PATH");
|
match env::var("PATH") {
|
||||||
if path.is_err() {
|
Err(e) => {
|
||||||
println!("PATH error: {:?}", path);
|
println!("PATH error: {:?}", e);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
},
|
||||||
let pathelements = path.unwrap();
|
|
||||||
let pathelements = pathelements.split(":");
|
|
||||||
|
|
||||||
let joinhandles : Vec<ScopedJoinHandle<Vec<String>>> = pathelements
|
Ok(path) => path
|
||||||
.map(|elem| {
|
.split(":")
|
||||||
crossbeam::scope(|scope| {
|
.flat_map(|elem| {
|
||||||
scope.spawn(|| {
|
WalkDir::new(elem)
|
||||||
WalkDir::new(elem)
|
.max_depth(1)
|
||||||
.max_depth(1)
|
.into_iter()
|
||||||
.into_iter()
|
.filter(|path| match *path {
|
||||||
.filter(|path| {
|
Ok(ref p) => p.file_name().to_str().map_or(false, |f| f.starts_with("imag-")),
|
||||||
match path {
|
Err(_) => false,
|
||||||
&Ok(ref p) => p.file_name()
|
})
|
||||||
.to_str()
|
.filter_map(Result::ok)
|
||||||
.map_or(false, |filename| filename.starts_with("imag-")),
|
.filter_map(|path| path
|
||||||
&Err(_) => false,
|
.file_name()
|
||||||
}
|
.to_str()
|
||||||
})
|
.and_then(|s| s.splitn(2, "-").nth(1).map(String::from))
|
||||||
.filter_map(|x| x.ok())
|
)
|
||||||
.filter_map(|path| {
|
|
||||||
path.file_name()
|
|
||||||
.to_str()
|
|
||||||
.and_then(|s| s.splitn(2, "-").nth(1).map(String::from))
|
|
||||||
})
|
|
||||||
.collect()
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
})
|
.collect()
|
||||||
.collect();
|
|
||||||
|
|
||||||
let mut execs = vec![];
|
|
||||||
for joinhandle in joinhandles.into_iter() {
|
|
||||||
let mut v = joinhandle.join();
|
|
||||||
execs.append(&mut v);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
execs
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -171,26 +153,27 @@ fn main() {
|
||||||
|
|
||||||
if matches.is_present("versions") {
|
if matches.is_present("versions") {
|
||||||
debug!("Showing versions");
|
debug!("Showing versions");
|
||||||
let mut result = vec![];
|
commands
|
||||||
for command in commands.iter() {
|
.iter()
|
||||||
result.push(crossbeam::scope(|scope| {
|
.map(|command| {
|
||||||
scope.spawn(|| {
|
match Command::new(format!("imag-{}", command))
|
||||||
let v = Command::new(format!("imag-{}",command)).arg("--version").output();
|
.arg("--version")
|
||||||
match v {
|
.output()
|
||||||
Ok(v) => match String::from_utf8(v.stdout) {
|
.map(|v| v.stdout)
|
||||||
Ok(s) => format!("{:10} -> {}", command, s),
|
{
|
||||||
Err(e) => format!("Failed calling {} -> {:?}", command, e),
|
Ok(s) => match String::from_utf8(s) {
|
||||||
},
|
Ok(s) => format!("{:10} -> {}", command, s),
|
||||||
Err(e) => format!("Failed calling {} -> {:?}", command, e),
|
Err(e) => format!("UTF8 Error while working with output of imag{}: {:?}", command, e),
|
||||||
}
|
},
|
||||||
})
|
Err(e) => format!("Failed calling imag-{} -> {:?}", command, e),
|
||||||
}))
|
}
|
||||||
}
|
})
|
||||||
|
.fold((), |_, line| {
|
||||||
|
// The amount of newlines may differ depending on the subprocess
|
||||||
|
println!("{}", line.trim());
|
||||||
|
});
|
||||||
|
|
||||||
for versionstring in result.into_iter().map(|handle| handle.join()) {
|
exit(0);
|
||||||
// The amount of newlines may differ depending on the subprocess
|
|
||||||
println!("{}", versionstring.trim());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Matches any subcommand given
|
// Matches any subcommand given
|
||||||
|
@ -213,7 +196,7 @@ fn main() {
|
||||||
.stderr(Stdio::inherit())
|
.stderr(Stdio::inherit())
|
||||||
.args(&subcommand_args[..])
|
.args(&subcommand_args[..])
|
||||||
.spawn()
|
.spawn()
|
||||||
.and_then(|mut handle| handle.wait())
|
.and_then(|mut c| c.wait())
|
||||||
{
|
{
|
||||||
Ok(exit_status) => {
|
Ok(exit_status) => {
|
||||||
if !exit_status.success() {
|
if !exit_status.success() {
|
||||||
|
@ -230,7 +213,7 @@ fn main() {
|
||||||
ErrorKind::NotFound => {
|
ErrorKind::NotFound => {
|
||||||
println!("No such command: 'imag-{}'", subcommand);
|
println!("No such command: 'imag-{}'", subcommand);
|
||||||
println!("See 'imag --help' for available subcommands");
|
println!("See 'imag --help' for available subcommands");
|
||||||
exit(2);
|
exit(1);
|
||||||
},
|
},
|
||||||
ErrorKind::PermissionDenied => {
|
ErrorKind::PermissionDenied => {
|
||||||
println!("No permission to execute: 'imag-{}'", subcommand);
|
println!("No permission to execute: 'imag-{}'", subcommand);
|
||||||
|
|
Loading…
Reference in a new issue