Fossil SCM
Disallow "fossil set" and "fossil unset" on an ambiguous prefix.
Commit
3b990b5203c7262f89580a2c41d57cc42ec71768
Parent
c6079d148eb13b1…
2 files changed
+27
-5
+27
-5
M
src/db.c
+27
-5
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -2500,17 +2500,39 @@ | ||
| 2500 | 2500 | } |
| 2501 | 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | 2502 | if( isManifest && globalFlag ){ |
| 2503 | 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | 2504 | } |
| 2505 | - if( unsetFlag ){ | |
| 2506 | - db_unset(ctrlSettings[i].name, globalFlag); | |
| 2507 | - }else if( g.argc==4 ){ | |
| 2508 | - db_set(ctrlSettings[i].name, g.argv[3], globalFlag); | |
| 2505 | + if( unsetFlag || g.argc==4 ){ | |
| 2506 | + if( ctrlSettings[i+1].name | |
| 2507 | + && strncmp(ctrlSettings[i+1].name, zName, n)==0 | |
| 2508 | + && ctrlSettings[i].name[n]!=0 | |
| 2509 | + ){ | |
| 2510 | + fossil_print("ambiguous property prefix: %s\nMatching properties:\n", | |
| 2511 | + zName); | |
| 2512 | + while( ctrlSettings[i].name | |
| 2513 | + && strncmp(ctrlSettings[i].name, zName, n)==0 | |
| 2514 | + ){ | |
| 2515 | + fossil_print("%s\n", ctrlSettings[i].name); | |
| 2516 | + i++; | |
| 2517 | + } | |
| 2518 | + fossil_exit(1); | |
| 2519 | + }else{ | |
| 2520 | + if( unsetFlag ){ | |
| 2521 | + db_unset(ctrlSettings[i].name, globalFlag); | |
| 2522 | + }else{ | |
| 2523 | + db_set(ctrlSettings[i].name, g.argv[3], globalFlag); | |
| 2524 | + } | |
| 2525 | + } | |
| 2509 | 2526 | }else{ |
| 2510 | 2527 | isManifest = 0; |
| 2511 | - print_setting(&ctrlSettings[i], db_open_local(0)); | |
| 2528 | + while( ctrlSettings[i].name | |
| 2529 | + && strncmp(ctrlSettings[i].name, zName, n)==0 | |
| 2530 | + ){ | |
| 2531 | + print_setting(&ctrlSettings[i], db_open_local(0)); | |
| 2532 | + i++; | |
| 2533 | + } | |
| 2512 | 2534 | } |
| 2513 | 2535 | if( isManifest && g.localOpen ){ |
| 2514 | 2536 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2515 | 2537 | } |
| 2516 | 2538 | }else{ |
| 2517 | 2539 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2500,17 +2500,39 @@ | |
| 2500 | } |
| 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | if( isManifest && globalFlag ){ |
| 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | } |
| 2505 | if( unsetFlag ){ |
| 2506 | db_unset(ctrlSettings[i].name, globalFlag); |
| 2507 | }else if( g.argc==4 ){ |
| 2508 | db_set(ctrlSettings[i].name, g.argv[3], globalFlag); |
| 2509 | }else{ |
| 2510 | isManifest = 0; |
| 2511 | print_setting(&ctrlSettings[i], db_open_local(0)); |
| 2512 | } |
| 2513 | if( isManifest && g.localOpen ){ |
| 2514 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2515 | } |
| 2516 | }else{ |
| 2517 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2500,17 +2500,39 @@ | |
| 2500 | } |
| 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | if( isManifest && globalFlag ){ |
| 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | } |
| 2505 | if( unsetFlag || g.argc==4 ){ |
| 2506 | if( ctrlSettings[i+1].name |
| 2507 | && strncmp(ctrlSettings[i+1].name, zName, n)==0 |
| 2508 | && ctrlSettings[i].name[n]!=0 |
| 2509 | ){ |
| 2510 | fossil_print("ambiguous property prefix: %s\nMatching properties:\n", |
| 2511 | zName); |
| 2512 | while( ctrlSettings[i].name |
| 2513 | && strncmp(ctrlSettings[i].name, zName, n)==0 |
| 2514 | ){ |
| 2515 | fossil_print("%s\n", ctrlSettings[i].name); |
| 2516 | i++; |
| 2517 | } |
| 2518 | fossil_exit(1); |
| 2519 | }else{ |
| 2520 | if( unsetFlag ){ |
| 2521 | db_unset(ctrlSettings[i].name, globalFlag); |
| 2522 | }else{ |
| 2523 | db_set(ctrlSettings[i].name, g.argv[3], globalFlag); |
| 2524 | } |
| 2525 | } |
| 2526 | }else{ |
| 2527 | isManifest = 0; |
| 2528 | while( ctrlSettings[i].name |
| 2529 | && strncmp(ctrlSettings[i].name, zName, n)==0 |
| 2530 | ){ |
| 2531 | print_setting(&ctrlSettings[i], db_open_local(0)); |
| 2532 | i++; |
| 2533 | } |
| 2534 | } |
| 2535 | if( isManifest && g.localOpen ){ |
| 2536 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2537 | } |
| 2538 | }else{ |
| 2539 |
M
src/db.c
+27
-5
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -2500,17 +2500,39 @@ | ||
| 2500 | 2500 | } |
| 2501 | 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | 2502 | if( isManifest && globalFlag ){ |
| 2503 | 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | 2504 | } |
| 2505 | - if( unsetFlag ){ | |
| 2506 | - db_unset(ctrlSettings[i].name, globalFlag); | |
| 2507 | - }else if( g.argc==4 ){ | |
| 2508 | - db_set(ctrlSettings[i].name, g.argv[3], globalFlag); | |
| 2505 | + if( unsetFlag || g.argc==4 ){ | |
| 2506 | + if( ctrlSettings[i+1].name | |
| 2507 | + && strncmp(ctrlSettings[i+1].name, zName, n)==0 | |
| 2508 | + && ctrlSettings[i].name[n]!=0 | |
| 2509 | + ){ | |
| 2510 | + fossil_print("ambiguous property prefix: %s\nMatching properties:\n", | |
| 2511 | + zName); | |
| 2512 | + while( ctrlSettings[i].name | |
| 2513 | + && strncmp(ctrlSettings[i].name, zName, n)==0 | |
| 2514 | + ){ | |
| 2515 | + fossil_print("%s\n", ctrlSettings[i].name); | |
| 2516 | + i++; | |
| 2517 | + } | |
| 2518 | + fossil_exit(1); | |
| 2519 | + }else{ | |
| 2520 | + if( unsetFlag ){ | |
| 2521 | + db_unset(ctrlSettings[i].name, globalFlag); | |
| 2522 | + }else{ | |
| 2523 | + db_set(ctrlSettings[i].name, g.argv[3], globalFlag); | |
| 2524 | + } | |
| 2525 | + } | |
| 2509 | 2526 | }else{ |
| 2510 | 2527 | isManifest = 0; |
| 2511 | - print_setting(&ctrlSettings[i], db_open_local(0)); | |
| 2528 | + while( ctrlSettings[i].name | |
| 2529 | + && strncmp(ctrlSettings[i].name, zName, n)==0 | |
| 2530 | + ){ | |
| 2531 | + print_setting(&ctrlSettings[i], db_open_local(0)); | |
| 2532 | + i++; | |
| 2533 | + } | |
| 2512 | 2534 | } |
| 2513 | 2535 | if( isManifest && g.localOpen ){ |
| 2514 | 2536 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2515 | 2537 | } |
| 2516 | 2538 | }else{ |
| 2517 | 2539 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2500,17 +2500,39 @@ | |
| 2500 | } |
| 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | if( isManifest && globalFlag ){ |
| 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | } |
| 2505 | if( unsetFlag ){ |
| 2506 | db_unset(ctrlSettings[i].name, globalFlag); |
| 2507 | }else if( g.argc==4 ){ |
| 2508 | db_set(ctrlSettings[i].name, g.argv[3], globalFlag); |
| 2509 | }else{ |
| 2510 | isManifest = 0; |
| 2511 | print_setting(&ctrlSettings[i], db_open_local(0)); |
| 2512 | } |
| 2513 | if( isManifest && g.localOpen ){ |
| 2514 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2515 | } |
| 2516 | }else{ |
| 2517 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -2500,17 +2500,39 @@ | |
| 2500 | } |
| 2501 | isManifest = fossil_strcmp(ctrlSettings[i].name, "manifest")==0; |
| 2502 | if( isManifest && globalFlag ){ |
| 2503 | fossil_fatal("cannot set 'manifest' globally"); |
| 2504 | } |
| 2505 | if( unsetFlag || g.argc==4 ){ |
| 2506 | if( ctrlSettings[i+1].name |
| 2507 | && strncmp(ctrlSettings[i+1].name, zName, n)==0 |
| 2508 | && ctrlSettings[i].name[n]!=0 |
| 2509 | ){ |
| 2510 | fossil_print("ambiguous property prefix: %s\nMatching properties:\n", |
| 2511 | zName); |
| 2512 | while( ctrlSettings[i].name |
| 2513 | && strncmp(ctrlSettings[i].name, zName, n)==0 |
| 2514 | ){ |
| 2515 | fossil_print("%s\n", ctrlSettings[i].name); |
| 2516 | i++; |
| 2517 | } |
| 2518 | fossil_exit(1); |
| 2519 | }else{ |
| 2520 | if( unsetFlag ){ |
| 2521 | db_unset(ctrlSettings[i].name, globalFlag); |
| 2522 | }else{ |
| 2523 | db_set(ctrlSettings[i].name, g.argv[3], globalFlag); |
| 2524 | } |
| 2525 | } |
| 2526 | }else{ |
| 2527 | isManifest = 0; |
| 2528 | while( ctrlSettings[i].name |
| 2529 | && strncmp(ctrlSettings[i].name, zName, n)==0 |
| 2530 | ){ |
| 2531 | print_setting(&ctrlSettings[i], db_open_local(0)); |
| 2532 | i++; |
| 2533 | } |
| 2534 | } |
| 2535 | if( isManifest && g.localOpen ){ |
| 2536 | manifest_to_disk(db_lget_int("checkout", 0)); |
| 2537 | } |
| 2538 | }else{ |
| 2539 |