Fossil SCM

Add the finfo web page.

drh 2007-08-01 00:55 trunk
Commit 86c8768475f6eb0ec28329c4899e49a6ae09f2f3
1 file changed +56 -177
+56 -177
--- src/info.c
+++ src/info.c
@@ -111,11 +111,11 @@
111111
*/
112112
static int showDescendents(int pid, int depth){
113113
Stmt q;
114114
int cnt = 0;
115115
db_prepare(&q,
116
- "SELECT plink.cid, blob.uuid, datetime(plink.mtime),"
116
+ "SELECT plink.cid, blob.uuid, datetime(plink.mtime, 'localtime'),"
117117
" event.user, event.comment"
118118
" FROM plink, blob, event"
119119
" WHERE plink.pid=%d"
120120
" AND blob.rid=plink.cid"
121121
" AND event.objid=plink.cid"
@@ -157,11 +157,11 @@
157157
*/
158158
static int showAncestors(int pid, int depth){
159159
Stmt q;
160160
int cnt = 0;
161161
db_prepare(&q,
162
- "SELECT plink.pid, blob.uuid, datetime(event.mtime),"
162
+ "SELECT plink.pid, blob.uuid, datetime(event.mtime, 'localtime'),"
163163
" event.user, event.comment"
164164
" FROM plink, blob, event"
165165
" WHERE plink.cid=%d"
166166
" AND blob.rid=plink.pid"
167167
" AND event.objid=plink.pid"
@@ -168,11 +168,10 @@
168168
" ORDER BY event.mtime DESC",
169169
pid
170170
);
171171
@ <ul>
172172
while( db_step(&q)==SQLITE_ROW ){
173
- int n;
174173
int cid = db_column_int(&q, 0);
175174
const char *zUuid = db_column_text(&q, 1);
176175
const char *zDate = db_column_text(&q, 2);
177176
const char *zUser = db_column_text(&q, 3);
178177
const char *zCom = db_column_text(&q, 4);
@@ -196,11 +195,11 @@
196195
*/
197196
void vinfo_page(void){
198197
Stmt q;
199198
int rid;
200199
int isLeaf;
201
- int cid, pid, n;
200
+ int n;
202201
203202
login_check_credentials();
204203
if( !g.okHistory ){ login_needed(); return; }
205204
style_header("Version Information");
206205
rid = name_to_rid(g.zExtra);
@@ -209,11 +208,11 @@
209208
style_footer();
210209
return;
211210
}
212211
isLeaf = !db_exists("SELECT 1 FROM plink WHERE pid=%d", rid);
213212
db_prepare(&q,
214
- "SELECT uuid, datetime(mtime), user, comment"
213
+ "SELECT uuid, datetime(mtime, 'localtime'), user, comment"
215214
" FROM blob, event"
216215
" WHERE blob.rid=%d"
217216
" AND event.objid=%d",
218217
rid, rid
219218
);
@@ -255,187 +254,67 @@
255254
}else if( fid ){
256255
@ <b>Added:</b>
257256
}else{
258257
@ <b>Deleted:</b>
259258
}
260
- @ %h(zName)</li>
259
+ @ <a href="%s(g.zBaseURL)/finfo/%T(zName)">%h(zName)</a></li>
261260
}
262261
@ </ul>
263262
style_footer();
264263
}
265264
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)&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;file:</td><td></td><td>
409
- hyperlink_to_uuid(zUuid);
410
- }else if( zType[0]=='E' ){
411
- @ <tr><td align="right">changed&nbsp;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&nbsp;file:</td><td></td><td>
416
- hyperlink_to_uuid(zUuid);
417
- }
418
- @ &nbsp;&nbsp;%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&nbsp;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
+
437316
438317
#if 0
439318
/*
440319
** WEB PAGE: diff
441320
**
442321
--- 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)&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;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&nbsp;file:</td><td></td><td>
409 hyperlink_to_uuid(zUuid);
410 }else if( zType[0]=='E' ){
411 @ <tr><td align="right">changed&nbsp;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&nbsp;file:</td><td></td><td>
416 hyperlink_to_uuid(zUuid);
417 }
418 @ &nbsp;&nbsp;%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&nbsp;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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button