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