#!/usr/bin/env python3

# Copyright (C) 2020 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING.  If not, write to
# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
# The script tries to fix commit message where ChangeLog entries
# can point to .cc renamed files.

import argparse
import os
import subprocess
import tempfile

DESCRIPTION = 'Fix up ChangeLog of the current commit.'

script_folder = os.path.dirname(os.path.abspath(__file__))
verify_script = os.path.join(script_folder,
                             'gcc-changelog/git_check_commit.py')


def replace_file_in_changelog(lines, filename, fixed):
    # consider all componenets of a path: gcc/ipa-icf.cc
    while filename:
        for i, line in enumerate(lines):
            if filename in line:
                lines[i] = line.replace(filename, fixed)
                return

        parts = filename.split('/')
        if len(parts) == 1:
            return
        filename = '/'.join(parts[1:])
        fixed = '/'.join(fixed.split('/')[1:])


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=DESCRIPTION)
    args = parser.parse_args()

    # Update commit message if change for a .cc file was taken
    r = subprocess.run(f'{verify_script} HEAD', shell=True, encoding='utf8',
                       stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if r.returncode != 0:
        lines = r.stdout.splitlines()
        cmd = 'git show -s --format=%B'
        commit_message = subprocess.check_output(cmd, shell=True,
                                                 encoding='utf8').strip()
        commit_message = commit_message.splitlines()

        # Parse the following lines:
        # ERR: unchanged file mentioned in a ChangeLog \
        # (did you mean "gcc/ipa-icf.cc"?): "gcc/ipa-icf.c"
        replaced = 0
        for line in lines:
            if ('unchanged file mentioned' in line and
                    'did you mean' in line):
                filename = line.split()[-1].strip('"')
                fixed = line[line.index('did you mean'):]
                fixed = fixed[fixed.index('"') + 1:]
                fixed = fixed[:fixed.index('"')]

                if filename.count('/') == fixed.count('/'):
                    replace_file_in_changelog(commit_message, filename, fixed)
                    replaced += 1

        if replaced:
            with tempfile.NamedTemporaryFile('w', encoding='utf8',
                                             delete=False) as w:
                w.write('\n'.join(commit_message))
                w.close()
                subprocess.check_output(f'git commit --amend -F {w.name}',
                                        shell=True, encoding='utf8')
                os.unlink(w.name)
                print(f'Commit message updated: {replaced} file(s) renamed.')
        else:
            print('Commit message has not been updated.')
