diff options
Diffstat (limited to 'setuptools/archive_util.py')
-rwxr-xr-x | setuptools/archive_util.py | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/setuptools/archive_util.py b/setuptools/archive_util.py index d44264f8..1109f346 100755 --- a/setuptools/archive_util.py +++ b/setuptools/archive_util.py @@ -158,6 +158,9 @@ def unpack_zipfile(filename, extract_dir, progress_filter=default_filter): finally: f.close() del data + unix_attributes = info.external_attr >> 16 + if unix_attributes: + os.chmod(target, unix_attributes) finally: z.close() @@ -181,21 +184,23 @@ def unpack_tarfile(filename, extract_dir, progress_filter=default_filter): name = member.name # don't extract absolute paths or ones with .. in them if not name.startswith('/') and '..' not in name.split('/'): - dst = os.path.join(extract_dir, *name.split('/')) + prelim_dst = os.path.join(extract_dir, *name.split('/')) + + # resolve any links and to extract the link targets as normal files while member is not None and (member.islnk() or member.issym()): linkpath = member.linkname if member.issym(): linkpath = posixpath.join(posixpath.dirname(member.name), linkpath) linkpath = posixpath.normpath(linkpath) member = tarobj._getmember(linkpath) - + if member is not None and (member.isfile() or member.isdir()): - dst = progress_filter(name, dst) - if dst: - if dst.endswith(os.sep): - dst = dst[:-1] + final_dst = progress_filter(name, prelim_dst) + if final_dst: + if final_dst.endswith(os.sep): + final_dst = final_dst[:-1] try: - tarobj._extract_member(member,dst) # XXX Ugh + tarobj._extract_member(member, final_dst) # XXX Ugh except tarfile.ExtractError: pass # chown/chmod/mkfifo/mknode/makedev failed return True |