| | @@ -20,10 +20,20 @@ |
| 20 | 20 | */ |
| 21 | 21 | #include "config.h" |
| 22 | 22 | #include <string.h> |
| 23 | 23 | #include <time.h> |
| 24 | 24 | #include "timeline.h" |
| 25 | + |
| 26 | +/* |
| 27 | +** Add an appropriate tag to the output if "rid" is unpublished (private) |
| 28 | +*/ |
| 29 | +#define UNPUB_TAG "<em>(unpublished)</em>" |
| 30 | +void tag_private_status(int rid){ |
| 31 | + if( content_is_private(rid) ){ |
| 32 | + cgi_printf("%s", UNPUB_TAG); |
| 33 | + } |
| 34 | +} |
| 25 | 35 | |
| 26 | 36 | /* |
| 27 | 37 | ** Generate a hyperlink to a version. |
| 28 | 38 | */ |
| 29 | 39 | void hyperlink_to_uuid(const char *zUuid){ |
| | @@ -456,11 +466,11 @@ |
| 456 | 466 | blob_reset(&links); |
| 457 | 467 | }else{ |
| 458 | 468 | @ tags: %h(zTagList)) |
| 459 | 469 | } |
| 460 | 470 | } |
| 461 | | - |
| 471 | + tag_private_status(rid); |
| 462 | 472 | |
| 463 | 473 | /* Generate extra hyperlinks at the end of the comment */ |
| 464 | 474 | if( xExtra ){ |
| 465 | 475 | xExtra(rid); |
| 466 | 476 | } |
| | @@ -471,11 +481,11 @@ |
| 471 | 481 | ){ |
| 472 | 482 | int inUl = 0; |
| 473 | 483 | if( !fchngQueryInit ){ |
| 474 | 484 | db_prepare(&fchngQuery, |
| 475 | 485 | "SELECT (pid==0) AS isnew," |
| 476 | | - " (fid==0) AS isdel," |
| 486 | + " fid," |
| 477 | 487 | " (SELECT name FROM filename WHERE fnid=mlink.fnid) AS name," |
| 478 | 488 | " (SELECT uuid FROM blob WHERE rid=fid)," |
| 479 | 489 | " (SELECT uuid FROM blob WHERE rid=pid)," |
| 480 | 490 | " (SELECT name FROM filename WHERE fnid=mlink.pfnid) AS oldnm" |
| 481 | 491 | " FROM mlink" |
| | @@ -488,14 +498,16 @@ |
| 488 | 498 | } |
| 489 | 499 | db_bind_int(&fchngQuery, ":mid", rid); |
| 490 | 500 | while( db_step(&fchngQuery)==SQLITE_ROW ){ |
| 491 | 501 | const char *zFilename = db_column_text(&fchngQuery, 2); |
| 492 | 502 | int isNew = db_column_int(&fchngQuery, 0); |
| 493 | | - int isDel = db_column_int(&fchngQuery, 1); |
| 503 | + int fid = db_column_int(&fchngQuery, 1); |
| 504 | + int isDel = fid==0; |
| 494 | 505 | const char *zOldName = db_column_text(&fchngQuery, 5); |
| 495 | 506 | const char *zOld = db_column_text(&fchngQuery, 4); |
| 496 | 507 | const char *zNew = db_column_text(&fchngQuery, 3); |
| 508 | + const char *zUnpubTag = ""; |
| 497 | 509 | if( !inUl ){ |
| 498 | 510 | @ <ul class="filelist"> |
| 499 | 511 | inUl = 1; |
| 500 | 512 | } |
| 501 | 513 | if( (tmFlags & TIMELINE_FRENAMES)!=0 ){ |
| | @@ -502,23 +514,26 @@ |
| 502 | 514 | if( !isNew && !isDel && zOldName!=0 ){ |
| 503 | 515 | @ <li> %h(zOldName) → %h(zFilename) |
| 504 | 516 | } |
| 505 | 517 | continue; |
| 506 | 518 | } |
| 519 | + if( content_is_private(fid) ){ |
| 520 | + zUnpubTag = UNPUB_TAG; |
| 521 | + } |
| 507 | 522 | if( isNew ){ |
| 508 | | - @ <li> %h(zFilename) (new file) |
| 523 | + @ <li> %h(zFilename) %s(zUnpubTag) (new file) |
| 509 | 524 | @ %z(href("%R/artifact/%s",zNew))[view]</a></li> |
| 510 | 525 | }else if( isDel ){ |
| 511 | 526 | @ <li> %h(zFilename) (deleted)</li> |
| 512 | 527 | }else if( fossil_strcmp(zOld,zNew)==0 && zOldName!=0 ){ |
| 513 | | - @ <li> %h(zOldName) → %h(zFilename) |
| 528 | + @ <li> %h(zOldName) → %h(zFilename) %s(zUnpubTag) |
| 514 | 529 | @ %z(href("%R/artifact/%s",zNew))[view]</a></li> |
| 515 | 530 | }else{ |
| 516 | 531 | if( zOldName!=0 ){ |
| 517 | | - @ <li> %h(zOldName) → %h(zFilename) |
| 532 | + @ <li> %h(zOldName) → %h(zFilename) %s(zUnpubTag) |
| 518 | 533 | }else{ |
| 519 | | - @ <li> %h(zFilename) |
| 534 | + @ <li> %h(zFilename) %s(zUnpubTag) |
| 520 | 535 | } |
| 521 | 536 | @ %z(href("%R/fdiff?sbs=1&v1=%s&v2=%s",zOld,zNew))[diff]</a></li> |
| 522 | 537 | } |
| 523 | 538 | } |
| 524 | 539 | db_reset(&fchngQuery); |
| | @@ -1617,11 +1632,15 @@ |
| 1617 | 1632 | sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], zBrType); |
| 1618 | 1633 | n = strlen(zPrefix); |
| 1619 | 1634 | } |
| 1620 | 1635 | if( fossil_strcmp(zCurrentUuid,zId)==0 ){ |
| 1621 | 1636 | sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*CURRENT* "); |
| 1622 | | - n += strlen(zPrefix); |
| 1637 | + n += strlen(zPrefix+n); |
| 1638 | + } |
| 1639 | + if( content_is_private(rid) ){ |
| 1640 | + sqlite3_snprintf(sizeof(zPrefix)-n, &zPrefix[n], "*UNPUBLISHED* "); |
| 1641 | + n += strlen(zPrefix+n); |
| 1623 | 1642 | } |
| 1624 | 1643 | zFree = mprintf("[%S] %s%s", zId, zPrefix, zCom); |
| 1625 | 1644 | /* record another X lines */ |
| 1626 | 1645 | nLine += comment_print(zFree, zCom, 9, width, g.comFmtFlags); |
| 1627 | 1646 | fossil_free(zFree); |
| 1628 | 1647 | |