bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] maint: new syntax-check rule: prohibit empty lines at EOF


From: Jim Meyering
Subject: Re: [PATCH] maint: new syntax-check rule: prohibit empty lines at EOF
Date: Sat, 10 Apr 2010 20:30:24 +0200

Jim Meyering wrote:
> Pádraig Brady wrote:
>> On 10/04/10 13:53, Jim Meyering wrote:
>>> Here's a rule I'm adding to coreutils' cfg.mk.
>>> However, I would like to use it several other projects,
>>> so rather than duplicating it in each, I'm thinking of
>>> putting it in gnulib's maint.mk.
>>>
>>> Opinions?
>>>
>>> I know that at least Bruno likes to retain trailing empty
>>> lines in modules/ files.  But for a class of files like that,
>>> it's easy to exempt "^modules/" or to omit the rule altogether.
>>>
>>> Does anyone object to my adding this syntax check to maint.mk?
>>>
>>> Aside from that, can anyone improve on the code?
>>> The multi-line Perl script is the only way I could get
>>> the efficiency I wanted, but there may well be another
>>> more concise way.
>>
>> Maybe something like this?
>> tail -n1 files... | sed -n 's/==> \(.*\) <==/\1/; t blanks;d; :blanks h;n;/^ 
>> *$/{x;p};'
>> Though that won't work on solaris for example.
>
> Good idea to parse tail output.
> This floats my boat:
>
>   tail -n1 ... | perl -00 -ne '/^==> ([^\n]+) <==\n\n/m and print "$1\n"'
>
> Several of the syntax-check rules already rely on perl,
> and since this would search only version-controlled files,
> we should be safe in assuming no name includes a newline.

I added the code to make it produce the exit status we need:

>From 8c4b6ba09be4eb3e7b2373a4b2d6c908c0836eaa Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Sat, 10 Apr 2010 14:19:11 +0200
Subject: [PATCH] maint: new syntax-check rule: prohibit empty lines at EOF
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* cfg.mk (detect_empty_lines_at_EOF_): Define.
(sc_prohibit_empty_lines_at_EOF): New rule.
* .x-sc_prohibit_empty_lines_at_EOF: New file.  Exempt pr test inputs.
* Makefile.am (syntax_check_exceptions): Add it.
Pádraig Brady suggested to parse the output of tail -n1.
---
 .x-sc_prohibit_empty_lines_at_EOF |    1 +
 Makefile.am                       |    1 +
 cfg.mk                            |   24 ++++++++++++++++++++++++
 3 files changed, 26 insertions(+), 0 deletions(-)
 create mode 100644 .x-sc_prohibit_empty_lines_at_EOF

diff --git a/.x-sc_prohibit_empty_lines_at_EOF 
b/.x-sc_prohibit_empty_lines_at_EOF
new file mode 100644
index 0000000..92571d6
--- /dev/null
+++ b/.x-sc_prohibit_empty_lines_at_EOF
@@ -0,0 +1 @@
+^tests/pr/
diff --git a/Makefile.am b/Makefile.am
index 1eb9c12..9a7f45c 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -47,6 +47,7 @@ syntax_check_exceptions =             \
   .x-sc_po_check                       \
   .x-sc_program_name                   \
   .x-sc_prohibit_atoi_atof             \
+  .x-sc_prohibit_empty_lines_at_EOF    \
   .x-sc_prohibit_fail_0                        \
   .x-sc_prohibit_magic_number_exit     \
   .x-sc_prohibit_stat_st_blocks                \
diff --git a/cfg.mk b/cfg.mk
index 75ce77a..dfc3b86 100644
--- a/cfg.mk
+++ b/cfg.mk
@@ -315,6 +315,30 @@ sc_space_before_open_paren:
        else :;                                                         \
        fi

+# The following tail+perl pipeline would be much more concise, and would
+# produce slightly better output (including counts) if written as
+#   perl -ln -0777 -e '/\n(\n+)$/ and print "$ARGV: ".length $1' ...
+# but that would be far less efficient, reading the entire contents
+# of each file, rather than just the last few bytes of each.
+#
+# This is a perl script that operates on the output of
+# tail -n1 TWO_OR_MORE_FILES
+# Print the name of each file that ends in two or more newline bytes.
+# Exit nonzero if at least one such file is found, otherwise, exit 0.
+#
+# Use this if you want to remove trailing empty lines from selected files:
+#   perl -pi -0777 -e 's/\n\n+$/\n/' files...
+#
+detect_empty_lines_at_EOF_ =                                           \
+  /^==> ([^\n]+) <==\n\n/m and (print "$$1\n"), $$fail = 1;            \
+  END { exit defined $$fail }
+
+sc_prohibit_empty_lines_at_EOF:
+       @tail -n1 $$($(VC_LIST_EXCEPT)) /dev/null                       \
+           | perl -00 -ne '$(detect_empty_lines_at_EOF_)'              \
+         || { echo '$(ME): the above files end with empty line(s)'     \
+               1>&2; exit 1; } || :;                                   \
+
 include $(srcdir)/dist-check.mk

 update-copyright-env = \
--
1.7.1.rc0.264.g94f6e




reply via email to

[Prev in Thread] Current Thread [Next in Thread]