Fossil SCM
On the /finfo page, change the check-in range query parameters from ci= and orig= into from= and to=. This gets the ci= query parameter out of the way so that it can be reused.
Commit
299800b29d85e71e177be140af568419cbfa19287a54cadc414611e8a6392a52
Parent
04ef2df613c2126…
2 files changed
+5
-5
+29
-28
+5
-5
| --- src/diff.c | ||
| +++ src/diff.c | ||
| @@ -2483,13 +2483,13 @@ | ||
| 2483 | 2483 | ann.aVers[i].zBgColor = mprintf("#%06x", clr); |
| 2484 | 2484 | } |
| 2485 | 2485 | |
| 2486 | 2486 | @ <div id="annotation_log" style='display:%s(showLog?"block":"none");'> |
| 2487 | 2487 | if( zOrigin ){ |
| 2488 | - zLink = href("%R/finfo?name=%t&ci=%!S&orig=%!S",zFilename,zCI,zOrigin); | |
| 2488 | + zLink = href("%R/finfo?name=%t&from=%!S&to=%!S",zFilename,zCI,zOrigin); | |
| 2489 | 2489 | }else{ |
| 2490 | - zLink = href("%R/finfo?name=%t&ci=%!S",zFilename,zCI); | |
| 2490 | + zLink = href("%R/finfo?name=%t&from=%!S",zFilename,zCI); | |
| 2491 | 2491 | } |
| 2492 | 2492 | @ <h2>Versions of %z(zLink)%h(zFilename)</a> analyzed:</h2> |
| 2493 | 2493 | @ <ol> |
| 2494 | 2494 | for(p=ann.aVers, i=0; i<ann.nVers; i++, p++){ |
| 2495 | 2495 | @ <li><span style='background-color:%s(p->zBgColor);'>%s(p->zDate) |
| @@ -2502,21 +2502,21 @@ | ||
| 2502 | 2502 | @ </div> |
| 2503 | 2503 | |
| 2504 | 2504 | if( !ann.bMoreToDo ){ |
| 2505 | 2505 | assert( ann.origId==0 ); /* bMoreToDo always set for a point-to-point */ |
| 2506 | 2506 | @ <h2>Origin for each line in |
| 2507 | - @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2507 | + @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2508 | 2508 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2509 | 2509 | }else if( ann.origId>0 ){ |
| 2510 | 2510 | @ <h2>Lines of |
| 2511 | - @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2511 | + @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2512 | 2512 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a> |
| 2513 | 2513 | @ that are changed by the sequence of edits moving toward |
| 2514 | 2514 | @ check-in %z(href("%R/info/%!S",zOrigin))%S(zOrigin)</a>:</h2> |
| 2515 | 2515 | }else{ |
| 2516 | 2516 | @ <h2>Lines added by the %d(ann.nVers) most recent ancestors of |
| 2517 | - @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2517 | + @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> | |
| 2518 | 2518 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2519 | 2519 | } |
| 2520 | 2520 | @ <pre> |
| 2521 | 2521 | szHash = 10; |
| 2522 | 2522 | for(i=0; i<ann.nOrig; i++){ |
| 2523 | 2523 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -2483,13 +2483,13 @@ | |
| 2483 | ann.aVers[i].zBgColor = mprintf("#%06x", clr); |
| 2484 | } |
| 2485 | |
| 2486 | @ <div id="annotation_log" style='display:%s(showLog?"block":"none");'> |
| 2487 | if( zOrigin ){ |
| 2488 | zLink = href("%R/finfo?name=%t&ci=%!S&orig=%!S",zFilename,zCI,zOrigin); |
| 2489 | }else{ |
| 2490 | zLink = href("%R/finfo?name=%t&ci=%!S",zFilename,zCI); |
| 2491 | } |
| 2492 | @ <h2>Versions of %z(zLink)%h(zFilename)</a> analyzed:</h2> |
| 2493 | @ <ol> |
| 2494 | for(p=ann.aVers, i=0; i<ann.nVers; i++, p++){ |
| 2495 | @ <li><span style='background-color:%s(p->zBgColor);'>%s(p->zDate) |
| @@ -2502,21 +2502,21 @@ | |
| 2502 | @ </div> |
| 2503 | |
| 2504 | if( !ann.bMoreToDo ){ |
| 2505 | assert( ann.origId==0 ); /* bMoreToDo always set for a point-to-point */ |
| 2506 | @ <h2>Origin for each line in |
| 2507 | @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2508 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2509 | }else if( ann.origId>0 ){ |
| 2510 | @ <h2>Lines of |
| 2511 | @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2512 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a> |
| 2513 | @ that are changed by the sequence of edits moving toward |
| 2514 | @ check-in %z(href("%R/info/%!S",zOrigin))%S(zOrigin)</a>:</h2> |
| 2515 | }else{ |
| 2516 | @ <h2>Lines added by the %d(ann.nVers) most recent ancestors of |
| 2517 | @ %z(href("%R/finfo?name=%h&ci=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2518 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2519 | } |
| 2520 | @ <pre> |
| 2521 | szHash = 10; |
| 2522 | for(i=0; i<ann.nOrig; i++){ |
| 2523 |
| --- src/diff.c | |
| +++ src/diff.c | |
| @@ -2483,13 +2483,13 @@ | |
| 2483 | ann.aVers[i].zBgColor = mprintf("#%06x", clr); |
| 2484 | } |
| 2485 | |
| 2486 | @ <div id="annotation_log" style='display:%s(showLog?"block":"none");'> |
| 2487 | if( zOrigin ){ |
| 2488 | zLink = href("%R/finfo?name=%t&from=%!S&to=%!S",zFilename,zCI,zOrigin); |
| 2489 | }else{ |
| 2490 | zLink = href("%R/finfo?name=%t&from=%!S",zFilename,zCI); |
| 2491 | } |
| 2492 | @ <h2>Versions of %z(zLink)%h(zFilename)</a> analyzed:</h2> |
| 2493 | @ <ol> |
| 2494 | for(p=ann.aVers, i=0; i<ann.nVers; i++, p++){ |
| 2495 | @ <li><span style='background-color:%s(p->zBgColor);'>%s(p->zDate) |
| @@ -2502,21 +2502,21 @@ | |
| 2502 | @ </div> |
| 2503 | |
| 2504 | if( !ann.bMoreToDo ){ |
| 2505 | assert( ann.origId==0 ); /* bMoreToDo always set for a point-to-point */ |
| 2506 | @ <h2>Origin for each line in |
| 2507 | @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2508 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2509 | }else if( ann.origId>0 ){ |
| 2510 | @ <h2>Lines of |
| 2511 | @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2512 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a> |
| 2513 | @ that are changed by the sequence of edits moving toward |
| 2514 | @ check-in %z(href("%R/info/%!S",zOrigin))%S(zOrigin)</a>:</h2> |
| 2515 | }else{ |
| 2516 | @ <h2>Lines added by the %d(ann.nVers) most recent ancestors of |
| 2517 | @ %z(href("%R/finfo?name=%h&from=%!S", zFilename, zCI))%h(zFilename)</a> |
| 2518 | @ from check-in %z(href("%R/info/%!S",zCI))%S(zCI)</a>:</h2> |
| 2519 | } |
| 2520 | @ <pre> |
| 2521 | szHash = 10; |
| 2522 | for(i=0; i<ann.nOrig; i++){ |
| 2523 |
+29
-28
| --- src/finfo.c | ||
| +++ src/finfo.c | ||
| @@ -277,20 +277,21 @@ | ||
| 277 | 277 | ** |
| 278 | 278 | ** Show the change history for a single file. |
| 279 | 279 | ** |
| 280 | 280 | ** Additional query parameters: |
| 281 | 281 | ** |
| 282 | -** a=DATETIME Only show changes after DATETIME | |
| 283 | -** b=DATETIME Only show changes before DATETIME | |
| 284 | -** m=HASH Mark this particular file version | |
| 285 | -** n=NUM Show the first NUM changes only | |
| 286 | -** brbg Background color by branch name | |
| 287 | -** ubg Background color by user name | |
| 288 | -** ci=HASH Ancestors of a particular check-in | |
| 289 | -** orig=HASH If both ci and orig are supplied, only show those | |
| 290 | -** changes on a direct path from orig to ci. | |
| 291 | -** showid Show RID values for debugging | |
| 282 | +** a=DATETIME Only show changes after DATETIME | |
| 283 | +** b=DATETIME Only show changes before DATETIME | |
| 284 | +** m=HASH Mark this particular file version | |
| 285 | +** n=NUM Show the first NUM changes only | |
| 286 | +** name=FILENAME (Required) name of file whose history to show | |
| 287 | +** brbg Background color by branch name | |
| 288 | +** ubg Background color by user name | |
| 289 | +** from=HASH Ancestors of a particular check-in | |
| 290 | +** to=HASH If both from= and to= are supplied, only show those | |
| 291 | +** changes on the direct path between them. | |
| 292 | +** showid Show RID values for debugging | |
| 292 | 293 | ** |
| 293 | 294 | ** DATETIME may be in any of usual formats, including "now", |
| 294 | 295 | ** "YYYY-MM-DDTHH:MM:SS.SSS", "YYYYMMDDHHMM", and others. |
| 295 | 296 | */ |
| 296 | 297 | void finfo_page(void){ |
| @@ -298,12 +299,12 @@ | ||
| 298 | 299 | const char *zFilename = PD("name",""); |
| 299 | 300 | char zPrevDate[20]; |
| 300 | 301 | const char *zA; |
| 301 | 302 | const char *zB; |
| 302 | 303 | int n; |
| 303 | - int baseCheckin; | |
| 304 | - int origCheckin = 0; | |
| 304 | + int ridFrom; | |
| 305 | + int ridTo = 0; | |
| 305 | 306 | int fnid; |
| 306 | 307 | Blob title; |
| 307 | 308 | Blob sql; |
| 308 | 309 | HQuery url; |
| 309 | 310 | GraphContext *pGraph; |
| @@ -340,11 +341,11 @@ | ||
| 340 | 341 | zStyle = "Modern"; |
| 341 | 342 | } |
| 342 | 343 | url_initialize(&url, "finfo"); |
| 343 | 344 | if( brBg ) url_add_parameter(&url, "brbg", 0); |
| 344 | 345 | if( uBg ) url_add_parameter(&url, "ubg", 0); |
| 345 | - baseCheckin = name_to_rid_www("ci"); | |
| 346 | + ridFrom = name_to_rid_www("from"); | |
| 346 | 347 | zPrevDate[0] = 0; |
| 347 | 348 | cookie_render(); |
| 348 | 349 | if( fnid==0 ){ |
| 349 | 350 | @ No such file: %h(zFilename) |
| 350 | 351 | style_footer(); |
| @@ -351,16 +352,16 @@ | ||
| 351 | 352 | return; |
| 352 | 353 | } |
| 353 | 354 | if( g.perm.Admin ){ |
| 354 | 355 | style_submenu_element("MLink Table", "%R/mlink?name=%t", zFilename); |
| 355 | 356 | } |
| 356 | - if( baseCheckin ){ | |
| 357 | - if( P("orig")!=0 ){ | |
| 358 | - origCheckin = name_to_typed_rid(P("orig"),"ci"); | |
| 359 | - path_shortest_stored_in_ancestor_table(origCheckin, baseCheckin); | |
| 357 | + if( ridFrom ){ | |
| 358 | + if( P("to")!=0 ){ | |
| 359 | + ridTo = name_to_typed_rid(P("to"),"ci"); | |
| 360 | + path_shortest_stored_in_ancestor_table(ridFrom,ridTo); | |
| 360 | 361 | }else{ |
| 361 | - compute_direct_ancestors(baseCheckin); | |
| 362 | + compute_direct_ancestors(ridFrom); | |
| 362 | 363 | } |
| 363 | 364 | } |
| 364 | 365 | url_add_parameter(&url, "name", zFilename); |
| 365 | 366 | blob_zero(&sql); |
| 366 | 367 | blob_append_sql(&sql, |
| @@ -393,11 +394,11 @@ | ||
| 393 | 394 | if( (zB = P("b"))!=0 ){ |
| 394 | 395 | blob_append_sql(&sql, " AND event.mtime<=%.16g", |
| 395 | 396 | symbolic_name_to_mtime(zB,0)); |
| 396 | 397 | url_add_parameter(&url, "b", zB); |
| 397 | 398 | } |
| 398 | - if( baseCheckin ){ | |
| 399 | + if( ridFrom ){ | |
| 399 | 400 | blob_append_sql(&sql, |
| 400 | 401 | " AND mlink.mid IN (SELECT rid FROM ancestor)" |
| 401 | 402 | " GROUP BY mlink.fid" |
| 402 | 403 | ); |
| 403 | 404 | }else{ |
| @@ -427,14 +428,14 @@ | ||
| 427 | 428 | if( zMark ){ |
| 428 | 429 | selRid = symbolic_name_to_rid(zMark, "*"); |
| 429 | 430 | } |
| 430 | 431 | blob_reset(&sql); |
| 431 | 432 | blob_zero(&title); |
| 432 | - if( baseCheckin ){ | |
| 433 | - char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", baseCheckin); | |
| 433 | + if( ridFrom ){ | |
| 434 | + char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ridFrom); | |
| 434 | 435 | char *zLink = href("%R/info/%!S", zUuid); |
| 435 | - if( origCheckin ){ | |
| 436 | + if( ridTo ){ | |
| 436 | 437 | blob_appendf(&title, "Changes to file "); |
| 437 | 438 | }else if( n>0 ){ |
| 438 | 439 | blob_appendf(&title, "First %d ancestors of file ", n); |
| 439 | 440 | }else{ |
| 440 | 441 | blob_appendf(&title, "Ancestors of file "); |
| @@ -441,16 +442,16 @@ | ||
| 441 | 442 | } |
| 442 | 443 | blob_appendf(&title,"%z%h</a>", |
| 443 | 444 | href("%R/file?name=%T&ci=%!S", zFilename, zUuid), |
| 444 | 445 | zFilename); |
| 445 | 446 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 446 | - blob_append(&title, origCheckin ? " between " : " from ", -1); | |
| 447 | + blob_append(&title, ridTo ? " between " : " from ", -1); | |
| 447 | 448 | blob_appendf(&title, "check-in %z%S</a>", zLink, zUuid); |
| 448 | - if( fShowId ) blob_appendf(&title, " (%d)", baseCheckin); | |
| 449 | + if( fShowId ) blob_appendf(&title, " (%d)", ridFrom); | |
| 449 | 450 | fossil_free(zUuid); |
| 450 | - if( origCheckin ){ | |
| 451 | - zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", origCheckin); | |
| 451 | + if( ridTo ){ | |
| 452 | + zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ridTo); | |
| 452 | 453 | zLink = href("%R/info/%!S", zUuid); |
| 453 | 454 | blob_appendf(&title, " and check-in %z%S</a>", zLink, zUuid); |
| 454 | 455 | fossil_free(zUuid); |
| 455 | 456 | } |
| 456 | 457 | }else{ |
| @@ -463,11 +464,11 @@ | ||
| 463 | 464 | } |
| 464 | 465 | @ <h2>%b(&title)</h2> |
| 465 | 466 | blob_reset(&title); |
| 466 | 467 | pGraph = graph_init(); |
| 467 | 468 | @ <table id="timelineTable%d(iTableId)" class="timelineTable"> |
| 468 | - if( baseCheckin ){ | |
| 469 | + if( ridFrom ){ | |
| 469 | 470 | db_prepare(&qparent, |
| 470 | 471 | "SELECT DISTINCT pid FROM mlink" |
| 471 | 472 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 472 | 473 | " AND pmid IN (SELECT rid FROM ancestor)" |
| 473 | 474 | " ORDER BY isaux /*sort*/" |
| @@ -587,11 +588,11 @@ | ||
| 587 | 588 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 588 | 589 | @ size: %d(szFile)) |
| 589 | 590 | }else{ |
| 590 | 591 | @ size: %d(szFile) |
| 591 | 592 | } |
| 592 | - if( zUuid && origCheckin==0 ){ | |
| 593 | + if( zUuid && ridTo==0 ){ | |
| 593 | 594 | if( nParent==0 ){ |
| 594 | 595 | @ <b>Added</b> |
| 595 | 596 | }else if( pfnid ){ |
| 596 | 597 | char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 597 | 598 | pfnid); |
| 598 | 599 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -277,20 +277,21 @@ | |
| 277 | ** |
| 278 | ** Show the change history for a single file. |
| 279 | ** |
| 280 | ** Additional query parameters: |
| 281 | ** |
| 282 | ** a=DATETIME Only show changes after DATETIME |
| 283 | ** b=DATETIME Only show changes before DATETIME |
| 284 | ** m=HASH Mark this particular file version |
| 285 | ** n=NUM Show the first NUM changes only |
| 286 | ** brbg Background color by branch name |
| 287 | ** ubg Background color by user name |
| 288 | ** ci=HASH Ancestors of a particular check-in |
| 289 | ** orig=HASH If both ci and orig are supplied, only show those |
| 290 | ** changes on a direct path from orig to ci. |
| 291 | ** showid Show RID values for debugging |
| 292 | ** |
| 293 | ** DATETIME may be in any of usual formats, including "now", |
| 294 | ** "YYYY-MM-DDTHH:MM:SS.SSS", "YYYYMMDDHHMM", and others. |
| 295 | */ |
| 296 | void finfo_page(void){ |
| @@ -298,12 +299,12 @@ | |
| 298 | const char *zFilename = PD("name",""); |
| 299 | char zPrevDate[20]; |
| 300 | const char *zA; |
| 301 | const char *zB; |
| 302 | int n; |
| 303 | int baseCheckin; |
| 304 | int origCheckin = 0; |
| 305 | int fnid; |
| 306 | Blob title; |
| 307 | Blob sql; |
| 308 | HQuery url; |
| 309 | GraphContext *pGraph; |
| @@ -340,11 +341,11 @@ | |
| 340 | zStyle = "Modern"; |
| 341 | } |
| 342 | url_initialize(&url, "finfo"); |
| 343 | if( brBg ) url_add_parameter(&url, "brbg", 0); |
| 344 | if( uBg ) url_add_parameter(&url, "ubg", 0); |
| 345 | baseCheckin = name_to_rid_www("ci"); |
| 346 | zPrevDate[0] = 0; |
| 347 | cookie_render(); |
| 348 | if( fnid==0 ){ |
| 349 | @ No such file: %h(zFilename) |
| 350 | style_footer(); |
| @@ -351,16 +352,16 @@ | |
| 351 | return; |
| 352 | } |
| 353 | if( g.perm.Admin ){ |
| 354 | style_submenu_element("MLink Table", "%R/mlink?name=%t", zFilename); |
| 355 | } |
| 356 | if( baseCheckin ){ |
| 357 | if( P("orig")!=0 ){ |
| 358 | origCheckin = name_to_typed_rid(P("orig"),"ci"); |
| 359 | path_shortest_stored_in_ancestor_table(origCheckin, baseCheckin); |
| 360 | }else{ |
| 361 | compute_direct_ancestors(baseCheckin); |
| 362 | } |
| 363 | } |
| 364 | url_add_parameter(&url, "name", zFilename); |
| 365 | blob_zero(&sql); |
| 366 | blob_append_sql(&sql, |
| @@ -393,11 +394,11 @@ | |
| 393 | if( (zB = P("b"))!=0 ){ |
| 394 | blob_append_sql(&sql, " AND event.mtime<=%.16g", |
| 395 | symbolic_name_to_mtime(zB,0)); |
| 396 | url_add_parameter(&url, "b", zB); |
| 397 | } |
| 398 | if( baseCheckin ){ |
| 399 | blob_append_sql(&sql, |
| 400 | " AND mlink.mid IN (SELECT rid FROM ancestor)" |
| 401 | " GROUP BY mlink.fid" |
| 402 | ); |
| 403 | }else{ |
| @@ -427,14 +428,14 @@ | |
| 427 | if( zMark ){ |
| 428 | selRid = symbolic_name_to_rid(zMark, "*"); |
| 429 | } |
| 430 | blob_reset(&sql); |
| 431 | blob_zero(&title); |
| 432 | if( baseCheckin ){ |
| 433 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", baseCheckin); |
| 434 | char *zLink = href("%R/info/%!S", zUuid); |
| 435 | if( origCheckin ){ |
| 436 | blob_appendf(&title, "Changes to file "); |
| 437 | }else if( n>0 ){ |
| 438 | blob_appendf(&title, "First %d ancestors of file ", n); |
| 439 | }else{ |
| 440 | blob_appendf(&title, "Ancestors of file "); |
| @@ -441,16 +442,16 @@ | |
| 441 | } |
| 442 | blob_appendf(&title,"%z%h</a>", |
| 443 | href("%R/file?name=%T&ci=%!S", zFilename, zUuid), |
| 444 | zFilename); |
| 445 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 446 | blob_append(&title, origCheckin ? " between " : " from ", -1); |
| 447 | blob_appendf(&title, "check-in %z%S</a>", zLink, zUuid); |
| 448 | if( fShowId ) blob_appendf(&title, " (%d)", baseCheckin); |
| 449 | fossil_free(zUuid); |
| 450 | if( origCheckin ){ |
| 451 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", origCheckin); |
| 452 | zLink = href("%R/info/%!S", zUuid); |
| 453 | blob_appendf(&title, " and check-in %z%S</a>", zLink, zUuid); |
| 454 | fossil_free(zUuid); |
| 455 | } |
| 456 | }else{ |
| @@ -463,11 +464,11 @@ | |
| 463 | } |
| 464 | @ <h2>%b(&title)</h2> |
| 465 | blob_reset(&title); |
| 466 | pGraph = graph_init(); |
| 467 | @ <table id="timelineTable%d(iTableId)" class="timelineTable"> |
| 468 | if( baseCheckin ){ |
| 469 | db_prepare(&qparent, |
| 470 | "SELECT DISTINCT pid FROM mlink" |
| 471 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 472 | " AND pmid IN (SELECT rid FROM ancestor)" |
| 473 | " ORDER BY isaux /*sort*/" |
| @@ -587,11 +588,11 @@ | |
| 587 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 588 | @ size: %d(szFile)) |
| 589 | }else{ |
| 590 | @ size: %d(szFile) |
| 591 | } |
| 592 | if( zUuid && origCheckin==0 ){ |
| 593 | if( nParent==0 ){ |
| 594 | @ <b>Added</b> |
| 595 | }else if( pfnid ){ |
| 596 | char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 597 | pfnid); |
| 598 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -277,20 +277,21 @@ | |
| 277 | ** |
| 278 | ** Show the change history for a single file. |
| 279 | ** |
| 280 | ** Additional query parameters: |
| 281 | ** |
| 282 | ** a=DATETIME Only show changes after DATETIME |
| 283 | ** b=DATETIME Only show changes before DATETIME |
| 284 | ** m=HASH Mark this particular file version |
| 285 | ** n=NUM Show the first NUM changes only |
| 286 | ** name=FILENAME (Required) name of file whose history to show |
| 287 | ** brbg Background color by branch name |
| 288 | ** ubg Background color by user name |
| 289 | ** from=HASH Ancestors of a particular check-in |
| 290 | ** to=HASH If both from= and to= are supplied, only show those |
| 291 | ** changes on the direct path between them. |
| 292 | ** showid Show RID values for debugging |
| 293 | ** |
| 294 | ** DATETIME may be in any of usual formats, including "now", |
| 295 | ** "YYYY-MM-DDTHH:MM:SS.SSS", "YYYYMMDDHHMM", and others. |
| 296 | */ |
| 297 | void finfo_page(void){ |
| @@ -298,12 +299,12 @@ | |
| 299 | const char *zFilename = PD("name",""); |
| 300 | char zPrevDate[20]; |
| 301 | const char *zA; |
| 302 | const char *zB; |
| 303 | int n; |
| 304 | int ridFrom; |
| 305 | int ridTo = 0; |
| 306 | int fnid; |
| 307 | Blob title; |
| 308 | Blob sql; |
| 309 | HQuery url; |
| 310 | GraphContext *pGraph; |
| @@ -340,11 +341,11 @@ | |
| 341 | zStyle = "Modern"; |
| 342 | } |
| 343 | url_initialize(&url, "finfo"); |
| 344 | if( brBg ) url_add_parameter(&url, "brbg", 0); |
| 345 | if( uBg ) url_add_parameter(&url, "ubg", 0); |
| 346 | ridFrom = name_to_rid_www("from"); |
| 347 | zPrevDate[0] = 0; |
| 348 | cookie_render(); |
| 349 | if( fnid==0 ){ |
| 350 | @ No such file: %h(zFilename) |
| 351 | style_footer(); |
| @@ -351,16 +352,16 @@ | |
| 352 | return; |
| 353 | } |
| 354 | if( g.perm.Admin ){ |
| 355 | style_submenu_element("MLink Table", "%R/mlink?name=%t", zFilename); |
| 356 | } |
| 357 | if( ridFrom ){ |
| 358 | if( P("to")!=0 ){ |
| 359 | ridTo = name_to_typed_rid(P("to"),"ci"); |
| 360 | path_shortest_stored_in_ancestor_table(ridFrom,ridTo); |
| 361 | }else{ |
| 362 | compute_direct_ancestors(ridFrom); |
| 363 | } |
| 364 | } |
| 365 | url_add_parameter(&url, "name", zFilename); |
| 366 | blob_zero(&sql); |
| 367 | blob_append_sql(&sql, |
| @@ -393,11 +394,11 @@ | |
| 394 | if( (zB = P("b"))!=0 ){ |
| 395 | blob_append_sql(&sql, " AND event.mtime<=%.16g", |
| 396 | symbolic_name_to_mtime(zB,0)); |
| 397 | url_add_parameter(&url, "b", zB); |
| 398 | } |
| 399 | if( ridFrom ){ |
| 400 | blob_append_sql(&sql, |
| 401 | " AND mlink.mid IN (SELECT rid FROM ancestor)" |
| 402 | " GROUP BY mlink.fid" |
| 403 | ); |
| 404 | }else{ |
| @@ -427,14 +428,14 @@ | |
| 428 | if( zMark ){ |
| 429 | selRid = symbolic_name_to_rid(zMark, "*"); |
| 430 | } |
| 431 | blob_reset(&sql); |
| 432 | blob_zero(&title); |
| 433 | if( ridFrom ){ |
| 434 | char *zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ridFrom); |
| 435 | char *zLink = href("%R/info/%!S", zUuid); |
| 436 | if( ridTo ){ |
| 437 | blob_appendf(&title, "Changes to file "); |
| 438 | }else if( n>0 ){ |
| 439 | blob_appendf(&title, "First %d ancestors of file ", n); |
| 440 | }else{ |
| 441 | blob_appendf(&title, "Ancestors of file "); |
| @@ -441,16 +442,16 @@ | |
| 442 | } |
| 443 | blob_appendf(&title,"%z%h</a>", |
| 444 | href("%R/file?name=%T&ci=%!S", zFilename, zUuid), |
| 445 | zFilename); |
| 446 | if( fShowId ) blob_appendf(&title, " (%d)", fnid); |
| 447 | blob_append(&title, ridTo ? " between " : " from ", -1); |
| 448 | blob_appendf(&title, "check-in %z%S</a>", zLink, zUuid); |
| 449 | if( fShowId ) blob_appendf(&title, " (%d)", ridFrom); |
| 450 | fossil_free(zUuid); |
| 451 | if( ridTo ){ |
| 452 | zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", ridTo); |
| 453 | zLink = href("%R/info/%!S", zUuid); |
| 454 | blob_appendf(&title, " and check-in %z%S</a>", zLink, zUuid); |
| 455 | fossil_free(zUuid); |
| 456 | } |
| 457 | }else{ |
| @@ -463,11 +464,11 @@ | |
| 464 | } |
| 465 | @ <h2>%b(&title)</h2> |
| 466 | blob_reset(&title); |
| 467 | pGraph = graph_init(); |
| 468 | @ <table id="timelineTable%d(iTableId)" class="timelineTable"> |
| 469 | if( ridFrom ){ |
| 470 | db_prepare(&qparent, |
| 471 | "SELECT DISTINCT pid FROM mlink" |
| 472 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 473 | " AND pmid IN (SELECT rid FROM ancestor)" |
| 474 | " ORDER BY isaux /*sort*/" |
| @@ -587,11 +588,11 @@ | |
| 588 | if( tmFlags & (TIMELINE_COMPACT|TIMELINE_VERBOSE) ){ |
| 589 | @ size: %d(szFile)) |
| 590 | }else{ |
| 591 | @ size: %d(szFile) |
| 592 | } |
| 593 | if( zUuid && ridTo==0 ){ |
| 594 | if( nParent==0 ){ |
| 595 | @ <b>Added</b> |
| 596 | }else if( pfnid ){ |
| 597 | char *zPrevName = db_text(0,"SELECT name FROM filename WHERE fnid=%d", |
| 598 | pfnid); |
| 599 |