Eric Blake wrote: > On 04/09/2011 03:02 PM, Jim Meyering wrote: >> There was a new use of "can not" in coreutils despite >> my having performed this transformation before. >> Autoconf is the same: one current/new violation, >> in spite of applying the fix before. >> I noticed that James Youngman recently fixed one in findutils >> and there are several here in gnulib. >> >> With this, new offenses will be less likely. >> >>>From 2ba828d7b521d831648a4d0926d7885705cf1d59 Mon Sep 17 00:00:00 2001 >> From: Jim Meyering <[email protected]> >> Date: Sat, 9 Apr 2011 22:58:06 +0200 >> Subject: [PATCH] maint.mk: prohibit use of "can not" >> >> * top/maint.mk (sc_prohibit_can_not): New rule. >> Writing "can not" (rather than "cannot") is too common. Prohibit it. > > A recent libvirt patch demonstrated that this rule currently misses > "can\n not"; should sc_prohibit_can_not be rewritten in the same style > as sc_prohibit_doubled_word to also catch violations that are currently > hidden by line-wrapping?
Yes, I'd planned to do that. With the patch below, I've generalized the rule and variable names, so that if we identify other undesirable sequences of words, this is where we can add them. Here's what I've just pushed: >From 6adb4cdee88c73b0824cc094853737878cd38fd1 Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Wed, 11 May 2011 10:07:32 +0200 Subject: [PATCH] maint.mk: improve "can not" detection and generalize rule name * top/maint.mk (sc_prohibit_misc): Renamed from sc_prohibit_can_not, since we'll probably add a few more word pairs here. Use the same technique as in sc_prohibit_doubled_word, so that we recognize "can not" also when the words are separated by a newline. Suggested by Eric Blake. (perl_filename_lineno_text_): Define. Factored out of... (prohibit_doubled_word_): ...here. Use the new definition. (prohibit_misc_): New var. Use it here, too. (prohibit_misc_RE_): New overridable variable. --- ChangeLog | 13 +++++++++++++ top/maint.mk | 30 ++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index c448183..00e42d5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2011-05-11 Jim Meyering <[email protected]> + + maint.mk: improve "can not" detection and generalize rule name + * top/maint.mk (sc_prohibit_misc): Renamed from sc_prohibit_can_not, + since we'll probably add a few more word pairs here. + Use the same technique as in sc_prohibit_doubled_word, so that + we recognize "can not" also when the words are separated by a newline. + Suggested by Eric Blake. + (perl_filename_lineno_text_): Define. Factored out of... + (prohibit_doubled_word_): ...here. Use the new definition. + (prohibit_misc_): New var. Use it here, too. + (prohibit_misc_RE_): New overridable variable. + 2011-05-10 Eric Blake <[email protected]> fclose: avoid double close race when possible diff --git a/top/maint.mk b/top/maint.mk index 346fe00..bb4354f 100644 --- a/top/maint.mk +++ b/top/maint.mk @@ -840,16 +840,21 @@ sc_prohibit_S_IS_definition: halt='do not define S_IS* macros; include <sys/stat.h>' \ $(_sc_search_regexp) -prohibit_doubled_word_RE_ ?= \ - /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims -prohibit_doubled_word_ = \ - -e 'while ($(prohibit_doubled_word_RE_))' \ +# Perl block to convert a match to FILE_NAME:LINENO:TEST, +# that is shared by two definitions below. +perl_filename_lineno_text_ = \ -e ' {' \ -e ' $$n = ($$` =~ tr/\n/\n/ + 1);' \ -e ' ($$v = $$&) =~ s/\n/\\n/g;' \ -e ' print "$$ARGV:$$n:$$v\n";' \ -e ' }' +prohibit_doubled_word_RE_ ?= \ + /\b(then?|[iao]n|i[fst]|but|f?or|at|and|[dt]o)\s+\1\b/gims +prohibit_doubled_word_ = \ + -e 'while ($(prohibit_doubled_word_RE_))' \ + $(perl_filename_lineno_text_) + # Define this to a regular expression that matches # any filename:dd:match lines you want to ignore. # The default is to ignore no matches. @@ -860,10 +865,19 @@ sc_prohibit_doubled_word: | grep -vE '$(ignore_doubled_word_match_RE_)' \ | grep . && { echo '$(ME): doubled words' 1>&2; exit 1; } || : -sc_prohibit_can_not: - @prohibit='\<can[ ]not\>' \ - halt='use "cannot", not "can'' not"' \ - $(_sc_search_regexp) +# A regular expression matching undesirable combinations of words like +# "can not"; this matches them even when the two words appear on different +# lines, but not when there is an intervening delimiter like "#" or "*". +prohibit_misc_RE_ ?= \ + /\bcan\s+not\b/gims +prohibit_misc_ = \ + -e 'while ($(prohibit_misc_RE_))' \ + $(perl_filename_lineno_text_) + +sc_prohibit_misc: + @perl -n -0777 $(prohibit_misc_) $$($(VC_LIST_EXCEPT)) \ + | grep -vE '$(prohibit_misc_RE_)' \ + | grep . && { echo '$(ME): undesirable words' 1>&2; exit 1; } || : _ptm1 = use "test C1 && test C2", not "test C1 -''a C2" _ptm2 = use "test C1 || test C2", not "test C1 -''o C2" -- 1.7.5.1.354.g761178
