comparison garcon/changelog.py @ 797:be8b233cc69a

cm: Add a "Bugfixes" section to the CHANGELOG and order things alphabetically.
author Ludovic Chabant <ludovic@chabant.com>
date Wed, 07 Sep 2016 23:15:07 -0700
parents 3ab6f7a3a2c7
children 22cf13b86cc3 68f799dc4680
comparison
equal deleted inserted replaced
796:3900169ac81b 797:be8b233cc69a
7 7
8 8
9 hg_log_template = ("{if(tags, '>>{tags};{date|shortdate}\n')}" 9 hg_log_template = ("{if(tags, '>>{tags};{date|shortdate}\n')}"
10 "{desc|firstline}\n\n") 10 "{desc|firstline}\n\n")
11 11
12 re_add_tag_changeset = re.compile('^Added tag [^\s]+ for changeset [\w\d]+$')
13 re_merge_pr_changeset = re.compile('^Merge pull request')
14 re_tag = re.compile('^\d+\.\d+\.\d+([ab]\d+)?(rc\d+)?$') 12 re_tag = re.compile('^\d+\.\d+\.\d+([ab]\d+)?(rc\d+)?$')
15 re_change = re.compile('^(\w+):') 13 re_change = re.compile('^(\w+):')
16 re_clean_code_span = re.compile('([^\s])``([^\s]+)') 14 re_clean_code_span = re.compile('([^\s])``([^\s]+)')
17 15
18 category_commands = [ 16 category_commands = [
19 'chef', 'bake', 'find', 'help', 'import', 'init', 'paths', 'plugin', 17 'chef', 'bake', 'find', 'help', 'import', 'init', 'paths', 'plugin',
20 'plugins', 'prepare', 'purge', 'root', 'routes', 'serve', 18 'plugins', 'prepare', 'purge', 'root', 'routes', 'serve',
21 'showconfig', 'showrecord', 'sources', 'theme', 'themes', 'admin', 19 'showconfig', 'showrecord', 'sources', 'theme', 'themes', 'admin',
22 'publish'] 20 'publish']
23 category_core = [ 21 category_core = [
24 'internal', 'bug', 'templating', 'formatting', 'performance', 22 'internal', 'templating', 'formatting', 'performance',
25 'data', 'config', 'rendering', 'render', 'debug', 'reporting', 23 'data', 'config', 'rendering', 'render', 'debug', 'reporting',
26 'linker', 'pagination', 'routing', 'caching', 'cli'] 24 'linker', 'pagination', 'routing', 'caching', 'cli']
25 category_bugfixes = [
26 'bug']
27 category_project = ['build', 'cm', 'docs', 'tests', 'setup'] 27 category_project = ['build', 'cm', 'docs', 'tests', 'setup']
28 categories = [ 28 categories = [
29 ('commands', category_commands), 29 ('commands', category_commands),
30 ('core', category_core), 30 ('core', category_core),
31 ('bugfixes', category_bugfixes),
31 ('project', category_project), 32 ('project', category_project),
32 ('miscellaneous', None)] 33 ('miscellaneous', None)]
33 category_names = list(map(lambda i: i[0], categories)) 34 category_names = list(map(lambda i: i[0], categories))
35
36 re_add_tag_changeset = re.compile('^Added tag [^\s]+ for changeset [\w\d]+$')
37 re_merge_pr_changeset = re.compile('^Merge pull request')
38 re_merge_changes_changeset = re.compile('^Merge(d?) changes')
39 message_blacklist = [
40 re_add_tag_changeset,
41 re_merge_pr_changeset,
42 re_merge_changes_changeset]
34 43
35 44
36 def generate(out_file, last=None): 45 def generate(out_file, last=None):
37 print("Generating %s" % out_file) 46 print("Generating %s" % out_file)
38 47
74 if re_tag.match(tags): 83 if re_tag.match(tags):
75 if current_version > 0: 84 if current_version > 0:
76 _write_version_changes( 85 _write_version_changes(
77 templates, 86 templates,
78 current_version, current_version_info, 87 current_version, current_version_info,
79 current_changes, fp) 88 current_changes, fp, out_ext)
80 89
81 current_version += 1 90 current_version += 1
82 current_version_info = tags, tag_date 91 current_version_info = tags, tag_date
83 current_changes = {} 92 current_changes = {}
84 in_desc = True 93 in_desc = True
87 continue 96 continue
88 97
89 if skip or current_version == 0: 98 if skip or current_version == 0:
90 continue 99 continue
91 100
92 if re_add_tag_changeset.match(line): 101 for blre in message_blacklist:
93 continue 102 if blre.match(line):
94 if re_merge_pr_changeset.match(line): 103 skip = True
104 break
105
106 if skip:
95 continue 107 continue
96 108
97 m = re_change.match(line) 109 m = re_change.match(line)
98 if m: 110 if m:
99 ch_type = m.group(1) 111 ch_type = m.group(1)
111 123
112 if current_version > 0: 124 if current_version > 0:
113 _write_version_changes( 125 _write_version_changes(
114 templates, 126 templates,
115 current_version, current_version_info, 127 current_version, current_version_info,
116 current_changes, fp) 128 current_changes, fp, out_ext)
117 129
118 130
119 def _write_version_changes(templates, version, version_info, changes, fp): 131 def _write_version_changes(templates, version, version_info, changes, fp, ext):
120 tokens = { 132 tokens = {
121 'num': str(version), 133 'num': str(version),
122 'version': version_info[0], 134 'version': version_info[0],
123 'date': version_info[1]} 135 'date': version_info[1]}
124 tpl = _multi_replace(templates['version_title'], tokens) 136 tpl = _multi_replace(templates['version_title'], tokens)
134 'sub_num': str(i), 146 'sub_num': str(i),
135 'category': cat_name.title()} 147 'category': cat_name.title()}
136 tpl = _multi_replace(templates['category_title'], tokens) 148 tpl = _multi_replace(templates['category_title'], tokens)
137 fp.write(tpl) 149 fp.write(tpl)
138 150
151 msgs = list(sorted(msgs))
139 for msg in msgs: 152 for msg in msgs:
140 msg = msg.replace('`', '``').rstrip('\n') 153 if ext == '.rst':
141 msg = re_clean_code_span.sub(r'\1`` \2', msg) 154 msg = msg.replace('`', '``').rstrip('\n')
155 msg = re_clean_code_span.sub(r'\1`` \2', msg)
142 fp.write('* ' + msg + '\n') 156 fp.write('* ' + msg + '\n')
143 157
144 158
145 def _multi_replace(s, tokens): 159 def _multi_replace(s, tokens):
146 for token in tokens: 160 for token in tokens: