Fossil SCM

Enhanced debugging output for the "fossil merge" command when using the (deliberately undocumented) --debug option.

drh 2021-04-15 13:21 trunk
Commit 32778cc06121812053e286e8a0c5b02f8d9ff413745404bb2d8eb5c204fdccd1
1 file changed +63 -41
+63 -41
--- src/merge.c
+++ src/merge.c
@@ -174,10 +174,40 @@
174174
"INSERT OR IGNORE INTO vmerge(id,merge,mhash)"
175175
"VALUES(%d,%d,(SELECT uuid FROM blob WHERE rid=%d))",
176176
id, rid, rid
177177
);
178178
}
179
+
180
+/*
181
+** Print the contents of the "fv" table on standard output, for debugging
182
+** purposes.
183
+*/
184
+static void debug_fv_dump(void){
185
+ Stmt q;
186
+ db_prepare(&q,
187
+ "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, "
188
+ " isexe, islinkv, islinkm, fnn FROM fv"
189
+ );
190
+ while( db_step(&q)==SQLITE_ROW ){
191
+ fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d "
192
+ " islinkv=%d islinkm=%d\n",
193
+ db_column_int(&q, 0),
194
+ db_column_int(&q, 5),
195
+ db_column_int(&q, 6),
196
+ db_column_int(&q, 7),
197
+ db_column_int(&q, 4),
198
+ db_column_int(&q, 8),
199
+ db_column_int(&q, 9),
200
+ db_column_int(&q, 10));
201
+ fossil_print(" fn = [%s]\n", db_column_text(&q, 1));
202
+ fossil_print(" fnp = [%s]\n", db_column_text(&q, 2));
203
+ fossil_print(" fnm = [%s]\n", db_column_text(&q, 3));
204
+ fossil_print(" fnn = [%s]\n", db_column_text(&q, 11));
205
+ }
206
+ db_finalize(&q);
207
+}
208
+
179209
180210
/*
181211
** COMMAND: merge
182212
**
183213
** Usage: %fossil merge ?OPTIONS? ?VERSION?
@@ -441,41 +471,41 @@
441471
) ? 'p' : 'n';
442472
}
443473
if( debugFlag ){
444474
char *z;
445475
z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nid);
446
- fossil_print("N=%d %z\n", nid, z);
476
+ fossil_print("N=%-4d %z (file rename pivot)\n", nid, z);
447477
z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", pid);
448
- fossil_print("P=%d %z\n", pid, z);
478
+ fossil_print("P=%-4d %z (file content pivot)\n", pid, z);
449479
z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
450
- fossil_print("M=%d %z\n", mid, z);
480
+ fossil_print("M=%-4d %z (merged-in version)\n", mid, z);
451481
z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
452
- fossil_print("V=%d %z\n", vid, z);
482
+ fossil_print("V=%-4d %z (current version)\n", vid, z);
453483
}
454484
455485
/*
456486
** The vfile.pathname field is used to match files against each other. The
457487
** FV table contains one row for each each unique filename in
458488
** in the current checkout, the pivot, and the version being merged.
459489
*/
460490
db_multi_exec(
461491
"DROP TABLE IF EXISTS fv;"
462
- "CREATE TEMP TABLE fv("
463
- " fn TEXT UNIQUE %s," /* The filename */
464
- " idv INTEGER DEFAULT 0," /* VFILE entry for current version */
465
- " idp INTEGER DEFAULT 0," /* VFILE entry for the pivot */
466
- " idm INTEGER DEFAULT 0," /* VFILE entry for version merging in */
467
- " chnged BOOLEAN," /* True if current version has been edited */
468
- " ridv INTEGER DEFAULT 0," /* Record ID for current version */
469
- " ridp INTEGER DEFAULT 0," /* Record ID for pivot */
470
- " ridm INTEGER DEFAULT 0," /* Record ID for merge */
471
- " isexe BOOLEAN," /* Execute permission enabled */
472
- " fnp TEXT UNIQUE %s," /* The filename in the pivot */
473
- " fnm TEXT UNIQUE %s," /* The filename in the merged version */
474
- " fnn TEXT UNIQUE %s," /* The filename in the name pivot */
475
- " islinkv BOOLEAN," /* True if current version is a symlink */
476
- " islinkm BOOLEAN" /* True if merged version in is a symlink */
492
+ "CREATE TEMP TABLE fv(\n"
493
+ " fn TEXT UNIQUE %s,\n" /* The filename */
494
+ " idv INTEGER DEFAULT 0,\n" /* VFILE entry for current version */
495
+ " idp INTEGER DEFAULT 0,\n" /* VFILE entry for the pivot */
496
+ " idm INTEGER DEFAULT 0,\n" /* VFILE entry for version merging in */
497
+ " chnged BOOLEAN,\n" /* True if current version has been edited */
498
+ " ridv INTEGER DEFAULT 0,\n" /* Record ID for current version */
499
+ " ridp INTEGER DEFAULT 0,\n" /* Record ID for pivot */
500
+ " ridm INTEGER DEFAULT 0,\n" /* Record ID for merge */
501
+ " isexe BOOLEAN,\n" /* Execute permission enabled */
502
+ " fnp TEXT UNIQUE %s,\n" /* The filename in the pivot */
503
+ " fnm TEXT UNIQUE %s,\n" /* The filename in the merged version */
504
+ " fnn TEXT UNIQUE %s,\n" /* The filename in the name pivot */
505
+ " islinkv BOOLEAN,\n" /* True if current version is a symlink */
506
+ " islinkm BOOLEAN\n" /* True if merged version in is a symlink */
477507
");",
478508
filename_collation(), filename_collation(), filename_collation(),
479509
filename_collation()
480510
);
481511
@@ -483,10 +513,14 @@
483513
** Compute name changes from N to V, P, and M
484514
*/
485515
add_renames("fn", vid, nid, 0, debugFlag ? "N->V" : 0);
486516
add_renames("fnp", pid, nid, 0, debugFlag ? "N->P" : 0);
487517
add_renames("fnm", mid, nid, backoutFlag, debugFlag ? "N->M" : 0);
518
+ if( debugFlag ){
519
+ fossil_print("******** FV after name change search *******\n");
520
+ debug_fv_dump();
521
+ }
488522
489523
/*
490524
** Add files found in V
491525
*/
492526
db_multi_exec(
@@ -497,10 +531,14 @@
497531
" LEFT JOIN fv ON fn=coalesce(origname,pathname)"
498532
" AND rid>0 AND vf.chnged NOT IN (3,5)"
499533
" WHERE vid=%d;",
500534
vAncestor, vid
501535
);
536
+ if( debugFlag ){
537
+ fossil_print("******** FV after adding files in current version *******\n");
538
+ debug_fv_dump();
539
+ }
502540
503541
/*
504542
** Add files found in P
505543
*/
506544
db_multi_exec(
@@ -519,10 +557,14 @@
519557
"UPDATE OR IGNORE fv SET fnm=fnp WHERE fnm IS NULL;"
520558
"INSERT OR IGNORE INTO fv(fnm)"
521559
" SELECT pathname FROM vfile WHERE vid=%d;",
522560
mid
523561
);
562
+ if( debugFlag ){
563
+ fossil_print("******** FV after adding pivot and merge-in files *******\n");
564
+ debug_fv_dump();
565
+ }
524566
525567
/*
526568
** Compute the file version ids for P and M
527569
*/
528570
if( pid==vid ){
@@ -545,33 +587,13 @@
545587
" WHERE vid=%d AND fnm=pathname),0),"
546588
" isexe=coalesce((SELECT isexe FROM vfile WHERE vid=%d AND fnm=pathname),"
547589
" isexe)",
548590
mid, mid, mid, mid
549591
);
550
-
551592
if( debugFlag ){
552
- db_prepare(&q,
553
- "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, "
554
- " isexe, islinkv, islinkm, fnn FROM fv"
555
- );
556
- while( db_step(&q)==SQLITE_ROW ){
557
- fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d "
558
- " islinkv=%d islinkm=%d\n",
559
- db_column_int(&q, 0),
560
- db_column_int(&q, 5),
561
- db_column_int(&q, 6),
562
- db_column_int(&q, 7),
563
- db_column_int(&q, 4),
564
- db_column_int(&q, 8),
565
- db_column_int(&q, 9),
566
- db_column_int(&q, 10));
567
- fossil_print(" fn = [%s]\n", db_column_text(&q, 1));
568
- fossil_print(" fnp = [%s]\n", db_column_text(&q, 2));
569
- fossil_print(" fnm = [%s]\n", db_column_text(&q, 3));
570
- fossil_print(" fnn = [%s]\n", db_column_text(&q, 11));
571
- }
572
- db_finalize(&q);
593
+ fossil_print("******** FV Final *******\n");
594
+ debug_fv_dump();
573595
}
574596
575597
/*
576598
** Update the execute bit on files where it's changed from P->M but not P->V
577599
*/
578600
--- src/merge.c
+++ src/merge.c
@@ -174,10 +174,40 @@
174 "INSERT OR IGNORE INTO vmerge(id,merge,mhash)"
175 "VALUES(%d,%d,(SELECT uuid FROM blob WHERE rid=%d))",
176 id, rid, rid
177 );
178 }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
180 /*
181 ** COMMAND: merge
182 **
183 ** Usage: %fossil merge ?OPTIONS? ?VERSION?
@@ -441,41 +471,41 @@
441 ) ? 'p' : 'n';
442 }
443 if( debugFlag ){
444 char *z;
445 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nid);
446 fossil_print("N=%d %z\n", nid, z);
447 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", pid);
448 fossil_print("P=%d %z\n", pid, z);
449 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
450 fossil_print("M=%d %z\n", mid, z);
451 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
452 fossil_print("V=%d %z\n", vid, z);
453 }
454
455 /*
456 ** The vfile.pathname field is used to match files against each other. The
457 ** FV table contains one row for each each unique filename in
458 ** in the current checkout, the pivot, and the version being merged.
459 */
460 db_multi_exec(
461 "DROP TABLE IF EXISTS fv;"
462 "CREATE TEMP TABLE fv("
463 " fn TEXT UNIQUE %s," /* The filename */
464 " idv INTEGER DEFAULT 0," /* VFILE entry for current version */
465 " idp INTEGER DEFAULT 0," /* VFILE entry for the pivot */
466 " idm INTEGER DEFAULT 0," /* VFILE entry for version merging in */
467 " chnged BOOLEAN," /* True if current version has been edited */
468 " ridv INTEGER DEFAULT 0," /* Record ID for current version */
469 " ridp INTEGER DEFAULT 0," /* Record ID for pivot */
470 " ridm INTEGER DEFAULT 0," /* Record ID for merge */
471 " isexe BOOLEAN," /* Execute permission enabled */
472 " fnp TEXT UNIQUE %s," /* The filename in the pivot */
473 " fnm TEXT UNIQUE %s," /* The filename in the merged version */
474 " fnn TEXT UNIQUE %s," /* The filename in the name pivot */
475 " islinkv BOOLEAN," /* True if current version is a symlink */
476 " islinkm BOOLEAN" /* True if merged version in is a symlink */
477 ");",
478 filename_collation(), filename_collation(), filename_collation(),
479 filename_collation()
480 );
481
@@ -483,10 +513,14 @@
483 ** Compute name changes from N to V, P, and M
484 */
485 add_renames("fn", vid, nid, 0, debugFlag ? "N->V" : 0);
486 add_renames("fnp", pid, nid, 0, debugFlag ? "N->P" : 0);
487 add_renames("fnm", mid, nid, backoutFlag, debugFlag ? "N->M" : 0);
 
 
 
 
488
489 /*
490 ** Add files found in V
491 */
492 db_multi_exec(
@@ -497,10 +531,14 @@
497 " LEFT JOIN fv ON fn=coalesce(origname,pathname)"
498 " AND rid>0 AND vf.chnged NOT IN (3,5)"
499 " WHERE vid=%d;",
500 vAncestor, vid
501 );
 
 
 
 
502
503 /*
504 ** Add files found in P
505 */
506 db_multi_exec(
@@ -519,10 +557,14 @@
519 "UPDATE OR IGNORE fv SET fnm=fnp WHERE fnm IS NULL;"
520 "INSERT OR IGNORE INTO fv(fnm)"
521 " SELECT pathname FROM vfile WHERE vid=%d;",
522 mid
523 );
 
 
 
 
524
525 /*
526 ** Compute the file version ids for P and M
527 */
528 if( pid==vid ){
@@ -545,33 +587,13 @@
545 " WHERE vid=%d AND fnm=pathname),0),"
546 " isexe=coalesce((SELECT isexe FROM vfile WHERE vid=%d AND fnm=pathname),"
547 " isexe)",
548 mid, mid, mid, mid
549 );
550
551 if( debugFlag ){
552 db_prepare(&q,
553 "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, "
554 " isexe, islinkv, islinkm, fnn FROM fv"
555 );
556 while( db_step(&q)==SQLITE_ROW ){
557 fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d "
558 " islinkv=%d islinkm=%d\n",
559 db_column_int(&q, 0),
560 db_column_int(&q, 5),
561 db_column_int(&q, 6),
562 db_column_int(&q, 7),
563 db_column_int(&q, 4),
564 db_column_int(&q, 8),
565 db_column_int(&q, 9),
566 db_column_int(&q, 10));
567 fossil_print(" fn = [%s]\n", db_column_text(&q, 1));
568 fossil_print(" fnp = [%s]\n", db_column_text(&q, 2));
569 fossil_print(" fnm = [%s]\n", db_column_text(&q, 3));
570 fossil_print(" fnn = [%s]\n", db_column_text(&q, 11));
571 }
572 db_finalize(&q);
573 }
574
575 /*
576 ** Update the execute bit on files where it's changed from P->M but not P->V
577 */
578
--- src/merge.c
+++ src/merge.c
@@ -174,10 +174,40 @@
174 "INSERT OR IGNORE INTO vmerge(id,merge,mhash)"
175 "VALUES(%d,%d,(SELECT uuid FROM blob WHERE rid=%d))",
176 id, rid, rid
177 );
178 }
179
180 /*
181 ** Print the contents of the "fv" table on standard output, for debugging
182 ** purposes.
183 */
184 static void debug_fv_dump(void){
185 Stmt q;
186 db_prepare(&q,
187 "SELECT rowid, fn, fnp, fnm, chnged, ridv, ridp, ridm, "
188 " isexe, islinkv, islinkm, fnn FROM fv"
189 );
190 while( db_step(&q)==SQLITE_ROW ){
191 fossil_print("%3d: ridv=%-4d ridp=%-4d ridm=%-4d chnged=%d isexe=%d "
192 " islinkv=%d islinkm=%d\n",
193 db_column_int(&q, 0),
194 db_column_int(&q, 5),
195 db_column_int(&q, 6),
196 db_column_int(&q, 7),
197 db_column_int(&q, 4),
198 db_column_int(&q, 8),
199 db_column_int(&q, 9),
200 db_column_int(&q, 10));
201 fossil_print(" fn = [%s]\n", db_column_text(&q, 1));
202 fossil_print(" fnp = [%s]\n", db_column_text(&q, 2));
203 fossil_print(" fnm = [%s]\n", db_column_text(&q, 3));
204 fossil_print(" fnn = [%s]\n", db_column_text(&q, 11));
205 }
206 db_finalize(&q);
207 }
208
209
210 /*
211 ** COMMAND: merge
212 **
213 ** Usage: %fossil merge ?OPTIONS? ?VERSION?
@@ -441,41 +471,41 @@
471 ) ? 'p' : 'n';
472 }
473 if( debugFlag ){
474 char *z;
475 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", nid);
476 fossil_print("N=%-4d %z (file rename pivot)\n", nid, z);
477 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", pid);
478 fossil_print("P=%-4d %z (file content pivot)\n", pid, z);
479 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", mid);
480 fossil_print("M=%-4d %z (merged-in version)\n", mid, z);
481 z = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", vid);
482 fossil_print("V=%-4d %z (current version)\n", vid, z);
483 }
484
485 /*
486 ** The vfile.pathname field is used to match files against each other. The
487 ** FV table contains one row for each each unique filename in
488 ** in the current checkout, the pivot, and the version being merged.
489 */
490 db_multi_exec(
491 "DROP TABLE IF EXISTS fv;"
492 "CREATE TEMP TABLE fv(\n"
493 " fn TEXT UNIQUE %s,\n" /* The filename */
494 " idv INTEGER DEFAULT 0,\n" /* VFILE entry for current version */
495 " idp INTEGER DEFAULT 0,\n" /* VFILE entry for the pivot */
496 " idm INTEGER DEFAULT 0,\n" /* VFILE entry for version merging in */
497 " chnged BOOLEAN,\n" /* True if current version has been edited */
498 " ridv INTEGER DEFAULT 0,\n" /* Record ID for current version */
499 " ridp INTEGER DEFAULT 0,\n" /* Record ID for pivot */
500 " ridm INTEGER DEFAULT 0,\n" /* Record ID for merge */
501 " isexe BOOLEAN,\n" /* Execute permission enabled */
502 " fnp TEXT UNIQUE %s,\n" /* The filename in the pivot */
503 " fnm TEXT UNIQUE %s,\n" /* The filename in the merged version */
504 " fnn TEXT UNIQUE %s,\n" /* The filename in the name pivot */
505 " islinkv BOOLEAN,\n" /* True if current version is a symlink */
506 " islinkm BOOLEAN\n" /* True if merged version in is a symlink */
507 ");",
508 filename_collation(), filename_collation(), filename_collation(),
509 filename_collation()
510 );
511
@@ -483,10 +513,14 @@
513 ** Compute name changes from N to V, P, and M
514 */
515 add_renames("fn", vid, nid, 0, debugFlag ? "N->V" : 0);
516 add_renames("fnp", pid, nid, 0, debugFlag ? "N->P" : 0);
517 add_renames("fnm", mid, nid, backoutFlag, debugFlag ? "N->M" : 0);
518 if( debugFlag ){
519 fossil_print("******** FV after name change search *******\n");
520 debug_fv_dump();
521 }
522
523 /*
524 ** Add files found in V
525 */
526 db_multi_exec(
@@ -497,10 +531,14 @@
531 " LEFT JOIN fv ON fn=coalesce(origname,pathname)"
532 " AND rid>0 AND vf.chnged NOT IN (3,5)"
533 " WHERE vid=%d;",
534 vAncestor, vid
535 );
536 if( debugFlag ){
537 fossil_print("******** FV after adding files in current version *******\n");
538 debug_fv_dump();
539 }
540
541 /*
542 ** Add files found in P
543 */
544 db_multi_exec(
@@ -519,10 +557,14 @@
557 "UPDATE OR IGNORE fv SET fnm=fnp WHERE fnm IS NULL;"
558 "INSERT OR IGNORE INTO fv(fnm)"
559 " SELECT pathname FROM vfile WHERE vid=%d;",
560 mid
561 );
562 if( debugFlag ){
563 fossil_print("******** FV after adding pivot and merge-in files *******\n");
564 debug_fv_dump();
565 }
566
567 /*
568 ** Compute the file version ids for P and M
569 */
570 if( pid==vid ){
@@ -545,33 +587,13 @@
587 " WHERE vid=%d AND fnm=pathname),0),"
588 " isexe=coalesce((SELECT isexe FROM vfile WHERE vid=%d AND fnm=pathname),"
589 " isexe)",
590 mid, mid, mid, mid
591 );
 
592 if( debugFlag ){
593 fossil_print("******** FV Final *******\n");
594 debug_fv_dump();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
595 }
596
597 /*
598 ** Update the execute bit on files where it's changed from P->M but not P->V
599 */
600

Keyboard Shortcuts

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