testsuite: remove SPE tests.
[official-gcc.git] / contrib / gcc-changelog / git_email.py
blob014fdd1004b4b04ba67fb87a72a9feb59debcc31
1 #!/usr/bin/env python3
3 # This file is part of GCC.
5 # GCC is free software; you can redistribute it and/or modify it under
6 # the terms of the GNU General Public License as published by the Free
7 # Software Foundation; either version 3, or (at your option) any later
8 # version.
10 # GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 # for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with GCC; see the file COPYING3. If not see
17 # <http://www.gnu.org/licenses/>. */
19 import os
20 import sys
21 from itertools import takewhile
23 from dateutil.parser import parse
25 from git_commit import GitCommit, GitInfo
27 from unidiff import PatchSet
29 DATE_PREFIX = 'Date: '
30 FROM_PREFIX = 'From: '
33 class GitEmail(GitCommit):
34 def __init__(self, filename, strict=False):
35 self.filename = filename
36 diff = PatchSet.from_filename(filename)
37 date = None
38 author = None
40 with open(self.filename, 'r') as f:
41 lines = f.read().splitlines()
42 lines = list(takewhile(lambda line: line != '---', lines))
43 for line in lines:
44 if line.startswith(DATE_PREFIX):
45 date = parse(line[len(DATE_PREFIX):])
46 elif line.startswith(FROM_PREFIX):
47 author = GitCommit.format_git_author(line[len(FROM_PREFIX):])
48 header = list(takewhile(lambda line: line != '', lines))
49 body = lines[len(header) + 1:]
51 modified_files = []
52 for f in diff:
53 # Strip "a/" and "b/" prefixes
54 source = f.source_file[2:]
55 target = f.target_file[2:]
57 if f.is_added_file:
58 t = 'A'
59 elif f.is_removed_file:
60 t = 'D'
61 elif f.is_rename:
62 # Consider that renamed files are two operations: the deletion
63 # of the original name and the addition of the new one.
64 modified_files.append((source, 'D'))
65 t = 'A'
66 else:
67 t = 'M'
68 modified_files.append((target, t))
69 git_info = GitInfo(None, date, author, body, modified_files)
70 super().__init__(git_info, strict=strict,
71 commit_to_info_hook=lambda x: None)
74 # With zero arguments, process every patch file in the ./patches directory.
75 # With one argument, process the named patch file.
76 # Patch files must be in 'git format-patch' format.
77 if __name__ == '__main__':
78 if len(sys.argv) == 1:
79 allfiles = []
80 for root, _dirs, files in os.walk('patches'):
81 for f in files:
82 full = os.path.join(root, f)
83 allfiles.append(full)
85 success = 0
86 for full in sorted(allfiles):
87 email = GitEmail(full, False)
88 print(email.filename)
89 if email.success:
90 success += 1
91 print(' OK')
92 else:
93 for error in email.errors:
94 print(' ERR: %s' % error)
96 print()
97 print('Successfully parsed: %d/%d' % (success, len(allfiles)))
98 else:
99 email = GitEmail(sys.argv[1], False)
100 if email.success:
101 print('OK')
102 email.print_output()
103 else:
104 if not email.info.lines:
105 print('Error: patch contains no parsed lines', file=sys.stderr)
106 email.print_errors()
107 sys.exit(1)