| #!/bin/sh |
| |
| test_description="merge cases" |
| |
| # The setup for all of them, pictorially, is: |
| # |
| # A |
| # o |
| # / \ |
| # O o ? |
| # \ / |
| # o |
| # B |
| # |
| # To help make it easier to follow the flow of tests, they have been |
| # divided into sections and each test will start with a quick explanation |
| # of what commits O, A, and B contain. |
| # |
| # Notation: |
| # z/{b,c} means files z/b and z/c both exist |
| # x/d_1 means file x/d exists with content d1. (Purpose of the |
| # underscore notation is to differentiate different |
| # files that might be renamed into each other's paths.) |
| |
| . ./test-lib.sh |
| . "$TEST_DIRECTORY"/lib-merge.sh |
| |
| |
| # Testcase basic, conflicting changes in 'numerals' |
| |
| test_setup_numerals () { |
| test_create_repo numerals_$1 && |
| ( |
| cd numerals_$1 && |
| |
| >README && |
| test_write_lines I II III >numerals && |
| git add README numerals && |
| test_tick && |
| git commit -m "O" && |
| |
| git branch O && |
| git branch A && |
| git branch B && |
| |
| git checkout A && |
| test_write_lines I II III IIII >numerals && |
| git add numerals && |
| test_tick && |
| git commit -m "A" && |
| |
| git checkout B && |
| test_write_lines I II III IV >numerals && |
| git add numerals && |
| test_tick && |
| git commit -m "B" && |
| |
| cat <<-EOF >expected-index && |
| H README |
| M numerals |
| M numerals |
| M numerals |
| EOF |
| |
| cat <<-EOF >expected-merge |
| I |
| II |
| III |
| <<<<<<< HEAD |
| IIII |
| ======= |
| IV |
| >>>>>>> B^0 |
| EOF |
| |
| ) |
| } |
| |
| test_expect_success 'conflicting entries written to worktree even if sparse' ' |
| test_setup_numerals plain && |
| ( |
| cd numerals_plain && |
| |
| git checkout A^0 && |
| |
| test_path_is_file README && |
| test_path_is_file numerals && |
| |
| git sparse-checkout init && |
| git sparse-checkout set README && |
| |
| test_path_is_file README && |
| test_path_is_missing numerals && |
| |
| test_must_fail git merge -s recursive B^0 && |
| |
| git ls-files -t >index_files && |
| test_cmp expected-index index_files && |
| |
| test_path_is_file README && |
| test_path_is_file numerals && |
| |
| test_cmp expected-merge numerals && |
| |
| # 4 other files: |
| # * expected-merge |
| # * expected-index |
| # * index_files |
| # * others |
| git ls-files -o >others && |
| test_line_count = 4 others |
| ) |
| ' |
| |
| test_expect_merge_algorithm failure success 'present-despite-SKIP_WORKTREE handled reasonably' ' |
| test_setup_numerals in_the_way && |
| ( |
| cd numerals_in_the_way && |
| |
| git checkout A^0 && |
| |
| test_path_is_file README && |
| test_path_is_file numerals && |
| |
| git sparse-checkout init && |
| git sparse-checkout set README && |
| |
| test_path_is_file README && |
| test_path_is_missing numerals && |
| |
| echo foobar >numerals && |
| |
| test_must_fail git merge -s recursive B^0 && |
| |
| git ls-files -t >index_files && |
| test_cmp expected-index index_files && |
| |
| test_path_is_file README && |
| test_path_is_file numerals && |
| |
| test_cmp expected-merge numerals && |
| |
| # There should still be a file with "foobar" in it |
| grep foobar * && |
| |
| # 5 other files: |
| # * expected-merge |
| # * expected-index |
| # * index_files |
| # * others |
| # * whatever name was given to the numerals file that had |
| # "foobar" in it |
| git ls-files -o >others && |
| test_line_count = 5 others |
| ) |
| ' |
| |
| test_done |