bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
45
by Martin Pool
 - add setup.py and install instructions  | 
1  | 
#! /usr/bin/env python
 | 
2  | 
||
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
3  | 
"""Installation script for bzr.
 | 
4  | 
Run it with
 | 
|
5  | 
 './setup.py install', or
 | 
|
6  | 
 './setup.py --help' for more options
 | 
|
7  | 
"""
 | 
|
8  | 
||
| 
1930.3.1
by John Arbash Meinel
 Change setup.py to auto-generate the list of packages to install  | 
9  | 
import os  | 
| 
3185.1.7
by Martin Pool
 Always take README text from the right directory (thanks jam)  | 
10  | 
import os.path  | 
| 
1930.3.1
by John Arbash Meinel
 Change setup.py to auto-generate the list of packages to install  | 
11  | 
import sys  | 
12  | 
||
| 
3260.1.2
by Alexander Belchenko
 use sys.version_info  | 
13  | 
if sys.version_info < (2, 4):  | 
| 
3260.1.1
by Alexander Belchenko
 setup.py script explicitly checks for Python version. (#200569)  | 
14  | 
sys.stderr.write("[ERROR] Not a supported Python version. Need 2.4+\n")  | 
15  | 
sys.exit(1)  | 
|
16  | 
||
| 
3185.1.7
by Martin Pool
 Always take README text from the right directory (thanks jam)  | 
17  | 
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
 | 
18  | 
# './setup.py' or the equivalent with another path, should always be at the
 | 
|
19  | 
# start of the path, so this should find the right one...
 | 
|
| 
1861.2.21
by Alexander Belchenko
 setup.py: automatically grab version info from bzrlib  | 
20  | 
import bzrlib  | 
21  | 
||
| 
3185.1.7
by Martin Pool
 Always take README text from the right directory (thanks jam)  | 
22  | 
def get_long_description():  | 
23  | 
dirname = os.path.dirname(__file__)  | 
|
24  | 
readme = os.path.join(dirname, 'README')  | 
|
25  | 
f = open(readme, 'rb')  | 
|
26  | 
try:  | 
|
27  | 
return f.read()  | 
|
28  | 
finally:  | 
|
29  | 
f.close()  | 
|
30  | 
||
31  | 
||
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
32  | 
##
 | 
33  | 
# META INFORMATION FOR SETUP
 | 
|
| 
3185.1.2
by Martin Pool
 Add more metadata to setup.py (#183391)  | 
34  | 
# see http://docs.python.org/dist/meta-data.html
 | 
35  | 
META_INFO = {  | 
|
36  | 
'name': 'bzr',  | 
|
37  | 
'version': bzrlib.__version__,  | 
|
38  | 
'author': 'Canonical Ltd',  | 
|
39  | 
'author_email': 'bazaar@lists.canonical.com',  | 
|
40  | 
'url': 'http://www.bazaar-vcs.org/',  | 
|
41  | 
'description': 'Friendly distributed version control system',  | 
|
42  | 
'license': 'GNU GPL v2',  | 
|
43  | 
'download_url': 'http://bazaar-vcs.org/Download',  | 
|
| 
3185.1.7
by Martin Pool
 Always take README text from the right directory (thanks jam)  | 
44  | 
'long_description': get_long_description(),  | 
| 
3185.1.2
by Martin Pool
 Add more metadata to setup.py (#183391)  | 
45  | 
'classifiers': [  | 
46  | 
'Development Status :: 6 - Mature',  | 
|
47  | 
'Environment :: Console',  | 
|
48  | 
'Intended Audience :: Developers',  | 
|
49  | 
'Intended Audience :: System Administrators',  | 
|
50  | 
'License :: OSI Approved :: GNU General Public License (GPL)',  | 
|
51  | 
'Operating System :: Microsoft :: Windows',  | 
|
52  | 
'Operating System :: OS Independent',  | 
|
53  | 
'Operating System :: POSIX',  | 
|
54  | 
'Programming Language :: Python',  | 
|
55  | 
'Programming Language :: C',  | 
|
56  | 
'Topic :: Software Development :: Version Control',  | 
|
57  | 
        ],
 | 
|
58  | 
    }
 | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
59  | 
|
| 
1930.3.3
by John Arbash Meinel
 Fix a stupid error in code declaration order  | 
60  | 
# The list of packages is automatically generated later. Add other things
 | 
61  | 
# that are part of BZRLIB here.
 | 
|
62  | 
BZRLIB = {}  | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
63  | 
|
| 
1911.1.1
by Alexander Belchenko
 setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data  | 
64  | 
PKG_DATA = {# install files from selftest suite  | 
65  | 
'package_data': {'bzrlib': ['doc/api/*.txt',  | 
|
66  | 
'tests/test_patches_data/*',  | 
|
| 
3089.3.6
by Ian Clatworthy
 make help topics more discoverable  | 
67  | 
'help_topics/en/*.txt',  | 
| 
1911.1.1
by Alexander Belchenko
 setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data  | 
68  | 
                                       ]},
 | 
69  | 
           }
 | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
70  | 
|
| 
1185.29.5
by Wouter van Heyst
 Add reinvocation code to ensure setup.py is run by python2.4  | 
71  | 
|
| 
1930.3.1
by John Arbash Meinel
 Change setup.py to auto-generate the list of packages to install  | 
72  | 
def get_bzrlib_packages():  | 
73  | 
"""Recurse through the bzrlib directory, and extract the package names"""  | 
|
74  | 
||
75  | 
packages = []  | 
|
76  | 
base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))  | 
|
77  | 
for root, dirs, files in os.walk(base_path):  | 
|
78  | 
if '__init__.py' in files:  | 
|
79  | 
assert root.startswith(base_path)  | 
|
80  | 
            # Get just the path below bzrlib
 | 
|
81  | 
package_path = root[len(base_path):]  | 
|
82  | 
            # Remove leading and trailing slashes
 | 
|
83  | 
package_path = package_path.strip('\\/')  | 
|
84  | 
if not package_path:  | 
|
85  | 
package_name = 'bzrlib'  | 
|
86  | 
else:  | 
|
87  | 
package_name = ('bzrlib.' +  | 
|
88  | 
package_path.replace('/', '.').replace('\\', '.'))  | 
|
89  | 
packages.append(package_name)  | 
|
90  | 
return sorted(packages)  | 
|
91  | 
||
92  | 
||
| 
1930.3.3
by John Arbash Meinel
 Fix a stupid error in code declaration order  | 
93  | 
BZRLIB['packages'] = get_bzrlib_packages()  | 
94  | 
||
95  | 
||
| 
45
by Martin Pool
 - add setup.py and install instructions  | 
96  | 
from distutils.core import setup  | 
| 
1185.23.1
by Aaron Bentley
 win32 setup fixes from Belchenko  | 
97  | 
from distutils.command.install_scripts import install_scripts  | 
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
98  | 
from distutils.command.install_data import install_data  | 
| 
1185.29.3
by Wouter van Heyst
 Create bzr.1 manpage from setup.py  | 
99  | 
from distutils.command.build import build  | 
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
100  | 
|
101  | 
###############################
 | 
|
102  | 
# Overridden distutils actions
 | 
|
103  | 
###############################
 | 
|
104  | 
||
| 
1185.23.1
by Aaron Bentley
 win32 setup fixes from Belchenko  | 
105  | 
class my_install_scripts(install_scripts):  | 
106  | 
""" Customized install_scripts distutils action.  | 
|
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
107  | 
    Create bzr.bat for win32.
 | 
108  | 
    """
 | 
|
109  | 
def run(self):  | 
|
| 
1185.23.1
by Aaron Bentley
 win32 setup fixes from Belchenko  | 
110  | 
install_scripts.run(self) # standard action  | 
111  | 
||
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
112  | 
if sys.platform == "win32":  | 
| 
1185.23.1
by Aaron Bentley
 win32 setup fixes from Belchenko  | 
113  | 
try:  | 
| 
2662.1.1
by Alexander Belchenko
 allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)  | 
