def test_basic_wo_modules(self):
        bash(f"git clone {os.path.abspath('git1')} clone_git1")

        bash("git checkout c2", "clone_git1")
        call_update("clone_git1")

        linked_content = repo_diff.repo_content("clone_git1")
        expected_content = repo_diff.clean_clone_content("git1", "c2")
        self.assertEqual(linked_content, expected_content)
    def test_basic_w_modules(self):
        bash(f"git clone {os.path.abspath('git1')} clone_git1")

        bash("git checkout after-setUp", "clone_git1")
        call_update("clone_git1")
        call_update("clone_git1")  # repeated use should have no effect

        linked_content = repo_diff.repo_content("clone_git1")
        expected_content = repo_diff.clean_clone_content("git1", "after-setUp")
        self.assertEqual(linked_content, expected_content)
    def test_staged_change(self):
        bash("git checkout c1", "git1/libs/git3")
        git_commit("git1", "switch-git3-to-c1")

        bash(f"git clone {os.path.abspath('git1')} clone_git1")

        bash("git checkout after-setUp", "clone_git1")
        call_update("clone_git1")
        bash("git checkout c1", "clone_git1/libs/git3")
        bash("git add libs/git3", "clone_git1")
        call_update("clone_git1")

        linked_content = repo_diff.repo_content("clone_git1")
        expected_content = repo_diff.clean_clone_content(
            "git1", "switch-git3-to-c1")
        self.assertEqual(linked_content, expected_content)
    def test_submod_downgrade(self):
        bash("git checkout c1", "git2/libs/git3")
        git_commit("git2", "downgrade-git3")

        bash("git fetch", "git1/libs/git2")
        bash("git checkout downgrade-git3", "git1/libs/git2")
        git_commit("git1", "downgrade-git3")

        bash(f"git clone {os.path.abspath('git1')} clone_git1")

        bash("git checkout after-setUp", "clone_git1")
        call_update("clone_git1")
        bash("git checkout downgrade-git3", "clone_git1")
        call_update("clone_git1")

        linked_content = repo_diff.repo_content("clone_git1")
        expected_content = repo_diff.clean_clone_content(
            "git1", "downgrade-git3")
        self.assertEqual(linked_content, expected_content)
    def test_submod_removal(self):
        bash("git submodule deinit -f -- libs/git2", "git1")
        bash("rm -rf libs/git2", "git1")
        git_commit("git1", "remove-git2")

        bash(f"git clone {os.path.abspath('git1')} clone_git1")

        bash("git checkout after-setUp", "clone_git1")
        call_update("clone_git1")
        bash("git checkout remove-git2", "clone_git1")
        call_update("clone_git1")
        self.assertTrue(os.path.exists("clone_git1/libs/git2"),
                        "the file should still be there")
        # This deletes the directory but the dir in .git/modules survives
        bash("git clean -ffd", "clone_git1")
        self.assertFalse(os.path.exists("clone_git1/libs/git2"),
                         "now it should be gone")
        bash("git checkout after-setUp", "clone_git1")
        call_update("clone_git1")

        linked_content = repo_diff.repo_content("clone_git1")
        expected_content = repo_diff.clean_clone_content("git1", "after-setUp")
        self.assertEqual(linked_content, expected_content)