/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: 2017-07-23 22:06:41 UTC
  • mfrom: (6738 trunk)
  • mto: This revision was merged to the branch mainline in revision 6739.
  • Revision ID: jelmer@jelmer.uk-20170723220641-69eczax9bmv8d6kk
Merge trunk, address review comments.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python3
 
1
#! /usr/bin/env python
2
2
 
3
3
"""Installation script for brz.
4
4
Run it with
12
12
import copy
13
13
import glob
14
14
 
15
 
if sys.version_info < (3, 5):
16
 
    sys.stderr.write("[ERROR] Not a supported Python version. Need 3.5+\n")
17
 
    sys.exit(1)
18
 
 
19
 
 
20
 
try:
21
 
    import setuptools
22
 
except ImportError as e:
23
 
    sys.stderr.write("[ERROR] Please install setuptools (%s)\n" % e)
24
 
    sys.exit(1)
25
 
 
 
15
if sys.version_info < (2, 7):
 
16
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.7+\n")
 
17
    sys.exit(1)
26
18
 
27
19
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
28
20
# './setup.py' or the equivalent with another path, should always be at the
31
23
 
32
24
def get_long_description():
33
25
    dirname = os.path.dirname(__file__)
34
 
    readme = os.path.join(dirname, 'README.rst')
35
 
    with open(readme, 'r') as f:
 
26
    readme = os.path.join(dirname, 'README')
 
27
    f = open(readme, 'rb')
 
28
    try:
36
29
        return f.read()
 
30
    finally:
 
31
        f.close()
37
32
 
38
33
 
39
34
##
40
35
# META INFORMATION FOR SETUP
41
36
# see http://docs.python.org/dist/meta-data.html
42
37
META_INFO = {
43
 
    'name': 'breezy',
44
 
    'version': breezy.__version__,
45
 
    'maintainer': 'Breezy Developers',
46
 
    'maintainer_email': 'team@breezy-vcs.org',
47
 
    'url': 'https://www.breezy-vcs.org/',
48
 
    'description': 'Friendly distributed version control system',
49
 
    'license': 'GNU GPL v2',
 
38
    'name':         'brz',
 
39
    'version':      breezy.__version__,
 
40
    'author':       'Canonical Ltd',
 
41
    'author_email': 'bazaar@lists.canonical.com',
 
42
    'maintainer':   'Breezy Developers',
 
43
    'url':          'https://www.breezy-vcs.org/',
 
44
    'description':  'Friendly distributed version control system',
 
45
    'license':      'GNU GPL v2',
50
46
    'download_url': 'https://launchpad.net/brz/+download',
51
47
    'long_description': get_long_description(),
52
48
    'classifiers': [
62
58
        'Programming Language :: C',
63
59
        'Topic :: Software Development :: Version Control',
64
60
        ],
65
 
    'install_requires': [
66
 
        'configobj',
67
 
        'patiencediff',
68
 
        # Technically, Breezy works without these two dependencies too. But there's
69
 
        # no way to enable them by default and let users opt out.
70
 
        'dulwich>=0.19.12;python_version>="3.5"',
71
 
        'dulwich<0.20,>=0.19.12;python_version<"3.0"',
72
 
        ],
73
 
    'extras_require': {
74
 
        'fastimport': [],
75
 
        'git': [],
76
 
        'launchpad': ['launchpadlib>=1.6.3'],
77
 
        'workspace': ['pyinotify'],
78
 
        },
79
 
    'tests_require': [
80
 
        'testtools',
81
 
        'testtools<=2.4.0;python_version<"3.0"',
82
 
        'python-subunit',
83
 
    ],
84
 
}
 
61
    }
85
62
 
86
63
# The list of packages is automatically generated later. Add other things
87
 
# that are part of BREEZY here.
88
 
BREEZY = {}
 
64
# that are part of BZRLIB here.
 
65
BZRLIB = {}
89
66
 
90
 
PKG_DATA = {
91
 
    # install files from selftest suite
92
 
    'package_data': {'breezy': ['doc/api/*.txt',
93
 
                                'tests/test_patches_data/*',
94
 
                                'help_topics/en/*.txt',
95
 
                                'tests/ssl_certs/ca.crt',
96
 
                                'tests/ssl_certs/server_without_pass.key',
97
 
                                'tests/ssl_certs/server_with_pass.key',
98
 
                                'tests/ssl_certs/server.crt',
99
 
                                ]},
100
 
    }
 
67
PKG_DATA = {# install files from selftest suite
 
68
            'package_data': {'breezy': ['doc/api/*.txt',
 
69
                                        'tests/test_patches_data/*',
 
70
                                        'help_topics/en/*.txt',
 
71
                                        'tests/ssl_certs/ca.crt',
 
72
                                        'tests/ssl_certs/server_without_pass.key',
 
73
                                        'tests/ssl_certs/server_with_pass.key',
 
74
                                        'tests/ssl_certs/server.crt',
 
75
                                       ]},
 
76
           }
101
77
I18N_FILES = []
102
78
for filepath in glob.glob("breezy/locale/*/LC_MESSAGES/*.mo"):
103
79
    langfile = filepath[len("breezy/locale/"):]
119
95
            if not package_path:
120
96
                package_name = 'breezy'
121
97
            else:
122
 
                package_name = (
123
 
                    'breezy.' +
124
 
                    package_path.replace('/', '.').replace('\\', '.'))
 
98
                package_name = ('breezy.' +
 
99
                            package_path.replace('/', '.').replace('\\', '.'))
125
100
            packages.append(package_name)
126
101
    return sorted(packages)
127
102
 
128
103
 
129
 
BREEZY['packages'] = get_breezy_packages()
130
 
 
131
 
 
132
 
from setuptools import setup
 
104
BZRLIB['packages'] = get_breezy_packages()
 
105
 
 
106
 
 
107
from distutils import log
 
108
from distutils.core import setup
133
109
from distutils.version import LooseVersion
134
110
from distutils.command.install_scripts import install_scripts
135
111
from distutils.command.install_data import install_data
152
128
                script_path = self._quoted_path(os.path.join(scripts_dir,
153
129
                                                             "brz"))
154
130
                python_exe = self._quoted_path(sys.executable)
155
 
                batch_str = "@%s %s %%*" % (python_exe, script_path)
 
131
                args = self._win_batch_args()
 
132
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
156
133
                batch_path = os.path.join(self.install_dir, "brz.bat")
157
 
                with open(batch_path, "w") as f:
158
 
                    f.write(batch_str)
 
134
                f = file(batch_path, "w")
 
135
                f.write(batch_str)
 
136
                f.close()
159
137
                print(("Created: %s" % batch_path))
160
138
            except Exception:
161
139
                e = sys.exc_info()[1]
166
144
            return '"' + path + '"'
167
145
        else:
168
146
            return path
 
147
 
 
148
    def _win_batch_args(self):
 
149
        from breezy.win32utils import winver
 
150
        if winver == 'Windows NT':
 
151
            return '%*'
 
152
        else:
 
153
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
169
154
#/class my_install_scripts
170
155
 
171
156
 
175
160
    """
