Автоматическое добавление версии в исходники (не обязательно Python) - GIT hook

Задача

Удобно всегда знать точную версию приложения, с которым ты имеешь дело.

Когда речь о передаче приложения по цепочке разработки (в отдел тестирования, на демо и продуктовую площадки) всегда есть точная версия. Но ее ставят руками в том или ином виде (например, как git tag в ветке релизов).

Когда речь идет о внутреннем сервере разработке, или собранной вами для отладки версии приложения, нереально не забывать каждый раз менять версию.

Чтобы версия проставлялась автоматически можно использовать git hooks. Это скрипты, работающие локально на вашем компьютере. Они вызываются из git при соотвествующих событиях, например, перед комитом.

Показанный ниже скрипт (назовите его git_hook_hook_pre_commit.sh) сохраняет в файл дату и время последнего комита и добавляет этот файл в комит.

#!/usr/bin/env bash
FILE=build_timestamp
date "+%F %T" > "$FILE"

Скрипт (назовите его git_hook_hook_post_commit.sh) добавляет этот файл в комит.

#!/usr/bin/env bash
FILE=build_timestamp
git add "$FILE"
git commit --amend -C HEAD --no-verify

Предполагается, что файл с датой оказывается внутри ваших исходников и они могут им воспользоваться.

Ниже пример Python кода, считывающего эту версию из файла.

Далее вы можете использовать ее в вашем приложении, например, чтобы отображать в диалоге О программе или возвращать в вызове API /version.

def version():
    try:
        return open('build_timestamp', 'r').read().strip()
    except:
        return None


if __name__ == '__main__':
    print(version())

Из соображений безопасности эти скрипты (git hooks) никогда не установливаются автоматически при скачивании репозитория, их всегда надо устанавливать явно.

Ниже показан скрипт, устанавливающий показанные выше скрипты как pre-comit & post-commit git hooks.

#!/usr/bin/env bash
if [ ! -f .git/hooks/pre-commit ] ; then
    ln -s $PWD/git_hook_pre_commit.sh .git/hooks/pre-commit
    ln -s $PWD/git_hook_post_commit.sh .git/hooks/post-commit
fi