summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml1
-rw-r--r--bin/core/imag-link/Cargo.toml6
-rw-r--r--bin/core/imag-link/src/main.rs139
-rw-r--r--bin/core/imag-link/src/ui.rs43
-rw-r--r--bin/core/imag-ref/src/main.rs10
-rw-r--r--bin/core/imag-store/Cargo.toml15
-rw-r--r--bin/core/imag-store/src/create.rs36
-rw-r--r--bin/core/imag-store/src/delete.rs35
-rw-r--r--bin/core/imag-store/src/main.rs9
-rw-r--r--bin/core/imag-tag/Cargo.toml6
-rw-r--r--bin/core/imag-tag/src/main.rs42
-rw-r--r--bin/core/imag-tag/src/ui.rs20
-rw-r--r--bin/domain/imag-bookmark/Cargo.toml1
-rw-r--r--bin/domain/imag-bookmark/src/main.rs1
-rw-r--r--bin/domain/imag-bookmark/src/ui.rs2
-rw-r--r--bin/domain/imag-diary/src/create.rs164
-rw-r--r--bin/domain/imag-diary/src/delete.rs40
-rw-r--r--bin/domain/imag-diary/src/edit.rs42
-rw-r--r--bin/domain/imag-diary/src/list.rs4
-rw-r--r--bin/domain/imag-diary/src/view.rs3
-rw-r--r--bin/domain/imag-mail/Cargo.toml1
-rw-r--r--bin/domain/imag-mail/src/main.rs12
-rw-r--r--bin/domain/imag-notes/Cargo.toml1
-rw-r--r--bin/domain/imag-notes/src/main.rs1
-rw-r--r--bin/domain/imag-notes/src/ui.rs4
-rw-r--r--bin/domain/imag-todo/src/main.rs53
-rw-r--r--doc/src/09020-changelog.md3
-rw-r--r--imagrc.toml29
-rw-r--r--lib/core/libimagrt/Cargo.toml9
-rw-r--r--lib/core/libimagrt/src/error.rs65
-rw-r--r--lib/core/libimagrt/src/lib.rs1
-rw-r--r--lib/core/libimagrt/src/logger.rs578
-rw-r--r--lib/core/libimagrt/src/runtime.rs155
-rw-r--r--lib/domain/libimagdiary/src/diary.rs144
-rw-r--r--lib/domain/libimagdiary/src/entry.rs64
-rw-r--r--lib/domain/libimagdiary/src/error.rs5
-rw-r--r--lib/domain/libimagdiary/src/is_in_diary.rs10
-rw-r--r--lib/domain/libimagdiary/src/iter.rs53
-rw-r--r--lib/domain/libimagdiary/src/viewer.rs12
-rw-r--r--lib/domain/libimagmail/src/iter.rs15
-rw-r--r--lib/domain/libimagmail/src/mail.rs17
-rw-r--r--lib/domain/libimagtodo/src/error.rs14
-rw-r--r--lib/domain/libimagtodo/src/lib.rs1
-rw-r--r--lib/domain/libimagtodo/src/task.rs275
-rw-r--r--lib/domain/libimagtodo/src/taskstore.rs207
-rw-r--r--lib/entry/libimagentrygps/Cargo.toml24
-rw-r--r--lib/entry/libimagentrygps/src/entry.rs123
-rw-r--r--lib/entry/libimagentrygps/src/error.rs87
-rw-r--r--lib/entry/libimagentrygps/src/lib.rs (renamed from lib/entry/libimagentrytag/src/exec.rs)34
-rw-r--r--lib/entry/libimagentrygps/src/types.rs156
-rw-r--r--lib/entry/libimagentrylink/src/external.rs84
-rw-r--r--lib/entry/libimagentryref/Cargo.toml2
-rw-r--r--lib/entry/libimagentryref/src/hashers/nbytes.rs8
-rw-r--r--lib/entry/libimagentryref/src/lib.rs2
-rw-r--r--lib/entry/libimagentryref/src/lister.rs112
-rw-r--r--lib/entry/libimagentryref/src/reference.rs423
-rw-r--r--lib/entry/libimagentryref/src/refstore.rs268
-rw-r--r--lib/entry/libimagentryref/src/util.rs57
-rw-r--r--lib/entry/libimagentrytag/src/lib.rs2
-rw-r--r--lib/entry/libimagentrytag/src/ui.rs125
-rw-r--r--lib/etc/libimaginteraction/src/readline.rs26
-rw-r--r--lib/etc/libimagutil/src/testing.rs17
-rw-r--r--scripts/hooks/applypatch-msg.check-signed-off.sh33
-rw-r--r--scripts/hooks/pre-commit.signoffby-missing-warn.sh17
-rw-r--r--scripts/hooks/pre-push.fixup-warn.sh58
-rw-r--r--scripts/hooks/pre-push.signoffby-missing-warn.sh50
-rw-r--r--scripts/signed-off-by-in-branch.sh17
67 files changed, 2735 insertions, 1338 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 1e2c254e..c9e7d3b0 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -29,6 +29,7 @@ members = [
"lib/entry/libimagentrydatetime",
"lib/entry/libimagentryedit",
"lib/entry/libimagentryfilter",
+ "lib/entry/libimagentrygps",
"lib/entry/libimagentrylink",
"lib/entry/libimagentrylist",
"lib/entry/libimagentrymarkdown",
diff --git a/bin/core/imag-link/Cargo.toml b/bin/core/imag-link/Cargo.toml
index ce87acaf..15b7cc0e 100644
--- a/bin/core/imag-link/Cargo.toml
+++ b/bin/core/imag-link/Cargo.toml
@@ -33,3 +33,9 @@ path = "../../../lib/etc/libimagutil"
default-features = false
features = ["testing"]
+[dev-dependencies.libimagrt]
+version = "0.4.0"
+path = "../../../lib/core/libimagrt"
+default-features = false
+features = ["testing"]
+
diff --git a/bin/core/imag-link/src/main.rs b/bin/core/imag-link/src/main.rs
index 0acbf710..72b9498c 100644
--- a/bin/core/imag-link/src/main.rs
+++ b/bin/core/imag-link/src/main.rs
@@ -108,40 +108,39 @@ fn handle_internal_linking(rt: &Runtime) {
}
}
- match cmd.value_of("list") {
- Some(list) => handle_internal_linking_list_call(rt, cmd, list),
- None => {
- match cmd.subcommand_name() {
- Some("add") => {
- let (mut from, to) = get_from_to_entry(&rt, "add");
- for mut to_entry in to {
- if let Err(e) = to_entry.add_internal_link(&mut from) {
- trace_error_exit(&e, 1);
- }
- }
- },
-
- Some("remove") => {
- let (mut from, to) = get_from_to_entry(&rt, "remove");
- for mut to_entry in to {
- if let Err(e) = to_entry.remove_internal_link(&mut from) {
- trace_error_exit(&e, 1);
- }
- }
- },
+ match cmd.subcommand_name() {
+ Some("list") => {
+ cmd.subcommand_matches("list")
+ .map(|matches| handle_internal_linking_list_call(rt, cmd, matches));
+ },
+ Some("add") => {
+ let (mut from, to) = get_from_to_entry(&rt, "add");
+ for mut to_entry in to {
+ if let Err(e) = to_entry.add_internal_link(&mut from) {
+ trace_error_exit(&e, 1);
+ }
+ };
+ },
- _ => unreachable!(),
+ Some("remove") => {
+ let (mut from, to) = get_from_to_entry(&rt, "remove");
+ for mut to_entry in to {
+ if let Err(e) = to_entry.remove_internal_link(&mut from) {
+ trace_error_exit(&e, 1);
+ }
};
- }
+ },
+
+ _ => unreachable!(),
}
}
#[inline]
-fn handle_internal_linking_list_call(rt: &Runtime, cmd: &ArgMatches, list: &str) {
+fn handle_internal_linking_list_call(rt: &Runtime, cmd: &ArgMatches, list: &ArgMatches) {
use libimagentrylink::external::is_external_link_storeid;
debug!("List...");
- for entry in list.split(',') {
+ for entry in list.values_of("entries").unwrap() { // clap has our back
debug!("Listing for '{}'", entry);
match get_entry_by_name(rt, entry) {
Ok(Some(e)) => {
@@ -362,6 +361,7 @@ mod tests {
with help "imag-link mocking app";
}
use self::mock::generate_test_runtime;
+ use self::mock::reset_test_runtime;
use libimagutil::testing::DEFAULT_ENTRY;
fn create_test_default_entry<'a, S: AsRef<OsStr>>(rt: &'a Runtime, name: S) -> StoreResult<StoreId> {
@@ -392,7 +392,7 @@ mod tests {
#[test]
fn test_link_modificates() {
- let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"])
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"])
.unwrap();
let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
@@ -412,7 +412,7 @@ mod tests {
#[test]
fn test_linking_links() {
- let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"])
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"])
.unwrap();
let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
@@ -432,7 +432,7 @@ mod tests {
#[test]
fn test_multilinking() {
- let rt = generate_test_runtime(vec!["internal", "add", "--from", "test1", "--to", "test2"])
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"])
.unwrap();
let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
@@ -450,4 +450,87 @@ mod tests {
assert_eq!(*test_links1, links_toml_value(vec!["test2"]));
assert_eq!(*test_links2, links_toml_value(vec!["test1"]));
}
+
+ #[test]
+ fn test_linking_more_than_two() {
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2", "test3"])
+ .unwrap();
+
+ let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
+ let test_id2 = create_test_default_entry(&rt, "test2").unwrap();
+ let test_id3 = create_test_default_entry(&rt, "test3").unwrap();
+
+ handle_internal_linking(&rt);
+ handle_internal_linking(&rt);
+
+ let test_entry1 = rt.store().get(test_id1).unwrap().unwrap();
+ let test_links1 = get_entry_links(&test_entry1).unwrap();
+
+ let test_entry2 = rt.store().get(test_id2).unwrap().unwrap();
+ let test_links2 = get_entry_links(&test_entry2).unwrap();
+
+ let test_entry3 = rt.store().get(test_id3).unwrap().unwrap();
+ let test_links3 = get_entry_links(&test_entry3).unwrap();
+
+ assert_eq!(*test_links1, links_toml_value(vec!["test2", "test3"]));
+ assert_eq!(*test_links2, links_toml_value(vec!["test1"]));
+ assert_eq!(*test_links3, links_toml_value(vec!["test1"]));
+ }
+
+ // Remove tests
+
+ #[test]
+ fn test_linking_links_unlinking_removes_links() {
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2"])
+ .unwrap();
+
+ let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
+ let test_id2 = create_test_default_entry(&rt, "test2").unwrap();
+
+ handle_internal_linking(&rt);
+
+ let rt = reset_test_runtime(vec!["internal", "remove", "test1", "test2"], rt)
+ .unwrap();
+
+ handle_internal_linking(&rt);
+
+ let test_entry1 = rt.store().get(test_id1).unwrap().unwrap();
+ let test_links1 = get_entry_links(&test_entry1).unwrap();
+
+ let test_entry2 = rt.store().get(test_id2).unwrap().unwrap();
+ let test_links2 = get_entry_links(&test_entry2).unwrap();
+
+ assert_eq!(*test_links1, links_toml_value(vec![]));
+ assert_eq!(*test_links2, links_toml_value(vec![]));
+ }
+
+ #[test]
+ fn test_linking_and_unlinking_more_than_two() {
+ let rt = generate_test_runtime(vec!["internal", "add", "test1", "test2", "test3"])
+ .unwrap();
+
+ let test_id1 = create_test_default_entry(&rt, "test1").unwrap();
+ let test_id2 = create_test_default_entry(&rt, "test2").unwrap();
+ let test_id3 = create_test_default_entry(&rt, "test3").unwrap();
+
+ handle_internal_linking(&rt);
+
+ let rt = reset_test_runtime(vec!["internal", "remove", "test1", "test2", "test3"], rt)
+ .unwrap();
+
+ handle_internal_linking(&rt);
+
+ let test_entry1 = rt.store().get(test_id1).unwrap().unwrap();
+ let test_links1 = get_entry_links(&test_entry1).unwrap();
+
+ let test_entry2 = rt.store().get(test_id2).unwrap().unwrap();
+ let test_links2 = get_entry_links(&test_entry2).unwrap();
+
+ let test_entry3 = rt.store().get(test_id3).unwrap().unwrap();
+ let test_links3 = get_entry_links(&test_entry3).unwrap();
+
+ assert_eq!(*test_links1, links_toml_value(vec![]));
+ assert_eq!(*test_links2, links_toml_value(vec![]));
+ assert_eq!(*test_links3, links_toml_value(vec![]));
+ }
}
diff --git a/bin/core/imag-link/src/ui.rs b/bin/core/imag-link/src/ui.rs
index 2b83fb1e..7459a25d 100644
--- a/bin/core/imag-link/src/ui.rs
+++ b/bin/core/imag-link/src/ui.rs
@@ -28,15 +28,14 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.about("Add link from one entry to another (and vice-versa)")
.version("0.1")
.arg(Arg::with_name("from")
- .long("from")
- .short("f")
+ .index(1)
.takes_value(true)
.required(true)
+ .multiple(false)
.help("Link from this entry")
.value_name("ENTRY"))
.arg(Arg::with_name("to")
- .long("to")
- .short("t")
+ .index(2)
.takes_value(true)
.required(true)
.multiple(true)
@@ -48,15 +47,14 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.about("Remove a link between two or more entries")
.version("0.1")
.arg(Arg::with_name("from")
- .long("from")
- .short("f")
+ .index(1)
.takes_value(true)
.required(true)
+ .multiple(false)
.help("Remove Link from this entry")
.value_name("ENTRY"))
.arg(Arg::with_name("to")
- .long("to")
- .short("t")
+ .index(2)
.takes_value(true)
.required(true)
.multiple(true)
@@ -64,20 +62,23 @@ pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
.value_name("ENTRIES"))
)
- .arg(Arg::with_name("list")
- .long("list")
- .short("l")
- .takes_value(true)
- .required(false)
- .help("List links to this entry")
- .value_name("ENTRY"))
-
+ .subcommand(SubCommand::with_name("list")
+ .about("List links to this entry")
+ .version("0.1")
+ .arg(Arg::with_name("entries")
+ .index(1)
+ .takes_value(true)
+ .multiple(true)
+ .required(true)
+ .help("List these entries, seperate by comma")
+ .value_name("ENTRIES"))
- .arg(Arg::with_name("list-externals-too")
- .long("list-external")
- .takes_value(false)
- .required(false)
- .help("If --list is provided, also list external links (debugging helper that might be removed at some point"))
+ .arg(Arg::with_name("list-externals-too")
+ .long("list-external")
+ .takes_value(false)
+ .required(false)
+ .help("If --list is provided, also list external links (debugging helper that might be removed at some point"))
+ )
.arg(Arg::with_name("check-consistency")
.long("check-consistency")
diff --git a/bin/core/imag-ref/src/main.rs b/bin/core/imag-ref/src/main.rs
index 092ca762..1420f5f8 100644
--- a/bin/core/imag-ref/src/main.rs
+++ b/bin/core/imag-ref/src/main.rs
@@ -48,7 +48,7 @@ use ui::build_ui;
use std::path::PathBuf;
-use libimagentryref::reference::Ref;
+use libimagentryref::refstore::RefStore;
use libimagentryref::flags::RefFlags;
use libimagerror::trace::trace_error;
use libimagrt::setup::generate_runtime_setup;
@@ -82,7 +82,7 @@ fn add(rt: &Runtime) {
.with_content_hashing(cmd.is_present("track-content"))
.with_permission_tracking(cmd.is_present("track-permissions"));
- match Ref::create(rt.store(), path, flags) {
+ match RefStore::create(rt.store(), path, flags) {
Ok(r) => {
debug!("Reference created: {:?}", r);
info!("Ok");
@@ -102,7 +102,7 @@ fn remove(rt: &Runtime) {
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) {
+ match rt.store().delete_by_hash(hash) {
Err(e) => trace_error(&e),
Ok(_) => info!("Ok"),
}
@@ -126,7 +126,7 @@ fn list(rt: &Runtime) {
let iter = match rt.store().retrieve_for_module("ref") {
Ok(iter) => iter.filter_map(|id| {
- match Ref::get(rt.store(), id) {
+ match rt.store().get(id) {
Ok(r) => Some(r),
Err(e) => {
trace_error(&e);
@@ -145,7 +145,7 @@ fn list(rt: &Runtime) {
.check_changed(do_check_changed)
.check_changed_content(do_check_changed_content)
.check_changed_permiss(do_check_changed_permiss)
- .list(iter.map(|e| e.into()))
+ .list(iter.filter_map(Into::into))
.ok();
}
diff --git a/bin/core/imag-store/Cargo.toml b/bin/core/imag-store/Cargo.toml
index be5b1521..55aac2ed 100644
--- a/bin/core/imag-store/Cargo.toml
+++ b/bin/core/imag-store/Cargo.toml
@@ -28,3 +28,18 @@ libimagutil = { version = "0.4.0", path = "../../../lib/etc/libimagutil" }
[features]
early-panic = [ "libimagstore/early-panic" ]
+[dev-dependencies.libimagutil]
+version = "0.4.0"
+path = "../../../lib/etc/libimagutil"
+default-features = false
+features = ["testing"]
+
+[dev-dependencies.libimagrt]
+version = "0.4.0"
+path = "../../../lib/core/libimagrt"
+default-features = false
+features = ["testing"]
+
+[dev-dependencies.toml-query]
+version = "0.3"
+
diff --git a/bin/core/imag-store/src/create.rs b/bin/core/imag-store/src/create.rs
index d4fb9421..74ffbec9 100644
--- a/bin/core/imag-store/src/create.rs
+++ b/bin/core/imag-store/src/create.rs
@@ -178,3 +178,39 @@ fn string_from_raw_src(raw_src: &str) -> String {
}
content
}
+
+#[cfg(test)]
+mod tests {
+ use super::create;
+
+ use std::path::PathBuf;
+ use toml_query::read::TomlValueReadExt;
+ use toml::Value;
+
+ make_mock_app! {
+ app "imag-link";
+ modulename mock;
+ version "0.4.0";
+ with help "imag-link mocking app";
+ }
+ use self::mock::generate_test_runtime;
+
+ #[test]
+ fn test_create_simple() {
+ let test_name = "test_create_simple";
+ let rt = generate_test_runtime(vec!["create", "-p", "test_create_simple"]).unwrap();
+
+ create(&rt);
+
+ let e = rt.store().get(PathBuf::from(test_name));
+ assert!(e.is_ok());
+ let e = e.unwrap();
+ assert!(e.is_some());
+ let e = e.unwrap();
+
+ let version = e.get_header().read("imag.version").map(Option::unwrap).unwrap();
+ assert_eq!(Value::String(String::from("0.4.0")), *version);
+ }
+
+}
+
diff --git a/bin/core/imag-store/src/delete.rs b/bin/core/imag-store/src/delete.rs
index 1413de77..7b9e56ed 100644
--- a/bin/core/imag-store/src/delete.rs
+++ b/bin/core/imag-store/src/delete.rs
@@ -46,3 +46,38 @@ pub fn delete(rt: &Runtime) {
.or_else(|| warn_exit("No subcommand 'delete'. Will exit now", 1));
}
+#[cfg(test)]
+mod tests {
+ use create::create;
+ use super::delete;
+
+ use std::path::PathBuf;
+
+ make_mock_app! {
+ app "imag-link";
+ modulename mock;
+ version "0.4.0";
+ with help "imag-link mocking app";
+ }
+ use self::mock::generate_test_runtime;
+ use self::mock::reset_test_runtime;
+
+ #[test]
+ fn test_create_simple() {
+ let test_name = "test_create_simple";
+ let rt = generate_test_runtime(vec!["create", "-p", "test_create_simple"]).unwrap();
+
+ create(&rt);
+
+ let rt = reset_test_runtime(vec!["delete", "--id", "test_create_simple"], rt).unwrap();
+
+ delete(&rt);
+
+ let e = rt.store().get(PathBuf::from(test_name));
+ assert!(e.is_ok());
+ let e = e.unwrap();
+ assert!(e.is_none());
+ }
+
+}
+
diff --git a/bin/core/imag-store/src/main.rs b/bin/core/imag-store/src/main.rs
index 434c84a8..572f9e0d 100644
--- a/bin/core/imag-store/src/main.rs
+++ b/bin/core/imag-store/src/main.rs
@@ -35,14 +35,21 @@
extern crate clap;
#[macro_use] extern crate log;
extern crate toml;
+#[cfg(test)] extern crate toml_query;
#[macro_use] extern crate version;
#[macro_use] extern crate error_chain;
extern crate libimagrt;
extern crate libimagstore;
-extern crate libimagutil;
extern crate libimagerror;
+#[cfg(test)]
+#[macro_use]
+extern crate libimagutil;
+
+#[cfg(not(test))]
+extern crate libimagutil;
+
use libimagrt::setup::generate_runtime_setup;
mod create;
diff --git a/bin/core/imag-tag/Cargo.toml b/bin/core/imag-tag/Cargo.toml
index bb00f889..e1bf382a 100644
--- a/bin/core/imag-tag/Cargo.toml
+++ b/