ports/sysutils/gitwatch/files/patch-gitwatch.sh
Muhammad Moinur Rahman ed12d78caf [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
2020-11-16 01:15:03 +00:00

127 lines
4.7 KiB
Bash

--- 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