114  | 
scripts_dir = os.path.join(sys.prefix, 'Scripts')  | 
| 
1861.2.10
by Alexander Belchenko
 setup.py: improved bzr.bat creation  | 
115  | 
script_path = self._quoted_path(os.path.join(scripts_dir,  | 
116  | 
"bzr"))  | 
|
117  | 
python_exe = self._quoted_path(sys.executable)  | 
|
118  | 
args = self._win_batch_args()  | 
|
119  | 
batch_str = "@%s %s %s" % (python_exe, script_path, args)  | 
|
| 
2662.1.1
by Alexander Belchenko
 allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)  | 
120  | 
batch_path = os.path.join(self.install_dir, "bzr.bat")  | 
| 
1185.23.1
by Aaron Bentley
 win32 setup fixes from Belchenko  | 
121  | 
f = file(batch_path, "w")  | 
122  | 
f.write(batch_str)  | 
|
123  | 
f.close()  | 
|
124  | 
print "Created:", batch_path  | 
|
125  | 
except Exception, e:  | 
|
126  | 
print "ERROR: Unable to create %s: %s" % (batch_path, e)  | 
|
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
127  | 
|
| 
1861.2.10
by Alexander Belchenko
 setup.py: improved bzr.bat creation  | 
128  | 
def _quoted_path(self, path):  | 
129  | 
if ' ' in path:  | 
|
130  | 
return '"' + path + '"'  | 
|
131  | 
else:  | 
|
132  | 
return path  | 
|
133  | 
||
134  | 
def _win_batch_args(self):  | 
|
| 
2245.4.4
by Alexander Belchenko
 setup.py: fix plain 'python setup.py install' for win98  | 
135  | 
from bzrlib.win32utils import winver  | 
136  | 
if winver == 'Windows NT':  | 
|
| 
1861.2.10
by Alexander Belchenko
 setup.py: improved bzr.bat creation  | 
137  | 
return '%*'  | 
138  | 
else:  | 
|
139  | 
return '%1 %2 %3 %4 %5 %6 %7 %8 %9'  | 
|
140  | 
#/class my_install_scripts
 | 
