/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: 2019-02-04 01:01:24 UTC
  • mto: This revision was merged to the branch mainline in revision 7268.
  • Revision ID: jelmer@jelmer.uk-20190204010124-ni0i4qc6f5tnbvux
Fix source 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
 
    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/',
41
 
    'description':  'Friendly distributed version control system',
42
 
    'license':      'GNU GPL v2',
43
 
    'download_url': 'https://launchpad.net/bzr/+download',
 
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/',
 
40
    'description': 'Friendly distributed version control system',
 
41
    'license': 'GNU GPL v2',
 
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
        ],
 
57
    'install_requires': [
 
58
        'configobj',
 
59
        'six>=1.9.0',
 
60
        # Technically, Breezy works without these two dependencies too. But there's
 
61
        # no way to enable them by default and let users opt out.
 
62
        'fastimport>=0.9.8',
 
63
        'dulwich>=0.19.1',
 
64
        ],
 
65
    'extras_require': {
 
66
        'fastimport': [],
 
67
        'git': [],
 
68
        'launchpad': ['launchpadlib>=1.6.3'],
 
69
        },
 
70
    'tests_require': [
 
71
        'testtools',
 
72
    ],
 
73
}
 
74
 
 
75
# The list of packages is automatically generated later. Add other things
 
76
# that are part of BREEZY here.
 
77
BREEZY = {}
 
78
 
 
79
PKG_DATA = {
 
80
    # install files from selftest suite
 
81
    'package_data': {'breezy': ['doc/api/*.txt',
 
82
                                'tests/test_patches_data/*',
 
83
                                'help_topics/en/*.txt',
 
84
                                'tests/ssl_certs/ca.crt',
 
85
                                'tests/ssl_certs/server_without_pass.key',
 
86
                                'tests/ssl_certs/server_with_pass.key',
 
87
                                'tests/ssl_certs/server.crt',
 
88
                                ]},
58
89
    }
59
 
 
60
 
# The list of packages is automatically generated later. Add other things
61
 
# that are part of BZRLIB here.
62
 
BZRLIB = {}
63
 
 
64
 
PKG_DATA = {# install files from selftest suite
65
 
            'package_data': {'bzrlib': ['doc/api/*.txt',
66
 
                                        'tests/test_patches_data/*',
67
 
                                        'help_topics/en/*.txt',
68
 
                                        'tests/ssl_certs/server_without_pass.key',
69
 
                                        'tests/ssl_certs/server_with_pass.key',
70
 
                                        'tests/ssl_certs/server.crt'
71
 
                                       ]},
72
 
           }
73
 
 
74
 
 
75
 
def get_bzrlib_packages():
76
 
    """Recurse through the bzrlib directory, and extract the package names"""
 
90
I18N_FILES = []
 
91
for filepath in glob.glob("breezy/locale/*/LC_MESSAGES/*.mo"):
 
92
    langfile = filepath[len("breezy/locale/"):]
 
93
    targetpath = os.path.dirname(os.path.join("share/locale", langfile))
 
94
    I18N_FILES.append((targetpath, [filepath]))
 
95
 
 
96
def get_breezy_packages():
 
97
    """Recurse through the breezy directory, and extract the package names"""
77
98
 
78
99
    packages = []
79
 
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
 
100
    base_path = os.path.dirname(os.path.abspath(breezy.__file__))
80
101
    for root, dirs, files in os.walk(base_path):
81
102
        if '__init__.py' in files:
82
103
            assert root.startswith(base_path)
83
 
            # Get just the path below bzrlib
 
104
            # Get just the path below breezy
84
105
            package_path = root[len(base_path):]
85
106
            # Remove leading and trailing slashes
86
107
            package_path = package_path.strip('\\/')
87
108
            if not package_path:
88
 
                package_name = 'bzrlib'
 
109
                package_name = 'breezy'
89
110
            else:
90
 
                package_name = ('bzrlib.' +
91
 
                            package_path.replace('/', '.').replace('\\', '.'))
 
111
                package_name = (
 
112
                    'breezy.' +
 
113
                    package_path.replace('/', '.').replace('\\', '.'))
92
114
            packages.append(package_name)
93
115
    return sorted(packages)
94
116
 
95
117
 
96
 
