blob: ae256321270016e4962c0cc777269ec87215043d [file] [log] [blame]
Simon Glass515ce962020-04-17 18:08:53 -06001#! /usr/bin/python3
Simon Glass00ba3b12019-05-18 10:07:17 -06002# SPDX-License-Identifier: GPL-2.0+
3# Copyright 2019 Google LLC
4#
5
6"""
7Script to remove boards
8
9Usage:
10 rmboard.py <board_name>...
11
12A single commit is created for each board removed.
13
14Some boards may depend on files provided by another and this will cause
15problems, generally the removal of files which should not be removed.
16
17This script works by:
18 - Looking through the MAINTAINERS files which mention a board to find out
19 what files the board uses
20 - Looking through the Kconfig files which mention a board to find one that
21 needs to have material removed
22
23Search for ## to update the commit message manually.
24"""
25
Simon Glass00ba3b12019-05-18 10:07:17 -060026import glob
27import os
28import re
29import sys
30
Simon Glassbf776672020-04-17 18:09:04 -060031from patman import command
Simon Glass00ba3b12019-05-18 10:07:17 -060032
33def rm_kconfig_include(path):
34 """Remove a path from Kconfig files
35
36 This function finds the given path in a 'source' statement in a Kconfig
37 file and removes that line from the file. This is needed because the path
38 is going to be removed, so any reference to it will cause a problem with
39 Kconfig parsing.
40
41 The changes are made locally and then added to the git staging area.
42
43 Args:
44 path: Path to search for and remove
45 """
46 cmd = ['git', 'grep', path]
Simon Glassd9800692022-01-29 14:14:05 -070047 stdout = command.run_pipe([cmd], capture=True, raise_on_error=False).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -060048 if not stdout:
49 return
50 fname = stdout.split(':')[0]
51
52 print("Fixing up '%s' to remove reference to '%s'" % (fname, path))
53 cmd = ['sed', '-i', '\|%s|d' % path, fname]
Simon Glassd9800692022-01-29 14:14:05 -070054 stdout = command.run_pipe([cmd], capture=True).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -060055
56 cmd = ['git', 'add', fname]
Simon Glassd9800692022-01-29 14:14:05 -070057 stdout = command.run_pipe([cmd], capture=True).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -060058
59def rm_board(board):
60 """Create a commit which removes a single board
61
62 This looks up the MAINTAINERS file to file files that need to be removed,
63 then removes pieces from the Kconfig files that mention the board.
64
65
66 Args:
67 board: Board name to remove
68 """
69
70 # Find all MAINTAINERS and Kconfig files which mention the board
71 cmd = ['git', 'grep', '-l', board]
Simon Glassd9800692022-01-29 14:14:05 -070072 stdout = command.run_pipe([cmd], capture=True).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -060073 maintain = []
74 kconfig = []
75 for line in stdout.splitlines():
76 line = line.strip()
77 if 'MAINTAINERS' in line:
78 if line not in maintain:
79 maintain.append(line)
80 elif 'Kconfig' in line:
81 kconfig.append(line)
82 paths = []
83 cc = []
84
85 # Look through the MAINTAINERS file to find things to remove
86 for fname in maintain:
87 with open(fname) as fd:
88 for line in fd:
89 line = line.strip()
90 fields = re.split('[ \t]', line, 1)
91 if len(fields) == 2:
92 if fields[0] == 'M:':
93 cc.append(fields[1])
94 elif fields[0] == 'F:':
95 paths.append(fields[1].strip())
96
97 # Expand any wildcards in the MAINTAINERS file
98 real = []
99 for path in paths:
100 if path[-1] == '/':
101 path = path[:-1]
102 if '*' in path:
103 globbed = glob.glob(path)
104 print("Expanded '%s' to '%s'" % (path, globbed))
105 real += globbed
106 else:
107 real.append(path)
108
109 # Search for Kconfig files in the resulting list. Remove any 'source' lines
110 # which reference Kconfig files we want to remove
111 for path in real:
112 cmd = ['find', path]
Simon Glassd9800692022-01-29 14:14:05 -0700113 stdout = (command.run_pipe([cmd], capture=True, raise_on_error=False).
Simon Glass00ba3b12019-05-18 10:07:17 -0600114 stdout)
115 for fname in stdout.splitlines():
116 if fname.endswith('Kconfig'):
117 rm_kconfig_include(fname)
118
119 # Remove unwanted files
120 cmd = ['git', 'rm', '-r'] + real
Simon Glassd9800692022-01-29 14:14:05 -0700121 stdout = command.run_pipe([cmd], capture=True).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -0600122
123 ## Change the messages as needed
124 msg = '''arm: Remove %s board
125
126This board has not been converted to CONFIG_DM_MMC by the deadline.
127Remove it.
128
129''' % board
130 for name in cc:
131 msg += 'Patch-cc: %s\n' % name
132
133 # Create the commit
134 cmd = ['git', 'commit', '-s', '-m', msg]
Simon Glassd9800692022-01-29 14:14:05 -0700135 stdout = command.run_pipe([cmd], capture=True).stdout
Simon Glass00ba3b12019-05-18 10:07:17 -0600136
137 # Check if the board is mentioned anywhere else. The user will need to deal
138 # with this
139 cmd = ['git', 'grep', '-il', board]
Simon Glassd9800692022-01-29 14:14:05 -0700140 print(command.run_pipe([cmd], capture=True, raise_on_error=False).stdout)
Simon Glass00ba3b12019-05-18 10:07:17 -0600141 print(' '.join(cmd))
142
143for board in sys.argv[1:]:
144 rm_board(board)