|
141  | 
||
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
142  | 
|
| 
1185.29.3
by Wouter van Heyst
 Create bzr.1 manpage from setup.py  | 
143  | 
class bzr_build(build):  | 
144  | 
"""Customized build distutils action.  | 
|
145  | 
    Generate bzr.1.
 | 
|
146  | 
    """
 | 
|
147  | 
def run(self):  | 
|
148  | 
build.run(self)  | 
|
149  | 
||
| 
1551.3.11
by Aaron Bentley
 Merge from Robert  | 
150  | 
import generate_docs  | 
151  | 
generate_docs.main(argv=["bzr", "man"])  | 
|
| 
1185.29.3
by Wouter van Heyst
 Create bzr.1 manpage from setup.py  | 
152  | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
153  | 
|
| 
1185.1.40
by Robert Collins
 Merge what applied of Alexander Belchenko's win32 patch.  | 
154  | 
########################
 | 
155  | 
## Setup
 | 
|
156  | 
########################
 | 
|
157  | 
||
| 
1739.1.1
by Robert Collins
 First cut at adding pyrex facilities.  | 
158  | 
command_classes = {'install_scripts': my_install_scripts,  | 
| 
2571.3.1
by Alexander Belchenko
 Building Python-based installer for bot Python 2.4 and 2.5  | 
159  | 
'build': bzr_build}  | 
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
160  | 
from distutils import log  | 
| 
2814.4.2
by Alexander Belchenko
 support for win32  | 
161  | 
from distutils.errors import CCompilerError, DistutilsPlatformError  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
162  | 
from distutils.extension import Extension  | 
| 
1739.1.1
by Robert Collins
 First cut at adding pyrex facilities.  | 
163  | 
ext_modules = []  | 
164  | 
try:  | 
|
165  | 
from Pyrex.Distutils import build_ext  | 
|
166  | 
except ImportError:  | 
|
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
167  | 
have_pyrex = False  | 
| 
1739.1.1
by Robert Collins
 First cut at adding pyrex facilities.  | 
168  | 
    # try to build the extension from the prior generated source.
 | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
169  | 
    print
 | 
| 
2617.1.2
by John Arbash Meinel
 Try another form of comment  | 
170  | 
print ("The python package 'Pyrex' is not available."  | 
171  | 
" If the .c files are available,")  | 
|
172  | 
print ("they will be built,"  | 
|
173  | 
" but modifying the .pyx files will not rebuild them.")  | 
|
| 
2617.1.3
by John Arbash Meinel
 Add another blank line to make it show up better  | 
174  | 
    print
 | 
| 
1739.1.4
by Robert Collins
 Fix building of C modules without pyrex installed.  | 
175  | 
from distutils.command.build_ext import build_ext  | 
| 
1739.1.1
by Robert Collins
 First cut at adding pyrex facilities.  | 
176  | 
else:  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
177  | 
have_pyrex = True  | 
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
178  | 
|
179  | 
||
180  | 
class build_ext_if_possible(build_ext):  | 
|
181  | 
||
| 
2814.4.2
by Alexander Belchenko
 support for win32  | 
182  | 
def run(self):  | 
183  | 
try:  | 
|
184  | 
build_ext.run(self)  | 
|
185  | 
except DistutilsPlatformError, e:  | 
|
| 
2814.4.4
by Alexander Belchenko
 changes suggested by Aaron and Martin  | 
186  | 
log.warn(str(e))  | 
| 
2814.4.5
by Alexander Belchenko
 double quotes for extension name  | 
187  | 
log.warn('Extensions cannot be built, '  | 
188  | 
'will use the Python versions instead')  | 
|
| 
2814.4.2
by Alexander Belchenko
 support for win32  | 
189  | 
|
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
190  | 
def build_extension(self, ext):  | 
191  | 
try:  | 
|
192  | 
build_ext.build_extension(self, ext)  | 
|
193  | 
except CCompilerError:  | 
|
| 
2814.4.5
by Alexander Belchenko
 double quotes for extension name  | 
194  | 
log.warn('Building of "%s" extension failed, '  | 
195  | 
'will use the Python version instead' % (ext.name,))  | 
|
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
196  | 
|
197  | 
||
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
198  | 
# Override the build_ext if we have Pyrex available
 | 
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
199  | 
command_classes['build_ext'] = build_ext_if_possible  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
200  | 
unavailable_files = []  | 
201  | 
||
| 
2617.1.2
by John Arbash Meinel
 Try another form of comment  | 
202  | 
|
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
203  | 
def add_pyrex_extension(module_name, **kwargs):  | 
204  | 
"""Add a pyrex module to build.  | 
|
205  | 
||
206  | 
    This will use Pyrex to auto-generate the .c file if it is available.
 | 
|
207  | 
    Otherwise it will fall back on the .c file. If the .c file is not
 | 
|
208  | 
    available, it will warn, and not add anything.
 | 
|
209  | 
||
210  | 
    You can pass any extra options to Extension through kwargs. One example is
 | 
|
211  | 
    'libraries = []'.
 | 
|
212  | 
||
213  | 
    :param module_name: The python path to the module. This will be used to
 | 
|
214  | 
        determine the .pyx and .c files to use.
 | 
|
215  | 
    """
 | 