176
161
 
177
162
    sub_commands = build.sub_commands + [
178
 
        ('build_mo', lambda _: True),
179
 
        ]
 
163
            ('build_mo', lambda _: True),
 
164
            ]
180
165
 
181
166
    def run(self):
182
167
        build.run(self)
213
198
    print("")
214
199
    from distutils.command.build_ext import build_ext
215
200
else:
216
 
    minimum_cython_version = '0.29'
 
201
    have_cython = True
217
202
    cython_version_info = LooseVersion(cython_version)
218
 
    if cython_version_info < LooseVersion(minimum_cython_version):
219
 
        print("Version of Cython is too old. "
220
 
              "Current is %s, need at least %s."
221
 
              % (cython_version, minimum_cython_version))
222
 
        print("If the .c files are available, they will be built,"
223
 
              " but modifying the .pyx files will not rebuild them.")
224
 
        have_cython = False
225
 
    else:
226
 
        have_cython = True
227
203
 
228
204
 
229
205
class build_ext_if_possible(build_ext):
304
280
            source = [c_name]
305
281
    source.extend(extra_source)
306
282
    include_dirs = ['breezy']
307
 
    ext_modules.append(
308
 
        Extension(
309
 
            module_name, source, define_macros=define_macros,
310
 
            libraries=libraries, include_dirs=include_dirs))
 
283
    ext_modules.append(Extension(module_name, source,
 
284
        define_macros=define_macros, libraries=libraries,
 
285
        include_dirs=include_dirs))
311
286
 
312
287
 
313
288
add_cython_extension('breezy._simple_set_pyx')
317
292
add_cython_extension('breezy._bencode_pyx')
318
293
add_cython_extension('breezy._chunks_to_lines_pyx')
319
294
add_cython_extension('breezy.bzr._groupcompress_pyx',
320
 
                     extra_source=['breezy/bzr/diff-delta.c'])
 
295
                    extra_source=['breezy/bzr/diff-delta.c'])