BZRLIB['packages'] = get_bzrlib_packages()
 
118
BREEZY['packages'] = get_breezy_packages()
97
119
 
98
120
 
99
121
from distutils import log
100
122
from distutils.core import setup
 
123
from distutils.version import LooseVersion
101
124
from distutils.command.install_scripts import install_scripts
102
125
from distutils.command.install_data import install_data
103
126
from distutils.command.build import build
108
131
 
109
132
class my_install_scripts(install_scripts):
110
133
    """ Customized install_scripts distutils action.
111
 
    Create bzr.bat for win32.
 
134
    Create brz.bat for win32.
112
135
    """
113
136
    def run(self):
114
137
        install_scripts.run(self)   # standard action
117
140
            try:
118
141
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
119
142
                script_path = self._quoted_path(os.path.join(scripts_dir,
120
 
                                                             "bzr"))
 
143
                                                             "brz"))
121
144
                python_exe = self._quoted_path(sys.executable)
122
145
                args = self._win_batch_args()
123
146
                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)
 
147
                batch_path = os.path.join(self.install_dir, "brz.bat")
 
148
                with open(batch_path, "w") as f:
 
149
                    f.write(batch_str)
 
150
                print(("Created: %s" % batch_path))
 
151
            except Exception:
 
152
                e = sys.exc_info()[1]
 
153
                print(("ERROR: Unable to create %s: %s" % (batch_path, e)))
131
154
 
132
155
    def _quoted_path(self, path):
133
156
        if ' ' in path:
136
159
            return path
137
160
 
138
161
    def _win_batch_args(self):
139
 
        from bzrlib.win32utils import winver
 
162
        from breezy.win32utils import winver
140
163
        if winver == 'Windows NT':
141
164
            return '%*'
142
165
        else:
146
169
 
147
170
class bzr_build(build):
148
171
    """Customized build distutils action.
149
 
    Generate bzr.1.
 
172
    Generate brz.1.
150
173
    """
151
174
 
 
175
    sub_commands = build.sub_commands + [
 
176
        ('build_mo', lambda _: True),
 
177
        ]
 
178
 
152
179
    def run(self):
153
180
        build.run(self)
154
181
 
155
182
        from tools import generate_docs
156
 
        generate_docs.main(argv=["bzr", "man"])
 
183
        generate_docs.main(argv=["brz", "man"])
157
184
 
158
185
 
159
186
########################
160
187
## Setup
161
188
########################
162
189
 
 
190
from breezy.bzr_distutils import build_mo
 
191
 
163
192
command_classes = {'install_scripts': my_install_scripts,
164
 
                   'build': bzr_build}
 
193
                   'build': bzr_build,
 
194
                   'build_mo': build_mo,
 
195
                   }
165
196
from distutils import log
166
197
from distutils.errors import CCompilerError, DistutilsPlatformError
167
198
from distutils.extension import Extension
168
199
ext_modules = []
169
200
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
 
201
    from Cython.Distutils import build_ext
 
202
    from Cython.Compiler.Version import version as cython_version
177
203
except ImportError:
178
 
    have_pyrex = False
 
204
    have_cython = False
179
205
    # 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
 
206
    print("")
 
207
    print("The python package 'Cython' is not available."
 
208
          " If the .c files are available,")
 
209
    print("they will be built,"
 
210
          " but modifying the .pyx files will not rebuild them.")
 
211
    print("")
186
212
    from distutils.command.build_ext import build_ext
187
213
else:
188
 
    have_pyrex = True
189
 
    pyrex_version_info = tuple(map(int, pyrex_version.split('.')))
 
214
    have_cython = True
 
215
    cython_version_info = LooseVersion(cython_version)
190
216
 
191
217
 
192
218
class build_ext_if_possible(build_ext):
204
230
    def run(self):
205
231
        try:
206
232
            build_ext.run(self)
207
 
        except DistutilsPlatformError, e:
 
233
        except DistutilsPlatformError:
 
234
            e = sys.exc_info()[1]
208
235
            if not self.allow_python_fallback:
209
236
                log.warn('\n  Cannot build extensions.\n'
210
237
                         '  Use "build_ext --allow-python-fallback" to use'
229
256
                     % (ext.name,))
230
257
 
231
258
 
232
 
# Override the build_ext if we have Pyrex available
 
