/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: Jelmer Vernooij
  • Date: 2018-03-30 14:47:14 UTC
  • mto: This revision was merged to the branch mainline in revision 6930.
  • Revision ID: jelmer@jelmer.uk-20180330144714-sncrnhqh8y4nmpbr
Add basic tests.

Show diffs side-by-side

added added

removed removed

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