123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #! /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__))
- 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)
|