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