/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-09-30 00:33:53 UTC
  • mto: This revision was merged to the branch mainline in revision 7134.
  • Revision ID: jelmer@jelmer.uk-20180930003353-2z5sugalbxfxfiru
When opening working trees with .git files, open the right control transport.

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
 
    readme = os.path.join(dirname, 'README')
25
 
    f = open(readme, 'rb')
26
 
    try:
 
26
    readme = os.path.join(dirname, 'README.rst')
 
27
    with open(readme, 'r') 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
        '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
}
59
69
 
60
70
# The list of packages is automatically generated later. Add other things
61
 
# that are part of BZRLIB here.
62
 
BZRLIB = {}
 
71
# that are part of BREEZY here.
 
72
BREEZY = {}
63
73
 
64
74
PKG_DATA = {# install files from selftest suite
65
 
            'package_data': {'bzrlib': ['doc/api/*.txt',
 
75
            'package_data': {'breezy': ['doc/api/*.txt',
66
76
                                        'tests/test_patches_data/*',
67
77
                                        'help_topics/en/*.txt',
 
78
                                        'tests/ssl_certs/ca.crt',
68
79
                                        'tests/ssl_certs/server_without_pass.key',
69
80
                                        'tests/ssl_certs/server_with_pass.key',
70
 
                                        'tests/ssl_certs/server.crt'
 
81
                                        'tests/ssl_certs/server.crt',
71
82
                                       ]},
72
83
           }
73
 
 
74
 
 
75
 
def get_bzrlib_packages():
76
 
    """Recurse through the bzrlib directory, and extract the package names"""
 
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"""
77
92
 
78
93
    packages = []
79
 
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
 
94
    base_path = os.path.dirname(os.path.abspath(breezy.__file__))
80
95
    for root, dirs, files in os.walk(base_path):
81
96
        if '__init__.py' in files:
82
97
            assert root.startswith(base_path)
83
 
            # Get just the path below bzrlib
 
98
            # Get just the path below breezy
84
99
            package_path = root[len(base_path):]
85
100
            # Remove leading and trailing slashes
86
101
            package_path = package_path.strip('\\/')
87
102
            if not package_path:
88
 
                package_name = 'bzrlib'
 
103
                package_name = 'breezy'
89
104
            else:
90
 
                package_name = ('bzrlib.' +
 
105
                package_name = ('breezy.' +
91
106
                            package_path.replace('/', '.').replace('\\', '.'))
92
107
            packages.append(package_name)
93
108
    return sorted(packages)
94
109
 
95
110
 
96
 
BZRLIB['packages'] = get_bzrlib_packages()
 
111
BREEZY['packages'] = get_breezy_packages()
97
112
 
98
113
 
99
114
from distutils import log
100
115
from distutils.core import setup
 
116
from distutils.version import LooseVersion
101
117
from distutils.command.install_scripts import install_scripts
102
118
from distutils.command.install_data import install_data
103
119
from distutils.command.build import build
108
124
 
109
125
class my_install_scripts(install_scripts):
110
126
    """ Customized install_scripts distutils action.
111
 
    Create bzr.bat for win32.
 
127
    Create brz.bat for win32.
112
128
    """
113
129
    def run(self):
114
130
        install_scripts.run(self)   # standard action
117
133
            try:
118
134
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
119
135
                script_path = self._quoted_path(os.path.join(scripts_dir,
120
 
                                                             "bzr"))
 
136
                                                             "brz"))
121
137
                python_exe = self._quoted_path(sys.executable)
122
138
                args = self._win_batch_args()
123
139
                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)
 
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)))
131
147
 
132
148
    def _quoted_path(self, path):
133
149
        if ' ' in path:
136
152
            return path
137
153
 
138
154
    def _win_batch_args(self):
139
 
        from bzrlib.win32utils import winver
 
155
        from breezy.win32utils import winver
140
156
        if winver == 'Windows NT':
141
157
            return '%*'
142
158
        else:
146
162
 
147
163
class bzr_build(build):
148
164
    """Customized build distutils action.
149
 
    Generate bzr.1.
 
165
    Generate brz.1.
150
166
    """
151
167
 
 
168
    sub_commands = build.sub_commands + [
 
169
            ('build_mo', lambda _: True),
 
170
            ]
 
171
 
152
172
    def run(self):
153
173
        build.run(self)
154
174
 
155
175
        from tools import generate_docs
156
 
        generate_docs.main(argv=["bzr", "man"])
 
176
        generate_docs.main(argv=["brz", "man"])
157
177
 
158
178
 
159
179
########################
160
180
## Setup
161
181
########################
162
182
 
 
183
from breezy.bzr_distutils import build_mo
 
184
 
163
185
command_classes = {'install_scripts': my_install_scripts,
164
 
                   'build': bzr_build}
 
186
                   'build': bzr_build,
 
187
                   'build_mo': build_mo,
 
188
                   }
165
189
from distutils import log
166
190
from distutils.errors import CCompilerError, DistutilsPlatformError
167
191
from distutils.extension import Extension
168
192
ext_modules = []
169
193
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
 
194
    from Cython.Distutils import build_ext
 
195
    from Cython.Compiler.Version import version as cython_version
177
196
except ImportError:
178
 
    have_pyrex = False
 
197
    have_cython = False
179
198
    # 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
 
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("")
186
205
    from distutils.command.build_ext import build_ext
187
206
else:
188
 
    have_pyrex = True
189
 
    pyrex_version_info = tuple(map(int, pyrex_version.split('.')))
 
207
    have_cython = True
 
208
    cython_version_info = LooseVersion(cython_version)
190
209
 
191
210
 
192
211
class build_ext_if_possible(build_ext):
204
223
    def run(self):
205
224
        try:
206
225
            build_ext.run(self)
207
 
        except DistutilsPlatformError, e:
 
226
        except DistutilsPlatformError:
 
227
            e = sys.exc_info()[1]
208
228
            if not self.allow_python_fallback:
209
229
                log.warn('\n  Cannot build extensions.\n'
210
230
                         '  Use "build_ext --allow-python-fallback" to use'
229
249
                     % (ext.name,))
230
250
 
231
251
 
232
 
# Override the build_ext if we have Pyrex available
 
252
# Override the build_ext if we have Cython available
233
253
command_classes['build_ext'] = build_ext_if_possible
234
254
unavailable_files = []
235
255
 
236
256
 
237
 
def add_pyrex_extension(module_name, libraries=None, extra_source=[]):
238
 
    """Add a pyrex module to build.
 
257
def add_cython_extension(module_name, libraries=None, extra_source=[]):
 
258
    """Add a cython module to build.
239
259
 
240
 
    This will use Pyrex to auto-generate the .c file if it is available.
 
260
    This will use Cython to auto-generate the .c file if it is available.
241
261
    Otherwise it will fall back on the .c file. If the .c file is not
242
262
    available, it will warn, and not add anything.
243
263
 
248
268
        determine the .pyx and .c files to use.
249
269
    """
250
270
    path = module_name.replace('.', '/')
251
 
    pyrex_name = path + '.pyx'
 
271
    cython_name = path + '.pyx'
252
272
    c_name = path + '.c'
253
273
    define_macros = []
254
274
    if sys.platform == 'win32':
255
 
        # pyrex uses the macro WIN32 to detect the platform, even though it
 
275
        # cython uses the macro WIN32 to detect the platform, even though it
256
276
        # should be using something like _WIN32 or MS_WINDOWS, oh well, we can
257
277
        # give it the right value.
258
278
        define_macros.append(('WIN32', None))
259
 
    if have_pyrex:
260
 
        source = [pyrex_name]
 
279
    if have_cython:
 
280
        source = [cython_name]
261
281
    else:
262
282
        if not os.path.isfile(c_name):
263
283
            unavailable_files.append(c_name)
265
285
        else:
266
286
            source = [c_name]
267
287
    source.extend(extra_source)
 
288
    include_dirs = ['breezy']
268
289
    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')
 
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')
280
305
if sys.platform == 'win32':
281
 
    add_pyrex_extension('bzrlib._dirstate_helpers_pyx',
 
306
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx',
282
307
                        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')
 
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')
320
316
 
321
317
 
322
318
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
 
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("")
327
323
 
328
324
 
329
325
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
346
342
    # TBZR points to the TBZR directory
347
343
    tbzr_root = os.environ["TBZR"]
348
344
 
349
 
    # Ensure tbzrlib itself is on sys.path
 
345
    # Ensure tbreezy itself is on sys.path
350
346
    sys.path.append(tbzr_root)
351
347
 
352
 
    packages.append("tbzrlib")
 
348
    packages.append("tbreezy")
353
349
 
354
350
    # collect up our icons.
355
351
    cwd = os.getcwd()
356
 
    ico_root = os.path.join(tbzr_root, 'tbzrlib', 'resources')
 
352
    ico_root = os.path.join(tbzr_root, 'tbreezy', 'resources')
357
353
    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'))
 
354
    # First always brz's icon and its in the root of the brz tree.
 
355
    icos.append(('', 'brz.ico'))
360
356
    for root, dirs, files in os.walk(ico_root):
361
357
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
362
358
                     for f in files if f.endswith('.ico')])
393
389
    # ditto for the tbzrcommand tool
394
390
    tbzrcommand = dict(
395
391
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
396
 
        icon_resources = [(0,'bzr.ico')],
 
392
        icon_resources = icon_resources,
 
393
        other_resources = other_resources,
397
394
    )
398
395
    console_targets.append(tbzrcommand)
399
396
    tbzrcommandw = tbzrcommand.copy()
413
410
 
414
411
def get_qbzr_py2exe_info(includes, excludes, packages, data_files):
415
412
    # 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')
 
413
    includes.append('PyQt4.QtCore')
 
414
    includes.append('PyQt4.QtGui')
 
415
    includes.append('PyQt4.QtTest')
419
416
    includes.append('sip') # extension module required for Qt.
420
417
    packages.append('pygments') # colorizer for qbzr
421
418
    packages.append('docutils') # html formatting
422
419
    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
420
    # the qt binaries might not be on PATH...
430
421
    # They seem to install to a place like C:\Python25\PyQt4\*
431
422
    # Which is not the same as C:\Python25\Lib\site-packages\PyQt4
473
464
    packages.append('sqlite3')
474
465
 
475
466
 
 
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
 
476
477
if 'bdist_wininst' in sys.argv:
477
478
    def find_docs():
478
479
        docs = []
485
486
            if r:
486
487
                relative = root[4:]
487
488
                if relative:
488
 
                    target = os.path.join('Doc\\Bazaar', relative)
 
489
                    target = os.path.join('Doc\\Breezy', relative)
489
490
                else:
490
 
                    target = 'Doc\\Bazaar'
 
491
                    target = 'Doc\\Breezy'
491
492
                docs.append((target, r))
492
493
        return docs
493
494
 
494
495
    # python's distutils-based win32 installer
495
 
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
496
    ARGS = {'scripts': [ 'brz', 'tools/win32/brz-win32-bdist-postinstall.py'],
496
497
            'ext_modules': ext_modules,
497
498
            # help pages
498
499
            'data_files': find_docs(),
499
 
            # for building pyrex extensions
500
 
            'cmdclass': {'build_ext': build_ext_if_possible},
 
500
            # for building cython extensions
 
501
            'cmdclass': command_classes,
501
502
           }
502
503
 
503
504
    ARGS.update(META_INFO)
504
 
    ARGS.update(BZRLIB)
 
505
    ARGS.update(BREEZY)
 
506
    PKG_DATA['package_data']['breezy'].append('locale/*/LC_MESSAGES/*.mo')
505
507
    ARGS.update(PKG_DATA)
506
 
    
 
508
 
507
509
    setup(**ARGS)
508
510
 
509
511
elif 'py2exe' in sys.argv:
510
 
    import glob
511
512
    # py2exe setup
512
513
    import py2exe
513
514
 
514
 
    # pick real bzr version
515
 
    import bzrlib
 
515
    # pick real brz version
 
516
    import breezy
516
517
 
517
518
    version_number = []
518
 
    for i in bzrlib.version_info[:4]:
 
519
    for i in breezy.version_info[:4]:
519
520
        try:
520
521
            i = int(i)
521
522
        except ValueError:
534
535
            install_data.run(self)
535
536
 
536
537
            py2exe = self.distribution.get_command_obj('py2exe', False)
537
 
            optimize = py2exe.optimize
 
538
            # GZ 2010-04-19: Setup has py2exe.optimize as 2, but give plugins
 
539
            #                time before living with docstring stripping
 
540
            optimize = 1
538
541
            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))
