Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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