Fossil SCM
Add the ability to cancel existing tags from the web interface, on the "vedit" page. Disable the display of "Leaf" on the timeline for closed leaves.
Commit
73c23a4279b97ad3198f907770eb4efeadc3d104
Parent
a12cb216b74d859…
2 files changed
+76
-21
+4
-1
+76
-21
| --- src/info.c | ||
| +++ src/info.c | ||
| @@ -1165,12 +1165,15 @@ | ||
| 1165 | 1165 | const char *zNewComment; |
| 1166 | 1166 | const char *zUser; |
| 1167 | 1167 | const char *zNewUser; |
| 1168 | 1168 | const char *zColor; |
| 1169 | 1169 | const char *zNewColor; |
| 1170 | + const char *zNewTagFlag; | |
| 1170 | 1171 | const char *zNewTag; |
| 1172 | + const char *zNewBrFlag; | |
| 1171 | 1173 | const char *zNewBranch; |
| 1174 | + const char *zCloseFlag; | |
| 1172 | 1175 | int fPropagateColor; |
| 1173 | 1176 | char *zUuid; |
| 1174 | 1177 | Blob comment; |
| 1175 | 1178 | Stmt q; |
| 1176 | 1179 | static const struct SampleColors { |
| @@ -1188,10 +1191,11 @@ | ||
| 1188 | 1191 | { "#ffc0ff", "#ffc0ff" }, |
| 1189 | 1192 | { "#ffc0d0", "#ffc0d0" }, |
| 1190 | 1193 | { "#fff0c0", "#fff0c0" }, |
| 1191 | 1194 | { "#c0c0c0", "#c0c0c0" }, |
| 1192 | 1195 | }; |
| 1196 | + int nColor = sizeof(aColor)/sizeof(aColor[0]); | |
| 1193 | 1197 | int i; |
| 1194 | 1198 | |
| 1195 | 1199 | login_check_credentials(); |
| 1196 | 1200 | if( !g.okWrite ){ login_needed(); return; } |
| 1197 | 1201 | rid = atoi(PD("r","0")); |
| @@ -1209,14 +1213,15 @@ | ||
| 1209 | 1213 | zNewUser = PD("u",zUser); |
| 1210 | 1214 | zColor = db_text("", "SELECT bgcolor" |
| 1211 | 1215 | " FROM event WHERE objid=%d", rid); |
| 1212 | 1216 | zNewColor = PD("clr",zColor); |
| 1213 | 1217 | fPropagateColor = P("pclr")!=0; |
| 1214 | - zNewTag = P("newtag")!=0 ? P("tagname") : 0; | |
| 1215 | - if( zNewTag && zNewTag[0]==0 ) zNewTag = 0; | |
| 1216 | - zNewBranch = P("newbr")!=0 ? P("brname") : 0; | |
| 1217 | - if( zNewBranch && zNewBranch[0]==0 ) zNewBranch = 0; | |
| 1218 | + zNewTagFlag = P("newtag") ? " checked" : ""; | |
| 1219 | + zNewTag = PD("tagname",""); | |
| 1220 | + zNewBrFlag = P("newbr") ? " checked" : ""; | |
| 1221 | + zNewBranch = PD("brname",""); | |
| 1222 | + zCloseFlag = P("close") ? " checked" : ""; | |
| 1218 | 1223 | if( P("apply") ){ |
| 1219 | 1224 | Blob ctrl; |
| 1220 | 1225 | char *zDate; |
| 1221 | 1226 | int nChng = 0; |
| 1222 | 1227 | |
| @@ -1242,14 +1247,32 @@ | ||
| 1242 | 1247 | zNewComment); |
| 1243 | 1248 | } |
| 1244 | 1249 | if( strcmp(zUser,zNewUser)!=0 ){ |
| 1245 | 1250 | db_multi_exec("REPLACE INTO newtags VALUES('user','+',%Q)", zNewUser); |
| 1246 | 1251 | } |
| 1247 | - if( zNewTag ){ | |
| 1252 | + db_prepare(&q, | |
| 1253 | + "SELECT tag.tagid, tagname FROM tagxref, tag" | |
| 1254 | + " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid", | |
| 1255 | + rid | |
| 1256 | + ); | |
| 1257 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 1258 | + int tagid = db_column_int(&q, 0); | |
| 1259 | + const char *zTag = db_column_text(&q, 1); | |
| 1260 | + char zLabel[30]; | |
| 1261 | + sprintf(zLabel, "c%d", tagid); | |
| 1262 | + if( P(zLabel) ){ | |
| 1263 | + db_multi_exec("REPLACE INTO newtags VALUES(%Q,'-',NULL)", zTag); | |
| 1264 | + } | |
| 1265 | + } | |
| 1266 | + db_finalize(&q); | |
| 1267 | + if( zCloseFlag[0] ){ | |
| 1268 | + db_multi_exec("REPLACE INTO newtags VALUES('closed','+',NULL)"); | |
| 1269 | + } | |
| 1270 | + if( zNewTagFlag[0] ){ | |
| 1248 | 1271 | db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','+',NULL)", zNewTag); |
| 1249 | 1272 | } |
| 1250 | - if( zNewBranch ){ | |
| 1273 | + if( zNewBrFlag[0] ){ | |
| 1251 | 1274 | db_multi_exec( |
| 1252 | 1275 | "REPLACE INTO newtags " |
| 1253 | 1276 | " SELECT tagname, '-', NULL FROM tagxref, tag" |
| 1254 | 1277 | " WHERE tagxref.rid=%d AND tagtype==2" |
| 1255 | 1278 | " AND tagname GLOB 'sym-*'" |
| @@ -1344,12 +1367,19 @@ | ||
| 1344 | 1367 | @ </td></tr> |
| 1345 | 1368 | |
| 1346 | 1369 | @ <tr><td align="right" valign="top"><b>Background Color:</b></td> |
| 1347 | 1370 | @ <td valign="top"> |
| 1348 | 1371 | @ <table border=0 cellpadding=0 cellspacing=1> |
| 1372 | + @ <tr><td colspan="6" align="left"> | |
| 1373 | + if( fPropagateColor ){ | |
| 1374 | + @ <input type="checkbox" name="pclr" checked> | |
| 1375 | + }else{ | |
| 1376 | + @ <input type="checkbox" name="pclr"> | |
| 1377 | + } | |
| 1378 | + @ Propagate color to descendants</input></td></tr> | |
| 1349 | 1379 | @ <tr> |
| 1350 | - for(i=0; i<sizeof(aColor)/sizeof(aColor[0]); i++){ | |
| 1380 | + for(i=0; i<nColor; i++){ | |
| 1351 | 1381 | if( aColor[i].zColor[0] ){ |
| 1352 | 1382 | @ <td bgcolor="%h(aColor[i].zColor)"> |
| 1353 | 1383 | }else{ |
| 1354 | 1384 | @ <td> |
| 1355 | 1385 | } |
| @@ -1357,42 +1387,67 @@ | ||
| 1357 | 1387 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)" checked> |
| 1358 | 1388 | }else{ |
| 1359 | 1389 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)"> |
| 1360 | 1390 | } |
| 1361 | 1391 | @ %h(aColor[i].zCName)</input></td> |
| 1362 | - } | |
| 1363 | - @ </tr><tr><td colspan="9" align="left"> | |
| 1364 | - if( fPropagateColor ){ | |
| 1365 | - @ <input type="checkbox" name="pclr" checked> | |
| 1366 | - }else{ | |
| 1367 | - @ <input type="checkbox" name="pclr"> | |
| 1368 | - } | |
| 1369 | - @ Propagate color to descendants</input></td></tr> | |
| 1392 | + if( (i%6)==5 && i+1<nColor ){ | |
| 1393 | + @ </tr><tr> | |
| 1394 | + } | |
| 1395 | + } | |
| 1396 | + @ </tr> | |
| 1370 | 1397 | @ </table> |
| 1371 | 1398 | @ </td></tr> |
| 1372 | 1399 | |
| 1373 | 1400 | @ <tr><td align="right" valign="top"><b>Tags:</b></td> |
| 1374 | 1401 | @ <td valign="top"> |
| 1375 | - @ <input type="checkbox" name="newtag"> | |
| 1402 | + @ <input type="checkbox" name="newtag"%s(zNewTagFlag)> | |
| 1376 | 1403 | @ Add the following new tag name to this check-in: |
| 1377 | - @ <input type="text" width="15" name="tagname"> | |
| 1404 | + @ <input type="text" width="15" name="tagname" value="%h(zNewTag)"> | |
| 1405 | + db_prepare(&q, | |
| 1406 | + "SELECT tag.tagid, tagname FROM tagxref, tag" | |
| 1407 | + " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid" | |
| 1408 | + " ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)" | |
| 1409 | + " ELSE tagname END", | |
| 1410 | + rid | |
| 1411 | + ); | |
| 1412 | + while( db_step(&q)==SQLITE_ROW ){ | |
| 1413 | + int tagid = db_column_int(&q, 0); | |
| 1414 | + const char *zTagName = db_column_text(&q, 1); | |
| 1415 | + char zLabel[30]; | |
| 1416 | + sprintf(zLabel, "c%d", tagid); | |
| 1417 | + if( P(zLabel) ){ | |
| 1418 | + @ <br><input type="checkbox" name="c%d(tagid)" checked> | |
| 1419 | + }else{ | |
| 1420 | + @ <br><input type="checkbox" name="c%d(tagid)"> | |
| 1421 | + } | |
| 1422 | + if( strncmp(zTagName, "sym-", 4)==0 ){ | |
| 1423 | + @ Cancel tag <b>%h(&zTagName[4])</b> | |
| 1424 | + }else{ | |
| 1425 | + @ Cancel special tag <b>%h(zTagName)</b> | |
| 1426 | + } | |
| 1427 | + } | |
| 1428 | + db_finalize(&q); | |
| 1378 | 1429 | @ </td></tr> |
| 1379 | 1430 | |
| 1380 | 1431 | if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d AND tagid=%d AND srcid>0", |
| 1381 | 1432 | rid, TAG_BRANCH)==0 ){ |
| 1382 | 1433 | @ <tr><td align="right" valign="top"><b>Branching:</b></td> |
| 1383 | 1434 | @ <td valign="top"> |
| 1384 | - @ <input type="checkbox" name="newbr"> | |
| 1435 | + @ <input type="checkbox" name="newbr"%s(zNewBrFlag)> | |
| 1385 | 1436 | @ Make this check-in the start of a new branch named: |
| 1386 | - @ <input type="text" width="15" name="brname"> | |
| 1437 | + @ <input type="text" width="15" name="brname" value="%h(zNewBranch)"> | |
| 1387 | 1438 | @ </td></tr> |
| 1388 | 1439 | } |
| 1389 | 1440 | |
| 1390 | - if( is_a_leaf(rid) ){ | |
| 1441 | + if( is_a_leaf(rid) | |
| 1442 | + && !db_exists("SELECT 1 FROM tagxref " | |
| 1443 | + " WHERE tagid=%d AND rid=%d AND tagtype>0", | |
| 1444 | + TAG_CLOSED, rid) | |
| 1445 | + ){ | |
| 1391 | 1446 | @ <tr><td align="right" valign="top"><b>Leaf Closure:</b></td> |
| 1392 | 1447 | @ <td valign="top"> |
| 1393 | - @ <input type="checkbox" name="close"> | |
| 1448 | + @ <input type="checkbox" name="close"%s(zCloseFlag)> | |
| 1394 | 1449 | @ Mark this leaf as "closed" so that it no longer appears on the |
| 1395 | 1450 | @ "leaves" page and is no longer labeled as a "<b>Leaf</b>". |
| 1396 | 1451 | @ </td></tr> |
| 1397 | 1452 | } |
| 1398 | 1453 | |
| 1399 | 1454 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -1165,12 +1165,15 @@ | |
| 1165 | const char *zNewComment; |
| 1166 | const char *zUser; |
| 1167 | const char *zNewUser; |
| 1168 | const char *zColor; |
| 1169 | const char *zNewColor; |
| 1170 | const char *zNewTag; |
| 1171 | const char *zNewBranch; |
| 1172 | int fPropagateColor; |
| 1173 | char *zUuid; |
| 1174 | Blob comment; |
| 1175 | Stmt q; |
| 1176 | static const struct SampleColors { |
| @@ -1188,10 +1191,11 @@ | |
| 1188 | { "#ffc0ff", "#ffc0ff" }, |
| 1189 | { "#ffc0d0", "#ffc0d0" }, |
| 1190 | { "#fff0c0", "#fff0c0" }, |
| 1191 | { "#c0c0c0", "#c0c0c0" }, |
| 1192 | }; |
| 1193 | int i; |
| 1194 | |
| 1195 | login_check_credentials(); |
| 1196 | if( !g.okWrite ){ login_needed(); return; } |
| 1197 | rid = atoi(PD("r","0")); |
| @@ -1209,14 +1213,15 @@ | |
| 1209 | zNewUser = PD("u",zUser); |
| 1210 | zColor = db_text("", "SELECT bgcolor" |
| 1211 | " FROM event WHERE objid=%d", rid); |
| 1212 | zNewColor = PD("clr",zColor); |
| 1213 | fPropagateColor = P("pclr")!=0; |
| 1214 | zNewTag = P("newtag")!=0 ? P("tagname") : 0; |
| 1215 | if( zNewTag && zNewTag[0]==0 ) zNewTag = 0; |
| 1216 | zNewBranch = P("newbr")!=0 ? P("brname") : 0; |
| 1217 | if( zNewBranch && zNewBranch[0]==0 ) zNewBranch = 0; |
| 1218 | if( P("apply") ){ |
| 1219 | Blob ctrl; |
| 1220 | char *zDate; |
| 1221 | int nChng = 0; |
| 1222 | |
| @@ -1242,14 +1247,32 @@ | |
| 1242 | zNewComment); |
| 1243 | } |
| 1244 | if( strcmp(zUser,zNewUser)!=0 ){ |
| 1245 | db_multi_exec("REPLACE INTO newtags VALUES('user','+',%Q)", zNewUser); |
| 1246 | } |
| 1247 | if( zNewTag ){ |
| 1248 | db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','+',NULL)", zNewTag); |
| 1249 | } |
| 1250 | if( zNewBranch ){ |
| 1251 | db_multi_exec( |
| 1252 | "REPLACE INTO newtags " |
| 1253 | " SELECT tagname, '-', NULL FROM tagxref, tag" |
| 1254 | " WHERE tagxref.rid=%d AND tagtype==2" |
| 1255 | " AND tagname GLOB 'sym-*'" |
| @@ -1344,12 +1367,19 @@ | |
| 1344 | @ </td></tr> |
| 1345 | |
| 1346 | @ <tr><td align="right" valign="top"><b>Background Color:</b></td> |
| 1347 | @ <td valign="top"> |
| 1348 | @ <table border=0 cellpadding=0 cellspacing=1> |
| 1349 | @ <tr> |
| 1350 | for(i=0; i<sizeof(aColor)/sizeof(aColor[0]); i++){ |
| 1351 | if( aColor[i].zColor[0] ){ |
| 1352 | @ <td bgcolor="%h(aColor[i].zColor)"> |
| 1353 | }else{ |
| 1354 | @ <td> |
| 1355 | } |
| @@ -1357,42 +1387,67 @@ | |
| 1357 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)" checked> |
| 1358 | }else{ |
| 1359 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)"> |
| 1360 | } |
| 1361 | @ %h(aColor[i].zCName)</input></td> |
| 1362 | } |
| 1363 | @ </tr><tr><td colspan="9" align="left"> |
| 1364 | if( fPropagateColor ){ |
| 1365 | @ <input type="checkbox" name="pclr" checked> |
| 1366 | }else{ |
| 1367 | @ <input type="checkbox" name="pclr"> |
| 1368 | } |
| 1369 | @ Propagate color to descendants</input></td></tr> |
| 1370 | @ </table> |
| 1371 | @ </td></tr> |
| 1372 | |
| 1373 | @ <tr><td align="right" valign="top"><b>Tags:</b></td> |
| 1374 | @ <td valign="top"> |
| 1375 | @ <input type="checkbox" name="newtag"> |
| 1376 | @ Add the following new tag name to this check-in: |
| 1377 | @ <input type="text" width="15" name="tagname"> |
| 1378 | @ </td></tr> |
| 1379 | |
| 1380 | if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d AND tagid=%d AND srcid>0", |
| 1381 | rid, TAG_BRANCH)==0 ){ |
| 1382 | @ <tr><td align="right" valign="top"><b>Branching:</b></td> |
| 1383 | @ <td valign="top"> |
| 1384 | @ <input type="checkbox" name="newbr"> |
| 1385 | @ Make this check-in the start of a new branch named: |
| 1386 | @ <input type="text" width="15" name="brname"> |
| 1387 | @ </td></tr> |
| 1388 | } |
| 1389 | |
| 1390 | if( is_a_leaf(rid) ){ |
| 1391 | @ <tr><td align="right" valign="top"><b>Leaf Closure:</b></td> |
| 1392 | @ <td valign="top"> |
| 1393 | @ <input type="checkbox" name="close"> |
| 1394 | @ Mark this leaf as "closed" so that it no longer appears on the |
| 1395 | @ "leaves" page and is no longer labeled as a "<b>Leaf</b>". |
| 1396 | @ </td></tr> |
| 1397 | } |
| 1398 | |
| 1399 |
| --- src/info.c | |
| +++ src/info.c | |
| @@ -1165,12 +1165,15 @@ | |
| 1165 | const char *zNewComment; |
| 1166 | const char *zUser; |
| 1167 | const char *zNewUser; |
| 1168 | const char *zColor; |
| 1169 | const char *zNewColor; |
| 1170 | const char *zNewTagFlag; |
| 1171 | const char *zNewTag; |
| 1172 | const char *zNewBrFlag; |
| 1173 | const char *zNewBranch; |
| 1174 | const char *zCloseFlag; |
| 1175 | int fPropagateColor; |
| 1176 | char *zUuid; |
| 1177 | Blob comment; |
| 1178 | Stmt q; |
| 1179 | static const struct SampleColors { |
| @@ -1188,10 +1191,11 @@ | |
| 1191 | { "#ffc0ff", "#ffc0ff" }, |
| 1192 | { "#ffc0d0", "#ffc0d0" }, |
| 1193 | { "#fff0c0", "#fff0c0" }, |
| 1194 | { "#c0c0c0", "#c0c0c0" }, |
| 1195 | }; |
| 1196 | int nColor = sizeof(aColor)/sizeof(aColor[0]); |
| 1197 | int i; |
| 1198 | |
| 1199 | login_check_credentials(); |
| 1200 | if( !g.okWrite ){ login_needed(); return; } |
| 1201 | rid = atoi(PD("r","0")); |
| @@ -1209,14 +1213,15 @@ | |
| 1213 | zNewUser = PD("u",zUser); |
| 1214 | zColor = db_text("", "SELECT bgcolor" |
| 1215 | " FROM event WHERE objid=%d", rid); |
| 1216 | zNewColor = PD("clr",zColor); |
| 1217 | fPropagateColor = P("pclr")!=0; |
| 1218 | zNewTagFlag = P("newtag") ? " checked" : ""; |
| 1219 | zNewTag = PD("tagname",""); |
| 1220 | zNewBrFlag = P("newbr") ? " checked" : ""; |
| 1221 | zNewBranch = PD("brname",""); |
| 1222 | zCloseFlag = P("close") ? " checked" : ""; |
| 1223 | if( P("apply") ){ |
| 1224 | Blob ctrl; |
| 1225 | char *zDate; |
| 1226 | int nChng = 0; |
| 1227 | |
| @@ -1242,14 +1247,32 @@ | |
| 1247 | zNewComment); |
| 1248 | } |
| 1249 | if( strcmp(zUser,zNewUser)!=0 ){ |
| 1250 | db_multi_exec("REPLACE INTO newtags VALUES('user','+',%Q)", zNewUser); |
| 1251 | } |
| 1252 | db_prepare(&q, |
| 1253 | "SELECT tag.tagid, tagname FROM tagxref, tag" |
| 1254 | " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid", |
| 1255 | rid |
| 1256 | ); |
| 1257 | while( db_step(&q)==SQLITE_ROW ){ |
| 1258 | int tagid = db_column_int(&q, 0); |
| 1259 | const char *zTag = db_column_text(&q, 1); |
| 1260 | char zLabel[30]; |
| 1261 | sprintf(zLabel, "c%d", tagid); |
| 1262 | if( P(zLabel) ){ |
| 1263 | db_multi_exec("REPLACE INTO newtags VALUES(%Q,'-',NULL)", zTag); |
| 1264 | } |
| 1265 | } |
| 1266 | db_finalize(&q); |
| 1267 | if( zCloseFlag[0] ){ |
| 1268 | db_multi_exec("REPLACE INTO newtags VALUES('closed','+',NULL)"); |
| 1269 | } |
| 1270 | if( zNewTagFlag[0] ){ |
| 1271 | db_multi_exec("REPLACE INTO newtags VALUES('sym-%q','+',NULL)", zNewTag); |
| 1272 | } |
| 1273 | if( zNewBrFlag[0] ){ |
| 1274 | db_multi_exec( |
| 1275 | "REPLACE INTO newtags " |
| 1276 | " SELECT tagname, '-', NULL FROM tagxref, tag" |
| 1277 | " WHERE tagxref.rid=%d AND tagtype==2" |
| 1278 | " AND tagname GLOB 'sym-*'" |
| @@ -1344,12 +1367,19 @@ | |
| 1367 | @ </td></tr> |
| 1368 | |
| 1369 | @ <tr><td align="right" valign="top"><b>Background Color:</b></td> |
| 1370 | @ <td valign="top"> |
| 1371 | @ <table border=0 cellpadding=0 cellspacing=1> |
| 1372 | @ <tr><td colspan="6" align="left"> |
| 1373 | if( fPropagateColor ){ |
| 1374 | @ <input type="checkbox" name="pclr" checked> |
| 1375 | }else{ |
| 1376 | @ <input type="checkbox" name="pclr"> |
| 1377 | } |
| 1378 | @ Propagate color to descendants</input></td></tr> |
| 1379 | @ <tr> |
| 1380 | for(i=0; i<nColor; i++){ |
| 1381 | if( aColor[i].zColor[0] ){ |
| 1382 | @ <td bgcolor="%h(aColor[i].zColor)"> |
| 1383 | }else{ |
| 1384 | @ <td> |
| 1385 | } |
| @@ -1357,42 +1387,67 @@ | |
| 1387 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)" checked> |
| 1388 | }else{ |
| 1389 | @ <input type="radio" name="clr" value="%h(aColor[i].zColor)"> |
| 1390 | } |
| 1391 | @ %h(aColor[i].zCName)</input></td> |
| 1392 | if( (i%6)==5 && i+1<nColor ){ |
| 1393 | @ </tr><tr> |
| 1394 | } |
| 1395 | } |
| 1396 | @ </tr> |
| 1397 | @ </table> |
| 1398 | @ </td></tr> |
| 1399 | |
| 1400 | @ <tr><td align="right" valign="top"><b>Tags:</b></td> |
| 1401 | @ <td valign="top"> |
| 1402 | @ <input type="checkbox" name="newtag"%s(zNewTagFlag)> |
| 1403 | @ Add the following new tag name to this check-in: |
| 1404 | @ <input type="text" width="15" name="tagname" value="%h(zNewTag)"> |
| 1405 | db_prepare(&q, |
| 1406 | "SELECT tag.tagid, tagname FROM tagxref, tag" |
| 1407 | " WHERE tagxref.rid=%d AND tagtype>0 AND tagxref.tagid=tag.tagid" |
| 1408 | " ORDER BY CASE WHEN tagname GLOB 'sym-*' THEN substr(tagname,5)" |
| 1409 | " ELSE tagname END", |
| 1410 | rid |
| 1411 | ); |
| 1412 | while( db_step(&q)==SQLITE_ROW ){ |
| 1413 | int tagid = db_column_int(&q, 0); |
| 1414 | const char *zTagName = db_column_text(&q, 1); |
| 1415 | char zLabel[30]; |
| 1416 | sprintf(zLabel, "c%d", tagid); |
| 1417 | if( P(zLabel) ){ |
| 1418 | @ <br><input type="checkbox" name="c%d(tagid)" checked> |
| 1419 | }else{ |
| 1420 | @ <br><input type="checkbox" name="c%d(tagid)"> |
| 1421 | } |
| 1422 | if( strncmp(zTagName, "sym-", 4)==0 ){ |
| 1423 | @ Cancel tag <b>%h(&zTagName[4])</b> |
| 1424 | }else{ |
| 1425 | @ Cancel special tag <b>%h(zTagName)</b> |
| 1426 | } |
| 1427 | } |
| 1428 | db_finalize(&q); |
| 1429 | @ </td></tr> |
| 1430 | |
| 1431 | if( db_exists("SELECT 1 FROM tagxref WHERE rid=%d AND tagid=%d AND srcid>0", |
| 1432 | rid, TAG_BRANCH)==0 ){ |
| 1433 | @ <tr><td align="right" valign="top"><b>Branching:</b></td> |
| 1434 | @ <td valign="top"> |
| 1435 | @ <input type="checkbox" name="newbr"%s(zNewBrFlag)> |
| 1436 | @ Make this check-in the start of a new branch named: |
| 1437 | @ <input type="text" width="15" name="brname" value="%h(zNewBranch)"> |
| 1438 | @ </td></tr> |
| 1439 | } |
| 1440 | |
| 1441 | if( is_a_leaf(rid) |
| 1442 | && !db_exists("SELECT 1 FROM tagxref " |
| 1443 | " WHERE tagid=%d AND rid=%d AND tagtype>0", |
| 1444 | TAG_CLOSED, rid) |
| 1445 | ){ |
| 1446 | @ <tr><td align="right" valign="top"><b>Leaf Closure:</b></td> |
| 1447 | @ <td valign="top"> |
| 1448 | @ <input type="checkbox" name="close"%s(zCloseFlag)> |
| 1449 | @ Mark this leaf as "closed" so that it no longer appears on the |
| 1450 | @ "leaves" page and is no longer labeled as a "<b>Leaf</b>". |
| 1451 | @ </td></tr> |
| 1452 | } |
| 1453 | |
| 1454 |
+4
-1
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -253,10 +253,13 @@ | ||
| 253 | 253 | @ datetime(event.mtime,'localtime') AS timestamp, |
| 254 | 254 | @ coalesce(ecomment, comment), |
| 255 | 255 | @ coalesce(euser, user), |
| 256 | 256 | @ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim=1), |
| 257 | 257 | @ (SELECT count(*) FROM plink WHERE cid=blob.rid), |
| 258 | + @ NOT EXISTS(SELECT 1 FROM tagxref | |
| 259 | + @ WHERE tagid=%d AND tagtype>0 AND rid=blob.rid) | |
| 260 | + @ AND | |
| 258 | 261 | @ NOT EXISTS(SELECT 1 FROM plink |
| 259 | 262 | @ WHERE pid=blob.rid |
| 260 | 263 | @ AND coalesce((SELECT value FROM tagxref |
| 261 | 264 | @ WHERE tagid=%d AND rid=plink.pid), 'trunk') |
| 262 | 265 | @ = coalesce((SELECT value FROM tagxref |
| @@ -268,11 +271,11 @@ | ||
| 268 | 271 | @ AND tagxref.rid=blob.rid AND tagxref.tagtype>0) |
| 269 | 272 | @ FROM event JOIN blob |
| 270 | 273 | @ WHERE blob.rid=event.objid |
| 271 | 274 | ; |
| 272 | 275 | if( zBase==0 ){ |
| 273 | - zBase = mprintf(zBaseSql, TAG_BRANCH, TAG_BRANCH); | |
| 276 | + zBase = mprintf(zBaseSql, TAG_CLOSED, TAG_BRANCH, TAG_BRANCH); | |
| 274 | 277 | } |
| 275 | 278 | return zBase; |
| 276 | 279 | } |
| 277 | 280 | |
| 278 | 281 | /* |
| 279 | 282 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -253,10 +253,13 @@ | |
| 253 | @ datetime(event.mtime,'localtime') AS timestamp, |
| 254 | @ coalesce(ecomment, comment), |
| 255 | @ coalesce(euser, user), |
| 256 | @ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim=1), |
| 257 | @ (SELECT count(*) FROM plink WHERE cid=blob.rid), |
| 258 | @ NOT EXISTS(SELECT 1 FROM plink |
| 259 | @ WHERE pid=blob.rid |
| 260 | @ AND coalesce((SELECT value FROM tagxref |
| 261 | @ WHERE tagid=%d AND rid=plink.pid), 'trunk') |
| 262 | @ = coalesce((SELECT value FROM tagxref |
| @@ -268,11 +271,11 @@ | |
| 268 | @ AND tagxref.rid=blob.rid AND tagxref.tagtype>0) |
| 269 | @ FROM event JOIN blob |
| 270 | @ WHERE blob.rid=event.objid |
| 271 | ; |
| 272 | if( zBase==0 ){ |
| 273 | zBase = mprintf(zBaseSql, TAG_BRANCH, TAG_BRANCH); |
| 274 | } |
| 275 | return zBase; |
| 276 | } |
| 277 | |
| 278 | /* |
| 279 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -253,10 +253,13 @@ | |
| 253 | @ datetime(event.mtime,'localtime') AS timestamp, |
| 254 | @ coalesce(ecomment, comment), |
| 255 | @ coalesce(euser, user), |
| 256 | @ (SELECT count(*) FROM plink WHERE pid=blob.rid AND isprim=1), |
| 257 | @ (SELECT count(*) FROM plink WHERE cid=blob.rid), |
| 258 | @ NOT EXISTS(SELECT 1 FROM tagxref |
| 259 | @ WHERE tagid=%d AND tagtype>0 AND rid=blob.rid) |
| 260 | @ AND |
| 261 | @ NOT EXISTS(SELECT 1 FROM plink |
| 262 | @ WHERE pid=blob.rid |
| 263 | @ AND coalesce((SELECT value FROM tagxref |
| 264 | @ WHERE tagid=%d AND rid=plink.pid), 'trunk') |
| 265 | @ = coalesce((SELECT value FROM tagxref |
| @@ -268,11 +271,11 @@ | |
| 271 | @ AND tagxref.rid=blob.rid AND tagxref.tagtype>0) |
| 272 | @ FROM event JOIN blob |
| 273 | @ WHERE blob.rid=event.objid |
| 274 | ; |
| 275 | if( zBase==0 ){ |
| 276 | zBase = mprintf(zBaseSql, TAG_CLOSED, TAG_BRANCH, TAG_BRANCH); |
| 277 | } |
| 278 | return zBase; |
| 279 | } |
| 280 | |
| 281 | /* |
| 282 |