The default tagger doesn't add Related/Resolves lines to the changelog, resulting in builds that have to be fixed up manually.
The output from this code still needs to be edited to remove the '-' prefix from the Related/Resolves lines because tito appends them to every line of output from the Tagger. But this is better than having to add them manually.
From: "Brian C. Lane" bcl@redhat.com
The default tagger doesn't add Related/Resolves lines to the changelog, resulting in builds that have to be fixed up manually.
The output from this code still needs to be edited to remove the '-' prefix from the Related/Resolves lines because tito appends them to every line of output from the Tagger. But this is better than having to add them manually. --- rel-eng/lorax_tito/__init__.py | 3 ++ rel-eng/lorax_tito/tagger.py | 118 +++++++++++++++++++++++++++++++++++++++++ rel-eng/tito.props | 3 +- 3 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 rel-eng/lorax_tito/__init__.py create mode 100644 rel-eng/lorax_tito/tagger.py
diff --git a/rel-eng/lorax_tito/__init__.py b/rel-eng/lorax_tito/__init__.py new file mode 100644 index 0000000..ea0facb --- /dev/null +++ b/rel-eng/lorax_tito/__init__.py @@ -0,0 +1,3 @@ +from .tagger import LoraxRHELTagger + +all = [LoraxRHELTagger] diff --git a/rel-eng/lorax_tito/tagger.py b/rel-eng/lorax_tito/tagger.py new file mode 100644 index 0000000..ffe10cd --- /dev/null +++ b/rel-eng/lorax_tito/tagger.py @@ -0,0 +1,118 @@ +import re +from tito.common import run_command +from tito.tagger import ReleaseTagger + + +class LoraxRHELTagger(ReleaseTagger): + """ + Tagger which is based on ReleaseTagger and use Red Hat Enterprise Linux + format of Changelog: + - description + Resolves/Related: rhbz#1111 + + Used for: + - Red Hat Enterprise Linux + + If you want it put in tito.pros: + [buildconfig] + tagger = lorax_tito.LoraxRHELTagger + """ + def _getCommitDetail(self, commit, field): + """ Get specific details about the commit using git log format field specifiers. + """ + command = ['git', 'log', '-1', "--pretty=format:%s" % field, commit] + output = run_command(" ".join(command)) + ret = output.strip('\n').split('\n') + + if len(ret) == 1 and ret[0].find('@') != -1: + ret = [ret[0].split('@')[0]] + elif len(ret) == 1: + ret = [ret[0]] + else: + ret = [x for x in ret if x != ''] + + return ret + + def _generate_default_changelog(self, last_tag): + """ + Run git-log and will generate changelog, which still can be edited by user + in _make_changelog. + use format: + - description + Resolves/Related: rhbz#1111 + """ + patch_command = "git log --pretty=oneline --relative %s..%s -- %s" % (last_tag, "HEAD", ".") + output = filter(lambda x: x.find('l10n: ') != 41 and \ + x.find('Merge commit') != 41 and \ + x.find('Merge branch') != 41, + run_command(patch_command).strip('\n').split('\n')) + + rpm_log = [] + for line in output: + if not line: + continue + + rhbz = set() + commit = line.split(' ')[0] + summary = self._getCommitDetail(commit, "%s")[0] + body = self._getCommitDetail(commit, "%b") + author = self._getCommitDetail(commit, "%aE")[0] + + # prepend Related/Resolves if subject contains BZ number + m = re.search(r"(#\d+(,.*)*)", summary) + if m: + fullbug = summary[m.start():m.end()] + bugstr = summary[m.start()+2:m.end()-1] + + bug = '' + for c in bugstr: + if c.isdigit(): + bug += c + else: + break + + if len(bugstr) > len(bug): + tmp = bugstr[len(bug):] + + for c in tmp: + if not c.isalpha(): + tmp = tmp[1:] + else: + break + + if len(tmp) > 0: + author = tmp + + summary = summary.replace(fullbug, "(%s)" % author) + rhbz.add("Resolves: rhbz#%s" % bug) + + summary_bug = bug + else: + summary = summary.strip() + summary += " (%s)" % author + summary_bug = None + + for bodyline in body: + m = re.match(r"^(Resolves|Related|Conflicts):\ +rhbz#\d+.*$", bodyline) + if not m: + continue + + actionre = re.search("(Resolves|Related|Conflicts)", bodyline) + bugre = re.search(r"\d+", bodyline) + if actionre and bugre: + action = actionre.group() + bug = bugre.group() + rhbz.add("%s: rhbz#%s" % (action, bug)) + + # Remove the summary bug's Resolves action if it is for the same bug + if action != 'Resolves': + summary_str = "Resolves: rhbz#%s" % summary_bug + if summary_bug and bug == summary_bug and summary_str in rhbz: + rhbz.remove(summary_str) + + if rhbz: + rpm_log.append("%s\n%s" %(summary.strip(),"\n".join(rhbz))) + else: + rpm_log.append("%s (%s)" % (summary.strip(), author)) + + return "\n".join(rpm_log) diff --git a/rel-eng/tito.props b/rel-eng/tito.props index eab3f19..6c1edb3 100644 --- a/rel-eng/tito.props +++ b/rel-eng/tito.props @@ -1,5 +1,6 @@ [buildconfig] builder = tito.builder.Builder -tagger = tito.tagger.VersionTagger +tagger = lorax_tito.LoraxRHELTagger changelog_do_not_remove_cherrypick = 0 changelog_format = %s (%ae) +lib_dir = ./rel-eng/
Added label: rhel7-branch.
@@ -0,0 +1,118 @@ +import re +from tito.common import run_command +from tito.tagger import ReleaseTagger
+class LoraxRHELTagger(ReleaseTagger):
- """
- Tagger which is based on ReleaseTagger and use Red Hat Enterprise Linux
- format of Changelog:
- description
Resolves/Related: rhbz#1111- Used for:
- Red Hat Enterprise Linux- If you want it put in tito.pros:
- [buildconfig]
- tagger = lorax_tito.LoraxRHELTagger
- """
- def _getCommitDetail(self, commit, field):
""" Get specific details about the commit using git log format field specifiers."""command = ['git', 'log', '-1', "--pretty=format:%s" % field, commit]output = run_command(" ".join(command))ret = output.strip('\n').split('\n')if len(ret) == 1 and ret[0].find('@') != -1:ret = [ret[0].split('@')[0]]elif len(ret) == 1:ret = [ret[0]]else:ret = [x for x in ret if x != '']return ret- def _generate_default_changelog(self, last_tag):
"""Run git-log and will generate changelog, which still can be edited by userin _make_changelog.use format:- descriptionResolves/Related: rhbz#1111"""patch_command = "git log --pretty=oneline --relative %s..%s -- %s" % (last_tag, "HEAD", ".")output = filter(lambda x: x.find('l10n: ') != 41 and \x.find('Merge commit') != 41 and \x.find('Merge branch') != 41,run_command(patch_command).strip('\n').split('\n'))rpm_log = []for line in output:if not line:continuerhbz = set()commit = line.split(' ')[0]summary = self._getCommitDetail(commit, "%s")[0]body = self._getCommitDetail(commit, "%b")author = self._getCommitDetail(commit, "%aE")[0]# prepend Related/Resolves if subject contains BZ numberm = re.search(r"\(#\d+(\,.*)*\)", summary)if m:fullbug = summary[m.start():m.end()]bugstr = summary[m.start()+2:m.end()-1]bug = ''for c in bugstr:if c.isdigit():bug += celse:breakif len(bugstr) > len(bug):tmp = bugstr[len(bug):]for c in tmp:if not c.isalpha():tmp = tmp[1:]else:breakif len(tmp) > 0:author = tmp
It seems to me like the above string operations could be done in a nicer way using the groups or named groups in the regular expression.
Looks good to me other than the suggestion above.
Added label: ACK.
@@ -0,0 +1,118 @@ +import re +from tito.common import run_command +from tito.tagger import ReleaseTagger
+class LoraxRHELTagger(ReleaseTagger):
- """
- Tagger which is based on ReleaseTagger and use Red Hat Enterprise Linux
- format of Changelog:
- description
Resolves/Related: rhbz#1111- Used for:
- Red Hat Enterprise Linux- If you want it put in tito.pros:
- [buildconfig]
- tagger = lorax_tito.LoraxRHELTagger
- """
- def _getCommitDetail(self, commit, field):
""" Get specific details about the commit using git log format field specifiers."""command = ['git', 'log', '-1', "--pretty=format:%s" % field, commit]output = run_command(" ".join(command))ret = output.strip('\n').split('\n')if len(ret) == 1 and ret[0].find('@') != -1:ret = [ret[0].split('@')[0]]elif len(ret) == 1:ret = [ret[0]]else:ret = [x for x in ret if x != '']return ret- def _generate_default_changelog(self, last_tag):
"""Run git-log and will generate changelog, which still can be edited by userin _make_changelog.use format:- descriptionResolves/Related: rhbz#1111"""patch_command = "git log --pretty=oneline --relative %s..%s -- %s" % (last_tag, "HEAD", ".")output = filter(lambda x: x.find('l10n: ') != 41 and \x.find('Merge commit') != 41 and \x.find('Merge branch') != 41,run_command(patch_command).strip('\n').split('\n'))rpm_log = []for line in output:if not line:continuerhbz = set()commit = line.split(' ')[0]summary = self._getCommitDetail(commit, "%s")[0]body = self._getCommitDetail(commit, "%b")author = self._getCommitDetail(commit, "%aE")[0]# prepend Related/Resolves if subject contains BZ numberm = re.search(r"\(#\d+(\,.*)*\)", summary)if m:fullbug = summary[m.start():m.end()]bugstr = summary[m.start()+2:m.end()-1]bug = ''for c in bugstr:if c.isdigit():bug += celse:breakif len(bugstr) > len(bug):tmp = bugstr[len(bug):]for c in tmp:if not c.isalpha():tmp = tmp[1:]else:breakif len(tmp) > 0:author = tmp
It seems to me like the above string operations could be done in a nicer way using the groups or named groups in the regular expression.
I agree, but for the moment I want to make sure it matches the anaconda makebumpver code. I'll probably improve both of them at some point.
Closed.
anaconda-patches@lists.fedorahosted.org