Add an option to specify root path when creating archives

This commit is contained in:
Alok Singhal
2015-01-29 08:46:50 -08:00
parent 9771adf862
commit 3ee1c798b2

View File

@@ -31,6 +31,7 @@ from __future__ import absolute_import
# Import from the Standard Library # Import from the Standard Library
from string import hexdigits from string import hexdigits
import sys, tarfile import sys, tarfile
import os.path
from time import time from time import time
if sys.version_info[0] < 3: if sys.version_info[0] < 3:
from cStringIO import StringIO from cStringIO import StringIO
@@ -566,12 +567,16 @@ class Repository(_Repository):
# #
# Utility for writing a tree into an archive # Utility for writing a tree into an archive
# #
def write_archive(self, treeish, archive, timestamp=None): def write_archive(self, treeish, archive, timestamp=None, root_path=None):
"""Write treeish into an archive """Write treeish into an archive
If no timestamp is provided and 'treeish' is a commit, its committer If no timestamp is provided and 'treeish' is a commit, its committer
timestamp will be used. Otherwise the current time will be used. timestamp will be used. Otherwise the current time will be used.
If no root_path is provided, the archive will be created so that
extracting it will create files under root_path, instead of the current
directory (equivalent to "tar -C root_path ..." while extracting).
Arguments: Arguments:
treeish treeish
@@ -580,6 +585,8 @@ class Repository(_Repository):
An archive from the 'tarfile' module An archive from the 'tarfile' module
timestamp timestamp
Timestamp to use for the files in the archive. Timestamp to use for the files in the archive.
root_path
The path under which all the files will appear in the archive.
Example:: Example::
@@ -608,6 +615,9 @@ class Repository(_Repository):
if not timestamp: if not timestamp:
timestamp = int(time()) timestamp = int(time())
if root_path is None:
root_path = '.'
tree = treeish.peel(Tree) tree = treeish.peel(Tree)
index = Index() index = Index()
@@ -615,7 +625,7 @@ class Repository(_Repository):
for entry in index: for entry in index:
content = self[entry.id].read_raw() content = self[entry.id].read_raw()
info = tarfile.TarInfo(entry.path) info = tarfile.TarInfo(os.path.join(root_path, entry.path))
info.size = len(content) info.size = len(content)
info.mtime = timestamp info.mtime = timestamp
info.uname = info.gname = 'root' # just because git does this info.uname = info.gname = 'root' # just because git does this