~matthiasbeyer/imag

84f2f2c46f79ab47d3e5c1de2100b11bfa1a6381 — Matthias Beyer 3 years ago a749d97 + 21927d4
Merge branch 'minor'

Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
9 files changed, 108 insertions(+), 175 deletions(-)

M .travis.yml
M bin/core/imag/build.rs
M default.nix
M lib/entry/libimagentryview/Cargo.toml
M lib/entry/libimagentryview/src/builtin/md.rs
M lib/etc/libimagutil/src/cli_validators.rs
R scripts/hooks/{pre-commit.signoffby-missing-warn.sh => commit-msg.signoffby-missing-warn.sh}
A scripts/hooks/sendemail-validate.signoffby-missing-warn.sh
D scripts/new-crate.sh
M .travis.yml => .travis.yml +2 -2
@@ 16,7 16,7 @@ matrix:
            - bash ./scripts/branch-contains-no-tmp-commits
            - bash ./scripts/version-updated
        - language: rust
          rust: 1.27.2
          rust: 1.28.0
          cache:
            directories:
              - /home/travis/.cargo


@@ 26,7 26,7 @@ matrix:
            - cargo build --all --all-features -j 1  || exit 1
            - cargo test  --all --all-features -j 1  || exit 1
        - language: rust
          rust: 1.28.0
          rust: 1.29.2
          cache:
            directories:
              - /home/travis/.cargo

