2010-02-21 11:14:57 +00:00
|
|
|
#!/usr/bin/python
|
|
|
|
# -*- coding: iso-8859-1 -*-
|
2015-07-19 17:29:01 +00:00
|
|
|
# Copyright (C) 2010-2015 Bastian Kleineidam
|
2010-02-21 11:14:57 +00:00
|
|
|
#
|
|
|
|
# This program is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# This program is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
"""
|
|
|
|
Setup file for the distuils module.
|
|
|
|
"""
|
2012-11-19 19:58:42 +00:00
|
|
|
from __future__ import print_function
|
2010-02-21 11:14:57 +00:00
|
|
|
import sys
|
2012-11-19 19:58:42 +00:00
|
|
|
if not hasattr(sys, "version_info") or sys.version_info < (2, 7, 0, "final", 0):
|
|
|
|
raise SystemExit("This program requires Python 2.7 or later.")
|
2010-03-01 15:01:23 +00:00
|
|
|
import os
|
2013-04-08 18:12:50 +00:00
|
|
|
import re
|
2012-05-18 18:49:43 +00:00
|
|
|
import shutil
|
|
|
|
import glob
|
|
|
|
import subprocess
|
2015-12-07 19:16:28 +00:00
|
|
|
from setuptools import setup
|
|
|
|
from distutils.core import Distribution
|
2013-04-08 18:12:50 +00:00
|
|
|
from distutils.command.install_lib import install_lib
|
2012-05-18 18:49:43 +00:00
|
|
|
from distutils import util
|
2013-04-08 18:12:50 +00:00
|
|
|
from distutils.file_util import write_file
|
2010-02-21 11:14:57 +00:00
|
|
|
|
2014-06-09 12:02:19 +00:00
|
|
|
AppName = "patool"
|
2015-12-07 11:29:17 +00:00
|
|
|
AppVersion = "1.9"
|
2010-02-21 11:14:57 +00:00
|
|
|
MyName = "Bastian Kleineidam"
|
2013-02-22 17:33:08 +00:00
|
|
|
MyEmail = "bastian.kleineidam@web.de"
|
2010-02-21 11:14:57 +00:00
|
|
|
|
2012-05-18 18:49:43 +00:00
|
|
|
|
2013-04-08 18:12:50 +00:00
|
|
|
def normpath (path):
|
|
|
|
"""Norm a path name to platform specific notation."""
|
|
|
|
return os.path.normpath(path)
|
|
|
|
|
|
|
|
|
|
|
|
def cnormpath (path):
|
|
|
|
"""Norm a path name to platform specific notation and make it absolute."""
|
|
|
|
path = normpath(path)
|
|
|
|
if os.name == 'nt':
|
|
|
|
# replace slashes with backslashes
|
|
|
|
path = path.replace("/", "\\")
|
|
|
|
if not os.path.isabs(path):
|
|
|
|
path = normpath(os.path.join(sys.prefix, path))
|
|
|
|
return path
|
|
|
|
|
|
|
|
|
|
|
|
release_ro = re.compile(r"\(released (.+)\)")
|
|
|
|
def get_release_date ():
|
|
|
|
"""Parse and return relase date as string from doc/changelog.txt."""
|
|
|
|
fname = os.path.join("doc", "changelog.txt")
|
|
|
|
release_date = "unknown"
|
|
|
|
with open(fname) as fd:
|
|
|
|
# the release date is on the first line
|
|
|
|
line = fd.readline()
|
|
|
|
mo = release_ro.search(line)
|
|
|
|
if mo:
|
|
|
|
release_date = mo.groups(1)
|
|
|
|
return release_date
|
|
|
|
|
|
|
|
|
2010-03-01 15:01:23 +00:00
|
|
|
data_files = []
|
|
|
|
if os.name == 'nt':
|
|
|
|
data_files.append(('share', ['doc/patool.txt']))
|
|
|
|
else:
|
|
|
|
data_files.append(('share/man/man1', ['doc/patool.1']))
|
|
|
|
|
2012-05-18 18:49:43 +00:00
|
|
|
|
|
|
|
def get_nt_platform_vars ():
|
|
|
|
"""Return program file path and architecture for NT systems."""
|
|
|
|
platform = util.get_platform()
|
|
|
|
if platform == "win-amd64":
|
|
|
|
# the Visual C++ runtime files are installed in the x86 directory
|
|
|
|
progvar = "%ProgramFiles(x86)%"
|
|
|
|
architecture = "amd64"
|
|
|
|
elif platform == "win32":
|
|
|
|
progvar = "%ProgramFiles%"
|
|
|
|
architecture = "x86"
|
|
|
|
else:
|
|
|
|
raise ValueError("Unsupported platform %r" % platform)
|
|
|
|
return os.path.expandvars(progvar), architecture
|
|
|
|
|
|
|
|
|
2013-04-08 18:12:50 +00:00
|
|
|
class MyInstallLib (install_lib, object):
|
|
|
|
"""Custom library installation."""
|
|
|
|
|
|
|
|
def install (self):
|
|
|
|
"""Install the generated config file."""
|
|
|
|
outs = super(MyInstallLib, self).install()
|
|
|
|
infile = self.create_conf_file()
|
|
|
|
outfile = os.path.join(self.install_dir, os.path.basename(infile))
|
|
|
|
self.copy_file(infile, outfile)
|
|
|
|
outs.append(outfile)
|
|
|
|
return outs
|
|
|
|
|
|
|
|
def create_conf_file (self):
|
|
|
|
"""Create configuration file."""
|
|
|
|
cmd_obj = self.distribution.get_command_obj("install")
|
|
|
|
cmd_obj.ensure_finalized()
|
|
|
|
# we have to write a configuration file because we need the
|
|
|
|
# <install_data> directory (and other stuff like author, url, ...)
|
|
|
|
# all paths are made absolute by cnormpath()
|
|
|
|
data = []
|
|
|
|
for d in ['purelib', 'platlib', 'lib', 'headers', 'scripts', 'data']:
|
|
|
|
attr = 'install_%s' % d
|
|
|
|
if cmd_obj.root:
|
|
|
|
# cut off root path prefix
|
|
|
|
cutoff = len(cmd_obj.root)
|
|
|
|
# don't strip the path separator
|
|
|
|
if cmd_obj.root.endswith(os.sep):
|
|
|
|
cutoff -= 1
|
|
|
|
val = getattr(cmd_obj, attr)[cutoff:]
|
|
|
|
else:
|
|
|
|
val = getattr(cmd_obj, attr)
|
|
|
|
if attr == 'install_data':
|
2015-12-07 19:16:28 +00:00
|
|
|
cdir = os.path.join(val, "share", AppName)
|
2013-04-08 18:12:50 +00:00
|
|
|
data.append('config_dir = %r' % cnormpath(cdir))
|
|
|
|
elif attr == 'install_lib':
|
|
|
|
if cmd_obj.root:
|
|
|
|
_drive, tail = os.path.splitdrive(val)
|
|
|
|
if tail.startswith(os.sep):
|
|
|
|
tail = tail[1:]
|
|
|
|
self.install_lib = os.path.join(cmd_obj.root, tail)
|
|
|
|
else:
|
|
|
|
self.install_lib = val
|
|
|
|
data.append("%s = %r" % (attr, cnormpath(val)))
|
|
|
|
self.distribution.create_conf_file(data, directory=self.install_lib)
|
|
|
|
return self.get_conf_output()
|
|
|
|
|
|
|
|
def get_conf_output (self):
|
|
|
|
"""Get filename for distribution configuration file."""
|
|
|
|
return self.distribution.get_conf_filename(self.install_lib)
|
|
|
|
|
|
|
|
def get_outputs (self):
|
|
|
|
"""Add the generated config file to the list of outputs."""
|
|
|
|
outs = super(MyInstallLib, self).get_outputs()
|
2013-12-09 16:55:17 +00:00
|
|
|
conf_output = self.get_conf_output()
|
|
|
|
outs.append(conf_output)
|
|
|
|
if self.compile:
|
|
|
|
outs.extend(self._bytecode_filenames([conf_output]))
|
2013-04-08 18:12:50 +00:00
|
|
|
return outs
|
|
|
|
|
|
|
|
|
2012-05-18 18:49:43 +00:00
|
|
|
class MyDistribution (Distribution, object):
|
|
|
|
"""Custom distribution class generating config file."""
|
|
|
|
|
|
|
|
def __init__ (self, attrs):
|
|
|
|
"""Set console and windows scripts."""
|
|
|
|
super(MyDistribution, self).__init__(attrs)
|
|
|
|
self.console = ['patool']
|
|
|
|
|
2013-04-08 18:12:50 +00:00
|
|
|
def run_commands (self):
|
|
|
|
"""Generate config file and run commands."""
|
|
|
|
cwd = os.getcwd()
|
|
|
|
data = []
|
|
|
|
data.append('config_dir = %r' % os.path.join(cwd, "config"))
|
|
|
|
data.append("install_data = %r" % cwd)
|
|
|
|
data.append("install_scripts = %r" % cwd)
|
|
|
|
self.create_conf_file(data)
|
|
|
|
super(MyDistribution, self).run_commands()
|
|
|
|
|
|
|
|
def get_conf_filename (self, directory):
|
|
|
|
"""Get name for config file."""
|
|
|
|
return os.path.join(directory, "_%s_configdata.py" % self.get_name())
|
|
|
|
|
|
|
|
def create_conf_file (self, data, directory=None):
|
|
|
|
"""Create local config file from given data (list of lines) in
|
|
|
|
the directory (or current directory if not given)."""
|
|
|
|
data.insert(0, "# this file is automatically created by setup.py")
|
|
|
|
data.insert(0, "# -*- coding: iso-8859-1 -*-")
|
|
|
|
if directory is None:
|
|
|
|
directory = os.getcwd()
|
|
|
|
filename = self.get_conf_filename(directory)
|
|
|
|
# add metadata
|
|
|
|
metanames = ("name", "version", "author", "author_email",
|
|
|
|
"maintainer", "maintainer_email", "url",
|
|
|
|
"license", "description", "long_description",
|
|
|
|
"keywords", "platforms", "fullname", "contact",
|
|
|
|
"contact_email")
|
|
|
|
for name in metanames:
|
|
|
|
method = "get_" + name
|
|
|
|
val = getattr(self.metadata, method)()
|
|
|
|
data.append("%s = %r" % (name, val))
|
|
|
|
data.append('release_date = "%s"' % get_release_date())
|
|
|
|
# write the config file
|
|
|
|
util.execute(write_file, (filename, data),
|
|
|
|
"creating %s" % filename, self.verbose >= 1, self.dry_run)
|
|
|
|
|
2012-05-18 18:49:43 +00:00
|
|
|
|
2012-05-23 19:32:07 +00:00
|
|
|
args = dict(
|
2010-02-21 11:14:57 +00:00
|
|
|
name = AppName,
|
|
|
|
version = AppVersion,
|
2013-03-28 18:42:32 +00:00
|
|
|
description = "portable archive file manager",
|
2013-02-26 19:42:05 +00:00
|
|
|
long_description = """Various archive formats can be created, extracted, tested, listed,
|
|
|
|
searched, compared and repacked by patool. The advantage of patool
|
|
|
|
is its simplicity in handling archive files without having to remember
|
|
|
|
a myriad of programs and options.
|
2010-03-04 19:06:13 +00:00
|
|
|
|
|
|
|
The archive format is determined by the file(1) program and as a
|
|
|
|
fallback by the archive file extension.
|
|
|
|
|
2012-08-03 20:26:40 +00:00
|
|
|
patool supports 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape),
|
|
|
|
AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2),
|
2013-03-12 06:28:24 +00:00
|
|
|
CAB (.cab), COMPRESS (.Z), CPIO (.cpio),
|
2013-02-27 18:38:07 +00:00
|
|
|
DEB (.deb), DMS (.dms), FLAC (.flac), GZIP (.gz), ISO (.iso), LRZIP (.lrz),
|
2012-05-17 19:22:56 +00:00
|
|
|
LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm),
|
2014-09-22 21:16:21 +00:00
|
|
|
RAR (.rar), RZIP (.rz), SHN (.shn), TAR (.tar), XZ (.xz), ZIP (.zip, .jar),
|
|
|
|
ZOO (.zoo) and ZPAQ (.zpaq) formats.
|
2012-05-17 12:28:12 +00:00
|
|
|
It relies on helper applications to handle those archive formats
|
|
|
|
(for example bzip2 for BZIP2 archives).
|
2012-05-12 07:05:20 +00:00
|
|
|
|
2013-03-12 06:28:24 +00:00
|
|
|
The archive formats TAR, ZIP, BZIP2 and GZIP
|
2012-05-12 07:05:20 +00:00
|
|
|
are supported natively and do not require helper applications to be
|
|
|
|
installed.
|
|
|
|
""",
|
2010-02-21 11:14:57 +00:00
|
|
|
author = MyName,
|
|
|
|
author_email = MyEmail,
|
|
|
|
maintainer = MyName,
|
|
|
|
maintainer_email = MyEmail,
|
|
|
|
license = "GPL",
|
2013-04-09 17:30:31 +00:00
|
|
|
url = "http://wummel.github.io/patool/",
|
2010-02-21 15:00:51 +00:00
|
|
|
packages = ['patoolib', 'patoolib.programs'],
|
2010-03-01 15:01:23 +00:00
|
|
|
data_files = data_files,
|
2010-02-21 11:14:57 +00:00
|
|
|
scripts = ['patool'],
|
2013-03-28 18:42:32 +00:00
|
|
|
keywords = "archiver,archive,compression,commandline,manager",
|
2010-03-04 16:16:34 +00:00
|
|
|
classifiers = [
|
|
|
|
'Environment :: Console',
|
|
|
|
'Topic :: System :: Archiving',
|
2013-02-25 20:04:02 +00:00
|
|
|
'Development Status :: 5 - Production/Stable',
|
2010-03-04 16:16:34 +00:00
|
|
|
'License :: OSI Approved :: GNU General Public License (GPL)',
|
2015-12-08 21:01:56 +00:00
|
|
|
'Programming Language :: Python :: 2',
|
2015-12-05 11:24:40 +00:00
|
|
|
'Programming Language :: Python :: 2.7',
|
2015-12-08 21:01:56 +00:00
|
|
|
'Programming Language :: Python :: 3',
|
2015-12-05 11:24:40 +00:00
|
|
|
'Programming Language :: Python :: 3.3',
|
2015-12-08 21:01:56 +00:00
|
|
|
'Programming Language :: Python :: 3.4',
|
|
|
|
'Programming Language :: Python :: 3.5',
|
2010-03-04 16:16:34 +00:00
|
|
|
'Operating System :: OS Independent',
|
|
|
|
],
|
2012-05-18 18:49:43 +00:00
|
|
|
distclass = MyDistribution,
|
|
|
|
cmdclass = {
|
2013-04-08 18:12:50 +00:00
|
|
|
'install_lib': MyInstallLib,
|
2012-05-18 18:49:43 +00:00
|
|
|
},
|
2010-02-21 11:14:57 +00:00
|
|
|
)
|
2012-05-23 19:32:07 +00:00
|
|
|
setup(**args)
|