@@ -1826,53 +1826,152 @@
1826 1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <a href="%s(g.zTop)/timeline?p=%S(zUuid)&d=%S(zUuid)">%S(zUuid)</a>
1827 1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1828 1828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&q);
1829 1829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_footer();
1830 1830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1831 1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1832 1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** WEBPAGE: activity
1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Shows an activity report for the repository.
1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implements the "byyear" and "bymonth" reports for /stats_report.
1836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If includeMonth is true then it generates the "bymonth" report,
1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** else the "byyear" report. If zUserName is not NULL and not empty
1838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then the report is restricted to events created by the named user
1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** account.
1836 1840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void activity_page(){
1841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void stats_report_bymonthyear(char includeMonth,
1842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * zUserName){
1838 1843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Stmt query = empty_Stmt;
1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int const nPixelsPerEvent = 1;
1840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRowNumber = 0;
1841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCommitCount = 0;
1842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rowClass = 0;
1843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- style_header("Repository Activity");
1844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db_prepare(&query,
1845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT substr(date(mtime),1,7) AS Month, "
1846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "count(*) AS Commits FROM event "
1847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "GROUP BY Month "
1848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "ORDER BY Month DESC", -1);
1849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <h1>Timeline Events by Month</h1>
1850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <table class='activity-table-commits-by-month' border='0' cellpadding='2' cellspacing='0'>
1844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int const nPixelsPerEvent = 1; /* for sizing the "graph" part */
1845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRowNumber = 0; /* current TR number */
1846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEventTotal = 0; /* Total event count */
1847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rowClass = 0; /* counter for alternating
1848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ row colors */
1849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob sql = empty_blob; /* SQL */
1850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * zTimeLabel = includeMonth ? "Year/Month" : "Year";
1851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zPrevYear[5] = {0}; /* For keeping track of when
1852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ we change years while looping */
1853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEventsPerYear = 0; /* Total even count for the
1854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ current year */
1855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char showYearTotal = 0; /* Flag telling us when to show
1856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ the per-year event totals */
1857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob header = empty_blob; /* Page header text */
1858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&header, "Timeline Events by %s", zTimeLabel);
1859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql,
1860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT substr(date(mtime),1,%d) AS timeframe, "
1861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "count(*) AS eventCount "
1862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "FROM event ",
1863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ includeMonth ? 7 : 4);
1864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(zUserName&&*zUserName){
1865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&sql, " WHERE user=%Q ", zUserName);
1866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_appendf(&header," for user %q", zUserName);
1867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&sql,
1869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " GROUP BY timeframe"
1870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " ORDER BY timeframe DESC",
1871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -1);
1872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db_prepare(&query, blob_str(&sql));
1873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&sql);
1874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <h1>%b(&header)</h1>
1875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <table class='statistics-report-table-events' border='0' cellpadding='2' cellspacing='0'>
1851 1876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <thead>
1852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <th>Year/Month</th>
1877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <th>%s(zTimeLabel)</th>
1853 1878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th>Events</th>
1854 1879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <th><!-- relative commits graph --></th>
1855 1880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </thead><tbody>
1881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&header);
1856 1882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( SQLITE_ROW == db_step(&query) ){
1857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char const * zMonth = db_column_text(&query, 0);
1883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * zTimeframe = db_column_text(&query, 0);
1858 1884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int const nCount = db_column_int(&query, 1);
1859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int const nSize = nPixelsPerEvent * nCount;
1885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int const nSize = 1 + ((nPixelsPerEvent * nCount)
1886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ / (includeMonth ? 1 : 10));
1887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ showYearTotal = 0;
1888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(includeMonth){
1889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* For Month/year view, add a separator for each distinct year. */
1890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(!*zPrevYear ||
1891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (0!=fossil_strncmp(zPrevYear,zTimeframe,4))){
1892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ showYearTotal = *zPrevYear;
1893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(showYearTotal){
1894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rowClass = ++nRowNumber % 2;
1895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr class='row%d(rowClass)'>
1896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td></td>
1897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td colspan='2'>Yearly total: %d(nEventsPerYear)</td>
1898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @</tr>
1899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEventsPerYear = 0;
1901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(zPrevYear,zTimeframe,4);
1902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rowClass = ++nRowNumber % 2;
1903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr class='row%d(rowClass)'>
1904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <th colspan='3' class='statistics-report-row-year'>%s(zPrevYear)</th>
1905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ </tr>
1906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1860 1908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rowClass = ++nRowNumber % 2;
1861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCommitCount += nCount;
1909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEventTotal += nCount;
1910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEventsPerYear += nCount;
1862 1911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@<tr class='row%d(rowClass)'>
1863 1912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>
1864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <a href="%s(g.zTop)/timeline?ym=%s(zMonth)&n=%d(nCount)" target="_new">%s(zMonth)</a>
1913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(includeMonth){
1914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <a href="%s(g.zTop)/timeline?ym=%s(zTimeframe)&n=%d(nCount)" target="_new">%s(zTimeframe)</a>
1915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else {
1916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ %s(zTimeframe)
1917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1865 1918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </td><td>%d(nCount)</td>
1866 1919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <td>
1867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <div class='activity-graph-line' style='height:16px; width:%d(nSize)px;'>
1920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <div class='statistics-report-graph-line' style='height:16px; width:%d(nSize)px;'>
1868 1921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </div></td>
1869 1922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@</tr>
1923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Potential improvement: calculate the min/max event counts and
1926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ use percent-based graph bars.
1927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(includeMonth && !showYearTotal && *zPrevYear){
1931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Add final year total separator. */
1932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rowClass = ++nRowNumber % 2;
1933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <tr class='row%d(rowClass)'>
1934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td></td>
1935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td colspan='2'>Yearly total: %d(nEventsPerYear)</td>
1936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @</tr>
1870 1937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1871 1939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rowClass = ++nRowNumber % 2;
1872 1940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ <tr class='row%d(rowClass)'>
1873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- @ <td colspan='3'>Total events: %d(nCommitCount)</td>
1941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ <td colspan='3'>Total events: %d(nEventTotal)</td>
1874 1942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </tr>
1875 1943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@ </tbody></table>
1876 1944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_finalize(&query);
1945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
1947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
1948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WEBPAGE: stats_report
1949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Shows activity reports for the repository.
1951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Query Parameters:
1953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** view=REPORT_NAME Valid values: bymonth, byyear
1955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** user=NAME Restricts statistics to the given user
1956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
1957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void stats_report_page(){
1958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ HQuery url; /* URL for various branch links */
1959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const * zView = PD("view","bymonth"); /* Which view/report to show. */
1960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char const *zUserName = P("user");
1961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_initialize(&url, "stats_report");
1962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(zUserName && *zUserName){
1963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_add_parameter(&url,"user", zUserName);
1964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeline_submenu(&url, "By Year", "view", "byyear", 0);
1966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ timeline_submenu(&url, "By Month", "view", "bymonth", 0);
1967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ url_reset(&url);
1968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ style_header("Activity Reports");
1969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if(0==fossil_strcmp(zView,"bymonth")){
1970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stats_report_bymonthyear(1, zUserName);
1971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(0==fossil_strcmp(zView,"byyear")){
1972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stats_report_bymonthyear(0, zUserName);
1973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if(0==fossil_strcmp(zView,"byweek")){
1974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ @ TODO: by-week report.
1975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1877 1976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
style_footer();
1878 1977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1879 1978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!