M bin/core/imag/build.rs => bin/core/imag/build.rs +51 -46
@@ 74,29 74,31 @@ macro_rules! build_subcommand {

// Actually generates the module.
gen_mods_buildui!(
    ("../../../bin/core/imag-annotate/src/ui.rs",    imagannotate),
    ("../../../bin/core/imag-diagnostics/src/ui.rs", imagdiagnostics),
    ("../../../bin/core/imag-edit/src/ui.rs",        imagedit),
    ("../../../bin/core/imag-git/src/ui.rs",         imaggit),
    ("../../../bin/core/imag-gps/src/ui.rs",         imaggps),
    ("../../../bin/core/imag-grep/src/ui.rs",        imaggrep),
    ("../../../bin/core/imag-ids/src/ui.rs",         imagids),
    ("../../../bin/core/imag-init/src/ui.rs",        imaginit),
    ("../../../bin/core/imag-link/src/ui.rs",        imaglink),
    ("../../../bin/core/imag-mv/src/ui.rs",          imagmv),
    ("../../../bin/core/imag-ref/src/ui.rs",         imagref),
    ("../../../bin/core/imag-store/src/ui.rs",       imagstore),
    ("../../../bin/core/imag-tag/src/ui.rs",         imagtag),
    ("../../../bin/core/imag-view/src/ui.rs",        imagview)
    ("../../../bin/domain/imag-bookmark/src/ui.rs",  imagbookmark),
    ("../../../bin/domain/imag-contact/src/ui.rs",   imagcontact),
    ("../../../bin/domain/imag-diary/src/ui.rs",     imagdiary),
    ("../../../bin/domain/imag-habit/src/ui.rs",     imaghabit),
    ("../../../bin/domain/imag-log/src/ui.rs",       imaglog),
    ("../../../bin/domain/imag-mail/src/ui.rs",      imagmail),
    ("../../../bin/domain/imag-notes/src/ui.rs",     imagnotes),
    ("../../../bin/domain/imag-timetrack/src/ui.rs", imagtimetrack),
    ("../../../bin/domain/imag-todo/src/ui.rs",      imagtodo),
    ("../../../bin/core/imag-annotate/src/ui.rs"    , imagannotate)    ,
    ("../../../bin/core/imag-category/src/ui.rs"    , imagcategory)    ,
    ("../../../bin/core/imag-diagnostics/src/ui.rs" , imagdiagnostics) ,
    ("../../../bin/core/imag-edit/src/ui.rs"        , imagedit)        ,
    ("../../../bin/core/imag-git/src/ui.rs"         , imaggit)         ,
    ("../../../bin/core/imag-gps/src/ui.rs"         , imaggps)         ,
    ("../../../bin/core/imag-grep/src/ui.rs"        , imaggrep)        ,
    ("../../../bin/core/imag-ids/src/ui.rs"         , imagids)         ,
    ("../../../bin/core/imag-init/src/ui.rs"        , imaginit)        ,
    ("../../../bin/core/imag-link/src/ui.rs"        , imaglink)        ,
    ("../../../bin/core/imag-mv/src/ui.rs"          , imagmv)          ,
    ("../../../bin/core/imag-ref/src/ui.rs"         , imagref)         ,
    ("../../../bin/core/imag-store/src/ui.rs"       , imagstore)       ,
    ("../../../bin/core/imag-tag/src/ui.rs"         , imagtag)         ,
    ("../../../bin/core/imag-view/src/ui.rs"        , imagview)        ,
    ("../../../bin/domain/imag-bookmark/src/ui.rs"  , imagbookmark)    ,
    ("../../../bin/domain/imag-contact/src/ui.rs"   , imagcontact)     ,
    ("../../../bin/domain/imag-diary/src/ui.rs"     , imagdiary)       ,
    ("../../../bin/domain/imag-habit/src/ui.rs"     , imaghabit)       ,
    ("../../../bin/domain/imag-log/src/ui.rs"       , imaglog)         ,
    ("../../../bin/domain/imag-mail/src/ui.rs"      , imagmail)        ,
    ("../../../bin/domain/imag-notes/src/ui.rs"     , imagnotes)       ,
    ("../../../bin/domain/imag-timetrack/src/ui.rs" , imagtimetrack)   ,
    ("../../../bin/domain/imag-todo/src/ui.rs"      , imagtodo)        ,
    ("../../../bin/domain/imag-wiki/src/ui.rs"      , imagwiki)        ,
);

fn main() {


@@ 107,29 109,31 @@ fn main() {
        &version[..],
        "imag")
        // and add all the subapps as subcommands.
        .subcommand(build_subcommand!("annotate",    imagannotate,      version))
        .subcommand(build_subcommand!("diagnostics", imagdiagnostics,   version))
        .subcommand(build_subcommand!("edit",        imagedit,          version))
        .subcommand(build_subcommand!("git",         imaggit,           version))
        .subcommand(build_subcommand!("gps",         imaggps,           version))
        .subcommand(build_subcommand!("grep",        imaggrep,          version))
        .subcommand(build_subcommand!("ids",         imagids,           version))
        .subcommand(build_subcommand!("init",        imaginit,          version))
        .subcommand(build_subcommand!("link",        imaglink,          version))
        .subcommand(build_subcommand!("mv",          imagmv,            version))
        .subcommand(build_subcommand!("ref",         imagref,           version))
        .subcommand(build_subcommand!("store",       imagstore,         version))
        .subcommand(build_subcommand!("tag",         imagtag,           version))
        .subcommand(build_subcommand!("view",        imagview,          version))
        .subcommand(build_subcommand!("bookmark",    imagbookmark,      version))
        .subcommand(build_subcommand!("contact",     imagcontact,       version))
        .subcommand(build_subcommand!("diary",       imagdiary,         version))
        .subcommand(build_subcommand!("habit",       imaghabit,         version))
        .subcommand(build_subcommand!("log",         imaglog,           version))
        .subcommand(build_subcommand!("mail",        imagmail,          version))
        .subcommand(build_subcommand!("notes",       imagnotes,         version))
        .subcommand(build_subcommand!("timetrack",   imagtimetrack,     version))
        .subcommand(build_subcommand!("todo",        imagtodo,          version));
        .subcommand(build_subcommand!("annotate"    , imagannotate    , version))
        .subcommand(build_subcommand!("bookmark"    , imagbookmark    , version))
        .subcommand(build_subcommand!("category"    , imagcategory    , version))
        .subcommand(build_subcommand!("contact"     , imagcontact     , version))
        .subcommand(build_subcommand!("diagnostics" , imagdiagnostics , version))
        .subcommand(build_subcommand!("diary"       , imagdiary       , version))
        .subcommand(build_subcommand!("edit"        , imagedit        , version))
        .subcommand(build_subcommand!("git"         , imaggit         , version))
        .subcommand(build_subcommand!("gps"         , imaggps         , version))
        .subcommand(build_subcommand!("grep"        , imaggrep        , version))
        .subcommand(build_subcommand!("habit"       , imaghabit       , version))
        .subcommand(build_subcommand!("ids"         , imagids         , version))
        .subcommand(build_subcommand!("init"        , imaginit        , version))
        .subcommand(build_subcommand!("link"        , imaglink        , version))
        .subcommand(build_subcommand!("log"         , imaglog         , version))
        .subcommand(build_subcommand!("mail"        , imagmail        , version))
        .subcommand(build_subcommand!("mv"          , imagmv          , version))
        .subcommand(build_subcommand!("notes"       , imagnotes       , version))
        .subcommand(build_subcommand!("ref"         , imagref         , version))
        .subcommand(build_subcommand!("store"       , imagstore       , version))
        .subcommand(build_subcommand!("tag"         , imagtag         , version))
        .subcommand(build_subcommand!("timetrack"   , imagtimetrack   , version))
        .subcommand(build_subcommand!("todo"        , imagtodo        , version))
        .subcommand(build_subcommand!("view"        , imagview        , version))
        .subcommand(build_subcommand!("wiki"        , imagwiki        , version));

    // Actually generates the completion files
    app.gen_completions("imag", Shell::Bash, "../../../target/");


@@ 139,3 143,4 @@ fn main() {
    toplevelbuildscript::build();
}



M default.nix => default.nix +1 -1
@@ 1,7 1,7 @@
{ pkgs ? (import <nixpkgs> {}) }:

let
  env = with pkgs.latest.rustChannels.stable; [
  env = with pkgs.rustChannels.stable; [
    rust
    cargo
  ];

M lib/entry/libimagentryview/Cargo.toml => lib/entry/libimagentryview/Cargo.toml +1 -1
@@ 30,7 30,7 @@ libimagstore     = { version = "0.9.0", path = "../../../lib/core/libimagstore" 
libimagerror     = { version = "0.9.0", path = "../../../lib/core/libimagerror" }
libimagentryedit = { version = "0.9.0", path = "../../../lib/entry/libimagentryedit" }

mdcat   = { version = "0.8", optional = true }
mdcat   = { version = "0.11", optional = true }

[dependencies.pulldown-cmark]
version          = "^0.1"

M lib/entry/libimagentryview/src/builtin/md.rs => lib/entry/libimagentryview/src/builtin/md.rs +10 -11
@@ 22,10 22,9 @@ use std::io::Write;
use libimagstore::store::Entry;
use libimagrt::runtime::Runtime;

use mdcat::{ResourceAccess, Terminal, TerminalSize};
use mdcat::{AnsiTerminal, ResourceAccess, TerminalSize};
use pulldown_cmark::Parser;
use syntect::parsing::SyntaxSet;
use mdcat;

use viewer::Viewer;
use failure::Fallible as Result;


@@ 34,7 33,6 @@ use failure::Error;
pub struct MarkdownViewer<'a> {
    rt:                 &'a Runtime<'a>,
    resource_access:    ResourceAccess,
    terminal:           Terminal,
    termsize:           TerminalSize,
}



@@ 43,7 41,6 @@ impl<'a> MarkdownViewer<'a> {
        MarkdownViewer {
            rt,
            resource_access: ResourceAccess::LocalOnly,
            terminal:        Terminal::detect(),
            termsize:        TerminalSize::detect().unwrap_or(TerminalSize {
                width: 80,
                height: 20,


@@ 60,13 57,15 @@ impl<'a> Viewer for MarkdownViewer<'a> {
        let base_dir        = self.rt.rtp();
        let syntax_set      = SyntaxSet::load_defaults_newlines();

        mdcat::push_tty(sink,
                        self.terminal.clone(),
                        self.termsize.clone(),
                        parser,
                        base_dir,
                        self.resource_access.clone(),
                        syntax_set)
        let mut term = AnsiTerminal::new(sink);

        ::mdcat::push_tty(&mut term,
                          self.termsize.clone(),
                          parser,
                          base_dir,
                          self.resource_access.clone(),
                          syntax_set)
        .map_err(|e| e.compat())
        .map_err(Error::from)
    }
}

M lib/etc/libimagutil/src/cli_validators.rs => lib/etc/libimagutil/src/cli_validators.rs +14 -0
@@ 42,6 42,20 @@ pub fn is_integer<A: AsRef<str>>(s: A) -> Result<(), String> {
    i.map(|_| ()).map_err(|_| format!("Not an integer: {}", s.as_ref()))
}

pub fn is_float<A: AsRef<str>>(s: A) -> Result<(), String> {
    use std::str::FromStr;

    let i : Result<f64, _> = FromStr::from_str(s.as_ref());
    i.map(|_| ()).map_err(|_| format!("Not an float: {}", s.as_ref()))
}

pub fn is_bool<A: AsRef<str>>(s: A) -> Result<(), String> {
    use std::str::FromStr;

    let i : Result<bool, _> = FromStr::from_str(s.as_ref());
    i.map(|_| ()).map_err(|_| format!("Not an bool: {}", s.as_ref()))
}

pub fn is_url<A: AsRef<str>>(s: A) -> Result<(), String> {
    use url::Url;
    Url::parse(s.as_ref()).map(|_| ()).map_err(|_| format!("Not a URL: {}", s.as_ref()))

R scripts/hooks/pre-commit.signoffby-missing-warn.sh => scripts/hooks/commit-msg.signoffby-missing-warn.sh +1 -1
@@ 9,7 9,7 @@ RED='\e[0;31m' # Red
NORMAL='\e[0m' # Text Reset

if [ "1" != "$(grep -c '^Signed-off-by: ' "$1")" ]; then
    printf >&2 "%sMissing Signed-off-by line.%s\n" "$RED" "$NORMAL"
    echo -e >&2 "${RED}Missing Signed-off-by line.${NORMAL}\n"

    # To not only warn, but abort the commit, uncomment the next line
    # exit 1

A scripts/hooks/sendemail-validate.signoffby-missing-warn.sh => scripts/hooks/sendemail-validate.signoffby-missing-warn.sh +28 -0
@@ 0,0 1,28 @@
#!/usr/bin/env bash

#
# The following snippet can be used to _WARN_ if a Signed-off-by line is missing
# in the commit message of the patch
#
# Use
#
#   git config sendemail.validate true
#
# and link this script to your git hooks folder to enable.
#

GREEN='\e[0;32m'        # Green
RED='\e[0;31m' # Red
NORMAL='\e[0m' # Text Reset

GREPLINE="^Signed-off-by: $(git config user.name) <$(git config user.email)>"

if [ "$(grep -c "$GREPLINE" "$1")" -lt 1 ]; then
    echo -e >&2 "${RED}Missing Signed-off-by line.${NORMAL}\n"

    # To not only warn, but abort the patch sending, uncomment the next line
    # exit 1
else
    echo -e >&2 "${GREEN}Signed-off-by line found.${NORMAL}\n"
fi


D scripts/new-crate.sh => scripts/new-crate.sh +0 -113
@@ 1,113 0,0 @@
#!/usr/bin/env bash

# Helper script to create a new crate in the imag workspace

# 1. Creates a new crate
# 2. Adds the required crate meta information
# 3. Sets the version of the crate to the same version as libimagstore
# 4. Adds the crate to the top-level workspace

if [[ "$1" == "-h" || "$1" == "--help" ]];
then
    echo "$0 [bin|lib] ./path/to/new/crate"
    echo
    echo "Execute _only_ from the top level of the repository"
    exit 0
fi

crate_type="$1"
crate_location="$2"

exit_if_empty() {
    [[ -z "$1" ]] && { echo "$2 not passed"; exit 1; }
}

exit_if_empty "$crate_type" "crate type"
exit_if_empty "$crate_location" "crate location"

exists_cmd() {
    command -v $1 || { echo "No $1 found"; exit 1; }
}

exists_cmd "git"
exists_cmd "cargo"

{ cat ./Cargo.toml 2>/dev/null | head -n 1 | grep -q "[workspace]"; } || {
    echo "Not in root of repository as it seems. Exiting";
    exit 1;
}

[[ "$crate_type" == "lib" || "$crate_type" == "bin" ]] || {
    echo "Invalid crate type, use 'lib' or 'bin'";
    exit 1;
}

if [[ -e "$crate_location" ]]; then
    echo "Crate exists: $crate_location"
    exit 1;
fi

IFS=/ read -ra crate_name_parts <<< "$crate_location"
crate_name="${crate_name_parts[-1]}"

if [[ "$crate_type" == "lib" ]];
then
    crate_description="Library for the imag core distribution"
else if [[ "$crate_type" == "bin" ]]; then
    crate_description="Part of the imag core distribution: $crate_name command"
fi

git_name="$(git config user.name)"
git_email="$(git config user.email)"

store="lib/core/libimagstore/Cargo.toml"
crate_version=$(grep -m 1 version $store | cut -d '"' -f 2)

echo "Crate type:        $crate_type"
echo "Crate location:    $crate_location"
echo "Crate name:        $crate_name"
echo "Crate version:     $crate_version"
echo "Crate description: $crate_description"
echo "Crate author:      $git_name <$git_email>"

echo "Not doing anything as this script is not ready yet."
echo "Exiting now"
exit 1

pushd "$(dirname $crate_location)"
crate new --${crate_type} $crate_name

cat <<EOS > ./$crate_name/Cargo.toml
[package]
name = "$crate_name"
version = "$crate_version"
authors = ["$git_name <$git_email>"]

description = "$crate_description"

keywords    = ["imag", "PIM", "personal", "information", "management"]
readme      = "../../../README.md"
license     = "LGPL-2.1"

documentation = "https://imag-pim.org/doc/"
repository    = "https://github.com/matthiasbeyer/imag"
homepage      = "http://imag-pim.org"

[badges]
travis-ci                         = { repository = "matthiasbeyer/imag" }
is-it-maintained-issue-resolution = { repository = "matthiasbeyer/imag" }
is-it-maintained-open-issues      = { repository = "matthiasbeyer/imag" }
maintenance                       = { status     = "actively-developed" }

[dependencies]

EOS

echo "Cargo.toml written. Please make sure that the README has the right path!"
popd

git add ${crate_location}/*

sed -i "$ s/]/    \"${crate_location}\",\n]/" Cargo.toml
echo "Top-level Cargo.toml modified. Please sort crate list manually!"