321
296
add_cython_extension('breezy.bzr._knit_load_data_pyx')
322
297
add_cython_extension('breezy._known_graph_pyx')
323
298
add_cython_extension('breezy._rio_pyx')
324
299
if sys.platform == 'win32':
325
300
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx',
326
 
                         libraries=['Ws2_32'])
 
301
                        libraries=['Ws2_32'])
327
302
    add_cython_extension('breezy._walkdirs_win32')
328
303
else:
329
304
    add_cython_extension('breezy.bzr._dirstate_helpers_pyx')
330
305
    add_cython_extension('breezy._readdir_pyx')
331
306
add_cython_extension('breezy.bzr._chk_map_pyx')
 
307
ext_modules.append(Extension('breezy._patiencediff_c',
 
308
                             ['breezy/_patiencediff_c.c']))
332
309
add_cython_extension('breezy.bzr._btree_serializer_pyx')
333
310
 
334
311
 
371
348
    # First always brz's icon and its in the root of the brz tree.
372
349
    icos.append(('', 'brz.ico'))
373
350
    for root, dirs, files in os.walk(ico_root):
374
 
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root) + 1:])
 
351
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
375
352
                     for f in files if f.endswith('.ico')])
376
353
    # allocate an icon ID for each file and the full path to the ico
377
354
    icon_resources = [(rid, os.path.join(ico_dir, ico_name))
384
361
                 for rid, (_, f) in enumerate(icos)]
385
362
    ico_map = dict(map_items)
386
363
    # Create a new resource type of 'ICON_MAP', and use ID=1
387
 
    other_resources = [("ICON_MAP", 1, pickle.dumps(ico_map))]
 
364
    other_resources = [ ("ICON_MAP", 1, pickle.dumps(ico_map))]
388
365
 
389
366
    excludes.extend("""pywin pywin.dialogs pywin.dialogs.list
390
367
                       win32ui crawler.Crawler""".split())
392
369
    # tbzrcache executables - a "console" version for debugging and a
393
370
    # GUI version that is generally used.
394
371
    tbzrcache = dict(
395
 
        script=os.path.join(tbzr_root, "scripts", "tbzrcache.py"),
396
 
        icon_resources=icon_resources,
397
 
        other_resources=other_resources,
 
372
        script = os.path.join(tbzr_root, "scripts", "tbzrcache.py"),
 
373
        icon_resources = icon_resources,
 
374
        other_resources = other_resources,
398
375
    )
399
376
    console_targets.append(tbzrcache)
400
377
 
401
378
    # Make a windows version which is the same except for the base name.
402
379
    tbzrcachew = tbzrcache.copy()
403
 
    tbzrcachew["dest_base"] = "tbzrcachew"
 
380
    tbzrcachew["dest_base"]="tbzrcachew"
404
381
    gui_targets.append(tbzrcachew)
405
382
 
406
383
    # ditto for the tbzrcommand tool
407
384
    tbzrcommand = dict(
408
 
        script=os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
409
 
        icon_resources=icon_resources,
410
 
        other_resources=other_resources,
 
385
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
 
386
        icon_resources = icon_resources,
 
387
        other_resources = other_resources,
411
388
    )
412
389
    console_targets.append(tbzrcommand)
413
390
    tbzrcommandw = tbzrcommand.copy()
414
 
    tbzrcommandw["dest_base"] = "tbzrcommandw"
 
391
    tbzrcommandw["dest_base"]="tbzrcommandw"
415
392
    gui_targets.append(tbzrcommandw)
416
 
 
 
393
    
417
394
    # A utility to see python output from both C++ and Python based shell
418
395
    # extensions
419
396
    tracer = dict(script=os.path.join(tbzr_root, "scripts", "tbzrtrace.py"))
497
474
        for root, dirs, files in os.walk('doc'):
498
475
            r = []
499
476
            for f in files:
500
 
                if (os.path.splitext(f)[1] in ('.html', '.css', '.png', '.pdf')
501
 
                        or f == 'quick-start-summary.svg'):
 
477
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
 
478
                    or f == 'quick-start-summary.svg'):
502
479
                    r.append(os.path.join(root, f))
503
480
            if r:
504
481
                relative = root[4:]
516
493
            'data_files': find_docs(),
517
494
            # for building cython extensions
518
495
            'cmdclass': command_classes,
519
 
            }
 
496
           }
520
497
 
521
498
    ARGS.update(META_INFO)
522
 
    ARGS.update(BREEZY)
 
499
    ARGS.update(BZRLIB)
523
500
    PKG_DATA['package_data']['breezy'].append('locale/*/LC_MESSAGES/*.mo')
