| | @@ -2123,10 +2123,11 @@ |
| 2123 | 2123 | return c; |
| 2124 | 2124 | } |
| 2125 | 2125 | |
| 2126 | 2126 | /* |
| 2127 | 2127 | ** WEBPAGE: annotate |
| 2128 | +** WEBPAGE: blame |
| 2128 | 2129 | ** |
| 2129 | 2130 | ** Query parameters: |
| 2130 | 2131 | ** |
| 2131 | 2132 | ** checkin=ID The manifest ID at which to start the annotation |
| 2132 | 2133 | ** filename=FILENAME The filename. |
| | @@ -2145,10 +2146,11 @@ |
| 2145 | 2146 | const char *zCI; /* The check-in containing zFilename */ |
| 2146 | 2147 | Annotator ann; |
| 2147 | 2148 | HQuery url; |
| 2148 | 2149 | struct AnnVers *p; |
| 2149 | 2150 | unsigned clr1, clr2, clr; |
| 2151 | + int bBlame = g.zPath[0]=='b';/* True for BLAME output. False for ANNOTATE. */ |
| 2150 | 2152 | |
| 2151 | 2153 | /* Gather query parameters */ |
| 2152 | 2154 | showLog = atoi(PD("log","1")); |
| 2153 | 2155 | login_check_credentials(); |
| 2154 | 2156 | if( !g.perm.Read ){ login_needed(); return; } |
| | @@ -2251,20 +2253,35 @@ |
| 2251 | 2253 | char *z = (char*)ann.aOrig[i].z; |
| 2252 | 2254 | int n = ann.aOrig[i].n; |
| 2253 | 2255 | char zPrefix[300]; |
| 2254 | 2256 | z[n] = 0; |
| 2255 | 2257 | if( iLimit>ann.nVers && iVers<0 ) iVers = ann.nVers-1; |
| 2256 | | - if( iVers>=0 ){ |
| 2257 | | - struct AnnVers *p = ann.aVers+iVers; |
| 2258 | | - char *zLink = xhref("target='infowindow'", "%R/info/%S", p->zMUuid); |
| 2259 | | - sqlite3_snprintf(sizeof(zPrefix), zPrefix, |
| 2260 | | - "<span style='background-color:%s'>" |
| 2261 | | - "%s%.10s</a> %s</span> %4d:", |
| 2262 | | - p->zBgColor, zLink, p->zMUuid, p->zDate, i+1); |
| 2263 | | - fossil_free(zLink); |
| 2258 | + |
| 2259 | + if( bBlame ){ |
| 2260 | + if( iVers>=0 ){ |
| 2261 | + struct AnnVers *p = ann.aVers+iVers; |
| 2262 | + char *zLink = xhref("target='infowindow'", "%R/info/%S", p->zMUuid); |
| 2263 | + sqlite3_snprintf(sizeof(zPrefix), zPrefix, |
| 2264 | + "<span style='background-color:%s'>" |
| 2265 | + "%s%.10s</a> %s</span> %13.13s:", |
| 2266 | + p->zBgColor, zLink, p->zMUuid, p->zDate, p->zUser); |
| 2267 | + fossil_free(zLink); |
| 2268 | + }else{ |
| 2269 | + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%36s", ""); |
| 2270 | + } |
| 2264 | 2271 | }else{ |
| 2265 | | - sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%22s%4d:", "", i+1); |
| 2272 | + if( iVers>=0 ){ |
| 2273 | + struct AnnVers *p = ann.aVers+iVers; |
| 2274 | + char *zLink = xhref("target='infowindow'", "%R/info/%S", p->zMUuid); |
| 2275 | + sqlite3_snprintf(sizeof(zPrefix), zPrefix, |
| 2276 | + "<span style='background-color:%s'>" |
| 2277 | + "%s%.10s</a> %s</span> %4d:", |
| 2278 | + p->zBgColor, zLink, p->zMUuid, p->zDate, i+1); |
| 2279 | + fossil_free(zLink); |
| 2280 | + }else{ |
| 2281 | + sqlite3_snprintf(sizeof(zPrefix), zPrefix, "%22s%4d:", "", i+1); |
| 2282 | + } |
| 2266 | 2283 | } |
| 2267 | 2284 | @ %s(zPrefix) %h(z) |
| 2268 | 2285 | |
| 2269 | 2286 | } |
| 2270 | 2287 | @ </pre> |
| 2271 | 2288 | |