#!/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.

import argparse
import subprocess

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Backport a git revision and '
                                     'stash all ChangeLog files.')
    parser.add_argument('revision', help='Revision')
    args = parser.parse_args()

    r = subprocess.run('git cherry-pick -x %s' % args.revision, shell=True)
    if r.returncode == 0:
        cmd = 'git show --name-only --pretty="" -- "*ChangeLog"'
        changelogs = subprocess.check_output(cmd, shell=True, encoding='utf8')
        changelogs = changelogs.strip()
        if changelogs:
            for changelog in changelogs.split('\n'):
                subprocess.check_output('git checkout HEAD~ %s' % changelog,
                                        shell=True)
        subprocess.check_output('git commit --amend --no-edit', shell=True)
    else:
        # 1) remove all ChangeLog files from conflicts
        out = subprocess.check_output('git diff --name-only --diff-filter=U',
                                      shell=True,
                                      encoding='utf8')
        conflicts = out.strip().split('\n')
        changelogs = [c for c in conflicts if c.endswith('ChangeLog')]
        if changelogs:
            cmd = 'git checkout --theirs %s' % ' '.join(changelogs)
            subprocess.check_output(cmd, shell=True)
        # 2) remove all ChangeLog files from index
        cmd = 'git diff --name-only --diff-filter=M HEAD'
        out = subprocess.check_output(cmd, shell=True, encoding='utf8')
        out = out.strip().split('\n')
        modified = [c for c in out if c.endswith('ChangeLog')]
        for m in modified:
            subprocess.check_output('git reset %s' % m, shell=True)
            subprocess.check_output('git checkout %s' % m, shell=True)

        # try to continue
        if len(conflicts) == len(changelogs):
            cmd = 'git -c core.editor=true cherry-pick --continue'
            subprocess.check_output(cmd, shell=True)
        else:
            print('Please resolve all remaining file conflicts.')
