From patchwork Fri Mar 23 21:31:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Conole X-Patchwork-Id: 890244 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 407Gvx0Xxnz9s0p for ; Sat, 24 Mar 2018 08:32:13 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id C784E1244; Fri, 23 Mar 2018 21:31:48 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id CB445116F for ; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 7B8FA5D9 for ; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C2FD7818595A; Fri, 23 Mar 2018 21:31:44 +0000 (UTC) Received: from dhcp-25.97.bos.redhat.com (ovpn-123-22.rdu2.redhat.com [10.10.123.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 843402026E0E; Fri, 23 Mar 2018 21:31:44 +0000 (UTC) From: Aaron Conole To: dev@openvswitch.org Date: Fri, 23 Mar 2018 17:31:40 -0400 Message-Id: <20180323213142.461-2-aconole@redhat.com> In-Reply-To: <20180323213142.461-1-aconole@redhat.com> References: <20180323213142.461-1-aconole@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Fri, 23 Mar 2018 21:31:44 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Fri, 23 Mar 2018 21:31:44 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'aconole@redhat.com' RCPT:'' X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 1/3] checkpatch: introduce constants for the parse states X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org It's just easier to read. Should be no functional change. Signed-off-by: Aaron Conole --- utilities/checkpatch.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py index 8a3895240..2bc34db62 100755 --- a/utilities/checkpatch.py +++ b/utilities/checkpatch.py @@ -370,6 +370,11 @@ def run_checks(current_file, line, lineno): def ovs_checkpatch_parse(text, filename): global print_file_name, total_line, checking_file + + PARSE_STATE_HEADING = 0 + PARSE_STATE_DIFF_HEADER = 1 + PARSE_STATE_CHANGE_BODY = 2 + lineno = 0 signatures = [] co_authors = [] @@ -399,18 +404,18 @@ def ovs_checkpatch_parse(text, filename): continue if checking_file: - parse = 2 + parse = PARSE_STATE_CHANGE_BODY - if parse == 1: + if parse == PARSE_STATE_DIFF_HEADER: match = hunks.match(line) if match: - parse = parse + 1 + parse = PARSE_STATE_CHANGE_BODY current_file = match.group(2)[2:] print_file_name = current_file continue - elif parse == 0: + elif parse == PARSE_STATE_HEADING: if scissors.match(line): - parse = parse + 1 + parse = PARSE_STATE_DIFF_HEADER if not skip_signoff_check: if len(signatures) == 0: print_error("No signatures found.") @@ -429,7 +434,7 @@ def ovs_checkpatch_parse(text, filename): print_error( "Remove Gerrit Change-Id's before submitting upstream.") print("%d: %s\n" % (lineno, line)) - elif parse == 2: + elif parse == PARSE_STATE_CHANGE_BODY: newfile = hunks.match(line) if newfile: current_file = newfile.group(2)[2:] From patchwork Fri Mar 23 21:31:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Conole X-Patchwork-Id: 890245 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 407GwN5Srjz9s0p for ; Sat, 24 Mar 2018 08:32:36 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id DC6C111FC; Fri, 23 Mar 2018 21:31:49 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 48D621167 for ; Fri, 23 Mar 2018 21:31:46 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id C91D65D6 for ; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1B0D340201A6; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) Received: from dhcp-25.97.bos.redhat.com (ovpn-123-22.rdu2.redhat.com [10.10.123.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id D0E682026E0E; Fri, 23 Mar 2018 21:31:44 +0000 (UTC) From: Aaron Conole To: dev@openvswitch.org Date: Fri, 23 Mar 2018 17:31:41 -0400 Message-Id: <20180323213142.461-3-aconole@redhat.com> In-Reply-To: <20180323213142.461-1-aconole@redhat.com> References: <20180323213142.461-1-aconole@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 23 Mar 2018 21:31:45 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.6]); Fri, 23 Mar 2018 21:31:45 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'aconole@redhat.com' RCPT:'' X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 2/3] checkpatch: filter comment contents X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org For the infix operator whitespace checks, some of these operators are used within comments. In those cases, it probably doesn't make sense to warn about whitespacing. There may be other checks that could use this kind of filter, but that can wait for a future commit (and someone ambitious enough to test each case). Suggested-by: Jan Scheurich Signed-off-by: Aaron Conole --- utilities/checkpatch.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py index 2bc34db62..469ffb836 100755 --- a/utilities/checkpatch.py +++ b/utilities/checkpatch.py @@ -233,6 +233,54 @@ def has_xxx_mark(line): return __regex_has_xxx_mark.match(line) is not None +def filter_comments(current_line): + """remove all of the c-style comments in a line""" + STATE_NORMAL = 0 + STATE_COMMENT_SLASH = 1 + STATE_COMMENT_CONTENTS = 3 + STATE_COMMENT_END_SLASH = 4 + + state = STATE_NORMAL + sanitized_line = '' + check_state = STATE_COMMENT_CONTENTS + only_whitespace = True + + for c in current_line: + if c == '/': + if state == STATE_NORMAL: + state = STATE_COMMENT_SLASH + elif state == STATE_COMMENT_SLASH: + # This is for c++ style comments. We will warn later + return sanitized_line[:1] + elif state == STATE_COMMENT_END_SLASH: + c = '' + state = STATE_NORMAL + elif c == '*': + if only_whitespace: + # just assume this is a continuation from the previous line + # as a comment + state = STATE_COMMENT_CONTENTS + if state == STATE_COMMENT_SLASH: + state = STATE_COMMENT_CONTENTS + sanitized_line = sanitized_line[:1] + elif state == STATE_COMMENT_CONTENTS: + state = STATE_COMMENT_END_SLASH + elif state == STATE_COMMENT_END_SLASH: + state = STATE_COMMENT_CONTENTS + elif state == STATE_COMMENT_SLASH: + state = STATE_NORMAL + + if state == check_state: + c = '' + + if not c.isspace(): + only_whitespace = False + + sanitized_line += c + + return sanitized_line + + checks = [ {'regex': None, 'match_name': @@ -315,7 +363,7 @@ checks += [ def regex_operator_factory(operator): regex = re.compile(r'^[^#][^"\']*[^ "]%s[^ "\'][^"]*' % operator) - return lambda x: regex.search(x) is not None + return lambda x: regex.search(filter_comments(x)) is not None infix_operators = \ From patchwork Fri Mar 23 21:31:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aaron Conole X-Patchwork-Id: 890246 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=openvswitch.org (client-ip=140.211.169.12; helo=mail.linuxfoundation.org; envelope-from=ovs-dev-bounces@openvswitch.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=redhat.com Received: from mail.linuxfoundation.org (mail.linuxfoundation.org [140.211.169.12]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 407Gwy2C82z9ryk for ; Sat, 24 Mar 2018 08:33:06 +1100 (AEDT) Received: from mail.linux-foundation.org (localhost [127.0.0.1]) by mail.linuxfoundation.org (Postfix) with ESMTP id 2013C12C8; Fri, 23 Mar 2018 21:31:51 +0000 (UTC) X-Original-To: dev@openvswitch.org Delivered-To: ovs-dev@mail.linuxfoundation.org Received: from smtp1.linuxfoundation.org (smtp1.linux-foundation.org [172.17.192.35]) by mail.linuxfoundation.org (Postfix) with ESMTPS id 0C31E1171 for ; Fri, 23 Mar 2018 21:31:47 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mx1.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by smtp1.linuxfoundation.org (Postfix) with ESMTPS id 3AA615D9 for ; Fri, 23 Mar 2018 21:31:46 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6D4F0404085A; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) Received: from dhcp-25.97.bos.redhat.com (ovpn-123-22.rdu2.redhat.com [10.10.123.22]) by smtp.corp.redhat.com (Postfix) with ESMTP id 2C6D92026E0E; Fri, 23 Mar 2018 21:31:45 +0000 (UTC) From: Aaron Conole To: dev@openvswitch.org Date: Fri, 23 Mar 2018 17:31:42 -0400 Message-Id: <20180323213142.461-4-aconole@redhat.com> In-Reply-To: <20180323213142.461-1-aconole@redhat.com> References: <20180323213142.461-1-aconole@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 23 Mar 2018 21:31:45 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Fri, 23 Mar 2018 21:31:45 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'aconole@redhat.com' RCPT:'' X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on smtp1.linux-foundation.org Subject: [ovs-dev] [PATCH 3/3] checkpatch: add a comment spell-checker X-BeenThere: ovs-dev@openvswitch.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: ovs-dev-bounces@openvswitch.org Errors-To: ovs-dev-bounces@openvswitch.org Grow a new opt-in feature to check comments for possible spelling mistakes. Uses the 'enchant' library to provide a default link to aspell/ispell as the backend. Additionally, a custom set of kewords is included inline to match what would be possibly encountered in 'the wild'. The list is fairly comprehensive at this point. Signed-off-by: Aaron Conole --- utilities/checkpatch.py | 107 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 3 deletions(-) diff --git a/utilities/checkpatch.py b/utilities/checkpatch.py index 469ffb836..3a62c8a47 100755 --- a/utilities/checkpatch.py +++ b/utilities/checkpatch.py @@ -21,12 +21,65 @@ import os import re import sys +try: + import enchant + + extra_keywords = ['ovs', 'vswitch', 'vswitchd', 'ovs-vswitchd', 'netdev', + 'selinux', 'ovs-ctl', 'dpctl', 'ofctl', 'openvswitch', + 'dpdk', 'hugepage', 'hugepages', 'pmd', 'upcall', + 'vhost', 'rx', 'tx', 'vhostuser', 'openflow', 'qsort', + 'rxq', 'txq', 'perf', 'stats', 'struct', 'int', + 'char', 'bool', 'upcalls', 'nicira', 'bitmask', 'ipv4', + 'ipv6', 'tcp', 'tcp4', 'tcpv4', 'udp', 'udp4', 'udpv4', + 'icmp', 'icmp4', 'icmpv6', 'vlan', 'vxlan', 'cksum', + 'csum', 'checksum', 'ofproto', 'numa', 'mempool', + 'mempools', 'mbuf', 'mbufs', 'hmap', 'cmap', 'smap', + 'dhcpv4', 'dhcp', 'dhcpv6', 'opts', 'metadata', + 'geneve', 'mutex', 'netdev', 'netdevs', 'subtable', + 'virtio', 'qos', 'policer', 'datapath', 'tunctl', + 'attr', 'ethernet', 'ether', 'defrag', 'defragment', + 'loopback', 'sflow', 'acl', 'initializer', 'recirc', + 'xlated', 'unclosed', 'netlink', 'msec', 'usec', + 'nsec', 'ms', 'us', 'ns', 'kilobits', 'kbps', + 'kilobytes', 'megabytes', 'mbps', 'gigabytes', 'gbps', + 'megabits', 'gigabits', 'pkts', 'tuple', 'miniflow', + 'megaflow', 'conntrack', 'vlans', 'vxlans', 'arg', + 'tpid', 'xbundle', 'xbundles', 'mbundle', 'mbundles', + 'netflow', 'localnet', 'odp', 'pre', 'dst', 'dest', + 'src', 'ethertype', 'cvlan', 'ips', 'msg', 'msgs', + 'liveness', 'userspace', 'eventmask', 'datapaths', + 'slowpath', 'fastpath', 'multicast', 'unicast', + 'revalidation', 'namespace', 'qdisc', 'uuid', 'ofport', + 'subnet', 'revalidation', 'revalidator', 'revalidate', + 'l2', 'l3', 'l4', 'openssl', 'mtu', 'ifindex', 'enum', + 'enums', 'http', 'https', 'num', 'vconn', 'vconns', 'conn', + 'nat', 'memset', 'memcmp', 'strcmp', 'strcasecmp', 'tc', + 'ufid', 'api', 'ofpbuf', 'ofpbufs', 'hashmaps', 'hashmap', + 'deref', 'dereference', 'hw', 'prio', 'sendmmsg', 'sendmsg', + 'malloc', 'free', 'alloc', 'pid', 'ppid', 'pgid', 'uid', + 'gid', 'sid', 'utime', 'stime', 'cutime', 'cstime', 'vsize', + 'rss', 'rsslim', 'whcan', 'gtime', 'eip', 'rip', 'cgtime', + 'dbg', 'gw', 'sbrec', 'bfd', 'sizeof', 'pmds', 'nic', 'nics', + 'hwol', 'encap', 'decap', 'tlv', 'tlvs', 'decapsulation', + 'fd', 'cacheline', 'xlate', 'skiplist', 'idl', 'comparator', + 'natting', 'alg', 'pasv', 'epasv', 'wildcard', 'nated', + 'amd64', 'x86_64', 'recirculation' ] + + spell_check_dict = enchant.Dict("en_US") + for kw in extra_keywords: + spell_check_dict.add(kw) + + no_spellcheck = False +except: + no_spellcheck = True + __errors = 0 __warnings = 0 print_file_name = None checking_file = False total_line = 0 colors = False +spellcheck_comments = False def get_color_end(): @@ -233,7 +286,7 @@ def has_xxx_mark(line): return __regex_has_xxx_mark.match(line) is not None -def filter_comments(current_line): +def filter_comments(current_line, keep = False): """remove all of the c-style comments in a line""" STATE_NORMAL = 0 STATE_COMMENT_SLASH = 1 @@ -245,6 +298,9 @@ def filter_comments(current_line): check_state = STATE_COMMENT_CONTENTS only_whitespace = True + if keep: + check_state = STATE_NORMAL + for c in current_line: if c == '/': if state == STATE_NORMAL: @@ -281,6 +337,38 @@ def filter_comments(current_line): return sanitized_line +def check_comment_spelling(line): + if no_spellcheck or not spellcheck_comments: + return False + + comment_words = filter_comments(line, True).replace(':', ' ').split(' ') + for word in comment_words: + skip = False + strword = re.subn(r'\W+', '', word)[0].replace(',', '') + if len(strword) and not spell_check_dict.check(strword.lower()): + if any([check_char in word \ + for check_char in ['=', '(', '-', '_', '/', '\'']]): + skip = True + + # special case the '.' + if '.' in word and not word.endswith('.'): + skip = True + + # skip proper nouns and references to macros + if strword.isupper() or (strword[0].isupper() and \ + strword[1:].islower()): + skip = True + + # skip words that start with numbers + if strword.startswith(tuple('0123456789')): + skip = True + + if not skip: + return True + + return False + + checks = [ {'regex': None, 'match_name': @@ -324,6 +412,11 @@ checks = [ 'prereq': lambda x: has_comment(x), 'check': lambda x: has_xxx_mark(x), 'print': lambda: print_warning("Comment with 'xxx' marker")}, + + {'regex': '(\.c|\.h)(\.in)?$', 'match_name': None, + 'prereq': lambda x: has_comment(x), + 'check': lambda x: check_comment_spelling(x), + 'print': lambda: print_warning("Check for spelling mistakes")}, ] @@ -529,6 +622,7 @@ Check options: -b|--skip-block-whitespace Skips the if/while/for whitespace tests -l|--skip-leading-whitespace Skips the leading whitespace test -s|--skip-signoff-lines Tolerate missing Signed-off-by line +-S|--spellcheck-comments Check C comments for possible spelling mistakes -t|--skip-trailing-whitespace Skips the trailing whitespace test""" % sys.argv[0]) @@ -576,13 +670,14 @@ if __name__ == '__main__': sys.argv[1:]) n_patches = int(numeric_options[-1][1:]) if numeric_options else 0 - optlist, args = getopt.getopt(args, 'bhlstf', + optlist, args = getopt.getopt(args, 'bhlstfS', ["check-file", "help", "skip-block-whitespace", "skip-leading-whitespace", "skip-signoff-lines", - "skip-trailing-whitespace"]) + "skip-trailing-whitespace", + "spellcheck-comments"]) except: print("Unknown option encountered. Please rerun with -h for help.") sys.exit(-1) @@ -601,6 +696,12 @@ if __name__ == '__main__': skip_trailing_whitespace_check = True elif o in ("-f", "--check-file"): checking_file = True + elif o in ("-S", "--spellcheck-comments"): + if no_spellcheck: + print("WARNING: The enchant library isn't availble.") + print(" Please install python enchant.") + else: + spellcheck_comments = True else: print("Unknown option '%s'" % o) sys.exit(-1)