def git_archive_submodules(repo, treeish, output, tmpdir_base, prefix, comp_type, comp_level, comp_opts, format='tar'): """ Create a source tree archive with submodules. Since git-archive always writes an end of tarfile trailer we concatenate the generated archives using tar and compress the result. Exception handling is left to the caller. """ prefix = sanitize_prefix(prefix) tempdir = tempfile.mkdtemp(dir=tmpdir_base, prefix='git-archive_') main_archive = os.path.join(tempdir, "main.%s" % format) submodule_archive = os.path.join(tempdir, "submodule.%s" % format) try: # generate main (tmp) archive repo.archive(format=format, prefix=prefix, output=main_archive, treeish=treeish) # generate each submodule's arhive and append it to the main archive for (subdir, commit) in repo.get_submodules(treeish): tarpath = [subdir, subdir[2:]][subdir.startswith("./")] subrepo = GitRepository(os.path.join(repo.path, subdir)) gbp.log.debug("Processing submodule %s (%s)" % (subdir, commit[0:8])) subrepo.archive(format=format, prefix='%s%s/' % (prefix, tarpath), output=submodule_archive, treeish=commit) if format == 'tar': CatenateTarArchive(main_archive)(submodule_archive) elif format == 'zip': CatenateZipArchive(main_archive)(submodule_archive) # compress the output if comp_type: compress(comp_type, ['--stdout', '-%s' % comp_level] + comp_opts + [main_archive], output) else: shutil.move(main_archive, output) finally: shutil.rmtree(tempdir)
def dump_tree(repo, export_dir, treeish, with_submodules, recursive=True): """Dump a git tree-ish to output_dir""" if not os.path.exists(export_dir): os.makedirs(export_dir) if recursive: paths = '' else: paths = [ nam for _mod, typ, _sha, nam in repo.list_tree(treeish) if typ == 'blob' ] try: data = repo.archive('tar', '', None, treeish, paths) untar_data(export_dir, data) if recursive and with_submodules and repo.has_submodules(): repo.update_submodules() for (subdir, commit) in repo.get_submodules(treeish): gbp.log.info("Processing submodule %s (%s)" % (subdir, commit[0:8])) subrepo = GitRepository(os.path.join(repo.path, subdir)) prefix = [subdir, subdir[2:]][subdir.startswith("./")] + '/' data = subrepo.archive('tar', prefix, None, treeish) untar_data(export_dir, data) except GitRepositoryError as err: gbp.log.err("Git error when dumping tree: %s" % err) return False return True