Add a simple script to remove boards
This script attempts to create a git commit which removes a single board. It is quite fallible and everything it does needs checking. But it can help speed up the process. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Chris Packham <judge.packham@gmail.com>
This commit is contained in:
parent
9550f9acd6
commit
00ba3b1edc
150
tools/rmboard.py
Executable file
150
tools/rmboard.py
Executable file
@ -0,0 +1,150 @@
|
||||
#! /usr/bin/python
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
# Copyright 2019 Google LLC
|
||||
#
|
||||
|
||||
"""
|
||||
Script to remove boards
|
||||
|
||||
Usage:
|
||||
rmboard.py <board_name>...
|
||||
|
||||
A single commit is created for each board removed.
|
||||
|
||||
Some boards may depend on files provided by another and this will cause
|
||||
problems, generally the removal of files which should not be removed.
|
||||
|
||||
This script works by:
|
||||
- Looking through the MAINTAINERS files which mention a board to find out
|
||||
what files the board uses
|
||||
- Looking through the Kconfig files which mention a board to find one that
|
||||
needs to have material removed
|
||||
|
||||
Search for ## to update the commit message manually.
|
||||
"""
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
# Bring in the patman libraries
|
||||
our_path = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(os.path.join(our_path, '../tools/patman'))
|
||||
|
||||
import command
|
||||
|
||||
def rm_kconfig_include(path):
|
||||
"""Remove a path from Kconfig files
|
||||
|
||||
This function finds the given path in a 'source' statement in a Kconfig
|
||||
file and removes that line from the file. This is needed because the path
|
||||
is going to be removed, so any reference to it will cause a problem with
|
||||
Kconfig parsing.
|
||||
|
||||
The changes are made locally and then added to the git staging area.
|
||||
|
||||
Args:
|
||||
path: Path to search for and remove
|
||||
"""
|
||||
cmd = ['git', 'grep', path]
|
||||
stdout = command.RunPipe([cmd], capture=True, raise_on_error=False).stdout
|
||||
if not stdout:
|
||||
return
|
||||
fname = stdout.split(':')[0]
|
||||
|
||||
print("Fixing up '%s' to remove reference to '%s'" % (fname, path))
|
||||
cmd = ['sed', '-i', '\|%s|d' % path, fname]
|
||||
stdout = command.RunPipe([cmd], capture=True).stdout
|
||||
|
||||
cmd = ['git', 'add', fname]
|
||||
stdout = command.RunPipe([cmd], capture=True).stdout
|
||||
|
||||
def rm_board(board):
|
||||
"""Create a commit which removes a single board
|
||||
|
||||
This looks up the MAINTAINERS file to file files that need to be removed,
|
||||
then removes pieces from the Kconfig files that mention the board.
|
||||
|
||||
|
||||
Args:
|
||||
board: Board name to remove
|
||||
"""
|
||||
|
||||
# Find all MAINTAINERS and Kconfig files which mention the board
|
||||
cmd = ['git', 'grep', '-l', board]
|
||||
stdout = command.RunPipe([cmd], capture=True).stdout
|
||||
maintain = []
|
||||
kconfig = []
|
||||
for line in stdout.splitlines():
|
||||
line = line.strip()
|
||||
if 'MAINTAINERS' in line:
|
||||
if line not in maintain:
|
||||
maintain.append(line)
|
||||
elif 'Kconfig' in line:
|
||||
kconfig.append(line)
|
||||
paths = []
|
||||
cc = []
|
||||
|
||||
# Look through the MAINTAINERS file to find things to remove
|
||||
for fname in maintain:
|
||||
with open(fname) as fd:
|
||||
for line in fd:
|
||||
line = line.strip()
|
||||
fields = re.split('[ \t]', line, 1)
|
||||
if len(fields) == 2:
|
||||
if fields[0] == 'M:':
|
||||
cc.append(fields[1])
|
||||
elif fields[0] == 'F:':
|
||||
paths.append(fields[1].strip())
|
||||
|
||||
# Expand any wildcards in the MAINTAINERS file
|
||||
real = []
|
||||
for path in paths:
|
||||
if path[-1] == '/':
|
||||
path = path[:-1]
|
||||
if '*' in path:
|
||||
globbed = glob.glob(path)
|
||||
print("Expanded '%s' to '%s'" % (path, globbed))
|
||||
real += globbed
|
||||
else:
|
||||
real.append(path)
|
||||
|
||||
# Search for Kconfig files in the resulting list. Remove any 'source' lines
|
||||
# which reference Kconfig files we want to remove
|
||||
for path in real:
|
||||
cmd = ['find', path]
|
||||
stdout = (command.RunPipe([cmd], capture=True, raise_on_error=False).
|
||||
stdout)
|
||||
for fname in stdout.splitlines():
|
||||
if fname.endswith('Kconfig'):
|
||||
rm_kconfig_include(fname)
|
||||
|
||||
# Remove unwanted files
|
||||
cmd = ['git', 'rm', '-r'] + real
|
||||
stdout = command.RunPipe([cmd], capture=True).stdout
|
||||
|
||||
## Change the messages as needed
|
||||
msg = '''arm: Remove %s board
|
||||
|
||||
This board has not been converted to CONFIG_DM_MMC by the deadline.
|
||||
Remove it.
|
||||
|
||||
''' % board
|
||||
for name in cc:
|
||||
msg += 'Patch-cc: %s\n' % name
|
||||
|
||||
# Create the commit
|
||||
cmd = ['git', 'commit', '-s', '-m', msg]
|
||||
stdout = command.RunPipe([cmd], capture=True).stdout
|
||||
|
||||
# Check if the board is mentioned anywhere else. The user will need to deal
|
||||
# with this
|
||||
cmd = ['git', 'grep', '-il', board]
|
||||
print(command.RunPipe([cmd], capture=True, raise_on_error=False).stdout)
|
||||
print(' '.join(cmd))
|
||||
|
||||
for board in sys.argv[1:]:
|
||||
rm_board(board)
|
Loading…
Reference in New Issue
Block a user