diff --git a/src/tito/builder/submodule_aware_builder.py b/src/tito/builder/submodule_aware_builder.py index d4e10c65..8b4024ed 100644 --- a/src/tito/builder/submodule_aware_builder.py +++ b/src/tito/builder/submodule_aware_builder.py @@ -1,4 +1,5 @@ # Copyright (c) 2008-2011 Red Hat, Inc. +# Copyright (c) 2023 Karellen, Inc. (https://karellen.co) # # This software is licensed to you under the GNU General Public License, # version 2 (GPLv2). There is NO WARRANTY for this software, express or @@ -26,6 +27,7 @@ find_spec_like_file, get_commit_timestamp, ) +from tito.exception import TitoException from tito.tar import TarFixer @@ -107,9 +109,12 @@ def run_git_archive(self, relative_git_dir, prefix, commit, dest_tar, subdir=Non "%s > /dev/null" % git_archive_cmd, ) - def _submodule_archives(self, relative_git_dir, prefix, commit, initial_tar): - submodules_cmd = "git config --file .gitmodules --get-regexp path" - submodules_output = run_command(submodules_cmd) + # pylint: disable=too-many-locals, too-many-arguments + def _submodule_archives(self, relative_git_dir, prefix, commit, initial_tar, + submodule_tree="."): + with chdir(submodule_tree): + submodules_cmd = "git config --file .gitmodules --get-regexp path" + submodules_output = run_command(submodules_cmd) # split submodules output on newline # then on tab, and the directory is the last entry @@ -120,23 +125,39 @@ def _submodule_archives(self, relative_git_dir, prefix, commit, initial_tar): # We ignore the hash in the sub modules list as we'll have to get the correct one # from the commit id in commit for submodule in submodules_list: - # to find the submodule shars: - # git rev-parse :./ - rev_parse_cmd = "git rev-parse %s:./%s" % (commit, submodule) - submodule_commit = run_command(rev_parse_cmd) - submodule_tar_file = "%s.%s" % (initial_tar, submodule.replace("/", "_")) - # prefix should be / - submodule_prefix = "%s/%s" % (prefix, submodule) - - self.run_git_archive( - relative_git_dir, - submodule_prefix, - submodule_commit, - submodule_tar_file, - submodule, - ) + with chdir(submodule_tree): + submodule_git_dir = os.path.join(submodule, ".git") + if not os.path.exists(submodule_git_dir) or not os.path.isdir(submodule_git_dir): + raise TitoException("%r path does not contain '.git' directory. " + "Have you cloned the repository recursively?\n" + "Try `git submodule update --init --recursive`!" % + os.path.abspath(submodule)) + # to find the submodule shars: + # git rev-parse :./ + rev_parse_cmd = "git rev-parse %s:./%s" % (commit, submodule) + submodule_commit = run_command(rev_parse_cmd) + submodule_tar_file = "%s.%s" % (initial_tar, submodule.replace("/", "_")) + # prefix should be / + submodule_prefix = "%s/%s" % (prefix, submodule) + + self.run_git_archive( + relative_git_dir, + submodule_prefix, + submodule_commit, + submodule_tar_file, + submodule, + ) yield (submodule_tar_file) + submodule_dir = os.path.join(submodule_tree, submodule) + gitmodules_path = os.path.join(submodule_dir, ".gitmodules") + if os.path.exists(gitmodules_path): + for archive in self._submodule_archives( + relative_git_dir, submodule_prefix, submodule_commit, + submodule_tar_file, submodule_dir + ): + yield archive + def create_tgz(self, git_root, prefix, commit, relative_dir, dest_tgz): """ Create a .tar.gz from a projects source in git.