Fossil SCM

Improved handling of hyperlinks from the timeline to specific branches and users.

drh 2014-12-06 19:03 trunk
Commit 494b2a4c9202007fe93646eda7ba753c318915dc
3 files changed +2 -2 +1 -1 +20 -8
+2 -2
--- src/branch.c
+++ src/branch.c
@@ -357,11 +357,11 @@
357357
if( colorTest ){
358358
const char *zColor = hash_color(zBr);
359359
@ <li><span style="background-color: %s(zColor)">
360360
@ %h(zBr) &rarr; %s(zColor)</span></li>
361361
}else{
362
- @ <li>%z(href("%R/timeline?r=%T",zBr))%h(zBr)</a></li>
362
+ @ <li>%z(href("%R/timeline?r=%T&n=200",zBr))%h(zBr)</a></li>
363363
}
364364
}
365365
if( cnt ){
366366
@ </ul>
367367
}
@@ -385,11 +385,11 @@
385385
" AND tag.tagname GLOB 'sym-*'",
386386
rid
387387
);
388388
while( db_step(&q)==SQLITE_ROW ){
389389
const char *zTagName = db_column_text(&q, 0);
390
- @ %z(href("%R/timeline?r=%T",zTagName))[timeline]</a>
390
+ @ %z(href("%R/timeline?r=%T&n=200",zTagName))[timeline]</a>
391391
}
392392
db_finalize(&q);
393393
}
394394
395395
/*
396396
--- src/branch.c
+++ src/branch.c
@@ -357,11 +357,11 @@
357 if( colorTest ){
358 const char *zColor = hash_color(zBr);
359 @ <li><span style="background-color: %s(zColor)">
360 @ %h(zBr) &rarr; %s(zColor)</span></li>
361 }else{
362 @ <li>%z(href("%R/timeline?r=%T",zBr))%h(zBr)</a></li>
363 }
364 }
365 if( cnt ){
366 @ </ul>
367 }
@@ -385,11 +385,11 @@
385 " AND tag.tagname GLOB 'sym-*'",
386 rid
387 );
388 while( db_step(&q)==SQLITE_ROW ){
389 const char *zTagName = db_column_text(&q, 0);
390 @ %z(href("%R/timeline?r=%T",zTagName))[timeline]</a>
391 }
392 db_finalize(&q);
393 }
394
395 /*
396
--- src/branch.c
+++ src/branch.c
@@ -357,11 +357,11 @@
357 if( colorTest ){
358 const char *zColor = hash_color(zBr);
359 @ <li><span style="background-color: %s(zColor)">
360 @ %h(zBr) &rarr; %s(zColor)</span></li>
361 }else{
362 @ <li>%z(href("%R/timeline?r=%T&n=200",zBr))%h(zBr)</a></li>
363 }
364 }
365 if( cnt ){
366 @ </ul>
367 }
@@ -385,11 +385,11 @@
385 " AND tag.tagname GLOB 'sym-*'",
386 rid
387 );
388 while( db_step(&q)==SQLITE_ROW ){
389 const char *zTagName = db_column_text(&q, 0);
390 @ %z(href("%R/timeline?r=%T&n=200",zTagName))[timeline]</a>
391 }
392 db_finalize(&q);
393 }
394
395 /*
396
+1 -1
--- src/tag.c
+++ src/tag.c
@@ -561,11 +561,11 @@
561561
);
562562
@ <ul>
563563
while( db_step(&q)==SQLITE_ROW ){
564564
const char *zName = db_column_text(&q, 0);
565565
if( g.perm.Hyperlink ){
566
- @ <li>%z(xhref("class='taglink'","%R/timeline?t=%T",zName))
566
+ @ <li>%z(xhref("class='taglink'","%R/timeline?t=%T&n=200",zName))
567567
@ %h(zName)</a></li>
568568
}else{
569569
@ <li><span class="tagDsp">%h(zName)</span></li>
570570
}
571571
}
572572
--- src/tag.c
+++ src/tag.c
@@ -561,11 +561,11 @@
561 );
562 @ <ul>
563 while( db_step(&q)==SQLITE_ROW ){
564 const char *zName = db_column_text(&q, 0);
565 if( g.perm.Hyperlink ){
566 @ <li>%z(xhref("class='taglink'","%R/timeline?t=%T",zName))
567 @ %h(zName)</a></li>
568 }else{
569 @ <li><span class="tagDsp">%h(zName)</span></li>
570 }
571 }
572
--- src/tag.c
+++ src/tag.c
@@ -561,11 +561,11 @@
561 );
562 @ <ul>
563 while( db_step(&q)==SQLITE_ROW ){
564 const char *zName = db_column_text(&q, 0);
565 if( g.perm.Hyperlink ){
566 @ <li>%z(xhref("class='taglink'","%R/timeline?t=%T&n=200",zName))
567 @ %h(zName)</a></li>
568 }else{
569 @ <li><span class="tagDsp">%h(zName)</span></li>
570 }
571 }
572
+20 -8
--- src/timeline.c
+++ src/timeline.c
@@ -427,11 +427,11 @@
427427
/* Generate the "user: USERNAME" at the end of the comment, together
428428
** with a hyperlink to another timeline for that user.
429429
*/
430430
if( zTagList && zTagList[0]==0 ) zTagList = 0;
431431
if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
432
- char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd", zDispUser, zDate);
432
+ char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd&n=200", zDispUser, zDate);
433433
@ (user: %z(href("%z",zLink))%h(zDispUser)</a>%s(zTagList?",":"\051")
434434
}else{
435435
@ (user: %h(zDispUser)%s(zTagList?",":"\051")
436436
}
437437
@@ -452,11 +452,11 @@
452452
while( z && z[0] ){
453453
for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
454454
if( zThisTag==0 || memcmp(z, zThisTag, i)!=0 || zThisTag[i]!=0 ){
455455
blob_appendf(&links,
456456
"%z%#h</a>%.2s",
457
- href("%R/timeline?r=%#t&nd&c=%t",i,z,zDate), i,z, &z[i]
457
+ href("%R/timeline?r=%#t&nd&c=%t&n=200",i,z,zDate), i,z, &z[i]
458458
);
459459
}else{
460460
blob_appendf(&links, "%#h", i+2, z);
461461
}
462462
if( z[i]==0 ) break;
@@ -1103,16 +1103,22 @@
11031103
tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
11041104
zThisTag = zBrName;
11051105
}else{
11061106
tagid = 0;
11071107
}
1108
+ if( tagid>0
1109
+ && db_int(0,"SELECT count(*) FROM tagxref WHERE tagid=%d",tagid)<=nEntry
1110
+ ){
1111
+ zCirca = zBefore = zAfter = 0;
1112
+ nEntry = -1;
1113
+ }
11081114
if( zType[0]=='a' ){
11091115
tmFlags = TIMELINE_BRIEF | TIMELINE_GRAPH;
11101116
}else{
11111117
tmFlags = TIMELINE_GRAPH;
11121118
}
1113
- url_add_parameter(&url, "n", mprintf("%d", nEntry));
1119
+ if( nEntry>0 ) url_add_parameter(&url, "n", mprintf("%d", nEntry));
11141120
if( P("ng")!=0 || zSearch!=0 ){
11151121
tmFlags &= ~TIMELINE_GRAPH;
11161122
url_add_parameter(&url, "ng", 0);
11171123
}
11181124
if( P("brbg")!=0 ){
@@ -1244,11 +1250,11 @@
12441250
url_add_parameter(&url, "d", zUuid);
12451251
}
12461252
if( nEntry>20 ){
12471253
timeline_submenu(&url, "20 Entries", "n", "20", 0);
12481254
}
1249
- if( nEntry<200 ){
1255
+ if( nEntry<200 && nEntry>0 ){
12501256
timeline_submenu(&url, "200 Entries", "n", "200", 0);
12511257
}
12521258
if( tmFlags & TIMELINE_FCHANGES ){
12531259
timeline_submenu(&url, "Hide Files", "v", 0, 0);
12541260
}else{
@@ -1388,10 +1394,16 @@
13881394
}else if( zType[0]=='g' ){
13891395
zEType = "tag";
13901396
}
13911397
}
13921398
if( zUser ){
1399
+ int n = db_int(0,"SELECT count(*) FROM event"
1400
+ " WHERE user=%Q OR euser=%Q", zUser, zUser);
1401
+ if( n<=nEntry ){
1402
+ zCirca = zBefore = zAfter = 0;
1403
+ nEntry = -1;
1404
+ }
13931405
blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
13941406
zUser, zUser);
13951407
url_add_parameter(&url, "u", zUser);
13961408
zThisUser = zUser;
13971409
}
@@ -1409,11 +1421,11 @@
14091421
blob_append_sql(&sql,
14101422
" AND event.mtime>=%.17g AND event.mtime<=%.17g"
14111423
" ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
14121424
url_add_parameter(&url, "a", zAfter);
14131425
url_add_parameter(&url, "b", zBefore);
1414
- nEntry = 1000000;
1426
+ nEntry = -1;
14151427
}else{
14161428
blob_append_sql(&sql,
14171429
" AND event.mtime>=%.17g ORDER BY event.mtime ASC",
14181430
rAfter-ONE_SECOND);
14191431
url_add_parameter(&url, "a", zAfter);
@@ -1440,19 +1452,19 @@
14401452
if( useDividers ) timeline_add_dividers(rCirca, 0);
14411453
url_add_parameter(&url, "c", zCirca);
14421454
}else{
14431455
blob_append_sql(&sql, " ORDER BY event.mtime DESC");
14441456
}
1445
- blob_append_sql(&sql, " LIMIT %d", nEntry);
1457
+ if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
14461458
db_multi_exec("%s", blob_sql_text(&sql));
14471459
14481460
n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
14491461
if( zYearMonth ){
14501462
blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
14511463
}else if( zYearWeek ){
14521464
blob_appendf(&desc, "%s events for year/week %h", zEType, zYearWeek);
1453
- }else if( zAfter==0 && zBefore==0 && zCirca==0 ){
1465
+ }else if( zAfter==0 && zBefore==0 && zCirca==0 && nEntry>0 ){
14541466
blob_appendf(&desc, "%d most recent %ss", n, zEType);
14551467
}else{
14561468
blob_appendf(&desc, "%d %ss", n, zEType);
14571469
}
14581470
if( zUses ){
@@ -1522,11 +1534,11 @@
15221534
}
15231535
}
15241536
if( nEntry>20 ){
15251537
timeline_submenu(&url, "20 Entries", "n", "20", 0);
15261538
}
1527
- if( nEntry<200 ){
1539
+ if( nEntry<200 && nEntry>0 ){
15281540
timeline_submenu(&url, "200 Entries", "n", "200", 0);
15291541
}
15301542
if( zType[0]=='a' || zType[0]=='c' ){
15311543
if( tmFlags & TIMELINE_FCHANGES ){
15321544
timeline_submenu(&url, "Hide Files", "v", 0, 0);
15331545
--- src/timeline.c
+++ src/timeline.c
@@ -427,11 +427,11 @@
427 /* Generate the "user: USERNAME" at the end of the comment, together
428 ** with a hyperlink to another timeline for that user.
429 */
430 if( zTagList && zTagList[0]==0 ) zTagList = 0;
431 if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
432 char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd", zDispUser, zDate);
433 @ (user: %z(href("%z",zLink))%h(zDispUser)</a>%s(zTagList?",":"\051")
434 }else{
435 @ (user: %h(zDispUser)%s(zTagList?",":"\051")
436 }
437
@@ -452,11 +452,11 @@
452 while( z && z[0] ){
453 for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
454 if( zThisTag==0 || memcmp(z, zThisTag, i)!=0 || zThisTag[i]!=0 ){
455 blob_appendf(&links,
456 "%z%#h</a>%.2s",
457 href("%R/timeline?r=%#t&nd&c=%t",i,z,zDate), i,z, &z[i]
458 );
459 }else{
460 blob_appendf(&links, "%#h", i+2, z);
461 }
462 if( z[i]==0 ) break;
@@ -1103,16 +1103,22 @@
1103 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
1104 zThisTag = zBrName;
1105 }else{
1106 tagid = 0;
1107 }
 
 
 
 
 
 
1108 if( zType[0]=='a' ){
1109 tmFlags = TIMELINE_BRIEF | TIMELINE_GRAPH;
1110 }else{
1111 tmFlags = TIMELINE_GRAPH;
1112 }
1113 url_add_parameter(&url, "n", mprintf("%d", nEntry));
1114 if( P("ng")!=0 || zSearch!=0 ){
1115 tmFlags &= ~TIMELINE_GRAPH;
1116 url_add_parameter(&url, "ng", 0);
1117 }
1118 if( P("brbg")!=0 ){
@@ -1244,11 +1250,11 @@
1244 url_add_parameter(&url, "d", zUuid);
1245 }
1246 if( nEntry>20 ){
1247 timeline_submenu(&url, "20 Entries", "n", "20", 0);
1248 }
1249 if( nEntry<200 ){
1250 timeline_submenu(&url, "200 Entries", "n", "200", 0);
1251 }
1252 if( tmFlags & TIMELINE_FCHANGES ){
1253 timeline_submenu(&url, "Hide Files", "v", 0, 0);
1254 }else{
@@ -1388,10 +1394,16 @@
1388 }else if( zType[0]=='g' ){
1389 zEType = "tag";
1390 }
1391 }
1392 if( zUser ){
 
 
 
 
 
 
1393 blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1394 zUser, zUser);
1395 url_add_parameter(&url, "u", zUser);
1396 zThisUser = zUser;
1397 }
@@ -1409,11 +1421,11 @@
1409 blob_append_sql(&sql,
1410 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1411 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1412 url_add_parameter(&url, "a", zAfter);
1413 url_add_parameter(&url, "b", zBefore);
1414 nEntry = 1000000;
1415 }else{
1416 blob_append_sql(&sql,
1417 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1418 rAfter-ONE_SECOND);
1419 url_add_parameter(&url, "a", zAfter);
@@ -1440,19 +1452,19 @@
1440 if( useDividers ) timeline_add_dividers(rCirca, 0);
1441 url_add_parameter(&url, "c", zCirca);
1442 }else{
1443 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1444 }
1445 blob_append_sql(&sql, " LIMIT %d", nEntry);
1446 db_multi_exec("%s", blob_sql_text(&sql));
1447
1448 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
1449 if( zYearMonth ){
1450 blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
1451 }else if( zYearWeek ){
1452 blob_appendf(&desc, "%s events for year/week %h", zEType, zYearWeek);
1453 }else if( zAfter==0 && zBefore==0 && zCirca==0 ){
1454 blob_appendf(&desc, "%d most recent %ss", n, zEType);
1455 }else{
1456 blob_appendf(&desc, "%d %ss", n, zEType);
1457 }
1458 if( zUses ){
@@ -1522,11 +1534,11 @@
1522 }
1523 }
1524 if( nEntry>20 ){
1525 timeline_submenu(&url, "20 Entries", "n", "20", 0);
1526 }
1527 if( nEntry<200 ){
1528 timeline_submenu(&url, "200 Entries", "n", "200", 0);
1529 }
1530 if( zType[0]=='a' || zType[0]=='c' ){
1531 if( tmFlags & TIMELINE_FCHANGES ){
1532 timeline_submenu(&url, "Hide Files", "v", 0, 0);
1533
--- src/timeline.c
+++ src/timeline.c
@@ -427,11 +427,11 @@
427 /* Generate the "user: USERNAME" at the end of the comment, together
428 ** with a hyperlink to another timeline for that user.
429 */
430 if( zTagList && zTagList[0]==0 ) zTagList = 0;
431 if( g.perm.Hyperlink && fossil_strcmp(zDispUser, zThisUser)!=0 ){
432 char *zLink = mprintf("%R/timeline?u=%h&c=%t&nd&n=200", zDispUser, zDate);
433 @ (user: %z(href("%z",zLink))%h(zDispUser)</a>%s(zTagList?",":"\051")
434 }else{
435 @ (user: %h(zDispUser)%s(zTagList?",":"\051")
436 }
437
@@ -452,11 +452,11 @@
452 while( z && z[0] ){
453 for(i=0; z[i] && (z[i]!=',' || z[i+1]!=' '); i++){}
454 if( zThisTag==0 || memcmp(z, zThisTag, i)!=0 || zThisTag[i]!=0 ){
455 blob_appendf(&links,
456 "%z%#h</a>%.2s",
457 href("%R/timeline?r=%#t&nd&c=%t&n=200",i,z,zDate), i,z, &z[i]
458 );
459 }else{
460 blob_appendf(&links, "%#h", i+2, z);
461 }
462 if( z[i]==0 ) break;
@@ -1103,16 +1103,22 @@
1103 tagid = db_int(0, "SELECT tagid FROM tag WHERE tagname='sym-%q'",zBrName);
1104 zThisTag = zBrName;
1105 }else{
1106 tagid = 0;
1107 }
1108 if( tagid>0
1109 && db_int(0,"SELECT count(*) FROM tagxref WHERE tagid=%d",tagid)<=nEntry
1110 ){
1111 zCirca = zBefore = zAfter = 0;
1112 nEntry = -1;
1113 }
1114 if( zType[0]=='a' ){
1115 tmFlags = TIMELINE_BRIEF | TIMELINE_GRAPH;
1116 }else{
1117 tmFlags = TIMELINE_GRAPH;
1118 }
1119 if( nEntry>0 ) url_add_parameter(&url, "n", mprintf("%d", nEntry));
1120 if( P("ng")!=0 || zSearch!=0 ){
1121 tmFlags &= ~TIMELINE_GRAPH;
1122 url_add_parameter(&url, "ng", 0);
1123 }
1124 if( P("brbg")!=0 ){
@@ -1244,11 +1250,11 @@
1250 url_add_parameter(&url, "d", zUuid);
1251 }
1252 if( nEntry>20 ){
1253 timeline_submenu(&url, "20 Entries", "n", "20", 0);
1254 }
1255 if( nEntry<200 && nEntry>0 ){
1256 timeline_submenu(&url, "200 Entries", "n", "200", 0);
1257 }
1258 if( tmFlags & TIMELINE_FCHANGES ){
1259 timeline_submenu(&url, "Hide Files", "v", 0, 0);
1260 }else{
@@ -1388,10 +1394,16 @@
1394 }else if( zType[0]=='g' ){
1395 zEType = "tag";
1396 }
1397 }
1398 if( zUser ){
1399 int n = db_int(0,"SELECT count(*) FROM event"
1400 " WHERE user=%Q OR euser=%Q", zUser, zUser);
1401 if( n<=nEntry ){
1402 zCirca = zBefore = zAfter = 0;
1403 nEntry = -1;
1404 }
1405 blob_append_sql(&sql, " AND (event.user=%Q OR event.euser=%Q)",
1406 zUser, zUser);
1407 url_add_parameter(&url, "u", zUser);
1408 zThisUser = zUser;
1409 }
@@ -1409,11 +1421,11 @@
1421 blob_append_sql(&sql,
1422 " AND event.mtime>=%.17g AND event.mtime<=%.17g"
1423 " ORDER BY event.mtime ASC", rAfter-ONE_SECOND, rBefore+ONE_SECOND);
1424 url_add_parameter(&url, "a", zAfter);
1425 url_add_parameter(&url, "b", zBefore);
1426 nEntry = -1;
1427 }else{
1428 blob_append_sql(&sql,
1429 " AND event.mtime>=%.17g ORDER BY event.mtime ASC",
1430 rAfter-ONE_SECOND);
1431 url_add_parameter(&url, "a", zAfter);
@@ -1440,19 +1452,19 @@
1452 if( useDividers ) timeline_add_dividers(rCirca, 0);
1453 url_add_parameter(&url, "c", zCirca);
1454 }else{
1455 blob_append_sql(&sql, " ORDER BY event.mtime DESC");
1456 }
1457 if( nEntry>0 ) blob_append_sql(&sql, " LIMIT %d", nEntry);
1458 db_multi_exec("%s", blob_sql_text(&sql));
1459
1460 n = db_int(0, "SELECT count(*) FROM timeline WHERE etype!='div' /*scan*/");
1461 if( zYearMonth ){
1462 blob_appendf(&desc, "%s events for %h", zEType, zYearMonth);
1463 }else if( zYearWeek ){
1464 blob_appendf(&desc, "%s events for year/week %h", zEType, zYearWeek);
1465 }else if( zAfter==0 && zBefore==0 && zCirca==0 && nEntry>0 ){
1466 blob_appendf(&desc, "%d most recent %ss", n, zEType);
1467 }else{
1468 blob_appendf(&desc, "%d %ss", n, zEType);
1469 }
1470 if( zUses ){
@@ -1522,11 +1534,11 @@
1534 }
1535 }
1536 if( nEntry>20 ){
1537 timeline_submenu(&url, "20 Entries", "n", "20", 0);
1538 }
1539 if( nEntry<200 && nEntry>0 ){
1540 timeline_submenu(&url, "200 Entries", "n", "200", 0);
1541 }
1542 if( zType[0]=='a' || zType[0]=='c' ){
1543 if( tmFlags & TIMELINE_FCHANGES ){
1544 timeline_submenu(&url, "Hide Files", "v", 0, 0);
1545

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button