|
216  | 
path = module_name.replace('.', '/')  | 
|
217  | 
pyrex_name = path + '.pyx'  | 
|
218  | 
c_name = path + '.c'  | 
|
219  | 
if have_pyrex:  | 
|
| 
3557.2.7
by Alexander Belchenko
 Pass extra arguments for extensions, and supply WIN32 macro for pyrex.  | 
220  | 
ext_modules.append(Extension(module_name, [pyrex_name], **kwargs))  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
221  | 
else:  | 
222  | 
if not os.path.isfile(c_name):  | 
|
223  | 
unavailable_files.append(c_name)  | 
|
224  | 
else:  | 
|
| 
3557.2.7
by Alexander Belchenko
 Pass extra arguments for extensions, and supply WIN32 macro for pyrex.  | 
225  | 
ext_modules.append(Extension(module_name, [c_name], **kwargs))  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
226  | 
|
227  | 
||
| 
2474.1.71
by John Arbash Meinel
 [merge] bzr.dev 2625  | 
228  | 
add_pyrex_extension('bzrlib._dirstate_helpers_c')  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
229  | 
add_pyrex_extension('bzrlib._knit_load_data_c')  | 
| 
3504.4.3
by John Arbash Meinel
 Start working on an extension specifically for win32,  | 
230  | 
if sys.platform == 'win32':  | 
| 
3557.2.7
by Alexander Belchenko
 Pass extra arguments for extensions, and supply WIN32 macro for pyrex.  | 
231  | 
    # pyrex uses the macro WIN32 to detect the platform, even though it should
 | 
232  | 
    # be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
 | 
|
233  | 
    # right value.
 | 
|
234  | 
add_pyrex_extension('bzrlib._walkdirs_win32',  | 
|
| 
3557.2.9
by John Arbash Meinel
 Alexander noticed I typed macro instead of macros.  | 
235  | 
define_macros=[('WIN32', None)])  | 
| 
2781.1.1
by Martin Pool
 merge cpatiencediff from Lukas  | 
236  | 
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))  | 
| 
2617.1.1
by John Arbash Meinel
 Update setup.py to just skip extensions that are not available.  | 
237  | 
|
238  | 
||
239  | 
if unavailable_files:  | 
|
240  | 
print 'C extension(s) not found:'  | 
|
241  | 
print ' %s' % ('\n '.join(unavailable_files),)  | 
|
242  | 
print 'The python versions will be used instead.'  | 
|
243  | 
    print
 | 
|
244  | 
||
| 
3565.5.9
by Mark Hammond
 Address John's review comments  | 
245  | 
|
| 
3565.5.6
by Mark Hammond
 move tbzr and qbzr py2exe config code into their own functions.  | 
246  | 
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,  | 
247  | 
gui_targets):  | 
|
248  | 
packages.append('tbzrcommands')  | 
|
249  | 
||
250  | 
    # ModuleFinder can't handle runtime changes to __path__, but
 | 
|
251  | 
    # win32com uses them.  Hook this in so win32com.shell is found.
 | 
|
252  | 
import modulefinder  | 
|
253  | 
import win32com  | 
|
254  | 
for p in win32com.__path__[1:]:  | 
|
255  | 
modulefinder.AddPackagePath("win32com", p)  | 
|
256  | 
for extra in ["win32com.shell"]:  | 
|
257  | 
__import__(extra)  | 
|
258  | 
m = sys.modules[extra]  | 
|
259  | 
for p in m.__path__[1:]:  | 
|
260  | 
modulefinder.AddPackagePath(extra, p)  | 
|
261  | 
||
262  | 
    # TBZR points to the TBZR directory
 | 
|
263  | 
tbzr_root = os.environ["TBZR"]  | 
|
264  | 
||
265  | 
    # Ensure tbzrlib itself is on sys.path
 | 
|
266  | 
sys.path.append(tbzr_root)  | 
|
267  | 
||
268  | 
    # Ensure our COM "entry-point" is on sys.path
 | 
|
269  | 
sys.path.append(os.path.join(tbzr_root, "shellext", "python"))  | 
|
270  | 
||
271  | 
packages.append("tbzrlib")  | 
|
272  | 
excludes.extend("""pywin pywin.dialogs pywin.dialogs.list  | 
|
273  | 
win32ui crawler.Crawler""".split())  | 
|
274  | 
||
275  | 
tbzr = dict(  | 
|
276  | 
modules=["tbzr"],  | 
|
277  | 
create_exe = False, # we only want a .dll  | 
|
278  | 
    )
 | 
|
279  | 
com_targets.append(tbzr)  | 
|
280  | 
||
281  | 
    # tbzrcache executables - a "console" version for debugging and a
 | 
|
282  | 
    # GUI version that is generally used.
 | 
|
283  | 
tbzrcache = dict(  | 
|
284  | 
script = os.path.join(tbzr_root, "Scripts", "tbzrcache.py"),  | 
|
285  | 
icon_resources = [(0,'bzr.ico')],  | 
|
286  | 
    )
 | 
