uboot/tools/rmboard.py
<<
>>
Prefs
   1#! /usr/bin/python3
   2# 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
  26import glob
  27import os
  28import re
  29import sys
  30
  31from patman import command
  32
  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]
  47    stdout = command.RunPipe([cmd], capture=True, raise_on_error=False).stdout
  48    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]
  54    stdout = command.RunPipe([cmd], capture=True).stdout
  55
  56    cmd = ['git', 'add', fname]
  57    stdout = command.RunPipe([cmd], capture=True).stdout
  58
  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]
  72    stdout = command.RunPipe([cmd], capture=True).stdout
  73    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]
 113        stdout = (command.RunPipe([cmd], capture=True, raise_on_error=False).
 114                  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
 121    stdout = command.RunPipe([cmd], capture=True).stdout
 122
 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]
 135    stdout = command.RunPipe([cmd], capture=True).stdout
 136
 137    # Check if the board is mentioned anywhere else. The user will need to deal
 138    # with this
 139    cmd = ['git', 'grep', '-il', board]
 140    print(command.RunPipe([cmd], capture=True, raise_on_error=False).stdout)
 141    print(' '.join(cmd))
 142
 143for board in sys.argv[1:]:
 144    rm_board(board)
 145