Start implementing DVCS backend

This commit is contained in:
southerntofu 2020-05-01 01:45:48 +02:00
parent ed17533c02
commit 2c4fa7e7b5
4 changed files with 83 additions and 33 deletions

View File

@ -5,6 +5,7 @@ use std::ffi::OsString;
use std::collections::HashMap; use std::collections::HashMap;
//use crate::log; //use crate::log;
use crate::dvcs;
#[derive(Debug)] #[derive(Debug)]
pub struct Entry { pub struct Entry {
@ -17,7 +18,7 @@ pub struct Task {
pub name: OsString, pub name: OsString,
pub bin: PathBuf, pub bin: PathBuf,
pub source: Option<String>, pub source: Option<String>,
pub dvcs: Option<String>, pub dvcs: dvcs::Backend,
pub config: HashMap<String, String>, pub config: HashMap<String, String>,
pub branch: Option<String>, pub branch: Option<String>,
pub host: Option<String>, pub host: Option<String>,
@ -28,7 +29,7 @@ impl Task {
pub fn new(base_dir: PathBuf, name: OsString) -> Task { pub fn new(base_dir: PathBuf, name: OsString) -> Task {
let t = Entry::new(base_dir, name.clone()); let t = Entry::new(base_dir, name.clone());
let source = t.source(); let source = t.source();
let cloned = source.clone().map_or(false, |src| { let cloned = source.clone().map_or(false, |_| {
let mut path = t.base_dir.clone(); let mut path = t.base_dir.clone();
path.push(format!(".{}", t.name.to_str().expect("WTF"))); path.push(format!(".{}", t.name.to_str().expect("WTF")));
path.is_dir() path.is_dir()
@ -37,7 +38,7 @@ impl Task {
name: name.clone(), name: name.clone(),
bin: PathBuf::from(name.clone()), bin: PathBuf::from(name.clone()),
source, source,
dvcs: t.dvcs(), dvcs: dvcs::from_setting(t.dvcs()),
config: HashMap::new(), config: HashMap::new(),
branch: t.branch(), branch: t.branch(),
host: t.host(), host: t.host(),
@ -77,12 +78,6 @@ impl Entry {
pub fn host(&self) -> Option<String> { pub fn host(&self) -> Option<String> {
self.read_setting("branch") self.read_setting("branch")
} }
pub fn has_dir(&self, name: &str) -> bool {
let mut path = self.base_dir.clone();
path.push(name);
return path.is_dir();
}
} }
pub struct Database { pub struct Database {
@ -109,7 +104,6 @@ impl Database {
Task::new(self.base_dir.clone(), file.file_name().expect("WTF").to_os_string()) Task::new(self.base_dir.clone(), file.file_name().expect("WTF").to_os_string())
); );
} }
println!("{:?}", file);
} }
return res; return res;

39
src/dvcs.rs Normal file
View File

@ -0,0 +1,39 @@
use std::process::Command;
pub fn from_setting(setting: Option<String>) -> Backend {
// Git is the default setting until further notice
setting.map_or(Backend::Git, |name| match name.as_ref() {
"git" => Backend::Git,
"mercurial" => Backend::Mercurial,
_ => Backend::Unknown(name.to_string())
})
}
#[derive(Debug)]
pub enum Backend {
Git,
Mercurial,
Unknown(String)
}
impl Backend {
pub fn clone(&self, source: &str) -> bool {
match self {
Backend::Git => {
let status = Command::new("git")
.arg("clone")
.arg("--recursive")
.arg(source)
.status().expect("PROCESS ERROR!");
status.success()
},
Backend::Mercurial => {
unreachable!("Unimplemented");
},
Backend::Unknown(name) => {
eprintln!("Unknown DVCS: {}", name);
false
}
}
}
}

View File

@ -11,6 +11,8 @@ lazy_static!{
static ref TRANSLATIONS: HashMap<String, String> = load_translations(); static ref TRANSLATIONS: HashMap<String, String> = load_translations();
} }
pub type Context<'a> = &'a HashMap<&'a str, &'a str>;
fn load_translations() -> HashMap<String, String> { fn load_translations() -> HashMap<String, String> {
let folder = env::var("I18N").unwrap_or("./i18n/".to_string()); let folder = env::var("I18N").unwrap_or("./i18n/".to_string());
let mut path = PathBuf::from(folder); let mut path = PathBuf::from(folder);
@ -86,37 +88,41 @@ impl LogLevel {
} }
} }
fn expand(msg: &str, vars: Option<&HashMap<String,&str>>) -> String {
let mut trans_string = trans(msg); fn expand(msg: &str, vars: Option<Context>) -> String {
//let mut s = msg;
if vars.is_some() { if vars.is_some() {
for (key, val) in vars.unwrap() { return vars.unwrap().iter().fold(msg.to_string(), |prev, (key, val)| {
trans_string = trans_string.replace(key, val); prev.replace(key, val)
} })
} }
trans_string return msg.to_string();
} }
pub fn info(msg: &str, vars: Option<&HashMap<String,&str>>) { pub fn info(msg: &str, vars: Option<Context>) {
if LOGLEVEL.info { if LOGLEVEL.info {
let trans_string = expand(msg, vars); let t_msg = expand(&trans(msg), vars);
println!("[git-build] {}", trans_string); println!("[git-build] {}", t_msg);
} }
} }
pub fn error(msg: &str) { pub fn error(msg: &str, vars: Option<Context>) {
if LOGLEVEL.error { if LOGLEVEL.error {
eprintln!("ERROR: {}", msg); let t_msg = expand(&trans(msg), vars);
eprintln!("{}{}", trans("error"), t_msg);
} }
} }
pub fn warn(msg: &str) { pub fn warn(msg: &str, vars: Option<Context>) {
if LOGLEVEL.error { if LOGLEVEL.error {
eprintln!("WARNING: {}", msg); let t_msg = expand(&trans(msg), vars);
eprintln!("{}{}", trans("warning"), t_msg);
} }
} }
pub fn debug(msg: &str) { pub fn debug(msg: &str, vars: Option<Context>) {
if LOGLEVEL.debug { if LOGLEVEL.debug {
println!("DEBUG: {}", msg); let t_msg = expand(&trans(msg), vars);
println!("{}{}", trans("debug"), t_msg);
} }
} }

View File

@ -3,23 +3,34 @@ use std::collections::HashMap;
mod log; mod log;
mod db; mod db;
mod dvcs;
fn main() { fn main() {
let home_dir = env::var("HOME").expect("$HOME not defined. WTF?"); let home_dir = env::var("HOME").expect("$HOME not defined. WTF?");
let base_dir = format!("{}/.git-build", home_dir); let base_dir = format!("{}/.git-build", home_dir);
let mut test = HashMap::new();
test.insert("$i18n_task".to_string(), "test");
log::info("process", Some(&test));
let db = db::Database::from_folder(&base_dir); let db = db::Database::from_folder(&base_dir);
let truc = db.tasks(); let truc = db.tasks();
println!("{:?}", truc);
for task in truc { for task in truc {
println!("{:#?}", task); let mut context = HashMap::new();
} context.insert("$i18n_task", task.name.to_str().expect("WTF"));
log::debug("found_task", Some(&context));
if task.cloned == false {
// Maybe the task has a source we should clone?
if let Some(source) = &task.source {
//let log_level = env::var("LOG").unwrap_or if !task.dvcs.clone(source) {
context.insert("$i18n_source", &source);
log::error("clone_failed", Some(&context));
continue
// Skip further processing
}
}
// Otherwise, it's a sourceless task
continue
}
// So the cloned repo is here maybe update?
}
} }