1#!/usr/local/bin/python3.8
2# vim:fileencoding=UTF-8:ts=4:sw=4:sta:et:sts=4:ai
3
4
5__license__ = 'GPL v3'
6__copyright__ = '2009, Kovid Goyal <kovid@kovidgoyal.net>'
7__docformat__ = 'restructuredtext en'
8
9import sys, os
10
11
12def check_version_info(minver=(3, 7, 0)):
13    vi = sys.version_info
14    if vi < minver:
15        def fmt(v):
16            return '.'.join(map(str, v[:3]))
17        exit('calibre requires Python >= {}. Current Python version: {}'.format(fmt(minver), fmt(vi)))
18
19
20check_version_info()
21
22sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
23
24import setup.commands as commands
25from setup import prints, get_warnings
26
27
28def option_parser():
29    import optparse
30    parser = optparse.OptionParser()
31    parser.add_option(
32        '-c',
33        '--clean',
34        default=False,
35        action='store_true',
36        help=('Instead of running the command delete all files generated '
37              'by the command'))
38    parser.add_option(
39        '--clean-backups',
40        default=False,
41        action='store_true',
42        help='Delete all backup files from the source tree')
43    parser.add_option(
44        '--clean-all',
45        default=False,
46        action='store_true',
47        help='Delete all machine generated files from the source tree')
48    return parser
49
50
51def clean_backups():
52    for root, _, files in os.walk('.'):
53        for name in files:
54            for t in ('.pyc', '.pyo', '~', '.swp', '.swo'):
55                if name.endswith(t):
56                    os.remove(os.path.join(root, name))
57
58
59def main(args=sys.argv):
60    if len(args) == 1 or args[1] in ('-h', '--help'):
61        print('Usage: python', args[0], 'command', '[options]')
62        print('\nWhere command is one of:')
63        print()
64        for x in sorted(commands.__all__):
65            print('{:20} -'.format(x), end=' ')
66            c = getattr(commands, x)
67            desc = getattr(c, 'short_description', c.description)
68            print(desc)
69
70        print('\nTo get help on a particular command, run:')
71        print('\tpython', args[0], 'command -h')
72        return 1
73
74    command = args[1]
75    if command not in commands.__all__:
76        print(command, 'is not a recognized command.')
77        print('Valid commands:', ', '.join(commands.__all__))
78        return 1
79
80    command = getattr(commands, command)
81
82    parser = option_parser()
83    command.add_all_options(parser)
84    parser.set_usage(
85        'Usage: python setup.py {} [options]\n\n'.format(args[1]) + command.description)
86
87    opts, args = parser.parse_args(args)
88    opts.cli_args = args[2:]
89
90    if opts.clean_backups:
91        clean_backups()
92
93    if opts.clean:
94        prints('Cleaning', args[1])
95        command.clean()
96        return 0
97
98    if opts.clean_all:
99        for cmd in commands.__all__:
100            prints('Cleaning', cmd)
101            getattr(commands, cmd).clean()
102        return 0
103
104    command.run_all(opts)
105
106    warnings = get_warnings()
107    if warnings:
108        print()
109        prints('There were', len(warnings), 'warning(s):')
110        print()
111        for args, kwargs in warnings:
112            prints('*', *args, **kwargs)
113            print()
114
115    return 0
116
117
118if __name__ == '__main__':
119    sys.exit(main())
120