/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/env python
2
2
 
3
 
"""Installation script for brz.
 
3
"""Installation script for bzr.
4
4
Run it with
5
5
 './setup.py install', or
6
6
 './setup.py --help' for more options
9
9
import os
10
10
import os.path
11
11
import sys
12
 
import copy
13
 
import glob
14
12
 
15
 
if sys.version_info < (2, 7):
16
 
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.7+\n")
 
13
if sys.version_info < (2, 4):
 
14
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.4+\n")
17
15
    sys.exit(1)
18
16
 
19
17
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
20
18
# './setup.py' or the equivalent with another path, should always be at the
21
19
# start of the path, so this should find the right one...
22
 
import breezy
 
20
import bzrlib
23
21
 
24
22
def get_long_description():
25
23
    dirname = os.path.dirname(__file__)
26
 
    readme = os.path.join(dirname, 'README.rst')
27
 
    with open(readme, 'r') as f:
 
24
    readme = os.path.join(dirname, 'README')
 
25
    f = open(readme, 'rb')
 
26
    try:
28
27
        return f.read()
 
28
    finally:
 
29
        f.close()
29
30
 
30
31
 
31
32
##
32
33
# META INFORMATION FOR SETUP
33
34
# see http://docs.python.org/dist/meta-data.html
34
35
META_INFO = {
35
 
    'name':         'breezy',
36
 
    'version':      breezy.__version__,
37
 
    'maintainer':   'Breezy Developers',
38
 
    'maintainer_email':   'team@breezy-vcs.org',
39
 
    'url':          'https://www.breezy-vcs.org/',
 
36
    'name':         'bzr',
 
37
    'version':      bzrlib.__version__,
 
38
    'author':       'Canonical Ltd',
 
39
    'author_email': 'bazaar@lists.canonical.com',
 
40
    'url':          'http://bazaar.canonical.com/',
40
41
    'description':  'Friendly distributed version control system',
41
42
    'license':      'GNU GPL v2',
42
 
    'download_url': 'https://launchpad.net/brz/+download',
 
43
    'download_url': 'https://launchpad.net/bzr/+download',
43
44
    'long_description': get_long_description(),
44
45
    'classifiers': [
45
46
        'Development Status :: 6 - Mature',
54
55
        'Programming Language :: C',
55
56
        'Topic :: Software Development :: Version Control',
56
57
        ],
57
 
    'install_requires': [
58
 
        'configobj',
59
 
        'six>=1.9.0',
60
 
        ],
61
 
    'extras_require': {
62
 
        'fastimport': ['fastimport>=0.9.8'],
63
 
        'git': ['dulwich>=0.19.1'],
64
 
        },
65
 
    'tests_require': [
66
 
        'testtools',
67
 
    ],
68
 
}
 
58
    }
69
59
 
70
60
# The list of packages is automatically generated later. Add other things
71
 
# that are part of BREEZY here.
72
 
BREEZY = {}
 
61
# that are part of BZRLIB here.
 
62
BZRLIB = {}
73
63
 
