summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Breitmoser <look@my.amazin.horse>2019-01-09 22:19:55 +0100
committerVincent Breitmoser <look@my.amazin.horse>2019-01-09 22:23:55 +0100
commitaba45db5b3f0b437958194c8bdf9f4b934c7ad91 (patch)
tree3d9b38a340307131f15c3592e6c501931121289f
parent180a393ff65ce96cfd235c1cf8858ca38c9d7b28 (diff)
index: write indexing time to file
-rw-r--r--src/bin/khaleesi.rs2
-rw-r--r--src/defaults.rs4
-rw-r--r--src/index.rs8
-rw-r--r--src/indextime.rs38
-rw-r--r--src/lib.rs5
-rw-r--r--src/testutils.rs15
6 files changed, 70 insertions, 2 deletions
diff --git a/src/bin/khaleesi.rs b/src/bin/khaleesi.rs
index 098f831..7b34109 100644
--- a/src/bin/khaleesi.rs
+++ b/src/bin/khaleesi.rs
@@ -187,8 +187,8 @@ mod tests {
extern crate assert_fs;
extern crate predicates;
- use self::assert_fs::TempDir;
use self::assert_fs::prelude::*;
+ use self::assert_fs::TempDir;
use super::*;
diff --git a/src/defaults.rs b/src/defaults.rs
index 95599fb..3071213 100644
--- a/src/defaults.rs
+++ b/src/defaults.rs
@@ -34,6 +34,10 @@ pub fn get_indexlockfile() -> PathBuf {
[DATADIR, "index-lock"].iter().collect()
}
+pub fn get_indextimefile() -> PathBuf {
+ [DATADIR, "index-time"].iter().collect()
+}
+
pub fn get_caldir() -> PathBuf {
[DATADIR, CALDIR].iter().collect()
}
diff --git a/src/index.rs b/src/index.rs
index 24c6952..f290f3d 100644
--- a/src/index.rs
+++ b/src/index.rs
@@ -2,10 +2,13 @@ use icalwrap::*;
use std::collections::HashMap;
use std::fs;
use std::path::{Path,PathBuf};
-use utils::lock;
use defaults::*;
+use utils::lock;
use utils::fileutil as utils;
+use chrono::prelude::*;
+
+use indextime;
fn add_buckets_for_calendar(buckets: &mut HashMap<String, Vec<String>>, cal: &IcalVCalendar) {
use bucketable::Bucketable;
@@ -35,6 +38,7 @@ pub fn index_dir(dir: &Path) {
}
let now = Instant::now();
+ let start_time = Utc::now();
let ics_files = get_ics_files(dir);
let buckets = read_buckets(ics_files);
@@ -46,6 +50,8 @@ pub fn index_dir(dir: &Path) {
},
Err(error) => error!("{}", error),
}
+
+ indextime::write_index_time(&start_time);
}
fn get_ics_files(dir: &Path) -> impl Iterator<Item = PathBuf> {
diff --git a/src/indextime.rs b/src/indextime.rs
new file mode 100644
index 0000000..388e154
--- /dev/null
+++ b/src/indextime.rs
@@ -0,0 +1,38 @@
+use std::fs;
+use std::io::{Read,Write};
+use chrono::prelude::*;
+
+use defaults::*;
+
+pub fn write_index_time(index_time: &DateTime<Utc>) {
+ let mut timefile = fs::File::create(get_indextimefile()).unwrap();
+ timefile.write(format!("{}\n", index_time.timestamp()).as_bytes()).unwrap();
+}
+
+pub fn get_index_time() -> Option<DateTime<Utc>> {
+ let mut timefile = fs::File::open(get_indextimefile()).ok()?;
+ let mut timestamp_str = String::new();
+ timefile.read_to_string(&mut timestamp_str).ok()?;
+ let timestamp = timestamp_str.trim().parse::<i64>().ok()?;
+ Some(Utc.timestamp(timestamp, 0))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ use testutils;
+ use assert_fs::prelude::*;
+
+ #[test]
+ fn test_write_read() {
+ let testdir = testutils::prepare_testdir("testdir");
+
+ let timestamp = Utc.ymd(1990,01,01).and_hms(1, 1, 0);
+ write_index_time(&timestamp);
+ testdir.child(".khaleesi/index-time").assert("631155660\n");
+
+ let indextime = get_index_time();
+ assert_eq!(Some(timestamp), indextime);
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index 8816b9c..3aa72e2 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,6 +7,7 @@ pub mod defaults;
pub mod edit;
pub mod icalwrap;
pub mod index;
+pub mod indextime;
pub mod list;
pub mod modify;
pub mod new;
@@ -18,11 +19,15 @@ pub mod show;
pub mod sort;
pub mod unroll;
pub mod utils;
+#[cfg(test)]
+pub mod testutils;
#[cfg(test)]
pub mod testdata;
#[cfg(test)]
extern crate tempfile;
+#[cfg(test)]
+extern crate assert_fs;
extern crate chrono;
extern crate fs2;
diff --git a/src/testutils.rs b/src/testutils.rs
new file mode 100644
index 0000000..1311dd1
--- /dev/null
+++ b/src/testutils.rs
@@ -0,0 +1,15 @@
+use assert_fs::prelude::*;
+use assert_fs::TempDir;
+use std::env;
+use std::path::PathBuf;
+
+pub fn path_to(artifact: &str) -> PathBuf {
+ [env!("CARGO_MANIFEST_DIR"), "testdata", artifact].iter().collect()
+}
+
+pub fn prepare_testdir(template: &str) -> TempDir {
+ let testdir = TempDir::new().unwrap();
+ env::set_current_dir(testdir.path()).unwrap();
+ testdir.child(".khaleesi/").copy_from(path_to(template), &["*"]).unwrap();
+ testdir
+}