Fossil SCM
Make the distinction between open and closed branches. An open branch is a branch with one or more open leaves. Show open and closed branches separately on the "Branches" webpage.
Commit
9659ed66f83f895246b4f128e1dca1c6d5736cc0
Parent
cb31e908681bce6…
1 file changed
+41
-3
+41
-3
| --- src/branch.c | ||
| +++ src/branch.c | ||
| @@ -220,32 +220,70 @@ | ||
| 220 | 220 | ** |
| 221 | 221 | ** Show a timeline of all branches |
| 222 | 222 | */ |
| 223 | 223 | void brlist_page(void){ |
| 224 | 224 | Stmt q; |
| 225 | + int cnt; | |
| 225 | 226 | |
| 226 | 227 | login_check_credentials(); |
| 227 | 228 | if( !g.okRead ){ login_needed(); return; } |
| 228 | 229 | |
| 229 | 230 | style_header("Branches"); |
| 230 | 231 | style_submenu_element("Timeline", "Timeline", "brtimeline"); |
| 231 | 232 | login_anonymous_available(); |
| 232 | - @ <h2>Branches:</h2> | |
| 233 | - @ <ul> | |
| 233 | + compute_leaves(0, 1); | |
| 234 | 234 | db_prepare(&q, |
| 235 | 235 | "SELECT DISTINCT value FROM tagxref" |
| 236 | - " WHERE tagid=%d AND srcid!=0 AND value NOT NULL" | |
| 236 | + " WHERE tagid=%d AND value NOT NULL" | |
| 237 | + " AND rid IN leaves" | |
| 237 | 238 | " ORDER BY value", |
| 238 | 239 | TAG_BRANCH |
| 239 | 240 | ); |
| 241 | + cnt = 0; | |
| 242 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 243 | + const char *zBr = db_column_text(&q, 0); | |
| 244 | + if( cnt==0 ){ | |
| 245 | + @ <h2>Open Branches:</h2> | |
| 246 | + @ <ul> | |
| 247 | + cnt++; | |
| 248 | + } | |
| 249 | + if( g.okHistory ){ | |
| 250 | + @ <li><a href="%s(g.zBaseURL)/timeline?t=%T(zBr)">%h(zBr)</a></li> | |
| 251 | + }else{ | |
| 252 | + @ <li><b>%h(zBr)</b></li> | |
| 253 | + } | |
| 254 | + } | |
| 255 | + db_finalize(&q); | |
| 256 | + if( cnt ){ | |
| 257 | + @ </ul> | |
| 258 | + } | |
| 259 | + cnt = 0; | |
| 260 | + db_prepare(&q, | |
| 261 | + "SELECT value FROM tagxref" | |
| 262 | + " WHERE tagid=%d AND value NOT NULL" | |
| 263 | + " EXCEPT " | |
| 264 | + "SELECT value FROM tagxref" | |
| 265 | + " WHERE tagid=%d AND value NOT NULL" | |
| 266 | + " AND rid IN leaves" | |
| 267 | + " ORDER BY value", | |
| 268 | + TAG_BRANCH, TAG_BRANCH | |
| 269 | + ); | |
| 240 | 270 | while( db_step(&q)==SQLITE_ROW ){ |
| 241 | 271 | const char *zBr = db_column_text(&q, 0); |
| 272 | + if( cnt==0 ){ | |
| 273 | + @ <h2>Closed Branches:</h2> | |
| 274 | + @ <ul> | |
| 275 | + cnt++; | |
| 276 | + } | |
| 242 | 277 | if( g.okHistory ){ |
| 243 | 278 | @ <li><a href="%s(g.zBaseURL)/timeline?t=%T(zBr)">%h(zBr)</a></li> |
| 244 | 279 | }else{ |
| 245 | 280 | @ <li><b>%h(zBr)</b></li> |
| 246 | 281 | } |
| 282 | + } | |
| 283 | + if( cnt ){ | |
| 284 | + @ </ul> | |
| 247 | 285 | } |
| 248 | 286 | db_finalize(&q); |
| 249 | 287 | @ </ul> |
| 250 | 288 | @ <br clear="both"> |
| 251 | 289 | @ <script> |
| 252 | 290 |
| --- src/branch.c | |
| +++ src/branch.c | |
| @@ -220,32 +220,70 @@ | |
| 220 | ** |
| 221 | ** Show a timeline of all branches |
| 222 | */ |
| 223 | void brlist_page(void){ |
| 224 | Stmt q; |
| 225 | |
| 226 | login_check_credentials(); |
| 227 | if( !g.okRead ){ login_needed(); return; } |
| 228 | |
| 229 | style_header("Branches"); |
| 230 | style_submenu_element("Timeline", "Timeline", "brtimeline"); |
| 231 | login_anonymous_available(); |
| 232 | @ <h2>Branches:</h2> |
| 233 | @ <ul> |
| 234 | db_prepare(&q, |
| 235 | "SELECT DISTINCT value FROM tagxref" |
| 236 | " WHERE tagid=%d AND srcid!=0 AND value NOT NULL" |
| 237 | " ORDER BY value", |
| 238 | TAG_BRANCH |
| 239 | ); |
| 240 | while( db_step(&q)==SQLITE_ROW ){ |
| 241 | const char *zBr = db_column_text(&q, 0); |
| 242 | if( g.okHistory ){ |
| 243 | @ <li><a href="%s(g.zBaseURL)/timeline?t=%T(zBr)">%h(zBr)</a></li> |
| 244 | }else{ |
| 245 | @ <li><b>%h(zBr)</b></li> |
| 246 | } |
| 247 | } |
| 248 | db_finalize(&q); |
| 249 | @ </ul> |
| 250 | @ <br clear="both"> |
| 251 | @ <script> |
| 252 |
| --- src/branch.c | |
| +++ src/branch.c | |
| @@ -220,32 +220,70 @@ | |
| 220 | ** |
| 221 | ** Show a timeline of all branches |
| 222 | */ |
| 223 | void brlist_page(void){ |
| 224 | Stmt q; |
| 225 | int cnt; |
| 226 | |
| 227 | login_check_credentials(); |
| 228 | if( !g.okRead ){ login_needed(); return; } |
| 229 | |
| 230 | style_header("Branches"); |
| 231 | style_submenu_element("Timeline", "Timeline", "brtimeline"); |
| 232 | login_anonymous_available(); |
| 233 | compute_leaves(0, 1); |
| 234 | db_prepare(&q, |
| 235 | "SELECT DISTINCT value FROM tagxref" |
| 236 | " WHERE tagid=%d AND value NOT NULL" |
| 237 | " AND rid IN leaves" |
| 238 | " ORDER BY value", |
| 239 | TAG_BRANCH |
| 240 | ); |
| 241 | cnt = 0; |
| 242 | while( db_step(&q)==SQLITE_ROW ){ |
| 243 | const char *zBr = db_column_text(&q, 0); |
| 244 | if( cnt==0 ){ |
| 245 | @ <h2>Open Branches:</h2> |
| 246 | @ <ul> |
| 247 | cnt++; |
| 248 | } |
| 249 | if( g.okHistory ){ |
| 250 | @ <li><a href="%s(g.zBaseURL)/timeline?t=%T(zBr)">%h(zBr)</a></li> |
| 251 | }else{ |
| 252 | @ <li><b>%h(zBr)</b></li> |
| 253 | } |
| 254 | } |
| 255 | db_finalize(&q); |
| 256 | if( cnt ){ |
| 257 | @ </ul> |
| 258 | } |
| 259 | cnt = 0; |
| 260 | db_prepare(&q, |
| 261 | "SELECT value FROM tagxref" |
| 262 | " WHERE tagid=%d AND value NOT NULL" |
| 263 | " EXCEPT " |
| 264 | "SELECT value FROM tagxref" |
| 265 | " WHERE tagid=%d AND value NOT NULL" |
| 266 | " AND rid IN leaves" |
| 267 | " ORDER BY value", |
| 268 | TAG_BRANCH, TAG_BRANCH |
| 269 | ); |
| 270 | while( db_step(&q)==SQLITE_ROW ){ |
| 271 | const char *zBr = db_column_text(&q, 0); |
| 272 | if( cnt==0 ){ |
| 273 | @ <h2>Closed Branches:</h2> |
| 274 | @ <ul> |
| 275 | cnt++; |
| 276 | } |
| 277 | if( g.okHistory ){ |
| 278 | @ <li><a href="%s(g.zBaseURL)/timeline?t=%T(zBr)">%h(zBr)</a></li> |
| 279 | }else{ |
| 280 | @ <li><b>%h(zBr)</b></li> |
| 281 | } |
| 282 | } |
| 283 | if( cnt ){ |
| 284 | @ </ul> |
| 285 | } |
| 286 | db_finalize(&q); |
| 287 | @ </ul> |
| 288 | @ <br clear="both"> |
| 289 | @ <script> |
| 290 |