W dniu sob, 17.02.2018 o godzinie 13∶56 +0100, użytkownik Michał Górny napisał: > Add a check for common mistakes in commit messages. For now, it is > pretty rough and works only for -m/-F. It will be extended to work > in the interactive mode in the future. > --- > repoman/pym/repoman/actions.py | 74 > ++++++++++++++++++++++++- > repoman/pym/repoman/tests/commit/__init__.py | 2 + > repoman/pym/repoman/tests/commit/__test__.py | 1 +
Oh, great. Now I see that I haven't added the new tests, and the file is gone now, and now I'm going to waste another hour writing them all again... > repoman/pym/repoman/tests/simple/test_simple.py | 8 +-- > 4 files changed, 80 insertions(+), 5 deletions(-) > create mode 100644 repoman/pym/repoman/tests/commit/__init__.py > create mode 100644 repoman/pym/repoman/tests/commit/__test__.py > > diff --git a/repoman/pym/repoman/actions.py b/repoman/pym/repoman/actions.py > index b76a6e466..91603865c 100644 > --- a/repoman/pym/repoman/actions.py > +++ b/repoman/pym/repoman/actions.py > @@ -119,7 +119,16 @@ class Actions(object): > if commitmessage[:9].lower() in ("cat/pkg: ",): > commitmessage = self.msg_prefix() + > commitmessage[9:] > > - if not commitmessage or not commitmessage.strip(): > + if commitmessage is not None and commitmessage.strip(): > + res, expl = self.verify_commit_message(commitmessage) > + if not res: > + print(bad("RepoMan does not like your commit > message:")) > + print(expl) > + if self.options.force: > + print('(but proceeding due to --force)') > + else: > + sys.exit(1) > + else: > commitmessage = self.get_new_commit_message(qa_output) > > commitmessage = commitmessage.rstrip() > @@ -585,3 +594,66 @@ class Actions(object): > print("* no commit message? aborting commit.") > sys.exit(1) > return commitmessage > + > + footer_re = re.compile(r'^[\w-]+:') > + > + @classmethod > + def verify_commit_message(cls, msg): > + """ > + Check whether the message roughly complies with GLEP66. Returns > + (True, None) if it does, (False, <explanation>) if it does not. > + """ > + > + problems = [] > + paras = msg.strip().split('\n\n') > + summary = paras.pop(0) > + > + if ':' not in summary: > + problems.append('summary line must start with a logical > unit name, e.g. "cat/pkg:"') > + if '\n' in summary.strip(): > + problems.append('commit message must start with a > *single* line of summary, followed by empty line') > + # accept 69 overall or unit+50, in case of very long package > names > + elif len(summary.strip()) > 69 and len(summary.split(':', > 1)[-1]) > 50: > + problems.append('summary line is too long (max 69 > characters)') > + > + multiple_footers = False > + gentoo_bug_used = False > + bug_closes_without_url = False > + body_too_long = False > + > + found_footer = False > + for p in paras: > + lines = p.splitlines() > + # if all lines look like footer material, we assume > it's footer > + # else, we assume it's body text > + if all(cls.footer_re.match(l) for l in lines if > l.strip()): > + # multiple footer-like blocks? > + if found_footer: > + multiple_footers = True > + found_footer = True > + for l in lines: > + if l.startswith('Gentoo-Bug'): > + gentoo_bug_used = True > + elif l.startswith('Bug:') or > l.startswith('Closes:'): > + if 'http://' not in l and > 'https://' not in l: > + bug_closes_without_url > = True > + else: > + for l in lines: > + # we recommend wrapping at 72 but > accept up to 80; > + # do not complain if we have single > word (usually > + # it means very long URL) > + if len(l.strip()) > 80 and > len(l.split()) > 1: > + body_too_long = True > + > + if multiple_footers: > + problems.append('multiple footer-style blocks found, > please combine them into one') > + if gentoo_bug_used: > + problems.append('please replace Gentoo-Bug with GLEP > 66-compliant Bug/Closes') > + if bug_closes_without_url: > + problems.append('Bug/Closes footers require full URL') > + if body_too_long: > + problems.append('body lines should be wrapped at 72 > (max 80) characters') > + > + if problems: > + return (False, '\n'.join('- %s' % x for x in problems)) > + return (True, None) > diff --git a/repoman/pym/repoman/tests/commit/__init__.py > b/repoman/pym/repoman/tests/commit/__init__.py > new file mode 100644 > index 000000000..d74fd94a7 > --- /dev/null > +++ b/repoman/pym/repoman/tests/commit/__init__.py > @@ -0,0 +1,2 @@ > +# Copyright 2011-2018 Gentoo Foundation > +# Distributed under the terms of the GNU General Public License v2 > diff --git a/repoman/pym/repoman/tests/commit/__test__.py > b/repoman/pym/repoman/tests/commit/__test__.py > new file mode 100644 > index 000000000..8b1378917 > --- /dev/null > +++ b/repoman/pym/repoman/tests/commit/__test__.py > @@ -0,0 +1 @@ > + > diff --git a/repoman/pym/repoman/tests/simple/test_simple.py > b/repoman/pym/repoman/tests/simple/test_simple.py > index a24e0d5a3..3d7a70ad0 100644 > --- a/repoman/pym/repoman/tests/simple/test_simple.py > +++ b/repoman/pym/repoman/tests/simple/test_simple.py > @@ -1,4 +1,4 @@ > -# Copyright 2011-2015 Gentoo Foundation > +# Copyright 2011-2018 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > > import subprocess > @@ -194,13 +194,13 @@ class SimpleRepomanTestCase(TestCase): > ("", repoman_cmd + ("full", "-d")), > ("", cp_cmd + (test_ebuild, test_ebuild[:-8] + > "2.ebuild")), > ("", git_cmd + ("add", test_ebuild[:-8] + "2.ebuild")), > - ("", repoman_cmd + ("commit", "-m", "bump to version > 2")), > + ("", repoman_cmd + ("commit", "-m", "cat/pkg: bump to > version 2")), > ("", cp_cmd + (test_ebuild, test_ebuild[:-8] + > "3.ebuild")), > ("", git_cmd + ("add", test_ebuild[:-8] + "3.ebuild")), > - ("dev-libs", repoman_cmd + ("commit", "-m", "bump to > version 3")), > + ("dev-libs", repoman_cmd + ("commit", "-m", "cat/pkg: > bump to version 3")), > ("", cp_cmd + (test_ebuild, test_ebuild[:-8] + > "4.ebuild")), > ("", git_cmd + ("add", test_ebuild[:-8] + "4.ebuild")), > - ("dev-libs/A", repoman_cmd + ("commit", "-m", "bump to > version 4")), > + ("dev-libs/A", repoman_cmd + ("commit", "-m", "cat/pkg: > bump to version 4")), > ) > > env = { -- Best regards, Michał Górny