|
287  | 
console_targets.append(tbzrcache)  | 
|
288  | 
||
289  | 
    # Make a windows version which is the same except for the base name.
 | 
|
290  | 
tbzrcachew = tbzrcache.copy()  | 
|
291  | 
tbzrcachew["dest_base"]="tbzrcachew"  | 
|
292  | 
gui_targets.append(tbzrcachew)  | 
|
293  | 
||
294  | 
    # ditto for the tbzrcommand tool
 | 
|
295  | 
tbzrcommand = dict(  | 
|
296  | 
script = os.path.join(tbzr_root, "Scripts", "tbzrcommand.py"),  | 
|
297  | 
icon_resources = [(0,'bzr.ico')],  | 
|
298  | 
    )
 | 
|
299  | 
console_targets.append(tbzrcommand)  | 
|
300  | 
tbzrcommandw = tbzrcommand.copy()  | 
|
301  | 
tbzrcommandw["dest_base"]="tbzrcommandw"  | 
|
302  | 
gui_targets.append(tbzrcommandw)  | 
|
303  | 
||
304  | 
    # tbzr tests
 | 
|
305  | 
tbzrtest = dict(  | 
|
306  | 
script = os.path.join(tbzr_root, "Scripts", "tbzrtest.py"),  | 
|
307  | 
    )
 | 
|
308  | 
console_targets.append(tbzrtest)  | 
|
309  | 
||
310  | 
    # A utility to see python output from the shell extension - this will
 | 
|
311  | 
    # die when we get a c++ extension
 | 
|
312  | 
    # any .py file from pywin32's win32 lib will do (other than
 | 
|
313  | 
    # win32traceutil itself that is)
 | 
|
314  | 
import winerror  | 
|
315  | 
win32_lib_dir = os.path.dirname(winerror.__file__)  | 
|
316  | 
tracer = dict(script = os.path.join(win32_lib_dir, "win32traceutil.py"),  | 
|
317  | 
dest_base="tbzr_tracer")  | 
|
318  | 
console_targets.append(tracer)  | 
|
319  | 
||
| 
3565.5.9
by Mark Hammond
 Address John's review comments  | 
320  | 
|
| 
3565.5.6
by Mark Hammond
 move tbzr and qbzr py2exe config code into their own functions.  | 
321  | 
def get_qbzr_py2exe_info(includes, excludes, packages):  | 
322  | 
    # PyQt4 itself still escapes the plugin detection code for some reason...
 | 
|
323  | 
packages.append('PyQt4')  | 
|
324  | 
excludes.append('PyQt4.elementtree.ElementTree')  | 
|
325  | 
includes.append('sip') # extension module required for Qt.  | 
|
326  | 
packages.append('pygments') # colorizer for qbzr  | 
|
327  | 
    # but we can avoid many Qt4 Dlls.
 | 
|
328  | 
dll_excludes.extend(  | 
|
329  | 
"""QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll  | 
|
330  | 
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
 | 
|
331  | 
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
 | 
|
332  | 
qscintilla2.dll""".split())  | 
|
333  | 
    # the qt binaries might not be on PATH...
 | 
|
334  | 
qt_dir = os.path.join(sys.prefix, "PyQt4", "bin")  | 
|
335  | 
path = os.environ.get("PATH","")  | 
|
336  | 
if qt_dir.lower() not in [p.lower() for p in path.split(os.pathsep)]:  | 
|
337  | 
os.environ["PATH"] = path + os.pathsep + qt_dir  | 
|
338  | 
||
| 
1739.1.1
by Robert Collins
 First cut at adding pyrex facilities.  | 
339  | 
|
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
340  | 
if 'bdist_wininst' in sys.argv:  | 
| 
2691.1.18
by Alexander Belchenko
 teach windows python installer to find docs in all subdirectories  | 
341  | 
def find_docs():  | 
342  | 
docs = []  | 
|
343  | 
for root, dirs, files in os.walk('doc'):  | 
|
344  | 
r = []  | 
|
345  | 
for f in files:  | 
|
| 
3224.2.1
by Alexander Belchenko
 (bialix) Include quick-start-summary.svg file to python-based installer for Windows (bug #192924)  | 
346  | 
if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')  | 
347  | 
or f == 'quick-start-summary.svg'):  | 
|
| 
2691.1.18
by Alexander Belchenko
 teach windows python installer to find docs in all subdirectories  | 
348  | 
r.append(os.path.join(root, f))  | 
349  | 
if r:  | 
|
350  | 
relative = root[4:]  | 
|
351  | 
if relative:  | 
|
352  | 
target = os.path.join('Doc\\Bazaar', relative)  | 
|
353  | 
else:  | 
|
354  | 
target = 'Doc\\Bazaar'  | 
|
355  | 
docs.append((target, r))  | 
|
356  | 
return docs  | 
|
357  | 
||
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
358  | 
    # python's distutils-based win32 installer
 | 
