@@ -331,23 +331,61 @@
331 331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&v2);
332 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&merged);
333 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
334 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
335 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This routine is a wrapper around blob_merge() with enhancements:
336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aSubst is an array of string pairs. The first element of each pair is
337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a string that begins with %. The second element is a replacement for that
338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** string.
339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine makes a copy of zInput into memory obtained from malloc and
341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** performance all applicable substitutions on that string.
342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *string_subst(const char *zInput, int nSubst, const char **azSubst){
344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Blob x;
345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, j;
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&x);
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( zInput[0] ){
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; zInput[i] && zInput[i]!='%'; i++){}
349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i>0 ){
350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&x, zInput, i);
351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zInput += i;
352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zInput[i]==0 ) break;
354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<nSubst; j+=2){
355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = strlen(azSubst[j]);
356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( memcmp(zInput, azSubst[j], n)==0 ){
357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&x, azSubst[j+1], -1);
358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zInput += n;
359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( j>=nSubst ){
363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(&x, "%", 1);
364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zInput++;
365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return blob_str(&x);
368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine is a wrapper around blob_merge() with the following
373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** enhancements:
337 374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
338 375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (1) If the merge-command is defined, then use the external merging
339 376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** program specified instead of the built-in blob-merge to do the
340 377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** merging. Panic if the external merger fails.
378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ** Not currently implemented **
341 379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
342 380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (2) If gmerge-command is defined and there are merge conflicts in
343 381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** blob_merge() then invoke the external graphical merger to resolve
344 382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the conflicts.
345 383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Otherwise, the interface and actions are the same as for blob_merge().
347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The enhancements are planned - they are not yet implemented.
384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (3) If a merge conflict occurs and gmerge-command is not defined,
385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then write the pivot, original, and merge-in files to the
386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** filesystem.
349 387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
350 388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int merge_3way(
351 389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pPivot, /* Common ancestor (older) */
352 390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zV1, /* Name of file for version merging into (mine) */
353 391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob *pV2, /* Version merging from (yours) */
@@ -356,8 +394,43 @@
356 394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob v1; /* Content of zV1 */
357 395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return code of subroutines and this routine */
358 396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
359 397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_read_from_file(&v1, zV1);
360 398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = blob_merge(pPivot, &v1, pV2, pOut);
399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc>0 ){
400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPivot; /* Name of the pivot file */
401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zOrig; /* Name of the original content file */
402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zOther; /* Name of the merge file */
403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zGMerge; /* Name of the gmerge command */
404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPivot = file_newname(zV1, "baseline", 1);
406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(pPivot, zPivot);
407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOrig = file_newname(zV1, "original", 1);
408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&v1, zOrig);
409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOther = file_newname(zV1, "merge", 1);
410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(pV2, zOther);
411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zGMerge = db_get("gmerge-command", 0);
412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zGMerge && zGMerge[0] ){
413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zOut; /* Temporary output file */
414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zCmd; /* Command to invoke */
415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *azSubst[8]; /* Strings to be substituted */
416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zOut = file_newname(zV1, "output", 1);
418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azSubst[0] = "%baseline"; azSubst[1] = zPivot;
419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azSubst[2] = "%original"; azSubst[3] = zOrig;
420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azSubst[4] = "%merge"; azSubst[5] = zOther;
421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ azSubst[6] = "%output"; azSubst[7] = zOut;
422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCmd = string_subst(zGMerge, 8, azSubst);
423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("%s\n", zCmd); fflush(stdout);
424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_system(zCmd);
425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( file_size(zOut)>=0 ) blob_read_from_file(pOut, zOut);
426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unlink(zOut);
427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zCmd);
428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zOut);
429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zPivot);
431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zOrig);
432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_free(zOther);
433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
361 434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
blob_reset(&v1);
362 435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
363 436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
364 437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!