259
# Override the build_ext if we have Cython available
233
260
command_classes['build_ext'] = build_ext_if_possible
234
261
unavailable_files = []
235
262
 
236
263
 
237
 
def add_pyrex_extension(module_name, libraries=None, extra_source=[]):
238
 
    """Add a pyrex module to build.
 
264
def add_cython_extension(module_name, libraries=None, extra_source=[]):
 
265
    """Add a cython module to build.
239
266
 
240
 
    This will use Pyrex to auto-generate the .c file if it is available.
 
267
    This will use Cython to auto-generate the .c file if it is available.
241
268
    Otherwise it will fall back on the .c file. If the .c file is not
242
269
    available, it will warn, and not add anything.
243
270
 
248
275
        determine the .pyx and .c files to use.
249
276
    """
250
277
    path = module_name.replace('.', '/')
251
 
    pyrex_name = path + '.pyx'
 
278
    cython_name = path + '.pyx'
252
279
    c_name = path + '.c'
253
280
    define_macros = []
254
281
    if sys.platform == 'win32':
255
 
        # pyrex uses the macro WIN32 to detect the platform, even though it
 
282
        # cython uses the macro WIN32 to detect the platform, even though it
256
283
        # should be using something like _WIN32 or MS_WINDOWS, oh well, we can
257
284
        # give it the right value.
258
285
        define_macros.append(('WIN32', None))
259
 
    if have_pyrex:
260
 
        source = [pyrex_name]
 
286
    if have_cython:
 
287
        source = [cython_name]
261
288
    else:
262
289
        if not os.path.isfile(c_name):
263
290
            unavailable_files.append(c_name)
265
292
        else:
266
293
            source = [c_name]
267
294
    source.extend(extra_source)
268
 
    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')
 
295
    include_dirs = ['breezy']
 
296
    ext_modules.append(
 
297
        Extension(
 
298
            module_name, source, define_macros=define_macros,
 
299
            libraries=libraries, include_dirs=include_dirs))
 
300
 
 
301
 
 
302
add_cython_extension('breezy._simple_set_pyx')
 
303
ext_modules.append(Extension('breezy._static_tuple_c',
 
304
                             ['breezy/_static_tuple_c.c']))
 
305
add_cython_extension('breezy._annotator_pyx')
 
306
add_cython_extension('breezy._bencode_pyx')
 
307
add_cython_extension('breezy._chunks_to_lines_pyx')
 
308
add_cython_extension('breezy.bzr._groupcompress_pyx',
 
309
                     extra_source=['breezy/bzr/diff-delta.c'])
 
310
add_cython_extension('breezy.bzr._knit_load_data_pyx')
 
311
add_cython_extension('breezy._known_graph_pyx')
 
312
add_cython_extension('breezy._rio_pyx')
280
313
if sys.platform == 'win32':
281
 
    add_pyrex_extension('bzrlib._dirstate_helpers_pyx',
282
 
                        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')
 
314
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx',
 
315
                         libraries=['Ws2_32'])
 
316
    add_cython_extension('breezy._walkdirs_win32')
 
317
else:
 
318
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx')
 
319
    add_cython_extension('breezy._readdir_pyx')
 
320
add_cython_extension('breezy.bzr._chk_map_pyx')
 
321
ext_modules.append(Extension('breezy._patiencediff_c',
 
322
                             ['breezy/_patiencediff_c.c']))
 
323
add_cython_extension('breezy.bzr._btree_serializer_pyx')
320
324
 
321
325
 
322
326
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
 
327
    print('C extension(s) not found:')
 
328
    print(('   %s' % ('\n  '.join(unavailable_files),)))
 
329
    print('The python versions will be used instead.')
 
330
    print("")
327
331
 
328
332
 
329
333
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
346
350
    # TBZR points to the TBZR directory
347
351
    tbzr_root = os.environ["TBZR"]
348
352
 
349
 
    # Ensure tbzrlib itself is on sys.path
 
353
    # Ensure tbreezy itself is on sys.path
350
354
    sys.path.append(tbzr_root)
351
355
 
352
 
    packages.append("tbzrlib")
 
356
    packages.append("tbreezy")
353
357
 
354
358
    # collect up our icons.
355
359
    cwd = os.getcwd()
356
 
    ico_root = os.path.join(tbzr_root, 'tbzrlib', 'resources')
 
360
    ico_root = os.path.join(tbzr_root, 'tbreezy', 'resources')
357
361
    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'))
 
362
    # First always brz's icon and its in the root of the brz tree.
 
363
    icos.append(('', 'brz.ico'))
360
364
    for root, dirs, files in os.walk(ico_root):
361
 
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
 
365
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root) + 1:])
362
366
                     for f in files if f.endswith('.ico')])
363
367
    # allocate an icon ID for each file and the full path to the ico
364
368
    icon_resources = [(rid, os.path.join(ico_dir, ico_name))
371
375
                 for rid, (_, f) in enumerate(icos)]
372
376
    ico_map = dict(map_items)
373
377
    # Create a new resource type of 'ICON_MAP', and use ID=1
374
 
    other_resources = [ ("ICON_MAP", 1, pickle.dumps(ico_map))]
 
378
    other_resources = [("ICON_MAP", 1, pickle.dumps(ico_map))]
375
379
 
376
380
    excludes.extend("""pywin pywin.dialogs pywin.dialogs.list
