Fossil SCM

More work on merge with renames. Added a test case for the changes in check-in [cb4f38ee6733dccc]. Fix test 6 in merge_renames.test.

drh 2021-04-24 00:54 trunk
Commit 33e518b1e2e534e87f1b2f57d7ea1a420bd88f3f2beb6715037b69ac70cb8e9d
+35 -14
--- src/merge.c
+++ src/merge.c
@@ -618,28 +618,49 @@
618618
** to B and B is renamed to A.
619619
** The Fossil merge algorithm breaks down in those cases. It will need
620620
** to be completely rewritten to handle such complex cases. Such cases
621621
** appear to be rare, and also confusing to humans.
622622
*/
623
+ db_multi_exec(
624
+ "UPDATE OR IGNORE fv SET fnp=vfile.pathname FROM vfile"
625
+ " WHERE fnp IS NULL"
626
+ " AND vfile.pathname = fv.fnn"
627
+ " AND vfile.vid=%d;",
628
+ pid
629
+ );
623630
db_multi_exec(
624631
"UPDATE OR IGNORE fv SET fn=vfile.pathname FROM vfile"
625632
" WHERE fn IS NULL"
626
- " AND vfile.pathname IN (fv.fnm,fv.fnp,fv.fnn)"
633
+ " AND vfile.pathname = coalesce(fv.fnp,fv.fnn)"
627634
" AND vfile.vid=%d;",
628635
vid
636
+ );
637
+ db_multi_exec(
638
+ "UPDATE OR IGNORE fv SET fnm=vfile.pathname FROM vfile"
639
+ " WHERE fnm IS NULL"
640
+ " AND vfile.pathname = coalesce(fv.fnp,fv.fnn)"
641
+ " AND vfile.vid=%d;",
642
+ mid
629643
);
630644
db_multi_exec(
631645
"UPDATE OR IGNORE fv SET fnp=vfile.pathname FROM vfile"
632646
" WHERE fnp IS NULL"
633
- " AND vfile.pathname IN (fv.fn,fv.fnm,fv.fnn)"
647
+ " AND vfile.pathname IN (fv.fnm,fv.fn)"
634648
" AND vfile.vid=%d;",
635649
pid
650
+ );
651
+ db_multi_exec(
652
+ "UPDATE OR IGNORE fv SET fn=vfile.pathname FROM vfile"
653
+ " WHERE fn IS NULL"
654
+ " AND vfile.pathname = fv.fnm"
655
+ " AND vfile.vid=%d;",
656
+ vid
636657
);
637658
db_multi_exec(
638659
"UPDATE OR IGNORE fv SET fnm=vfile.pathname FROM vfile"
639660
" WHERE fnm IS NULL"
640
- " AND vfile.pathname IN (fv.fn,fv.fnp,fv.fnn)"
661
+ " AND vfile.pathname = fv.fn"
641662
" AND vfile.vid=%d;",
642663
mid
643664
);
644665
}
645666
if( debugFlag ){
@@ -702,25 +723,25 @@
702723
db_multi_exec(
703724
"UPDATE fv SET idp=idv, ridp=ridv WHERE ridv>0 AND chnged NOT IN (3,5)"
704725
);
705726
}else{
706727
db_multi_exec(
707
- "UPDATE fv SET"
708
- " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnp=pathname),0),"
709
- " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnp=pathname),0)",
710
- pid, pid
728
+ "UPDATE fv SET idp=coalesce(vfile.id,0), ridp=coalesce(vfile.rid,0)"
729
+ " FROM vfile"
730
+ " WHERE vfile.vid=%d AND fv.fnp=vfile.pathname",
731
+ pid
711732
);
712733
}
713734
db_multi_exec(
714735
"UPDATE fv SET"
715
- " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnm=pathname),0),"
716
- " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnm=pathname),0),"
717
- " islinkm=coalesce((SELECT islink FROM vfile"
718
- " WHERE vid=%d AND fnm=pathname),0),"
719
- " isexe=coalesce((SELECT isexe FROM vfile WHERE vid=%d AND fnm=pathname),"
720
- " isexe)",
721
- mid, mid, mid, mid
736
+ " idm=coalesce(vfile.id,0),"
737
+ " ridm=coalesce(vfile.rid,0),"
738
+ " islinkm=coalesce(vfile.islink,0),"
739
+ " isexe=coalesce(vfile.isexe,fv.isexe)"
740
+ " FROM vfile"
741
+ " WHERE vid=%d AND fnm=pathname",
742
+ mid
722743
);
723744
724745
/*
725746
** Update the execute bit on files where it's changed from P->M but not P->V
726747
*/
727748
728749
ADDED test/merge_renames_2.test
--- src/merge.c
+++ src/merge.c
@@ -618,28 +618,49 @@
618 ** to B and B is renamed to A.
619 ** The Fossil merge algorithm breaks down in those cases. It will need
620 ** to be completely rewritten to handle such complex cases. Such cases
621 ** appear to be rare, and also confusing to humans.
622 */
 
 
 
 
 
 
 
