| | @@ -228,21 +228,28 @@ |
| 228 | 228 | const char *zA; |
| 229 | 229 | const char *zB; |
| 230 | 230 | int n; |
| 231 | 231 | Blob title; |
| 232 | 232 | Blob sql; |
| 233 | + HQuery url; |
| 233 | 234 | GraphContext *pGraph; |
| 234 | 235 | int brBg = P("brbg")!=0; |
| 235 | 236 | int uBg = P("ubg")!=0; |
| 237 | + int firstChngOnly = P("fco")!=0; |
| 236 | 238 | |
| 237 | 239 | login_check_credentials(); |
| 238 | 240 | if( !g.perm.Read ){ login_needed(); return; } |
| 239 | 241 | style_header("File History"); |
| 240 | 242 | login_anonymous_available(); |
| 243 | + url_initialize(&url, "finfo"); |
| 244 | + if( brBg ) url_add_parameter(&url, "brbg", 0); |
| 245 | + if( uBg ) url_add_parameter(&url, "ubg", 0); |
| 246 | + if( firstChngOnly ) url_add_parameter(&url, "fco", 0); |
| 241 | 247 | |
| 242 | 248 | zPrevDate[0] = 0; |
| 243 | 249 | zFilename = PD("name",""); |
| 250 | + url_add_parameter(&url, "name", zFilename); |
| 244 | 251 | blob_zero(&sql); |
| 245 | 252 | blob_appendf(&sql, |
| 246 | 253 | "SELECT" |
| 247 | 254 | " datetime(event.mtime,'localtime')," /* Date of change */ |
| 248 | 255 | " coalesce(event.ecomment, event.comment)," /* Check-in comment */ |
| | @@ -252,26 +259,44 @@ |
| 252 | 259 | " (SELECT uuid FROM blob WHERE rid=mlink.pid)," /* Parent file uuid */ |
| 253 | 260 | " (SELECT uuid FROM blob WHERE rid=mlink.fid)," /* Current file uuid */ |
| 254 | 261 | " (SELECT uuid FROM blob WHERE rid=mlink.mid)," /* Check-in uuid */ |
| 255 | 262 | " event.bgcolor," /* Background color */ |
| 256 | 263 | " (SELECT value FROM tagxref WHERE tagid=%d AND tagtype>0" |
| 257 | | - " AND tagxref.rid=mlink.mid)" /* Tags */ |
| 264 | + " AND tagxref.rid=mlink.mid)", /* Tags */ |
| 265 | + TAG_BRANCH |
| 266 | + ); |
| 267 | + if( firstChngOnly ){ |
| 268 | + blob_appendf(&sql, ", min(event.mtime)"); |
| 269 | + } |
| 270 | + blob_appendf(&sql, |
| 258 | 271 | " FROM mlink, event" |
| 259 | 272 | " WHERE mlink.fnid IN (SELECT fnid FROM filename WHERE name=%Q %s)" |
| 260 | 273 | " AND event.objid=mlink.mid", |
| 261 | | - TAG_BRANCH, |
| 262 | 274 | zFilename, filename_collation() |
| 263 | 275 | ); |
| 264 | 276 | if( (zA = P("a"))!=0 ){ |
| 265 | 277 | blob_appendf(&sql, " AND event.mtime>=julianday('%q')", zA); |
| 278 | + url_add_parameter(&url, "a", zA); |
| 266 | 279 | } |
| 267 | 280 | if( (zB = P("b"))!=0 ){ |
| 268 | 281 | blob_appendf(&sql, " AND event.mtime<=julianday('%q')", zB); |
| 282 | + url_add_parameter(&url, "b", zB); |
| 283 | + } |
| 284 | + if( firstChngOnly ){ |
| 285 | + blob_appendf(&sql, " GROUP BY mlink.fid"); |
| 269 | 286 | } |
| 270 | 287 | blob_appendf(&sql," ORDER BY event.mtime DESC /*sort*/"); |
| 271 | 288 | if( (n = atoi(PD("n","0")))>0 ){ |
| 272 | 289 | blob_appendf(&sql, " LIMIT %d", n); |
| 290 | + url_add_parameter(&url, "n", P("n")); |
| 291 | + } |
| 292 | + if( firstChngOnly ){ |
| 293 | + style_submenu_element("Full", "Show all changes", |
| 294 | + url_render(&url, "fco", 0, 0, 0)); |
| 295 | + }else{ |
| 296 | + style_submenu_element("Simplified", "Show only first use of a change", |
| 297 | + url_render(&url, "fco", "1", 0, 0)); |
| 273 | 298 | } |
| 274 | 299 | db_prepare(&q, blob_str(&sql)); |
| 275 | 300 | blob_reset(&sql); |
| 276 | 301 | blob_zero(&title); |
| 277 | 302 | blob_appendf(&title, "History of "); |
| 278 | 303 | |