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

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