#!/bin/bash # # Check the overall status of your work. # # Parameters BASENAME="`basename $0`" # Usage function status_usage { echo "usage: $BASENAME [-l|--long] [-d|--delay N] [project]" if [ -z "$1" ]; then exit 1 else exit $1 fi } # See https://stackoverflow.com/questions/2721946/cross-platform-getopt-for-a-shell-script#4300224 function status_options { getopt -T > /dev/null if [ $? -eq 4 ]; then # GNU enhanced getopt is available ARGS=`getopt --name "$BASENAME" --long loop,delay: --options ld: -- "$@"` else # Original getopt is available (no long option names, no whitespace, no sorting) ARGS=`getopt ld: "$@"` fi if [ $? -ne 0 ]; then echo "$BASENAME: usage error" >&2 status_usage 2 fi eval set -- $ARGS while [ $# -gt 0 ]; do case "$1" in l|--loop) LOOP="yes";; d|--delay) DELAY="$2" shift;; --) shift break;; *) status_usage ;; esac shift done if [ $# -gt 0 ]; then PROJECT="$1" shift fi } # Calculate timestamp delta from a file function status_file_changed_delta { local file="$1" if [ -z "$file" ] || [ ! -e "$file" ]; then echo 0 fi local file_timestamp="`stat -c '%Z' $file`" local timestamp="`date +%s`" echo $(( timestamp - file_timestamp )) } # Run command if a file is older than a given number of seconds function status_run_if_file_older_than { local file="$1" local interval="$2" local run="0" shift 2 # Run command if there's still no file to test if [ ! -e "$file" ]; then run="1" else local age="`status_file_changed_delta $file`" local interval="3600" # Run command only when file is older or equal the interval if (( $age >= $interval )); then run="1" fi fi # Run if criteria matches if [ "$run" == "1" ]; then $* fi } # Run status function status_run { if [ ! -z "$PROJECT" ]; then # Check the status of the given project cd $PROJECT &> /dev/null && git status elif git status &> /dev/null; then # Check the status of the current project mr status else # Ensure we are in the home folder cd # Check your reminders if which remind &> /dev/null && [ -e "$HOME/.reminders" ]; then remind ~/.reminders | grep -iv '^no reminders.$' # | tr '[:upper:]' '[:lower:]' fi # Update your mrconfig and check all registered repositories if which mr &> /dev/null; then local mrconfig="$HOME/.custom/mrconfig-automatic" status_run_if_file_older_than $mrconfig 3600 mrconfig-updater # Pipe through cat so we don't have to deal with mr's dynamic output weirdness #mr -m status | cat # Replace eventual "/mnt/crypt/home/$USER" with "~/" from output # Piping through sed also handles mr's dynamic output weirdness mr -m status | sed -e "s|/mnt/crypt/home/$USER/|~/|" -e "s|$HOME|~|" fi # Use this as an opportunity to save our configs if which git-config-save &> /dev/null; then git config-save --sometimes &> /dev/null fi # Check your TODO lists, filtering only important tasks # Convention here is to use uppercase "IMPORTANT", to be explicit and avoid false positives todo list IMPORTANT # Collected items that need to be moved somewhere else #collector count collector list # Check if you have mails to send postponed # Check unread mails unread-mails # Alarms set #xalarm list # Check for spool files if [ -e "$HOME/temp/log/spool.md" ] && [ "`wc -l $HOME/temp/log/spool.md | cut -d ' ' -f 1`" != "0" ]; then echo "Spool file not empty: $HOME/temp/log/spool.md" fi # Check if are dangling downloaded files if [ -e "$HOME/load" ] && [ ! -z "`ls -1 ~/load/`" ]; then # Print a newline if needed depending of the output of the previous commands if [ ! -z "`postponed`" ] || [ ! -z "`unread-mails`" ] || [ ! -z "`collector list`" ]; then echo "" fi echo "Dangling files at ~/load:" echo "" ls -lh ~/load/ fi fi } # Options status_options $@ # Dispatch if [ "$LOOP" == "yes" ]; then PROJECT="" if [ -z "$DELAY" ]; then DELAY="60" fi while true; do clear status_run sleep $DELAY done else status_run fi