359  | 
ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],  | 
|
| 
2571.3.1
by Alexander Belchenko
 Building Python-based installer for bot Python 2.4 and 2.5  | 
360  | 
'ext_modules': ext_modules,  | 
| 
1860.1.3
by Alexander Belchenko
 python-installer:  | 
361  | 
            # help pages
 | 
| 
2691.1.18
by Alexander Belchenko
 teach windows python installer to find docs in all subdirectories  | 
362  | 
'data_files': find_docs(),  | 
| 
2571.3.1
by Alexander Belchenko
 Building Python-based installer for bot Python 2.4 and 2.5  | 
363  | 
            # for building pyrex extensions
 | 
| 
2814.4.1
by Lukáš Lalinský
 Don't abort ``python setup.py install`` if building of a C extension is not possible.  | 
364  | 
'cmdclass': {'build_ext': build_ext_if_possible},  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
365  | 
           }
 | 
| 
1821.1.2
by Alexander Belchenko
 resurrected python's distutils based installer for win32  | 
366  | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
367  | 
ARGS.update(META_INFO)  | 
368  | 
ARGS.update(BZRLIB)  | 
|
| 
1911.1.1
by Alexander Belchenko
 setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data  | 
369  | 
ARGS.update(PKG_DATA)  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
370  | 
|
371  | 
setup(**ARGS)  | 
|
372  | 
||
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
373  | 
elif 'py2exe' in sys.argv:  | 
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
374  | 
import glob  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
375  | 
    # py2exe setup
 | 
376  | 
import py2exe  | 
|
377  | 
||
378  | 
    # pick real bzr version
 | 
|
379  | 
import bzrlib  | 
|
380  | 
||
381  | 
version_number = []  | 
|
382  | 
for i in bzrlib.version_info[:4]:  | 
|
383  | 
try:  | 
|
384  | 
i = int(i)  | 
|
385  | 
except ValueError:  | 
|
386  | 
i = 0  | 
|
387  | 
version_number.append(str(i))  | 
|
388  | 
version_str = '.'.join(version_number)  | 
|
389  | 
||
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
390  | 
    # An override to install_data used only by py2exe builds, which arranges
 | 
391  | 
    # to byte-compile any .py files in data_files (eg, our plugins)
 | 
|
392  | 
    # Necessary as we can't rely on the user having the relevant permissions
 | 
|
393  | 
    # to the "Program Files" directory to generate them on the fly.
 | 
|
394  | 
class install_data_with_bytecompile(install_data):  | 
|
395  | 
def run(self):  | 
|
396  | 
from distutils.util import byte_compile  | 
|
397  | 
||
398  | 
install_data.run(self)  | 
|
399  | 
||
400  | 
py2exe = self.distribution.get_command_obj('py2exe', False)  | 
|
401  | 
optimize = py2exe.optimize  | 
|
402  | 
compile_names = [f for f in self.outfiles if f.endswith('.py')]  | 
|
403  | 
byte_compile(compile_names,  | 
|
404  | 
optimize=optimize,  | 
|
405  | 
force=self.force, prefix=self.install_dir,  | 
|
406  | 
dry_run=self.dry_run)  | 
|
407  | 
if optimize:  | 
|
408  | 
suffix = 'o'  | 
|
409  | 
else:  | 
|
410  | 
suffix = 'c'  | 
|
411  | 
self.outfiles.extend([f + suffix for f in compile_names])  | 
|
412  | 
    # end of class install_data_with_bytecompile
 | 
|
413  | 
||
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
414  | 
target = py2exe.build_exe.Target(script = "bzr",  | 
415  | 
dest_base = "bzr",  | 
|
416  | 
icon_resources = [(0,'bzr.ico')],  | 
|
417  | 
name = META_INFO['name'],  | 
|
418  | 
version = version_str,  | 
|
419  | 
description = META_INFO['description'],  | 
|
420  | 
author = META_INFO['author'],  | 
|
| 
2232.1.1
by mbp at sourcefrog
 update global copyright to 2007  | 
421  | 
copyright = "(c) Canonical Ltd, 2005-2007",  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
422  | 
company_name = "Canonical Ltd.",  | 
423  | 
comments = META_INFO['description'],  | 
|
424  | 
                                    )
 | 
|
| 
2231.1.1
by Alexander Belchenko
 Python 2.5 fixes for win32 installer  | 
425  | 
|
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
426  | 
packages = BZRLIB['packages']  | 
427  | 
packages.remove('bzrlib')  | 
|
428  | 
packages = [i for i in packages if not i.startswith('bzrlib.plugins')]  | 
|
429  | 
includes = []  | 
|
430  | 
for i in glob.glob('bzrlib\\*.py'):  | 
|
431  | 
module = i[:-3].replace('\\', '.')  | 
|
| 
3193.7.9
by Alexander Belchenko
 Ian's review  | 
432  | 
if module.endswith('__init__'):  | 
433  | 
module = module[:-len('__init__')]  | 
|
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
434  | 
includes.append(module)  | 
435  | 
||
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
436  | 
additional_packages = set()  | 
| 
2231.1.1
by Alexander Belchenko
 Python 2.5 fixes for win32 installer  | 