377
381
                       win32ui crawler.Crawler""".split())
379
383
    # tbzrcache executables - a "console" version for debugging and a
380
384
    # GUI version that is generally used.
381
385
    tbzrcache = dict(
382
 
        script = os.path.join(tbzr_root, "scripts", "tbzrcache.py"),
383
 
        icon_resources = icon_resources,
384
 
        other_resources = other_resources,
 
386
        script=os.path.join(tbzr_root, "scripts", "tbzrcache.py"),
 
387
        icon_resources=icon_resources,
 
388
        other_resources=other_resources,
385
389
    )
386
390
    console_targets.append(tbzrcache)
387
391
 
388
392
    # Make a windows version which is the same except for the base name.
389
393
    tbzrcachew = tbzrcache.copy()
390
 
    tbzrcachew["dest_base"]="tbzrcachew"
 
394
    tbzrcachew["dest_base"] = "tbzrcachew"
391
395
    gui_targets.append(tbzrcachew)
392
396
 
393
397
    # ditto for the tbzrcommand tool
394
398
    tbzrcommand = dict(
395
 
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
396
 
        icon_resources = [(0,'bzr.ico')],
 
399
        script=os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
 
400
        icon_resources=icon_resources,
 
401
        other_resources=other_resources,
397
402
    )
398
403
    console_targets.append(tbzrcommand)
399
404
    tbzrcommandw = tbzrcommand.copy()
400
 
    tbzrcommandw["dest_base"]="tbzrcommandw"
 
405
    tbzrcommandw["dest_base"] = "tbzrcommandw"
401
406
    gui_targets.append(tbzrcommandw)
402
 
    
 
407
 
403
408
    # A utility to see python output from both C++ and Python based shell
404
409
    # extensions
405
410
    tracer = dict(script=os.path.join(tbzr_root, "scripts", "tbzrtrace.py"))
413
418
 
414
419
def get_qbzr_py2exe_info(includes, excludes, packages, data_files):
415
420
    # 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')
 
421
    includes.append('PyQt4.QtCore')
 
422
    includes.append('PyQt4.QtGui')
 
423
    includes.append('PyQt4.QtTest')
419
424
    includes.append('sip') # extension module required for Qt.
420
425
    packages.append('pygments') # colorizer for qbzr
421
426
    packages.append('docutils') # html formatting
422
427
    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
428
    # the qt binaries might not be on PATH...
430
429
    # They seem to install to a place like C:\Python25\PyQt4\*
431
430
    # Which is not the same as C:\Python25\Lib\site-packages\PyQt4
473
472
    packages.append('sqlite3')
474
473
 
475
474
 
 
475
def get_git_py2exe_info(includes, excludes, packages):
 
476
    packages.append('dulwich')
 
477
 
 
478
 
 
479
def get_fastimport_py2exe_info(includes, excludes, packages):
 
480
    # This is the python-fastimport package, not to be confused with the
 
481
    # brz-fastimport plugin.
 
482
    packages.append('fastimport')
 
483
 
 
484
 
476
485
if 'bdist_wininst' in sys.argv:
477
486
    def find_docs():
478
487
        docs = []
479
488
        for root, dirs, files in os.walk('doc'):
480
489
            r = []
481
490
            for f in files:
482
 
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
483
 
                    or f == 'quick-start-summary.svg'):
 
491
                if (os.path.splitext(f)[1] in ('.html', '.css', '.png', '.pdf')
 
492
                        or f == 'quick-start-summary.svg'):
484
493
                    r.append(os.path.join(root, f))
485
494
            if r:
486
495
                relative = root[4:]
487
496
                if relative:
488
 
                    target = os.path.join('Doc\\Bazaar', relative)
 
497
                    target = os.path.join('Doc\\Breezy', relative)
489
498
                else:
490
 
                    target = 'Doc\\Bazaar'
 
499
                    target = 'Doc\\Breezy'
491
500
                docs.append((target, r))
492
501
        return docs
493
502
 
494
503
    # python's distutils-based win32 installer
495
 
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
504
    ARGS = {'scripts': ['brz', 'tools/win32/brz-win32-bdist-postinstall.py'],
496
505
            'ext_modules': ext_modules,
497
506
            # help pages
498
507
            'data_files': find_docs(),
499
 
            # for building pyrex extensions
500
 
            'cmdclass': {'build_ext': build_ext_if_possible},
501
 
           }
 
508
            # for building cython extensions
 
509
            'cmdclass': command_classes,
 
510
            }
502
511
 
503
512
    ARGS.update(META_INFO)
504
 
    ARGS.update(BZRLIB)
 
513
    ARGS.update(BREEZY)
 
514
    PKG_DATA['package_data']['breezy'].append('locale/*/LC_MESSAGES/*.mo')
505
515
    ARGS.update(PKG_DATA)
506
 
    
 
516
 
507
517
    setup(**ARGS)
508
518
 
509
519
elif 'py2exe' in sys.argv:
510
 
    import glob
511
520
    # py2exe setup
512
521
    import py2exe
513
522
 
514
 
    # pick real bzr version
515
 
    import bzrlib
 
523
    # pick real brz version
 
524
    import breezy
516
525
 
517
526
    version_number = []
518
 
    for i in bzrlib.version_info[:4]:
 
527
    for i in breezy.version_info[:4]:
519
528
        try:
520
529
            i = int(i)
521
530
        except ValueError:
534
543
            install_data.run(self)
535
544
 
536
545
            py2exe = self.distribution.get_command_obj('py2exe', False)
537
 
            optimize = py2exe.optimize
 
546
            # GZ 2010-04-19: Setup has py2exe.optimize as 2, but give plugins
 
547
            #                time before living with docstring stripping
 
548
            optimize = 1
538
549
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
 
550
            # Round mtime to nearest even second so that installing on a FAT
 
551
            # filesystem bytecode internal and script timestamps will match
 
552
            for f in compile_names:
 
553
                mtime = os.stat(f).st_mtime
 
554
                remainder = mtime % 2
 
555
                if remainder:
 
556
                    mtime -= remainder
 
557
                    os.utime(f, (mtime, mtime))
539
558
            byte_compile(compile_names,
540
559
                         optimize=optimize,
541
560
                         force=self.force, prefix=self.install_dir,
542
561
                         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])
 
562
            self.outfiles.extend([f + 'o' for f in compile_names])
548
563
    # end of class install_data_with_bytecompile
549
564
 
550
 
    target = py2exe.build_exe.Target(script = "bzr",
551
 
                                     dest_base = "bzr",
552
 
                                     icon_resources = [(0,'bzr.ico')],
553
 
                                     name = META_INFO['name'],
554
 
                                     version = version_str,
555
 
                                     description = META_INFO['description'],
556
 
                                     author = META_INFO['author'],
557
 
                                     copyright = "(c) Canonical Ltd, 2005-2010",
558
 
                                     company_name = "Canonical Ltd.",
559
 
                                     comments = META_INFO['description'],
560
 
                                    )
 
565
    target = py2exe.build_exe.Target(
 
566
        script="brz",
 
567
        dest_base="brz",
 
568
        icon_resources=[(0, 'brz.ico')],
 
569
        name=META_INFO['name'],
 
570
        version=version_str,
 
571
        description=META_INFO['description'],
 
572
        author=META_INFO['author'],
 
573
        copyright="(c) Canonical Ltd, 2005-2010",
 
574
        company_name="Canonical Ltd.",
 
575
        comments=META_INFO['description'],
 
576
    )
 
577
    gui_target = copy.copy(target)
 
578
    gui_target.dest_base = "bzrw"
561
579
 
562
 
    packages = BZRLIB['packages']
563
 
    packages.remove('bzrlib')
564
 
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
580
    packages = BREEZY['packages']
 
581
    packages.remove('breezy')
 
582
    packages = [i for i in packages if not i.startswith('breezy.plugins')]
565
583
    includes = []
566
 
    for i in glob.glob('bzrlib\\*.py'):
 
584
    for i in glob.glob('breezy\\*.py'):
567
585
        module = i[:-3].replace('\\', '.')
568
586
        if module.endswith('__init__'):
569
587
            module = module[:-len('__init__')]
570
588
        includes.append(module)
571
589
 
572
590
    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'):
 
591
    if sys.version.startswith('2.7'):
577
592
        additional_packages.add('xml.etree')
578
593
    else:
579
594
        import warnings
586
601
    excludes = """Tkinter psyco ElementPath r_hmac