74
64
PKG_DATA = {# install files from selftest suite
75
 
            'package_data': {'breezy': ['doc/api/*.txt',
 
65
            'package_data': {'bzrlib': ['doc/api/*.txt',
76
66
                                        'tests/test_patches_data/*',
77
67
                                        'help_topics/en/*.txt',
78
 
                                        'tests/ssl_certs/ca.crt',
79
68
                                        'tests/ssl_certs/server_without_pass.key',
80
69
                                        'tests/ssl_certs/server_with_pass.key',
81
 
                                        'tests/ssl_certs/server.crt',
 
70
                                        'tests/ssl_certs/server.crt'
82
71
                                       ]},
83
72
           }
84
 
I18N_FILES = []
85
 
for filepath in glob.glob("breezy/locale/*/LC_MESSAGES/*.mo"):
86
 
    langfile = filepath[len("breezy/locale/"):]
87
 
    targetpath = os.path.dirname(os.path.join("share/locale", langfile))
88
 
    I18N_FILES.append((targetpath, [filepath]))
89
 
 
90
 
def get_breezy_packages():
91
 
    """Recurse through the breezy directory, and extract the package names"""
 
73
 
 
74
 
 
75
def get_bzrlib_packages():
 
76
    """Recurse through the bzrlib directory, and extract the package names"""
92
77
 
93
78
    packages = []
94
 
    base_path = os.path.dirname(os.path.abspath(breezy.__file__))
 
79
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
95
80
    for root, dirs, files in os.walk(base_path):
96
81
        if '__init__.py' in files:
97
82
            assert root.startswith(base_path)
98
 
            # Get just the path below breezy
 
83
            # Get just the path below bzrlib
99
84
            package_path = root[len(base_path):]
100
85
            # Remove leading and trailing slashes
101
86
            package_path = package_path.strip('\\/')
102
87
            if not package_path:
103
 
                package_name = 'breezy'
 
88
                package_name = 'bzrlib'
104
89
            else:
105
 
                package_name = ('breezy.' +
 
90
                package_name = ('bzrlib.' +
106
91
                            package_path.replace('/', '.').replace('\\', '.'))
107
92
            packages.append(package_name)
108
93
    return sorted(packages)
109
94
 
110
95
 
111
 
BREEZY['packages'] = get_breezy_packages()
 
96
BZRLIB['packages'] = get_bzrlib_packages()
112
97
 
113
98
 
114
99
from distutils import log
115
100
from distutils.core import setup
116
 
from distutils.version import LooseVersion
117
101
from distutils.command.install_scripts import install_scripts
118
102
from distutils.command.install_data import install_data
119
103
from distutils.command.build import build
124
108
 
125
109
class my_install_scripts(install_scripts):
126
110
    """ Customized install_scripts distutils action.
127
 
    Create brz.bat for win32.
 
111
    Create bzr.bat for win32.
128
112
    """
129
113
    def run(self):
130
114
        install_scripts.run(self)   # standard action
133
117
            try:
134
118
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
135
119
                script_path = self._quoted_path(os.path.join(scripts_dir,
136
 
                                                             "brz"))
 
120
                                                             "bzr"))
137
121
                python_exe = self._quoted_path(sys.executable)
138
122
                args = self._win_batch_args()
139
123
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
140
 
                batch_path = os.path.join(self.install_dir, "brz.bat")
141
 
                with open(batch_path, "w") as f:
142
 
                    f.write(batch_str)
143
 
                print(("Created: %s" % batch_path))
144
 
            except Exception:
145
 
                e = sys.exc_info()[1]
146
 
                print(("ERROR: Unable to create %s: %s" % (batch_path, e)))
 
124
                batch_path = os.path.join(self.install_dir, "bzr.bat")
 
125
                f = file(batch_path, "w")
 
126
                f.write(batch_str)
 
127
                f.close()
 
128
                print "Created:", batch_path
 
129
            except Exception, e:
 
130
                print "ERROR: Unable to create %s: %s" % (batch_path, e)
147
131
 
148
132
    def _quoted_path(self, path):
149
133
        if ' ' in path:
152
136
            return path
153
137
 
154
138
    def _win_batch_args(self):
155
 
        from breezy.win32utils import winver
 
139
        from bzrlib.win32utils import winver
156
140
        if winver == 'Windows NT':
157
141
            return '%*'
158
142
        else:
162
146
 
163
147
class bzr_build(build):
164
148
    """Customized build distutils action.
165
 
    Generate brz.1.
 
149
    Generate bzr.1.
166
150
    """
167
151
 
168
 
    sub_commands = build.sub_commands + [
169
 
            ('build_mo', lambda _: True),
170
 
            ]
171
 
 
172
152
    def run(self):
173
153
        build.run(self)
174
154
 
175
155
        from tools import generate_docs
176
 
        generate_docs.main(argv=["brz", "man"])
 
156
        generate_docs.main(argv=["bzr", "man"])
177
157
 
178
158
 
179
159
########################
180
160
## Setup
181
161
########################
182
162
 
183
 
from breezy.bzr_distutils import build_mo
184
 
 
185
163
command_classes = {'install_scripts': my_install_scripts,
186
 
                   'build': bzr_build,
187
 
                   'build_mo': build_mo,
188
 
                   }
 
164
                   'build': bzr_build}
189
165
from distutils import log
190
166
from distutils.errors import CCompilerError, DistutilsPlatformError
191
167
from distutils.extension import Extension
192
168
ext_modules = []
193
169
try:
194
 
    from Cython.Distutils import build_ext
