bug-fileutils
[Top][All Lists]
Advanced

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

Re: Fileutils 4.1.2: Missing newlines in ls -R output


From: Jim Meyering
Subject: Re: Fileutils 4.1.2: Missing newlines in ls -R output
Date: Tue, 27 Nov 2001 21:54:54 +0100
User-agent: Gnus/5.090004 (Oort Gnus v0.04) Emacs/21.1.50 (i686-pc-linux-gnu)

Andreas Schwab <address@hidden> wrote:
> The output of ls -R has changed: there is no empty line between the
> individual directory listings at the same level.
>
> $ mkdir a b c a/1 a/2 /a3
> $ touch a/1/I a/1/II
> $ ls -R
> .:
> a  b  c
>
> ./a:
> 1  2
>
> ./a/1:
> I  II
> ./a/2:
> ./b:
> ./c:

Thanks a lot for the report!
I've added your test case and a couple others.

Here's a fix:

The change of 2001-11-01 introduced a bug whereby some recursive
listings didn't have a blank line between per-directory groups of files.

(print_dir): Print a newline before each directory name
except the first one, rather than after each except the last, since
now (after the changes of 2001-11-01) detecting whether a `pending*'
is the last would involve more work.  Reported by Andreas Schwab.

This change has no net effect.
(main): Remove always-true conjunct and add a comment.

Index: ls.c
===================================================================
RCS file: /1/fileutils/src/ls.c,v
retrieving revision 1.290
retrieving revision 1.291
diff -u -p -r1.290 -r1.291
--- ls.c        2001/11/26 16:46:20     1.290
+++ ls.c        2001/11/27 10:19:24     1.291
@@ -1116,10 +1116,14 @@ main (int argc, char **argv)
       /* `files_index' might be zero now.  */
     }
 
+  /* In the following if/else blocks, it is sufficient to test `pending_dirs'
+     (and not pending_dirs->name) because there may be no markers in the queue
+     at this point.  A marker may be enqueued when extract_dirs_from_files is
+     called with a non-empty string or via print_dir.  */
   if (files_index)
     {
       print_current_files ();
-      if (pending_dirs && pending_dirs->name)
+      if (pending_dirs)
        DIRED_PUTCHAR ('\n');
     }
   else if (n_files <= 1 && pending_dirs && pending_dirs->next == 0)
@@ -2019,6 +2023,7 @@ print_dir (const char *name, const char 
   register DIR *reading;
   register struct dirent *next;
   register uintmax_t total_blocks = 0;
+  static int first = 1;
 
   errno = 0;
   reading = opendir (name);
@@ -2094,6 +2099,9 @@ print_dir (const char *name, const char 
 
   if (recursive || print_dir_name)
     {
+      if (!first)
+       DIRED_PUTCHAR ('\n');
+      first = 0;
       DIRED_INDENT ();
       PUSH_CURRENT_DIRED_POS (&subdired_obstack);
       dired_pos += quote_name (stdout, realname ? realname : name,
@@ -2119,9 +2127,6 @@ print_dir (const char *name, const char 
 
   if (files_index)
     print_current_files ();
-
-  if (pending_dirs && pending_dirs->name)
-    DIRED_PUTCHAR ('\n');
 }
 
 /* Add `pattern' to the list of patterns for which files that match are



reply via email to

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