commit
4ec3e29459
3 changed files with 187 additions and 0 deletions
29
imag-ref/Cargo.toml
Normal file
29
imag-ref/Cargo.toml
Normal file
|
@ -0,0 +1,29 @@
|
|||
[package]
|
||||
name = "imag-ref"
|
||||
version = "0.1.0"
|
||||
authors = ["Matthias Beyer <mail@beyermatthias.de>"]
|
||||
|
||||
[dependencies]
|
||||
semver = "0.2.1"
|
||||
clap = "2.1.1"
|
||||
log = "0.3"
|
||||
version = "2.0.1"
|
||||
|
||||
[dependencies.libimagstore]
|
||||
path = "../libimagstore"
|
||||
|
||||
[dependencies.libimagrt]
|
||||
path = "../libimagrt"
|
||||
|
||||
[dependencies.libimagref]
|
||||
path = "../libimagref"
|
||||
|
||||
[dependencies.libimagerror]
|
||||
path = "../libimagerror"
|
||||
|
||||
[dependencies.libimaginteraction]
|
||||
path = "../libimaginteraction"
|
||||
|
||||
[dependencies.libimagentrylist]
|
||||
path = "../libimagentrylist"
|
||||
|
87
imag-ref/src/main.rs
Normal file
87
imag-ref/src/main.rs
Normal file
|
@ -0,0 +1,87 @@
|
|||
#[macro_use] extern crate log;
|
||||
#[macro_use] extern crate version;
|
||||
extern crate semver;
|
||||
extern crate clap;
|
||||
|
||||
extern crate libimagstore;
|
||||
extern crate libimagrt;
|
||||
extern crate libimagref;
|
||||
extern crate libimagerror;
|
||||
extern crate libimagentrylist;
|
||||
extern crate libimaginteraction;
|
||||
|
||||
mod ui;
|
||||
use ui::build_ui;
|
||||
|
||||
use std::path::PathBuf;
|
||||
|
||||
use libimagref::reference::Ref;
|
||||
use libimagref::flags::RefFlags;
|
||||
use libimagerror::trace::trace_error;
|
||||
use libimagrt::setup::generate_runtime_setup;
|
||||
use libimagrt::runtime::Runtime;
|
||||
|
||||
fn main() {
|
||||
let rt = generate_runtime_setup("imag-ref",
|
||||
&version!()[..],
|
||||
"Reference files outside of the store",
|
||||
build_ui);
|
||||
rt.cli()
|
||||
.subcommand_name()
|
||||
.map(|name| {
|
||||
debug!("Call: {}", name);
|
||||
match name {
|
||||
"add" => add(&rt),
|
||||
"remove" => remove(&rt),
|
||||
"list" => list(&rt),
|
||||
_ => {
|
||||
debug!("Unknown command"); // More error handling
|
||||
},
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
fn add(rt: &Runtime) {
|
||||
let cmd = rt.cli().subcommand_matches("add").unwrap();
|
||||
let path = cmd.value_of("path").map(PathBuf::from).unwrap(); // saved by clap
|
||||
|
||||
let flags = RefFlags::default()
|
||||
.with_content_hashing(cmd.is_present("track-content"))
|
||||
.with_permission_tracking(cmd.is_present("track-permissions"));
|
||||
|
||||
match Ref::create(rt.store(), path, flags) {
|
||||
Ok(r) => {
|
||||
debug!("Reference created: {:?}", r);
|
||||
info!("Ok");
|
||||
},
|
||||
Err(e) => {
|
||||
trace_error(&e);
|
||||
warn!("Failed to create reference");
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn remove(rt: &Runtime) {
|
||||
use libimagref::error::RefErrorKind;
|
||||
use libimagerror::into::IntoError;
|
||||
use libimaginteraction::ask::ask_bool;
|
||||
|
||||
let cmd = rt.cli().subcommand_matches("remove").unwrap();
|
||||
let hash = cmd.value_of("hash").map(String::from).unwrap(); // saved by clap
|
||||
let yes = cmd.is_present("yes");
|
||||
|
||||
if yes || ask_bool(&format!("Delete Ref with hash '{}'", hash)[..], None) {
|
||||
match Ref::delete_by_hash(rt.store(), hash) {
|
||||
Err(e) => trace_error(&e),
|
||||
Ok(_) => info!("Ok"),
|
||||
}
|
||||
} else {
|
||||
info!("Aborted");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn list(rt: &Runtime) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
71
imag-ref/src/ui.rs
Normal file
71
imag-ref/src/ui.rs
Normal file
|
@ -0,0 +1,71 @@
|
|||
use clap::{Arg, App, SubCommand};
|
||||
|
||||
pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
|
||||
app
|
||||
.subcommand(SubCommand::with_name("add")
|
||||
.about("Add a reference to a file outside of the store")
|
||||
.version("0.1")
|
||||
.arg(Arg::with_name("path")
|
||||
.long("path")
|
||||
.short("p")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.help("The path of the file")
|
||||
.value_name("PATH"))
|
||||
.arg(Arg::with_name("track-content")
|
||||
.long("content-hash")
|
||||
.short("C")
|
||||
.takes_value(false)
|
||||
.required(false)
|
||||
.help("Hash the content for the reference"))
|
||||
.arg(Arg::with_name("track-permissions")
|
||||
.long("permission-tracking")
|
||||
.short("P")
|
||||
.takes_value(false)
|
||||
.required(false)
|
||||
.help("Rememeber the permissions of the referenced file"))
|
||||
)
|
||||
|
||||
.subcommand(SubCommand::with_name("remove")
|
||||
.about("Remove a reference")
|
||||
.version("0.1")
|
||||
.arg(Arg::with_name("hash")
|
||||
.long("hash")
|
||||
.short("h")
|
||||
.takes_value(true)
|
||||
.required(true)
|
||||
.help("Remove the reference with this hash")
|
||||
.value_name("HASH"))
|
||||
|
||||
.arg(Arg::with_name("yes")
|
||||
.long("yes")
|
||||
.short("y")
|
||||
.help("Don't ask whether this really should be done"))
|
||||
)
|
||||
|
||||
.subcommand(SubCommand::with_name("list")
|
||||
.about("List references in the store")
|
||||
.version("0.1")
|
||||
|
||||
.arg(Arg::with_name("check-dead")
|
||||
.long("check-dead")
|
||||
.short("d")
|
||||
.help("Check each reference whether it is dead"))
|
||||
|
||||
.arg(Arg::with_name("check-changed")
|
||||
.long("check-changed")
|
||||
.short("c")
|
||||
.help("Check whether a reference had changed (content or permissions)"))
|
||||
|
||||
.arg(Arg::with_name("check-changed-content")
|
||||
.long("check-changed-content")
|
||||
.short("C")
|
||||
.help("Check whether the content of the referenced file changed"))
|
||||
|
||||
.arg(Arg::with_name("check-changed-permissions")
|
||||
.long("check-changed-perms")
|
||||
.short("P")
|
||||
.help("Check whether the permissions of the referenced file changed"))
|
||||
|
||||
)
|
||||
}
|
Loading…
Reference in a new issue