195
 
    from Cython.Compiler.Version import version as cython_version
 
170
    try:
 
171
        from Pyrex.Distutils import build_ext
 
172
        from Pyrex.Compiler.Version import version as pyrex_version
 
173
    except ImportError:
 
174
        print "No Pyrex, trying Cython..."
 
175
        from Cython.Distutils import build_ext
 
176
        from Cython.Compiler.Version import version as pyrex_version
196
177
except ImportError:
197
 
    have_cython = False
 
178
    have_pyrex = False
198
179
    # try to build the extension from the prior generated source.
199
 
    print("")
200
 
    print("The python package 'Cython' is not available."
201
 
          " If the .c files are available,")
202
 
    print("they will be built,"
203
 
          " but modifying the .pyx files will not rebuild them.")
204
 
    print("")
 
180
    print
 
181
    print ("The python package 'Pyrex' is not available."
 
182
           " If the .c files are available,")
 
183
    print ("they will be built,"
 
184
           " but modifying the .pyx files will not rebuild them.")
 
185
    print
205
186
    from distutils.command.build_ext import build_ext
206
187
else:
207
 
    have_cython = True
208
 
    cython_version_info = LooseVersion(cython_version)
 
188
    have_pyrex = True
 
189
    pyrex_version_info = tuple(map(int, pyrex_version.split('.')))
209
190
 
210
191
 
211
192
class build_ext_if_possible(build_ext):
223
204
    def run(self):
224
205
        try:
225
206
            build_ext.run(self)
226
 
        except DistutilsPlatformError:
227
 
            e = sys.exc_info()[1]
 
207
        except DistutilsPlatformError, e:
228
208
            if not self.allow_python_fallback:
229
209
                log.warn('\n  Cannot build extensions.\n'
230
210
                         '  Use "build_ext --allow-python-fallback" to use'
249
229
                     % (ext.name,))
250
230
 
251
231
 
252
 
# Override the build_ext if we have Cython available
 
232
# Override the build_ext if we have Pyrex available
253
233
command_classes['build_ext'] = build_ext_if_possible
254
234
unavailable_files = []
255
235
 
256
236
 
257
 
def add_cython_extension(module_name, libraries=None, extra_source=[]):
258
 
    """Add a cython module to build.
 
237
def add_pyrex_extension(module_name, libraries=None, extra_source=[]):
 
238
    """Add a pyrex module to build.
259
239
 
260
 
    This will use Cython to auto-generate the .c file if it is available.
 
240
    This will use Pyrex to auto-generate the .c file if it is available.
261
241
    Otherwise it will fall back on the .c file. If the .c file is not
262
242
    available, it will warn, and not add anything.
263
243
 
268
248
        determine the .pyx and .c files to use.
269
249
    """
270
250
    path = module_name.replace('.', '/')
271
 
    cython_name = path + '.pyx'
 
251
    pyrex_name = path + '.pyx'
272
252
    c_name = path + '.c'
273
253
    define_macros = []
274
254
    if sys.platform == 'win32':
275
 
        # cython uses the macro WIN32 to detect the platform, even though it
 
255
        # pyrex uses the macro WIN32 to detect the platform, even though it
276
256
        # should be using something like _WIN32 or MS_WINDOWS, oh well, we can
277
257
        # give it the right value.
278
258
        define_macros.append(('WIN32', None))
279
 
    if have_cython:
280
 
        source = [cython_name]
 
259
    if have_pyrex:
 
260
        source = [pyrex_name]
281
261
    else:
282
262
        if not os.path.isfile(c_name):
283
263
            unavailable_files.append(c_name)
285
265
        else:
286
266
            source = [c_name]
287
267
    source.extend(extra_source)
288
 
    include_dirs = ['breezy']
289
268
    ext_modules.append(Extension(module_name, source,
290
 
        define_macros=define_macros, libraries=libraries,
291
 
        include_dirs=include_dirs))
292
 
 
293
 
 
294
 
add_cython_extension('breezy._simple_set_pyx')
295
 
ext_modules.append(Extension('breezy._static_tuple_c',
296
 
                             ['breezy/_static_tuple_c.c']))
297
 
add_cython_extension('breezy._annotator_pyx')
298
 
add_cython_extension('breezy._bencode_pyx')
299
 
add_cython_extension('breezy._chunks_to_lines_pyx')
300
 
add_cython_extension('breezy.bzr._groupcompress_pyx',
301
 
                    extra_source=['breezy/bzr/diff-delta.c'])
302
 
add_cython_extension('breezy.bzr._knit_load_data_pyx')
303
 
add_cython_extension('breezy._known_graph_pyx')
304
 
add_cython_extension('breezy._rio_pyx')
 
269
        define_macros=define_macros, libraries=libraries))
 
270
 
 
271
 
 
272
add_pyrex_extension('bzrlib._annotator_pyx')
 
273
add_pyrex_extension('bzrlib._bencode_pyx')
 
274
add_pyrex_extension('bzrlib._chunks_to_lines_pyx')
 
275
add_pyrex_extension('bzrlib._groupcompress_pyx',
 
276
                    extra_source=['bzrlib/diff-delta.c'])
 
277
add_pyrex_extension('bzrlib._knit_load_data_pyx')
 
278
add_pyrex_extension('bzrlib._known_graph_pyx')
 
279
add_pyrex_extension('bzrlib._rio_pyx')
305
280
if sys.platform == 'win32':
306
 
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx',
 
281
    add_pyrex_extension('bzrlib._dirstate_helpers_pyx',
307
282
                        libraries=['Ws2_32'])
308
 
    add_cython_extension('breezy._walkdirs_win32')
309
 
else:
310
 
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx')
311
 
    add_cython_extension('breezy._readdir_pyx')
312
 
add_cython_extension('breezy.bzr._chk_map_pyx')
313
 
ext_modules.append(Extension('breezy._patiencediff_c',
314
 
                             ['breezy/_patiencediff_c.c']))
315
 
add_cython_extension('breezy.bzr._btree_serializer_pyx')
 
283
    add_pyrex_extension('bzrlib._walkdirs_win32')
 
284
    z_lib = 'zdll'
 
285
else:
 
286
    if have_pyrex and pyrex_version_info[:3] == (0,9,4):
 
287
        # Pyrex 0.9.4.1 fails to compile this extension correctly
 
288
        # The code it generates re-uses a "local" pointer and
 
289
        # calls "PY_DECREF" after having set it to NULL. (It mixes PY_XDECREF
 
290
        # which is NULL safe with PY_DECREF which is not.)
 
291
        # <https://bugs.edge.launchpad.net/bzr/+bug/449372>
 
292
        # <https://bugs.edge.launchpad.net/bzr/+bug/276868>
 
293
        print 'Cannot build extension "bzrlib._dirstate_helpers_pyx" using'
 
294
        print 'your version of pyrex "%s". Please upgrade your pyrex' % (
 
295
            pyrex_version,)
 
296
        print 'install. For now, the non-compiled (python) version will'
 
297
        print 'be used instead.'
 
298
    else:
 
299
        add_pyrex_extension('bzrlib._dirstate_helpers_pyx')
 
300
    add_pyrex_extension('bzrlib._readdir_pyx')
 
301
    z_lib = 'z'
 
302
add_pyrex_extension('bzrlib._chk_map_pyx', libraries=[z_lib])
 
303
ext_modules.append(Extension('bzrlib._patiencediff_c',
 
304
                             ['bzrlib/_patiencediff_c.c']))
 
305
if have_pyrex and pyrex_version_info < (0, 9, 6, 3):
 
306
    print
 
307
    print 'Your Pyrex/Cython version %s is too old to build the simple_set' % (
 
308
        pyrex_version)
 
309
    print 'and static_tuple extensions.'
 
310
    print 'Please upgrade to at least Pyrex 0.9.6.3'
 
311
    print
 
312
    # TODO: Should this be a fatal error?
 
313
else:
 
314
    # We only need 0.9.6.3 to build _simple_set_pyx, but static_tuple depends
 
315
    # on simple_set
 
316
    add_pyrex_extension('bzrlib._simple_set_pyx')
 
317
    ext_modules.append(Extension('bzrlib._static_tuple_c',
 
318
                                 ['bzrlib/_static_tuple_c.c']))
 
319
add_pyrex_extension('bzrlib._btree_serializer_pyx')
316
320
 
317
321
 
318
322
if unavailable_files:
319
 
    print('C extension(s) not found:')
320
 
    print(('   %s' % ('\n  '.join(unavailable_files),)))
321
 
    print('The python versions will be used instead.')
322
 
    print("")
 
323
    print 'C extension(s) not found:'
 
324
    print '   %s' % ('\n  '.join(unavailable_files),)
 
325
    print 'The python versions will be used instead.'
 
326
    print
323
327
 
324
328
 
325
329
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
342
346
    # TBZR points to the TBZR directory
343
347
    tbzr_root = os.environ["TBZR"]
344
348
 
345
 
    # Ensure tbreezy itself is on sys.path
 
349
    # Ensure tbzrlib itself is on sys.path
346
350
    sys.path.append(tbzr_root)
347
351
 
348
 
    packages.append("tbreezy")
 
352
    packages.append("tbzrlib")
349
353
 
350
354
    # collect up our icons.
351
355
    cwd = os.getcwd()
352
 
    ico_root = os.path.join(tbzr_root, 'tbreezy', 'resources')
 
356
    ico_root = os.path.join(tbzr_root, 'tbzrlib', 'resources')
353
357
    icos = [] # list of (path_root, relative_ico_path)
354
 
    # First always brz's icon and its in the root of the brz tree.
355
 
    icos.append(('', 'brz.ico'))
 
358
    # First always bzr's icon and its in the root of the bzr tree.
 
359
    icos.append(('', 'bzr.ico'))
356
360
    for root, dirs, files in os.walk(ico_root):
357
361
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
358
362
                     for f in files if f.endswith('.ico')])
389
393
    # ditto for the tbzrcommand tool
390
394
    tbzrcommand = dict(
391
395
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
392
 
        icon_resources = icon_resources,
393
 
        other_resources = other_resources,
 
396
        icon_resources = [(0,'bzr.ico')],
394
397
    )
395
398
    console_targets.append(tbzrcommand)
396
399
    tbzrcommandw = tbzrcommand.copy()
410
413
 
411
414
def get_qbzr_py2exe_info(includes, excludes, packages, data_files):
412
415
    # PyQt4 itself still escapes the plugin detection code for some reason...
413
 
    includes.append('PyQt4.QtCore')
414
 
    includes.append('PyQt4.QtGui')
415
 
    includes.append('PyQt4.QtTest')
 
416
    packages.append('PyQt4')
 
417
    excludes.append('PyQt4.elementtree.ElementTree')
 
418
    excludes.append('PyQt4.uic.port_v3')
416
419
    includes.append('sip') # extension module required for Qt.
417
420
    packages.append('pygments') # colorizer for qbzr
418
421
    packages.append('docutils') # html formatting
419
422
    includes.append('win32event')  # for qsubprocess stuff
 
423
    # but we can avoid many Qt4 Dlls.
 
424
    dll_excludes.extend(
 
425
        """QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll
 
