bug-gzip
[Top][All Lists]
Advanced

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

Re: zgrep -<NUM> doesn't work if <NUM> is two digits or greater


From: Jim Meyering
Subject: Re: zgrep -<NUM> doesn't work if <NUM> is two digits or greater
Date: Tue, 07 Aug 2012 19:24:35 +0200

Jim Meyering wrote:
> Thomas Bushnell, BSG wrote:
>> Create a gzipped file:
>>
>>    $ for i in $(seq 1 100); do echo $i; done > file.txt
>>    $ gzip file.txt
>>
>> Then:
>>
>>    $ zgrep -9 17 file.txt.gz
>>    8
>>    9
>>    ...
>>    25
>>    26
>>
>> works.  But:
>>
>>    $ zgrep -10 17 file.txt.gz
>>    gzip: 17.gz: No such file or directory
>>
>> fails.
>>
>> Note that "grep -9 17 file.txt" and "grep -10 17 file.txt" work just
>> fine.
>>
>> (https://bugs.launchpad.net/bugs/1032831)
>>
>> Please include me in the CC on any replies.
>
> Hi Thomas,
>
> Thanks for the report.
> That made a nice puzzle to go with my morning caffeine ;-)
>
> Here's the fix:
> I'll write the NEWS entry and test later.

Here's the complete patch I expect to push:

>From 722184b17c98080c66453d4568bf37165108ad06 Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Tue, 7 Aug 2012 10:21:55 +0200
Subject: [PATCH 1/2] zgrep: handle a multi-digit context option like -15

* zgrep.in: Do not malfunction when given an option like -15.
Before, it could mistake the pattern for a file name:

  $ echo x | gzip | zgrep -15 x
  gzip: x.gz: No such file or directory

* NEWS (Bug fixes): Mention it.
Reported by Thomas Bushnell: https://bugs.launchpad.net/bugs/1032831
---
 NEWS     |  4 ++++
 zgrep.in | 10 +++++++---
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/NEWS b/NEWS
index ac39994..79c1110 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,10 @@ GNU gzip NEWS                                    -*- outline 
-*-

 ** Bug fixes

+  zgrep no longer malfunctions with a multi-digit context option like -15.
+  Now, it passes that option to grep (equivalent to -C15) just as it does
+  for single-digit options. [bug introduced in gzip-1.3.12]
+
   zmore now acts more like 'more', and is more portable to POSIXish hosts.


diff --git a/zgrep.in b/zgrep.in
index d09bfa7..abc5847 100644
--- a/zgrep.in
+++ b/zgrep.in
@@ -66,9 +66,13 @@ while test $# -ne 0; do

   case $option in
   (-[0123456789EFGHIKLPRTUVZabchilnoqrsuvwxyz]?*)
-    arg2=-\'$(expr "X$option" : 'X-.[0-9]*\(.*\)' | sed "$escape")
-    eval "set -- $arg2 "'${1+"$@"}'
-    option=$(expr "X$option" : 'X\(-.[0-9]*\)');;
+    if expr "X$option" : 'X-[0-9]\+$' > /dev/null; then
+      : # Let a multi-digit, digit-only option like -10 fall through.
+    else
+      arg2=-\'$(expr "X$option" : 'X-.[0-9]*\(.*\)' | sed "$escape")
+      eval "set -- $arg2 "'${1+"$@"}'
+      option=$(expr "X$option" : 'X\(-.[0-9]*\)')
+    fi;;
   (--binary-*=* | --[lm]a*=* | --reg*=*)
     ;;
   (-[ABCDXdefm] | binary-* | --file | --[lm]a* | --reg*)
--
1.7.12.rc1.22.gbfbf4d4


>From 71b69de01f6799280b9131bb5882971e53c99fcd Mon Sep 17 00:00:00 2001
From: Jim Meyering <address@hidden>
Date: Tue, 7 Aug 2012 18:29:14 +0200
Subject: [PATCH 2/2] tests: exercise the just-fixed part of zgrep

* tests/zgrep-context: New file.
* tests/Makefile.am (TESTS): Add it.
---
 tests/Makefile.am   |  1 +
 tests/zgrep-context | 43 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100755 tests/zgrep-context

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 3b6ec31..ddab493 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,6 +25,7 @@ TESTS =                                       \
   trailing-nul                         \
   zdiff                                        \
   zgrep-f                              \
+  zgrep-context                                \
   zgrep-signal                         \
   znew-k

diff --git a/tests/zgrep-context b/tests/zgrep-context
new file mode 100755
index 0000000..85799a4
--- /dev/null
+++ b/tests/zgrep-context
@@ -0,0 +1,43 @@
+#!/bin/sh
+# Ensure that zgrep -15 works.  Before gzip-1.5, it would fail.
+
+# Copyright (C) 2012 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+# limit so don't run it by default.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ..
+
+require_POSIX_grep_
+
+# A limited replacement for seq: handle 1 or 2 args, and an increment of 1.
+seq()
+{
+  case $# in
+    1) start=1  final=$1;;
+    2) start=$1 final=$2;;
+    *) echo you lose 1>&2; exit 1;;
+  esac
+  awk 'BEGIN{for(i='$start';i<='$final';i++) print i}' < /dev/null
+}
+
+seq 40 > in || framework_failure_
+gzip < in > in.gz || framework_failure_
+seq 2 32 > exp || framework_failure_
+
+fail=0
+zgrep -15 17 - < in.gz > out || fail=1
+compare exp out || fail=1
+
+Exit $fail
--
1.7.12.rc1.22.gbfbf4d4



reply via email to

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