437  | 
if sys.version.startswith('2.4'):  | 
438  | 
        # adding elementtree package
 | 
|
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
439  | 
additional_packages.add('elementtree')  | 
| 
2234.5.2
by Wouter van Heyst
 (Alexander Belchenko) add windows installer check for python2.5  | 
440  | 
elif sys.version.startswith('2.5'):  | 
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
441  | 
additional_packages.add('xml.etree')  | 
| 
2234.5.2
by Wouter van Heyst
 (Alexander Belchenko) add windows installer check for python2.5  | 
442  | 
else:  | 
443  | 
import warnings  | 
|
444  | 
warnings.warn('Unknown Python version.\n'  | 
|
445  | 
'Please check setup.py script for compatibility.')  | 
|
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
446  | 
|
447  | 
    # Although we currently can't enforce it, we consider it an error for
 | 
|
448  | 
    # py2exe to report any files are "missing".  Such modules we know aren't
 | 
|
449  | 
    # used should be listed here.
 | 
|
450  | 
excludes = """Tkinter psyco ElementPath r_hmac  | 
|
451  | 
                  ImaginaryModule cElementTree elementtree.ElementTree
 | 
|
452  | 
                  Crypto.PublicKey._fastmath
 | 
|
453  | 
                  medusa medusa.filesys medusa.ftp_server
 | 
|
454  | 
                  tools tools.doc_generate
 | 
|
455  | 
resource validate""".split()  | 
|
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
456  | 
dll_excludes = []  | 
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
457  | 
|
| 
2571.3.2
by Alexander Belchenko
 Build pyrex/C extensions for bzr.exe  | 
458  | 
    # email package from std python library use lazy import,
 | 
459  | 
    # so we need to explicitly add all package
 | 
|
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
460  | 
additional_packages.add('email')  | 
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
461  | 
    # And it uses funky mappings to conver to 'Oldname' to 'newname'.  As
 | 
462  | 
    # a result, packages like 'email.Parser' show as missing.  Tell py2exe
 | 
|
463  | 
    # to exclude them.
 | 
|
464  | 
import email  | 
|
465  | 
for oldname in getattr(email, '_LOWERNAMES', []):  | 
|
466  | 
excludes.append("email." + oldname)  | 
|
467  | 
for oldname in getattr(email, '_MIMENAMES', []):  | 
|
468  | 
excludes.append("email.MIME" + oldname)  | 
|
| 
2231.1.1
by Alexander Belchenko
 Python 2.5 fixes for win32 installer  | 
469  | 
|
| 
3087.2.4
by Alexander Belchenko
 Help topics can now be loaded from files (based on Ian's patch, adapted to proper support various windows installers).  | 
470  | 
    # text files for help topis
 | 
| 
3089.3.6
by Ian Clatworthy
 make help topics more discoverable  | 
471  | 
text_topics = glob.glob('bzrlib/help_topics/en/*.txt')  | 
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
472  | 
topics_files = [('lib/help_topics/en', text_topics)]  | 
473  | 
||
474  | 
    # built-in plugins
 | 
|
475  | 
plugins_files = []  | 
|
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
476  | 
    # XXX - should we consider having the concept of an 'official' build,
 | 
477  | 
    # which hard-codes the list of plugins, gets more upset if modules are
 | 
|
478  | 
    # missing, etc?
 | 
|
479  | 
plugins = None # will be a set after plugin sniffing...  | 
|
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
480  | 
for root, dirs, files in os.walk('bzrlib/plugins'):  | 
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
481  | 
if root == 'bzrlib/plugins':  | 
482  | 
plugins = set(dirs)  | 
|
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
483  | 
x = []  | 
484  | 
for i in files:  | 
|
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
485  | 
if os.path.splitext(i)[1] not in [".py", ".pyd", ".dll"]:  | 
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
486  | 
                continue
 | 
487  | 
if i == '__init__.py' and root == 'bzrlib/plugins':  | 
|
488  | 
                continue
 | 
|
489  | 
x.append(os.path.join(root, i))  | 
|
490  | 
if x:  | 
|
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
491  | 
target_dir = root[len('bzrlib/'):] # install to 'plugins/...'  | 
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
492  | 
plugins_files.append((target_dir, x))  | 
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
493  | 
    # find modules for built-in plugins
 | 
494  | 
import tools.package_mf  | 
|
495  | 
mf = tools.package_mf.CustomModuleFinder()  | 
|
496  | 
mf.run_package('bzrlib/plugins')  | 
|
497  | 
packs, mods = mf.get_result()  | 
|
498  | 
additional_packages.update(packs)  | 
|
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
499  | 
includes.extend(mods)  | 
500  | 
||
501  | 
console_targets = [target,  | 
|
502  | 
'tools/win32/bzr_postinstall.py',  | 
|
503  | 
                       ]
 | 
|
504  | 
gui_targets = []  | 
|
505  | 
com_targets = []  | 
|
506  | 
||
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
507  | 
if 'qbzr' in plugins:  | 
| 
3565.5.6
by Mark Hammond
 move tbzr and qbzr py2exe config code into their own functions.  | 
508  | 
get_qbzr_py2exe_info(includes, excludes, packages)  | 
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
509  | 
|
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
510  | 
if "TBZR" in os.environ:  | 
| 
3565.5.9
by Mark Hammond
 Address John's review comments  | 
511  | 
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
 | 
512  | 
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
 | 
|
513  | 
        # can be downloaded from (username=guest, blank password):
 | 
|
514  | 
        # http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays/version-1.0.4/bin/TortoiseOverlays-1.0.4.11886-win32.msi
 | 
|
515  | 
if not os.path.isfile(os.environ.get('TORTOISE_OVERLAYS_MSI_WIN32',  | 
|
516  | 
'<nofile>')):  | 
|
517  | 
raise RuntimeError("Please set TORTOISE_OVERLAYS_MSI_WIN32 to the"  | 
|
518  | 
                               " location of the Win32 TortoiseOverlays .msi"
 | 
|
519  | 
" installer file")  | 
|
| 
3565.5.6
by Mark Hammond
 move tbzr and qbzr py2exe config code into their own functions.  | 
520  | 
get_tbzr_py2exe_info(includes, excludes, packages, console_targets,  | 
521  | 
gui_targets)  | 
|
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
522  | 
else:  | 
523  | 
        # print this warning to stderr as output is redirected, so it is seen
 | 
|
524  | 
        # at build time.  Also to stdout so it appears in the log
 | 
|
525  | 
for f in (sys.stderr, sys.stdout):  | 
|
526  | 
print >> f, \  | 
|
527  | 
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 | 
|
| 
3193.7.3
by Alexander Belchenko
 bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory  | 
528  | 
|
| 
3514.1.1
by John Arbash Meinel
 Updates to allow building with mingw, and to exclude Vista system dlls  | 
529  | 
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
 | 
530  | 
    # in on Vista.
 | 
|
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
531  | 
dll_excludes.append("MSWSOCK.dll")  | 
| 
3193.7.7
by Alexander Belchenko
 custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)  | 
