Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
| Comment: | Add the "fossil bisect option linear on" command that allows the "fossil bisect run" command to invoke a test script on every check-in along a path between two boundary check-ins. The "linear" option resets automatically opon "fossil bisect reset". |
|---|---|
| Downloads: | Tarball | ZIP archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
42f61b677e451b1864676dca9481d328 |
| User & Date: | drh 2022-06-05 19:43:22.951 |
Context
|
2022-06-06
| ||
| 00:41 | Fix the new linear bisect so that it always goes from good to bad and stops at the first bad check-in found. check-in: e65544571e user: drh tags: trunk | |
|
2022-06-05
| ||
| 19:43 | Add the "fossil bisect option linear on" command that allows the "fossil bisect run" command to invoke a test script on every check-in along a path between two boundary check-ins. The "linear" option resets automatically opon "fossil bisect reset". check-in: 42f61b677e user: drh tags: trunk | |
| 15:09 | Corrected a closing P tag in /setup_skin, per report in the forum. check-in: c7aaaaa8c6 user: stephan tags: trunk | |
Changes
Changes to src/bisect.c.
| ︙ | ︙ | |||
79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
{ "auto-next", "on", "Automatically run \"bisect next\" after each "
"\"bisect good\", \"bisect bad\", or \"bisect "
"skip\"" },
{ "direct-only", "on", "Follow only primary parent-child links, not "
"merges\n" },
{ "display", "chart", "Command to run after \"next\". \"chart\", "
"\"log\", \"status\", or \"none\"" },
};
/*
** Return the value of a boolean bisect option.
*/
int bisect_option(const char *zName){
unsigned int i;
| > | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
{ "auto-next", "on", "Automatically run \"bisect next\" after each "
"\"bisect good\", \"bisect bad\", or \"bisect "
"skip\"" },
{ "direct-only", "on", "Follow only primary parent-child links, not "
"merges\n" },
{ "display", "chart", "Command to run after \"next\". \"chart\", "
"\"log\", \"status\", or \"none\"" },
{ "linear", "off", "Do a linear scan rather than a true bisect" },
};
/*
** Return the value of a boolean bisect option.
*/
int bisect_option(const char *zName){
unsigned int i;
|
| ︙ | ︙ | |||
373 374 375 376 377 378 379 |
/*
** Reset the bisect subsystem.
*/
void bisect_reset(void){
db_multi_exec(
"DELETE FROM vvar WHERE name IN "
| | > | 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 |
/*
** Reset the bisect subsystem.
*/
void bisect_reset(void){
db_multi_exec(
"DELETE FROM vvar WHERE name IN "
" ('bisect-good', 'bisect-bad', 'bisect-log', 'bisect-complete',"
" 'bisect-linear')"
);
}
/*
** fossil bisect run [OPTIONS] COMMAND
**
** Invoke COMMAND (with arguments) repeatedly to perform the bisect.
|
| ︙ | ︙ | |||
628 629 630 631 632 633 634 |
/* No else here so that the above commands can morph themselves into
** a "next" command */
if( strncmp(zCmd, "next", n)==0 ){
PathNode *pMid;
char *zDisplay = db_lget("bisect-display","chart");
int m = (int)strlen(zDisplay);
bisect_path();
| > > > | > | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 |
/* No else here so that the above commands can morph themselves into
** a "next" command */
if( strncmp(zCmd, "next", n)==0 ){
PathNode *pMid;
char *zDisplay = db_lget("bisect-display","chart");
int m = (int)strlen(zDisplay);
bisect_path();
if( db_lget_boolean("bisect-linear",0) ){
pMid = path_next();
}else{
pMid = path_midpoint();
}
if( pMid==0 ){
fossil_print("bisect complete\n");
db_lset_int("bisect-complete",1);
}else{
int nSpan = path_length_not_hidden();
int nStep = path_search_depth();
g.argv[1] = "update";
|
| ︙ | ︙ |
Changes to src/db.c.
| ︙ | ︙ | |||
3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 |
"SELECT value FROM vvar WHERE name=%Q", zName);
}
void db_lset(const char *zName, const char *zValue){
db_multi_exec("REPLACE INTO vvar(name,value) VALUES(%Q,%Q)", zName, zValue);
}
int db_lget_int(const char *zName, int dflt){
return db_int(dflt, "SELECT value FROM vvar WHERE name=%Q", zName);
}
void db_lset_int(const char *zName, int value){
db_multi_exec("REPLACE INTO vvar(name,value) VALUES(%Q,%d)", zName, value);
}
/* Va-args versions of db_get(), db_set(), and db_unset()
**
| > > > > > > > > > > | 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 |
"SELECT value FROM vvar WHERE name=%Q", zName);
}
void db_lset(const char *zName, const char *zValue){
db_multi_exec("REPLACE INTO vvar(name,value) VALUES(%Q,%Q)", zName, zValue);
}
int db_lget_int(const char *zName, int dflt){
return db_int(dflt, "SELECT value FROM vvar WHERE name=%Q", zName);
}
int db_lget_boolean(const char *zName, int dflt){
char *zVal = db_lget(zName, dflt ? "on" : "off");
if( is_truth(zVal) ){
dflt = 1;
}else if( is_false(zVal) ){
dflt = 0;
}
fossil_free(zVal);
return dflt;
}
void db_lset_int(const char *zName, int value){
db_multi_exec("REPLACE INTO vvar(name,value) VALUES(%Q,%d)", zName, value);
}
/* Va-args versions of db_get(), db_set(), and db_unset()
**
|
| ︙ | ︙ |
Changes to src/path.c.
| ︙ | ︙ | |||
203 204 205 206 207 208 209 210 211 212 213 214 215 216 |
int i;
if( path.nNotHidden<2 ) return 0;
for(p=path.pEnd, i=0; p && (p->isHidden || i<path.nNotHidden/2); p=p->pFrom){
if( !p->isHidden ) i++;
}
return p;
}
/*
** Return an estimate of the number of comparisons remaining in order
** to bisect path. This is based on the log2() of path.nStep.
*/
int path_search_depth(void){
int i, j;
| > > > > > > > > > > | 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
int i;
if( path.nNotHidden<2 ) return 0;
for(p=path.pEnd, i=0; p && (p->isHidden || i<path.nNotHidden/2); p=p->pFrom){
if( !p->isHidden ) i++;
}
return p;
}
/*
** Find the next most recent node on a path.
*/
PathNode *path_next(void){
PathNode *p;
p = path.pStart;
if( p ) p = p->u.pTo;
return p;
}
/*
** Return an estimate of the number of comparisons remaining in order
** to bisect path. This is based on the log2() of path.nStep.
*/
int path_search_depth(void){
int i, j;
|
| ︙ | ︙ |