Skip to content

Commit

Permalink
Submodules may contain other submodules. Do process and add those
Browse files Browse the repository at this point in the history
to the source tar.

fixes #456
  • Loading branch information
arcivanov authored and FrostyX committed May 16, 2023
1 parent 71c8e6f commit 835309b
Showing 1 changed file with 39 additions and 18 deletions.
57 changes: 39 additions & 18 deletions src/tito/builder/submodule_aware_builder.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -26,6 +27,7 @@
find_spec_like_file,
get_commit_timestamp,
)
from tito.exception import TitoException
from tito.tar import TarFixer


Expand Down Expand Up @@ -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, consider-using-f-string
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
Expand All @@ -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 <commit>:./<submodule>
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 <prefix>/<submodule>
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):
raise TitoException("%r path does not contain '.git'. "
"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 <commit>:./<submodule>
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 <prefix>/<submodule>
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.
Expand Down

0 comments on commit 835309b

Please sign in to comment.