Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | When the "showid" query parameter is given on /timeline or /finfo, show the delta-source artifact ID in addition to the artifact ID. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
29935c6e3e9b36441b2213b0ed8137f8 |
| User & Date: | drh 2017-09-19 01:48:31.102 |
Context
|
2017-09-19
| ||
| 03:57 | Fix problems in the new content_deltify() routine. check-in: cb29bc646b user: drh tags: trunk | |
| 01:48 | When the "showid" query parameter is given on /timeline or /finfo, show the delta-source artifact ID in addition to the artifact ID. check-in: 29935c6e3e user: drh tags: trunk | |
| 01:36 | Change the content_deltify() routine so that looks an array of candidate source artifacts and picks the one that gives the best delta. check-in: a4047a91e3 user: drh tags: trunk | |
Changes
Changes to src/content.c.
| ︙ | ︙ | |||
115 116 117 118 119 120 121 | contentCache.szTotal = 0; } /* ** Return the srcid associated with rid. Or return 0 if rid is ** original content and not a delta. */ | | | 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
contentCache.szTotal = 0;
}
/*
** Return the srcid associated with rid. Or return 0 if rid is
** original content and not a delta.
*/
int delta_source_rid(int rid){
static Stmt q;
int srcid;
db_static_prepare(&q, "SELECT srcid FROM delta WHERE rid=:rid");
db_bind_int(&q, ":rid", rid);
if( db_step(&q)==SQLITE_ROW ){
srcid = db_column_int(&q, 0);
}else{
|
| ︙ | ︙ | |||
163 164 165 166 167 168 169 |
if( bag_find(&contentCache.available, rid) ){
return 1;
}
if( content_size(rid, -1)<0 ){
bag_insert(&contentCache.missing, rid);
return 0;
}
| | | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 |
if( bag_find(&contentCache.available, rid) ){
return 1;
}
if( content_size(rid, -1)<0 ){
bag_insert(&contentCache.missing, rid);
return 0;
}
srcid = delta_source_rid(rid);
if( srcid==0 ){
bag_insert(&contentCache.available, rid);
return 1;
}
rid = srcid;
}
fossil_panic("delta-loop in repository");
|
| ︙ | ︙ | |||
248 249 250 251 252 253 254 |
blob_copy(pBlob, &contentCache.a[i].content);
contentCache.a[i].age = contentCache.nextAge++;
return 1;
}
}
}
| | | | 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 |
blob_copy(pBlob, &contentCache.a[i].content);
contentCache.a[i].age = contentCache.nextAge++;
return 1;
}
}
}
nextRid = delta_source_rid(rid);
if( nextRid==0 ){
rc = content_of_blob(rid, pBlob);
}else{
int n = 1;
int nAlloc = 10;
int *a = 0;
int mx;
Blob delta, next;
a = fossil_malloc( sizeof(a[0])*nAlloc );
a[0] = rid;
a[1] = nextRid;
n = 1;
while( !bag_find(&contentCache.inCache, nextRid)
&& (nextRid = delta_source_rid(nextRid))>0 ){
n++;
if( n>=nAlloc ){
if( n>db_int(0, "SELECT max(rid) FROM blob") ){
fossil_panic("infinite loop in DELTA table");
}
nAlloc = nAlloc*2 + 10;
a = fossil_realloc(a, nAlloc*sizeof(a[0]));
|
| ︙ | ︙ | |||
713 714 715 716 717 718 719 |
}
/*
** Make sure the content at rid is the original content and is not a
** delta.
*/
void content_undelta(int rid){
| | | 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 |
}
/*
** Make sure the content at rid is the original content and is not a
** delta.
*/
void content_undelta(int rid){
if( delta_source_rid(rid)>0 ){
Blob x;
if( content_get(rid, &x) ){
Stmt s;
db_prepare(&s, "UPDATE blob SET content=:c, size=%d WHERE rid=%d",
blob_size(&x), rid);
blob_compress(&x, &x);
db_bind_blob(&s, ":c", &x);
|
| ︙ | ︙ | |||
807 808 809 810 811 812 813 | int bestSrc = 0; /* Which aSrc is the source of the best delta */ int rc = 0; /* Value to return */ int i; /* Loop variable for aSrc[] */ /* If rid is already a child (a delta) of some other artifact, return ** immediately if the force flags is false */ | | | 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 |
int bestSrc = 0; /* Which aSrc is the source of the best delta */
int rc = 0; /* Value to return */
int i; /* Loop variable for aSrc[] */
/* If rid is already a child (a delta) of some other artifact, return
** immediately if the force flags is false
*/
if( !force && delta_source_rid(rid)>0 ) return 0;
/* Get the complete content of the object to be delta-ed. If the size
** is less than 50 bytes, then there really is no point in trying to do
** a delta, so return immediately
*/
content_get(rid, &data);
if( blob_size(&data)<50 ){
|
| ︙ | ︙ | |||
831 832 833 834 835 836 837 |
if( srcid==rid ) continue;
if( content_is_private(srcid) && !content_is_private(rid) ) continue;
/* Compute all ancestors of srcid and make sure rid is not one of them.
** If rid is an ancestor of srcid, then making rid a decendent of srcid
** would create a delta loop. */
s = srcid;
| | | 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 |
if( srcid==rid ) continue;
if( content_is_private(srcid) && !content_is_private(rid) ) continue;
/* Compute all ancestors of srcid and make sure rid is not one of them.
** If rid is an ancestor of srcid, then making rid a decendent of srcid
** would create a delta loop. */
s = srcid;
while( (s = delta_source_rid(s))>0 ){
if( s==rid ){
content_undelta(srcid);
break;
}
}
if( s!=0 ) continue;
|
| ︙ | ︙ |
Changes to src/finfo.c.
| ︙ | ︙ | |||
491 492 493 494 495 496 497 |
char *zPrevName = db_text(0, "SELECT name FROM filename WHERE fnid=%d",
pfnid);
@ <b>Renamed</b> from
@ %z(href("%R/finfo?name=%t", zPrevName))%h(zPrevName)</a>
}
@ %z(href("%R/artifact/%!S",zUuid))[%S(zUuid)]</a>
if( fShowId ){
| > > > > | > | 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 |
char *zPrevName = db_text(0, "SELECT name FROM filename WHERE fnid=%d",
pfnid);
@ <b>Renamed</b> from
@ %z(href("%R/finfo?name=%t", zPrevName))%h(zPrevName)</a>
}
@ %z(href("%R/artifact/%!S",zUuid))[%S(zUuid)]</a>
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId>0 ){
@ (%d(frid)←%d(srcId))
}else{
@ (%d(frid))
}
}
@ part of check-in
}else{
char *zNewName;
zNewName = db_text(0,
"SELECT name FROM filename WHERE fnid = "
" (SELECT fnid FROM mlink"
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
445 446 447 448 449 450 451 |
}
}else if( zType[0]=='e' && tagid ){
hyperlink_to_event_tagid(tagid<0?-tagid:tagid);
}else if( (tmFlags & TIMELINE_ARTID)!=0 ){
hyperlink_to_uuid(zUuid);
}
if( tmFlags & TIMELINE_SHOWRID ){
| > > > > | > | 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
}
}else if( zType[0]=='e' && tagid ){
hyperlink_to_event_tagid(tagid<0?-tagid:tagid);
}else if( (tmFlags & TIMELINE_ARTID)!=0 ){
hyperlink_to_uuid(zUuid);
}
if( tmFlags & TIMELINE_SHOWRID ){
int srcId = delta_source_rid(rid);
if( srcId ){
@ (%d(rid)←%d(srcId))
}else{
@ (%d(rid))
}
}
db_column_blob(pQuery, commentColumn, &comment);
if( zType[0]!='c' ){
/* Comments for anything other than a check-in are generated by
** "fossil rebuild" and expect to be rendered as text/x-fossil-wiki */
wiki_convert(&comment, 0, WIKI_INLINE);
}else if( bCommentGitStyle ){
|
| ︙ | ︙ |