Fossil SCM

Implement the --keep-merge-files option for the merge and update commands. Merge-conflict files are omitted without this option. The merge conflict files continue to exist for the stash command.

drh 2020-02-26 15:23 trunk merge
Commit d20ead10c34909d4ef289a347baabd2be0a8fe221a522dcbc4a0ed931013c63c
--- src/merge.c
+++ src/merge.c
@@ -224,10 +224,14 @@
224224
** -f|--force Force the merge even if it would be a no-op.
225225
**
226226
** --force-missing Force the merge even if there is missing content.
227227
**
228228
** --integrate Merged branch will be closed when committing.
229
+**
230
+** -K|--keep-merge-files On merge conflict, retain the temporary files
231
+** used for merging, named *-baseline, *-original,
232
+** and *-merge.
229233
**
230234
** -n|--dry-run If given, display instead of run actions
231235
**
232236
** -v|--verbose Show additional details of the merge
233237
*/
@@ -244,10 +248,11 @@
244248
int forceFlag; /* True if the --force or -f option is present */
245249
int forceMissingFlag; /* True if the --force-missing option is present */
246250
const char *zBinGlob; /* The value of --binary */
247251
const char *zPivot; /* The value of --baseline */
248252
int debugFlag; /* True if --debug is present */
253
+ int keepMergeFlag; /* True if --keep-merge-files is present */
249254
int nConflict = 0; /* Number of conflicts seen */
250255
int nOverwrite = 0; /* Number of unmanaged files overwritten */
251256
char vAncestor = 'p'; /* If P is an ancestor of V then 'p', else 'n' */
252257
Stmt q;
253258
@@ -275,10 +280,12 @@
275280
if( !dryRunFlag ){
276281
dryRunFlag = find_option("nochange",0,0)!=0; /* deprecated */
277282
}
278283
forceFlag = find_option("force","f",0)!=0;
279284
zPivot = find_option("baseline",0,1);
285
+ keepMergeFlag = find_option("keep-merge-files", "K",0)!=0;
286
+
280287
verify_all_options();
281288
db_must_be_within_tree();
282289
if( zBinGlob==0 ) zBinGlob = db_get("binary-glob",0);
283290
vid = db_lget_int("checkout", 0);
284291
if( vid==0 ){
@@ -665,10 +672,11 @@
665672
if( isBinary ){
666673
rc = -1;
667674
blob_zero(&r);
668675
}else{
669676
unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
677
+ if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
670678
rc = merge_3way(&p, zFullPath, &m, &r, mergeFlags);
671679
}
672680
if( rc>=0 ){
673681
if( !dryRunFlag ){
674682
blob_write_to_file(&r, zFullPath);
675683
--- src/merge.c
+++ src/merge.c
@@ -224,10 +224,14 @@
224 ** -f|--force Force the merge even if it would be a no-op.
225 **
226 ** --force-missing Force the merge even if there is missing content.
227 **
228 ** --integrate Merged branch will be closed when committing.
 
 
 
 
229 **
230 ** -n|--dry-run If given, display instead of run actions
231 **
232 ** -v|--verbose Show additional details of the merge
233 */
@@ -244,10 +248,11 @@
244 int forceFlag; /* True if the --force or -f option is present */
245 int forceMissingFlag; /* True if the --force-missing option is present */
246 const char *zBinGlob; /* The value of --binary */
247 const char *zPivot; /* The value of --baseline */
248 int debugFlag; /* True if --debug is present */
 
249 int nConflict = 0; /* Number of conflicts seen */
250 int nOverwrite = 0; /* Number of unmanaged files overwritten */
251 char vAncestor = 'p'; /* If P is an ancestor of V then 'p', else 'n' */
252 Stmt q;
253
@@ -275,10 +280,12 @@
275 if( !dryRunFlag ){
276 dryRunFlag = find_option("nochange",0,0)!=0; /* deprecated */
277 }
278 forceFlag = find_option("force","f",0)!=0;
279 zPivot = find_option("baseline",0,1);
 
 
280 verify_all_options();
281 db_must_be_within_tree();
282 if( zBinGlob==0 ) zBinGlob = db_get("binary-glob",0);
283 vid = db_lget_int("checkout", 0);
284 if( vid==0 ){
@@ -665,10 +672,11 @@
665 if( isBinary ){
666 rc = -1;
667 blob_zero(&r);
668 }else{
669 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
 
670 rc = merge_3way(&p, zFullPath, &m, &r, mergeFlags);
671 }
672 if( rc>=0 ){
673 if( !dryRunFlag ){
674 blob_write_to_file(&r, zFullPath);
675
--- src/merge.c
+++ src/merge.c
@@ -224,10 +224,14 @@
224 ** -f|--force Force the merge even if it would be a no-op.
225 **
226 ** --force-missing Force the merge even if there is missing content.
227 **
228 ** --integrate Merged branch will be closed when committing.
229 **
230 ** -K|--keep-merge-files On merge conflict, retain the temporary files
231 ** used for merging, named *-baseline, *-original,
232 ** and *-merge.
233 **
234 ** -n|--dry-run If given, display instead of run actions
235 **
236 ** -v|--verbose Show additional details of the merge
237 */
@@ -244,10 +248,11 @@
248 int forceFlag; /* True if the --force or -f option is present */
249 int forceMissingFlag; /* True if the --force-missing option is present */
250 const char *zBinGlob; /* The value of --binary */
251 const char *zPivot; /* The value of --baseline */
252 int debugFlag; /* True if --debug is present */
253 int keepMergeFlag; /* True if --keep-merge-files is present */
254 int nConflict = 0; /* Number of conflicts seen */
255 int nOverwrite = 0; /* Number of unmanaged files overwritten */
256 char vAncestor = 'p'; /* If P is an ancestor of V then 'p', else 'n' */
257 Stmt q;
258
@@ -275,10 +280,12 @@
280 if( !dryRunFlag ){
281 dryRunFlag = find_option("nochange",0,0)!=0; /* deprecated */
282 }
283 forceFlag = find_option("force","f",0)!=0;
284 zPivot = find_option("baseline",0,1);
285 keepMergeFlag = find_option("keep-merge-files", "K",0)!=0;
286
287 verify_all_options();
288 db_must_be_within_tree();
289 if( zBinGlob==0 ) zBinGlob = db_get("binary-glob",0);
290 vid = db_lget_int("checkout", 0);
291 if( vid==0 ){
@@ -665,10 +672,11 @@
672 if( isBinary ){
673 rc = -1;
674 blob_zero(&r);
675 }else{
676 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
677 if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
678 rc = merge_3way(&p, zFullPath, &m, &r, mergeFlags);
679 }
680 if( rc>=0 ){
681 if( !dryRunFlag ){
682 blob_write_to_file(&r, zFullPath);
683
+16 -8
--- src/merge3.c
+++ src/merge3.c
@@ -436,10 +436,16 @@
436436
#if INTERFACE
437437
/*
438438
** Flags to the 3-way merger
439439
*/
440440
#define MERGE_DRYRUN 0x0001
441
+/*
442
+** The MERGE_KEEP_FILES flag specifies that merge_3way() should retain
443
+** its temporary files on error. By default they are removed after the
444
+** merge, regardless of success or failure.
445
+*/
446
+#define MERGE_KEEP_FILES 0x0002
441447
#endif
442448
443449
444450
/*
445451
** This routine is a wrapper around blob_merge() with the following
@@ -465,14 +471,18 @@
465471
Blob *pOut, /* Output written here */
466472
unsigned mergeFlags /* Flags that control operation */
467473
){
468474
Blob v1; /* Content of zV1 */
469475
int rc; /* Return code of subroutines and this routine */
476
+ const char *zGMerge; /* Name of the gmerge command */
470477
471478
blob_read_from_file(&v1, zV1, ExtFILE);
472479
rc = blob_merge(pPivot, &v1, pV2, pOut);
473
- if( rc!=0 && (mergeFlags & MERGE_DRYRUN)==0 ){
480
+ zGMerge = rc<=0 ? 0 : db_get("gmerge-command", 0);
481
+ if( (mergeFlags & MERGE_DRYRUN)==0
482
+ && ((zGMerge!=0 && zGMerge[0]!=0)
483
+ || (rc!=0 && (mergeFlags & MERGE_KEEP_FILES)!=0)) ){
474484
char *zPivot; /* Name of the pivot file */
475485
char *zOrig; /* Name of the original content file */
476486
char *zOther; /* Name of the merge file */
477487
478488
zPivot = file_newname(zV1, "baseline", 1);
@@ -480,18 +490,14 @@
480490
zOrig = file_newname(zV1, "original", 1);
481491
blob_write_to_file(&v1, zOrig);
482492
zOther = file_newname(zV1, "merge", 1);
483493
blob_write_to_file(pV2, zOther);
484494
if( rc>0 ){
485
- const char *zGMerge; /* Name of the gmerge command */
486
-
487
- zGMerge = db_get("gmerge-command", 0);
488495
if( zGMerge && zGMerge[0] ){
489496
char *zOut; /* Temporary output file */
490497
char *zCmd; /* Command to invoke */
491498
const char *azSubst[8]; /* Strings to be substituted */
492
-
493499
zOut = file_newname(zV1, "output", 1);
494500
azSubst[0] = "%baseline"; azSubst[1] = zPivot;
495501
azSubst[2] = "%original"; azSubst[3] = zOrig;
496502
azSubst[4] = "%merge"; azSubst[5] = zOther;
497503
azSubst[6] = "%output"; azSubst[7] = zOut;
@@ -498,21 +504,23 @@
498504
zCmd = string_subst(zGMerge, 8, azSubst);
499505
printf("%s\n", zCmd); fflush(stdout);
500506
fossil_system(zCmd);
501507
if( file_size(zOut, RepoFILE)>=0 ){
502508
blob_read_from_file(pOut, zOut, ExtFILE);
503
- file_delete(zPivot);
504
- file_delete(zOrig);
505
- file_delete(zOther);
506509
file_delete(zOut);
507510
}
508511
fossil_free(zCmd);
509512
fossil_free(zOut);
510513
}
514
+ }
515
+ if( (mergeFlags & MERGE_KEEP_FILES)==0 ){
516
+ file_delete(zPivot);
517
+ file_delete(zOrig);
518
+ file_delete(zOther);
511519
}
512520
fossil_free(zPivot);
513521
fossil_free(zOrig);
514522
fossil_free(zOther);
515523
}
516524
blob_reset(&v1);
517525
return rc;
518526
}
519527
--- src/merge3.c
+++ src/merge3.c
@@ -436,10 +436,16 @@
436 #if INTERFACE
437 /*
438 ** Flags to the 3-way merger
439 */
440 #define MERGE_DRYRUN 0x0001
 
 
 
 
 
 
441 #endif
442
443
444 /*
445 ** This routine is a wrapper around blob_merge() with the following
@@ -465,14 +471,18 @@
465 Blob *pOut, /* Output written here */
466 unsigned mergeFlags /* Flags that control operation */
467 ){
468 Blob v1; /* Content of zV1 */
469 int rc; /* Return code of subroutines and this routine */
 
470
471 blob_read_from_file(&v1, zV1, ExtFILE);
472 rc = blob_merge(pPivot, &v1, pV2, pOut);
473 if( rc!=0 && (mergeFlags & MERGE_DRYRUN)==0 ){
 
 
 
474 char *zPivot; /* Name of the pivot file */
475 char *zOrig; /* Name of the original content file */
476 char *zOther; /* Name of the merge file */
477
478 zPivot = file_newname(zV1, "baseline", 1);
@@ -480,18 +490,14 @@
480 zOrig = file_newname(zV1, "original", 1);
481 blob_write_to_file(&v1, zOrig);
482 zOther = file_newname(zV1, "merge", 1);
483 blob_write_to_file(pV2, zOther);
484 if( rc>0 ){
485 const char *zGMerge; /* Name of the gmerge command */
486
487 zGMerge = db_get("gmerge-command", 0);
488 if( zGMerge && zGMerge[0] ){
489 char *zOut; /* Temporary output file */
490 char *zCmd; /* Command to invoke */
491 const char *azSubst[8]; /* Strings to be substituted */
492
493 zOut = file_newname(zV1, "output", 1);
494 azSubst[0] = "%baseline"; azSubst[1] = zPivot;
495 azSubst[2] = "%original"; azSubst[3] = zOrig;
496 azSubst[4] = "%merge"; azSubst[5] = zOther;
497 azSubst[6] = "%output"; azSubst[7] = zOut;
@@ -498,21 +504,23 @@
498 zCmd = string_subst(zGMerge, 8, azSubst);
499 printf("%s\n", zCmd); fflush(stdout);
500 fossil_system(zCmd);
501 if( file_size(zOut, RepoFILE)>=0 ){
502 blob_read_from_file(pOut, zOut, ExtFILE);
503 file_delete(zPivot);
504 file_delete(zOrig);
505 file_delete(zOther);
506 file_delete(zOut);
507 }
508 fossil_free(zCmd);
509 fossil_free(zOut);
510 }
 
 
 
 
 
511 }
512 fossil_free(zPivot);
513 fossil_free(zOrig);
514 fossil_free(zOther);
515 }
516 blob_reset(&v1);
517 return rc;
518 }
519
--- src/merge3.c
+++ src/merge3.c
@@ -436,10 +436,16 @@
436 #if INTERFACE
437 /*
438 ** Flags to the 3-way merger
439 */
440 #define MERGE_DRYRUN 0x0001
441 /*
442 ** The MERGE_KEEP_FILES flag specifies that merge_3way() should retain
443 ** its temporary files on error. By default they are removed after the
444 ** merge, regardless of success or failure.
445 */
446 #define MERGE_KEEP_FILES 0x0002
447 #endif
448
449
450 /*
451 ** This routine is a wrapper around blob_merge() with the following
@@ -465,14 +471,18 @@
471 Blob *pOut, /* Output written here */
472 unsigned mergeFlags /* Flags that control operation */
473 ){
474 Blob v1; /* Content of zV1 */
475 int rc; /* Return code of subroutines and this routine */
476 const char *zGMerge; /* Name of the gmerge command */
477
478 blob_read_from_file(&v1, zV1, ExtFILE);
479 rc = blob_merge(pPivot, &v1, pV2, pOut);
480 zGMerge = rc<=0 ? 0 : db_get("gmerge-command", 0);
481 if( (mergeFlags & MERGE_DRYRUN)==0
482 && ((zGMerge!=0 && zGMerge[0]!=0)
483 || (rc!=0 && (mergeFlags & MERGE_KEEP_FILES)!=0)) ){
484 char *zPivot; /* Name of the pivot file */
485 char *zOrig; /* Name of the original content file */
486 char *zOther; /* Name of the merge file */
487
488 zPivot = file_newname(zV1, "baseline", 1);
@@ -480,18 +490,14 @@
490 zOrig = file_newname(zV1, "original", 1);
491 blob_write_to_file(&v1, zOrig);
492 zOther = file_newname(zV1, "merge", 1);
493 blob_write_to_file(pV2, zOther);
494 if( rc>0 ){
 
 
 
495 if( zGMerge && zGMerge[0] ){
496 char *zOut; /* Temporary output file */
497 char *zCmd; /* Command to invoke */
498 const char *azSubst[8]; /* Strings to be substituted */
 
499 zOut = file_newname(zV1, "output", 1);
500 azSubst[0] = "%baseline"; azSubst[1] = zPivot;
501 azSubst[2] = "%original"; azSubst[3] = zOrig;
502 azSubst[4] = "%merge"; azSubst[5] = zOther;
503 azSubst[6] = "%output"; azSubst[7] = zOut;
@@ -498,21 +504,23 @@
504 zCmd = string_subst(zGMerge, 8, azSubst);
505 printf("%s\n", zCmd); fflush(stdout);
506 fossil_system(zCmd);
507 if( file_size(zOut, RepoFILE)>=0 ){
508 blob_read_from_file(pOut, zOut, ExtFILE);
 
 
 
509 file_delete(zOut);
510 }
511 fossil_free(zCmd);
512 fossil_free(zOut);
513 }
514 }
515 if( (mergeFlags & MERGE_KEEP_FILES)==0 ){
516 file_delete(zPivot);
517 file_delete(zOrig);
518 file_delete(zOther);
519 }
520 fossil_free(zPivot);
521 fossil_free(zOrig);
522 fossil_free(zOther);
523 }
524 blob_reset(&v1);
525 return rc;
526 }
527
+1 -1
--- src/stash.c
+++ src/stash.c
@@ -359,11 +359,11 @@
359359
if( isLink || isNewLink ){
360360
rc = -1;
361361
blob_zero(&b); /* because we reset it later */
362362
fossil_print("***** Cannot merge symlink %s\n", zNew);
363363
}else{
364
- rc = merge_3way(&a, zOPath, &b, &out, 0);
364
+ rc = merge_3way(&a, zOPath, &b, &out, MERGE_KEEP_FILES);
365365
blob_write_to_file(&out, zNPath);
366366
blob_reset(&out);
367367
file_setexe(zNPath, isExec);
368368
}
369369
if( rc ){
370370
--- src/stash.c
+++ src/stash.c
@@ -359,11 +359,11 @@
359 if( isLink || isNewLink ){
360 rc = -1;
361 blob_zero(&b); /* because we reset it later */
362 fossil_print("***** Cannot merge symlink %s\n", zNew);
363 }else{
364 rc = merge_3way(&a, zOPath, &b, &out, 0);
365 blob_write_to_file(&out, zNPath);
366 blob_reset(&out);
367 file_setexe(zNPath, isExec);
368 }
369 if( rc ){
370
--- src/stash.c
+++ src/stash.c
@@ -359,11 +359,11 @@
359 if( isLink || isNewLink ){
360 rc = -1;
361 blob_zero(&b); /* because we reset it later */
362 fossil_print("***** Cannot merge symlink %s\n", zNew);
363 }else{
364 rc = merge_3way(&a, zOPath, &b, &out, MERGE_KEEP_FILES);
365 blob_write_to_file(&out, zNPath);
366 blob_reset(&out);
367 file_setexe(zNPath, isExec);
368 }
369 if( rc ){
370
--- src/update.c
+++ src/update.c
@@ -103,10 +103,14 @@
103103
** or 0 (= no limit, resulting in a single line per entry).
104104
** --setmtime Set timestamps of all files to match their SCM-side
105105
** times (the timestamp of the last checkin which modified
106106
** them).
107107
**
108
+** -K|--keep-merge-files On merge conflict, retain the temporary files
109
+** used for merging, named *-baseline, *-original,
110
+** and *-merge.
111
+**
108112
** See also: revert
109113
*/
110114
void update_cmd(void){
111115
int vid; /* Current version */
112116
int tid=0; /* Target version - version we are changing to */
@@ -115,10 +119,11 @@
115119
int dryRunFlag; /* -n or --dry-run. Do a dry run */
116120
int verboseFlag; /* -v or --verbose. Output extra information */
117121
int forceMissingFlag; /* --force-missing. Continue if missing content */
118122
int debugFlag; /* --debug option */
119123
int setmtimeFlag; /* --setmtime. Set mtimes on files */
124
+ int keepMergeFlag; /* True if --keep-merge-files is present */
120125
int nChng; /* Number of file renames */
121126
int *aChng; /* Array of file renames */
122127
int i; /* Loop counter */
123128
int nConflict = 0; /* Number of merge conflicts */
124129
int nOverwrite = 0; /* Number of unmanaged files overwritten */
@@ -147,10 +152,11 @@
147152
}
148153
verboseFlag = find_option("verbose","v",0)!=0;
149154
forceMissingFlag = find_option("force-missing",0,0)!=0;
150155
debugFlag = find_option("debug",0,0)!=0;
151156
setmtimeFlag = find_option("setmtime",0,0)!=0;
157
+ keepMergeFlag = find_option("keep-merge-files", "K",0)!=0;
152158
153159
/* We should be done with options.. */
154160
verify_all_options();
155161
156162
db_must_be_within_tree();
@@ -490,10 +496,11 @@
490496
if( islinkv || islinkt ){
491497
fossil_print("***** Cannot merge symlink %s\n", zNewName);
492498
nConflict++;
493499
}else{
494500
unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
501
+ if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
495502
if( !dryRunFlag && !internalUpdate ) undo_save(zName);
496503
content_get(ridt, &t);
497504
content_get(ridv, &v);
498505
rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
499506
if( rc>=0 ){
500507
--- src/update.c
+++ src/update.c
@@ -103,10 +103,14 @@
103 ** or 0 (= no limit, resulting in a single line per entry).
104 ** --setmtime Set timestamps of all files to match their SCM-side
105 ** times (the timestamp of the last checkin which modified
106 ** them).
107 **
 
 
 
 
108 ** See also: revert
109 */
110 void update_cmd(void){
111 int vid; /* Current version */
112 int tid=0; /* Target version - version we are changing to */
@@ -115,10 +119,11 @@
115 int dryRunFlag; /* -n or --dry-run. Do a dry run */
116 int verboseFlag; /* -v or --verbose. Output extra information */
117 int forceMissingFlag; /* --force-missing. Continue if missing content */
118 int debugFlag; /* --debug option */
119 int setmtimeFlag; /* --setmtime. Set mtimes on files */
 
120 int nChng; /* Number of file renames */
121 int *aChng; /* Array of file renames */
122 int i; /* Loop counter */
123 int nConflict = 0; /* Number of merge conflicts */
124 int nOverwrite = 0; /* Number of unmanaged files overwritten */
@@ -147,10 +152,11 @@
147 }
148 verboseFlag = find_option("verbose","v",0)!=0;
149 forceMissingFlag = find_option("force-missing",0,0)!=0;
150 debugFlag = find_option("debug",0,0)!=0;
151 setmtimeFlag = find_option("setmtime",0,0)!=0;
 
152
153 /* We should be done with options.. */
154 verify_all_options();
155
156 db_must_be_within_tree();
@@ -490,10 +496,11 @@
490 if( islinkv || islinkt ){
491 fossil_print("***** Cannot merge symlink %s\n", zNewName);
492 nConflict++;
493 }else{
494 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
 
495 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
496 content_get(ridt, &t);
497 content_get(ridv, &v);
498 rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
499 if( rc>=0 ){
500
--- src/update.c
+++ src/update.c
@@ -103,10 +103,14 @@
103 ** or 0 (= no limit, resulting in a single line per entry).
104 ** --setmtime Set timestamps of all files to match their SCM-side
105 ** times (the timestamp of the last checkin which modified
106 ** them).
107 **
108 ** -K|--keep-merge-files On merge conflict, retain the temporary files
109 ** used for merging, named *-baseline, *-original,
110 ** and *-merge.
111 **
112 ** See also: revert
113 */
114 void update_cmd(void){
115 int vid; /* Current version */
116 int tid=0; /* Target version - version we are changing to */
@@ -115,10 +119,11 @@
119 int dryRunFlag; /* -n or --dry-run. Do a dry run */
120 int verboseFlag; /* -v or --verbose. Output extra information */
121 int forceMissingFlag; /* --force-missing. Continue if missing content */
122 int debugFlag; /* --debug option */
123 int setmtimeFlag; /* --setmtime. Set mtimes on files */
124 int keepMergeFlag; /* True if --keep-merge-files is present */
125 int nChng; /* Number of file renames */
126 int *aChng; /* Array of file renames */
127 int i; /* Loop counter */
128 int nConflict = 0; /* Number of merge conflicts */
129 int nOverwrite = 0; /* Number of unmanaged files overwritten */
@@ -147,10 +152,11 @@
152 }
153 verboseFlag = find_option("verbose","v",0)!=0;
154 forceMissingFlag = find_option("force-missing",0,0)!=0;
155 debugFlag = find_option("debug",0,0)!=0;
156 setmtimeFlag = find_option("setmtime",0,0)!=0;
157 keepMergeFlag = find_option("keep-merge-files", "K",0)!=0;
158
159 /* We should be done with options.. */
160 verify_all_options();
161
162 db_must_be_within_tree();
@@ -490,10 +496,11 @@
496 if( islinkv || islinkt ){
497 fossil_print("***** Cannot merge symlink %s\n", zNewName);
498 nConflict++;
499 }else{
500 unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0;
501 if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES;
502 if( !dryRunFlag && !internalUpdate ) undo_save(zName);
503 content_get(ridt, &t);
504 content_get(ridv, &v);
505 rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags);
506 if( rc>=0 ){
507
--- www/changes.wiki
+++ www/changes.wiki
@@ -21,10 +21,14 @@
2121
of the form "/doc/$CURRENT/..." the "$CURRENT" text is translated
2222
into the check-in hash for the document currently being viewed.
2323
* Proactive security: Fossil now assumes that the schema of every
2424
database it opens has been tampered with by an adversary and takes
2525
extra precautions to ensure that such tampering is harmless.
26
+ * Merge conflicts caused via the [/help?cmd=merge|merge] and
27
+ [/help?cmd=update|update] commands no longer leave temporary
28
+ files behind unless the new <tt>--keep-merge-file</tt> flag
29
+ is used.
2630
* Bug fix: the "fossil git export" command is now working on Windows
2731
* Bug fix: display Technote items on the timeline correctly
2832
* Bug fix: fix the capability summary matrix of the Security Audit
2933
page so that it does not add "anonymous" capabilities to the
3034
"nobody" user.
3135
--- www/changes.wiki
+++ www/changes.wiki
@@ -21,10 +21,14 @@
21 of the form "/doc/$CURRENT/..." the "$CURRENT" text is translated
22 into the check-in hash for the document currently being viewed.
23 * Proactive security: Fossil now assumes that the schema of every
24 database it opens has been tampered with by an adversary and takes
25 extra precautions to ensure that such tampering is harmless.
 
 
 
 
26 * Bug fix: the "fossil git export" command is now working on Windows
27 * Bug fix: display Technote items on the timeline correctly
28 * Bug fix: fix the capability summary matrix of the Security Audit
29 page so that it does not add "anonymous" capabilities to the
30 "nobody" user.
31
--- www/changes.wiki
+++ www/changes.wiki
@@ -21,10 +21,14 @@
21 of the form "/doc/$CURRENT/..." the "$CURRENT" text is translated
22 into the check-in hash for the document currently being viewed.
23 * Proactive security: Fossil now assumes that the schema of every
24 database it opens has been tampered with by an adversary and takes
25 extra precautions to ensure that such tampering is harmless.
26 * Merge conflicts caused via the [/help?cmd=merge|merge] and
27 [/help?cmd=update|update] commands no longer leave temporary
28 files behind unless the new <tt>--keep-merge-file</tt> flag
29 is used.
30 * Bug fix: the "fossil git export" command is now working on Windows
31 * Bug fix: display Technote items on the timeline correctly
32 * Bug fix: fix the capability summary matrix of the Security Audit
33 page so that it does not add "anonymous" capabilities to the
34 "nobody" user.
35

Keyboard Shortcuts

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