| ︙ | | |
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
-
|
** n=NUM Show the first NUM changes only
** brbg Background color by branch name
** ubg Background color by user name
** ci=UUID Ancestors of a particular check-in
** orig=UUID If both ci and orig are supplied, only show those
** changes on a direct path from orig to ci.
** showid Show RID values for debugging
** basic Minimize clutter and complication
**
** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in
** year-month-day form, it may be truncated, and it may also name a
** timezone offset from UTC as "-HH:MM" (westward) or "+HH:MM"
** (eastward). Either no timezone suffix or "Z" means UTC.
*/
void finfo_page(void){
|
| ︙ | | |
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
|
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
|
-
-
+
-
+
|
GraphContext *pGraph;
int brBg = P("brbg")!=0;
int uBg = P("ubg")!=0;
int fDebug = atoi(PD("debug","0"));
int fShowId = P("showid")!=0;
Stmt qparent;
int iTableId = timeline_tableid();
int bBasic = PB("basic");
int bHashBeforeComment = 0; /* Show hash before the comment */
int bHashAfterComment = 0; /* Show hash after the comment */
int bHashInDetail = 0; /* Show the hash inside the detail section */
int bShowDetail; /* Show the detail section */
int bSeparateDetail; /* Detail section in a separate column */
int eCommentFormat; /* value for timeline-comment-format */
login_check_credentials();
if( !g.perm.Read ){ login_needed(g.anon.Read); return; }
style_header("File History");
login_anonymous_available();
url_initialize(&url, "finfo");
if( brBg ) url_add_parameter(&url, "brbg", 0);
if( uBg ) url_add_parameter(&url, "ubg", 0);
baseCheckin = name_to_rid_www("ci");
zPrevDate[0] = 0;
zFilename = PD("name","");
eCommentFormat = bBasic ? 5 : db_get_int("timeline-comment-format", 0);
eCommentFormat = db_get_int("timeline-comment-format", 0);
bShowDetail = (eCommentFormat & 1)==0; /* Bit 0 suppresses the comment */
bSeparateDetail = (eCommentFormat & 8)!=0;
switch( (eCommentFormat>>1)&3 ){
case 1: bHashAfterComment = 1; break;
case 2: bHashInDetail = 1; break;
default: bHashBeforeComment = 1; break;
}
fnid = db_int(0, "SELECT fnid FROM filename WHERE name=%Q", zFilename);
if( fnid==0 ){
@ No such file: %h(zFilename)
style_footer();
return;
}
if( g.perm.Admin && !bBasic ){
if( g.perm.Admin ){
style_submenu_element("MLink Table", "%R/mlink?name=%t", zFilename);
}
if( baseCheckin ){
if( P("orig")!=0 ){
origCheckin = name_to_typed_rid(P("orig"),"ci");
path_shortest_stored_in_ancestor_table(origCheckin, baseCheckin);
}else{
|
| ︙ | | |
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
|
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
|
-
-
+
-
-
-
+
-
-
|
fossil_free(zUuid);
}
}else{
blob_appendf(&title, "History of ");
hyperlinked_path(zFilename, &title, 0, "tree", "");
if( fShowId ) blob_appendf(&title, " (%d)", fnid);
}
if( bBasic ){
style_submenu_element("Details", "%s",
style_submenu_jsbutton("Advanced", STYLE_BASIC, "reclutter()");
url_render(&url, "basic", 0, 0, 0));
}else{
style_submenu_element("Declutter", "%s",
style_submenu_jsbutton("Basic", STYLE_CLUTTER, "declutter()");
url_render(&url, "basic", "1", 0, 0));
}
@ <h2>%b(&title)</h2>
blob_reset(&title);
pGraph = graph_init();
@ <table id="timelineTable%d(iTableId)" class="timelineTable">
if( baseCheckin ){
db_prepare(&qparent,
"SELECT DISTINCT pid FROM mlink"
|
| ︙ | | |
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
|
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
|
+
+
+
|
hyperlink_to_uuid(zUuid);
}
@ <span class="timelineComment timelineCheckinComment">%W(zCom)</span>
if( bHashAfterComment && zUuid ){
hyperlink_to_uuid(zUuid);
}
if( bShowDetail ){
@ <a class='anticlutter' id='ellipsis-%d(frid)' \
@ onclick='expandEllipsis(%d(frid))'>...</a>
if( bSeparateDetail ){
if( zBgClr && zBgClr[0] ){
@ <td class="timelineTableCell timelineDetailCell"
@ style="background-color: %h(zBgClr);">
}else{
@ <td class="timelineTableCell timelineDetailCell">
}
}
cgi_printf("<span class='clutter' id='detail-%d'>", frid);
cgi_printf("<span class='timelineDetail timelineCheckinDetail'>(");
if( zUuid && bHashInDetail ){
@ file: %z(href("%R/artifact/%!S",zUuid))[%S(zUuid)]</a>
if( fShowId ){
int srcId = delta_source_rid(frid);
if( srcId>0 ){
@ id: %d(frid)←%d(srcId)
|
| ︙ | | |
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
|
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
|
-
+
-
+
-
+
-
+
|
@ %z(href("%R/finfo?name=%t",zNewName))%h(zNewName)</a>
fossil_free(zNewName);
}else{
@ <b>Deleted</b>
}
}
}
if( g.perm.Hyperlink && zUuid && !bBasic ){
if( g.perm.Hyperlink && zUuid ){
const char *z = zFilename;
@ <span class='timelineExtraLinks'>
@ <span id='links-%d(frid)'><span class='timelineExtraLinks'>
@ %z(href("%R/annotate?filename=%h&checkin=%s",z,zCkin))
@ [annotate]</a>
@ %z(href("%R/blame?filename=%h&checkin=%s",z,zCkin))
@ [blame]</a>
@ %z(href("%R/timeline?n=all&uf=%!S",zUuid))[check-ins using]</a>
if( fpid>0 ){
@ %z(href("%R/fdiff?sbs=1&v1=%!S&v2=%!S",zPUuid,zUuid))[diff]</a>
}
@ </span>
@ </span></span>
}
if( fDebug & FINFO_DEBUG_MLINK ){
int ii;
char *zAncLink;
@ <br />fid=%d(frid) pid=%d(fpid) mid=%d(fmid)
if( nParent>0 ){
@ parents=%d(aParent[0])
for(ii=1; ii<nParent; ii++){
@ %d(aParent[ii])
}
}
zAncLink = href("%R/finfo?name=%T&ci=%!S&debug=1",zFilename,zCkin);
@ %z(zAncLink)[ancestry]</a>
}
tag_private_status(frid);
if( bShowDetail ){
@ </span>
@ </span></span>
}
@ </td></tr>
}
db_finalize(&q);
db_finalize(&qparent);
if( pGraph ){
graph_finish(pGraph, 1);
|
| ︙ | | |