From 5c23d417c47b2a1a38f3d62335dd88e7b9617754 Mon Sep 17 00:00:00 2001 From: Guido Günther Date: Fri, 20 Jan 2017 17:12:03 +0100 Subject: GitRepository: properly determine git-dir instead of assuming '.git' Heavily based on a patch by Markus Lehtonnen Closes: #674015 --- gbp/git/repository.py | 14 +++++++++++++- tests/component/deb/test_import_orig.py | 16 ++++++++++++++++ tests/doctests/test_GitRepository.py | 16 +++++++++++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/gbp/git/repository.py b/gbp/git/repository.py index cc916a60..78b15d39 100644 --- a/gbp/git/repository.py +++ b/gbp/git/repository.py @@ -85,7 +85,18 @@ class GitRepository(object): raise GitRepositoryError( "Failed to get repository state at '%s'" % self.path) self._bare = False if out.strip() != 'true' else True - self._git_dir = '' if self._bare else '.git' + + def _get_git_dir(self): + out, dummy, ret = self._git_inout('rev-parse', ['--git-dir'], + capture_stderr=True) + if ret: + raise GitRepositoryError( + "Failed to determine repos git-dir at '%s'" % self.path) + git_dir = out.strip() + if os.path.isabs(git_dir): + self._git_dir = git_dir + else: + self._git_dir = os.path.abspath(os.path.join(self.path, git_dir)) def __init__(self, path): self._path = os.path.abspath(path) @@ -100,6 +111,7 @@ class GitRepository(object): except: raise GitRepositoryError("No Git repository at '%s'" % self.path) self._check_bare() + self._get_git_dir() @staticmethod def __build_env(extra_env): diff --git a/tests/component/deb/test_import_orig.py b/tests/component/deb/test_import_orig.py index 5b9ec9bb..7665c65c 100644 --- a/tests/component/deb/test_import_orig.py +++ b/tests/component/deb/test_import_orig.py @@ -299,3 +299,19 @@ class TestImportOrig(ComponentTestBase): with assert_raises(KeyError): t.getmember(f) t.close() + + @RepoFixtures.quilt30(DEFAULT_DSC, opts=['--pristine-tar']) + def test_import_in_submodule(self, repo): + """ + Test that importing works if repo is a git submodule (#674015) + """ + parent_repo = GitRepository.create('../parent') + parent_repo.add_submodule(repo.path) + parent_repo.update_submodules(init=True, recursive=True) + submodule = GitRepository(os.path.join(parent_repo.path, + 'hello-debhelper')) + ok_(submodule.path.endswith, 'parent/hello-debhelper') + os.chdir(submodule.path) + orig = self._orig('2.8') + submodule.create_branch('upstream', 'origin/upstream') + ok_(import_orig(['arg0', '--no-interactive', orig]) == 0) diff --git a/tests/doctests/test_GitRepository.py b/tests/doctests/test_GitRepository.py index cc3933a4..30a846ee 100644 --- a/tests/doctests/test_GitRepository.py +++ b/tests/doctests/test_GitRepository.py @@ -739,7 +739,7 @@ def test_create_bare(): >>> bare = gbp.git.GitRepository.create(dirs['bare'], bare=True, description="msg") >>> bare.path == dirs['bare'] True - >>> bare.git_dir[:-1] == dirs['bare'] + >>> bare.git_dir == dirs['bare'] True >>> type(bare) == gbp.git.GitRepository True @@ -1021,4 +1021,18 @@ def test_set_user_name_and_email(): >>> repo.set_user_email("stapelberg@test.invalid") """ + +def test_git_dir(): + """ + Properties tested: + - L{gbp.git.GitRepository.git_dir} + >>> import os, gbp.git + >>> git_dir = os.path.join(dirs['repo'], '.git') + >>> os.environ['GIT_DIR'] = git_dir + >>> somewhere = gbp.git.GitRepository(os.path.join(dirs['repo'], '..')) + >>> somewhere.git_dir == git_dir + True + >>> del os.environ['GIT_DIR'] + """ + # vim:et:ts=4:sw=4:et:sts=4:ai:set list listchars=tab\:»·,trail\:·: -- cgit v1.2.3