| | @@ -284,10 +284,12 @@ |
| 284 | 284 | ** b=DATETIME Only show changes before DATETIME |
| 285 | 285 | ** n=NUM Show the first NUM changes only |
| 286 | 286 | ** brbg Background color by branch name |
| 287 | 287 | ** ubg Background color by user name |
| 288 | 288 | ** ci=UUID Ancestors of a particular check-in |
| 289 | +** orig=UUID If both ci and orig are supplied, only show those |
| 290 | +** changes on a direct path from orig to ci. |
| 289 | 291 | ** showid Show RID values for debugging |
| 290 | 292 | ** |
| 291 | 293 | ** DATETIME may be "now" or "YYYY-MM-DDTHH:MM:SS.SSS". If in |
| 292 | 294 | ** year-month-day form, it may be truncated, and it may also name a |
| 293 | 295 | ** timezone offset from UTC as "-HH:MM" (westward) or "+HH:MM" |
| | @@ -299,10 +301,11 @@ |
| 299 | 301 | char zPrevDate[20]; |
| 300 | 302 | const char *zA; |
| 301 | 303 | const char *zB; |
| 302 | 304 | int n; |
| 303 | 305 | int baseCheckin; |
| 306 | + int origCheckin = 0; |
| 304 | 307 | int fnid; |
| 305 | 308 | Blob title; |
| 306 | 309 | Blob sql; |
| 307 | 310 | HQuery url; |
| 308 | 311 | GraphContext *pGraph; |
| | @@ -331,11 +334,16 @@ |
| 331 | 334 | } |
| 332 | 335 | if( g.perm.Admin ){ |
| 333 | 336 | style_submenu_element("MLink Table", "%R/mlink?name=%t", zFilename); |
| 334 | 337 | } |
| 335 | 338 | if( baseCheckin ){ |
| 336 | | - compute_direct_ancestors(baseCheckin); |
| 339 | + if( P("orig")!=0 ){ |
| 340 | + origCheckin = name_to_typed_rid(P("orig"),"ci"); |
| 341 | + path_shortest_stored_in_ancestor_table(origCheckin, baseCheckin); |
| 342 | + }else{ |
| 343 | + compute_direct_ancestors(baseCheckin); |
| 344 | + } |
| 337 | 345 | } |
| 338 | 346 | url_add_parameter(&url, "name", zFilename); |
| 339 | 347 | blob_zero(&sql); |
| 340 | 348 | blob_append_sql(&sql, |
| 341 | 349 | "SELECT" |
| | @@ -398,21 +406,30 @@ |
| 398 | 406 | blob_reset(&sql); |
| 399 | 407 | blob_zero(&title); |
| 400 | 408 | if( baseCheckin ){ |
| 401 | 409 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", baseCheckin); |
| 402 | 410 | char *zLink = href("%R/info/%!S", zUuid); |
| 403 | | - if( n>0 ){ |
| 411 | + if( origCheckin ){ |
| 412 | + blob_appendf(&title, "Changes to file "); |
| 413 | + }else if( n>0 ){ |
| 404 | 414 | blob_appendf(&title, "First %d ancestors of file ", n); |
| 405 | 415 | }else{ |
| 406 | 416 | blob_appendf(&title, "Ancestors of file "); |
| 407 | 417 | } |
| 408 | 418 | blob_appendf(&title,"<a href='%R/finfo?name=%T'>%h</a>", |
| 409 | 419 | zFilename, zFilename); |
| 410 | 420 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 411 | | - blob_appendf(&title, " from check-in %z%S</a>", zLink, zUuid); |
| 421 | + blob_append(&title, origCheckin ? " between " : " from ", -1); |
| 422 | + blob_appendf(&title, "check-in %z%S</a>", zLink, zUuid); |
| 412 | 423 | if( fShowId ) blob_appendf(&title, " (%d)", baseCheckin); |
| 413 | 424 | fossil_free(zUuid); |
| 425 | + if( origCheckin ){ |
| 426 | + zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", origCheckin); |
| 427 | + zLink = href("%R/info/%!S", zUuid); |
| 428 | + blob_appendf(&title, " and check-in %z%S</a>", zLink, zUuid); |
| 429 | + fossil_free(zUuid); |
| 430 | + } |
| 414 | 431 | }else{ |
| 415 | 432 | blob_appendf(&title, "History of "); |
| 416 | 433 | hyperlinked_path(zFilename, &title, 0, "tree", ""); |
| 417 | 434 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 418 | 435 | } |
| | @@ -486,17 +503,19 @@ |
| 486 | 503 | @ <td class="timelineTableCell" style="background-color: %h(zBgClr);"> |
| 487 | 504 | }else{ |
| 488 | 505 | @ <td class="timelineTableCell"> |
| 489 | 506 | } |
| 490 | 507 | if( zUuid ){ |
| 491 | | - if( nParent==0 ){ |
| 492 | | - @ <b>Added</b> |
| 493 | | - }else if( pfnid ){ |
| 494 | | - char *zPrevName = db_text(0, "SELECT name FROM filename WHERE fnid=%d", |
| 495 | | - pfnid); |
| 496 | | - @ <b>Renamed</b> from |
| 497 | | - @ %z(href("%R/finfo?name=%t", zPrevName))%h(zPrevName)</a> |
| 508 | + if( origCheckin==0 ){ |
| 509 | + if( nParent==0 ){ |
| 510 | + @ <b>Added</b> |
| 511 | + }else if( pfnid ){ |
| 512 | + char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 513 | + pfnid); |
| 514 | + @ <b>Renamed</b> from |
| 515 | + @ %z(href("%R/finfo?name=%t", zPrevName))%h(zPrevName)</a> |
| 516 | + } |
| 498 | 517 | } |
| 499 | 518 | @ %z(href("%R/artifact/%!S",zUuid))[%S(zUuid)]</a> |
| 500 | 519 | if( fShowId ){ |
| 501 | 520 | int srcId = delta_source_rid(frid); |
| 502 | 521 | if( srcId>0 ){ |
| 503 | 522 | |