Commit a82a5771 authored by Jeremy Soller's avatar Jeremy Soller

Change format of installer arguments

parent a7b16dcb
[root]
name = "redox_installer"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"clap 2.26.2 (registry+https://github.com/rust-lang/crates.io-index)",
"liner 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"pkgutils 0.1.1 (git+https://github.com/redox-os/pkgutils.git)",
"rand 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)",
......@@ -18,6 +19,11 @@ name = "adler32"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "ansi_term"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "arg_parser"
version = "0.1.0"
......@@ -32,6 +38,16 @@ dependencies = [
"scoped_threadpool 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "atty"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "base64"
version = "0.6.0"
......@@ -74,7 +90,11 @@ name = "clap"
version = "2.26.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
"atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)",
"strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
"term_size 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"textwrap 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
......@@ -504,6 +524,11 @@ dependencies = [
"typenum 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "strsim"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "syn"
version = "0.10.8"
......@@ -731,8 +756,10 @@ dependencies = [
[metadata]
"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45"
"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6"
"checksum arg_parser 0.1.0 (git+https://github.com/redox-os/arg-parser.git)" = "<none>"
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
"checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159"
"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9"
"checksum bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aad18937a628ec6abcd26d1489012cc0e18c21798210f491af69ded9b881106d"
"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5"
......@@ -793,6 +820,7 @@ dependencies = [
"checksum serde_derive_internals 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd381f6d01a6616cdba8530492d453b7761b456ba974e98768a18cad2cd76f58"
"checksum spin 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7e4deb3c2455c73779e6d3eebceae9599fc70957e54c69fe88f93aa48e62f432"
"checksum static-buffer 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6da6a96247d4b372d3ed90dec2c129ab57c934359ac4c6adbaa5871cd0737437"
"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
"checksum syn 0.10.8 (registry+https://github.com/rust-lang/crates.io-index)" = "58fd09df59565db3399efbba34ba8a2fec1307511ebd245d0061ff9d42691673"
"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad"
"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
......
[package]
name = "redox_installer"
version = "0.1.0"
version = "0.2.0"
[[bin]]
name = "redox_installer"
......@@ -11,6 +11,7 @@ name = "redox_installer"
path = "src/lib.rs"
[dependencies]
clap = "2.26"
liner = "0.1"
pkgutils = { git = "https://github.com/redox-os/pkgutils.git" }
rand = "0.3"
......
#![deny(warnings)]
extern crate clap;
extern crate redox_installer;
extern crate serde;
extern crate toml;
use std::{env, process};
use std::process;
use std::fs::File;
use std::io::{self, Read, Write};
use std::path::Path;
use clap::{App, Arg};
fn main() {
let stderr = io::stderr();
let mut stderr = stderr.lock();
let mut configs = vec![];
let mut cookbook = None;
let mut list_packages = false;
for arg in env::args().skip(1) {
if arg.starts_with("--cookbook=") {
let path = arg.splitn(2, "--cookbook=").nth(1).unwrap().to_string();
if !Path::new(&path).is_dir() {
writeln!(stderr, "installer: {}: cookbook not found", arg).unwrap();
process::exit(1);
}
cookbook = Some(path);
continue;
}
if arg == "--list-packages" {
list_packages = true;
continue;
}
let matches = App::new("redox_installer")
.arg(
Arg::with_name("cookbook")
.help("Path of cookbook")
.short("b")
.long("cookbook")
.takes_value(true)
.value_name("FOLDER")
)
.arg(
Arg::with_name("config")
.help("Configuration file")
.short("c")
.long("config")
.takes_value(true)
.value_name("FILE")
)
.arg(
Arg::with_name("list-packages")
.help("List packages")
.short("l")
.long("list-packages")
)
.arg(
Arg::with_name("output")
.help("Output folder or device")
.index(1)
.value_name("OUTPUT")
)
.get_matches();
match File::open(&arg) {
let config = if let Some(path) = matches.value_of("config") {
match File::open(path) {
Ok(mut config_file) => {
let mut config_data = String::new();
match config_file.read_to_string(&mut config_data) {
......@@ -44,46 +59,61 @@ fn main() {
let mut decoder = toml::Decoder::new(toml::Value::Table(parsed));
match serde::Deserialize::deserialize(&mut decoder) {
Ok(config) => {
configs.push(config);
config
},
Err(err) => {
writeln!(stderr, "installer: {}: failed to decode: {}", arg, err).unwrap();
writeln!(stderr, "installer: {}: failed to decode: {}", path, err).unwrap();
process::exit(1);
}
}
},
None => {
for error in parser.errors {
writeln!(stderr, "installer: {}: failed to parse: {}", arg, error).unwrap();
writeln!(stderr, "installer: {}: failed to parse: {}", path, error).unwrap();
}
process::exit(1);
}
}
},
Err(err) => {
writeln!(stderr, "installer: {}: failed to read: {}", arg, err).unwrap();
writeln!(stderr, "installer: {}: failed to read: {}", path, err).unwrap();
process::exit(1);
}
}
},
Err(err) => {
writeln!(stderr, "installer: {}: failed to open: {}", arg, err).unwrap();
writeln!(stderr, "installer: {}: failed to open: {}", path, err).unwrap();
process::exit(1);
}
}
}
} else {
redox_installer::Config::default()
};
if configs.is_empty() {
configs.push(redox_installer::Config::default());
}
let cookbook = if let Some(path) = matches.value_of("cookbook") {
if ! Path::new(&path).is_dir() {
writeln!(stderr, "installer: {}: cookbook not found", path).unwrap();
process::exit(1);
}
for config in configs {
if list_packages {
for (packagename, _package) in &config.packages {
println!("{}", packagename);
Some(path)
} else {
None
};
if matches.is_present("list-packages") {
for (packagename, _package) in &config.packages {
println!("{}", packagename);
}
} else {
if let Some(path) = matches.value_of("output") {
if let Err(err) = redox_installer::install(config, path, cookbook) {
writeln!(stderr, "installer: failed to install: {}", err).unwrap();
process::exit(1);
}
} else if let Err(err) = redox_installer::install(config, cookbook.as_ref().map(String::as_ref)) {
writeln!(stderr, "installer: failed to install: {}", err).unwrap();
} else {
writeln!(stderr, "installer: output or list-packages not found").unwrap();
process::exit(1);
}
}
......
#[derive(Debug, Default, Deserialize)]
pub struct GeneralConfig {
pub prompt: bool,
pub sysroot: Option<String>
pub prompt: bool
}
......@@ -9,12 +9,13 @@ use self::termion::input::TermRead;
use self::pkgutils::{Repo, Package};
use std::{env, fs};
use std::ffi::OsStr;
use std::io::{self, stderr, Write};
use std::str::FromStr;
use std::process::{self, Command};
use std::os::unix::fs::symlink;
use std::os::unix::ffi::OsStrExt;
use std::ffi::OsStr;
use std::os::unix::fs::symlink;
use std::path::Path;
use std::process::{self, Command};
use std::str::FromStr;
use config::Config;
......@@ -100,8 +101,10 @@ fn install_packages(config: &Config, dest: &str, cookbook: Option<&str>) {
}
}
pub fn install(config: Config, cookbook: Option<&str>) -> Result<(), String> {
println!("Install {:#?}", config);
pub fn install<P: AsRef<Path>>(config: Config, output: P, cookbook: Option<&str>) -> Result<(), String> {
let output = output.as_ref();
println!("Install {:#?} to {}", config, output.display());
let mut context = liner::Context::new();
......@@ -120,12 +123,8 @@ pub fn install(config: Config, cookbook: Option<&str>) -> Result<(), String> {
})
}
let sysroot = {
let mut wd = env::current_dir().map_err(|err| format!("failed to get current dir: {}", err))?;
let path = prompt!(config.general.sysroot.clone(), "sysroot".to_string(), "sysroot [sysroot]: ")?;
wd.push(path);
wd
};
// TODO: Mount disk if output is a file
let sysroot = output.to_owned();
macro_rules! dir {
($path:expr) => {{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment