Fossil

Diff
Login

Differences From Artifact [6ee8db2818]:

To Artifact [efcc08d422]:


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)&larr;%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&nbsp;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);