539
550
            byte_compile(compile_names,
540
551
                         optimize=optimize,
541
552
                         force=self.force, prefix=self.install_dir,
542
553
                         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])
 
554
            self.outfiles.extend([f + 'o' for f in compile_names])
548
555
    # end of class install_data_with_bytecompile
549
556
 
550
 
    target = py2exe.build_exe.Target(script = "bzr",
551
 
                                     dest_base = "bzr",
552
 
                                     icon_resources = [(0,'bzr.ico')],
 
557
    target = py2exe.build_exe.Target(script = "brz",
 
558
                                     dest_base = "brz",
 
559
                                     icon_resources = [(0,'brz.ico')],
553
560
                                     name = META_INFO['name'],
554
561
                                     version = version_str,
555
562
                                     description = META_INFO['description'],
558
565
                                     company_name = "Canonical Ltd.",
559
566
                                     comments = META_INFO['description'],
560
567
                                    )
 
568
    gui_target = copy.copy(target)
 
569
    gui_target.dest_base = "bzrw"
561
570
 
562
 
    packages = BZRLIB['packages']
563
 
    packages.remove('bzrlib')
564
 
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
571
    packages = BREEZY['packages']
 
572
    packages.remove('breezy')
 
573
    packages = [i for i in packages if not i.startswith('breezy.plugins')]
565
574
    includes = []
566
 
    for i in glob.glob('bzrlib\\*.py'):
 
575
    for i in glob.glob('breezy\\*.py'):
567
576
        module = i[:-3].replace('\\', '.')
568
577
        if module.endswith('__init__'):
569
578
            module = module[:-len('__init__')]
570
579
        includes.append(module)
571
580
 
572
581
    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'):
 
582
    if sys.version.startswith('2.7'):
577
583
        additional_packages.add('xml.etree')
578
584
    else:
579
585
        import warnings
586
592
    excludes = """Tkinter psyco ElementPath r_hmac
587
593
                  ImaginaryModule cElementTree elementtree.ElementTree
588
594
                  Crypto.PublicKey._fastmath
589
 
                  medusa medusa.filesys medusa.ftp_server
590
595
                  tools
591
596
                  resource validate""".split()
592
597
    dll_excludes = []
604
609
        excludes.append("email.MIME" + oldname)
605
610
 
606
611
    # text files for help topis
607
 
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
612
    text_topics = glob.glob('breezy/help_topics/en/*.txt')
608
613
    topics_files = [('lib/help_topics/en', text_topics)]
609
614
 
610
615
    # built-in plugins
613
618
    # which hard-codes the list of plugins, gets more upset if modules are
614
619
    # missing, etc?
615
620
    plugins = None # will be a set after plugin sniffing...
616
 
    for root, dirs, files in os.walk('bzrlib/plugins'):
617
 
        if root == 'bzrlib/plugins':
 
621
    for root, dirs, files in os.walk('breezy/plugins'):
 
622
        if root == 'breezy/plugins':
618
623
            plugins = set(dirs)
619
624
            # We ship plugins as normal files on the file-system - however,
620
625
            # the build process can cause *some* of these plugin files to end
622
627
            # library.zip, and then saw import errors related to that as the
623
628
            # rest of the svn plugin wasn't. So we tell py2exe to leave the
624
629
            # plugins out of the .zip file
625
 
            excludes.extend(["bzrlib.plugins." + d for d in dirs])
 
630
            excludes.extend(["breezy.plugins." + d for d in dirs])
626
631
        x = []
627
632
        for i in files:
628
633
            # Throw away files we don't want packaged. Note that plugins may
631
636
            ext = os.path.splitext(i)[1]
632
637
            if ext.endswith('~') or ext in [".pyc", ".swp"]:
633
638
                continue
634
 
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
639
            if i == '__init__.py' and root == 'breezy/plugins':
635
640
                continue
636
641
            x.append(os.path.join(root, i))
637
642
        if x:
638
 
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
643
            target_dir = root[len('breezy/'):]  # install to 'plugins/...'
639
644
            plugins_files.append((target_dir, x))
640
645
    # find modules for built-in plugins
641
646
    import tools.package_mf
642
647
    mf = tools.package_mf.CustomModuleFinder()
643
 
    mf.run_package('bzrlib/plugins')
 
648
    mf.run_package('breezy/plugins')
644
649
    packs, mods = mf.get_result()
645
650
    additional_packages.update(packs)
646
651
    includes.extend(mods)
648
653
    console_targets = [target,
649
654
                       'tools/win32/bzr_postinstall.py',
650
655
                       ]
651
 
    gui_targets = []
652
 
    data_files = topics_files + plugins_files
 
656
    gui_targets = [gui_target]
 
657
    data_files = topics_files + plugins_files + I18N_FILES
653
658
 
654
659
    if 'qbzr' in plugins:
655
660
        get_qbzr_py2exe_info(includes, excludes, packages, data_files)
657
662
    if 'svn' in plugins:
658
663
        get_svn_py2exe_info(includes, excludes, packages)
659
664
 
 
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
 
660
671
    if "TBZR" in os.environ:
661
672
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
662
673
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
681
692
        # print this warning to stderr as output is redirected, so it is seen
682
693
        # at build time.  Also to stdout so it appears in the log
683
694
        for f in (sys.stderr, sys.stdout):
684
 
            print >> f, \
685
 
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 
695
            f.write("Skipping TBZR binaries - "
 
696
                "please set TBZR to a directory to enable\n")
686
697
 
687
698
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
688
699
    # in on Vista.
689
 
    dll_excludes.extend(["MSWSOCK.dll", "MSVCP60.dll", "powrprof.dll"])
 
700
    dll_excludes.extend(["MSWSOCK.dll",
 
701
                         "MSVCP60.dll",
 
702
                         "MSVCP90.dll",
 
703
                         "powrprof.dll",
 
704
                         "SHFOLDER.dll"])
690
705
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
691
706
                               "includes": includes,
692
707
                               "excludes": excludes,
693
708
                               "dll_excludes": dll_excludes,
694
709
                               "dist_dir": "win32_bzr.exe",
695
 
                               "optimize": 1,
 
710
                               "optimize": 2,
 
711
                               "custom_boot_script":
 
712
                                        "tools/win32/py2exe_boot_common.py",
696
713
                              },
697
714
                   }
698
715
 
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
 
          )
 
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
              )
706
735
 
707
736
else:
708
737
    # ad-hoc for easy_install
709
738
    DATA_FILES = []
710
739
    if not 'bdist_egg' in sys.argv:
711
 
        # generate and install bzr.1 only with plain install, not the
 
740
        # generate and install brz.1 only with plain install, not the
712
741
        # 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
 
 
 
742
        DATA_FILES = [('man/man1', ['brz.1', 'breezy/git/git-remote-bzr.1'])]
 
743
 
 
744
    DATA_FILES = DATA_FILES + I18N_FILES
728
745
    # std setup
729
 
    ARGS = {'scripts': ['bzr'],
 
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'],
730
752
            'data_files': DATA_FILES,
731
753
            'cmdclass': command_classes,
732
754
            'ext_modules': ext_modules,
733
755
           }
734
756
 
735
757
    ARGS.update(META_INFO)
736
 
    ARGS.update(BZRLIB)
 
758
    ARGS.update(BREEZY)
737
759
    ARGS.update(PKG_DATA)
738
760
 
739
 
    setup(**ARGS)
 
761
    if __name__ == '__main__':
 
762
        setup(**ARGS)