587
602
                  ImaginaryModule cElementTree elementtree.ElementTree
588
603
                  Crypto.PublicKey._fastmath
589
 
                  medusa medusa.filesys medusa.ftp_server
590
604
                  tools
591
605
                  resource validate""".split()
592
606
    dll_excludes = []
604
618
        excludes.append("email.MIME" + oldname)
605
619
 
606
620
    # text files for help topis
607
 
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
621
    text_topics = glob.glob('breezy/help_topics/en/*.txt')
608
622
    topics_files = [('lib/help_topics/en', text_topics)]
609
623
 
610
624
    # built-in plugins
613
627
    # which hard-codes the list of plugins, gets more upset if modules are
614
628
    # missing, etc?
615
629
    plugins = None # will be a set after plugin sniffing...
616
 
    for root, dirs, files in os.walk('bzrlib/plugins'):
617
 
        if root == 'bzrlib/plugins':
 
630
    for root, dirs, files in os.walk('breezy/plugins'):
 
631
        if root == 'breezy/plugins':
618
632
            plugins = set(dirs)
619
633
            # We ship plugins as normal files on the file-system - however,
620
634
            # the build process can cause *some* of these plugin files to end
622
636
            # library.zip, and then saw import errors related to that as the
623
637
            # rest of the svn plugin wasn't. So we tell py2exe to leave the
624
638
            # plugins out of the .zip file
625
 
            excludes.extend(["bzrlib.plugins." + d for d in dirs])
 
639
            excludes.extend(["breezy.plugins." + d for d in dirs])
626
640
        x = []
627
641
        for i in files:
628
642
            # Throw away files we don't want packaged. Note that plugins may
631
645
            ext = os.path.splitext(i)[1]
632
646
            if ext.endswith('~') or ext in [".pyc", ".swp"]:
633
647
                continue
634
 
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
648
            if i == '__init__.py' and root == 'breezy/plugins':
635
649
                continue
636
650
            x.append(os.path.join(root, i))
637
651
        if x:
638
 
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
652
            target_dir = root[len('breezy/'):]  # install to 'plugins/...'
639
653
            plugins_files.append((target_dir, x))
640
654
    # find modules for built-in plugins
641
655
    import tools.package_mf
642
656
    mf = tools.package_mf.CustomModuleFinder()
643
 
    mf.run_package('bzrlib/plugins')
 
657
    mf.run_package('breezy/plugins')
644
658
    packs, mods = mf.get_result()
645
659
    additional_packages.update(packs)
646
660
    includes.extend(mods)
648
662
    console_targets = [target,
649
663
                       'tools/win32/bzr_postinstall.py',
650
664
                       ]
651
 
    gui_targets = []
652
 
    data_files = topics_files + plugins_files
 
665
    gui_targets = [gui_target]
 
666
    data_files = topics_files + plugins_files + I18N_FILES
653
667
 
654
668
    if 'qbzr' in plugins:
655
669
        get_qbzr_py2exe_info(includes, excludes, packages, data_files)
657
671
    if 'svn' in plugins:
658
672
        get_svn_py2exe_info(includes, excludes, packages)
659
673
 
 
674
    if 'git' in plugins:
 
675
        get_git_py2exe_info(includes, excludes, packages)
 
676
 
 
677
    if 'fastimport' in plugins:
 
678
        get_fastimport_py2exe_info(includes, excludes, packages)
 
679
 
660
680
    if "TBZR" in os.environ:
661
681
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
662
682
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
681
701
        # print this warning to stderr as output is redirected, so it is seen
682
702
        # at build time.  Also to stdout so it appears in the log
683
703
        for f in (sys.stderr, sys.stdout):
684
 
            print >> f, \
685
 
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 
704
            f.write("Skipping TBZR binaries - "
 
705
                    "please set TBZR to a directory to enable\n")
686
706
 
687
707
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
688
708
    # in on Vista.
689
 
    dll_excludes.extend(["MSWSOCK.dll", "MSVCP60.dll", "powrprof.dll"])
 
709
    dll_excludes.extend(["MSWSOCK.dll",
 
710
                         "MSVCP60.dll",
 
711
                         "MSVCP90.dll",
 
712
                         "powrprof.dll",
 
713
                         "SHFOLDER.dll"])
690
714
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
691
715
                               "includes": includes,
692
716
                               "excludes": excludes,
693
717
                               "dll_excludes": dll_excludes,
694
718
                               "dist_dir": "win32_bzr.exe",
695
 
                               "optimize": 1,
696
 
                              },
697
 
                   }
698
 
 
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
 
          )
 
719
                               "optimize": 2,
 
720
                               "custom_boot_script":
 
721
                                   "tools/win32/py2exe_boot_common.py",
 
722
                               },
 
723
                    }
 
724
 
 
725
    # We want the libaray.zip to have optimize = 2, but the exe to have
 
726
    # optimize = 1, so that .py files that get compilied at run time
 
727
    # (e.g. user installed plugins) dont have their doc strings removed.
 
728
    class py2exe_no_oo_exe(py2exe.build_exe.py2exe):
 
729
        def build_executable(self, *args, **kwargs):
 
730
            self.optimize = 1
 
731
            py2exe.build_exe.py2exe.build_executable(self, *args, **kwargs)
 
732
            self.optimize = 2
 
733
 
 
734
    if __name__ == '__main__':
 
735
        command_classes['install_data'] = install_data_with_bytecompile
 
736
        command_classes['py2exe'] = py2exe_no_oo_exe
 
737
        setup(options=options_list,
 
738
              console=console_targets,
 
739
              windows=gui_targets,
 
740
              zipfile='lib/library.zip',
 
741
              data_files=data_files,
 
742
              cmdclass=command_classes,
 
743
              )
706
744
 
707
745
else:
708
746
    # ad-hoc for easy_install
709
747
    DATA_FILES = []
710
 
    if not 'bdist_egg' in sys.argv:
711
 
        # generate and install bzr.1 only with plain install, not the
 
748
    if 'bdist_egg' not in sys.argv:
 
749
        # generate and install brz.1 only with plain install, not the
712
750
        # 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
 
 
 
751
        DATA_FILES = [('man/man1', ['brz.1', 'breezy/git/git-remote-bzr.1'])]
 
752
 
 
753
    DATA_FILES = DATA_FILES + I18N_FILES
728
754
    # std setup
729
 
    ARGS = {'scripts': ['bzr'],
 
755
    ARGS = {'scripts': ['brz',
 
756
                        # TODO(jelmer): Only install the git scripts if
 
757
                        # Dulwich was found.
 
758
                        'breezy/git/git-remote-bzr',
 
759
                        'breezy/git/bzr-receive-pack',
 
760
                        'breezy/git/bzr-upload-pack'],
730
761
            'data_files': DATA_FILES,
731
762
            'cmdclass': command_classes,
732
763
            'ext_modules': ext_modules,
733
 
           }
 
764
            }
734
765
 
735
766
    ARGS.update(META_INFO)
736
 
    ARGS.update(BZRLIB)
 
767
    ARGS.update(BREEZY)
737
768
    ARGS.update(PKG_DATA)
738
769
 
739
 
    setup(**ARGS)
 
770
    if __name__ == '__main__':
 
771
        setup(**ARGS)