Fossil SCM
Correct tag propagationl. Now works even when rebuilding in a randomized order.
Commit
ce7900a0b6bd56ac8a01a8bf94da255705f2b353
Parent
e4517465f35f026…
2 files changed
+12
-7
+16
+12
-7
| --- src/manifest.c | ||
| +++ src/manifest.c | ||
| @@ -539,13 +539,22 @@ | ||
| 539 | 539 | int cid = db_column_int(&q, 0); |
| 540 | 540 | add_mlink(rid, &m, cid, 0); |
| 541 | 541 | } |
| 542 | 542 | db_finalize(&q); |
| 543 | 543 | db_multi_exec( |
| 544 | - "INSERT INTO event(type,mtime,objid,user,comment)" | |
| 545 | - "VALUES('ci',%.17g,%d,%Q,%Q)", | |
| 546 | - m.rDate, rid, m.zUser, m.zComment | |
| 544 | + "INSERT INTO event(type,mtime,objid,user,comment," | |
| 545 | + " bgcolor,brbgcolor,euser,ecomment)" | |
| 546 | + "VALUES('ci',%.17g,%d,%Q,%Q," | |
| 547 | + " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype=1)," | |
| 548 | + "(SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype!=1)," | |
| 549 | + " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d)," | |
| 550 | + " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));", | |
| 551 | + m.rDate, rid, m.zUser, m.zComment, | |
| 552 | + TAG_BGCOLOR, rid, | |
| 553 | + TAG_BGCOLOR, rid, | |
| 554 | + TAG_USER, rid, | |
| 555 | + TAG_COMMENT, rid | |
| 547 | 556 | ); |
| 548 | 557 | } |
| 549 | 558 | } |
| 550 | 559 | if( m.type==CFTYPE_CLUSTER ){ |
| 551 | 560 | for(i=0; i<m.nCChild; i++){ |
| @@ -566,18 +575,14 @@ | ||
| 566 | 575 | case '*': type = 2; break; |
| 567 | 576 | case '-': type = 0; break; |
| 568 | 577 | } |
| 569 | 578 | tag_insert(&m.aTag[i].zName[1], type, m.aTag[i].zValue, |
| 570 | 579 | rid, m.rDate, tid); |
| 571 | - if( tid!=rid ){ | |
| 572 | - tag_propagate_all(tid); | |
| 573 | - } | |
| 574 | 580 | } |
| 575 | 581 | if( parentid ){ |
| 576 | 582 | tag_propagate_all(parentid); |
| 577 | 583 | } |
| 578 | - tag_propagate_all(rid); | |
| 579 | 584 | } |
| 580 | 585 | db_end_transaction(0); |
| 581 | 586 | manifest_clear(&m); |
| 582 | 587 | return 1; |
| 583 | 588 | } |
| 584 | 589 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -539,13 +539,22 @@ | |
| 539 | int cid = db_column_int(&q, 0); |
| 540 | add_mlink(rid, &m, cid, 0); |
| 541 | } |
| 542 | db_finalize(&q); |
| 543 | db_multi_exec( |
| 544 | "INSERT INTO event(type,mtime,objid,user,comment)" |
| 545 | "VALUES('ci',%.17g,%d,%Q,%Q)", |
| 546 | m.rDate, rid, m.zUser, m.zComment |
| 547 | ); |
| 548 | } |
| 549 | } |
| 550 | if( m.type==CFTYPE_CLUSTER ){ |
| 551 | for(i=0; i<m.nCChild; i++){ |
| @@ -566,18 +575,14 @@ | |
| 566 | case '*': type = 2; break; |
| 567 | case '-': type = 0; break; |
| 568 | } |
| 569 | tag_insert(&m.aTag[i].zName[1], type, m.aTag[i].zValue, |
| 570 | rid, m.rDate, tid); |
| 571 | if( tid!=rid ){ |
| 572 | tag_propagate_all(tid); |
| 573 | } |
| 574 | } |
| 575 | if( parentid ){ |
| 576 | tag_propagate_all(parentid); |
| 577 | } |
| 578 | tag_propagate_all(rid); |
| 579 | } |
| 580 | db_end_transaction(0); |
| 581 | manifest_clear(&m); |
| 582 | return 1; |
| 583 | } |
| 584 |
| --- src/manifest.c | |
| +++ src/manifest.c | |
| @@ -539,13 +539,22 @@ | |
| 539 | int cid = db_column_int(&q, 0); |
| 540 | add_mlink(rid, &m, cid, 0); |
| 541 | } |
| 542 | db_finalize(&q); |
| 543 | db_multi_exec( |
| 544 | "INSERT INTO event(type,mtime,objid,user,comment," |
| 545 | " bgcolor,brbgcolor,euser,ecomment)" |
| 546 | "VALUES('ci',%.17g,%d,%Q,%Q," |
| 547 | " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype=1)," |
| 548 | "(SELECT value FROM tagxref WHERE tagid=%d AND rid=%d AND tagtype!=1)," |
| 549 | " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d)," |
| 550 | " (SELECT value FROM tagxref WHERE tagid=%d AND rid=%d));", |
| 551 | m.rDate, rid, m.zUser, m.zComment, |
| 552 | TAG_BGCOLOR, rid, |
| 553 | TAG_BGCOLOR, rid, |
| 554 | TAG_USER, rid, |
| 555 | TAG_COMMENT, rid |
| 556 | ); |
| 557 | } |
| 558 | } |
| 559 | if( m.type==CFTYPE_CLUSTER ){ |
| 560 | for(i=0; i<m.nCChild; i++){ |
| @@ -566,18 +575,14 @@ | |
| 575 | case '*': type = 2; break; |
| 576 | case '-': type = 0; break; |
| 577 | } |
| 578 | tag_insert(&m.aTag[i].zName[1], type, m.aTag[i].zValue, |
| 579 | rid, m.rDate, tid); |
| 580 | } |
| 581 | if( parentid ){ |
| 582 | tag_propagate_all(parentid); |
| 583 | } |
| 584 | } |
| 585 | db_end_transaction(0); |
| 586 | manifest_clear(&m); |
| 587 | return 1; |
| 588 | } |
| 589 |
+16
| --- src/tag.c | ||
| +++ src/tag.c | ||
| @@ -151,12 +151,28 @@ | ||
| 151 | 151 | int rid /* Artifact to which the tag is to attached */ |
| 152 | 152 | ){ |
| 153 | 153 | Stmt s; |
| 154 | 154 | const char *zCol; |
| 155 | 155 | int tagid = tag_findid(zTag, 1); |
| 156 | + int rc; | |
| 157 | + | |
| 156 | 158 | if( mtime<=0.0 ){ |
| 157 | 159 | mtime = db_double(0.0, "SELECT julianday('now')"); |
| 160 | + } | |
| 161 | + db_prepare(&s, | |
| 162 | + "SELECT 1 FROM tagxref" | |
| 163 | + " WHERE tagid=%d" | |
| 164 | + " AND rid=%d" | |
| 165 | + " AND mtime>=:mtime", | |
| 166 | + tagid, rid | |
| 167 | + ); | |
| 168 | + db_bind_double(&s, ":mtime", mtime); | |
| 169 | + rc = db_step(&s); | |
| 170 | + db_finalize(&s); | |
| 171 | + if( rc==SQLITE_ROW ){ | |
| 172 | + /* Another entry this is more recent already exists. Do nothing */ | |
| 173 | + return; | |
| 158 | 174 | } |
| 159 | 175 | db_prepare(&s, |
| 160 | 176 | "REPLACE INTO tagxref(tagid,tagtype,srcId,value,mtime,rid)" |
| 161 | 177 | " VALUES(%d,%d,%d,%Q,:mtime,%d)", |
| 162 | 178 | tagid, tagtype, srcId, zValue, rid |
| 163 | 179 |
| --- src/tag.c | |
| +++ src/tag.c | |
| @@ -151,12 +151,28 @@ | |
| 151 | int rid /* Artifact to which the tag is to attached */ |
| 152 | ){ |
| 153 | Stmt s; |
| 154 | const char *zCol; |
| 155 | int tagid = tag_findid(zTag, 1); |
| 156 | if( mtime<=0.0 ){ |
| 157 | mtime = db_double(0.0, "SELECT julianday('now')"); |
| 158 | } |
| 159 | db_prepare(&s, |
| 160 | "REPLACE INTO tagxref(tagid,tagtype,srcId,value,mtime,rid)" |
| 161 | " VALUES(%d,%d,%d,%Q,:mtime,%d)", |
| 162 | tagid, tagtype, srcId, zValue, rid |
| 163 |
| --- src/tag.c | |
| +++ src/tag.c | |
| @@ -151,12 +151,28 @@ | |
| 151 | int rid /* Artifact to which the tag is to attached */ |
| 152 | ){ |
| 153 | Stmt s; |
| 154 | const char *zCol; |
| 155 | int tagid = tag_findid(zTag, 1); |
| 156 | int rc; |
| 157 | |
| 158 | if( mtime<=0.0 ){ |
| 159 | mtime = db_double(0.0, "SELECT julianday('now')"); |
| 160 | } |
| 161 | db_prepare(&s, |
| 162 | "SELECT 1 FROM tagxref" |
| 163 | " WHERE tagid=%d" |
| 164 | " AND rid=%d" |
| 165 | " AND mtime>=:mtime", |
| 166 | tagid, rid |
| 167 | ); |
| 168 | db_bind_double(&s, ":mtime", mtime); |
| 169 | rc = db_step(&s); |
| 170 | db_finalize(&s); |
| 171 | if( rc==SQLITE_ROW ){ |
| 172 | /* Another entry this is more recent already exists. Do nothing */ |
| 173 | return; |
| 174 | } |
| 175 | db_prepare(&s, |
| 176 | "REPLACE INTO tagxref(tagid,tagtype,srcId,value,mtime,rid)" |
| 177 | " VALUES(%d,%d,%d,%Q,:mtime,%d)", |
| 178 | tagid, tagtype, srcId, zValue, rid |
| 179 |