524
501
    ARGS.update(PKG_DATA)
525
502
 
571
548
            self.outfiles.extend([f + 'o' for f in compile_names])
572
549
    # end of class install_data_with_bytecompile
573
550
 
574
 
    target = py2exe.build_exe.Target(
575
 
        script="brz",
576
 
        dest_base="brz",
577
 
        icon_resources=[(0, 'brz.ico')],
578
 
        name=META_INFO['name'],
579
 
        version=version_str,
580
 
        description=META_INFO['description'],
581
 
        author=META_INFO['author'],
582
 
        copyright="(c) Canonical Ltd, 2005-2010",
583
 
        company_name="Canonical Ltd.",
584
 
        comments=META_INFO['description'],
585
 
    )
 
551
    target = py2exe.build_exe.Target(script = "brz",
 
552
                                     dest_base = "brz",
 
553
                                     icon_resources = [(0,'brz.ico')],
 
554
                                     name = META_INFO['name'],
 
555
                                     version = version_str,
 
556
                                     description = META_INFO['description'],
 
557
                                     author = META_INFO['author'],
 
558
                                     copyright = "(c) Canonical Ltd, 2005-2010",
 
559
                                     company_name = "Canonical Ltd.",
 
560
                                     comments = META_INFO['description'],
 
561
                                    )
586
562
    gui_target = copy.copy(target)
587
563
    gui_target.dest_base = "bzrw"
588
564
 
589
 
    packages = BREEZY['packages']
 
565
    packages = BZRLIB['packages']
590
566
    packages.remove('breezy')
591
567
    packages = [i for i in packages if not i.startswith('breezy.plugins')]
592
568
    includes = []
597
573
        includes.append(module)
598
574
 
599
575
    additional_packages = set()
 
576
    if sys.version.startswith('2.7'):
 
577
        additional_packages.add('xml.etree')
 
578
    else:
 
579
        import warnings
 
580
        warnings.warn('Unknown Python version.\n'
 
581
                      'Please check setup.py script for compatibility.')
600
582
 
601
583
    # Although we currently can't enforce it, we consider it an error for
602
584
    # py2exe to report any files are "missing".  Such modules we know aren't
705
687
        # at build time.  Also to stdout so it appears in the log
706
688
        for f in (sys.stderr, sys.stdout):
707
689
            f.write("Skipping TBZR binaries - "
708
 
                    "please set TBZR to a directory to enable\n")
 
690
                "please set TBZR to a directory to enable\n")
709
691
 
710
692
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
711
693
    # in on Vista.
721
703
                               "dist_dir": "win32_bzr.exe",
722
704
                               "optimize": 2,
723
705
                               "custom_boot_script":
724
 
                                   "tools/win32/py2exe_boot_common.py",
725
 
                               },
726
 
                    }
 
706
                                        "tools/win32/py2exe_boot_common.py",
 
707
                              },
 
708
                   }
727
709
 
728
710
    # We want the libaray.zip to have optimize = 2, but the exe to have
729
711
    # optimize = 1, so that .py files that get compilied at run time
748
730
else:
749
731
    # ad-hoc for easy_install
750
732
    DATA_FILES = []
751
 
    if 'bdist_egg' not in sys.argv:
 
733
    if not 'bdist_egg' in sys.argv:
752
734
        # generate and install brz.1 only with plain install, not the
753
735
        # easy_install one
754
 
        DATA_FILES = [('man/man1', ['brz.1', 'breezy/git/git-remote-bzr.1'])]
 
736
        DATA_FILES = [('man/man1', ['brz.1'])]
755
737
 
756
738
    DATA_FILES = DATA_FILES + I18N_FILES
757
739
    # std setup
758
 
    ARGS = {'scripts': ['brz',
759
 
                        # TODO(jelmer): Only install the git scripts if
760
 
                        # Dulwich was found.
761
 
                        'breezy/git/git-remote-bzr',
762
 
                        'breezy/git/bzr-receive-pack',
763
 
                        'breezy/git/bzr-upload-pack'],
 
740
    ARGS = {'scripts': ['brz'],
764
741
            'data_files': DATA_FILES,
765
742
            'cmdclass': command_classes,
766
743
            'ext_modules': ext_modules,
767
 
            }
 
744
           }
768
745
 
769
746
    ARGS.update(META_INFO)
770
 
    ARGS.update(BREEZY)
 
747
    ARGS.update(BZRLIB)
771
748
    ARGS.update(PKG_DATA)
772
749
 
773
750
    if __name__ == '__main__':