623 db_multi_exec(
624 "UPDATE OR IGNORE fv SET fn=vfile.pathname FROM vfile"
625 " WHERE fn IS NULL"
626 " AND vfile.pathname IN (fv.fnm,fv.fnp,fv.fnn)"
627 " AND vfile.vid=%d;",
628 vid
 
 
 
 
 
 
 
629 );
630 db_multi_exec(
631 "UPDATE OR IGNORE fv SET fnp=vfile.pathname FROM vfile"
632 " WHERE fnp IS NULL"
633 " AND vfile.pathname IN (fv.fn,fv.fnm,fv.fnn)"
634 " AND vfile.vid=%d;",
635 pid
 
 
 
 
 
 
 
636 );
637 db_multi_exec(
638 "UPDATE OR IGNORE fv SET fnm=vfile.pathname FROM vfile"
639 " WHERE fnm IS NULL"
640 " AND vfile.pathname IN (fv.fn,fv.fnp,fv.fnn)"
641 " AND vfile.vid=%d;",
642 mid
643 );
644 }
645 if( debugFlag ){
@@ -702,25 +723,25 @@
702 db_multi_exec(
703 "UPDATE fv SET idp=idv, ridp=ridv WHERE ridv>0 AND chnged NOT IN (3,5)"
704 );
705 }else{
706 db_multi_exec(
707 "UPDATE fv SET"
708 " idp=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnp=pathname),0),"
709 " ridp=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnp=pathname),0)",
710 pid, pid
711 );
712 }
713 db_multi_exec(
714 "UPDATE fv SET"
715 " idm=coalesce((SELECT id FROM vfile WHERE vid=%d AND fnm=pathname),0),"
716 " ridm=coalesce((SELECT rid FROM vfile WHERE vid=%d AND fnm=pathname),0),"
717 " islinkm=coalesce((SELECT islink FROM vfile"
718 " WHERE vid=%d AND fnm=pathname),0),"
719 " isexe=coalesce((SELECT isexe FROM vfile WHERE vid=%d AND fnm=pathname),"
720 " isexe)",
721 mid, mid, mid, mid
722 );
723
724 /*
725 ** Update the execute bit on files where it's changed from P->M but not P->V
726 */
727
728 DDED test/merge_renames_2.test
--- src/merge.c
+++ src/merge.c
@@ -618,28 +618,49 @@
618 ** to B and B is renamed to A.
619 ** The Fossil merge algorithm breaks down in those cases. It will need
620 ** to be completely rewritten to handle such complex cases. Such cases
621 ** appear to be rare, and also confusing to humans.
622 */
623 db_multi_exec(
624 "UPDATE OR IGNORE fv SET fnp=vfile.pathname FROM vfile"
625 " WHERE fnp IS NULL"
626 " AND vfile.pathname = fv.fnn"
627 " AND vfile.vid=%d;",
628 pid
629 );
630 db_multi_exec(
631 "UPDATE OR IGNORE fv SET fn=vfile.pathname FROM vfile"
632 " WHERE fn IS NULL"
633 " AND vfile.pathname = coalesce(fv.fnp,fv.fnn)"
634 " AND vfile.vid=%d;",
635 vid
636 );
637 db_multi_exec(
638 "UPDATE OR IGNORE fv SET fnm=vfile.pathname FROM vfile"
639 " WHERE fnm IS NULL"
640 " AND vfile.pathname = coalesce(fv.fnp,fv.fnn)"
641 " AND vfile.vid=%d;",
642 mid
643 );
644 db_multi_exec(
645 "UPDATE OR IGNORE fv SET fnp=vfile.pathname FROM vfile"
646 " WHERE fnp IS NULL"
647 " AND vfile.pathname IN (fv.fnm,fv.fn)"
648 " AND vfile.vid=%d;",
649 pid
650 );
651 db_multi_exec(
652 "UPDATE OR IGNORE fv SET fn=vfile.pathname FROM vfile"
653 " WHERE fn IS NULL"
654 " AND vfile.pathname = fv.fnm"
655 " AND vfile.vid=%d;",
656 vid
657 );
658 db_multi_exec(
659 "UPDATE OR IGNORE fv SET fnm=vfile.pathname FROM vfile"
660 " WHERE fnm IS NULL"
661 " AND vfile.pathname = fv.fn"
662 " AND vfile.vid=%d;",
663 mid
664 );
665 }
666 if( debugFlag ){
@@ -702,25 +723,25 @@
723 db_multi_exec(
724 "UPDATE fv SET idp=idv, ridp=ridv WHERE ridv>0 AND chnged NOT IN (3,5)"
725 );
726 }else{
727 db_multi_exec(
728 "UPDATE fv SET idp=coalesce(vfile.id,0), ridp=coalesce(vfile.rid,0)"
729 " FROM vfile"
730 " WHERE vfile.vid=%d AND fv.fnp=vfile.pathname",
731 pid
732 );
733 }
734 db_multi_exec(
735 "UPDATE fv SET"
736 " idm=coalesce(vfile.id,0),"
737 " ridm=coalesce(vfile.rid,0),"
738 " islinkm=coalesce(vfile.islink,0),"
739 " isexe=coalesce(vfile.isexe,fv.isexe)"
740 " FROM vfile"
741 " WHERE vid=%d AND fnm=pathname",
742 mid
743 );
744
745 /*
746 ** Update the execute bit on files where it's changed from P->M but not P->V
747 */
748
749 DDED test/merge_renames_2.test
--- a/test/merge_renames_2.test
+++ b/test/merge_renames_2.test
@@ -0,0 +1,59 @@
1
+#
2
+# Tests for merging with renames
3
+#
4
+#
5
+
6
+proc commit_id {version} {
7
+ regexp -line {^artifact:\s+(\S+)} [fossil whatis $version] - id
8
+ return $id
9
+}
10
+
11
+require_no_open_checkout
12
+
13
+#################################################################
14
+# Test 1 #
15
+# https://fossil-scm.org/forum/forumpost/549700437b #
16
+#################################################################
17
+
18
+test_setup
19
+
20
+write_file file1 "file1\n"
21
+fossil add file1
22
+fossil commit -m "added file1"
23
+
24
+write_file file2 "file2\n"
25
+fossil add file2
26
+fossil commit -m "added file2" --branch added
27
+
28
+write_file file2 "edit file2 on added\n"
29
+fossil commit -m "edited file2"
30
+
31
+fossil mv --hard file2 file2.renamed
32
+fossil commit -m "renamed file2" --branch renamed
33
+
34
+fossil branch new branched current
35
+
36
+write_file file2.renamed "edit file2.renamed on renamed\n"
37
+fossil commit -m "edited file2.renamed"
38
+
39
+fossil update trunk
40
+fossil merge renamed
41
+fossil commit -m "merged from renamed"
42
+
43
+write_file file2.renamed "edit file2.renamed on trunk (1)\n"
44
+fossil commit -m "edited file2.renamed on trunk (1)"
45
+
46
+fossil update branched
47
+fossil merge trunk
48
+test_status_list merge_renames_2-1.1 $RESULT {UPDATE file2.renamed}
49
+fossil commit -m "merged edit from trunk (1:this merge succeeded)"
50
+
51
+fossil update trunk
52
+write_file file2.renamed "edit2 file2.renamed on trunk (2)\n"
53
+fossil commit -m "edited file2.renamed on trunk (2)"
54
+
55
+fossil update branched
56
+fossil merge trunk
57
+test_status_list merge_renames_2-1.2 $RESULT {UPDATE file2.renamed}
58
+
59
+test_cleanup
--- a/test/merge_renames_2.test
+++ b/test/merge_renames_2.test
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
--- a/test/merge_renames_2.test
+++ b/test/merge_renames_2.test
@@ -0,0 +1,59 @@
1 #
2 # Tests for merging with renames
3 #
4 #
5
6 proc commit_id {version} {
7 regexp -line {^artifact:\s+(\S+)} [fossil whatis $version] - id
8 return $id
9 }
10
11 require_no_open_checkout
12
13 #################################################################
14 # Test 1 #
15 # https://fossil-scm.org/forum/forumpost/549700437b #
16 #################################################################
17
18 test_setup
19
20 write_file file1 "file1\n"
21 fossil add file1
22 fossil commit -m "added file1"
23
24 write_file file2 "file2\n"
25 fossil add file2
26 fossil commit -m "added file2" --branch added
27
28 write_file file2 "edit file2 on added\n"
29 fossil commit -m "edited file2"
30
31 fossil mv --hard file2 file2.renamed
32 fossil commit -m "renamed file2" --branch renamed
33
34 fossil branch new branched current
35
36 write_file file2.renamed "edit file2.renamed on renamed\n"
37 fossil commit -m "edited file2.renamed"
38
39 fossil update trunk
40 fossil merge renamed
41 fossil commit -m "merged from renamed"
42
43 write_file file2.renamed "edit file2.renamed on trunk (1)\n"
44 fossil commit -m "edited file2.renamed on trunk (1)"
45
46 fossil update branched
47 fossil merge trunk
48 test_status_list merge_renames_2-1.1 $RESULT {UPDATE file2.renamed}
49 fossil commit -m "merged edit from trunk (1:this merge succeeded)"
50
51 fossil update trunk
52 write_file file2.renamed "edit2 file2.renamed on trunk (2)\n"
53 fossil commit -m "edited file2.renamed on trunk (2)"
54
55 fossil update branched
56 fossil merge trunk
57 test_status_list merge_renames_2-1.2 $RESULT {UPDATE file2.renamed}
58
59 test_cleanup

Keyboard Shortcuts

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