Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add the "fileage" webpage. |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA1: |
368347d660ffb3f67b6543cfe8c9aa94 |
| User & Date: | drh 2012-10-11 14:21:03.586 |
Context
|
2012-10-11
| ||
| 18:33 | Back out the undo/redo logic changes of [0c37874941c89] that caused the mtime to be restored on files. Playing games with mtimes is bad policy. Consider a scenario: "fossil merge; make; fossil undo; make". If the mtimes are reset by undo, then the second "make" above will not work correctly. This is not a complete backout of [0c37874941c89] as the underlying infrastructure used to compute the age of files is retained. ... (check-in: 5c0843a8f1 user: drh tags: trunk) | |
| 14:21 | Add the "fileage" webpage. ... (check-in: 368347d660 user: drh tags: trunk) | |
|
2012-10-10
| ||
| 20:03 | Add the internal checkin_mtime() function. Use it to implement the --age and -t options to the "fossil ls" command. ... (check-in: 9ba8a393fc user: drh tags: trunk) | |
Changes
Changes to src/browse.c.
| ︙ | ︙ | |||
291 292 293 294 295 296 297 |
}
}
db_finalize(&q);
manifest_destroy(pM);
@ </ul></td></tr></table>
style_footer();
}
| > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 |
}
}
db_finalize(&q);
manifest_destroy(pM);
@ </ul></td></tr></table>
style_footer();
}
/*
** Look at all file containing in the version "vid". Construct a
** temporary table named "fileage" that contains the file-id for each
** files, the pathname, the check-in where the file was added, and the
** mtime on that checkin.
*/
int compute_fileage(int vid){
Manifest *pManifest;
ManifestFile *pFile;
int nFile = 0;
double vmtime;
Stmt ins;
Stmt q1, q2, q3;
Stmt upd;
db_multi_exec(
/*"DROP TABLE IF EXISTS temp.fileage;"*/
"CREATE TEMP TABLE fileage("
" fid INTEGER,"
" mid INTEGER,"
" mtime DATETIME,"
" pathname TEXT"
");"
"CREATE INDEX fileage_fid ON fileage(fid);"
);
pManifest = manifest_get(vid, CFTYPE_MANIFEST);
if( pManifest==0 ) return 1;
manifest_file_rewind(pManifest);
db_prepare(&ins,
"INSERT INTO temp.fileage(fid, pathname)"
" SELECT rid, :path FROM blob WHERE uuid=:uuid"
);
while( (pFile = manifest_file_next(pManifest, 0))!=0 ){
db_bind_text(&ins, ":uuid", pFile->zUuid);
db_bind_text(&ins, ":path", pFile->zName);
db_step(&ins);
db_reset(&ins);
nFile++;
}
db_finalize(&ins);
manifest_destroy(pManifest);
db_prepare(&q1,"SELECT fid FROM mlink WHERE mid=:mid");
db_prepare(&upd, "UPDATE fileage SET mid=:mid, mtime=:vmtime"
" WHERE fid=:fid AND mid IS NULL");
db_prepare(&q2,"SELECT pid FROM plink WHERE cid=:vid AND isprim");
db_prepare(&q3,"SELECT mtime FROM event WHERE objid=:vid");
while( nFile>0 && vid>0 ){
db_bind_int(&q3, ":vid", vid);
if( db_step(&q3)==SQLITE_ROW ){
vmtime = db_column_double(&q3, 0);
}else{
break;
}
db_reset(&q3);
db_bind_int(&q1, ":mid", vid);
db_bind_int(&upd, ":mid", vid);
db_bind_double(&upd, ":vmtime", vmtime);
while( db_step(&q1)==SQLITE_ROW ){
db_bind_int(&upd, ":fid", db_column_int(&q1, 0));
db_step(&upd);
nFile -= db_changes();
db_reset(&upd);
}
db_reset(&q1);
db_bind_int(&q2, ":vid", vid);
if( db_step(&q2)!=SQLITE_ROW ) break;
vid = db_column_int(&q2, 0);
db_reset(&q2);
}
db_finalize(&q1);
db_finalize(&upd);
db_finalize(&q2);
db_finalize(&q3);
return 0;
}
/*
** WEBPAGE: fileage
**
** Parameters:
** name=VERSION
*/
void fileage_page(void){
int rid;
const char *zName;
Stmt q;
double baseTime;
int lastMid = -1;
login_check_credentials();
if( !g.perm.Read ){ login_needed(); return; }
zName = P("name");
if( zName==0 ) zName = "tip";
rid = symbolic_name_to_rid(zName, "ci");
if( rid==0 ){
fossil_fatal("not a valid check-in: %s", zName);
}
style_header("File Ages for %h", zName);
compute_fileage(rid);
@ <h1>Times since each file was changed as of check-in %h(zName)</h1>
@ <table border=0 cellspacing=0 cellpadding=0>
baseTime = db_double(0.0, "SELECT mtime FROM event WHERE objid=%d", rid);
db_prepare(&q,
"SELECT mtime, (SELECT uuid FROM blob WHERE rid=fid), mid, pathname"
" FROM fileage"
" ORDER BY mtime DESC, mid, pathname"
);
while( db_step(&q)==SQLITE_ROW ){
double age = baseTime - db_column_double(&q, 0);
int mid = db_column_int(&q, 2);
const char *zFUuid = db_column_text(&q, 1);
char zAge[200];
if( lastMid!=mid ){
@ <tr><td colspan=3><hr></tr>
lastMid = mid;
if( age*86400.0<120 ){
sqlite3_snprintf(sizeof(zAge), zAge, "%d seconds", (int)(age*86400.0));
}else if( age*1440.0<90 ){
sqlite3_snprintf(sizeof(zAge), zAge, "%.1f minutes", age*1440.0);
}else if( age*24.0<36 ){
sqlite3_snprintf(sizeof(zAge), zAge, "%.1f hours", age*24.0);
}else if( age<365.0 ){
sqlite3_snprintf(sizeof(zAge), zAge, "%.1f days", age);
}else{
sqlite3_snprintf(sizeof(zAge), zAge, "%.2f years", age/365.0);
}
}else{
zAge[0] = 0;
}
@ <tr>
@ <td>%s(zAge)
@ <td width="25">
@ <td>%z(href("%R/artifact/%S?ln", zFUuid))%h(db_column_text(&q, 3))</a>
@ </tr>
@
}
@ <tr><td colspan=3><hr></tr>
@ </table>
db_finalize(&q);
style_footer();
}
|
Changes to src/info.c.
| ︙ | ︙ | |||
628 629 630 631 632 633 634 635 636 637 638 639 640 641 |
@ ZIP archive</a>
fossil_free(zUrl);
}
@ </td></tr>
@ <tr><th>Other Links:</th>
@ <td>
@ %z(href("%R/dir?ci=%S",zUuid))files</a>
@ | %z(href("%R/artifact/%S",zUuid))manifest</a>
if( g.perm.Write ){
@ | %z(href("%R/ci_edit?r=%S",zUuid))edit</a>
}
@ </td>
@ </tr>
}
| > | 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 |
@ ZIP archive</a>
fossil_free(zUrl);
}
@ </td></tr>
@ <tr><th>Other Links:</th>
@ <td>
@ %z(href("%R/dir?ci=%S",zUuid))files</a>
@ | %z(href("%R/fileage?name=%S",zUuid))file ages</a>
@ | %z(href("%R/artifact/%S",zUuid))manifest</a>
if( g.perm.Write ){
@ | %z(href("%R/ci_edit?r=%S",zUuid))edit</a>
}
@ </td>
@ </tr>
}
|
| ︙ | ︙ |