Fossil SCM
Record merge-info information for the "fossil update" command.
Commit
3a18c95df49f95a5ad726c671038daccc6eb99a5140825559a327c1f0ecb983c
Parent
0b5dfa9f6cacfba…
2 files changed
+1
-1
+28
+1
-1
| --- src/merge.c | ||
| +++ src/merge.c | ||
| @@ -202,11 +202,11 @@ | ||
| 202 | 202 | " WHERE pathname=%Q AND octet_length(content)=%d", |
| 203 | 203 | zFN, sz |
| 204 | 204 | ); |
| 205 | 205 | blob_zero(&v1); |
| 206 | 206 | if( db_step(&q2)==SQLITE_ROW ){ |
| 207 | - db_column_blob(&q, 0, &v1); | |
| 207 | + db_column_blob(&q2, 0, &v1); | |
| 208 | 208 | }else{ |
| 209 | 209 | mb.zV1 = "(local content missing)"; |
| 210 | 210 | } |
| 211 | 211 | db_finalize(&q2); |
| 212 | 212 | }else{ |
| 213 | 213 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -202,11 +202,11 @@ | |
| 202 | " WHERE pathname=%Q AND octet_length(content)=%d", |
| 203 | zFN, sz |
| 204 | ); |
| 205 | blob_zero(&v1); |
| 206 | if( db_step(&q2)==SQLITE_ROW ){ |
| 207 | db_column_blob(&q, 0, &v1); |
| 208 | }else{ |
| 209 | mb.zV1 = "(local content missing)"; |
| 210 | } |
| 211 | db_finalize(&q2); |
| 212 | }else{ |
| 213 |
| --- src/merge.c | |
| +++ src/merge.c | |
| @@ -202,11 +202,11 @@ | |
| 202 | " WHERE pathname=%Q AND octet_length(content)=%d", |
| 203 | zFN, sz |
| 204 | ); |
| 205 | blob_zero(&v1); |
| 206 | if( db_step(&q2)==SQLITE_ROW ){ |
| 207 | db_column_blob(&q2, 0, &v1); |
| 208 | }else{ |
| 209 | mb.zV1 = "(local content missing)"; |
| 210 | } |
| 211 | db_finalize(&q2); |
| 212 | }else{ |
| 213 |
+28
| --- src/update.c | ||
| +++ src/update.c | ||
| @@ -407,10 +407,11 @@ | ||
| 407 | 407 | " WHERE id=:idt" |
| 408 | 408 | ); |
| 409 | 409 | assert( g.zLocalRoot!=0 ); |
| 410 | 410 | assert( strlen(g.zLocalRoot)>0 ); |
| 411 | 411 | assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' ); |
| 412 | + merge_info_init(); | |
| 412 | 413 | while( db_step(&q)==SQLITE_ROW ){ |
| 413 | 414 | const char *zName = db_column_text(&q, 0); /* The filename from root */ |
| 414 | 415 | int idv = db_column_int(&q, 1); /* VFILE entry for current */ |
| 415 | 416 | int ridv = db_column_int(&q, 2); /* RecordID for current */ |
| 416 | 417 | int idt = db_column_int(&q, 3); /* VFILE entry for target */ |
| @@ -500,31 +501,41 @@ | ||
| 500 | 501 | } |
| 501 | 502 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){ |
| 502 | 503 | /* Merge the changes in the current tree into the target version */ |
| 503 | 504 | Blob r, t, v; |
| 504 | 505 | int rc; |
| 506 | + const char *zOp = "MERGE"; | |
| 507 | + i64 sz = 0; | |
| 508 | + int nc = 0; | |
| 509 | + const char *zErrMsg = 0; | |
| 510 | + | |
| 505 | 511 | if( nameChng ){ |
| 506 | 512 | fossil_print("MERGE %s -> %s\n", zName, zNewName); |
| 507 | 513 | }else{ |
| 508 | 514 | fossil_print("MERGE %s\n", zName); |
| 509 | 515 | } |
| 510 | 516 | if( islinkv || islinkt ){ |
| 511 | 517 | fossil_print("***** Cannot merge symlink %s\n", zNewName); |
| 518 | + zOp = "CONFLICT"; | |
| 512 | 519 | nConflict++; |
| 513 | 520 | }else{ |
| 514 | 521 | unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0; |
| 515 | 522 | if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES; |
| 516 | 523 | if( !dryRunFlag && !internalUpdate ) undo_save(zName); |
| 517 | 524 | content_get(ridt, &t); |
| 518 | 525 | content_get(ridv, &v); |
| 526 | + sz = file_size(zFullPath, ExtFILE); | |
| 519 | 527 | rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags); |
| 520 | 528 | if( rc>=0 ){ |
| 521 | 529 | if( !dryRunFlag ){ |
| 522 | 530 | blob_write_to_file(&r, zFullNewPath); |
| 523 | 531 | file_setexe(zFullNewPath, isexe); |
| 524 | 532 | } |
| 525 | 533 | if( rc>0 ){ |
| 534 | + nc = rc; | |
| 535 | + zOp = "CONFLICT"; | |
| 536 | + zErrMsg = "merge conflicts"; | |
| 526 | 537 | fossil_print("***** %d merge conflicts in %s\n", rc, zNewName); |
| 527 | 538 | nConflict++; |
| 528 | 539 | } |
| 529 | 540 | }else{ |
| 530 | 541 | if( !dryRunFlag ){ |
| @@ -543,12 +554,29 @@ | ||
| 543 | 554 | if( !dryRunFlag ){ |
| 544 | 555 | fossil_print(", original copy backed up locally"); |
| 545 | 556 | } |
| 546 | 557 | fossil_print("\n"); |
| 547 | 558 | nConflict++; |
| 559 | + zOp = "ERROR"; | |
| 560 | + zErrMsg = "cannot merge binary file"; | |
| 561 | + nc = 1; | |
| 548 | 562 | } |
| 549 | 563 | } |
| 564 | + db_multi_exec( | |
| 565 | + "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)" | |
| 566 | + "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)", | |
| 567 | + /* op */ zOp, | |
| 568 | + /* fnp */ zName, | |
| 569 | + /* ridp */ ridv, | |
| 570 | + /* fn */ zNewName, | |
| 571 | + /* sz */ sz, | |
| 572 | + /* fnm */ zName, | |
| 573 | + /* ridm */ ridt, | |
| 574 | + /* fnr */ zNewName, | |
| 575 | + /* nc */ nc, | |
| 576 | + /* msg */ zErrMsg | |
| 577 | + ); | |
| 550 | 578 | if( nameChng && !dryRunFlag ) file_delete(zFullPath); |
| 551 | 579 | blob_reset(&v); |
| 552 | 580 | blob_reset(&t); |
| 553 | 581 | blob_reset(&r); |
| 554 | 582 | }else{ |
| 555 | 583 |
| --- src/update.c | |
| +++ src/update.c | |
| @@ -407,10 +407,11 @@ | |
| 407 | " WHERE id=:idt" |
| 408 | ); |
| 409 | assert( g.zLocalRoot!=0 ); |
| 410 | assert( strlen(g.zLocalRoot)>0 ); |
| 411 | assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' ); |
| 412 | while( db_step(&q)==SQLITE_ROW ){ |
| 413 | const char *zName = db_column_text(&q, 0); /* The filename from root */ |
| 414 | int idv = db_column_int(&q, 1); /* VFILE entry for current */ |
| 415 | int ridv = db_column_int(&q, 2); /* RecordID for current */ |
| 416 | int idt = db_column_int(&q, 3); /* VFILE entry for target */ |
| @@ -500,31 +501,41 @@ | |
| 500 | } |
| 501 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){ |
| 502 | /* Merge the changes in the current tree into the target version */ |
| 503 | Blob r, t, v; |
| 504 | int rc; |
| 505 | if( nameChng ){ |
| 506 | fossil_print("MERGE %s -> %s\n", zName, zNewName); |
| 507 | }else{ |
| 508 | fossil_print("MERGE %s\n", zName); |
| 509 | } |
| 510 | if( islinkv || islinkt ){ |
| 511 | fossil_print("***** Cannot merge symlink %s\n", zNewName); |
| 512 | nConflict++; |
| 513 | }else{ |
| 514 | unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0; |
| 515 | if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES; |
| 516 | if( !dryRunFlag && !internalUpdate ) undo_save(zName); |
| 517 | content_get(ridt, &t); |
| 518 | content_get(ridv, &v); |
| 519 | rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags); |
| 520 | if( rc>=0 ){ |
| 521 | if( !dryRunFlag ){ |
| 522 | blob_write_to_file(&r, zFullNewPath); |
| 523 | file_setexe(zFullNewPath, isexe); |
| 524 | } |
| 525 | if( rc>0 ){ |
| 526 | fossil_print("***** %d merge conflicts in %s\n", rc, zNewName); |
| 527 | nConflict++; |
| 528 | } |
| 529 | }else{ |
| 530 | if( !dryRunFlag ){ |
| @@ -543,12 +554,29 @@ | |
| 543 | if( !dryRunFlag ){ |
| 544 | fossil_print(", original copy backed up locally"); |
| 545 | } |
| 546 | fossil_print("\n"); |
| 547 | nConflict++; |
| 548 | } |
| 549 | } |
| 550 | if( nameChng && !dryRunFlag ) file_delete(zFullPath); |
| 551 | blob_reset(&v); |
| 552 | blob_reset(&t); |
| 553 | blob_reset(&r); |
| 554 | }else{ |
| 555 |
| --- src/update.c | |
| +++ src/update.c | |
| @@ -407,10 +407,11 @@ | |
| 407 | " WHERE id=:idt" |
| 408 | ); |
| 409 | assert( g.zLocalRoot!=0 ); |
| 410 | assert( strlen(g.zLocalRoot)>0 ); |
| 411 | assert( g.zLocalRoot[strlen(g.zLocalRoot)-1]=='/' ); |
| 412 | merge_info_init(); |
| 413 | while( db_step(&q)==SQLITE_ROW ){ |
| 414 | const char *zName = db_column_text(&q, 0); /* The filename from root */ |
| 415 | int idv = db_column_int(&q, 1); /* VFILE entry for current */ |
| 416 | int ridv = db_column_int(&q, 2); /* RecordID for current */ |
| 417 | int idt = db_column_int(&q, 3); /* VFILE entry for target */ |
| @@ -500,31 +501,41 @@ | |
| 501 | } |
| 502 | }else if( idt>0 && idv>0 && ridt!=ridv && chnged ){ |
| 503 | /* Merge the changes in the current tree into the target version */ |
| 504 | Blob r, t, v; |
| 505 | int rc; |
| 506 | const char *zOp = "MERGE"; |
| 507 | i64 sz = 0; |
| 508 | int nc = 0; |
| 509 | const char *zErrMsg = 0; |
| 510 | |
| 511 | if( nameChng ){ |
| 512 | fossil_print("MERGE %s -> %s\n", zName, zNewName); |
| 513 | }else{ |
| 514 | fossil_print("MERGE %s\n", zName); |
| 515 | } |
| 516 | if( islinkv || islinkt ){ |
| 517 | fossil_print("***** Cannot merge symlink %s\n", zNewName); |
| 518 | zOp = "CONFLICT"; |
| 519 | nConflict++; |
| 520 | }else{ |
| 521 | unsigned mergeFlags = dryRunFlag ? MERGE_DRYRUN : 0; |
| 522 | if(keepMergeFlag!=0) mergeFlags |= MERGE_KEEP_FILES; |
| 523 | if( !dryRunFlag && !internalUpdate ) undo_save(zName); |
| 524 | content_get(ridt, &t); |
| 525 | content_get(ridv, &v); |
| 526 | sz = file_size(zFullPath, ExtFILE); |
| 527 | rc = merge_3way(&v, zFullPath, &t, &r, mergeFlags); |
| 528 | if( rc>=0 ){ |
| 529 | if( !dryRunFlag ){ |
| 530 | blob_write_to_file(&r, zFullNewPath); |
| 531 | file_setexe(zFullNewPath, isexe); |
| 532 | } |
| 533 | if( rc>0 ){ |
| 534 | nc = rc; |
| 535 | zOp = "CONFLICT"; |
| 536 | zErrMsg = "merge conflicts"; |
| 537 | fossil_print("***** %d merge conflicts in %s\n", rc, zNewName); |
| 538 | nConflict++; |
| 539 | } |
| 540 | }else{ |
| 541 | if( !dryRunFlag ){ |
| @@ -543,12 +554,29 @@ | |
| 554 | if( !dryRunFlag ){ |
| 555 | fossil_print(", original copy backed up locally"); |
| 556 | } |
| 557 | fossil_print("\n"); |
| 558 | nConflict++; |
| 559 | zOp = "ERROR"; |
| 560 | zErrMsg = "cannot merge binary file"; |
| 561 | nc = 1; |
| 562 | } |
| 563 | } |
| 564 | db_multi_exec( |
| 565 | "INSERT INTO mergestat(op,fnp,ridp,fn,ridv,sz,fnm,ridm,fnr,nc,msg)" |
| 566 | "VALUES(%Q,%Q,%d,%Q,NULL,%lld,%Q,%d,%Q,%d,%Q)", |
| 567 | /* op */ zOp, |
| 568 | /* fnp */ zName, |
| 569 | /* ridp */ ridv, |
| 570 | /* fn */ zNewName, |
| 571 | /* sz */ sz, |
| 572 | /* fnm */ zName, |
| 573 | /* ridm */ ridt, |
| 574 | /* fnr */ zNewName, |
| 575 | /* nc */ nc, |
| 576 | /* msg */ zErrMsg |
| 577 | ); |
| 578 | if( nameChng && !dryRunFlag ) file_delete(zFullPath); |
| 579 | blob_reset(&v); |
| 580 | blob_reset(&t); |
| 581 | blob_reset(&r); |
| 582 | }else{ |
| 583 |