-
-
Save adriancmiranda/a2db734e28a7ec1615e23fb734380632 to your computer and use it in GitHub Desktop.
prepare-commit-msg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/zsh | |
# Author: "Emir Herrera" <[email protected]> | |
# Donations: http://paypal.me/emirhg | |
# | |
# A GIT Hook to Pregenerate a Commit Message with an elapsed working time taken from the time tracker ActivityWatch. A `ref #123 @1.h` message like is generated taking the activity number from the branch name and te time from ActivityWatch Web API. Requires JQ in order to add all the events recorded by ActivityWatch | |
# | |
# Usage: | |
# | |
# copy this file under "${GIT_WORKING_TREE}/.git/hooks/prepare-commit-msg and set execution permitions | |
# | |
# Requirements: | |
# | |
# ActivityWatch (https://activitywatch.net/) | |
# JQ (https://stedolan.github.io/jq/) | |
# OpenProject (Optional - https://www.openproject.org/) | |
# Zenity (https://gitlab.gnome.org/GNOME/zenity) | |
# | |
# It uses OpenProject commit message format (1) | |
# to register working time & costs assosiated to a work package | |
# Working time is the result of the recorded activity on the host since the last commit. | |
# in case the file /tmp/check-in-work exists, it uses that timestamp for the working window | |
# The events can be manually selected, with a preset test filter in order to exclude certain applications. The dialog is handled by Zenity. | |
# The tracked activities set is defined by the check-in-work file | |
# | |
# References: | |
# | |
# (1) OpenProject Documentation, 12/November/2020 - https://docs.openproject.org/user-guide/time-and-costs/time-tracking/#logging-time-via-commit-message | |
# | |
# This script is distributed as it is without any warranty. | |
COMMIT_MSG_FILE=$1 | |
COMMIT_SOURCE=$2 | |
SHA1=$3 | |
TMP_DATA_FILE='/tmp/activitywatch-last-commit-events.json' | |
LAST_TIMESTAMP=`cat /tmp/check-in-work 2>/dev/null` | |
# Only if the COMMIT_SOURCE is different of an existing commit, append teh activity data | |
if [ "${COMMIT_SOURCE}" != "commit" ]; then | |
if [ -z $LAST_TIMESTAMP ] | |
then | |
LAST_TIMESTAMP=$(git --no-pager log --branches -n1 --format=%ad --date=format:'%Y-%m-%dT%H:%M:%S%z' --author=`git config user.email`) | |
fi | |
curl -sX GET "http://localhost:5600/api/0/buckets/aw-watcher-window_neuron/events?start=${LAST_TIMESTAMP}" -H "accept: application/json" -o $TMP_DATA_FILE | |
# Select activities | |
EXCLUSIONS='"(Private Browsing)|Facebook"' | |
SELECTED_EVENTS=(); | |
while IFS= read -r line; do [[ ! -z "$line" ]] && SELECTED_EVENTS+="$line" || SELECTED_EVENTS+=" " | |
done < <(jq -r "to_entries|map([\"\(\"\(.value.data.app) \(.value.data.title)\" | test(${EXCLUSIONS}) | not )\", .key, \"\(.value.data.app)\", \" \(.value.data.title)\", .value.timestamp, .value.duration]) | .[][]" $TMP_DATA_FILE) | |
FILTER=$(zenity --list --checklist --width=1080 --height=450 \ | |
--column="Reportar" \ | |
--column="Índice" \ | |
--column="Aplicación" \ | |
--column="Título" \ | |
--column="Hora" \ | |
--column="Duracion" \ | |
--hide-column=2 --separator=',' $SELECTED_EVENTS) | |
# An error pops up when running `git rebase` | |
# The error should not occur anymore | |
ELAPSED_TIME=$(jq "[.[$FILTER]] | map(.duration) | add | . / 3600" $TMP_DATA_FILE) | |
echo $ELAPSED_TIME | |
COMMENTED_ACTIVITY=$(jq "[.[${FILTER}]] | map({app:.data.app, title: .data.title, duration: .duration})" $TMP_DATA_FILE | sed 's/^/# /') | |
# An error pops up when running `git rebase` | |
# The error should not occur anymore | |
TASK_NUMBER=$(git symbolic-ref HEAD | sed -n -e "s/.*\/\(feature\|hotfix\|bugfix\|warmfix\)\/[a-zA-Z]*[^0-9]*\([0-9]\+\).*/\2/p") | |
if [ ! -z $TASK_NUMBER ]; then | |
TASK_MESSAGE="refs #${TASK_NUMBER} "; | |
if [ ! -z $ELAPSED_TIME ]; then | |
ELAPSED_TIME_MESSAGE="@${ELAPSED_TIME} since ${LAST_TIMESTAMP}" | |
fi | |
fi | |
if [ "${COMMIT_SOURCE}" = "message" ]; then | |
echo "${TASK_MESSAGE}${ELAPSED_TIME_MESSAGE}" >> $COMMIT_MSG_FILE | |
else | |
echo "${COMMENTED_ACTIVITY}" >> $COMMIT_MSG_FILE | |
echo "${TASK_MESSAGE}${ELAPSED_TIME_MESSAGE}\n$(cat $COMMIT_MSG_FILE)" > $COMMIT_MSG_FILE | |
fi | |
>/tmp/check-in-work | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment