From aa736dc2a8cc75df02d4b8b6261b8a7f716d50ed Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Mon, 11 Feb 2019 17:56:43 +0100 Subject: [PATCH] Working on cache --- Cargo.toml | 8 +++++ src/cdg.rs | 5 +++ src/{main.rs => gclone.rs} | 28 +++++++++------- src/lib.rs | 66 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 src/cdg.rs rename src/{main.rs => gclone.rs} (91%) create mode 100644 src/lib.rs diff --git a/Cargo.toml b/Cargo.toml index 9850d4b..5c0e352 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,11 @@ edition = "2018" [dependencies] colored = "1.7.0" + +[[bin]] +name = "gclone" +path = "src/gclone.rs" + +[[bin]] +name = "cdg" +path = "src/cdg.rs" diff --git a/src/cdg.rs b/src/cdg.rs new file mode 100644 index 0000000..4a7984c --- /dev/null +++ b/src/cdg.rs @@ -0,0 +1,5 @@ +use gclone::Cache; + +fn main() { + let cache = Cache::read(); +} diff --git a/src/main.rs b/src/gclone.rs similarity index 91% rename from src/main.rs rename to src/gclone.rs index 5e26da8..ad867f6 100644 --- a/src/main.rs +++ b/src/gclone.rs @@ -6,6 +6,8 @@ use std::path::PathBuf; use colored::*; +use gclone::{git_dir, Cache}; + macro_rules! unwrap { ($e: expr) => { match $e { @@ -55,17 +57,7 @@ fn help() { fn main() { - let git_dir = match env::var("GCLONE_PATH") { - Ok(path) => path, - Err(e) => { - eprintln!("{} {} {}", - "error:".bold().red(), - "environment variable GCLONE_PATH must be set:".bold(), - e.description()); - - exit(1); - }, - }; + let git_dir = git_dir(); // Parse args let url = match env::args().nth(1) { @@ -144,4 +136,18 @@ fn main() { eprintln!("{} {}", "info:".bold(), "done!"); + // Append to cache + let mut cache = Cache::read(); + cache.append(path.display().to_string()); + + match cache.write() { + Ok(_) => (), + Err(e) => { + eprintln!("{} {} {}", + "warning:".bold().yellow(), + "couldn't write cache:".bold(), + e.description()); + }, + } + } diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..e5ac623 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,66 @@ +use std::env; +use std::process::exit; +use std::error::Error; +use std::path::PathBuf; +use std::fs::File; +use std::io::{Write, BufRead, BufReader}; + +use colored::*; + +pub fn git_dir() -> String { + match env::var("GCLONE_PATH") { + Ok(path) => path, + Err(e) => { + eprintln!("{} {} {}", + "error:".bold().red(), + "environment variable GCLONE_PATH must be set:".bold(), + e.description()); + + exit(1); + }, + } +} + +pub struct Cache(Vec); + +impl Cache { + pub fn read() -> Cache { + + let mut path = PathBuf::from(git_dir()); + path.push(".cdgcache"); + + let file = match File::open(&path) { + Ok(f) => f, + Err(_) => return Cache(vec![]), + }; + + let file = BufReader::new(file); + + let mut values = vec![]; + + for line in file.lines() { + if let Ok(l) = line { + values.push(l); + } + } + + Cache(values) + } + + pub fn write(&self) -> Result<(), Box> { + let mut path = PathBuf::from(git_dir()); + path.push(".cdgcache"); + let mut file = File::create(path)?; + + for line in &self.0 { + writeln!(file, "{}", line)?; + } + + Ok(()) + } + + pub fn append(&mut self, value: String) { + self.0.push(value); + } +} +