tAdd tests and CI - fffs - fast and simple shell plugin manager
(HTM) git clone git://src.adamsgaard.dk/fffs
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit 4dd27e406935a2df1c0b039883ba24830ece66ba
(HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
Date: Thu, 14 Mar 2019 17:08:23 +0100
Add tests and CI
Diffstat:
A .gitlab-ci.yml | 25 +++++++++++++++++++++++++
A fffs | 165 +++++++++++++++++++++++++++++++
A run_tests.sh | 34 +++++++++++++++++++++++++++++++
3 files changed, 224 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
t@@ -0,0 +1,25 @@
+build-alpine:
+ stage: test
+ image: alpine:edge
+ before_script:
+ - apk --no-cache add git zsh bash
+ script:
+ - run_tests.sh
+
+build-debian:
+ stage: test
+ image: debian
+ before_script:
+ - apt-get update
+ - apt-get -y install git zsh bash
+ script:
+ - run_tests.sh
+
+build-arch:
+ stage: test
+ image: archlinux/base
+ before_script:
+ - pacman -Syu --noconfirm git zsh bash
+ script:
+ - run_tests.sh
+
(DIR) diff --git a/fffs b/fffs
t@@ -0,0 +1,165 @@
+#!/usr/bin/env bash
+
+set -e
+#set -v
+
+version='0.1.0'
+
+confsubdir=".config/fffs"
+confdir="$HOME/$confsubdir"
+plugindir="$confdir/lib"
+pluginfile="$confdir/plugins"
+
+function show_help {
+ echo "usage: ${0##*/} [OPTION] SHELL COMMAND"
+ echo "${0##*/} is a fast and simple manager for shell plugins"
+ echo "where SHELL can be 'bash' or 'zsh'."
+ echo "Valid COMMANDs are:"
+ echo " init fetch repositories specified in plugin file and"
+ echo " create configuration for parent shell. Call this"
+ echo " function after every update to the plugin file"
+ echo " update update all local plugin content"
+ echo " clean remove all local plugin content"
+ echo "Valid OPTIONs are:"
+ echo " -h, --help show this message"
+ echo " -v, --version show version and license information"
+ echo
+ echo "Set the plugin sources as git repository URLs in "
+ echo "$pluginfile-zsh or $pluginfile-bash"
+ echo "before running 'init'. Afterwards, add the generated sources file in "
+ echo "the shell-rc file. For ~/.zshrc:"
+ echo " if [ -f \"\$HOME/.config/fffs/lib/zsh/sources\" ]; then"
+ echo " . \"\$HOME/.config/fffs/lib/zsh/sources\""
+ echo " else"
+ echo " fffs zsh init"
+ echo " . \"\$HOME/.config/fffs/lib/zsh/sources\""
+ echo " fi"
+}
+
+function show_version {
+ echo "${0##*/} version $version"
+ echo "Licensed under the GNU Public License, v3+"
+ echo "written by Anders Damsgaard, anders@adamsgaard.dk"
+ echo "https://gitlab.com/admesg/fffs"
+}
+
+function die {
+ printf '%s\n' "$1" >&2
+ exit 1
+}
+
+function clone_repositories {
+ if [[ ! -f "$pluginfile-$shell" ||
+ $(wc -l <"$pluginfile-$shell") -lt 1 ]]; then
+ (>&2 echo "No plugins specified in $pluginfile-$shell" )
+ fi
+
+ # loop over all repositories in $configfile, and clone them if they do not
+ # exist in $plugindir
+ while read -r line; do
+ target="$plugindir/$shell/${line##*/}"
+ if [[ -d "$target" ]]; then
+ echo "$target already exists, skipping."
+ else
+ echo "$line > $target"
+ git clone "$line" "$target"
+ fi
+ done < "$pluginfile-$shell"
+}
+
+function update_repositories {
+ [[ ! -d "$plugindir/$shell" ]] && return
+
+ for dir in "$plugindir/$shell"/*/; do
+ echo "Updating $dir..."
+ (cd "$dir" && git pull)
+ done
+ init_sources
+}
+
+function check_if_source_in_shellrc {
+ if ! grep -r "$confsubdir/lib/$shell/sources" "$HOME/.${shell}rc" \
+ >/dev/null 2>&1; then
+ echo
+ echo "Make sure to source the following line in your ~/.${shell}rc:"
+ echo " $plugindir/$shell/sources"
+ fi
+}
+
+function init_sources {
+ echo "Generating source file $plugindir/$shell/sources"
+ echo "#!/usr/bin/env $shell" > "$plugindir/$shell/sources"
+
+ if [[ "$shell" == "zsh" ]]; then
+ find "$plugindir/$shell/" -maxdepth 2 -type f \
+ -iname '*.zsh' \
+ | sed 's/^/. /' >> "$plugindir/$shell/sources"
+ elif [[ "$shell" == "bash" ]]; then
+ find "$plugindir/$shell/" -maxdepth 2 -type f \
+ -iname '*.sh' -iname '*.bash' \
+ | sed 's/^/. /' >> "$plugindir/$shell/sources"
+ else
+ die "Unknown shell $shell"
+ fi
+
+ check_if_source_in_shellrc
+}
+
+function init {
+ clone_repositories
+ init_sources
+}
+
+function clean {
+ echo rm -rf "$plugindir"
+ rm -rf "$plugindir"
+}
+
+
+## Parse command-line arguments
+
+[[ $# -lt 1 ]] && (show_help && exit 1)
+
+shell=""
+while :; do
+ case "$1" in
+ zsh)
+ [[ ! "$2" ]] && die 'Error: No command specified'
+ shell='zsh'
+ ;;
+ bash)
+ [[ ! "$2" ]] && die 'Error: No command specified'
+ shell='bash'
+ ;;
+ init)
+ [[ "$shell" == "" ]] && die 'Error: No SHELL specified'
+ (init && exit 0)
+ ;;
+ update)
+ [[ "$shell" == "" ]] && die 'Error: No SHELL specified'
+ (update_repositories && exit 0)
+ ;;
+ upgrade)
+ die 'Did you mean "update"?'
+ ;;
+ clean)
+ [[ "$shell" == "" ]] && die 'Error: No SHELL specified'
+ (clean && exit 0)
+ ;;
+ clear)
+ die 'Did you mean "clean"?'
+ ;;
+ -h|-\?|--help)
+ (show_help && exit 0)
+ ;;
+ -v|--version)
+ (show_version && exit 0)
+ ;;
+ ?*)
+ die 'Error: Unknown option specified'
+ ;;
+ *) # No more options
+ break
+ esac
+ shift
+done
(DIR) diff --git a/run_tests.sh b/run_tests.sh
t@@ -0,0 +1,34 @@
+#!/usr/bin/env bash
+set -v
+set -e
+
+./fffs -h
+./fffs --help
+./fffs -v
+./fffs --version
+
+confdir=~/.config/fffs
+pluginfile="$confdir/plugins-zsh"
+[[ -f "$pluginfile" ]] && mv $pluginfile{,-bck}
+
+./fffs zsh clean
+[[ -d "$confdir/lib" ]] && exit 1
+
+echo -e "https://github.com/zsh-users/zsh-autosuggestions\n" \
+ "https://github.com/zsh-users/zsh-completions\n" \
+ "https://github.com/zsh-users/zsh-syntax-highlighting\n" \
+ "https://github.com/zsh-users/zsh-history-substring-search" > $pluginfile
+
+./fffs zsh init
+
+[[ ! -d "$confdir" ]] && exit 1
+[[ ! -d "$confdir/lib" ]] && exit 1
+[[ ! -d "$confdir/lib/zsh" ]] && exit 1
+[[ ! -f "$confdir/lib/zsh/sources" ]] && exit 1
+
+[[ $(find "$confdir/lib/zsh" | wc -l) -gt 10 ]] || exit 1
+
+./fffs zsh update
+
+[[ -f "$pluginfile-bck" ]] && mv $pluginfile{-bck,}
+./fffs zsh init