Subject: Re: bug#16855: report a bug about shuf

From: Pádraig Brady <[email-masked]>
Date: Mon, 24 Feb 2014 01:03:55 +0000

On 02/23/2014 11:37 PM, Paul Eggert wrote:
> Thanks for the bug report.  I've committed the attached patch.
> 
> shuf.diff
> 
> 
> From 24eb395471176e24762b08bfcef7562911537504 Mon Sep 17 00:00:00 2001
> From: Paul Eggert <[email-masked]>
> Date: Sun, 23 Feb 2014 15:34:48 -0800
> Subject: [PATCH] shuf: with -r, don't dump core if the input is empty
> 
> Problem reported by valiant xiao in <http://bugs.gnu.org/16855>.
> * NEWS: Document this.
> * src/shuf.c (main): With -r, report an error if the input is empty.
> * tests/misc/shuf.sh: Test for the bug.
> ---
>  NEWS               |  3 +++
>  src/shuf.c         | 15 +++++++++++----
>  tests/misc/shuf.sh |  4 ++++
>  3 files changed, 18 insertions(+), 4 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index e72942b..2df246d 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -22,6 +22,9 @@ GNU coreutils NEWS                                    -*- outline -*-
>    it would display an error, requiring --no-dereference to avoid the issue.
>    [bug introduced in coreutils-5.3.0]
>  
> +  shuf -r no longer dumps core if the input is empty.
> +  [bug introduced in coreutils-8.22]
> +
>  ** New features
>  
>    od accepts a new option: --endian=TYPE to handle inputs with different byte
> diff --git a/src/shuf.c b/src/shuf.c
> index d4641fe..2a91072 100644
> --- a/src/shuf.c
> +++ b/src/shuf.c
> @@ -576,11 +576,18 @@ main (int argc, char **argv)
>    /* Generate output according to requested method */
>    if (repeat)
>      {
> -      if (input_range)
> -        i = write_random_numbers (randint_source, head_lines,
> -                                  lo_input, hi_input, eolbyte);
> +      if (head_lines == 0)
> +        i = 0;
>        else
> -        i = write_random_lines (randint_source, head_lines, line, n_lines);
> +        {
> +          if (n_lines == 0)
> +            error (EXIT_FAILURE, 0, _("No lines to repeat"));

Thanks for the quick fix.

I was wondering if we do want to error if there is no input,
rather than silently exit(0)?

  $ shuf -r -n1 /dev/null
  shuf: No lines to repeat

I guess that makes sense since we can't fulfil the request
to repeat forever, or with -n; at least up to n.
I.E. rather than this being a transformation of the input,
the input in insufficient to generate the requested output.

thanks,
Pádraig.