Fossil SCM
Prompt the user for permission to overwrite files on "fossil open". Ticket [17389900b2e5bd816]
Commit
d778ffea81e7f76b71833cb41f4866c511fafb2c
Parent
b892572644f5714…
6 files changed
+3
-1
+2
-2
+1
-1
+2
-2
+3
-3
+23
-1
+3
-1
| --- src/checkout.c | ||
| +++ src/checkout.c | ||
| @@ -159,18 +159,20 @@ | ||
| 159 | 159 | void checkout_cmd(void){ |
| 160 | 160 | int forceFlag; /* Force checkout even if edits exist */ |
| 161 | 161 | int keepFlag; /* Do not change any files on disk */ |
| 162 | 162 | int latestFlag; /* Checkout the latest version */ |
| 163 | 163 | char *zVers; /* Version to checkout */ |
| 164 | + int promptFlag; /* True to prompt before overwriting */ | |
| 164 | 165 | int vid, prior; |
| 165 | 166 | Blob cksum1, cksum1b, cksum2; |
| 166 | 167 | |
| 167 | 168 | db_must_be_within_tree(); |
| 168 | 169 | db_begin_transaction(); |
| 169 | 170 | forceFlag = find_option("force","f",0)!=0; |
| 170 | 171 | keepFlag = find_option("keep",0,0)!=0; |
| 171 | 172 | latestFlag = find_option("latest",0,0)!=0; |
| 173 | + promptFlag = find_option("prompt",0,0)!=0; /* Prompt user before overwrite */ | |
| 172 | 174 | if( (latestFlag!=0 && g.argc!=2) || (latestFlag==0 && g.argc!=3) ){ |
| 173 | 175 | usage("VERSION|--latest ?--force? ?--keep?"); |
| 174 | 176 | } |
| 175 | 177 | if( !forceFlag && unsaved_changes()==1 ){ |
| 176 | 178 | fossil_fatal("there are unsaved changes in the current checkout"); |
| @@ -204,11 +206,11 @@ | ||
| 204 | 206 | if( !keepFlag ){ |
| 205 | 207 | uncheckout(prior); |
| 206 | 208 | } |
| 207 | 209 | db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid); |
| 208 | 210 | if( !keepFlag ){ |
| 209 | - vfile_to_disk(vid, 0, 1); | |
| 211 | + vfile_to_disk(vid, 0, 1, promptFlag); | |
| 210 | 212 | } |
| 211 | 213 | manifest_to_disk(vid); |
| 212 | 214 | db_lset_int("checkout", vid); |
| 213 | 215 | undo_reset(); |
| 214 | 216 | db_multi_exec("DELETE FROM vmerge"); |
| 215 | 217 |
| --- src/checkout.c | |
| +++ src/checkout.c | |
| @@ -159,18 +159,20 @@ | |
| 159 | void checkout_cmd(void){ |
| 160 | int forceFlag; /* Force checkout even if edits exist */ |
| 161 | int keepFlag; /* Do not change any files on disk */ |
| 162 | int latestFlag; /* Checkout the latest version */ |
| 163 | char *zVers; /* Version to checkout */ |
| 164 | int vid, prior; |
| 165 | Blob cksum1, cksum1b, cksum2; |
| 166 | |
| 167 | db_must_be_within_tree(); |
| 168 | db_begin_transaction(); |
| 169 | forceFlag = find_option("force","f",0)!=0; |
| 170 | keepFlag = find_option("keep",0,0)!=0; |
| 171 | latestFlag = find_option("latest",0,0)!=0; |
| 172 | if( (latestFlag!=0 && g.argc!=2) || (latestFlag==0 && g.argc!=3) ){ |
| 173 | usage("VERSION|--latest ?--force? ?--keep?"); |
| 174 | } |
| 175 | if( !forceFlag && unsaved_changes()==1 ){ |
| 176 | fossil_fatal("there are unsaved changes in the current checkout"); |
| @@ -204,11 +206,11 @@ | |
| 204 | if( !keepFlag ){ |
| 205 | uncheckout(prior); |
| 206 | } |
| 207 | db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid); |
| 208 | if( !keepFlag ){ |
| 209 | vfile_to_disk(vid, 0, 1); |
| 210 | } |
| 211 | manifest_to_disk(vid); |
| 212 | db_lset_int("checkout", vid); |
| 213 | undo_reset(); |
| 214 | db_multi_exec("DELETE FROM vmerge"); |
| 215 |
| --- src/checkout.c | |
| +++ src/checkout.c | |
| @@ -159,18 +159,20 @@ | |
| 159 | void checkout_cmd(void){ |
| 160 | int forceFlag; /* Force checkout even if edits exist */ |
| 161 | int keepFlag; /* Do not change any files on disk */ |
| 162 | int latestFlag; /* Checkout the latest version */ |
| 163 | char *zVers; /* Version to checkout */ |
| 164 | int promptFlag; /* True to prompt before overwriting */ |
| 165 | int vid, prior; |
| 166 | Blob cksum1, cksum1b, cksum2; |
| 167 | |
| 168 | db_must_be_within_tree(); |
| 169 | db_begin_transaction(); |
| 170 | forceFlag = find_option("force","f",0)!=0; |
| 171 | keepFlag = find_option("keep",0,0)!=0; |
| 172 | latestFlag = find_option("latest",0,0)!=0; |
| 173 | promptFlag = find_option("prompt",0,0)!=0; /* Prompt user before overwrite */ |
| 174 | if( (latestFlag!=0 && g.argc!=2) || (latestFlag==0 && g.argc!=3) ){ |
| 175 | usage("VERSION|--latest ?--force? ?--keep?"); |
| 176 | } |
| 177 | if( !forceFlag && unsaved_changes()==1 ){ |
| 178 | fossil_fatal("there are unsaved changes in the current checkout"); |
| @@ -204,11 +206,11 @@ | |
| 206 | if( !keepFlag ){ |
| 207 | uncheckout(prior); |
| 208 | } |
| 209 | db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid); |
| 210 | if( !keepFlag ){ |
| 211 | vfile_to_disk(vid, 0, 1, promptFlag); |
| 212 | } |
| 213 | manifest_to_disk(vid); |
| 214 | db_lset_int("checkout", vid); |
| 215 | undo_reset(); |
| 216 | db_multi_exec("DELETE FROM vmerge"); |
| 217 |
M
src/db.c
+2
-2
| --- src/db.c | ||
| +++ src/db.c | ||
| @@ -1410,11 +1410,11 @@ | ||
| 1410 | 1410 | */ |
| 1411 | 1411 | void cmd_open(void){ |
| 1412 | 1412 | Blob path; |
| 1413 | 1413 | int vid; |
| 1414 | 1414 | int keepFlag; |
| 1415 | - static char *azNewArgv[] = { 0, "checkout", "--latest", 0, 0, 0 }; | |
| 1415 | + static char *azNewArgv[] = { 0, "checkout", "--prompt", "--latest", 0, 0 }; | |
| 1416 | 1416 | url_proxy_options(); |
| 1417 | 1417 | keepFlag = find_option("keep",0,0)!=0; |
| 1418 | 1418 | if( g.argc!=3 && g.argc!=4 ){ |
| 1419 | 1419 | usage("REPOSITORY-FILENAME ?VERSION?"); |
| 1420 | 1420 | } |
| @@ -1435,11 +1435,11 @@ | ||
| 1435 | 1435 | char **oldArgv = g.argv; |
| 1436 | 1436 | int oldArgc = g.argc; |
| 1437 | 1437 | db_lset_int("checkout", vid); |
| 1438 | 1438 | azNewArgv[0] = g.argv[0]; |
| 1439 | 1439 | g.argv = azNewArgv; |
| 1440 | - g.argc = 3; | |
| 1440 | + g.argc = 4; | |
| 1441 | 1441 | if( oldArgc==4 ){ |
| 1442 | 1442 | azNewArgv[g.argc-1] = oldArgv[3]; |
| 1443 | 1443 | } |
| 1444 | 1444 | if( keepFlag ){ |
| 1445 | 1445 | azNewArgv[g.argc++] = "--keep"; |
| 1446 | 1446 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -1410,11 +1410,11 @@ | |
| 1410 | */ |
| 1411 | void cmd_open(void){ |
| 1412 | Blob path; |
| 1413 | int vid; |
| 1414 | int keepFlag; |
| 1415 | static char *azNewArgv[] = { 0, "checkout", "--latest", 0, 0, 0 }; |
| 1416 | url_proxy_options(); |
| 1417 | keepFlag = find_option("keep",0,0)!=0; |
| 1418 | if( g.argc!=3 && g.argc!=4 ){ |
| 1419 | usage("REPOSITORY-FILENAME ?VERSION?"); |
| 1420 | } |
| @@ -1435,11 +1435,11 @@ | |
| 1435 | char **oldArgv = g.argv; |
| 1436 | int oldArgc = g.argc; |
| 1437 | db_lset_int("checkout", vid); |
| 1438 | azNewArgv[0] = g.argv[0]; |
| 1439 | g.argv = azNewArgv; |
| 1440 | g.argc = 3; |
| 1441 | if( oldArgc==4 ){ |
| 1442 | azNewArgv[g.argc-1] = oldArgv[3]; |
| 1443 | } |
| 1444 | if( keepFlag ){ |
| 1445 | azNewArgv[g.argc++] = "--keep"; |
| 1446 |
| --- src/db.c | |
| +++ src/db.c | |
| @@ -1410,11 +1410,11 @@ | |
| 1410 | */ |
| 1411 | void cmd_open(void){ |
| 1412 | Blob path; |
| 1413 | int vid; |
| 1414 | int keepFlag; |
| 1415 | static char *azNewArgv[] = { 0, "checkout", "--prompt", "--latest", 0, 0 }; |
| 1416 | url_proxy_options(); |
| 1417 | keepFlag = find_option("keep",0,0)!=0; |
| 1418 | if( g.argc!=3 && g.argc!=4 ){ |
| 1419 | usage("REPOSITORY-FILENAME ?VERSION?"); |
| 1420 | } |
| @@ -1435,11 +1435,11 @@ | |
| 1435 | char **oldArgv = g.argv; |
| 1436 | int oldArgc = g.argc; |
| 1437 | db_lset_int("checkout", vid); |
| 1438 | azNewArgv[0] = g.argv[0]; |
| 1439 | g.argv = azNewArgv; |
| 1440 | g.argc = 4; |
| 1441 | if( oldArgc==4 ){ |
| 1442 | azNewArgv[g.argc-1] = oldArgv[3]; |
| 1443 | } |
| 1444 | if( keepFlag ){ |
| 1445 | azNewArgv[g.argc++] = "--keep"; |
| 1446 |
+1
-1
| --- src/http_ssl.c | ||
| +++ src/http_ssl.c | ||
| @@ -197,11 +197,10 @@ | ||
| 197 | 197 | prompt = mprintf("\nUnknown SSL certificate:\n\n%s\n\n%s\n" |
| 198 | 198 | "Accept certificate [a=always/y/N]? ", desc, warning); |
| 199 | 199 | BIO_free(mem); |
| 200 | 200 | |
| 201 | 201 | Blob ans; |
| 202 | - blob_zero(&ans); | |
| 203 | 202 | prompt_user(prompt, &ans); |
| 204 | 203 | free(prompt); |
| 205 | 204 | if( blob_str(&ans)[0]!='y' && blob_str(&ans)[0]!='a' ) { |
| 206 | 205 | X509_free(cert); |
| 207 | 206 | ssl_set_errmsg("SSL certificate declined"); |
| @@ -209,10 +208,11 @@ | ||
| 209 | 208 | return 1; |
| 210 | 209 | } |
| 211 | 210 | if( blob_str(&ans)[0]=='a' ) { |
| 212 | 211 | ssl_save_certificate(cert); |
| 213 | 212 | } |
| 213 | + blob_reset(&ans); | |
| 214 | 214 | } |
| 215 | 215 | X509_free(cert); |
| 216 | 216 | return 0; |
| 217 | 217 | } |
| 218 | 218 | |
| 219 | 219 |
| --- src/http_ssl.c | |
| +++ src/http_ssl.c | |
| @@ -197,11 +197,10 @@ | |
| 197 | prompt = mprintf("\nUnknown SSL certificate:\n\n%s\n\n%s\n" |
| 198 | "Accept certificate [a=always/y/N]? ", desc, warning); |
| 199 | BIO_free(mem); |
| 200 | |
| 201 | Blob ans; |
| 202 | blob_zero(&ans); |
| 203 | prompt_user(prompt, &ans); |
| 204 | free(prompt); |
| 205 | if( blob_str(&ans)[0]!='y' && blob_str(&ans)[0]!='a' ) { |
| 206 | X509_free(cert); |
| 207 | ssl_set_errmsg("SSL certificate declined"); |
| @@ -209,10 +208,11 @@ | |
| 209 | return 1; |
| 210 | } |
| 211 | if( blob_str(&ans)[0]=='a' ) { |
| 212 | ssl_save_certificate(cert); |
| 213 | } |
| 214 | } |
| 215 | X509_free(cert); |
| 216 | return 0; |
| 217 | } |
| 218 | |
| 219 |
| --- src/http_ssl.c | |
| +++ src/http_ssl.c | |
| @@ -197,11 +197,10 @@ | |
| 197 | prompt = mprintf("\nUnknown SSL certificate:\n\n%s\n\n%s\n" |
| 198 | "Accept certificate [a=always/y/N]? ", desc, warning); |
| 199 | BIO_free(mem); |
| 200 | |
| 201 | Blob ans; |
| 202 | prompt_user(prompt, &ans); |
| 203 | free(prompt); |
| 204 | if( blob_str(&ans)[0]!='y' && blob_str(&ans)[0]!='a' ) { |
| 205 | X509_free(cert); |
| 206 | ssl_set_errmsg("SSL certificate declined"); |
| @@ -209,10 +208,11 @@ | |
| 208 | return 1; |
| 209 | } |
| 210 | if( blob_str(&ans)[0]=='a' ) { |
| 211 | ssl_save_certificate(cert); |
| 212 | } |
| 213 | blob_reset(&ans); |
| 214 | } |
| 215 | X509_free(cert); |
| 216 | return 0; |
| 217 | } |
| 218 | |
| 219 |
+2
-2
| --- src/merge.c | ||
| +++ src/merge.c | ||
| @@ -211,11 +211,11 @@ | ||
| 211 | 211 | idv = db_last_insert_rowid(); |
| 212 | 212 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 213 | 213 | zName = db_column_text(&q, 2); |
| 214 | 214 | printf("ADDED %s\n", zName); |
| 215 | 215 | undo_save(zName); |
| 216 | - vfile_to_disk(0, idm, 0); | |
| 216 | + vfile_to_disk(0, idm, 0, 0); | |
| 217 | 217 | } |
| 218 | 218 | db_finalize(&q); |
| 219 | 219 | |
| 220 | 220 | /* |
| 221 | 221 | ** Find files that have changed from pid->mid but not pid->vid. |
| @@ -234,11 +234,11 @@ | ||
| 234 | 234 | printf("UPDATE %s\n", zName); |
| 235 | 235 | undo_save(zName); |
| 236 | 236 | db_multi_exec( |
| 237 | 237 | "UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv |
| 238 | 238 | ); |
| 239 | - vfile_to_disk(0, idv, 0); | |
| 239 | + vfile_to_disk(0, idv, 0, 0); | |
| 240 | 240 | free(zName); |
| 241 | 241 | } |
| 242 | 242 | db_finalize(&q); |
| 243 | 243 | |
| 244 | 244 | /* |
| 245 | 245 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -211,11 +211,11 @@ | |
| 211 | idv = db_last_insert_rowid(); |
| 212 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 213 | zName = db_column_text(&q, 2); |
| 214 | printf("ADDED %s\n", zName); |
| 215 | undo_save(zName); |
| 216 | vfile_to_disk(0, idm, 0); |
| 217 | } |
| 218 | db_finalize(&q); |
| 219 | |
| 220 | /* |
| 221 | ** Find files that have changed from pid->mid but not pid->vid. |
| @@ -234,11 +234,11 @@ | |
| 234 | printf("UPDATE %s\n", zName); |
| 235 | undo_save(zName); |
| 236 | db_multi_exec( |
| 237 | "UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv |
| 238 | ); |
| 239 | vfile_to_disk(0, idv, 0); |
| 240 | free(zName); |
| 241 | } |
| 242 | db_finalize(&q); |
| 243 | |
| 244 | /* |
| 245 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -211,11 +211,11 @@ | |
| 211 | idv = db_last_insert_rowid(); |
| 212 | db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid); |
| 213 | zName = db_column_text(&q, 2); |
| 214 | printf("ADDED %s\n", zName); |
| 215 | undo_save(zName); |
| 216 | vfile_to_disk(0, idm, 0, 0); |
| 217 | } |
| 218 | db_finalize(&q); |
| 219 | |
| 220 | /* |
| 221 | ** Find files that have changed from pid->mid but not pid->vid. |
| @@ -234,11 +234,11 @@ | |
| 234 | printf("UPDATE %s\n", zName); |
| 235 | undo_save(zName); |
| 236 | db_multi_exec( |
| 237 | "UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv |
| 238 | ); |
| 239 | vfile_to_disk(0, idv, 0, 0); |
| 240 | free(zName); |
| 241 | } |
| 242 | db_finalize(&q); |
| 243 | |
| 244 | /* |
| 245 |
+3
-3
| --- src/update.c | ||
| +++ src/update.c | ||
| @@ -211,22 +211,22 @@ | ||
| 211 | 211 | printf("CONFLICT %s\n", zName); |
| 212 | 212 | }else if( idt>0 && idv==0 ){ |
| 213 | 213 | /* File added in the target. */ |
| 214 | 214 | printf("ADD %s\n", zName); |
| 215 | 215 | undo_save(zName); |
| 216 | - if( !nochangeFlag ) vfile_to_disk(0, idt, 0); | |
| 216 | + if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); | |
| 217 | 217 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged==0 ){ |
| 218 | 218 | /* The file is unedited. Change it to the target version */ |
| 219 | 219 | printf("UPDATE %s\n", zName); |
| 220 | 220 | undo_save(zName); |
| 221 | - if( !nochangeFlag ) vfile_to_disk(0, idt, 0); | |
| 221 | + if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); | |
| 222 | 222 | }else if( idt>0 && idv>0 && file_size(zFullPath)<0 ){ |
| 223 | 223 | /* The file missing from the local check-out. Restore it to the |
| 224 | 224 | ** version that appears in the target. */ |
| 225 | 225 | printf("UPDATE %s\n", zName); |
| 226 | 226 | undo_save(zName); |
| 227 | - if( !nochangeFlag ) vfile_to_disk(0, idt, 0); | |
| 227 | + if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); | |
| 228 | 228 | }else if( idt==0 && idv>0 ){ |
| 229 | 229 | if( ridv==0 ){ |
| 230 | 230 | /* Added in current checkout. Continue to hold the file as |
| 231 | 231 | ** as an addition */ |
| 232 | 232 | db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv); |
| 233 | 233 |
| --- src/update.c | |
| +++ src/update.c | |
| @@ -211,22 +211,22 @@ | |
| 211 | printf("CONFLICT %s\n", zName); |
| 212 | }else if( idt>0 && idv==0 ){ |
| 213 | /* File added in the target. */ |
| 214 | printf("ADD %s\n", zName); |
| 215 | undo_save(zName); |
| 216 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0); |
| 217 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged==0 ){ |
| 218 | /* The file is unedited. Change it to the target version */ |
| 219 | printf("UPDATE %s\n", zName); |
| 220 | undo_save(zName); |
| 221 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0); |
| 222 | }else if( idt>0 && idv>0 && file_size(zFullPath)<0 ){ |
| 223 | /* The file missing from the local check-out. Restore it to the |
| 224 | ** version that appears in the target. */ |
| 225 | printf("UPDATE %s\n", zName); |
| 226 | undo_save(zName); |
| 227 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0); |
| 228 | }else if( idt==0 && idv>0 ){ |
| 229 | if( ridv==0 ){ |
| 230 | /* Added in current checkout. Continue to hold the file as |
| 231 | ** as an addition */ |
| 232 | db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv); |
| 233 |
| --- src/update.c | |
| +++ src/update.c | |
| @@ -211,22 +211,22 @@ | |
| 211 | printf("CONFLICT %s\n", zName); |
| 212 | }else if( idt>0 && idv==0 ){ |
| 213 | /* File added in the target. */ |
| 214 | printf("ADD %s\n", zName); |
| 215 | undo_save(zName); |
| 216 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); |
| 217 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged==0 ){ |
| 218 | /* The file is unedited. Change it to the target version */ |
| 219 | printf("UPDATE %s\n", zName); |
| 220 | undo_save(zName); |
| 221 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); |
| 222 | }else if( idt>0 && idv>0 && file_size(zFullPath)<0 ){ |
| 223 | /* The file missing from the local check-out. Restore it to the |
| 224 | ** version that appears in the target. */ |
| 225 | printf("UPDATE %s\n", zName); |
| 226 | undo_save(zName); |
| 227 | if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0); |
| 228 | }else if( idt==0 && idv>0 ){ |
| 229 | if( ridv==0 ){ |
| 230 | /* Added in current checkout. Continue to hold the file as |
| 231 | ** as an addition */ |
| 232 | db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv); |
| 233 |
+23
-1
| --- src/vfile.c | ||
| +++ src/vfile.c | ||
| @@ -204,11 +204,16 @@ | ||
| 204 | 204 | |
| 205 | 205 | /* |
| 206 | 206 | ** Write all files from vid to the disk. Or if vid==0 and id!=0 |
| 207 | 207 | ** write just the specific file where VFILE.ID=id. |
| 208 | 208 | */ |
| 209 | -void vfile_to_disk(int vid, int id, int verbose){ | |
| 209 | +void vfile_to_disk( | |
| 210 | + int vid, /* vid to write to disk */ | |
| 211 | + int id, /* Write this one file, if not zero */ | |
| 212 | + int verbose, /* Output progress information */ | |
| 213 | + int promptFlag /* Prompt user to confirm overwrites */ | |
| 214 | +){ | |
| 210 | 215 | Stmt q; |
| 211 | 216 | Blob content; |
| 212 | 217 | int nRepos = strlen(g.zLocalRoot); |
| 213 | 218 | |
| 214 | 219 | if( vid>0 && id==0 ){ |
| @@ -228,10 +233,27 @@ | ||
| 228 | 233 | const char *zName; |
| 229 | 234 | |
| 230 | 235 | id = db_column_int(&q, 0); |
| 231 | 236 | zName = db_column_text(&q, 1); |
| 232 | 237 | rid = db_column_int(&q, 2); |
| 238 | + if( promptFlag ){ | |
| 239 | + if( file_size(zName)>=0 ){ | |
| 240 | + Blob ans; | |
| 241 | + char *zMsg; | |
| 242 | + char cReply; | |
| 243 | + zMsg = mprintf("overwrite %s (a=always/y/N)? ", zName); | |
| 244 | + prompt_user(zMsg, &ans); | |
| 245 | + free(zMsg); | |
| 246 | + cReply = blob_str(&ans)[0]; | |
| 247 | + blob_reset(&ans); | |
| 248 | + if( cReply=='a' || cReply=='A' ){ | |
| 249 | + promptFlag = 0; | |
| 250 | + cReply = 'y'; | |
| 251 | + } | |
| 252 | + if( cReply=='n' || cReply=='N' ) continue; | |
| 253 | + } | |
| 254 | + } | |
| 233 | 255 | content_get(rid, &content); |
| 234 | 256 | if( verbose ) printf("%s\n", &zName[nRepos]); |
| 235 | 257 | blob_write_to_file(&content, zName); |
| 236 | 258 | blob_reset(&content); |
| 237 | 259 | db_multi_exec("UPDATE vfile SET mtime=%lld WHERE id=%d", |
| 238 | 260 |
| --- src/vfile.c | |
| +++ src/vfile.c | |
| @@ -204,11 +204,16 @@ | |
| 204 | |
| 205 | /* |
| 206 | ** Write all files from vid to the disk. Or if vid==0 and id!=0 |
| 207 | ** write just the specific file where VFILE.ID=id. |
| 208 | */ |
| 209 | void vfile_to_disk(int vid, int id, int verbose){ |
| 210 | Stmt q; |
| 211 | Blob content; |
| 212 | int nRepos = strlen(g.zLocalRoot); |
| 213 | |
| 214 | if( vid>0 && id==0 ){ |
| @@ -228,10 +233,27 @@ | |
| 228 | const char *zName; |
| 229 | |
| 230 | id = db_column_int(&q, 0); |
| 231 | zName = db_column_text(&q, 1); |
| 232 | rid = db_column_int(&q, 2); |
| 233 | content_get(rid, &content); |
| 234 | if( verbose ) printf("%s\n", &zName[nRepos]); |
| 235 | blob_write_to_file(&content, zName); |
| 236 | blob_reset(&content); |
| 237 | db_multi_exec("UPDATE vfile SET mtime=%lld WHERE id=%d", |
| 238 |
| --- src/vfile.c | |
| +++ src/vfile.c | |
| @@ -204,11 +204,16 @@ | |
| 204 | |
| 205 | /* |
| 206 | ** Write all files from vid to the disk. Or if vid==0 and id!=0 |
| 207 | ** write just the specific file where VFILE.ID=id. |
| 208 | */ |
| 209 | void vfile_to_disk( |
| 210 | int vid, /* vid to write to disk */ |
| 211 | int id, /* Write this one file, if not zero */ |
| 212 | int verbose, /* Output progress information */ |
| 213 | int promptFlag /* Prompt user to confirm overwrites */ |
| 214 | ){ |
| 215 | Stmt q; |
| 216 | Blob content; |
| 217 | int nRepos = strlen(g.zLocalRoot); |
| 218 | |
| 219 | if( vid>0 && id==0 ){ |
| @@ -228,10 +233,27 @@ | |
| 233 | const char *zName; |
| 234 | |
| 235 | id = db_column_int(&q, 0); |
| 236 | zName = db_column_text(&q, 1); |
| 237 | rid = db_column_int(&q, 2); |
| 238 | if( promptFlag ){ |
| 239 | if( file_size(zName)>=0 ){ |
| 240 | Blob ans; |
| 241 | char *zMsg; |
| 242 | char cReply; |
| 243 | zMsg = mprintf("overwrite %s (a=always/y/N)? ", zName); |
| 244 | prompt_user(zMsg, &ans); |
| 245 | free(zMsg); |
| 246 | cReply = blob_str(&ans)[0]; |
| 247 | blob_reset(&ans); |
| 248 | if( cReply=='a' || cReply=='A' ){ |
| 249 | promptFlag = 0; |
| 250 | cReply = 'y'; |
| 251 | } |
| 252 | if( cReply=='n' || cReply=='N' ) continue; |
| 253 | } |
| 254 | } |
| 255 | content_get(rid, &content); |
| 256 | if( verbose ) printf("%s\n", &zName[nRepos]); |
| 257 | blob_write_to_file(&content, zName); |
| 258 | blob_reset(&content); |
| 259 | db_multi_exec("UPDATE vfile SET mtime=%lld WHERE id=%d", |
| 260 |