Sincronize a versão do aplicativo com a tag Git automaticamente!

Ao desenvolver um aplicativo, precisamos rastrear a versão dele. Em meu trabalho, eu defini uma string no código e o usuário pode consultá-la por meio de alguma opção de comando como a seguir:

<command> -v

Ao mesmo tempo, a versão dos códigos deve ser controlada por um software de controle de versão. Eu prefiro Git. No Git, há um subcomando que permite marcar o commit, por isso é perfeito definir a versão usando-o para mostrar o progresso do desenvolvimento:

Cenário

Mas às vezes eu fiz uma tag mas esqueci de atualizar a versão, então seria ótimo que a tag e a versão pudessem ser sincronizadas. Eu pesquisei e escrevi um pre-pushgancho (não se esqueça de torná-lo executável!) Para fazer o trabalho sujo para mim:

#!/bin/bash

REPO_DIR
=$(pwd)
CODE
=$REPO_DIR/src/codemate/operator/Master.java

# check the latest tag
LATEST_TAG
=$(git tag -l | tail -n 1)

# check the version number in code
LATEST_VERSION
=$(awk -F '"' '/String version/ { print $2; }' $CODE)

# compare
if [[ $LATEST_TAG != $LATEST_VERSION ]]; then
echo
"[Warning]: The latest tag ($LATEST_TAG) does not equal" \
"the latest version number ($LATEST_VERSION) in code!"
echo
"[Notice]: Be CLEAR-HEADED! Use tag (0) or version number (1)?"
read
-p '[0/1] > ' ans
if [[ $ans == 0 ]]; then
echo
"[Notice]: Change the version number in code."
awk
-F '"' -v tag=$LATEST_TAG '/String version/ {
sub($2, tag);

print;

} !/String version/ {

print;

}'
$CODE > tmp
mv tmp $CODE

git
add $CODE
DIR
=$REPO_DIR/products/installer
echo
"[Notice]: Building installer"
cd $DIR

./build.sh
cd $REPO_DIR

for file in $(ls $DIR/payload); do
git
add $DIR/payload/$file
done
git
add $DIR/codemate.installer
git commit
-m "Update version number to $LATEST_TAG"
git tag
-f $LATEST_TAG
elif [[ $ans == 1 ]]; then
echo
"[Notice]: Retag to the new commit."
git tag $LATEST_VERSION

else
echo
"[Error]: Unknown input \"$ans\""