git-commit: move the code into smaller functions
authorDenis Ovsienko <denis@ovsienko.info>
Thu, 3 Jan 2019 13:14:24 +0000 (13:14 +0000)
committerDenis Ovsienko <denis@ovsienko.info>
Thu, 3 Jan 2019 17:45:49 +0000 (17:45 +0000)
[skip ci]

gateways/git-commit

index da2a0f3..dcb095b 100755 (executable)
@@ -49,6 +49,55 @@ ENDOFMESSAGE
        exit 1
 }
 
+assert_nonempty_option()
+{
+       if [ -z "$2" ]; then
+               echo "$THISFILE: missing option $1" >&2
+               usage_and_exit
+       fi
+}
+
+git_pull_or_exit()
+{
+       git pull --quiet || {
+               echo "$THISFILE: failed to run 'git pull' (rc=$?)" >&2
+               exit 2
+       }
+}
+
+git_push_or_exit()
+{
+       git push --quiet || {
+               echo "$THISFILE: failed to run 'git push' (rc=$?)" >&2
+               exit 5
+       }
+}
+
+git_commit_or_exit()
+{
+       # git processes the path to the file automatically, but the shell
+       # redirection obviously does not.
+       DIRNAME=`dirname "$FILEPATH"`
+       [ -d "$DIRNAME" ] || mkdir -p "$DIRNAME"
+
+       # New file contents is on stdin.
+       cat > "$FILEPATH" || {
+               echo "$THISFILE: failed to write new file contents, trying to roll back." >&2
+               git checkout --quiet -- "$FILEPATH" || {
+                       echo "$THISFILE: failed to run 'git checkout' after a write error." >&2
+                       exit 4
+               }
+               exit 3
+       }
+
+       # git-diff exits with 0 if the file is not in the repository.
+       if ! git cat-file -e HEAD:"$FILEPATH" 2>/dev/null || ! git diff --quiet -- "$FILEPATH"; then
+               git add -- "$FILEPATH"
+               git commit --quiet --message="$COMMITMSG" ${AUTHOR:+--author="$AUTHOR"} -- "$FILEPATH"
+               git_push_or_exit
+       fi
+}
+
 # Both callScript() and GNU getopt support both short and long option formats.
 # However, use of any getopt normally implies shift, which unsets the $@
 # special parameter and makes it impossible or difficult to pass properly
@@ -85,45 +134,16 @@ while getopts u:r:f:m:a: opt; do
 done
 : ${COMMITMSG:=update $FILEPATH}
 
-if [ -z "$SUDOUSER" -o -z "$REPODIR" -o -z "$FILEPATH" ]; then
-       echo "$THISFILE: not all mandatory parameters are present" >&2
-       usage_and_exit
-fi
-
+assert_nonempty_option -u "$SUDOUSER"
 [ `whoami` = "$SUDOUSER" ] || {
        sudo --non-interactive --set-home --user="$SUDOUSER" -- "$0" "$@"
        exit $?
 }
 
+assert_nonempty_option -r "$REPODIR"
+assert_nonempty_option -f "$FILEPATH"
 cd "$REPODIR"
-git pull --quiet || {
-       echo "$THISFILE: failed to run 'git pull' (rc=$?)" >&2
-       exit 2
-}
-
-# git processes the path to the file automatically, but the shell
-# redirection obviously does not.
-DIRNAME=`dirname "$FILEPATH"`
-[ -d "$DIRNAME" ] || mkdir -p "$DIRNAME"
-
-# New file contents is on stdin.
-cat > "$FILEPATH" || {
-       echo "$THISFILE: failed to write new file contents, trying to roll back." >&2
-       git checkout --quiet -- "$FILEPATH" || {
-               echo "$THISFILE: failed to run 'git checkout' after a write error." >&2
-               exit 4
-       }
-       exit 3
-}
-
-# git-diff exits with 0 if the file is not in the repository.
-if ! git cat-file -e HEAD:"$FILEPATH" 2>/dev/null || ! git diff --quiet -- "$FILEPATH"; then
-       git add -- "$FILEPATH"
-       git commit --quiet --message="$COMMITMSG" ${AUTHOR:+--author="$AUTHOR"} -- "$FILEPATH"
-       git push --quiet || {
-               echo "$THISFILE: failed to run 'git push' (rc=$?)" >&2
-               exit 5
-       }
-fi
+git_pull_or_exit
+git_commit_or_exit
 
 exit 0