Fossil SCM

Prompt the user for permission to overwrite files on "fossil open". Ticket [17389900b2e5bd816]

drh 2010-06-23 13:30 trunk
Commit d778ffea81e7f76b71833cb41f4866c511fafb2c
+3 -1
--- src/checkout.c
+++ src/checkout.c
@@ -159,18 +159,20 @@
159159
void checkout_cmd(void){
160160
int forceFlag; /* Force checkout even if edits exist */
161161
int keepFlag; /* Do not change any files on disk */
162162
int latestFlag; /* Checkout the latest version */
163163
char *zVers; /* Version to checkout */
164
+ int promptFlag; /* True to prompt before overwriting */
164165
int vid, prior;
165166
Blob cksum1, cksum1b, cksum2;
166167
167168
db_must_be_within_tree();
168169
db_begin_transaction();
169170
forceFlag = find_option("force","f",0)!=0;
170171
keepFlag = find_option("keep",0,0)!=0;
171172
latestFlag = find_option("latest",0,0)!=0;
173
+ promptFlag = find_option("prompt",0,0)!=0; /* Prompt user before overwrite */
172174
if( (latestFlag!=0 && g.argc!=2) || (latestFlag==0 && g.argc!=3) ){
173175
usage("VERSION|--latest ?--force? ?--keep?");
174176
}
175177
if( !forceFlag && unsaved_changes()==1 ){
176178
fossil_fatal("there are unsaved changes in the current checkout");
@@ -204,11 +206,11 @@
204206
if( !keepFlag ){
205207
uncheckout(prior);
206208
}
207209
db_multi_exec("DELETE FROM vfile WHERE vid!=%d", vid);
208210
if( !keepFlag ){
209
- vfile_to_disk(vid, 0, 1);
211
+ vfile_to_disk(vid, 0, 1, promptFlag);
210212
}
211213
manifest_to_disk(vid);
212214
db_lset_int("checkout", vid);
213215
undo_reset();
214216
db_multi_exec("DELETE FROM vmerge");
215217
--- 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
+2 -2
--- src/db.c
+++ src/db.c
@@ -1410,11 +1410,11 @@
14101410
*/
14111411
void cmd_open(void){
14121412
Blob path;
14131413
int vid;
14141414
int keepFlag;
1415
- static char *azNewArgv[] = { 0, "checkout", "--latest", 0, 0, 0 };
1415
+ static char *azNewArgv[] = { 0, "checkout", "--prompt", "--latest", 0, 0 };
14161416
url_proxy_options();
14171417
keepFlag = find_option("keep",0,0)!=0;
14181418
if( g.argc!=3 && g.argc!=4 ){
14191419
usage("REPOSITORY-FILENAME ?VERSION?");
14201420
}
@@ -1435,11 +1435,11 @@
14351435
char **oldArgv = g.argv;
14361436
int oldArgc = g.argc;
14371437
db_lset_int("checkout", vid);
14381438
azNewArgv[0] = g.argv[0];
14391439
g.argv = azNewArgv;
1440
- g.argc = 3;
1440
+ g.argc = 4;
14411441
if( oldArgc==4 ){
14421442
azNewArgv[g.argc-1] = oldArgv[3];
14431443
}
14441444
if( keepFlag ){
14451445
azNewArgv[g.argc++] = "--keep";
14461446
--- 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 @@
197197
prompt = mprintf("\nUnknown SSL certificate:\n\n%s\n\n%s\n"
198198
"Accept certificate [a=always/y/N]? ", desc, warning);
199199
BIO_free(mem);
200200
201201
Blob ans;
202
- blob_zero(&ans);
203202
prompt_user(prompt, &ans);
204203
free(prompt);
205204
if( blob_str(&ans)[0]!='y' && blob_str(&ans)[0]!='a' ) {
206205
X509_free(cert);
207206
ssl_set_errmsg("SSL certificate declined");
@@ -209,10 +208,11 @@
209208
return 1;
210209
}
211210
if( blob_str(&ans)[0]=='a' ) {
212211
ssl_save_certificate(cert);
213212
}
213
+ blob_reset(&ans);
214214
}
215215
X509_free(cert);
216216
return 0;
217217
}
218218
219219
--- 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 @@
211211
idv = db_last_insert_rowid();
212212
db_multi_exec("UPDATE fv SET idv=%d WHERE rowid=%d", idv, rowid);
213213
zName = db_column_text(&q, 2);
214214
printf("ADDED %s\n", zName);
215215
undo_save(zName);
216
- vfile_to_disk(0, idm, 0);
216
+ vfile_to_disk(0, idm, 0, 0);
217217
}
218218
db_finalize(&q);
219219
220220
/*
221221
** Find files that have changed from pid->mid but not pid->vid.
@@ -234,11 +234,11 @@
234234
printf("UPDATE %s\n", zName);
235235
undo_save(zName);
236236
db_multi_exec(
237237
"UPDATE vfile SET mrid=%d, chnged=2 WHERE id=%d", ridm, idv
238238
);
239
- vfile_to_disk(0, idv, 0);
239
+ vfile_to_disk(0, idv, 0, 0);
240240
free(zName);
241241
}
242242
db_finalize(&q);
243243
244244
/*
245245
--- 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 @@
211211
printf("CONFLICT %s\n", zName);
212212
}else if( idt>0 && idv==0 ){
213213
/* File added in the target. */
214214
printf("ADD %s\n", zName);
215215
undo_save(zName);
216
- if( !nochangeFlag ) vfile_to_disk(0, idt, 0);
216
+ if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0);
217217
}else if( idt>0 && idv>0 && ridt!=ridv && chnged==0 ){
218218
/* The file is unedited. Change it to the target version */
219219
printf("UPDATE %s\n", zName);
220220
undo_save(zName);
221
- if( !nochangeFlag ) vfile_to_disk(0, idt, 0);
221
+ if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0);
222222
}else if( idt>0 && idv>0 && file_size(zFullPath)<0 ){
223223
/* The file missing from the local check-out. Restore it to the
224224
** version that appears in the target. */
225225
printf("UPDATE %s\n", zName);
226226
undo_save(zName);
227
- if( !nochangeFlag ) vfile_to_disk(0, idt, 0);
227
+ if( !nochangeFlag ) vfile_to_disk(0, idt, 0, 0);
228228
}else if( idt==0 && idv>0 ){
229229
if( ridv==0 ){
230230
/* Added in current checkout. Continue to hold the file as
231231
** as an addition */
232232
db_multi_exec("UPDATE vfile SET vid=%d WHERE id=%d", tid, idv);
233233
--- 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 @@
204204
205205
/*
206206
** Write all files from vid to the disk. Or if vid==0 and id!=0
207207
** write just the specific file where VFILE.ID=id.
208208
*/
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
+){
210215
Stmt q;
211216
Blob content;
212217
int nRepos = strlen(g.zLocalRoot);
213218
214219
if( vid>0 && id==0 ){
@@ -228,10 +233,27 @@
228233
const char *zName;
229234
230235
id = db_column_int(&q, 0);
231236
zName = db_column_text(&q, 1);
232237
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
+ }
233255
content_get(rid, &content);
234256
if( verbose ) printf("%s\n", &zName[nRepos]);
235257
blob_write_to_file(&content, zName);
236258
blob_reset(&content);
237259
db_multi_exec("UPDATE vfile SET mtime=%lld WHERE id=%d",
238260
--- 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

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button