bf776679a7
At present patman sets the python path on startup so that it can access the libraries it needs. If we convert to use absolute imports this is not necessary. Move patman to use absolute imports. This requires changes in tools which use the patman libraries (which is most of them). Signed-off-by: Simon Glass <sjg@chromium.org>
149 lines
4.4 KiB
Python
Executable File
149 lines
4.4 KiB
Python
Executable File
#! /usr/bin/python3
|
|
# 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.
|
|
"""
|
|
|
|
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'))
|
|
|
|
from 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)
|