---------------------------------------------------------------------------
INTERFACE Tag;
IMPORT Version, TextSeq;
CONST Brand = "Tag Module version 0.1";
---------------------------------------------------------------------------
TYPE
Kind = {Undefined, Merge, Devel, Alpha, Beta, Gamma, Change, Feature, Fix,
Release, Latest};
Attribute = {MergeMarker, BranchStart, Branch, Stable};
Attributes = SET OF Attribute;
T = BRANDED "Tag Object Type version 0.1" OBJECT
t_seq : TextSeq.T;
t_kind : Kind;
t_pkgname : TEXT; (* name of the package the tag belongs to *)
t_version : Version.T; (* contains major, minor, patchlevel *)
t_mversion : Version.T; (* merged into version *)
t_attr : Attributes;
t_orig : TEXT; (* original text form if initialized from text *)
t_change : TEXT; (* name of a change/feature/fix tag *)
t_location : TEXT; (* name of (DCVS) location suffix *)
METHODS
init() : T := Init;
initFromTag(tag : T) : T := InitFromTag;
initFromText(tag : TEXT) : T := InitFromText;
initFromElements(k : Kind; pkgname : TEXT; major, minor, pl : CARDINAL;
stable := FALSE; change : TEXT := NIL;
branch := FALSE; suffix : TEXT := NIL;
start := FALSE) : T := InitFromElements;
originalText() : TEXT := OriginalText;
denotation(checkIt := TRUE) : TEXT := Denotation;
base(level := 5) : TEXT := Base;
okay() : BOOLEAN := Okay;
predefined() : BOOLEAN := Predefined;
isStableBranchTag() : BOOLEAN := IsStableBranchTag;
isChangeBranchTag() : BOOLEAN := IsChangeBranchTag;
isChangeFeatureOrFixTag() : BOOLEAN := IsChangeFeatureOrFixTag;
kind() : Kind := GetKind;
kindAsText() : TEXT := GetKindAsText;
pkgName() : TEXT := PackageName;
getChangeName() : TEXT := GetChangeName;
getLocationSuffix() : TEXT := GetLocationSuffix;
mergeDestVersion() : Version.T := MergeDestVersion;
version() : Version.T := GetVersion;
versionAsText() : TEXT := VersionAsText;
setNextMajorVersion() := SetNextMajorVersion;
setNextMinorVersion() := SetNextMinorVersion;
setNextPatchLevel() := SetNextPatchLevel;
equal(tag : T) : BOOLEAN := Equal;
compare(tag : T) : [-1..1] := Compare;
debugInfo() : TEXT := DebugInfo;
END;
---------------------------------------------------------------------------
VAR
Head : T; (* CONST *)
(* predefined constant for head of trunk revisisons *)
Tip : T; (* CONST *)
(* predefined constant for head of branch revisisons *)
LastTip : T;
(* tag of the latest release branch in a package *)
---------------------------------------------------------------------------
PROCEDURE CheckedName(t : TEXT) : TEXT;
(* Return a tag component with all suspicious characters replaced by `='. *)
---------------------------------------------------------------------------
PROCEDURE Decompose(tag : TEXT) : TextSeq.T;
(* Decompose the tag into its elements (separated by `_').
Translate any `=' characters found into `_'.
*)
---------------------------------------------------------------------------
PROCEDURE Compose(seq : TextSeq.T) : TEXT;
(* Build a tag from a sequence of elements (add `_' characters).
Translate any `_' characters inside the elements into `='.
*)
---------------------------------------------------------------------------
PROCEDURE KindFromText(t : TEXT) : Kind;
(* Convert a TEXT to a Kind. *)
---------------------------------------------------------------------------
PROCEDURE KindToText(k : Kind) : TEXT;
(* Convert a Kind to a TEXT. *)
---------------------------------------------------------------------------
PROCEDURE New(tag : TEXT) : T;
(* Construct a new tag from its textual representation. *)
---------------------------------------------------------------------------
PROCEDURE NewCopy(tag : T) : T;
(* Construct a new tag from an existing tag *)
---------------------------------------------------------------------------
PROCEDURE Construct(k : Kind; pkgname : TEXT;
major, minor, pl : CARDINAL;
stable := FALSE; change : TEXT := NIL;
branch := FALSE; suffix : TEXT := NIL;
start := FALSE) : T;
(* Construct a new tag from the given elements. *)
---------------------------------------------------------------------------
PROCEDURE NewStableBranch(tag : T) : T;
(* Return a new stable branch tag if `tag' is a release tag;
if not, the result is undefined. *)
---------------------------------------------------------------------------
PROCEDURE NewBranchStartTag(tag : T) : T;
(* Return a new branch start tag for a given tag from branch `tag'. *)
---------------------------------------------------------------------------
PROCEDURE NewBranch(tag : T; kind : Kind := Kind.Undefined) : T;
(* Return a new change branch tag if `tag' is a release tag;
if not, the result is undefined. *)
---------------------------------------------------------------------------
PROCEDURE NewBranchStart(tag : T; kind : Kind := Kind.Undefined) : T;
(* Return a new change branch start tag for a given tag from branch `tag'. *)
---------------------------------------------------------------------------
PROCEDURE NewMergeTag(tag : T; mversion : Version.T := NIL) : T;
(* Return a new merge tag for a given release branch `tag'. *)
---------------------------------------------------------------------------
PROCEDURE Init(self : T) : T;
(* Set everything to `undefined'. *)
---------------------------------------------------------------------------
PROCEDURE InitFromTag(self : T; tag : T) : T;
(* Assign `self' from `tag'. *)
---------------------------------------------------------------------------
PROCEDURE InitFromText(self : T; tag : TEXT) : T;
(* Convert initial values from TEXT representation. *)
---------------------------------------------------------------------------
PROCEDURE InitFromElements(self : T; k : Kind; pkgname : TEXT;
major, minor, pl : CARDINAL;
stable := FALSE; change : TEXT := NIL;
branch := FALSE; suffix : TEXT := NIL;
start := FALSE) : T;
(* Construc a tag from the given elements. *)
---------------------------------------------------------------------------
PROCEDURE OriginalText(self : T) : TEXT;
(* Return the original text the tag was constructed from, if defined,
else "". *)
---------------------------------------------------------------------------
PROCEDURE Denotation(self : T; checkIt := TRUE) : TEXT;
(* Return the textual representation of a tag. *)
---------------------------------------------------------------------------
PROCEDURE Base(self : T; level := 5) : TEXT;
(* Return the base of the denotation of a tag, containing `level' elements *)
---------------------------------------------------------------------------
PROCEDURE Okay(self : T) : BOOLEAN;
(* <=> Tag `self' is syntactically correct and all elements defined. *)
---------------------------------------------------------------------------
PROCEDURE Predefined(self : T) : BOOLEAN;
(* <=> Tag `self' is a predefined tag, viz. Head, Tip or LastTip. *)
---------------------------------------------------------------------------
PROCEDURE GetKind(self : T) : Kind;
(* Return the kind of a tag. *)
---------------------------------------------------------------------------
PROCEDURE GetKindAsText(self : T) : TEXT;
(* Return the textual representation of the kind of a tag. *)
---------------------------------------------------------------------------
PROCEDURE IsStableBranchTag(self : T) : BOOLEAN;
(* <=> Tag `self' is of the form <ident>_<ident>_<nat>_<nat>_stable. *)
---------------------------------------------------------------------------
PROCEDURE IsChangeBranchTag(self : T) : BOOLEAN;
(* <=> Tag `self' is of the form
[change|feature|fix]_<ident>_<ident>_<nat>_<nat>_head. *)
---------------------------------------------------------------------------
PROCEDURE IsChangeFeatureOrFixTag(self : T) : BOOLEAN;
(* <=> Tag `self' is of the form
[change|feature|fix]_.*. *)
---------------------------------------------------------------------------
PROCEDURE PackageName(self : T) : TEXT;
(* Return the package name of tag `self'. *)
---------------------------------------------------------------------------
PROCEDURE GetChangeName(self : T) : TEXT;
(* Return the name of change/fix/feature tag `self'. *)
---------------------------------------------------------------------------
PROCEDURE GetLocationSuffix(self : T) : TEXT;
(* Return the location suffix of tag `self'. *)
---------------------------------------------------------------------------
PROCEDURE MergeDestVersion(self : T) : Version.T;
(* Return the version of the merge destination if tag `self' is a
merge tag. *)
---------------------------------------------------------------------------
PROCEDURE GetVersion(self : T) : Version.T;
(* Return the version of tag `self'. *)
---------------------------------------------------------------------------
PROCEDURE VersionAsText(self : T) : TEXT;
(* Return the textual representation of the version of tag `self'. *)
---------------------------------------------------------------------------
PROCEDURE SetNextMajorVersion(self : T);
(* Increment the tag version to the next major version. *)
---------------------------------------------------------------------------
PROCEDURE SetNextMinorVersion(self : T);
(* Increment the tag version to the next minor version. *)
---------------------------------------------------------------------------
PROCEDURE SetNextPatchLevel(self : T);
(* Increment the tag version to the next patch level. *)
---------------------------------------------------------------------------
PROCEDURE LatestTag(list : TextSeq.T; k : Kind) : T;
(* Return the tag with the highest version of kind `k' from `list'. *)
---------------------------------------------------------------------------
PROCEDURE ContainedInList(list : TextSeq.T; tag : T) : BOOLEAN;
(* <=> `tag' is contained in `list' *)
---------------------------------------------------------------------------
PROCEDURE IsKind(tag : TEXT; k : Kind) : BOOLEAN;
---------------------------------------------------------------------------
PROCEDURE Equal(self, tag : T) : BOOLEAN;
---------------------------------------------------------------------------
PROCEDURE Compare(self, tag : T) : [-1..1];
(* compare respecting the logical structure of the tags *)
---------------------------------------------------------------------------
PROCEDURE CompareFromText(tag1, tag2 : TEXT) : [-1..1];
(* as Compare but with additional InitFromText *)
---------------------------------------------------------------------------
PROCEDURE DebugInfo(self : T) : TEXT;
(* return information about tag contents *)
END Tag.