Fossil SCM
Improvements to the the /finfo ancestry calculation.
Commit
116921fd86659636a379315dfa30ff7ed4978e18
Parent
03250bc6490de95…
1 file changed
+15
-16
+15
-16
| --- src/finfo.c | ||
| +++ src/finfo.c | ||
| @@ -294,11 +294,11 @@ | ||
| 294 | 294 | const char *zA; |
| 295 | 295 | const char *zB; |
| 296 | 296 | int n; |
| 297 | 297 | int baseCheckin; |
| 298 | 298 | int fnid; |
| 299 | - | |
| 299 | + Bag ancestor; | |
| 300 | 300 | Blob title; |
| 301 | 301 | Blob sql; |
| 302 | 302 | HQuery url; |
| 303 | 303 | GraphContext *pGraph; |
| 304 | 304 | int brBg = P("brbg")!=0; |
| @@ -320,10 +320,18 @@ | ||
| 320 | 320 | if( fnid==0 ){ |
| 321 | 321 | @ No such file: %h(zFilename) |
| 322 | 322 | style_footer(); |
| 323 | 323 | return; |
| 324 | 324 | } |
| 325 | + if( baseCheckin ){ | |
| 326 | + int baseFid = db_int(0, | |
| 327 | + "SELECT fid FROM mlink WHERE fnid=%d AND mid=%d", | |
| 328 | + fnid, baseCheckin | |
| 329 | + ); | |
| 330 | + bag_init(&ancestor); | |
| 331 | + if( baseFid ) bag_insert(&ancestor, baseFid); | |
| 332 | + } | |
| 325 | 333 | url_add_parameter(&url, "name", zFilename); |
| 326 | 334 | blob_zero(&sql); |
| 327 | 335 | blob_append_sql(&sql, |
| 328 | 336 | "SELECT" |
| 329 | 337 | " datetime(min(event.mtime)%s)," /* Date of change */ |
| @@ -342,24 +350,10 @@ | ||
| 342 | 350 | " FROM mlink, event" |
| 343 | 351 | " WHERE mlink.fnid=%d" |
| 344 | 352 | " AND event.objid=mlink.mid", |
| 345 | 353 | timeline_utc(), TAG_BRANCH, fnid |
| 346 | 354 | ); |
| 347 | - if( baseCheckin ){ | |
| 348 | - blob_append_sql(&sql, | |
| 349 | - " AND mlink.fid IN (" | |
| 350 | - " WITH RECURSIVE x(fid) AS (" | |
| 351 | - " SELECT mlink.fid FROM mlink" | |
| 352 | - " WHERE mlink.mid=%d AND mlink.fnid=%d" | |
| 353 | - " UNION" | |
| 354 | - " SELECT mlink.pid FROM mlink, x" | |
| 355 | - " WHERE mlink.fid=x.fid AND mlink.pid>0 AND +mlink.fnid=%d" | |
| 356 | - " ) SELECT fid FROM x)" | |
| 357 | - " AND event.mtime<=(SELECT mtime FROM event WHERE objid=%d)", | |
| 358 | - baseCheckin, fnid, fnid, baseCheckin | |
| 359 | - ); | |
| 360 | - } | |
| 361 | 355 | if( (zA = P("a"))!=0 ){ |
| 362 | 356 | blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zA); |
| 363 | 357 | url_add_parameter(&url, "a", zA); |
| 364 | 358 | } |
| 365 | 359 | if( (zB = P("b"))!=0 ){ |
| @@ -416,20 +410,24 @@ | ||
| 416 | 410 | int gidx; |
| 417 | 411 | char zTime[10]; |
| 418 | 412 | int nParent = 0; |
| 419 | 413 | int aParent[GR_MAX_RAIL]; |
| 420 | 414 | static Stmt qparent; |
| 415 | + | |
| 416 | + if( baseCheckin && frid && !bag_find(&ancestor, frid) ) continue; | |
| 421 | 417 | db_static_prepare(&qparent, |
| 422 | 418 | "SELECT DISTINCT pid FROM mlink" |
| 423 | 419 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 424 | 420 | " ORDER BY isaux /*sort*/" |
| 425 | 421 | ); |
| 426 | 422 | db_bind_int(&qparent, ":fid", frid); |
| 427 | 423 | db_bind_int(&qparent, ":mid", fmid); |
| 428 | 424 | db_bind_int(&qparent, ":fnid", fnid); |
| 429 | 425 | while( db_step(&qparent)==SQLITE_ROW && nParent<ArraySize(aParent) ){ |
| 430 | - aParent[nParent++] = db_column_int(&qparent, 0); | |
| 426 | + aParent[nParent] = db_column_int(&qparent, 0); | |
| 427 | + if( baseCheckin ) bag_insert(&ancestor, aParent[nParent]); | |
| 428 | + nParent++; | |
| 431 | 429 | } |
| 432 | 430 | db_reset(&qparent); |
| 433 | 431 | if( zBr==0 ) zBr = "trunk"; |
| 434 | 432 | if( uBg ){ |
| 435 | 433 | zBgClr = hash_color(zUser); |
| @@ -509,10 +507,11 @@ | ||
| 509 | 507 | @ parents=%d(aParent[0]) |
| 510 | 508 | for(ii=1; ii<nParent; ii++){ |
| 511 | 509 | @ %d(aParent[ii]) |
| 512 | 510 | } |
| 513 | 511 | } |
| 512 | + @ %z(href("%R/finfo?name=%T&ci=%s&debug=1",zFilename,zCkin))[ancestry]</a> | |
| 514 | 513 | } |
| 515 | 514 | tag_private_status(frid); |
| 516 | 515 | @ </td></tr> |
| 517 | 516 | } |
| 518 | 517 | db_finalize(&q); |
| 519 | 518 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -294,11 +294,11 @@ | |
| 294 | const char *zA; |
| 295 | const char *zB; |
| 296 | int n; |
| 297 | int baseCheckin; |
| 298 | int fnid; |
| 299 | |
| 300 | Blob title; |
| 301 | Blob sql; |
| 302 | HQuery url; |
| 303 | GraphContext *pGraph; |
| 304 | int brBg = P("brbg")!=0; |
| @@ -320,10 +320,18 @@ | |
| 320 | if( fnid==0 ){ |
| 321 | @ No such file: %h(zFilename) |
| 322 | style_footer(); |
| 323 | return; |
| 324 | } |
| 325 | url_add_parameter(&url, "name", zFilename); |
| 326 | blob_zero(&sql); |
| 327 | blob_append_sql(&sql, |
| 328 | "SELECT" |
| 329 | " datetime(min(event.mtime)%s)," /* Date of change */ |
| @@ -342,24 +350,10 @@ | |
| 342 | " FROM mlink, event" |
| 343 | " WHERE mlink.fnid=%d" |
| 344 | " AND event.objid=mlink.mid", |
| 345 | timeline_utc(), TAG_BRANCH, fnid |
| 346 | ); |
| 347 | if( baseCheckin ){ |
| 348 | blob_append_sql(&sql, |
| 349 | " AND mlink.fid IN (" |
| 350 | " WITH RECURSIVE x(fid) AS (" |
| 351 | " SELECT mlink.fid FROM mlink" |
| 352 | " WHERE mlink.mid=%d AND mlink.fnid=%d" |
| 353 | " UNION" |
| 354 | " SELECT mlink.pid FROM mlink, x" |
| 355 | " WHERE mlink.fid=x.fid AND mlink.pid>0 AND +mlink.fnid=%d" |
| 356 | " ) SELECT fid FROM x)" |
| 357 | " AND event.mtime<=(SELECT mtime FROM event WHERE objid=%d)", |
| 358 | baseCheckin, fnid, fnid, baseCheckin |
| 359 | ); |
| 360 | } |
| 361 | if( (zA = P("a"))!=0 ){ |
| 362 | blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zA); |
| 363 | url_add_parameter(&url, "a", zA); |
| 364 | } |
| 365 | if( (zB = P("b"))!=0 ){ |
| @@ -416,20 +410,24 @@ | |
| 416 | int gidx; |
| 417 | char zTime[10]; |
| 418 | int nParent = 0; |
| 419 | int aParent[GR_MAX_RAIL]; |
| 420 | static Stmt qparent; |
| 421 | db_static_prepare(&qparent, |
| 422 | "SELECT DISTINCT pid FROM mlink" |
| 423 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 424 | " ORDER BY isaux /*sort*/" |
| 425 | ); |
| 426 | db_bind_int(&qparent, ":fid", frid); |
| 427 | db_bind_int(&qparent, ":mid", fmid); |
| 428 | db_bind_int(&qparent, ":fnid", fnid); |
| 429 | while( db_step(&qparent)==SQLITE_ROW && nParent<ArraySize(aParent) ){ |
| 430 | aParent[nParent++] = db_column_int(&qparent, 0); |
| 431 | } |
| 432 | db_reset(&qparent); |
| 433 | if( zBr==0 ) zBr = "trunk"; |
| 434 | if( uBg ){ |
| 435 | zBgClr = hash_color(zUser); |
| @@ -509,10 +507,11 @@ | |
| 509 | @ parents=%d(aParent[0]) |
| 510 | for(ii=1; ii<nParent; ii++){ |
| 511 | @ %d(aParent[ii]) |
| 512 | } |
| 513 | } |
| 514 | } |
| 515 | tag_private_status(frid); |
| 516 | @ </td></tr> |
| 517 | } |
| 518 | db_finalize(&q); |
| 519 |
| --- src/finfo.c | |
| +++ src/finfo.c | |
| @@ -294,11 +294,11 @@ | |
| 294 | const char *zA; |
| 295 | const char *zB; |
| 296 | int n; |
| 297 | int baseCheckin; |
| 298 | int fnid; |
| 299 | Bag ancestor; |
| 300 | Blob title; |
| 301 | Blob sql; |
| 302 | HQuery url; |
| 303 | GraphContext *pGraph; |
| 304 | int brBg = P("brbg")!=0; |
| @@ -320,10 +320,18 @@ | |
| 320 | if( fnid==0 ){ |
| 321 | @ No such file: %h(zFilename) |
| 322 | style_footer(); |
| 323 | return; |
| 324 | } |
| 325 | if( baseCheckin ){ |
| 326 | int baseFid = db_int(0, |
| 327 | "SELECT fid FROM mlink WHERE fnid=%d AND mid=%d", |
| 328 | fnid, baseCheckin |
| 329 | ); |
| 330 | bag_init(&ancestor); |
| 331 | if( baseFid ) bag_insert(&ancestor, baseFid); |
| 332 | } |
| 333 | url_add_parameter(&url, "name", zFilename); |
| 334 | blob_zero(&sql); |
| 335 | blob_append_sql(&sql, |
| 336 | "SELECT" |
| 337 | " datetime(min(event.mtime)%s)," /* Date of change */ |
| @@ -342,24 +350,10 @@ | |
| 350 | " FROM mlink, event" |
| 351 | " WHERE mlink.fnid=%d" |
| 352 | " AND event.objid=mlink.mid", |
| 353 | timeline_utc(), TAG_BRANCH, fnid |
| 354 | ); |
| 355 | if( (zA = P("a"))!=0 ){ |
| 356 | blob_append_sql(&sql, " AND event.mtime>=julianday('%q')", zA); |
| 357 | url_add_parameter(&url, "a", zA); |
| 358 | } |
| 359 | if( (zB = P("b"))!=0 ){ |
| @@ -416,20 +410,24 @@ | |
| 410 | int gidx; |
| 411 | char zTime[10]; |
| 412 | int nParent = 0; |
| 413 | int aParent[GR_MAX_RAIL]; |
| 414 | static Stmt qparent; |
| 415 | |
| 416 | if( baseCheckin && frid && !bag_find(&ancestor, frid) ) continue; |
| 417 | db_static_prepare(&qparent, |
| 418 | "SELECT DISTINCT pid FROM mlink" |
| 419 | " WHERE fid=:fid AND mid=:mid AND pid>0 AND fnid=:fnid" |
| 420 | " ORDER BY isaux /*sort*/" |
| 421 | ); |
| 422 | db_bind_int(&qparent, ":fid", frid); |
| 423 | db_bind_int(&qparent, ":mid", fmid); |
| 424 | db_bind_int(&qparent, ":fnid", fnid); |
| 425 | while( db_step(&qparent)==SQLITE_ROW && nParent<ArraySize(aParent) ){ |
| 426 | aParent[nParent] = db_column_int(&qparent, 0); |
| 427 | if( baseCheckin ) bag_insert(&ancestor, aParent[nParent]); |
| 428 | nParent++; |
| 429 | } |
| 430 | db_reset(&qparent); |
| 431 | if( zBr==0 ) zBr = "trunk"; |
| 432 | if( uBg ){ |
| 433 | zBgClr = hash_color(zUser); |
| @@ -509,10 +507,11 @@ | |
| 507 | @ parents=%d(aParent[0]) |
| 508 | for(ii=1; ii<nParent; ii++){ |
| 509 | @ %d(aParent[ii]) |
| 510 | } |
| 511 | } |
| 512 | @ %z(href("%R/finfo?name=%T&ci=%s&debug=1",zFilename,zCkin))[ancestry]</a> |
| 513 | } |
| 514 | tag_private_status(frid); |
| 515 | @ </td></tr> |
| 516 | } |
| 517 | db_finalize(&q); |
| 518 |