diff options
author | Peter Odding <peter@peterodding.com> | 2015-09-05 17:57:45 +0200 |
---|---|---|
committer | Peter Odding <peter@peterodding.com> | 2015-09-05 17:57:45 +0200 |
commit | 6c5df3650a90ca2567e6f865de237c5fb1fadf5d (patch) | |
tree | e2f57b0a0df78d1bd8a8417b7c3a28e19639163e | |
parent | 7a6e89bcbd75c495205ddf7520c044000c2e6a65 (diff) |
Try to fix `python setup.py bdist_dumb' on Mac OS X (paylogic/pip-accel#2)
Additions based on /usr/lib/python2.7/distutils/archive_util.py
from the Ubuntu 12.04 package python2.7 (2.7.3-0ubuntu3.8). I have not
looked into the compatibility of the software licenses of Paramiko vs
distutils however the original setup_helper.py code in Paramiko was
clearly also copied from distutils so to be honest it's not like I'm
changing the status quo.
-rw-r--r-- | setup_helper.py | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/setup_helper.py b/setup_helper.py index ff6b0e16..5d23137b 100644 --- a/setup_helper.py +++ b/setup_helper.py @@ -30,9 +30,42 @@ import distutils.archive_util from distutils.dir_util import mkpath from distutils.spawn import spawn - -def make_tarball(base_name, base_dir, compress='gzip', - verbose=False, dry_run=False): +try: + from pwd import getpwnam +except ImportError: + getpwnam = None + +try: + from grp import getgrnam +except ImportError: + getgrnam = None + +def _get_gid(name): + """Returns a gid, given a group name.""" + if getgrnam is None or name is None: + return None + try: + result = getgrnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def _get_uid(name): + """Returns an uid, given a user name.""" + if getpwnam is None or name is None: + return None + try: + result = getpwnam(name) + except KeyError: + result = None + if result is not None: + return result[2] + return None + +def make_tarball(base_name, base_dir, compress='gzip', verbose=0, dry_run=0, + owner=None, group=None): """Create a tar file from all the files under 'base_dir'. This file may be compressed. @@ -75,11 +108,25 @@ def make_tarball(base_name, base_dir, compress='gzip', mkpath(os.path.dirname(archive_name), dry_run=dry_run) log.info('Creating tar file %s with mode %s' % (archive_name, mode)) + uid = _get_uid(owner) + gid = _get_gid(group) + + def _set_uid_gid(tarinfo): + if gid is not None: + tarinfo.gid = gid + tarinfo.gname = group + if uid is not None: + tarinfo.uid = uid + tarinfo.uname = owner + return tarinfo + if not dry_run: tar = tarfile.open(archive_name, mode=mode) # This recursively adds everything underneath base_dir - tar.add(base_dir) - tar.close() + try: + tar.add(base_dir, filter=_set_uid_gid) + finally: + tar.close() if compress and compress not in tarfile_compress_flag: spawn([compress] + compress_flags[compress] + [archive_name], |