Skip to content

Commit

Permalink
rpm-ch: implement --meta-bts option
Browse files Browse the repository at this point in the history
This gives the user the possibility to define what meta tags (in git
commit message) gbp-rpm-ch recognizes as bug tracking system references.
Alternatively, it makes it possible to disable bts meta tag parsing
altogether.

Signed-off-by: Markus Lehtonen <[email protected]>
  • Loading branch information
marquiz committed Jan 22, 2018
1 parent 687b9af commit b014201
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 9 deletions.
16 changes: 16 additions & 0 deletions docs/manpages/gbp-rpm-ch.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
<arg><option>--message=</option><replaceable>MESSAGE</replaceable></arg>
<arg><option>--since=</option><replaceable>COMMITISH</replaceable></arg>
</group>
<arg><option>--meta-bts=</option><replaceable>META_TAGS</replaceable></arg>
<arg><option>--no-release</option></arg>
<arg><option>--[no-]git-author</option></arg>
<arg><option>--[no-]full</option></arg>
Expand Down Expand Up @@ -182,6 +183,19 @@
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--meta-bts=</option><replaceable>META_TAGS</replaceable>
</term>
<listitem>
<para>
Meta tags in the commit messages that are interpreted as bug tracking
system related references. The recognized bts references are added in
the generated changelog entries. See the META TAGS section below for
more information. The bts meta tag tracking feature can be disabled
by defining an empty string.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--no-release</option>
</term>
Expand Down Expand Up @@ -416,6 +430,8 @@
<para>
Indicate in the changelog entry that bug
<replaceable>BUGNUMBER</replaceable> was addressed in this commit.
The bts meta tags recognized by &gbp-rpm-ch; is actually defined by
the <option>--meta-bts</option> option.
</para>
</listitem>
</varlistentry>
Expand Down
3 changes: 3 additions & 0 deletions gbp/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ class GbpOptionParserRpm(GbpOptionParser):
'changelog-revision': '',
'spawn-editor': 'always',
'editor-cmd': 'vim',
'meta-bts': '(Close|Closes|Fixes|Fix)',
})

help = dict(GbpOptionParser.help)
Expand Down Expand Up @@ -848,6 +849,8 @@ class GbpOptionParserRpm(GbpOptionParser):
'git-author':
"Use name and email from git-config for the changelog header, "
"default is '%(git-author)s'",
'meta-bts':
"Meta tags for the bts commands, default is '%(meta-bts)s'",
})

def _warn_old_gbp_conf(self, gbp_conf):
Expand Down
17 changes: 9 additions & 8 deletions gbp/rpm/policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,6 @@ class ChangelogEntryFormatter(object):

# Maximum length for a changelog entry line
max_entry_line_length = 76
# Bug tracking system related meta tags recognized from git commit msg
bts_meta_tags = ("Close", "Closes", "Fixes", "Fix")
# Regexp for matching bug tracking system ids (e.g. "bgo#123")
bug_id_re = r'[A-Za-z0-9#_\-]+'

Expand All @@ -107,15 +105,18 @@ def _parse_bts_tags(cls, lines, meta_tags):
@param lines: commit message
@type lines: C{list} of C{str}
@param meta_tags: meta tags to look for
@type meta_tags: C{tuple} of C{str}
@param meta_tags: meta tags (regexp) to look for
@type meta_tags: C{str}
@return: bts-ids per meta tag and the non-mathced lines
@rtype: (C{dict}, C{list} of C{str})
"""
if not meta_tags:
return ({}, lines[:])

tags = {}
other_lines = []
bts_re = re.compile(r'^(?P<tag>%s):\s*(?P<ids>.*)' %
('|'.join(meta_tags)), re.I)
bts_re = re.compile(r'^(?P<tag>%s):\s*(?P<ids>.*)' % meta_tags,
re.I)
bug_id_re = re.compile(cls.bug_id_re)
for line in lines:
match = bts_re.match(line)
Expand Down Expand Up @@ -172,7 +173,7 @@ def compose(cls, commit_info, **kwargs):
return None

# Parse and filter out bts-related meta-tags
bts_tags, body = cls._parse_bts_tags(body, cls.bts_meta_tags)
bts_tags, body = cls._parse_bts_tags(body, kwargs['meta_bts'])

# Additional filtering
body = cls._extra_filter(body, kwargs['ignore_re'])
Expand All @@ -191,7 +192,7 @@ def compose(cls, commit_info, **kwargs):
text.extend([" " + line for line in body if line.strip()])

# Add bts tags and ids in the end
for tag, ids in bts_tags.items():
for tag, ids in sorted(bts_tags.items()):
bts_msg = " (%s: %s)" % (tag, ', '.join(ids))
if len(text[-1]) + len(bts_msg) >= cls.max_entry_line_length:
text.append(" ")
Expand Down
4 changes: 3 additions & 1 deletion gbp/scripts/rpm_ch.py
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,8 @@ def entries_from_commits(changelog, repo, commits, options):
info = repo.get_commit_info(commit)
entry_text = ChangelogEntryFormatter.compose(info, full=options.full,
ignore_re=options.ignore_regex,
id_len=options.idlen)
id_len=options.idlen,
meta_bts=options.meta_bts)
if entry_text:
entries.append(changelog.create_entry(author=info['author'].name,
text=entry_text))
Expand Down Expand Up @@ -447,6 +448,7 @@ def build_parser(name):
help="use all commits from the Git history, overrides "
"--since")
# Formatting group options
format_grp.add_config_file_option(option_name="meta-bts", dest="meta_bts")
format_grp.add_option("--no-release", action="store_false", default=True,
dest="release",
help="no release, just update the last changelog section")
Expand Down
20 changes: 20 additions & 0 deletions tests/component/rpm/test_rpm_ch.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,26 @@ def test_branch_options(self):

eq_(mock_ch(['--packaging-branch=foo', '--ignore-branch']), 0)

def test_option_meta_bts(self):
"""Test parsing of the bts meta tags"""
repo = self.init_test_repo('gbp-test-native')

# Create a dummy commit that references bts
with open('new-file', 'w') as fobj:
fobj.write('foobar\n')
repo.add_files('new-file')
repo.commit_all('Fix\n\nCloses: #123\nFixes: #456\n Fixes: #789')

eq_(mock_ch(['--since=HEAD^']), 0)
content = self.read_file('packaging/gbp-test-native.changes')
# rpm-ch shouldn't have picked the ref with leading whitespace
eq_(content[1], '- Fix (Closes: #123) (Fixes: #456)\n')

# Check the --meta-bts option
eq_(mock_ch(['--since=HEAD^', '--meta-bts=Fixes']), 0)
content = self.read_file('packaging/gbp-test-native.changes')
eq_(content[1], '- Fix (Fixes: #456)\n')

def test_option_no_release(self):
"""Test the --no-release cmdline option"""
self.init_test_repo('gbp-test-native')
Expand Down

0 comments on commit b014201

Please sign in to comment.