Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Back out the change to the cluster artifact M-card that added an alias name. The plan is to transmit alias information by new cards in the sync protocol. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | fossil-2.0 |
Files: | files | file ages | folders |
SHA1: |
a6ee563c70655245c0b164a5f8607b7f |
User & Date: | drh 2017-02-27 22:33:40 |
Context
2017-02-27
| ||
23:17 | Changes to the design of the alias table. check-in: 0a8fad6a user: drh tags: fossil-2.0 | |
22:33 | Back out the change to the cluster artifact M-card that added an alias name. The plan is to transmit alias information by new cards in the sync protocol. check-in: a6ee563c user: drh tags: fossil-2.0 | |
22:20 | Abandon the HNAME table idea. Instead, continue to use the BLOB.UUID as the primary artifact name and add the ALIAS table for aliased artifact names after a hash algorithm change. Add the optional alias argument to the M-card. check-in: 2e42c9cb user: drh tags: fossil-2.0 | |
Changes
Changes to src/content.c.
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 |
for(i=0; i<p->nCherrypick; i++){
nErr += check_exists(p->aCherrypick[i].zCPTarget+1, flags, p,
"cherry-pick target of", 0);
nErr += check_exists(p->aCherrypick[i].zCPBase, flags, p,
"cherry-pick baseline of", 0);
}
for(i=0; i<p->nCChild; i++){
nErr += check_exists(p->aCChild[i].zUuid, flags, p, "in", 0);
}
for(i=0; i<p->nTag; i++){
nErr += check_exists(p->aTag[i].zUuid, flags, p, "target of", 0);
}
manifest_destroy(p);
}
}
|
| |
1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 |
for(i=0; i<p->nCherrypick; i++){
nErr += check_exists(p->aCherrypick[i].zCPTarget+1, flags, p,
"cherry-pick target of", 0);
nErr += check_exists(p->aCherrypick[i].zCPBase, flags, p,
"cherry-pick baseline of", 0);
}
for(i=0; i<p->nCChild; i++){
nErr += check_exists(p->azCChild[i], flags, p, "in", 0);
}
for(i=0; i<p->nTag; i++){
nErr += check_exists(p->aTag[i].zUuid, flags, p, "target of", 0);
}
manifest_destroy(p);
}
}
|
Changes to src/manifest.c.
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 ... 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 ... 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 .... 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 |
char **azParent; /* Hashes of parents. One for each P card argument */ int nCherrypick; /* Number of entries in aCherrypick[] */ struct { char *zCPTarget; /* Hash for cherry-picked version w/ +|- prefix */ char *zCPBase; /* Hash for cherry-pick baseline. NULL for singletons */ } *aCherrypick; int nCChild; /* Number of cluster children */ int nCChildAlloc; /* Number of cluster allocated in aCChild[] */ struct { char *zUuid; /* Hashes of referenced objects in cluster. M cards */ char *zAlias; /* Alias arguments on a cluster */ } *aCChild; int nTag; /* Number of T Cards */ int nTagAlloc; /* Slots allocated in aTag[] */ struct TagType { char *zName; /* Name of the tag */ char *zUuid; /* Hash of artifact that the tag is applied to */ char *zValue; /* Value if the tag is really a property */ } *aTag; /* One for each T card */ ................................................................................ ** Clear the memory allocated in a manifest object */ void manifest_destroy(Manifest *p){ if( p ){ blob_reset(&p->content); fossil_free(p->aFile); fossil_free(p->azParent); fossil_free(p->aCChild); fossil_free(p->aTag); fossil_free(p->aField); fossil_free(p->aCherrypick); if( p->pBaseline ) manifest_destroy(p->pBaseline); memset(p, 0, sizeof(*p)); fossil_free(p); } ................................................................................ /* ** M <hash> ** ** An M-line identifies another artifact by its hash. M-lines ** occur in clusters only. */ case 'M': { char *zAlias; zUuid = next_token(&x, &sz); if( zUuid==0 ) SYNTAX("missing hash on M-card"); if( hname_validate(zUuid,sz)==HNAME_NONE ){ SYNTAX("Invalid hash on M-card"); } zAlias = next_token(&x, &sz); if( zAlias && hname_validate(zAlias,sz)==HNAME_NONE ){ SYNTAX("Invalid alias hash on M-card"); } if( p->nCChild>=p->nCChildAlloc ){ p->nCChildAlloc = p->nCChildAlloc*2 + 10; p->aCChild = fossil_realloc(p->aCChild , p->nCChildAlloc*sizeof(p->aCChild[0]) ); } i = p->nCChild++; p->aCChild[i].zUuid = zUuid; p->aCChild[i].zAlias = zAlias; if( i>0 && fossil_strcmp(p->aCChild[i-1].zUuid, zUuid)>=0 ){ SYNTAX("M-card in the wrong order"); } break; } /* ** N <uuid> ................................................................................ } if( p->type==CFTYPE_CLUSTER ){ static Stmt del1; tag_insert("cluster", 1, 0, rid, p->rDate, rid); db_static_prepare(&del1, "DELETE FROM unclustered WHERE rid=:rid"); for(i=0; i<p->nCChild; i++){ int mid; mid = uuid_to_rid(p->aCChild[i].zUuid, 1); if( mid>0 ){ db_bind_int(&del1, ":rid", mid); db_step(&del1); db_reset(&del1); } } } |
| < | < < | < < < < < | | < < > | | |
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 ... 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 ... 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 .... 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 |
char **azParent; /* Hashes of parents. One for each P card argument */ int nCherrypick; /* Number of entries in aCherrypick[] */ struct { char *zCPTarget; /* Hash for cherry-picked version w/ +|- prefix */ char *zCPBase; /* Hash for cherry-pick baseline. NULL for singletons */ } *aCherrypick; int nCChild; /* Number of cluster children */ int nCChildAlloc; /* Number of closts allocated in azCChild[] */ char **azCChild; /* Hashes of referenced objects in a cluster. M cards */ int nTag; /* Number of T Cards */ int nTagAlloc; /* Slots allocated in aTag[] */ struct TagType { char *zName; /* Name of the tag */ char *zUuid; /* Hash of artifact that the tag is applied to */ char *zValue; /* Value if the tag is really a property */ } *aTag; /* One for each T card */ ................................................................................ ** Clear the memory allocated in a manifest object */ void manifest_destroy(Manifest *p){ if( p ){ blob_reset(&p->content); fossil_free(p->aFile); fossil_free(p->azParent); fossil_free(p->azCChild); fossil_free(p->aTag); fossil_free(p->aField); fossil_free(p->aCherrypick); if( p->pBaseline ) manifest_destroy(p->pBaseline); memset(p, 0, sizeof(*p)); fossil_free(p); } ................................................................................ /* ** M <hash> ** ** An M-line identifies another artifact by its hash. M-lines ** occur in clusters only. */ case 'M': { zUuid = next_token(&x, &sz); if( zUuid==0 ) SYNTAX("missing hash on M-card"); if( hname_validate(zUuid,sz)==HNAME_NONE ){ SYNTAX("Invalid hash on M-card"); } if( p->nCChild>=p->nCChildAlloc ){ p->nCChildAlloc = p->nCChildAlloc*2 + 10; p->azCChild = fossil_realloc(p->azCChild , p->nCChildAlloc*sizeof(p->azCChild[0]) ); } i = p->nCChild++; p->azCChild[i] = zUuid; if( i>0 && fossil_strcmp(p->azCChild[i-1], zUuid)>=0 ){ SYNTAX("M-card in the wrong order"); } break; } /* ** N <uuid> ................................................................................ } if( p->type==CFTYPE_CLUSTER ){ static Stmt del1; tag_insert("cluster", 1, 0, rid, p->rDate, rid); db_static_prepare(&del1, "DELETE FROM unclustered WHERE rid=:rid"); for(i=0; i<p->nCChild; i++){ int mid; mid = uuid_to_rid(p->azCChild[i], 1); if( mid>0 ){ db_bind_int(&del1, ":rid", mid); db_step(&del1); db_reset(&del1); } } } |
Changes to src/rebuild.c.
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 |
bag_remove(&pending, rid);
p = manifest_get(rid, CFTYPE_CLUSTER, 0);
if( p==0 ){
fossil_fatal("bad cluster: rid=%d", rid);
}
for(i=0; i<p->nCChild; i++){
const char *zUuid = p->aCChild[i].zUuid;
int crid = name_to_rid(zUuid);
if( crid==0 ){
fossil_warning("cluster (rid=%d) references unknown artifact %s",
rid, zUuid);
continue;
}
db_multi_exec("INSERT OR IGNORE INTO xdone VALUES(%d)", crid);
|
| |
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 |
bag_remove(&pending, rid);
p = manifest_get(rid, CFTYPE_CLUSTER, 0);
if( p==0 ){
fossil_fatal("bad cluster: rid=%d", rid);
}
for(i=0; i<p->nCChild; i++){
const char *zUuid = p->azCChild[i];
int crid = name_to_rid(zUuid);
if( crid==0 ){
fossil_warning("cluster (rid=%d) references unknown artifact %s",
rid, zUuid);
continue;
}
db_multi_exec("INSERT OR IGNORE INTO xdone VALUES(%d)", crid);
|
Changes to www/fileformat.wiki.
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 ... 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 ... 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 |
[/artifact/28987096ac | here]. <a name="cluster"></a> <h2>2.0 Clusters</h2> A cluster is an artifact that declares the existence of other artifacts. Clusters are used during repository synchronization to help reduce network traffic. Clusters are also used to record aliases for artifact names, so that if the artifact hash algorithm changes, artifacts can still be looked up using the older hash algorithm. Clusters follow a syntax that is very similar to manifests. A cluster is a line-oriented text file. Newline characters (ASCII 0x0a) separate the artifact into cards. Each card begins with a single character "card type". Zero or more arguments may follow the card type. All arguments are separated from each other and from the card-type character by a single space ................................................................................ The cluster may not contain additional text or data beyond what is described here. Unlike manifests, clusters are never PGP signed. Allowed cards in the cluster are as follows: <blockquote> <b>M</b> <i>artifact-id</i> ?<i>alias</i><br /> <b>Z</b> <i>checksum</i> </blockquote> A cluster contains one or more "M" cards followed by a single "Z" card. Each M card has at least on argument which is the artifact ID of another artifact in the repository. If the M card has a second argument, the second argument is an alias for the artifact name. The Z card works exactly like the Z card of a manifest. The argument to the Z card is the lower-case hexadecimal representation of the MD5 checksum of all prior cards in the cluster. The Z-card is required. An example cluster from Fossil can be seen [/artifact/d03dbdd73a2a8 | here]. ................................................................................ <td> </td> <td align=center><b>1</b></td> <td> </td> <td> </td> <td> </td> </tr> <tr> <td><b>M</b> <i>uuid</i> ?<i>alias</i>?</td> <td> </td> <td align=center><b>1+</b></td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> |
| | | | | < < | | |
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 ... 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 ... 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 |
[/artifact/28987096ac | here]. <a name="cluster"></a> <h2>2.0 Clusters</h2> A cluster is an artifact that declares the existence of other artifacts. Clusters are used during repository synchronization to help reduce network traffic. As such, clusters are an optimization and may be removed from a repository without loss or damage to the underlying project code. Clusters follow a syntax that is very similar to manifests. A cluster is a line-oriented text file. Newline characters (ASCII 0x0a) separate the artifact into cards. Each card begins with a single character "card type". Zero or more arguments may follow the card type. All arguments are separated from each other and from the card-type character by a single space ................................................................................ The cluster may not contain additional text or data beyond what is described here. Unlike manifests, clusters are never PGP signed. Allowed cards in the cluster are as follows: <blockquote> <b>M</b> <i>artifact-id</i><br /> <b>Z</b> <i>checksum</i> </blockquote> A cluster contains one or more "M" cards followed by a single "Z" card. Each M card has a single argument which is the artifact ID of another artifact in the repository. The Z card works exactly like the Z card of a manifest. The argument to the Z card is the lower-case hexadecimal representation of the MD5 checksum of all prior cards in the cluster. The Z-card is required. An example cluster from Fossil can be seen [/artifact/d03dbdd73a2a8 | here]. ................................................................................ <td> </td> <td align=center><b>1</b></td> <td> </td> <td> </td> <td> </td> </tr> <tr> <td><b>M</b> <i>uuid</i></td> <td> </td> <td align=center><b>1+</b></td> <td> </td> <td> </td> <td> </td> <td> </td> <td> </td> |