import subprocess import pytest # TODO: Have a different "person" for the commit and for the merge # TODO: Test "unborn" case, but how ? def test_merge_fast_forward(repo_init_with_commit, commit_env_config, git2cpp_path, tmp_path): assert (tmp_path / "initial.txt").exists() checkout_cmd = [git2cpp_path, "checkout", "-b", "foregone"] p_checkout = subprocess.run(checkout_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_checkout.returncode == 0 file_path = tmp_path / "mook_file.txt" file_path.write_text("blablabla") add_cmd = [git2cpp_path, "add", "mook_file.txt"] p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_add.returncode == 0 commit_cmd = [git2cpp_path, "commit", "-m", "test commit"] p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_commit.returncode == 0 checkout_cmd_2 = [git2cpp_path, "checkout", "main"] p_checkout_2 = subprocess.run(checkout_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_checkout_2.returncode == 0 merge_cmd = [git2cpp_path, "merge", "foregone"] p_merge = subprocess.run(merge_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_merge.returncode == 0 assert "Fast-forward" in p_merge.stdout log_cmd = [git2cpp_path, "log", "--format=full", "--max-count", "1"] p_log = subprocess.run(log_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_log.returncode == 0 assert "Author: Jane Doe" in p_log.stdout # assert "Commit: John Doe" in p_log.stdout assert (tmp_path / "mook_file.txt").exists() merge_cmd_2 = [git2cpp_path, "merge", "foregone"] p_merge_2 = subprocess.run(merge_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_merge_2.returncode == 0 assert p_merge_2.stdout == "Already up-to-date\n" def test_merge_commit(repo_init_with_commit, commit_env_config, git2cpp_path, tmp_path): assert (tmp_path / "initial.txt").exists() checkout_cmd = [git2cpp_path, "checkout", "-b", "foregone"] p_checkout = subprocess.run(checkout_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_checkout.returncode == 0 file_path = tmp_path / "mook_file.txt" file_path.write_text("blablabla") add_cmd = [git2cpp_path, "add", "mook_file.txt"] p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_add.returncode == 0 commit_cmd = [git2cpp_path, "commit", "-m", "test commit foregone"] p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_commit.returncode == 0 checkout_cmd_2 = [git2cpp_path, "checkout", "main"] p_checkout_2 = subprocess.run(checkout_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_checkout_2.returncode == 0 file_path_2 = tmp_path / "mook_file_2.txt" file_path_2.write_text("BLABLABLA") add_cmd_2 = [git2cpp_path, "add", "mook_file_2.txt"] p_add_2 = subprocess.run(add_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_add_2.returncode == 0 commit_cmd_2 = [git2cpp_path, "commit", "-m", "test commit master"] p_commit_2 = subprocess.run(commit_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_commit_2.returncode == 0 merge_cmd = [git2cpp_path, "merge", "foregone"] p_merge = subprocess.run(merge_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_merge.returncode == 0 log_cmd = [git2cpp_path, "log", "--format=full", "--max-count", "2"] p_log = subprocess.run(log_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_log.returncode == 0 assert "Author: Jane Doe" in p_log.stdout # assert "Commit: John Doe" in p_log.stdout assert "Johan" not in p_log.stdout assert (tmp_path / "mook_file.txt").exists() assert (tmp_path / "mook_file_2.txt").exists() merge_cmd_2 = [git2cpp_path, "merge", "foregone"] p_merge_2 = subprocess.run(merge_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_merge_2.returncode == 0 assert p_merge_2.stdout == "Already up-to-date\n" @pytest.mark.parametrize( "flag,abort_input", [ ("--abort", "y"), ("--abort", "Y"), ("--abort", "n"), ("--abort", "N"), ("--abort", ""), ("--quit", None), ("--continue", None), ], ) def test_merge_conflict( repo_init_with_commit, commit_env_config, git2cpp_path, tmp_path, flag, abort_input ): assert (tmp_path / "initial.txt").exists() checkout_cmd = [git2cpp_path, "checkout", "-b", "foregone"] p_checkout = subprocess.run(checkout_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_checkout.returncode == 0 file_path = tmp_path / "mook_file.txt" file_path.write_text("blablabla") file_path_2 = tmp_path / "mook_file_2.txt" file_path_2.write_text("Second file") add_cmd = [git2cpp_path, "add", "--all"] p_add = subprocess.run(add_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_add.returncode == 0 commit_cmd = [git2cpp_path, "commit", "-m", "test commit foregone"] p_commit = subprocess.run(commit_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_commit.returncode == 0 checkout_cmd_2 = [git2cpp_path, "checkout", "main"] p_checkout_2 = subprocess.run(checkout_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_checkout_2.returncode == 0 file_path.write_text("BLABLABLA") add_cmd_2 = [git2cpp_path, "add", "mook_file.txt"] p_add_2 = subprocess.run(add_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_add_2.returncode == 0 commit_cmd_2 = [git2cpp_path, "commit", "-m", "test commit master"] p_commit_2 = subprocess.run(commit_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_commit_2.returncode == 0 merge_cmd = [git2cpp_path, "merge", "foregone"] p_merge = subprocess.run(merge_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_merge.returncode == 0 assert "conflict: " in p_merge.stdout flag_cmd = [git2cpp_path, "merge", flag] if flag == "--abort": p_abort = subprocess.run( flag_cmd, input=abort_input, capture_output=True, cwd=tmp_path, text=True ) assert p_abort.returncode == 0 assert (tmp_path / "mook_file.txt").exists() text = (tmp_path / "mook_file.txt").read_text() if abort_input.lower() == "y": assert "BLA" in text assert "bla" not in text else: assert "Abort." in p_abort.stdout elif flag == "--quit": pass # p_quit = subprocess.run(flag_cmd, capture_output=True, cwd=xtl_path, text=True) # assert p_quit.returncode == 0 # assert (xtl_path / "mook_file.txt").exists() # with open(xtl_path / "mook_file.txt") as f: # lines = f.readlines() # assert "<<<<<<< HEAD" in lines[0] # assert ">>>>>>> foregone" in lines[-1] # p_merge_2 = subprocess.run( # merge_cmd, capture_output=True, cwd=xtl_path, text=True # ) # assert p_merge_2.returncode != 0 # print(p_merge_2.stdout) # assert "error: Merging is not possible because you have unmerged files." in p_merge_2.stdout elif flag == "--continue": # Create another branch pointing to the same commit (alias branch). # This checks the merge behaviour when a different branch name points to the same commit. branch_alias_cmd = [git2cpp_path, "branch", "foregone_alias"] p_branch_alias = subprocess.run( branch_alias_cmd, capture_output=True, cwd=tmp_path, text=True ) assert p_branch_alias.returncode == 0 file_path.write_text("blablabla") cmd_add = [git2cpp_path, "add", "mook_file.txt"] p_add = subprocess.run(cmd_add, cwd=tmp_path, text=True) assert p_add.returncode == 0 p_continue = subprocess.run(flag_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_continue.returncode == 0 log_cmd = [git2cpp_path, "log", "--format=full", "--max-count", "2"] p_log = subprocess.run(log_cmd, capture_output=True, cwd=tmp_path, text=True) assert p_log.returncode == 0 assert "Author: Jane Doe" in p_log.stdout # assert "Commit: John Doe" in p_log.stdout assert "Johan" not in p_log.stdout assert (tmp_path / "mook_file.txt").exists() assert (tmp_path / "mook_file_2.txt").exists() merge_cmd_2 = [git2cpp_path, "merge", "foregone"] p_merge_2 = subprocess.run(merge_cmd_2, capture_output=True, cwd=tmp_path, text=True) assert p_merge_2.returncode == 0 assert p_merge_2.stdout == "Already up-to-date\n"