All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v3] Add a simple script to remove boards
@ 2019-05-18 16:07 Simon Glass
  2019-05-20  7:19 ` Chris Packham
  0 siblings, 1 reply; 3+ messages in thread
From: Simon Glass @ 2019-05-18 16:07 UTC (permalink / raw)
  To: u-boot

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>
---

Changes in v3:
- Move this into its own separate patch
- Fix typos

 tools/rmboard.py | 150 +++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 150 insertions(+)
 create mode 100755 tools/rmboard.py

diff --git a/tools/rmboard.py b/tools/rmboard.py
new file mode 100755
index 00000000000..df4f04b01c5
--- /dev/null
+++ b/tools/rmboard.py
@@ -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)
-- 
2.21.0.1020.gf2820cf01a-goog

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH v3] Add a simple script to remove boards
  2019-05-18 16:07 [U-Boot] [PATCH v3] Add a simple script to remove boards Simon Glass
@ 2019-05-20  7:19 ` Chris Packham
  2019-06-24 17:17   ` Simon Glass
  0 siblings, 1 reply; 3+ messages in thread
From: Chris Packham @ 2019-05-20  7:19 UTC (permalink / raw)
  To: u-boot

On Sun, 19 May 2019, 4:07 AM Simon Glass, <sjg@chromium.org> wrote:

> 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>

---
>
> Changes in v3:
> - Move this into its own separate patch
> - Fix typos
>
>  tools/rmboard.py | 150 +++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 150 insertions(+)
>  create mode 100755 tools/rmboard.py
>
> diff --git a/tools/rmboard.py b/tools/rmboard.py
> new file mode 100755
> index 00000000000..df4f04b01c5
> --- /dev/null
> +++ b/tools/rmboard.py
> @@ -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)
> --
> 2.21.0.1020.gf2820cf01a-goog
>
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH v3] Add a simple script to remove boards
  2019-05-20  7:19 ` Chris Packham
@ 2019-06-24 17:17   ` Simon Glass
  0 siblings, 0 replies; 3+ messages in thread
From: Simon Glass @ 2019-06-24 17:17 UTC (permalink / raw)
  To: u-boot

On Mon, 20 May 2019 at 01:19, Chris Packham <judge.packham@gmail.com> wrote:
>
> On Sun, 19 May 2019, 4:07 AM Simon Glass, <sjg@chromium.org> wrote:
>>
>> 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>

Applied to u-boot-dm/next

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-06-24 17:17 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-18 16:07 [U-Boot] [PATCH v3] Add a simple script to remove boards Simon Glass
2019-05-20  7:19 ` Chris Packham
2019-06-24 17:17   ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.