Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | The new "Simple" view for timelines attempts to declutter the timeline without being as extreme as the "Compact" view. The check-in: or artifact: detail is still shown, but other details are omitted, though they can be recalled by clicking on the ellipsis. The "left" or "closed" prefix to the "check-in:" detail is also omitted. "Simple" attempts to be a compromise between "Compact" and "Verbose". |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | timeline-enhance-2025 |
| Files: | files | file ages | folders |
| SHA3-256: |
07a43dd39adb93452684bef5dcdc9129 |
| User & Date: | drh 2025-10-18 17:18:37.997 |
Context
|
2025-10-18
| ||
| 19:28 | Do not generate tarball hyperlinks unless we are sure the client is not a spider. check-in: 878407b82d user: drh tags: timeline-enhance-2025 | |
| 17:18 | The new "Simple" view for timelines attempts to declutter the timeline without being as extreme as the "Compact" view. The check-in: or artifact: detail is still shown, but other details are omitted, though they can be recalled by clicking on the ellipsis. The "left" or "closed" prefix to the "check-in:" detail is also omitted. "Simple" attempts to be a compromise between "Compact" and "Verbose". check-in: 07a43dd39a user: drh tags: timeline-enhance-2025 | |
| 13:17 | Rename the /tarlist page to /download. Rename the suggested-tarlist property to suggested-downloads. check-in: 717fbdc297 user: drh tags: timeline-enhance-2025 | |
Changes
Changes to src/branch.c.
| ︙ | ︙ | |||
1028 1029 1030 1031 1032 1033 1034 |
const char *zThisUser, /* Suppress links to this user */
const char *zThisTag /* Suppress links to this tag */
){
int rid;
int tmFlagsNew;
char *zBrName;
| | | | 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 |
const char *zThisUser, /* Suppress links to this user */
const char *zThisTag /* Suppress links to this tag */
){
int rid;
int tmFlagsNew;
char *zBrName;
if( (tmFlags & TIMELINE_INLINE)!=0 ){
tmFlagsNew = (tmFlags & ~TIMELINE_VIEWS) | TIMELINE_MODERN;
cgi_printf("(");
}else{
tmFlagsNew = tmFlags;
}
timeline_extra(pQuery,tmFlagsNew,zThisUser,zThisTag);
if( !g.perm.Hyperlink ) return;
rid = db_column_int(pQuery,0);
zBrName = branch_of_rid(rid);
@ branch: <span class='timelineHash'>\
@ %z(href("%R/timeline?r=%T",zBrName))%h(zBrName)</a></span>
if( (tmFlags & TIMELINE_INLINE)!=0 ){
cgi_printf(")");
}
}
/*
** WEBPAGE: brtimeline
**
|
| ︙ | ︙ |
Changes to src/finfo.c.
| ︙ | ︙ | |||
392 393 394 395 396 397 398 399 400 401 402 403 404 405 |
}
login_anonymous_available();
tmFlags = timeline_ss_submenu();
if( tmFlags & TIMELINE_COLUMNAR ){
zStyle = "Columnar";
}else if( tmFlags & TIMELINE_COMPACT ){
zStyle = "Compact";
}else if( tmFlags & TIMELINE_VERBOSE ){
zStyle = "Verbose";
}else if( tmFlags & TIMELINE_CLASSIC ){
zStyle = "Classic";
}else{
zStyle = "Modern";
}
| > > | 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 |
}
login_anonymous_available();
tmFlags = timeline_ss_submenu();
if( tmFlags & TIMELINE_COLUMNAR ){
zStyle = "Columnar";
}else if( tmFlags & TIMELINE_COMPACT ){
zStyle = "Compact";
}else if( tmFlags & TIMELINE_SIMPLE ){
zStyle = "Simple";
}else if( tmFlags & TIMELINE_VERBOSE ){
zStyle = "Verbose";
}else if( tmFlags & TIMELINE_CLASSIC ){
zStyle = "Classic";
}else{
zStyle = "Modern";
}
|
| ︙ | ︙ | |||
729 730 731 732 733 734 735 |
@ <td class="timelineDetailCell">
}
}
if( tmFlags & TIMELINE_COMPACT ){
cgi_printf("<span class='clutter' id='detail-%d'>",frid);
}
cgi_printf("<span class='timeline%sDetail'>", zStyle);
| | | > > > > > | | | 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 |
@ <td class="timelineDetailCell">
}
}
if( tmFlags & TIMELINE_COMPACT ){
cgi_printf("<span class='clutter' id='detail-%d'>",frid);
}
cgi_printf("<span class='timeline%sDetail'>", zStyle);
if( tmFlags & TIMELINE_INLINE ) cgi_printf("(");
if( zUuid && (tmFlags & TIMELINE_VERBOSE)==0 ){
@ file: %z(href("%R/file?name=%T&ci=%!S",zFName,zCkin))\
@ %S(zUuid)</a>
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId>0 ){
@ id: %z(href("%R/deltachain/%d",frid))\
@ %d(frid)←%d(srcId)</a>
}else{
@ id: %z(href("%R/deltachain/%d",frid))%d(frid)</a>
}
}
}
if( tmFlags & TIMELINE_SIMPLE ){
@ <span class='timelineEllipsis' data-id='%d(frid)' \
@ id='ellipsis-%d(frid)'>...</span>
@ <span class='clutter' id='detail-%d(frid)'>
}
@ check-in: \
hyperlink_to_version(zCkin);
if( fShowId ){
@ (%d(fmid))
}
@ user: \
hyperlink_to_user(zUser, zDate, ",");
@ branch: %z(href("%R/timeline?t=%T",zBr))%h(zBr)</a>,
if( tmFlags & TIMELINE_INLINE ){
@ size: %d(szFile)
}else{
@ size: %d(szFile)
}
if( g.perm.Hyperlink && zUuid ){
const char *z = zFName;
@ <span id='links-%d(frid)'><span class='timelineExtraLinks'>
@ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
|
| ︙ | ︙ | |||
791 792 793 794 795 796 797 |
}
}
zAncLink = href("%R/finfo?name=%T&from=%!S&debug=1",zFName,zCkin);
@ %z(zAncLink)[ancestry]</a>
}
tag_private_status(frid);
/* End timelineDetail */
| | | | | 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 |
}
}
zAncLink = href("%R/finfo?name=%T&from=%!S&debug=1",zFName,zCkin);
@ %z(zAncLink)[ancestry]</a>
}
tag_private_status(frid);
/* End timelineDetail */
if( tmFlags & (TIMELINE_COMPACT|TIMELINE_SIMPLE) ){
@ </span>)</span>
}else{
@ )</span>
}
@ </td></tr>
}
db_finalize(&q);
db_finalize(&qparent);
if( pGraph ){
graph_finish(pGraph, 0, TIMELINE_DISJOINT);
|
| ︙ | ︙ |
Changes to src/timeline.c.
| ︙ | ︙ | |||
113 114 115 116 117 118 119 | #define TIMELINE_SHOWRID 0x0000400 /* Show RID values in addition to hashes */ #define TIMELINE_BISECT 0x0000800 /* Show supplemental bisect information */ #define TIMELINE_COMPACT 0x0001000 /* Use the "compact" view style */ #define TIMELINE_VERBOSE 0x0002000 /* Use the "detailed" view style */ #define TIMELINE_MODERN 0x0004000 /* Use the "modern" view style */ #define TIMELINE_COLUMNAR 0x0008000 /* Use the "columns" view style */ #define TIMELINE_CLASSIC 0x0010000 /* Use the "classic" view style */ | > > | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #define TIMELINE_SHOWRID 0x0000400 /* Show RID values in addition to hashes */ #define TIMELINE_BISECT 0x0000800 /* Show supplemental bisect information */ #define TIMELINE_COMPACT 0x0001000 /* Use the "compact" view style */ #define TIMELINE_VERBOSE 0x0002000 /* Use the "detailed" view style */ #define TIMELINE_MODERN 0x0004000 /* Use the "modern" view style */ #define TIMELINE_COLUMNAR 0x0008000 /* Use the "columns" view style */ #define TIMELINE_CLASSIC 0x0010000 /* Use the "classic" view style */ #define TIMELINE_SIMPLE 0x0020000 /* Use the "simple" view style */ #define TIMELINE_INLINE 0x0033000 /* Mask for views with in-line display */ #define TIMELINE_VIEWS 0x003f000 /* Mask for all of the view styles */ #define TIMELINE_NOSCROLL 0x0100000 /* Don't scroll to the selection */ #define TIMELINE_FILEDIFF 0x0200000 /* Show File differences, not ckin diffs */ #define TIMELINE_CHPICK 0x0400000 /* Show cherrypick merges */ #define TIMELINE_FILLGAPS 0x0800000 /* Dotted lines for missing nodes */ #define TIMELINE_XMERGE 0x1000000 /* Omit merges from off-graph nodes */ #define TIMELINE_NOTKT 0x2000000 /* Omit extra ticket classes */ #define TIMELINE_FORUMTXT 0x4000000 /* Render all forum messages */ |
| ︙ | ︙ | |||
192 193 194 195 196 197 198 | const char *zDate = db_column_text(pQuery, 2); const char *zType = db_column_text(pQuery, 7); const char *zUser = db_column_text(pQuery, 4); const char *zTagList = db_column_text(pQuery, 8); int tagid = db_column_int(pQuery, 9); const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous"; | | | 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
const char *zDate = db_column_text(pQuery, 2);
const char *zType = db_column_text(pQuery, 7);
const char *zUser = db_column_text(pQuery, 4);
const char *zTagList = db_column_text(pQuery, 8);
int tagid = db_column_int(pQuery, 9);
const char *zDispUser = zUser && zUser[0] ? zUser : "anonymous";
if( (tmFlags & TIMELINE_INLINE)!=0 ){
cgi_printf("(");
}
/* The EXTRA_FORMAT macro is an integer that controls various experiments
** in the layout of the extra text.
**
** 0 Legacy appearance.
|
| ︙ | ︙ | |||
232 233 234 235 236 237 238 |
|| zType[0]=='n' || zType[0]=='f'){
cgi_printf("artifact: %z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
}
#endif /* EXTRA_FORMAT==0 */
#if EXTRA_FORMAT==1
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
if( zType[0]=='c' ){
| < > > > > | | | | > > > > > > > | 234 235 236 237 238 239 240 241 242 243 244 245 246 247 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 278 279 |
|| zType[0]=='n' || zType[0]=='f'){
cgi_printf("artifact: %z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
}
#endif /* EXTRA_FORMAT==0 */
#if EXTRA_FORMAT==1
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
if( zType[0]=='c' ){
const char *zPrefix;
if( tmFlags & TIMELINE_SIMPLE ){
zPrefix = "";
}else{
int isLeaf = db_column_int(pQuery, 5);
if( isLeaf ){
zPrefix = has_closed_tag(rid) ? "closed " : "leaf ";
}else{
zPrefix = "";
}
}
cgi_printf("%scheck-in: %z<span class='timelineHash'>"
"%S</span></a> ",
zPrefix, href("%R/info/%!S",zUuid),zUuid);
}else if( zType[0]=='e' && tagid ){
cgi_printf("technote: ");
hyperlink_to_event_tagid(tagid<0?-tagid:tagid);
}else{
cgi_printf("artifact: %z%S</a> ",
href("%R/info/%!S",zUuid),zUuid);
}
}else if( zType[0]=='g' || zType[0]=='w' || zType[0]=='t'
|| zType[0]=='n' || zType[0]=='f'){
cgi_printf("artifact: %z%S</a> ",href("%R/info/%!S",zUuid),zUuid);
}
#endif /* EXTRA_FORMAT==1 */
if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
@ <span class='timelineEllipsis' id='ellipsis-%d(rid)' \
@ data-id='%d(rid)'>...</span>
@ <span class='clutter' id='detail-%d(rid)'>
}
if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
char *zLink;
if( zType[0]!='f' || (tmFlags & TIMELINE_FORUMTXT)==0 ){
zLink = mprintf("%R/timeline?u=%h&c=%t&y=a", zDispUser, zDate);
}else{
zLink = mprintf("%R/timeline?u=%h&c=%t&y=a&vfx", zDispUser, zDate);
|
| ︙ | ︙ | |||
308 309 310 311 312 313 314 315 316 317 318 319 320 321 |
href("%R/deltachain/%d",rid), rid, srcId);
}else{
cgi_printf(" id: %z%d</a>",
href("%R/deltachain/%d",rid), rid);
}
}
tag_private_status(rid);
#if EXTRA_FORMAT==2
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
if( zType[0]=='c' ){
cgi_printf(" check-in: %z<span class='timelineHash'>"
"%S</span></a>",
href("%R/info/%!S",zUuid),zUuid);
| > > > > | 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 |
href("%R/deltachain/%d",rid), rid, srcId);
}else{
cgi_printf(" id: %z%d</a>",
href("%R/deltachain/%d",rid), rid);
}
}
tag_private_status(rid);
if( (tmFlags & TIMELINE_SIMPLE)!=0 ){
cgi_printf("</span>"); /* End of the declutter span */
}
#if EXTRA_FORMAT==2
if( (tmFlags & TIMELINE_CLASSIC)==0 ){
if( zType[0]=='c' ){
cgi_printf(" check-in: %z<span class='timelineHash'>"
"%S</span></a>",
href("%R/info/%!S",zUuid),zUuid);
|
| ︙ | ︙ | |||
330 331 332 333 334 335 336 |
|| zType[0]=='n' || zType[0]=='f'){
cgi_printf(" artifact: %z%S</a>",href("%R/info/%!S",zUuid),zUuid);
}
#endif /* EXTRA_FORMAT==2 */
/* End timelineDetail */
| | | 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 |
|| zType[0]=='n' || zType[0]=='f'){
cgi_printf(" artifact: %z%S</a>",href("%R/info/%!S",zUuid),zUuid);
}
#endif /* EXTRA_FORMAT==2 */
/* End timelineDetail */
if( (tmFlags & TIMELINE_INLINE)!=0 ){
cgi_printf(")");
}
}
/*
** SETTING: timeline-truncate-at-blank boolean default=off
|
| ︙ | ︙ | |||
418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
if( (tmFlags & TIMELINE_VIEWS)==0 ){
tmFlags |= timeline_ss_cookie();
}
if( tmFlags & TIMELINE_COLUMNAR ){
zStyle = "Columnar";
}else if( tmFlags & TIMELINE_COMPACT ){
zStyle = "Compact";
}else if( tmFlags & TIMELINE_VERBOSE ){
zStyle = "Verbose";
}else if( tmFlags & TIMELINE_CLASSIC ){
zStyle = "Classic";
}else{
zStyle = "Modern";
}
| > > | 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 |
if( (tmFlags & TIMELINE_VIEWS)==0 ){
tmFlags |= timeline_ss_cookie();
}
if( tmFlags & TIMELINE_COLUMNAR ){
zStyle = "Columnar";
}else if( tmFlags & TIMELINE_COMPACT ){
zStyle = "Compact";
}else if( tmFlags & TIMELINE_SIMPLE ){
zStyle = "Simple";
}else if( tmFlags & TIMELINE_VERBOSE ){
zStyle = "Verbose";
}else if( tmFlags & TIMELINE_CLASSIC ){
zStyle = "Classic";
}else{
zStyle = "Modern";
}
|
| ︙ | ︙ | |||
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 |
const char *v = cookie_value("ss",0);
if( v==0 ) v = timeline_default_ss();
switch( v[0] ){
case 'c': tmFlags = TIMELINE_COMPACT; break;
case 'v': tmFlags = TIMELINE_VERBOSE; break;
case 'j': tmFlags = TIMELINE_COLUMNAR; break;
case 'x': tmFlags = TIMELINE_CLASSIC; break;
default: tmFlags = TIMELINE_MODERN; break;
}
return tmFlags;
}
/* Available timeline display styles, together with their y= query
** parameter names.
*/
const char *const timeline_view_styles[] = {
"m", "Modern View",
"j", "Columnar View",
"c", "Compact View",
"v", "Verbose View",
"x", "Classic View",
};
#if INTERFACE
| > > | | 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 |
const char *v = cookie_value("ss",0);
if( v==0 ) v = timeline_default_ss();
switch( v[0] ){
case 'c': tmFlags = TIMELINE_COMPACT; break;
case 'v': tmFlags = TIMELINE_VERBOSE; break;
case 'j': tmFlags = TIMELINE_COLUMNAR; break;
case 'x': tmFlags = TIMELINE_CLASSIC; break;
case 's': tmFlags = TIMELINE_SIMPLE; break;
default: tmFlags = TIMELINE_MODERN; break;
}
return tmFlags;
}
/* Available timeline display styles, together with their y= query
** parameter names.
*/
const char *const timeline_view_styles[] = {
"m", "Modern View",
"j", "Columnar View",
"c", "Compact View",
"s", "Simple View",
"v", "Verbose View",
"x", "Classic View",
};
#if INTERFACE
# define N_TIMELINE_VIEW_STYLE 6
#endif
/*
** Add the select/option box to the timeline submenu that is used to
** set the ss= parameter that determines the viewing mode.
**
** Return the TIMELINE_* value appropriate for the view-style.
|
| ︙ | ︙ |