Fossil SCM
Add the finfo web page.
Commit
86c8768475f6eb0ec28329c4899e49a6ae09f2f3
Parent
30d7afe3285c0e2…
1 file changed
+56
-177
+56
-177
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -111,11 +111,11 @@ | ||
| 111 | 111 | */ |
| 112 | 112 | static int showDescendents(int pid, int depth){ |
| 113 | 113 | Stmt q; |
| 114 | 114 | int cnt = 0; |
| 115 | 115 | db_prepare(&q, |
| 116 | - "SELECT plink.cid, blob.uuid, datetime(plink.mtime)," | |
| 116 | + "SELECT plink.cid, blob.uuid, datetime(plink.mtime, 'localtime')," | |
| 117 | 117 | " event.user, event.comment" |
| 118 | 118 | " FROM plink, blob, event" |
| 119 | 119 | " WHERE plink.pid=%d" |
| 120 | 120 | " AND blob.rid=plink.cid" |
| 121 | 121 | " AND event.objid=plink.cid" |
| @@ -157,11 +157,11 @@ | ||
| 157 | 157 | */ |
| 158 | 158 | static int showAncestors(int pid, int depth){ |
| 159 | 159 | Stmt q; |
| 160 | 160 | int cnt = 0; |
| 161 | 161 | db_prepare(&q, |
| 162 | - "SELECT plink.pid, blob.uuid, datetime(event.mtime)," | |
| 162 | + "SELECT plink.pid, blob.uuid, datetime(event.mtime, 'localtime')," | |
| 163 | 163 | " event.user, event.comment" |
| 164 | 164 | " FROM plink, blob, event" |
| 165 | 165 | " WHERE plink.cid=%d" |
| 166 | 166 | " AND blob.rid=plink.pid" |
| 167 | 167 | " AND event.objid=plink.pid" |
| @@ -168,11 +168,10 @@ | ||
| 168 | 168 | " ORDER BY event.mtime DESC", |
| 169 | 169 | pid |
| 170 | 170 | ); |
| 171 | 171 | @ <ul> |
| 172 | 172 | while( db_step(&q)==SQLITE_ROW ){ |
| 173 | - int n; | |
| 174 | 173 | int cid = db_column_int(&q, 0); |
| 175 | 174 | const char *zUuid = db_column_text(&q, 1); |
| 176 | 175 | const char *zDate = db_column_text(&q, 2); |
| 177 | 176 | const char *zUser = db_column_text(&q, 3); |
| 178 | 177 | const char *zCom = db_column_text(&q, 4); |
| @@ -196,11 +195,11 @@ | ||
| 196 | 195 | */ |
| 197 | 196 | void vinfo_page(void){ |
| 198 | 197 | Stmt q; |
| 199 | 198 | int rid; |
| 200 | 199 | int isLeaf; |
| 201 | - int cid, pid, n; | |
| 200 | + int n; | |
| 202 | 201 | |
| 203 | 202 | login_check_credentials(); |
| 204 | 203 | if( !g.okHistory ){ login_needed(); return; } |
| 205 | 204 | style_header("Version Information"); |
| 206 | 205 | rid = name_to_rid(g.zExtra); |
| @@ -209,11 +208,11 @@ | ||
| 209 | 208 | style_footer(); |
| 210 | 209 | return; |
| 211 | 210 | } |
| 212 | 211 | isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid); |
| 213 | 212 | db_prepare(&q, |
| 214 | - "SELECT uuid, datetime(mtime), user, comment" | |
| 213 | + "SELECT uuid, datetime(mtime, 'localtime'), user, comment" | |
| 215 | 214 | " FROM blob, event" |
| 216 | 215 | " WHERE blob.rid=%d" |
| 217 | 216 | " AND event.objid=%d", |
| 218 | 217 | rid, rid |
| 219 | 218 | ); |
| @@ -255,187 +254,67 @@ | ||
| 255 | 254 | }else if( fid ){ |
| 256 | 255 | @ <b>Added:</b> |
| 257 | 256 | }else{ |
| 258 | 257 | @ <b>Deleted:</b> |
| 259 | 258 | } |
| 260 | - @ %h(zName)</li> | |
| 259 | + @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li> | |
| 261 | 260 | } |
| 262 | 261 | @ </ul> |
| 263 | 262 | style_footer(); |
| 264 | 263 | } |
| 265 | 264 | |
| 266 | - | |
| 267 | -#if 0 | |
| 268 | -/* | |
| 269 | -** WEB PAGE: vinfo | |
| 270 | -** | |
| 271 | -** Return information about a version. The version number is contained | |
| 272 | -** in g.zExtra. | |
| 273 | -*/ | |
| 274 | -void vinfo_page(void){ | |
| 275 | - Stmt q; | |
| 276 | - int rid; | |
| 277 | - char cType; | |
| 278 | - char *zType; | |
| 279 | - | |
| 280 | - login_check_credentials(); | |
| 281 | - if( !g.okHistory ){ login_needed(); return; } | |
| 282 | - style_header("Version Information"); | |
| 283 | - rid = name_to_rid(g.zExtra); | |
| 284 | - if( rid==0 ){ | |
| 285 | - @ No such object: %h(g.argv[2]) | |
| 286 | - style_footer(); | |
| 287 | - return; | |
| 288 | - } | |
| 289 | - db_row_to_table("SELECT " | |
| 290 | - " blob.uuid AS \"UUID\"" | |
| 291 | - ", datetime(rcvfrom.mtime) AS \"Created\"" | |
| 292 | - ", rcvfrom.uid AS \"User Id\"" | |
| 293 | - ", blob.size AS \"Size\"" | |
| 294 | - "FROM blob, rcvfrom " | |
| 295 | - "WHERE rid=%d", rid | |
| 296 | - ); | |
| 297 | - style_footer(); | |
| 298 | - return; | |
| 299 | - | |
| 300 | - db_prepare(&q, | |
| 301 | - "SELECT " | |
| 302 | - "uuid, " /* 0 */ | |
| 303 | - "datetime(mtime,'unixepoch')," /* 1 */ | |
| 304 | - "datetime(ctime,'unixepoch')," /* 2 */ | |
| 305 | - "uid, size, cksum, branch, comment, type" /* 3..8 */ | |
| 306 | - "FROM record WHERE rid=%d", rid | |
| 307 | - ); | |
| 308 | - if( db_step(&q)==SQLITE_ROW ){ | |
| 309 | - const char *z; | |
| 310 | - const char *zSignedBy = db_text("unknown", | |
| 311 | - "SELECT login FROM repuser WHERE uid=%d", | |
| 312 | - db_column_int(&q, 3)); | |
| 313 | - cType = db_column_text(&q,8)[0]; | |
| 314 | - switch( cType ){ | |
| 315 | - case 'f': zType = "file"; break; | |
| 316 | - case 'v': zType = "version"; break; | |
| 317 | - case 'c': zType = "control"; break; | |
| 318 | - case 'w': zType = "wiki"; break; | |
| 319 | - case 'a': zType = "attachment"; break; | |
| 320 | - case 't': zType = "ticket"; break; | |
| 321 | - } | |
| 322 | - @ <table border="0" cellpadding="0" cellspacing="0"> | |
| 323 | - @ <tr><td align="right">%s(zType) UUID:</td><td width="10"></td> | |
| 324 | - @ <td>%s(db_column_text(&q,0))</td></tr> | |
| 325 | - z = db_column_text(&q, 7); | |
| 326 | - if( z ){ | |
| 327 | - @ <tr><td align="right" valign="top">comment:</td><td></td> | |
| 328 | - @ <td valign="top">%h(z)</td></tr> | |
| 329 | - } | |
| 330 | - @ <tr><td align="right">created:</td><td></td> | |
| 331 | - @ <td>%s(db_column_text(&q,2))</td></tr> | |
| 332 | - @ <tr><td align="right">received:</td><td></td> | |
| 333 | - @ <td>%s(db_column_text(&q,1))</td></tr> | |
| 334 | - @ <tr><td align="right">signed by:</td><td></td> | |
| 335 | - @ <td>%h(zSignedBy)</td></tr> | |
| 336 | - z = db_column_text(&q, 4); | |
| 337 | - if( z && z[0] && (z[0]!='0' || z[1]!=0) ){ | |
| 338 | - @ <tr><td align="right">size:</td><td></td> | |
| 339 | - @ <td>%s(z)</td></tr> | |
| 340 | - } | |
| 341 | - z = db_column_text(&q, 5); | |
| 342 | - if( z ){ | |
| 343 | - @ <tr><td align="right">MD5 checksum:</td><td></td> | |
| 344 | - @ <td>%s(z)</td></tr> | |
| 345 | - } | |
| 346 | - z = db_column_text(&q, 6); | |
| 347 | - if( z ){ | |
| 348 | - @ <tr><td align="right">branch:</td><td></td> | |
| 349 | - @ <td>%h(z)</td></tr> | |
| 350 | - } | |
| 351 | - } | |
| 352 | - db_finalize(&q); | |
| 353 | - db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON a=rid " | |
| 354 | - " WHERE b=%d", rid); | |
| 355 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 356 | - const char *zType = db_column_text(&q, 1); | |
| 357 | - const char *zUuid = db_column_text(&q, 0); | |
| 358 | - if( zType[0]=='P' ){ | |
| 359 | - @ <tr><td align="right">parent:</td><td></td><td> | |
| 360 | - hyperlink_to_uuid(zUuid); | |
| 361 | - if( cType=='f' || cType=='w' ){ | |
| 362 | - hyperlink_to_diff(zUuid, g.zExtra); | |
| 363 | - } | |
| 364 | - @ </td></tr> | |
| 365 | - }else if( zType[0]=='M' ){ | |
| 366 | - @ <tr><td align="right">merge parent:</td><td></td><td> | |
| 367 | - hyperlink_to_uuid(zUuid); | |
| 368 | - if( cType=='f' || cType=='w' ){ | |
| 369 | - hyperlink_to_diff(zUuid, g.zExtra); | |
| 370 | - } | |
| 371 | - @ </td></tr> | |
| 372 | - } | |
| 373 | - } | |
| 374 | - db_finalize(&q); | |
| 375 | - db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON b=rid " | |
| 376 | - " WHERE a=%d ORDER BY typecode DESC", rid); | |
| 377 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 378 | - const char *zType = db_column_text(&q, 1); | |
| 379 | - const char *zUuid = db_column_text(&q, 0); | |
| 380 | - if( zType[0]=='P' ){ | |
| 381 | - @ <tr><td align="right">child:</td><td></td><td> | |
| 382 | - hyperlink_to_uuid(zUuid); | |
| 383 | - if( cType=='f' || cType=='w' ){ | |
| 384 | - hyperlink_to_diff(g.zExtra, zUuid); | |
| 385 | - } | |
| 386 | - @ </td></tr> | |
| 387 | - }else if( zType[0]=='M' ){ | |
| 388 | - @ <tr><td align="right">merge child:</td><td></td><td> | |
| 389 | - hyperlink_to_uuid(zUuid); | |
| 390 | - if( cType=='f' || cType=='w' ){ | |
| 391 | - hyperlink_to_diff(g.zExtra, zUuid); | |
| 392 | - } | |
| 393 | - @ </td></tr> | |
| 394 | - } | |
| 395 | - } | |
| 396 | - db_finalize(&q); | |
| 397 | - if( cType=='v' ){ | |
| 398 | - db_prepare(&q, "SELECT uuid, typecode, name " | |
| 399 | - " FROM link, record, fname" | |
| 400 | - " WHERE a=%d AND typecode IN ('D','E','I')" | |
| 401 | - " AND b=record.rid AND fname.fnid=record.fnid" | |
| 402 | - " ORDER BY name", rid); | |
| 403 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 404 | - const char *zUuid = db_column_text(&q, 0); | |
| 405 | - const char *zType = db_column_text(&q, 1); | |
| 406 | - const char *zName = db_column_text(&q, 2); | |
| 407 | - if( zType[0]=='D' ){ | |
| 408 | - @ <tr><td align="right">deleted file:</td><td></td><td> | |
| 409 | - hyperlink_to_uuid(zUuid); | |
| 410 | - }else if( zType[0]=='E' ){ | |
| 411 | - @ <tr><td align="right">changed file:</td><td></td><td> | |
| 412 | - hyperlink_to_uuid(zUuid); | |
| 413 | - hyperlink_to_diff(zUuid, 0); | |
| 414 | - }else if( zType[0]=='I' ){ | |
| 415 | - @ <tr><td align="right">added file:</td><td></td><td> | |
| 416 | - hyperlink_to_uuid(zUuid); | |
| 417 | - } | |
| 418 | - @ %h(zName)</td></tr> | |
| 419 | - } | |
| 420 | - db_finalize(&q); | |
| 421 | - }else if( cType=='f' ){ | |
| 422 | - db_prepare(&q, "SELECT uuid" | |
| 423 | - " FROM link, record" | |
| 424 | - " WHERE b=%d AND typecode IN ('E','I')" | |
| 425 | - " AND a=record.rid", rid); | |
| 426 | - while( db_step(&q)==SQLITE_ROW ){ | |
| 427 | - const char *zUuid = db_column_text(&q, 0); | |
| 428 | - @ <tr><td align="right">associated version:</td><td></td><td> | |
| 429 | - hyperlink_to_uuid(zUuid); | |
| 430 | - @ </td></tr> | |
| 431 | - } | |
| 432 | - db_finalize(&q); | |
| 433 | - } | |
| 434 | - style_footer(); | |
| 435 | -} | |
| 436 | -#endif | |
| 265 | +/* | |
| 266 | +** WEBPAGE: finfo | |
| 267 | +** | |
| 268 | +** Show the complete change history for a single file. The name | |
| 269 | +** of the file is in g.zExtra | |
| 270 | +*/ | |
| 271 | +void finfo_page(void){ | |
| 272 | + Stmt q; | |
| 273 | + char zPrevDate[20]; | |
| 274 | + login_check_credentials(); | |
| 275 | + if( !g.okHistory ){ login_needed(); return; } | |
| 276 | + style_header("File History"); | |
| 277 | + | |
| 278 | + zPrevDate[0] = 0; | |
| 279 | + db_prepare(&q, | |
| 280 | + "SELECT blob.uuid, datetime(event.mtime,'localtime')," | |
| 281 | + " event.comment, event.user" | |
| 282 | + " FROM mlink, blob, event" | |
| 283 | + " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" | |
| 284 | + " AND blob.rid=mlink.mid" | |
| 285 | + " AND event.objid=mlink.mid" | |
| 286 | + " ORDER BY event.mtime DESC", | |
| 287 | + g.zExtra | |
| 288 | + ); | |
| 289 | + @ <h2>History of %h(g.zExtra)</h2> | |
| 290 | + @ <table cellspacing=0 border=0 cellpadding=0> | |
| 291 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 292 | + const char *zDate = db_column_text(&q, 1); | |
| 293 | + if( memcmp(zDate, zPrevDate, 10) ){ | |
| 294 | + sprintf(zPrevDate, "%.10s", zDate); | |
| 295 | + @ <tr><td colspan=3> | |
| 296 | + @ <table cellpadding=2 border=0> | |
| 297 | + @ <tr><td bgcolor="#a0b5f4" class="border1"> | |
| 298 | + @ <table cellpadding=2 cellspacing=0 border=0><tr> | |
| 299 | + @ <td bgcolor="#d0d9f4" class="bkgnd1">%s(zPrevDate)</td> | |
| 300 | + @ </tr></table> | |
| 301 | + @ </td></tr></table> | |
| 302 | + @ </td></tr> | |
| 303 | + } | |
| 304 | + @ <tr><td valign="top">%s(&zDate[11])</td> | |
| 305 | + @ <td width="20"></td> | |
| 306 | + @ <td valign="top" align="left"> | |
| 307 | + hyperlink_to_uuid(db_column_text(&q,0)); | |
| 308 | + @ %h(db_column_text(&q,2)) (by %h(db_column_text(&q,3)))</td> | |
| 309 | + } | |
| 310 | + db_finalize(&q); | |
| 311 | + @ </table> | |
| 312 | + style_footer(); | |
| 313 | +} | |
| 314 | + | |
| 315 | + | |
| 437 | 316 | |
| 438 | 317 | #if 0 |
| 439 | 318 | /* |
| 440 | 319 | ** WEB PAGE: diff |
| 441 | 320 | ** |
| 442 | 321 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -111,11 +111,11 @@ | |
| 111 | */ |
| 112 | static int showDescendents(int pid, int depth){ |
| 113 | Stmt q; |
| 114 | int cnt = 0; |
| 115 | db_prepare(&q, |
| 116 | "SELECT plink.cid, blob.uuid, datetime(plink.mtime)," |
| 117 | " event.user, event.comment" |
| 118 | " FROM plink, blob, event" |
| 119 | " WHERE plink.pid=%d" |
| 120 | " AND blob.rid=plink.cid" |
| 121 | " AND event.objid=plink.cid" |
| @@ -157,11 +157,11 @@ | |
| 157 | */ |
| 158 | static int showAncestors(int pid, int depth){ |
| 159 | Stmt q; |
| 160 | int cnt = 0; |
| 161 | db_prepare(&q, |
| 162 | "SELECT plink.pid, blob.uuid, datetime(event.mtime)," |
| 163 | " event.user, event.comment" |
| 164 | " FROM plink, blob, event" |
| 165 | " WHERE plink.cid=%d" |
| 166 | " AND blob.rid=plink.pid" |
| 167 | " AND event.objid=plink.pid" |
| @@ -168,11 +168,10 @@ | |
| 168 | " ORDER BY event.mtime DESC", |
| 169 | pid |
| 170 | ); |
| 171 | @ <ul> |
| 172 | while( db_step(&q)==SQLITE_ROW ){ |
| 173 | int n; |
| 174 | int cid = db_column_int(&q, 0); |
| 175 | const char *zUuid = db_column_text(&q, 1); |
| 176 | const char *zDate = db_column_text(&q, 2); |
| 177 | const char *zUser = db_column_text(&q, 3); |
| 178 | const char *zCom = db_column_text(&q, 4); |
| @@ -196,11 +195,11 @@ | |
| 196 | */ |
| 197 | void vinfo_page(void){ |
| 198 | Stmt q; |
| 199 | int rid; |
| 200 | int isLeaf; |
| 201 | int cid, pid, n; |
| 202 | |
| 203 | login_check_credentials(); |
| 204 | if( !g.okHistory ){ login_needed(); return; } |
| 205 | style_header("Version Information"); |
| 206 | rid = name_to_rid(g.zExtra); |
| @@ -209,11 +208,11 @@ | |
| 209 | style_footer(); |
| 210 | return; |
| 211 | } |
| 212 | isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid); |
| 213 | db_prepare(&q, |
| 214 | "SELECT uuid, datetime(mtime), user, comment" |
| 215 | " FROM blob, event" |
| 216 | " WHERE blob.rid=%d" |
| 217 | " AND event.objid=%d", |
| 218 | rid, rid |
| 219 | ); |
| @@ -255,187 +254,67 @@ | |
| 255 | }else if( fid ){ |
| 256 | @ <b>Added:</b> |
| 257 | }else{ |
| 258 | @ <b>Deleted:</b> |
| 259 | } |
| 260 | @ %h(zName)</li> |
| 261 | } |
| 262 | @ </ul> |
| 263 | style_footer(); |
| 264 | } |
| 265 | |
| 266 | |
| 267 | #if 0 |
| 268 | /* |
| 269 | ** WEB PAGE: vinfo |
| 270 | ** |
| 271 | ** Return information about a version. The version number is contained |
| 272 | ** in g.zExtra. |
| 273 | */ |
| 274 | void vinfo_page(void){ |
| 275 | Stmt q; |
| 276 | int rid; |
| 277 | char cType; |
| 278 | char *zType; |
| 279 | |
| 280 | login_check_credentials(); |
| 281 | if( !g.okHistory ){ login_needed(); return; } |
| 282 | style_header("Version Information"); |
| 283 | rid = name_to_rid(g.zExtra); |
| 284 | if( rid==0 ){ |
| 285 | @ No such object: %h(g.argv[2]) |
| 286 | style_footer(); |
| 287 | return; |
| 288 | } |
| 289 | db_row_to_table("SELECT " |
| 290 | " blob.uuid AS \"UUID\"" |
| 291 | ", datetime(rcvfrom.mtime) AS \"Created\"" |
| 292 | ", rcvfrom.uid AS \"User Id\"" |
| 293 | ", blob.size AS \"Size\"" |
| 294 | "FROM blob, rcvfrom " |
| 295 | "WHERE rid=%d", rid |
| 296 | ); |
| 297 | style_footer(); |
| 298 | return; |
| 299 | |
| 300 | db_prepare(&q, |
| 301 | "SELECT " |
| 302 | "uuid, " /* 0 */ |
| 303 | "datetime(mtime,'unixepoch')," /* 1 */ |
| 304 | "datetime(ctime,'unixepoch')," /* 2 */ |
| 305 | "uid, size, cksum, branch, comment, type" /* 3..8 */ |
| 306 | "FROM record WHERE rid=%d", rid |
| 307 | ); |
| 308 | if( db_step(&q)==SQLITE_ROW ){ |
| 309 | const char *z; |
| 310 | const char *zSignedBy = db_text("unknown", |
| 311 | "SELECT login FROM repuser WHERE uid=%d", |
| 312 | db_column_int(&q, 3)); |
| 313 | cType = db_column_text(&q,8)[0]; |
| 314 | switch( cType ){ |
| 315 | case 'f': zType = "file"; break; |
| 316 | case 'v': zType = "version"; break; |
| 317 | case 'c': zType = "control"; break; |
| 318 | case 'w': zType = "wiki"; break; |
| 319 | case 'a': zType = "attachment"; break; |
| 320 | case 't': zType = "ticket"; break; |
| 321 | } |
| 322 | @ <table border="0" cellpadding="0" cellspacing="0"> |
| 323 | @ <tr><td align="right">%s(zType) UUID:</td><td width="10"></td> |
| 324 | @ <td>%s(db_column_text(&q,0))</td></tr> |
| 325 | z = db_column_text(&q, 7); |
| 326 | if( z ){ |
| 327 | @ <tr><td align="right" valign="top">comment:</td><td></td> |
| 328 | @ <td valign="top">%h(z)</td></tr> |
| 329 | } |
| 330 | @ <tr><td align="right">created:</td><td></td> |
| 331 | @ <td>%s(db_column_text(&q,2))</td></tr> |
| 332 | @ <tr><td align="right">received:</td><td></td> |
| 333 | @ <td>%s(db_column_text(&q,1))</td></tr> |
| 334 | @ <tr><td align="right">signed by:</td><td></td> |
| 335 | @ <td>%h(zSignedBy)</td></tr> |
| 336 | z = db_column_text(&q, 4); |
| 337 | if( z && z[0] && (z[0]!='0' || z[1]!=0) ){ |
| 338 | @ <tr><td align="right">size:</td><td></td> |
| 339 | @ <td>%s(z)</td></tr> |
| 340 | } |
| 341 | z = db_column_text(&q, 5); |
| 342 | if( z ){ |
| 343 | @ <tr><td align="right">MD5 checksum:</td><td></td> |
| 344 | @ <td>%s(z)</td></tr> |
| 345 | } |
| 346 | z = db_column_text(&q, 6); |
| 347 | if( z ){ |
| 348 | @ <tr><td align="right">branch:</td><td></td> |
| 349 | @ <td>%h(z)</td></tr> |
| 350 | } |
| 351 | } |
| 352 | db_finalize(&q); |
| 353 | db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON a=rid " |
| 354 | " WHERE b=%d", rid); |
| 355 | while( db_step(&q)==SQLITE_ROW ){ |
| 356 | const char *zType = db_column_text(&q, 1); |
| 357 | const char *zUuid = db_column_text(&q, 0); |
| 358 | if( zType[0]=='P' ){ |
| 359 | @ <tr><td align="right">parent:</td><td></td><td> |
| 360 | hyperlink_to_uuid(zUuid); |
| 361 | if( cType=='f' || cType=='w' ){ |
| 362 | hyperlink_to_diff(zUuid, g.zExtra); |
| 363 | } |
| 364 | @ </td></tr> |
| 365 | }else if( zType[0]=='M' ){ |
| 366 | @ <tr><td align="right">merge parent:</td><td></td><td> |
| 367 | hyperlink_to_uuid(zUuid); |
| 368 | if( cType=='f' || cType=='w' ){ |
| 369 | hyperlink_to_diff(zUuid, g.zExtra); |
| 370 | } |
| 371 | @ </td></tr> |
| 372 | } |
| 373 | } |
| 374 | db_finalize(&q); |
| 375 | db_prepare(&q, "SELECT uuid, typecode FROM link JOIN record ON b=rid " |
| 376 | " WHERE a=%d ORDER BY typecode DESC", rid); |
| 377 | while( db_step(&q)==SQLITE_ROW ){ |
| 378 | const char *zType = db_column_text(&q, 1); |
| 379 | const char *zUuid = db_column_text(&q, 0); |
| 380 | if( zType[0]=='P' ){ |
| 381 | @ <tr><td align="right">child:</td><td></td><td> |
| 382 | hyperlink_to_uuid(zUuid); |
| 383 | if( cType=='f' || cType=='w' ){ |
| 384 | hyperlink_to_diff(g.zExtra, zUuid); |
| 385 | } |
| 386 | @ </td></tr> |
| 387 | }else if( zType[0]=='M' ){ |
| 388 | @ <tr><td align="right">merge child:</td><td></td><td> |
| 389 | hyperlink_to_uuid(zUuid); |
| 390 | if( cType=='f' || cType=='w' ){ |
| 391 | hyperlink_to_diff(g.zExtra, zUuid); |
| 392 | } |
| 393 | @ </td></tr> |
| 394 | } |
| 395 | } |
| 396 | db_finalize(&q); |
| 397 | if( cType=='v' ){ |
| 398 | db_prepare(&q, "SELECT uuid, typecode, name " |
| 399 | " FROM link, record, fname" |
| 400 | " WHERE a=%d AND typecode IN ('D','E','I')" |
| 401 | " AND b=record.rid AND fname.fnid=record.fnid" |
| 402 | " ORDER BY name", rid); |
| 403 | while( db_step(&q)==SQLITE_ROW ){ |
| 404 | const char *zUuid = db_column_text(&q, 0); |
| 405 | const char *zType = db_column_text(&q, 1); |
| 406 | const char *zName = db_column_text(&q, 2); |
| 407 | if( zType[0]=='D' ){ |
| 408 | @ <tr><td align="right">deleted file:</td><td></td><td> |
| 409 | hyperlink_to_uuid(zUuid); |
| 410 | }else if( zType[0]=='E' ){ |
| 411 | @ <tr><td align="right">changed file:</td><td></td><td> |
| 412 | hyperlink_to_uuid(zUuid); |
| 413 | hyperlink_to_diff(zUuid, 0); |
| 414 | }else if( zType[0]=='I' ){ |
| 415 | @ <tr><td align="right">added file:</td><td></td><td> |
| 416 | hyperlink_to_uuid(zUuid); |
| 417 | } |
| 418 | @ %h(zName)</td></tr> |
| 419 | } |
| 420 | db_finalize(&q); |
| 421 | }else if( cType=='f' ){ |
| 422 | db_prepare(&q, "SELECT uuid" |
| 423 | " FROM link, record" |
| 424 | " WHERE b=%d AND typecode IN ('E','I')" |
| 425 | " AND a=record.rid", rid); |
| 426 | while( db_step(&q)==SQLITE_ROW ){ |
| 427 | const char *zUuid = db_column_text(&q, 0); |
| 428 | @ <tr><td align="right">associated version:</td><td></td><td> |
| 429 | hyperlink_to_uuid(zUuid); |
| 430 | @ </td></tr> |
| 431 | } |
| 432 | db_finalize(&q); |
| 433 | } |
| 434 | style_footer(); |
| 435 | } |
| 436 | #endif |
| 437 | |
| 438 | #if 0 |
| 439 | /* |
| 440 | ** WEB PAGE: diff |
| 441 | ** |
| 442 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -111,11 +111,11 @@ | |
| 111 | */ |
| 112 | static int showDescendents(int pid, int depth){ |
| 113 | Stmt q; |
| 114 | int cnt = 0; |
| 115 | db_prepare(&q, |
| 116 | "SELECT plink.cid, blob.uuid, datetime(plink.mtime, 'localtime')," |
| 117 | " event.user, event.comment" |
| 118 | " FROM plink, blob, event" |
| 119 | " WHERE plink.pid=%d" |
| 120 | " AND blob.rid=plink.cid" |
| 121 | " AND event.objid=plink.cid" |
| @@ -157,11 +157,11 @@ | |
| 157 | */ |
| 158 | static int showAncestors(int pid, int depth){ |
| 159 | Stmt q; |
| 160 | int cnt = 0; |
| 161 | db_prepare(&q, |
| 162 | "SELECT plink.pid, blob.uuid, datetime(event.mtime, 'localtime')," |
| 163 | " event.user, event.comment" |
| 164 | " FROM plink, blob, event" |
| 165 | " WHERE plink.cid=%d" |
| 166 | " AND blob.rid=plink.pid" |
| 167 | " AND event.objid=plink.pid" |
| @@ -168,11 +168,10 @@ | |
| 168 | " ORDER BY event.mtime DESC", |
| 169 | pid |
| 170 | ); |
| 171 | @ <ul> |
| 172 | while( db_step(&q)==SQLITE_ROW ){ |
| 173 | int cid = db_column_int(&q, 0); |
| 174 | const char *zUuid = db_column_text(&q, 1); |
| 175 | const char *zDate = db_column_text(&q, 2); |
| 176 | const char *zUser = db_column_text(&q, 3); |
| 177 | const char *zCom = db_column_text(&q, 4); |
| @@ -196,11 +195,11 @@ | |
| 195 | */ |
| 196 | void vinfo_page(void){ |
| 197 | Stmt q; |
| 198 | int rid; |
| 199 | int isLeaf; |
| 200 | int n; |
| 201 | |
| 202 | login_check_credentials(); |
| 203 | if( !g.okHistory ){ login_needed(); return; } |
| 204 | style_header("Version Information"); |
| 205 | rid = name_to_rid(g.zExtra); |
| @@ -209,11 +208,11 @@ | |
| 208 | style_footer(); |
| 209 | return; |
| 210 | } |
| 211 | isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid); |
| 212 | db_prepare(&q, |
| 213 | "SELECT uuid, datetime(mtime, 'localtime'), user, comment" |
| 214 | " FROM blob, event" |
| 215 | " WHERE blob.rid=%d" |
| 216 | " AND event.objid=%d", |
| 217 | rid, rid |
| 218 | ); |
| @@ -255,187 +254,67 @@ | |
| 254 | }else if( fid ){ |
| 255 | @ <b>Added:</b> |
| 256 | }else{ |
| 257 | @ <b>Deleted:</b> |
| 258 | } |
| 259 | @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li> |
| 260 | } |
| 261 | @ </ul> |
| 262 | style_footer(); |
| 263 | } |
| 264 | |
| 265 | /* |
| 266 | ** WEBPAGE: finfo |
| 267 | ** |
| 268 | ** Show the complete change history for a single file. The name |
| 269 | ** of the file is in g.zExtra |
| 270 | */ |
| 271 | void finfo_page(void){ |
| 272 | Stmt q; |
| 273 | char zPrevDate[20]; |
| 274 | login_check_credentials(); |
| 275 | if( !g.okHistory ){ login_needed(); return; } |
| 276 | style_header("File History"); |
| 277 | |
| 278 | zPrevDate[0] = 0; |
| 279 | db_prepare(&q, |
| 280 | "SELECT blob.uuid, datetime(event.mtime,'localtime')," |
| 281 | " event.comment, event.user" |
| 282 | " FROM mlink, blob, event" |
| 283 | " WHERE mlink.fnid=(SELECT fnid FROM filename WHERE name=%Q)" |
| 284 | " AND blob.rid=mlink.mid" |
| 285 | " AND event.objid=mlink.mid" |
| 286 | " ORDER BY event.mtime DESC", |
| 287 | g.zExtra |
| 288 | ); |
| 289 | @ <h2>History of %h(g.zExtra)</h2> |
| 290 | @ <table cellspacing=0 border=0 cellpadding=0> |
| 291 | while( db_step(&q)==SQLITE_ROW ){ |
| 292 | const char *zDate = db_column_text(&q, 1); |
| 293 | if( memcmp(zDate, zPrevDate, 10) ){ |
| 294 | sprintf(zPrevDate, "%.10s", zDate); |
| 295 | @ <tr><td colspan=3> |
| 296 | @ <table cellpadding=2 border=0> |
| 297 | @ <tr><td bgcolor="#a0b5f4" class="border1"> |
| 298 | @ <table cellpadding=2 cellspacing=0 border=0><tr> |
| 299 | @ <td bgcolor="#d0d9f4" class="bkgnd1">%s(zPrevDate)</td> |
| 300 | @ </tr></table> |
| 301 | @ </td></tr></table> |
| 302 | @ </td></tr> |
| 303 | } |
| 304 | @ <tr><td valign="top">%s(&zDate[11])</td> |
| 305 | @ <td width="20"></td> |
| 306 | @ <td valign="top" align="left"> |
| 307 | hyperlink_to_uuid(db_column_text(&q,0)); |
| 308 | @ %h(db_column_text(&q,2)) (by %h(db_column_text(&q,3)))</td> |
| 309 | } |
| 310 | db_finalize(&q); |
| 311 | @ </table> |
| 312 | style_footer(); |
| 313 | } |
| 314 | |
| 315 | |
| 316 | |
| 317 | #if 0 |
| 318 | /* |
| 319 | ** WEB PAGE: diff |
| 320 | ** |
| 321 |