tools/docs/gen-renames.py

Source file repositories/reference/linux-study-clean/tools/docs/gen-renames.py

File Facts

System
Linux kernel
Corpus path
tools/docs/gen-renames.py
Extension
.py
Size
3046 bytes
Lines
131
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: tools
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

#! /usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
#
# Copyright © 2025, Oracle and/or its affiliates.
# Author: Vegard Nossum <vegard.nossum@oracle.com>

"""Trawl repository history for renames of Documentation/**.rst files.

Example:

    tools/docs/gen-renames.py --rev HEAD > Documentation/.renames.txt
"""

import argparse
import itertools
import os
import subprocess
import sys

parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('--rev', default='HEAD', help='generate renames up to this revision')

args = parser.parse_args()

def normalize(path):
    prefix = 'Documentation/'
    suffix = '.rst'

    assert path.startswith(prefix)
    assert path.endswith(suffix)

    return path[len(prefix):-len(suffix)]

class Name(object):
    def __init__(self, name):
        self.names = [name]

    def rename(self, new_name):
        self.names.append(new_name)

names = {
}

for line in subprocess.check_output([
    'git', 'log',
    '--reverse',
    '--oneline',
    '--find-renames',
    '--diff-filter=RD',
    '--name-status',
    '--format=commit %H',
    # ~v4.8-ish is when Sphinx/.rst was added in the first place
    f'v4.8..{args.rev}',
    '--',
    'Documentation/'
], text=True).splitlines():
    # rename
    if line.startswith('R'):
        _, old, new = line[1:].split('\t', 2)

        if old.endswith('.rst') and new.endswith('.rst'):
            old = normalize(old)
            new = normalize(new)

            name = names.get(old)
            if name is None:
                name = Name(old)
            else:
                del names[old]

Annotation

Implementation Notes