Problem: it doesn't
A version number is:
join $listOfNonNegativeIntegers .
Want to add recognition of things like 8.4b1
Concept: allow values -1 and -2 in the list.
Wherever the result has .-1. replace with b
Wherever the result has .-2. replace with a
Implies: a or b can't be next to a .
a or b can't be first or last char in version number
Things like 1.2a5b3.7 are OK (if weird)
Specification:
[package vcompare] extended obvious way (-2 < -1 < 0).
[package vsatisfies] -- need to specify sensible rules (for itself and to be used by [package require])
[package vsatisfies 1.1 1.0] => 1
[package vsatisfies 1.1a0 1.0] => 1
[package vsatisfies 1.1b0 1.0] => 1
Note: implies responsibility for controlling package availability placed on package installer! (Provide alpha/beta releases to developers, but hide from end-users, for example -- special TCLLIBPATH, etc.)
[package vsatisfies 1.1a1 1.1a0] => ???
[package vsatisfies 1.1b0 1.1a0] => ???
[package vsatisfies 1.1 1.1a0] => ???
[package vsatisfies 1.1b1 1.1b0] => ???
[package vsatisfies 1.1 1.1b0] => ???
Also consider new cases when package BoF: PACKAGE REQUIRE support for RANGES of acceptable versions is present.
[package vsatisfies $version $range ?$range ...?]
Why stop to a and b?
proc vsplit {ver} { if {![regexp {^\d+($|(.\d+|[a-z]{1}(\d+|$))*)$} $ver]} {error "expected version number but got \"$ver\""} set r {} foreach {a b c d e} [regexp -all -inline {(\d+)[.$]?|([a-z])($|(\d+))} $ver] { if {$b ne {}} {lappend r $b} else { lappend r [expr {[scan $c %c]-123}] if {$d ne {}} {lappend r $d} } } return $r } proc vcompare {uv vv} { set uv [vsplit $uv] set vv [vsplit $vv] if {[set m [llength $uv]] > [llength $vv]} { lappend vv {*}[lrepeat [expr {$m-[llength $vv]}] 0] } elseif {[set m [llength $vv]] > [llength $uv]} { lappend uv {*}[lrepeat [expr {$m-[llength $uv]}] 0] } for {set i 0} {$i < $m} {incr i} { if {[lindex $uv $i] < [lindex $vv $i]} {return -1} if {[lindex $uv $i] > [lindex $vv $i]} {return 1} } return 0 }
I wrote this because I needed something like this. So far it has worked, but I haven't tested it a lot. Or at all.
It does:
Just to make my second appearance in this great Wiki,
-Kaitzschu.