バージョン番号の比較(というかソート)ってどうやってます? ちょっと作ってみたけど…完全ではないなぁ。 これだと文字数で0を足しているだけなので、整数だけとかアルファベットだけならいいけど「9a」(9にパッチが当たった想定)と「10」で、「9a」が後になってしまう。jpegのライブラリとかこういうスタイルだったよな確か。 例えばLinuxみたいに2.6.8-bk1と2.6.8-rc1があってrc1のほうが後だってのはプログラム上はどうするべきなんだろう。Firefoxみたいにrcとprの違いとか。あと、例えば「rc1a1」と「1rc2」みたいなあまり互換性がなさそうなつけ方があったとして、どっちが後とするべきなんだろう。rpmのソースとか見てみようかな。
#! /usr/bin/python
import string
def fix_length(x,y):
m=max(len(x), len(y))
x.extend("0"*(m-len(x)))
y.extend("0"*(m-len(y)))
return x,y
def fix_length_str(x,y):
m=max(len(x), len(y))
return x.zfill(m), y.zfill(m)
# "n.n.n-n.n.n"
def compare_version(x,y,spl=''):
# split "-"
# print "cmp0", x,y
if len(spl)==0:
# return cmp(string.atoi(x),string.atoi(y))
x,y=fix_length_str(x,y)
return cmp(x,y)
x1, y1=x.split(spl[0]), y.split(spl[0])
x1, y1=fix_length(x1, y1)
for i in range(len(x1)):
r=compare_version(x1[i], y1[i], spl[1:])
if r!=0:
return r
return 0
if __name__=='__main__':
a=["1.0.0", "0.90", "0.1", "0.9", "0.10", "1.2.5", "1.2.5-10", "1.2-20", "1.2.5-9"]
a.sort(lambda x,y: compare_version(x,y, "-."))
print a
結果は以下。
['0.1', '0.9', '0.10', '0.90', '1.0.0', '1.2-20', '1.2.5', '1.2.5-9', '1.2.5-10']