リリース修飾子のところは差異がある。
参考
- https://stackoverflow.com/questions/11887762/how-do-i-compare-version-numbers-in-python/21065570
- PEP 386
- PEP 440
- semver
各種バージョニング書式
[N!]N(.N)*[{a|b|rc}N][.postN][.devN]
N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN]
^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)\.(?P<patch>0|[1-9]\d*)(?:-(?P<prerelease>(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$
分析
リリース修飾子が異なる。alpha
,beta
,rc
など。echo -e '0.9\n0.10' | sort -Vr
semver
0.0.1-alpha.1
pep
0.0.1a1
リリース修飾子があると期待どおりにならない。
echo -e '0.9\n0.10' | sort -Vr echo -e '0.1\n0.9\n0.9.a\n0.9.a.9\n0.9.a.10\n0.10' | sort -Vr echo -e '0.1\n0.9\n0.9a\n0.9a9\n0.9a10\n0.10' | sort -Vr
0.10 0.9.a.10 0.9.a.9 0.9.a 0.9 0.1
0.10 0.9a10 0.9a9 0.9a 0.9 0.1
期待値は以下。アルファベットが含まれているものは古いものとしてほしい。
0.10 0.9 0.1 0.9.a 0.9.a.9 0.9.a.10
この処理が難しそう。バージョニングの規格によって相当異なる。よって、N.N.N
のように数値だけにしたほうが無難。
簡単にできないか考えてみたがダメっぽい
alpha
などのリリース修飾子を簡単にソートできる方法はないか考えてみた。
アルファ版とかの前に数値いらなくない? 以下みたいにしたらダメなの?
alpha.0.0.1 beta.0.0.1 rc.0.0.1
と思ったがダメ。
echo -e "0.1\na.0.1\n0.10\na.0.10\nb.0.1\nb.0.10" | sort -Vr
b.0.10 b.0.1 a.0.10 a.0.1 0.10 0.1
ならalpha
やbeta
の後に数値つけるのをやめてみると?
echo -e "0.1\n0.1.a\n0.10\n0.10.a\n0.1.b\n0.10.b" | sort -Vr
0.10.b 0.10.a 0.10 0.1.b 0.1.a 0.1
ダメだった。期待値は以下。
0.10 0.1 0.10.b 0.1.b 0.10.a 0.1.a
- アルファベットなしを最新とする
- アフファベット付きは辞書の逆順を最新とする
- アルファベット付きのものは同一アルファベットでグルーピングしてからソートする
そんな複雑なことやってられない。
所感
結局N.N.N
形式にするのが無難。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
- Python 2.7.16
- Python 3.7.3
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux