# vim: set fileencoding=utf-8 :

"""
Test  L{GitRepository}

Test things here that don't fit nicely into the doctests that
also make up the API documentation.
"""

from . import context  # noqa: 401
from . import testutils

import os

import gbp.log
import gbp.git
import gbp.errors


class TestWriteTree(testutils.DebianGitTestRepo):
    def _write_testtree(self):
        """Write a test tree"""
        paths = []
        for i in range(4):
            path = os.path.join(self.repo.path, 'testfile%d' % i)
            with open(path, 'w') as f:
                print("testdata %d" % i, file=f)
            paths.append(path)
        return paths

    def test_write_tree_index_nonexistent(self):
        """Write out index file to non-existent dir"""
        paths = self._write_testtree()
        self.repo.add_files(paths)
        with self.assertRaises(gbp.git.GitRepositoryError):
            self.repo.write_tree('/does/not/exist')

    def test_write_tree(self):
        """Write out index file to alternate index file"""
        index = os.path.join(self.repo.git_dir, 'gbp_index')
        expected_sha1 = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'

        paths = self._write_testtree()
        self.repo.add_files(paths)
        sha1 = self.repo.write_tree(index)
        self.assertTrue(os.path.exists(index))
        self.assertEqual(sha1, expected_sha1)
        self.assertTrue(self.repo.has_treeish(expected_sha1))

    def test_commit_tree(self):
        """Commit a tree"""
        expected_sha1 = 'ea63fcee40675a5f82ea6bedbf29ca86d89c5f63'
        paths = self._write_testtree()
        self.repo.add_files(paths)
        sha1 = self.repo.write_tree()
        self.assertEqual(sha1, expected_sha1)
        self.assertTrue(self.repo.has_treeish(expected_sha1))
        commit = self.repo.commit_tree(sha1, "first commit", parents=[],
                                       committer=dict(name='foo',
                                                      email='foo@example.com'),
                                       author=dict(name='bar',
                                                   email='bar@example.com'),
                                       )
        self.assertEqual(len(commit), 40)
        # commit the same tree again using the previous commit as parent
        self.repo.commit_tree(sha1, "second commit", parents=[commit])
        # commit the same tree again using a non-existent parent
        with self.assertRaises(gbp.errors.GbpError):
            self.repo.commit_tree(sha1, "failed commit", ['doesnotexist'])


class TestHasBranch(testutils.DebianGitTestRepo):
    def test_has_branch(self):
        self.add_file('whatever')
        self.repo.create_branch("foo")
        self.assertTrue(self.repo.has_branch("foo"))
        # Don't be too sloppy on (#813298)
        self.repo.create_branch("refs/heads/bar")
        self.assertFalse(self.repo.has_branch("bar"))

# vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·:
