improve docs on version numbers

Closes #2309
This commit is contained in:
Matthew Flatt 2018-10-11 09:17:15 -06:00
parent 9f839c1161
commit 959b8778d3
2 changed files with 58 additions and 14 deletions

View File

@ -70,9 +70,15 @@ Each @tech{package} has associated @deftech{package metadata}:
@item{a @deftech{version} --- a string of the form @nonterm{maj}@litchar{.}@nonterm{min}, @item{a @deftech{version} --- a string of the form @nonterm{maj}@litchar{.}@nonterm{min},
@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}, or @nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}, or
@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}@litchar{.}@nonterm{rel}, @nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}@litchar{.}@nonterm{rel},
@margin-note*{The constraints on version numbers are consistent with @racketmodname[version/utils]
and force version numbers to be in a canonical form. For example, a would-be version
string @racket["4.3.0"] must be written instead as @racket["4.3"], @racket["4.3.1.0"]
must be written instead as @racket["4.3.1"], and @racket["4"] must be written as @racket["4.0"].}
where @nonterm{maj}, @nonterm{min}, @nonterm{sub}, and @nonterm{rel} are where @nonterm{maj}, @nonterm{min}, @nonterm{sub}, and @nonterm{rel} are
all canonical decimal representations of natural numbers, @nonterm{min} has no more all canonical decimal representations of natural numbers, @nonterm{rel} is not @litchar{0},
than two digits, and @nonterm{sub} and @nonterm{rel} has no more than @nonterm{sub} is not @litchar{0} unless
@nonterm{rel} is supplied, @nonterm{min} has no more
than two digits, and @nonterm{sub} and @nonterm{rel} have no more than
three digits. A version is intended to reflect available features of three digits. A version is intended to reflect available features of
a package, and should not be confused with different releases of a package, and should not be confused with different releases of
a package as indicated by the @tech{checksum}.} a package as indicated by the @tech{checksum}.}

View File

@ -73,40 +73,78 @@ indicates the current state of the current installation:
@defmodule[version/utils]{ @defmodule[version/utils]{
The @racketmodname[version/utils] library provides a few of convenient The @racketmodname[version/utils] library provides a few of convenient
utilities for dealing with version strings. Unless explicitly noted, utilities for dealing with version strings.}
these functions do not handle legacy versions of Racket.}
@defproc[(valid-version? [v any/c]) boolean?]{ @defproc[(valid-version? [v any/c]) boolean?]{
Returns @racket[#t] if @racket[v] is a valid Racket version Returns @racket[#t] if @racket[v] is a valid Racket version
string, @racket[#f] otherwise.} string, @racket[#f] otherwise.
A valid version has one of the following forms:
@itemlist[
@item{@nonterm{maj}@litchar{.}@nonterm{min}}
@item{@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}}
@item{@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}@litchar{.}@nonterm{rel}}
]
subject to the following constraints:
@itemlist[
@item{@nonterm{maj}, @nonterm{min}, @nonterm{sub}, and
@nonterm{rel} are all canonical decimal representations of
natural numbers (i.e., decimal digits with no leading
@litchar{0} unless the number is exactly @litchar{0})}
@item{@nonterm{rel} is not @litchar{0}}
@item{@nonterm{sub} is not @litchar{0} unless @nonterm{rel} is included}
@item{@nonterm{min} has no more than two digits}
@item{@nonterm{sub} and @nonterm{rel} have no more than three digits}
]
The constraints force version numbers to be in a canonical form. For
example, a would-be version string @racket["4.3.0"] must be written
instead as @racket["4.3"], @racket["4.3.1.0"] must be written
instead as @racket["4.3.1"], and @racket["4"] must be written as
@racket["4.0"].}
@defproc[(version->list [str valid-version?]) @defproc[(version->list [str valid-version?])
(list/c integer? integer? integer? integer?)]{ (list/c integer? integer? integer? integer?)]{
Returns a list of four numbers that the given version string Returns a list of four numbers that the given version string
represent. @racket[str] is assumed to be a valid version.} represent.}
@defproc[(version<? [str1 valid-version?] [str2 valid-version?]) boolean?]{ @defproc[(version<? [str1 valid-version?] [str2 valid-version?]) boolean?]{
Returns @racket[#t] if @racket[str1] represents a version that is Returns @racket[#t] if @racket[str1] represents a version that is
strictly smaller than @racket[str2], @racket[#f] otherwise. strictly smaller than @racket[str2], @racket[#f] otherwise.}
@racket[str1] and @racket[str2] are assumed to be valid versions.}
@defproc[(version<=? [str1 valid-version?] [str2 valid-version?]) boolean?]{ @defproc[(version<=? [str1 valid-version?] [str2 valid-version?]) boolean?]{
Returns @racket[#t] if @racket[str1] represents a version that is Returns @racket[#t] if @racket[str1] represents a version that is
smaller than or equal to @racket[str2], @racket[#f] otherwise. smaller than or equal to @racket[str2], @racket[#f] otherwise.}
@racket[str1] and @racket[str2] are assumed to be valid versions.}
@defproc[(alpha-version? [str valid-version?]) boolean?]{ @defproc[(alpha-version? [str valid-version?]) boolean?]{
Returns @racket[#t] if the version that @racket[str] represents is an Returns @racket[#t] if the version that @racket[str] represents is an
alpha version. @racket[str] is assumed to be a valid version.} alpha version.
A version number of the form @nonterm{maj}@litchar{.}@nonterm{min},
@nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub},
or @nonterm{maj}@litchar{.}@nonterm{min}@litchar{.}@nonterm{sub}@litchar{.}@nonterm{rel}
is an alpha version if @nonterm{min} is @litchar{90} or more,
@nonterm{sub} is @litchar{900} or more, or @nonterm{rel} is
@litchar{900} or more.}
@defproc[(version->integer [str string?]) (or/c integer? #f)]{ @defproc[(version->integer [str string?]) (or/c integer? #f)]{
Converts the version string into an integer. For version Converts the version string into an integer. For version
@racket["X.YY.ZZZ.WWW"], the result will be @racketvalfont{XYYZZZWWW}. @racket["X.YY.ZZZ.WWW"], the result will be @racketvalfont{XYYZZZWWW}.
This function works also for legacy Racket versions, by This function works also for legacy Racket versions by
translating @racket["XYY.ZZZ"] to @racketvalfont{XYYZZZ000}. The translating @racket["XYY.ZZZ"] to @racketvalfont{XYYZZZ000}. The
resulting integer can thefore be used to conveniently compare any two resulting integer can thefore be used to conveniently compare any two
(valid) version strings. If the version string is invalid the (valid) version strings. If the version string is invalid as either a
resulting value is @racket[#f]. regular version string or a legacy version string, the resulting
value is @racket[#f].
Note that this is the only function that deals with legacy version Note that this is the only function that deals with legacy version
strings.} strings.}