Index: src/manifest.c ================================================================== --- src/manifest.c +++ src/manifest.c @@ -769,12 +769,14 @@ } i = p->nTag++; p->aTag[i].zName = zName; p->aTag[i].zUuid = zUuid; p->aTag[i].zValue = zValue; - if( i>0 && fossil_strcmp(p->aTag[i-1].zName, zName)>=0 ){ - SYNTAX("T-card in the wrong order"); + if( i>0 && fossil_strcmp(p->aTag[i-1].zUuid, zUuid)>=0 ){ + if( fossil_strcmp(p->aTag[i-1].zUuid, zUuid) || fossil_strcmp(p->aTag[i-1].zName, zName)>=0 ){ + SYNTAX("T-card in the wrong order"); + } } break; } /* Index: www/fileformat.wiki ================================================================== --- www/fileformat.wiki +++ www/fileformat.wiki @@ -211,11 +211,11 @@ A manifest might contain one or more T-cards used to set [./branching.wiki#tags | tags or properties] on the check-in. The format of the T-card is the same as described in Control Artifacts section below, except that the -second argument is the single characcter "*" instead of an +second argument is the single character "*" instead of an artifact ID. The * in place of the artifact ID indicates that the tag or property applies to the current artifact. It is not possible to encode the current artifact ID as part of an artifact, since the act of inserting the artifact ID would change the artifact ID, hence a * is used to represent "self". T-cards are typically @@ -285,11 +285,12 @@ within the repository. The basic format of a control artifact is the same as a manifest or cluster. A control artifact is a text file divided into cards by newline characters. Each card has a single-character card type followed by arguments. Spaces separate the card type and the arguments. No surplus whitespace is allowed. -All cards must occur in strict lexicographical order. +All cards must occur in strict lexicographical order, but for +T-cards the artifact-id sorts before the tag-name. Allowed cards in a control artifact are as follows:
D time-and-date-stamp