426
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
 
427
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
 
428
        qscintilla2.dll""".split())
420
429
    # the qt binaries might not be on PATH...
421
430
    # They seem to install to a place like C:\Python25\PyQt4\*
422
431
    # Which is not the same as C:\Python25\Lib\site-packages\PyQt4
464
473
    packages.append('sqlite3')
465
474
 
466
475
 
467
 
def get_git_py2exe_info(includes, excludes, packages):
468
 
    packages.append('dulwich')
469
 
 
470
 
 
471
 
def get_fastimport_py2exe_info(includes, excludes, packages):
472
 
    # This is the python-fastimport package, not to be confused with the
473
 
    # brz-fastimport plugin.
474
 
    packages.append('fastimport')
475
 
 
476
 
 
477
476
if 'bdist_wininst' in sys.argv:
478
477
    def find_docs():
479
478
        docs = []
486
485
            if r:
487
486
                relative = root[4:]
488
487
                if relative:
489
 
                    target = os.path.join('Doc\\Breezy', relative)
 
488
                    target = os.path.join('Doc\\Bazaar', relative)
490
489
                else:
491
 
                    target = 'Doc\\Breezy'
 
490
                    target = 'Doc\\Bazaar'
492
491
                docs.append((target, r))
493
492
        return docs
494
493
 
495
494
    # python's distutils-based win32 installer
496
 
    ARGS = {'scripts': [ 'brz', 'tools/win32/brz-win32-bdist-postinstall.py'],
 
495
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
497
496
            'ext_modules': ext_modules,
498
497
            # help pages
499
498
            'data_files': find_docs(),
500
 
            # for building cython extensions
501
 
            'cmdclass': command_classes,
 
499
            # for building pyrex extensions
 
500
            'cmdclass': {'build_ext': build_ext_if_possible},
502
501
           }
503
502
 
504
503
    ARGS.update(META_INFO)
505
 
    ARGS.update(BREEZY)
506
 
    PKG_DATA['package_data']['breezy'].append('locale/*/LC_MESSAGES/*.mo')
 
504
    ARGS.update(BZRLIB)
507
505
    ARGS.update(PKG_DATA)
508
 
 
 
506
    
509
507
    setup(**ARGS)
510
508
 
511
509
elif 'py2exe' in sys.argv:
 
510
    import glob
512
511
    # py2exe setup
513
512
    import py2exe
514
513
 
515
 
    # pick real brz version
516
 
    import breezy
 
514
    # pick real bzr version
 
515
    import bzrlib
517
516
 
518
517
    version_number = []
519
 
    for i in breezy.version_info[:4]:
 
518
    for i in bzrlib.version_info[:4]:
520
519
        try:
521
520
            i = int(i)
522
521
        except ValueError:
535
534
            install_data.run(self)
536
535
 
537
536
            py2exe = self.distribution.get_command_obj('py2exe', False)
538
 
            # GZ 2010-04-19: Setup has py2exe.optimize as 2, but give plugins
539
 
            #                time before living with docstring stripping
540
 
            optimize = 1
 
537
            optimize = py2exe.optimize
541
538
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
542
 
            # Round mtime to nearest even second so that installing on a FAT
543
 
            # filesystem bytecode internal and script timestamps will match
544
 
            for f in compile_names:
545
 
                mtime = os.stat(f).st_mtime
546
 
                remainder = mtime % 2
547
 
                if remainder:
548
 
                    mtime -= remainder
549
 
                    os.utime(f, (mtime, mtime))
550
539
            byte_compile(compile_names,
551
540
                         optimize=optimize,
552
541
                         force=self.force, prefix=self.install_dir,
553
542
                         dry_run=self.dry_run)
554
 
            self.outfiles.extend([f + 'o' for f in compile_names])
 
543
            if optimize:
 
544
                suffix = 'o'
 
545
            else:
 
546
                suffix = 'c'
 
547
            self.outfiles.extend([f + suffix for f in compile_names])
555
548
    # end of class install_data_with_bytecompile
556
549
 
557
 
    target = py2exe.build_exe.Target(script = "brz",
558
 
                                     dest_base = "brz",
559
 
                                     icon_resources = [(0,'brz.ico')],
 
550
    target = py2exe.build_exe.Target(script = "bzr",
 
551
                                     dest_base = "bzr",
 
552
                                     icon_resources = [(0,'bzr.ico')],
560
553
                                     name = META_INFO['name'],
561
554
                                     version = version_str,
562
555
                                     description = META_INFO['description'],
565
558
                                     company_name = "Canonical Ltd.",
566
559
                                     comments = META_INFO['description'],
567
560
                                    )
568
 
    gui_target = copy.copy(target)
569
 
    gui_target.dest_base = "bzrw"
570
561
 
571
 
    packages = BREEZY['packages']
572
 
    packages.remove('breezy')
573
 
    packages = [i for i in packages if not i.startswith('breezy.plugins')]
 
562
    packages = BZRLIB['packages']
 
563
    packages.remove('bzrlib')
 
564
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
574
565
    includes = []
575
 
    for i in glob.glob('breezy\\*.py'):
 
566
    for i in glob.glob('bzrlib\\*.py'):
576
567
        module = i[:-3].replace('\\', '.')
577
568
        if module.endswith('__init__'):
578
569
            module = module[:-len('__init__')]
579
570
        includes.append(module)
580
571
 
581
572
    additional_packages = set()
582
 
    if sys.version.startswith('2.7'):
 
573
    if sys.version.startswith('2.4'):
 
574
        # adding elementtree package
 
575
        additional_packages.add('elementtree')
 
576
    elif sys.version.startswith('2.6') or sys.version.startswith('2.5'):
583
577
        additional_packages.add('xml.etree')
584
578
    else:
585
579
        import warnings
592
586
    excludes = """Tkinter psyco ElementPath r_hmac
