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:
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-push
gancho (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\""