diff --git a/sphinx_multiversion/git.py b/sphinx_multiversion/git.py index 6ee52d8e..57c5f0fc 100644 --- a/sphinx_multiversion/git.py +++ b/sphinx_multiversion/git.py @@ -7,6 +7,7 @@ import subprocess import tarfile import tempfile +import shutil GitRef = collections.namedtuple( "VersionRef", @@ -154,17 +155,10 @@ def file_exists(gitroot, refname, filename): def copy_tree(gitroot, src, dst, reference, sourcepath="."): - with tempfile.SpooledTemporaryFile() as fp: - cmd = ( - "git", - "archive", - "--format", - "tar", - reference.commit, - "--", - sourcepath, - ) - subprocess.check_call(cmd, cwd=gitroot, stdout=fp) - fp.seek(0) - with tarfile.TarFile(fileobj=fp) as tarfp: - tarfp.extractall(dst) + try: + shutil.copytree(gitroot, dst) + except OSError as e: + if e.errno == 17: # already copied + return + raise + subprocess.call(("git", "checkout", "-f", reference.commit), cwd=dst) diff --git a/sphinx_multiversion/main.py b/sphinx_multiversion/main.py index 9870b314..26777ce2 100644 --- a/sphinx_multiversion/main.py +++ b/sphinx_multiversion/main.py @@ -229,11 +229,12 @@ def main(argv=None): repopath = os.path.join(tmp, gitref.commit) try: git.copy_tree(str(gitroot), gitroot.as_uri(), repopath, gitref) - except (OSError, subprocess.CalledProcessError): + except (OSError, subprocess.CalledProcessError) as e: logger.error( - "Failed to copy git tree for %s to %s", + "Failed to copy git tree for %s to %s:\n%s", gitref.refname, repopath, + e, ) continue