atsha204a: Use the Python 'in' keyword to improve readability.
[libsigrokdecode.git] / tools / install-decoders
1 #!/usr/bin/env python3
2 ##
3 ## This file is part of the libsigrokdecode project.
4 ##
5 ## Copyright (C) 2013 Bert Vermeulen <bert@biot.com>
6 ##
7 ## This program is free software; you can redistribute it and/or modify
8 ## it under the terms of the GNU General Public License as published by
9 ## the Free Software Foundation; either version 3 of the License, or
10 ## (at your option) any later version.
11 ##
12 ## This program is distributed in the hope that it will be useful,
13 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ## GNU General Public License for more details.
16 ##
17 ## You should have received a copy of the GNU General Public License
18 ## along with this program; if not, see <http://www.gnu.org/licenses/>.
19 ##
20
21 import os
22 import sys
23 from shutil import copy
24 from getopt import getopt
25
26
27 _inst_pp_col_max = 80
28 _inst_pp_col = 0
29 def _install_pretty_print(item):
30     """Pretty print an install item. Enforce maximum line width."""
31     global _inst_pp_col
32     if item is None:
33         _inst_pp_col = 0
34         return
35     _inst_pp_col += len(item)
36     if _inst_pp_col > _inst_pp_col_max:
37         print()
38         _inst_pp_col = len(item)
39     print(item, end = "")
40
41 def install(srcdir, dstdir, s):
42     worklist = []
43     for pd in os.listdir(srcdir):
44         pd_dir = srcdir + '/' + pd
45         if not os.path.isdir(pd_dir):
46             continue
47         install_list = []
48         for f in os.listdir(pd_dir):
49             pd_file = pd_dir + '/' + f
50             if not os.path.isfile(pd_file):
51                 continue
52             if f == 'config':
53                 install_list.extend(config_get_extra_install(pd_file))
54             elif f[-3:] == '.py':
55                 install_list.append(f)
56         if install_list:
57             worklist.append((pd, pd_dir, install_list))
58
59     worklist.sort()
60     print("Installing %d %s:" % (len(worklist), s))
61     for pd, pd_dir, install_list in worklist:
62         _install_pretty_print("{} ".format(pd))
63         pd_dst = os.path.join(dstdir, pd)
64         try:
65             os.mkdir(pd_dst)
66         except OSError as e:
67             if e.errno != os.errno.EEXIST:
68                 raise
69             else:
70                 pass
71         for f in install_list:
72             copy(os.path.join(pd_dir, f), pd_dst)
73     print()
74     _install_pretty_print(None)
75
76
77 def config_get_extra_install(config_file):
78     install_list = []
79     for line in open(config_file).read().split('\n'):
80         line = line.strip()
81         if len(line) == 0 or line[0] == '#':
82             continue
83         words = line.split()
84         if words[0] != 'extra-install':
85             continue
86         install_list.extend(words[1:])
87
88     return install_list
89
90
91 def usage(msg=None):
92     if msg:
93         print(msg)
94         ret = 1
95     else:
96         ret = 0
97     print("""Usage:
98     install-decoders [-i <decoder source>] -o <install path>""")
99     sys.exit(ret)
100
101
102 #
103 # main
104 #
105
106 src = 'decoders'
107 dst = None
108 try:
109     opts, args = getopt(sys.argv[1:], 'i:o:')
110     for opt, arg in opts:
111         if opt == '-i':
112             src = arg
113         elif opt == '-o':
114             dst = arg
115 except Exception as e:
116     usage(str(e))
117
118 if len(args) != 0 or dst is None:
119     usage()
120
121 install(src, dst, 'protocol decoders')
122 install(src + '/common', dst + '/common', 'common modules')
123
124