593
587
                  ImaginaryModule cElementTree elementtree.ElementTree
594
588
                  Crypto.PublicKey._fastmath
 
589
                  medusa medusa.filesys medusa.ftp_server
595
590
                  tools
596
591
                  resource validate""".split()
597
592
    dll_excludes = []
609
604
        excludes.append("email.MIME" + oldname)
610
605
 
611
606
    # text files for help topis
612
 
    text_topics = glob.glob('breezy/help_topics/en/*.txt')
 
607
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
613
608
    topics_files = [('lib/help_topics/en', text_topics)]
614
609
 
615
610
    # built-in plugins
618
613
    # which hard-codes the list of plugins, gets more upset if modules are
619
614
    # missing, etc?
620
615
    plugins = None # will be a set after plugin sniffing...
621
 
    for root, dirs, files in os.walk('breezy/plugins'):
622
 
        if root == 'breezy/plugins':
 
616
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
617
        if root == 'bzrlib/plugins':
623
618
            plugins = set(dirs)
624
619
            # We ship plugins as normal files on the file-system - however,
625
620
            # the build process can cause *some* of these plugin files to end
627
622
            # library.zip, and then saw import errors related to that as the
628
623
            # rest of the svn plugin wasn't. So we tell py2exe to leave the
629
624
            # plugins out of the .zip file
630
 
            excludes.extend(["breezy.plugins." + d for d in dirs])
 
625
            excludes.extend(["bzrlib.plugins." + d for d in dirs])
631
626
        x = []
632
627
        for i in files:
633
628
            # Throw away files we don't want packaged. Note that plugins may
636
631
            ext = os.path.splitext(i)[1]
637
632
            if ext.endswith('~') or ext in [".pyc", ".swp"]:
638
633
                continue
639
 
            if i == '__init__.py' and root == 'breezy/plugins':
 
634
            if i == '__init__.py' and root == 'bzrlib/plugins':
640
635
                continue
641
636
            x.append(os.path.join(root, i))
642
637
        if x:
643
 
            target_dir = root[len('breezy/'):]  # install to 'plugins/...'
 
638
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
644
639
            plugins_files.append((target_dir, x))
645
640
    # find modules for built-in plugins
646
641
    import tools.package_mf
647
642
    mf = tools.package_mf.CustomModuleFinder()
648
 
    mf.run_package('breezy/plugins')
 
643
    mf.run_package('bzrlib/plugins')
649
644
    packs, mods = mf.get_result()
650
645
    additional_packages.update(packs)
651
646
    includes.extend(mods)
653
648
    console_targets = [target,
654
649
                       'tools/win32/bzr_postinstall.py',
655
650
                       ]
656
 
    gui_targets = [gui_target]
657
 
    data_files = topics_files + plugins_files + I18N_FILES
 
651
    gui_targets = []
 
652
    data_files = topics_files + plugins_files
658
653
 
659
654
    if 'qbzr' in plugins:
660
655
        get_qbzr_py2exe_info(includes, excludes, packages, data_files)
662
657
    if 'svn' in plugins:
663
658
        get_svn_py2exe_info(includes, excludes, packages)
664
659
 
665
 
    if 'git' in plugins:
666
 
        get_git_py2exe_info(includes, excludes, packages)
667
 
 
668
 
    if 'fastimport' in plugins:
669
 
        get_fastimport_py2exe_info(includes, excludes, packages)
670
 
 
671
660
    if "TBZR" in os.environ:
672
661
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
673
662
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
692
681
        # print this warning to stderr as output is redirected, so it is seen
693
682
        # at build time.  Also to stdout so it appears in the log
694
683
        for f in (sys.stderr, sys.stdout):
695
 
            f.write("Skipping TBZR binaries - "
696
 
                "please set TBZR to a directory to enable\n")
 
684
            print >> f, \
 
685
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
697
686
 
698
687
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
699
688
    # in on Vista.
700
 
    dll_excludes.extend(["MSWSOCK.dll",
701
 
                         "MSVCP60.dll",
702
 
                         "MSVCP90.dll",
703
 
                         "powrprof.dll",
704
 
                         "SHFOLDER.dll"])
 
689
    dll_excludes.extend(["MSWSOCK.dll", "MSVCP60.dll", "powrprof.dll"])
705
690
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
706
691
                               "includes": includes,
707
692
                               "excludes": excludes,
708
693
                               "dll_excludes": dll_excludes,
709
694
                               "dist_dir": "win32_bzr.exe",
710
 
                               "optimize": 2,
711
 
                               "custom_boot_script":
712
 
                                        "tools/win32/py2exe_boot_common.py",
 
695
                               "optimize": 1,
713
696
                              },
714
697
                   }
715
698
 
716
 
    # We want the libaray.zip to have optimize = 2, but the exe to have
717
 
    # optimize = 1, so that .py files that get compilied at run time
718
 
    # (e.g. user installed plugins) dont have their doc strings removed.
719
 
    class py2exe_no_oo_exe(py2exe.build_exe.py2exe):
720
 
        def build_executable(self, *args, **kwargs):
721
 
            self.optimize = 1
722
 
            py2exe.build_exe.py2exe.build_executable(self, *args, **kwargs)
723
 
            self.optimize = 2
724
 
 
725
 
    if __name__ == '__main__':
726
 
        command_classes['install_data'] = install_data_with_bytecompile
727
 
        command_classes['py2exe'] = py2exe_no_oo_exe
728
 
        setup(options=options_list,
729
 
              console=console_targets,
730
 
              windows=gui_targets,
731
 
              zipfile='lib/library.zip',
732
 
              data_files=data_files,
733
 
              cmdclass=command_classes,
734
 
              )
 
699
    setup(options=options_list,
 
700
          console=console_targets,
 
701
          windows=gui_targets,
 
702
          zipfile='lib/library.zip',
 
703
          data_files=data_files,
 
704
          cmdclass={'install_data': install_data_with_bytecompile},
 
705
          )
735
706
 
736
707
else:
737
708
    # ad-hoc for easy_install
738
709
    DATA_FILES = []
739
710
    if not 'bdist_egg' in sys.argv:
740
 
        # generate and install brz.1 only with plain install, not the
 
711
        # generate and install bzr.1 only with plain install, not the
741
712
        # easy_install one
742
 
        DATA_FILES = [('man/man1', ['brz.1', 'breezy/git/git-remote-bzr.1'])]
743
 
 
744
 
    DATA_FILES = DATA_FILES + I18N_FILES
 
713
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
714
 
 
715
    if sys.platform != 'win32':
 
716
        # see https://wiki.kubuntu.org/Apport/DeveloperHowTo
 
717
        #
 
718
        # checking the paths and hardcoding the check for root is a bit gross,
 
719
        # but I don't see a cleaner way to find out the locations in a way
 
720
        # that's going to align with the hardcoded paths in apport.
 
721
        if os.geteuid() == 0:
 
722
            DATA_FILES += [
 
723
                ('/usr/share/apport/package-hooks',
 
724
                    ['apport/source_bzr.py']),
 
725
                ('/etc/apport/crashdb.conf.d/',
 
726
                    ['apport/bzr-crashdb.conf']),]
 
727
 
745
728
    # std setup
746
 
    ARGS = {'scripts': ['brz',
747
 
                        # TODO(jelmer): Only install the git scripts if
748
 
                        # Dulwich was found.
749
 
                        'breezy/git/git-remote-bzr',
750
 
                        'breezy/git/bzr-receive-pack',
751
 
                        'breezy/git/bzr-upload-pack'],
 
729
    ARGS = {'scripts': ['bzr'],
752
730
            'data_files': DATA_FILES,
753
731
            'cmdclass': command_classes,
754
732
            'ext_modules': ext_modules,
755
733
           }
756
734
 
757
735
    ARGS.update(META_INFO)
758
 
    ARGS.update(BREEZY)
 
736
    ARGS.update(BZRLIB)
759
737
    ARGS.update(PKG_DATA)
760
738
 
761
 
    if __name__ == '__main__':
762
 
        setup(**ARGS)
 
739
    setup(**ARGS)