Posted at

npm versionのように簡単にgitのタグを使ってセマンティックにバージョンアップをするワンライナー

OSSや多人数でのプロジェクト開発をしているときに必要になってくるのは、プロジェクト自体のセマンティックなバージョン管理かと思います。

特にインストール型のプロジェクトでは、現在のユーザのバージョンと比較して、インストールさせるべきか、させる場合はどういうメッセージを出すかなどを判断するのに、メジャーバージョンやマイナーバージョン、パッチバージョンなどのバージョンを比較しているかと思います。

npmであれば、npm versionを使うと、Node.jsをもちいたパッケージのバージョンアップを簡単にできる様になっているかと思います。

ただ、そういった機能が備わっていない言語の管理やパッケージ管理ツールを使っていないプロジェクトなどでは独自にセマンティックバージョンを管理する必要があり、それを毎回最新のタグをみて更新するのは面倒かと思うので、ワンライナーで簡単に管理できるようにしました。


導入方法

まず、下記のシェルスクリプトをどこかに配置します。

著者はzshを使っているので、~/.zsh/version_up.shに設定しています。

#!/bin/sh

version=`awk '{print $1}' < /dev/stdin`
command=$1
major=`echo $version | awk -F '.' '{print $1}'`
minor=`echo $version | awk -F '.' '{print $2}'`
bugfix=`echo $version | awk -F '.' '{print $3}'`
build=`echo $version | awk -F '.' '{print $4}'`

if [ -z "$version" ]; then
echo "USAGE: echo 1.0.0 | version_up.sh [major|minor|bugfix|build]"
exit 1
fi

if [ "$command" = '' ]; then
if
[ -n "$build" ]; then
build=`expr $build + 1`
elif [ -n "$bugfix" ]; then
bugfix=`expr $bugfix + 1`
fi
elif
[ "$command" = 'major' ]; then
major=`expr $major + 1`
minor=0
bugfix=0
build=0
elif [ "$command" = 'minor' ]; then
minor=`expr $minor + 1`
bugfix=0
build=0
elif [ "$command" = 'bugfix' ]; then
bugfix=`expr $bugfix + 1`
build=0
elif [ "$command" = 'build' ]; then
build=`expr $build + 1`
fi

if [ "$command" = "major" -o "$command" = 'minor' -o "$command" = 'bugfix' ]; then
if
[ -n "$build" ]; then
build=0
fi
fi

if [ -n "$build" ]; then
echo ${major}.${minor}.${bugfix}.${build}
else
echo ${major}.${minor}.${bugfix}
fi

次に~/.zshrc内部に下記スクリプトを記載します。

alias vup="git tag -l | tail -n 1 | sed 's/[^0-9\.]//g' | ~/.zsh/version_up.sh" # version up string

最後に下記のコマンドで実行するだけです。

$ git tag -l

v1.6.1
$ vup major
2.0.0.0
$ vup minor
1.7.0.0
$ vup bugfix
1.6.2.0

あとはこの出力されたバージョンを使ってタグを生成してもいいし、何かしらのファイルに出力するのでもいいと思います。