Calendar Versioningを扱うパッケージ/ツールとしてcalverを作った

提供する機能とは関係なくリリースを定期的に実施するようなプロダクトや、バージョンにSemantic Versioning(以下SemVer)のような意味付けがしにくいプロダクトの場合、バージョン管理手法にCalendar Versioning(以下、CalVer)というものが採用されることがあります。

calver.org

例えば、CalVerのサイトに掲載されているケーススタディで私が知っていたものとしてはUbuntuのバージョニング( YY.0M.MICRO )があります。 22.04 とか 22.10 とかのアレです。

そしてちょうど私がバージョニングしたいプロダクトも

  • 1ヶ月に1度定期的にリリースしたい
  • しかし、なにかしらの要因で1ヶ月に1度以上リリースすることがある

というものでSemVerではない気がするし、とは言え単純に 年月 でバージョニングすると同月リリースがあるとバージョンがかぶることがあるということでCalVerを採用することにしました。

そして、CalVerを操作するパッケージやツールを探したのですが微妙に用途にあわなかったため、車輪の再発明ですが作りました。

calver

github.com

calver はGoのパッケージでありツールであるのですが、多くはツールとしての利用することが多いと思うのでツールとしての calver の紹介をします。

CalVerのバージョンの管理方式は1つではありません。なので calver ではまずバージョンレイアウトを指定します。

$ date
Mon May 15 13:01:27 UTC 2023
$ calver --layout YYYY.0M.MICRO
2023.05.0
$ calver --layout YY.MM
23.5

指定できるパーツはCalVerのSchemaの項に掲載されているものが使用できます。

次のバージョン

そしてCalVerの特徴的なものが「次のバージョン」です。

レイアウトが YYYY.MM.MICRO、 カレントバージョンが 2023.4.0、現在の日付が2023年4月だった場合、次のバージョンは 2023.4.1 になります。 ところが、レイアウトが YYYY.MM.MICRO、 カレントバージョンが 2023.4.0、現在の日付が2023年5月だった場合、次のバージョンは 2023.5.0 になります。

日付表記のバージョンが被った場合のみ、数値バージョンの部分がインクリメントされるのです。

calver では対象となるバージョンと --next オプションを付与することで次バージョンを計算できます。

$ date
Tue May  9 13:04:09 UTC 2023
$ calver --layout YY.0M.MICRO
23.5.0
# 対象となるバージョンを標準入力もしくは引数で与えることができる
$ calver --layout YY.0M.MICRO | calver --layout YY.0M.MICRO --next 
23.5.1

最新のバージョン

「次のバージョン」の元となるバージョンは「最新のバージョン」です。

calver は標準入力もしくは引数で複数のバージョンを与えると、最新のバージョンを取得し表示します。また、その中に指定のレイアウトに合致しないバージョン文字列があっても無視します。

具体的には次のようにバージョニングされたリリース群に対して使うことを想定しています。

$ date
Tue May  9 13:04:09 UTC 2023
$ gh release list | cut -f 1
v1.1.2
v1.1.1
2023.05.1
2023.05.0
v1.1.0
v1.0.1
2023.03.1
2023.03.0
v1.0.0
2023.02.0
v0.1.0
$ gh release list | cut -f 1 | calver --layout YY.0M.MICRO
2023.05.1
$ gh release list | cut -f 1 | calver --layout YY.0M.MICRO --next
2023.05.2

--trim-suffix

UbuntuのCalVerのレイアウトは YY.0M.MICRO らしいです。ただし、 MICROバージョンが 0 の場合は末尾の .0 が省略されます。

それを実現するオプションとして --trim-suffix を用意しています。

$ date
Tue May  9 13:04:09 UTC 2023
$ calver --layout YY.0M.MICRO --trim-suffix
2023.05
$ calver --layout YY.0M.MICRO --trim-suffix | calver --layout YY.0M.MICRO --trim-suffix --next
2023.05.1

MODIFIERバージョンを特別に扱ったりなど、かなり用途に沿った実装をしたつもりです。

というわけで

もしCalVerを使う機会がありましたらcalverを検討してみてください。