bug-bash
[Top][All Lists]
Advanced

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

Re: globstar broken again


From: Chet Ramey
Subject: Re: globstar broken again
Date: Fri, 22 May 2009 16:10:21 -0400
User-agent: Thunderbird 2.0.0.21 (Macintosh/20090302)

Matt Zyzik wrote:
> All,
> 
> Previously, the behavior of globstar mimicked that of ksh/zsh for such a
> command: "ls -adl **/*.cs".
> 
> Now I've upgraded to Bash 4.0.24 from Bash 4.0.17 and the behavior is
> different (seemingly incorrect). Previously, the above-mentioned command
> would list all *.cs files in the current directory and all
> subdirectories. With the latest Bash, it only lists *.cs files in
> subdirectories. The *.cs files in the current working directory are
> ignored.
> 
> I think this is a bug. Again, "ls -adl **/*.cs" is now _not_ picking up
> *.cs files in the current working directory.

OK.  I finally had some time to look at this.

The issue is that you can't always add a null placeholder for the current
directory (the original bash-4.0 code) or never add one (patch 24).  You
have to add one in certain circumstances, when it gets handled later in
the process.

Try the attached patch.  It undoes portions of patch 24 and uses a
different scheme to figure out when to add the null placeholder.  It
seems to work for all cases without any regressions.

Chet



-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer

Chet Ramey, ITS, CWRU    chet@case.edu    http://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.0-patched/lib/glob/glob.c 2009-05-22 12:32:26.000000000 -0400
--- lib/glob/glob.c     2009-05-22 12:35:55.000000000 -0400
***************
*** 666,672 ****
      }
  
!   /* compat: if GX_ALLDIRS, add the passed directory also, but don't add an
!      empty directory name. */
!   if (add_current && (flags & GX_NULLDIR) == 0)
      {
        sdlen = strlen (dir);
--- 666,673 ----
      }
  
!   /* compat: if GX_ADDCURDIR, add the passed directory also.  Add an empty
!      directory name as a placeholder if GX_NULLDIR (in which case the passed
!      directory name is "."). */
!   if (add_current)
      {
        sdlen = strlen (dir);
***************
*** 680,684 ****
          nextlink->next = lastlink;
          lastlink = nextlink;
!         bcopy (dir, nextname, sdlen + 1);
          ++count;
        }
--- 681,688 ----
          nextlink->next = lastlink;
          lastlink = nextlink;
!         if (flags & GX_NULLDIR)
!           nextname[0] = '\0';
!         else
!           bcopy (dir, nextname, sdlen + 1);
          ++count;
        }
***************
*** 1008,1016 ****
        /* Just return what glob_vector () returns appended to the
         directory name. */
        dflags = flags & ~GX_MARKDIRS;
        if (directory_len == 0)
        dflags |= GX_NULLDIR;
        if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' 
&& filename[2] == '\0')
!       dflags |= GX_ALLDIRS|GX_ADDCURDIR;
        temp_results = glob_vector (filename,
                                  (directory_len == 0 ? "." : directory_name),
--- 1012,1033 ----
        /* Just return what glob_vector () returns appended to the
         directory name. */
+       /* If flags & GX_ALLDIRS, we're called recursively */
        dflags = flags & ~GX_MARKDIRS;
        if (directory_len == 0)
        dflags |= GX_NULLDIR;
        if ((flags & GX_GLOBSTAR) && filename[0] == '*' && filename[1] == '*' 
&& filename[2] == '\0')
!       {
!         dflags |= GX_ALLDIRS|GX_ADDCURDIR;
! #if 0
!         /* If we want all directories (dflags & GX_ALLDIRS) and we're not
!            being called recursively as something like `echo **/*.o'
!            ((flags & GX_ALLDIRS) == 0), we want to prevent glob_vector from
!            adding a null directory name to the front of the temp_results
!            array.  We turn off ADDCURDIR if not called recursively and
!            dlen == 0 */
! #endif
!         if (directory_len == 0 && (flags & GX_ALLDIRS) == 0)
!           dflags &= ~GX_ADDCURDIR;
!       }
        temp_results = glob_vector (filename,
                                  (directory_len == 0 ? "." : directory_name),

reply via email to

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