532  | 
options_list = {"py2exe": {"packages": packages + list(additional_packages),  | 
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
533  | 
"includes": includes,  | 
534  | 
"excludes": excludes,  | 
|
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
535  | 
"dll_excludes": dll_excludes,  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
536  | 
"dist_dir": "win32_bzr.exe",  | 
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
537  | 
"optimize": 1,  | 
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
538  | 
                              },
 | 
539  | 
                   }
 | 
|
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
540  | 
|
| 
1821.1.1
by Alexander Belchenko
 win32 installer for bzr.dev.0.9  | 
541  | 
setup(options=options_list,  | 
| 
3565.5.1
by Mark Hammond
 merge setup.py changes for tbzr  | 
542  | 
console=console_targets,  | 
543  | 
windows=gui_targets,  | 
|
544  | 
com_server=com_targets,  | 
|
| 
3087.2.4
by Alexander Belchenko
 Help topics can now be loaded from files (based on Ian's patch, adapted to proper support various windows installers).  | 
545  | 
zipfile='lib/library.zip',  | 
| 
3193.7.9
by Alexander Belchenko
 Ian's review  | 
546  | 
data_files=topics_files + plugins_files,  | 
| 
3565.5.4
by Mark Hammond
 byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.  | 
547  | 
cmdclass={'install_data': install_data_with_bytecompile},  | 
| 
3087.2.4
by Alexander Belchenko
 Help topics can now be loaded from files (based on Ian's patch, adapted to proper support various windows installers).  | 
548  | 
          )
 | 
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
549  | 
|
550  | 
else:  | 
|
| 
2662.1.1
by Alexander Belchenko
 allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)  | 
551  | 
    # ad-hoc for easy_install
 | 
552  | 
DATA_FILES = []  | 
|
553  | 
if not 'bdist_egg' in sys.argv:  | 
|
554  | 
        # generate and install bzr.1 only with plain install, not easy_install one
 | 
|
555  | 
DATA_FILES = [('man/man1', ['bzr.1'])]  | 
|
556  | 
||
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
557  | 
    # std setup
 | 
558  | 
ARGS = {'scripts': ['bzr'],  | 
|
| 
2662.1.1
by Alexander Belchenko
 allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)  | 
559  | 
'data_files': DATA_FILES,  | 
| 
1739.1.3
by Robert Collins
 Merge bzr.dev.  | 
560  | 
'cmdclass': command_classes,  | 
561  | 
'ext_modules': ext_modules,  | 
|
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
562  | 
           }
 | 
| 
2666.2.1
by Alexander Belchenko
 change generated documentation extension from htm to html  | 
563  | 
|
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
564  | 
ARGS.update(META_INFO)  | 
565  | 
ARGS.update(BZRLIB)  | 
|
| 
1911.1.1
by Alexander Belchenko
 setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data  | 
566  | 
ARGS.update(PKG_DATA)  | 
| 
1860.1.2
by Alexander Belchenko
 setup.py:  | 
567  | 
|
568  | 
setup(**ARGS)  |