[NEW] sysutils/gitwatch: Bash script to watch a file or folder and commit changes to a git repo

A bash script to watch a file or folder and commit changes to a git repo
What to use it for?

* config files: some programs auto-write their config files, without waiting
for you to click an 'Apply' button; or even if there is such a button, most
programs offer you no way of going back to an earlier version of your settings.
If you commit your config file(s) to a git repo, you can track changes and go
back to older versions. This script makes it convenient, to have all changes
recorded automatically.
* document files: if you use an editor that does not have built-in git support
(or maybe if you don't like the git support it has), you can use gitwatch to
automatically commit your files when you save them, or combine it with the
editor's auto-save feature to fully automatically and regularly track your
changes.

WWW: https://github.com/gitwatch/gitwatch

Sponsored by:	Bounce Experts
This commit is contained in:
Muhammad Moinur Rahman 2020-11-16 01:15:03 +00:00
parent fbefd3f149
commit ed12d78caf
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=555439
6 changed files with 224 additions and 0 deletions

View File

@ -430,6 +430,7 @@
SUBDIR += geteltorito
SUBDIR += getssl
SUBDIR += gigolo
SUBDIR += gitwatch
SUBDIR += gkfreq
SUBDIR += gkleds2
SUBDIR += gkrellflynn

View File

@ -0,0 +1,33 @@
# Created by: Muhammad Moinur Rahman <bofh@FreeBSD.org>
# $FreeBSD$
PORTNAME= gitwatch
DISTVERSION= 0.1.a.20200814
CATEGORIES= sysutils
MAINTAINER= bofh@FreeBSD.org
COMMENT= Bash script to watch a file or folder and commit changes to a git repo
LICENSE= GPLv3
LICENSE_FILE= ${WRKSRC}/LICENSE
RUN_DEPENDS= bash>0:shells/bash \
git:devel/git@lite \
inotifywait:sysutils/inotify-tools
USES= shebangfix
USE_GITHUB= yes
USE_RC_SUBR= ${PORTNAME}
GH_TAGNAME= e62df74
SHEBANG_FILES= ${WRKSRC}/${PORTNAME}.sh
NO_ARCH= yes
NO_BUILD= yes
PLIST_FILES= bin/${PORTNAME}
do-install:
${INSTALL_SCRIPT} ${WRKSRC}/${PORTNAME}.sh ${STAGEDIR}${PREFIX}/bin/${PORTNAME}
.include <bsd.port.mk>

View File

@ -0,0 +1,3 @@
TIMESTAMP = 1605403644
SHA256 (gitwatch-gitwatch-0.1.a.20200814-e62df74_GH0.tar.gz) = d66d9fa89619a693c3441dbf59ddd11fa4048f85f63194452a68024d75aa3b8a
SIZE (gitwatch-gitwatch-0.1.a.20200814-e62df74_GH0.tar.gz) = 21889

View File

@ -0,0 +1,43 @@
#!/bin/sh
#
# $FreeBSD:$
#
# PROVIDE: gitwatch
# REQUIRE: DAEMON
# KEYWORD: shutdown
#
# gitwatch_enable (bool): Set it to "YES" to enable gitwatch
# Default is "NO".
#
# gitwatch_targets (path): Set the path to the target directory
# Default is %%PREFIX%%/etc. Multiple targets can be separated by spaces
#
. /etc/rc.subr
name="gitwatch"
rcvar="gitwatch_enable"
start_cmd="${name}_start"
load_rc_config $name
: ${gitwatch_enable:=NO}
: ${gitwatch_targets:="%%PREFIX%%/etc"}
: ${gitwatch_args:="-l 10"}
command="%%PREFIX%%/bin/${name}"
command_interpreter="%%PREFIX%%/bin/bash"
command_args="${gitwatch_args}"
PATH="${PATH}:%%PREFIX%%/bin"
gitwatch_start() {
# Start a gitwatch for each target
for TARGET in ${gitwatch_targets}; do
${command} ${command_args} "${TARGET}" >/dev/null &
done
}
run_rc_command "$1"

View File

@ -0,0 +1,127 @@
--- gitwatch.sh.orig 2020-11-15 05:05:21 UTC
+++ gitwatch.sh
@@ -43,6 +43,9 @@ COMMITMSG="Scripted auto-commit on change (%d) by gitw
LISTCHANGES=-1
LISTCHANGES_COLOR="--color=always"
GIT_DIR=""
+GIT="$(which git)"
+INW="$(which inotifywait)";
+EVENTS="${EVENTS:-close_write,move,move_self,delete,create,modify}"
# Print a message about how to use this script
shelp () {
@@ -97,12 +100,6 @@ shelp () {
echo "It is therefore recommended to terminate the script before changing the repo's"
echo "config and restarting it afterwards."
echo ""
- echo "By default, gitwatch tries to use the binaries \"git\" and \"inotifywait\","
- echo "expecting to find them in the PATH (it uses 'which' to check this and will"
- echo "abort with an error if they cannot be found). If you want to use binaries"
- echo "that are named differently and/or located outside of your PATH, you can define"
- echo "replacements in the environment variables GW_GIT_BIN and GW_INW_BIN for git"
- echo "and inotifywait, respectively."
}
# print all arguments to stderr
@@ -118,11 +115,6 @@ cleanup () {
exit 0
}
-# Tests for the availability of a command
-is_command () {
- hash "$1" 2>/dev/null
-}
-
###############################################################################
while getopts b:d:h:g:L:l:m:p:r:s:e: option # Process command line options
@@ -149,65 +141,20 @@ if [ $# -ne 1 ]; then # If no command line arguments a
exit # and exit
fi
-# if custom bin names are given for git or inotifywait, use those; otherwise fall back to "git" and "inotifywait"
-if [ -z "$GW_GIT_BIN" ]; then GIT="git"; else GIT="$GW_GIT_BIN"; fi
-
-if [ -z "$GW_INW_BIN" ]; then
- # if Mac, use fswatch
- if [ "$(uname)" != "Darwin" ]; then
- INW="inotifywait";
- EVENTS="${EVENTS:-close_write,move,move_self,delete,create,modify}"
- else
- INW="fswatch";
- # default events specified via a mask, see
- # https://emcrisostomo.github.io/fswatch/doc/1.14.0/fswatch.html/Invoking-fswatch.html#Numeric-Event-Flags
- # default of 414 = MovedTo + MovedFrom + Renamed + Removed + Updated + Created
- # = 256 + 128+ 16 + 8 + 4 + 2
- EVENTS="${EVENTS:---event=414}"
- fi;
-else
- INW="$GW_INW_BIN";
-fi
-
-# Check availability of selected binaries and die if not met
-for cmd in "$GIT" "$INW"; do
- is_command "$cmd" || { stderr "Error: Required command '$cmd' not found." ; exit 1; }
-done
-unset cmd
-
###############################################################################
SLEEP_PID="" # pid of timeout subprocess
trap "cleanup" EXIT # make sure the timeout is killed when exiting script
-
# Expand the path to the target to absolute path
-if [ "$(uname)" != "Darwin" ]; then
- IN=$(readlink -f "$1")
-else
- if is_command "greadlink"; then
- IN=$(greadlink -f "$1")
- else
- IN=$(readlink -f "$1")
- if [ $? -eq 1 ]; then
- echo "Seems like your readlink doesn't support '-f'. Running without. Please 'brew install coreutils'."
- IN=$(readlink "$1")
- fi
- fi;
-fi;
+IN=$(readlink -f "$1")
-
if [ -d "$1" ]; then # if the target is a directory
TARGETDIR=$(sed -e "s/\/*$//" <<<"$IN") # dir to CD into before using git commands: trim trailing slash, if any
# construct inotifywait-commandline
- if [ "$(uname)" != "Darwin" ]; then
- INW_ARGS=("-qmr" "-e" "$EVENTS" "--exclude" "'(\.git/|\.git$)'" "\"$TARGETDIR\"")
- else
- # still need to fix EVENTS since it wants them listed one-by-one
- INW_ARGS=("--recursive" "$EVENTS" "--exclude" "'(\.git/|\.git$)'" "\"$TARGETDIR\"")
- fi;
+ INW_ARGS=("-qmr" "-e" "$EVENTS" "--exclude" "'(\.git/|\.git$)'" "\"$TARGETDIR\"")
GIT_ADD_ARGS="--all ." # add "." (CWD) recursively to index
GIT_COMMIT_ARGS="" # add -a switch to "commit" call just to be sure
@@ -215,11 +162,7 @@ elif [ -f "$1" ]; then # if the target is a single fil
TARGETDIR=$(dirname "$IN") # dir to CD into before using git commands: extract from file name
# construct inotifywait-commandline
- if [ "$(uname)" != "Darwin" ]; then
- INW_ARGS=("-qm" "-e" "$EVENTS" "$IN")
- else
- INW_ARGS=("$EVENTS" "$IN")
- fi
+ INW_ARGS=("-qm" "-e" "$EVENTS" "$IN")
GIT_ADD_ARGS="$IN" # add only the selected file to index
GIT_COMMIT_ARGS="" # no need to add anything more to "commit" call
@@ -260,6 +203,8 @@ if [ -n "$REMOTE" ]; then # are we pushing to a remote
PUSH_CMD="$GIT push $REMOTE $BRANCH"
fi
fi
+elif [ -n $($GIT config --get remote.origin.url) ] ; then
+ PUSH_CMD="$GIT push"
else
PUSH_CMD="" # if not remote is selected, make sure push command is empty
fi

View File

@ -0,0 +1,17 @@
A bash script to watch a file or folder and commit changes to a git repo
What to use it for?
* config files: some programs auto-write their config files, without waiting
for you to click an 'Apply' button; or even if there is such a button, most
programs offer you no way of going back to an earlier version of your settings.
If you commit your config file(s) to a git repo, you can track changes and go
back to older versions. This script makes it convenient, to have all changes
recorded automatically.
* document files: if you use an editor that does not have built-in git support
(or maybe if you don't like the git support it has), you can use gitwatch to
automatically commit your files when you save them, or combine it with the
editor's auto-save feature to fully automatically and regularly track your
changes.
WWW: https://github.com/gitwatch/gitwatch