tools/install-decoders: Minor consistency fix.
[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 def install(srcdir, dstdir):
28     worklist = []
29     for pd in os.listdir(srcdir):
30         pd_dir = srcdir + '/' + pd
31         if not os.path.isdir(pd_dir):
32             continue
33         install_list = []
34         for f in os.listdir(pd_dir):
35             pd_file = pd_dir + '/' + f
36             if not os.path.isfile(pd_file):
37                 continue
38             if f == 'config':
39                 install_list.extend(config_get_extra_install(pd_file))
40             elif f[-3:] == '.py':
41                 install_list.append(f)
42         worklist.append((pd, pd_dir, install_list))
43
44     print("Installing %d protocol decoders:" % len(worklist))
45     col = 0
46     for pd, pd_dir, install_list in worklist:
47         msg = pd + ' '
48         if (col + len(msg) > 80):
49             print()
50             col = 0
51         print(msg, end='')
52         col += len(msg)
53         pd_dst = os.path.join(dstdir, pd)
54         try:
55             os.mkdir(pd_dst)
56         except OSError as e:
57             if e.errno != os.errno.EEXIST:
58                 raise
59             else:
60                 pass
61         for f in install_list:
62             copy(os.path.join(pd_dir, f), pd_dst)
63     print()
64
65
66 def config_get_extra_install(config_file):
67     install_list = []
68     for line in open(config_file).read().split('\n'):
69         line = line.strip()
70         if len(line) == 0 or line[0] == '#':
71             continue
72         words = line.split()
73         if words[0] != 'extra-install':
74             continue
75         install_list.extend(words[1:])
76
77     return install_list
78
79
80 def usage(msg=None):
81     if msg:
82         print(msg)
83         ret = 1
84     else:
85         ret = 0
86     print("""Usage:
87     install-decoders [-i <decoder source>] -o <install path>""")
88     sys.exit(ret)
89
90
91 #
92 # main
93 #
94
95 src = 'decoders'
96 dst = None
97 try:
98     opts, args = getopt(sys.argv[1:], 'i:o:')
99     for opt, arg in opts:
100         if opt == '-i':
101             src = arg
102         elif opt == '-o':
103             dst = arg
104 except Exception as e:
105     usage(str(e))
106
107 if len(args) != 0 or dst is None:
108     usage()
109
110 install(src, dst)
111
112