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