Fossil SCM
Include file modification times on the "All" /tree view of files.
Commit
9240905c978e1ce9161a8d3e085102c3be100b3e
Parent
0183c9a29250bd2…
1 file changed
+32
-23
+32
-23
| --- src/browse.c | ||
| +++ src/browse.c | ||
| @@ -591,12 +591,14 @@ | ||
| 591 | 591 | zNow = db_text("", "SELECT datetime(mtime,'localtime')" |
| 592 | 592 | " FROM event WHERE objid=%d", rid); |
| 593 | 593 | }else{ |
| 594 | 594 | zCI = 0; |
| 595 | 595 | } |
| 596 | - }else{ | |
| 597 | - useMtime = 0; | |
| 596 | + } | |
| 597 | + if( zCI==0 ){ | |
| 598 | + rNow = db_double(0.0, "SELECT max(mtime) FROM event"); | |
| 599 | + zNow = db_text("", "SELECT datetime(max(mtime),'localtime') FROM event"); | |
| 598 | 600 | } |
| 599 | 601 | |
| 600 | 602 | /* Compute the title of the page */ |
| 601 | 603 | blob_zero(&dirname); |
| 602 | 604 | if( zD ){ |
| @@ -613,25 +615,25 @@ | ||
| 613 | 615 | } |
| 614 | 616 | if( !showDirOnly ){ |
| 615 | 617 | style_submenu_element("Flat-View", "Flat-View", "%s", |
| 616 | 618 | url_render(&sURI, "type", "flat", 0, 0)); |
| 617 | 619 | } |
| 620 | + if( useMtime ){ | |
| 621 | + style_submenu_element("Sort By Filename","Sort By Filename", "%s", | |
| 622 | + url_render(&sURI, 0, 0, 0, 0)); | |
| 623 | + url_add_parameter(&sURI, "mtime", "1"); | |
| 624 | + }else{ | |
| 625 | + style_submenu_element("Sort By Time","Sort By Time", "%s", | |
| 626 | + url_render(&sURI, "mtime", "1", 0, 0)); | |
| 627 | + } | |
| 618 | 628 | if( zCI ){ |
| 619 | 629 | style_submenu_element("All", "All", "%s", |
| 620 | 630 | url_render(&sURI, "ci", 0, 0, 0)); |
| 621 | 631 | if( nD==0 && !showDirOnly ){ |
| 622 | 632 | style_submenu_element("File Ages", "File Ages", "%R/fileage?name=%s", |
| 623 | 633 | zUuid); |
| 624 | 634 | } |
| 625 | - if( useMtime ){ | |
| 626 | - style_submenu_element("Sort By Filename","Sort By Filename", "%s", | |
| 627 | - url_render(&sURI, 0, 0, 0, 0)); | |
| 628 | - url_add_parameter(&sURI, "mtime", "1"); | |
| 629 | - }else{ | |
| 630 | - style_submenu_element("Sort By Time","Sort By Time", "%s", | |
| 631 | - url_render(&sURI, "mtime", "1", 0, 0)); | |
| 632 | - } | |
| 633 | 635 | } |
| 634 | 636 | if( linkTrunk ){ |
| 635 | 637 | style_submenu_element("Trunk", "Trunk", "%s", |
| 636 | 638 | url_render(&sURI, "ci", "trunk", 0, 0)); |
| 637 | 639 | } |
| @@ -661,18 +663,26 @@ | ||
| 661 | 663 | nFile++; |
| 662 | 664 | } |
| 663 | 665 | db_finalize(&q); |
| 664 | 666 | }else{ |
| 665 | 667 | Stmt q; |
| 666 | - db_prepare(&q, "SELECT name FROM filename ORDER BY name COLLATE nocase"); | |
| 668 | + db_prepare(&q, | |
| 669 | + "SELECT filename.name, blob.uuid, max(event.mtime)\n" | |
| 670 | + " FROM filename, mlink, blob, event\n" | |
| 671 | + " WHERE mlink.fnid=filename.fnid\n" | |
| 672 | + " AND event.objid=mlink.mid\n" | |
| 673 | + " AND blob.rid=mlink.fid\n" | |
| 674 | + " GROUP BY 1 ORDER BY 1 COLLATE nocase"); | |
| 667 | 675 | while( db_step(&q)==SQLITE_ROW ){ |
| 668 | - const char *z = db_column_text(&q, 0); | |
| 669 | - if( nD>0 && (fossil_strncmp(z, zD, nD-1)!=0 || z[nD-1]!='/') ){ | |
| 676 | + const char *zName = db_column_text(&q, 0); | |
| 677 | + const char *zUuid = db_column_text(&q,1); | |
| 678 | + double mtime = db_column_double(&q,2); | |
| 679 | + if( nD>0 && (fossil_strncmp(zName, zD, nD-1)!=0 || zName[nD-1]!='/') ){ | |
| 670 | 680 | continue; |
| 671 | 681 | } |
| 672 | - if( pRE && re_match(pRE, (const u8*)z, -1)==0 ) continue; | |
| 673 | - tree_add_node(&sTree, z, 0, 0.0); | |
| 682 | + if( pRE && re_match(pRE, (const u8*)zName, -1)==0 ) continue; | |
| 683 | + tree_add_node(&sTree, zName, zUuid, mtime); | |
| 674 | 684 | nFile++; |
| 675 | 685 | } |
| 676 | 686 | db_finalize(&q); |
| 677 | 687 | } |
| 678 | 688 | |
| @@ -693,19 +703,18 @@ | ||
| 693 | 703 | @ <h2>%s(zObjType) from |
| 694 | 704 | if( sqlite3_strnicmp(zCI, zUuid, (int)strlen(zCI))!=0 ){ |
| 695 | 705 | @ "%h(zCI)" |
| 696 | 706 | } |
| 697 | 707 | @ [%z(href("vinfo?name=%s",zUuid))%S(zUuid)</a>] %s(blob_str(&dirname)) |
| 698 | - if( useMtime ){ | |
| 699 | - @ sorted by modification time</h2> | |
| 700 | - }else{ | |
| 701 | - @ sorted by filename</h2> | |
| 702 | - } | |
| 703 | 708 | }else{ |
| 704 | 709 | int n = db_int(0, "SELECT count(*) FROM plink"); |
| 705 | - @ <h2>%s(zObjType) from all %d(n) check-ins | |
| 706 | - @ %s(blob_str(&dirname))</h2> | |
| 710 | + @ <h2>%s(zObjType) from all %d(n) check-ins %s(blob_str(&dirname)) | |
| 711 | + } | |
| 712 | + if( useMtime ){ | |
| 713 | + @ sorted by modification time</h2> | |
| 714 | + }else{ | |
| 715 | + @ sorted by filename</h2> | |
| 707 | 716 | } |
| 708 | 717 | |
| 709 | 718 | |
| 710 | 719 | /* Generate tree of lists. |
| 711 | 720 | ** |
| @@ -729,11 +738,11 @@ | ||
| 729 | 738 | if( zNow ){ |
| 730 | 739 | @ <div class="filetreeage">%s(zNow)</div> |
| 731 | 740 | } |
| 732 | 741 | @ </div> |
| 733 | 742 | @ <ul> |
| 734 | - if( zCI && useMtime ){ | |
| 743 | + if( useMtime ){ | |
| 735 | 744 | p = sortTreeByMtime(sTree.pFirst); |
| 736 | 745 | memset(&sTree, 0, sizeof(sTree)); |
| 737 | 746 | relinkTree(&sTree, p); |
| 738 | 747 | } |
| 739 | 748 | for(p=sTree.pFirst, nDir=0; p; p=p->pNext){ |
| 740 | 749 |
| --- src/browse.c | |
| +++ src/browse.c | |
| @@ -591,12 +591,14 @@ | |
| 591 | zNow = db_text("", "SELECT datetime(mtime,'localtime')" |
| 592 | " FROM event WHERE objid=%d", rid); |
| 593 | }else{ |
| 594 | zCI = 0; |
| 595 | } |
| 596 | }else{ |
| 597 | useMtime = 0; |
| 598 | } |
| 599 | |
| 600 | /* Compute the title of the page */ |
| 601 | blob_zero(&dirname); |
| 602 | if( zD ){ |
| @@ -613,25 +615,25 @@ | |
| 613 | } |
| 614 | if( !showDirOnly ){ |
| 615 | style_submenu_element("Flat-View", "Flat-View", "%s", |
| 616 | url_render(&sURI, "type", "flat", 0, 0)); |
| 617 | } |
| 618 | if( zCI ){ |
| 619 | style_submenu_element("All", "All", "%s", |
| 620 | url_render(&sURI, "ci", 0, 0, 0)); |
| 621 | if( nD==0 && !showDirOnly ){ |
| 622 | style_submenu_element("File Ages", "File Ages", "%R/fileage?name=%s", |
| 623 | zUuid); |
| 624 | } |
| 625 | if( useMtime ){ |
| 626 | style_submenu_element("Sort By Filename","Sort By Filename", "%s", |
| 627 | url_render(&sURI, 0, 0, 0, 0)); |
| 628 | url_add_parameter(&sURI, "mtime", "1"); |
| 629 | }else{ |
| 630 | style_submenu_element("Sort By Time","Sort By Time", "%s", |
| 631 | url_render(&sURI, "mtime", "1", 0, 0)); |
| 632 | } |
| 633 | } |
| 634 | if( linkTrunk ){ |
| 635 | style_submenu_element("Trunk", "Trunk", "%s", |
| 636 | url_render(&sURI, "ci", "trunk", 0, 0)); |
| 637 | } |
| @@ -661,18 +663,26 @@ | |
| 661 | nFile++; |
| 662 | } |
| 663 | db_finalize(&q); |
| 664 | }else{ |
| 665 | Stmt q; |
| 666 | db_prepare(&q, "SELECT name FROM filename ORDER BY name COLLATE nocase"); |
| 667 | while( db_step(&q)==SQLITE_ROW ){ |
| 668 | const char *z = db_column_text(&q, 0); |
| 669 | if( nD>0 && (fossil_strncmp(z, zD, nD-1)!=0 || z[nD-1]!='/') ){ |
| 670 | continue; |
| 671 | } |
| 672 | if( pRE && re_match(pRE, (const u8*)z, -1)==0 ) continue; |
| 673 | tree_add_node(&sTree, z, 0, 0.0); |
| 674 | nFile++; |
| 675 | } |
| 676 | db_finalize(&q); |
| 677 | } |
| 678 | |
| @@ -693,19 +703,18 @@ | |
| 693 | @ <h2>%s(zObjType) from |
| 694 | if( sqlite3_strnicmp(zCI, zUuid, (int)strlen(zCI))!=0 ){ |
| 695 | @ "%h(zCI)" |
| 696 | } |
| 697 | @ [%z(href("vinfo?name=%s",zUuid))%S(zUuid)</a>] %s(blob_str(&dirname)) |
| 698 | if( useMtime ){ |
| 699 | @ sorted by modification time</h2> |
| 700 | }else{ |
| 701 | @ sorted by filename</h2> |
| 702 | } |
| 703 | }else{ |
| 704 | int n = db_int(0, "SELECT count(*) FROM plink"); |
| 705 | @ <h2>%s(zObjType) from all %d(n) check-ins |
| 706 | @ %s(blob_str(&dirname))</h2> |
| 707 | } |
| 708 | |
| 709 | |
| 710 | /* Generate tree of lists. |
| 711 | ** |
| @@ -729,11 +738,11 @@ | |
| 729 | if( zNow ){ |
| 730 | @ <div class="filetreeage">%s(zNow)</div> |
| 731 | } |
| 732 | @ </div> |
| 733 | @ <ul> |
| 734 | if( zCI && useMtime ){ |
| 735 | p = sortTreeByMtime(sTree.pFirst); |
| 736 | memset(&sTree, 0, sizeof(sTree)); |
| 737 | relinkTree(&sTree, p); |
| 738 | } |
| 739 | for(p=sTree.pFirst, nDir=0; p; p=p->pNext){ |
| 740 |
| --- src/browse.c | |
| +++ src/browse.c | |
| @@ -591,12 +591,14 @@ | |
| 591 | zNow = db_text("", "SELECT datetime(mtime,'localtime')" |
| 592 | " FROM event WHERE objid=%d", rid); |
| 593 | }else{ |
| 594 | zCI = 0; |
| 595 | } |
| 596 | } |
| 597 | if( zCI==0 ){ |
| 598 | rNow = db_double(0.0, "SELECT max(mtime) FROM event"); |
| 599 | zNow = db_text("", "SELECT datetime(max(mtime),'localtime') FROM event"); |
| 600 | } |
| 601 | |
| 602 | /* Compute the title of the page */ |
| 603 | blob_zero(&dirname); |
| 604 | if( zD ){ |
| @@ -613,25 +615,25 @@ | |
| 615 | } |
| 616 | if( !showDirOnly ){ |
| 617 | style_submenu_element("Flat-View", "Flat-View", "%s", |
| 618 | url_render(&sURI, "type", "flat", 0, 0)); |
| 619 | } |
| 620 | if( useMtime ){ |
| 621 | style_submenu_element("Sort By Filename","Sort By Filename", "%s", |
| 622 | url_render(&sURI, 0, 0, 0, 0)); |
| 623 | url_add_parameter(&sURI, "mtime", "1"); |
| 624 | }else{ |
| 625 | style_submenu_element("Sort By Time","Sort By Time", "%s", |
| 626 | url_render(&sURI, "mtime", "1", 0, 0)); |
| 627 | } |
| 628 | if( zCI ){ |
| 629 | style_submenu_element("All", "All", "%s", |
| 630 | url_render(&sURI, "ci", 0, 0, 0)); |
| 631 | if( nD==0 && !showDirOnly ){ |
| 632 | style_submenu_element("File Ages", "File Ages", "%R/fileage?name=%s", |
| 633 | zUuid); |
| 634 | } |
| 635 | } |
| 636 | if( linkTrunk ){ |
| 637 | style_submenu_element("Trunk", "Trunk", "%s", |
| 638 | url_render(&sURI, "ci", "trunk", 0, 0)); |
| 639 | } |
| @@ -661,18 +663,26 @@ | |
| 663 | nFile++; |
| 664 | } |
| 665 | db_finalize(&q); |
| 666 | }else{ |
| 667 | Stmt q; |
| 668 | db_prepare(&q, |
| 669 | "SELECT filename.name, blob.uuid, max(event.mtime)\n" |
| 670 | " FROM filename, mlink, blob, event\n" |
| 671 | " WHERE mlink.fnid=filename.fnid\n" |
| 672 | " AND event.objid=mlink.mid\n" |
| 673 | " AND blob.rid=mlink.fid\n" |
| 674 | " GROUP BY 1 ORDER BY 1 COLLATE nocase"); |
| 675 | while( db_step(&q)==SQLITE_ROW ){ |
| 676 | const char *zName = db_column_text(&q, 0); |
| 677 | const char *zUuid = db_column_text(&q,1); |
| 678 | double mtime = db_column_double(&q,2); |
| 679 | if( nD>0 && (fossil_strncmp(zName, zD, nD-1)!=0 || zName[nD-1]!='/') ){ |
| 680 | continue; |
| 681 | } |
| 682 | if( pRE && re_match(pRE, (const u8*)zName, -1)==0 ) continue; |
| 683 | tree_add_node(&sTree, zName, zUuid, mtime); |
| 684 | nFile++; |
| 685 | } |
| 686 | db_finalize(&q); |
| 687 | } |
| 688 | |
| @@ -693,19 +703,18 @@ | |
| 703 | @ <h2>%s(zObjType) from |
| 704 | if( sqlite3_strnicmp(zCI, zUuid, (int)strlen(zCI))!=0 ){ |
| 705 | @ "%h(zCI)" |
| 706 | } |
| 707 | @ [%z(href("vinfo?name=%s",zUuid))%S(zUuid)</a>] %s(blob_str(&dirname)) |
| 708 | }else{ |
| 709 | int n = db_int(0, "SELECT count(*) FROM plink"); |
| 710 | @ <h2>%s(zObjType) from all %d(n) check-ins %s(blob_str(&dirname)) |
| 711 | } |
| 712 | if( useMtime ){ |
| 713 | @ sorted by modification time</h2> |
| 714 | }else{ |
| 715 | @ sorted by filename</h2> |
| 716 | } |
| 717 | |
| 718 | |
| 719 | /* Generate tree of lists. |
| 720 | ** |
| @@ -729,11 +738,11 @@ | |
| 738 | if( zNow ){ |
| 739 | @ <div class="filetreeage">%s(zNow)</div> |
| 740 | } |
| 741 | @ </div> |
| 742 | @ <ul> |
| 743 | if( useMtime ){ |
| 744 | p = sortTreeByMtime(sTree.pFirst); |
| 745 | memset(&sTree, 0, sizeof(sTree)); |
| 746 | relinkTree(&sTree, p); |
| 747 | } |
| 748 | for(p=sTree.pFirst, nDir=0; p; p=p->pNext){ |
| 749 |