Subversion és a taskwarrior

vagy bármelyik verziókezelővel

Ha a taskwarrior-ral kezeljük a teendőinket, könnyen felmerülhet, hogy a fájlokat verziókezelővel is kövessük. Ha nem akarjuk minden egyes task-futtatás után a megfelelő verziókezelő commit-ját is futtatni, azaz automatikusan akarjuk a verziókezelést, akkor a hook lehetőség jöhet szóba.

Az ~/.task/hooks/on-add a hozzáadás előtt, az ~/.task/hooks/on-modify a módosítás előtt fut le, így a verziókezelő (subversion, git, stb.) az ~/.task/hooks/on-exit-ben kell, hogy lefusson.

Az ~/.task/hooks/on-add és az ~/.task/hooks/on-modify szkriptek létrehozzák a commit_msg fájlt, ami a verziókezelő commit-üzenete lesz.

A szkriptek futásához szükség van a jq programra.

A ~/.task/hooks/on-add fájl:

#!/bin/sh

read new_task
echo ${new_task} | jq -rM '"Hozzáadás: "+.description' > ~/.task/commit_msg
echo ${new_task} | jq -rM '"UUID: "+.uuid' >> ~/.task/commit_msg

echo ${new_task}

A ~/.task/hooks/on-modify fájl:

#!/bin/sh


read old_task
read new_task

COMMIT_MSG=~/.task/commit_msg

status="$(echo "${new_task}" | jq -rM ".status")"
: > ${COMMIT_MSG}

if [ "${status}" == "deleted" ]; then
  echo ${new_task} | jq -rM '"Törlés: "+.description' >> ${COMMIT_MSG}
elif [ "${status}" == "completed" ]; then
  echo ${new_task} | jq -rM '"Teljesítve: "+.description' >> ${COMMIT_MSG}
else
  printf "Módosítás: " >> ${COMMIT_MSG}
  differfields=""
  for field in description due project; do
    old=$(echo ${old_task} | jq ".${field}")
    new=$(echo ${new_task} | jq ".${field}")
    differ=$(printf "%s\n%s\n" "${old}" "${new}" | uniq | wc -l)
    [ "${differ}" -ne 1 ] && differfields="${differfields} ${field}"
  done
  echo "${differfields}" >> ${COMMIT_MSG}
fi

echo ${new_task} | jq -rM '"UUID: "+.uuid' >> ${COMMIT_MSG}

echo ${new_task}

A ~/.task/hooks/on-exit fájl:

#!/bin/sh

read new_task

cd ~/.task
if [ -s commit_msg ]; then
  svn commit -q -F commit_msg *.data
  svn up -q
fi
: > commit_msg

exit 0

Természetesen más verziókezelő is használható, az ~/.task/hooks/on-exit fájlban a megfelelő módosításokat végrehajtva.