1# Copyright (C) 2009-2018 Jelmer Vernooij <jelmer@jelmer.uk> 2# Copyright (C) 2007 Canonical Ltd 3# 4# This program is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 2 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program; if not, write to the Free Software 16# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 18"""Test the GitDir class""" 19 20from dulwich.repo import Repo as GitRepo 21import os 22 23from ... import ( 24 controldir, 25 errors, 26 urlutils, 27 ) 28from ...transport import get_transport 29from ...tests import TestSkipped 30 31from .. import ( 32 dir, 33 tests, 34 workingtree, 35 ) 36 37 38class TestGitDir(tests.TestCaseInTempDir): 39 40 def test_get_head_branch_reference(self): 41 GitRepo.init(".") 42 43 gd = controldir.ControlDir.open('.') 44 self.assertEqual( 45 "%s,branch=master" % 46 urlutils.local_path_to_url(os.path.abspath(".")), 47 gd.get_branch_reference()) 48 49 def test_open_existing(self): 50 GitRepo.init(".") 51 52 gd = controldir.ControlDir.open('.') 53 self.assertIsInstance(gd, dir.LocalGitDir) 54 55 def test_open_ref_parent(self): 56 r = GitRepo.init(".") 57 cid = r.do_commit(message=b"message", ref=b'refs/heads/foo/bar') 58 gd = controldir.ControlDir.open('.') 59 self.assertRaises(errors.NotBranchError, gd.open_branch, 'foo') 60 61 def test_open_workingtree(self): 62 r = GitRepo.init(".") 63 r.do_commit(message=b"message") 64 65 gd = controldir.ControlDir.open('.') 66 wt = gd.open_workingtree() 67 self.assertIsInstance(wt, workingtree.GitWorkingTree) 68 69 def test_open_workingtree_bare(self): 70 GitRepo.init_bare(".") 71 72 gd = controldir.ControlDir.open('.') 73 self.assertRaises(errors.NoWorkingTree, gd.open_workingtree) 74 75 def test_git_file(self): 76 gitrepo = GitRepo.init("blah", mkdir=True) 77 self.build_tree_contents( 78 [('foo/', ), ('foo/.git', b'gitdir: ../blah/.git\n')]) 79 80 gd = controldir.ControlDir.open('foo') 81 self.assertEqual(gd.control_url.rstrip('/'), 82 urlutils.local_path_to_url(os.path.abspath(gitrepo.controldir()))) 83 84 def test_shared_repository(self): 85 t = get_transport('.') 86 self.assertRaises( 87 errors.SharedRepositoriesUnsupported, 88 dir.LocalGitControlDirFormat().initialize_on_transport_ex, t, 89 shared_repo=True) 90 91 92class TestGitDirFormat(tests.TestCase): 93 94 def setUp(self): 95 super(TestGitDirFormat, self).setUp() 96 self.format = dir.LocalGitControlDirFormat() 97 98 def test_get_format_description(self): 99 self.assertEqual("Local Git Repository", 100 self.format.get_format_description()) 101 102 def test_eq(self): 103 format2 = dir.LocalGitControlDirFormat() 104 self.assertEqual(self.format, format2) 105 self.assertEqual(self.format, self.format) 106 bzr_format = controldir.format_registry.make_controldir("default") 107 self.assertNotEqual(self.format, bzr_format) 108