Hello community,

here is the log from the commit of package bash for openSUSE:Factory checked in 
at 2012-03-07 20:08:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/bash (Old)
 and      /work/SRC/openSUSE:Factory/.bash.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "bash", Maintainer is "wer...@suse.com"

Changes:
--------
--- /work/SRC/openSUSE:Factory/bash/bash.changes        2011-12-21 
09:59:26.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.bash.new/bash.changes   2012-03-07 
20:08:48.000000000 +0100
@@ -1,0 +2,12 @@
+Tue Mar  6 12:15:18 UTC 2012 - wer...@suse.de
+
+- Add small patch for be able to use nanoseconds in comparision
+  of time stamps of files (bnc#750640)
+
+-------------------------------------------------------------------
+Tue Mar  6 09:33:30 UTC 2012 - wer...@suse.de
+
+- Reenable patch for bnc#725657 with latest change from latest
+  git repository of the patch.
+
+-------------------------------------------------------------------

New:
----
  bash-4.2-nsec.dif

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ bash.spec ++++++
--- /var/tmp/diff_new_pack.fBRfDD/_old  2012-03-07 20:08:51.000000000 +0100
+++ /var/tmp/diff_new_pack.fBRfDD/_new  2012-03-07 20:08:51.000000000 +0100
@@ -40,6 +40,7 @@
 License:        GPL-2.0+
 Group:          System/Shells
 Url:            http://www.gnu.org/software/bash/bash.html
+# Git:          http://git.savannah.gnu.org/cgit/bash.git
 Source0:        ftp://ftp.gnu.org/gnu/bash/bash-%{bash_vers}.tar.gz
 Source1:        ftp://ftp.gnu.org/gnu/readline/readline-%{rl_vers}.tar.gz
 Source2:        bash-%{bash_vers}-patches.tar.bz2
@@ -72,6 +73,7 @@
 Patch15:        bash-3.2-longjmp.dif
 Patch16:        bash-4.0-setlocale.dif
 Patch17:        bash-4.0-headers.dif
+Patch18:        bash-4.2-nsec.dif
 Patch20:        readline-%{rl_vers}.dif
 Patch21:        readline-4.3-input.dif
 Patch22:        readline-6.1-wrap.patch
@@ -255,11 +257,12 @@
 
 %prep
 %setup -q -n bash-%{bash_vers}%{extend} -b1 -b2 -b3
-for p in ../bash-%{bash_vers}-patches/*; do
-    test -e $p || break
-    test "${p##*/}" = "bash-4.2-pwd.patch" && continue
-    echo Patch $p
-    patch -s -p0 < $p
+for patch in ../bash-%{bash_vers}-patches/*; do
+    level=-p1
+    test -e $patch || break
+    [[ $(head -n 1 $patch) =~ From ]] || level=-p0
+    echo Patch $patch
+    patch -s $level < $patch
 done
 unset p
 %patch1  -p0 -b .manual
@@ -279,6 +282,7 @@
 %patch15 -p0 -b .longjmp
 %patch16 -p0 -b .setlocale
 %patch17 -p0 -b .headers
+%patch18 -p0 -b .nsec
 %patch21 -p0 -b .zerotty
 %patch22 -p0 -b .wrap
 %patch23 -p0 -b .conf
@@ -569,8 +573,9 @@
 %install_info_delete --info-dir=%{_infodir} %{_infodir}/readline.info.gz
 
 %clean
+LD_LIBRARY_PATH=%{buildroot}/%{_lib} \
 ldd -u -r %{buildroot}/bin/bash || true
-ldd -u -r %{buildroot}%{_libdir}/libreadline.so || true
+ldd -u -r %{buildroot}/%{_lib}/libreadline.so.* || true
 %{?buildroot: %{__rm} -rf %{buildroot}}
 
 %files

++++++ bash-4.2-nsec.dif ++++++
--- test.c
+++ test.c      2012-03-06 11:14:00.149934027 +0000
@@ -309,8 +309,17 @@ filecomp (s, t, op)
   
   switch (op)
     {
+#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || (defined(_XOPEN_SOURCE) 
&& ((_XOPEN_SOURCE - 0) >= 700)) || (defined(_POSIX_C_SOURCE) && 
((_POSIX_C_SOURCE - 0) >= 200809L))
+# define st_mtimcmp(t1, t2, CMP)                   \
+       (((t1).st_mtim.tv_sec == (t2).st_mtim.tv_sec) ?     \
+           ((t1).st_mtim.tv_nsec CMP (t2).st_mtim.tv_nsec) :       \
+           ((t1).st_mtim.tv_sec  CMP (t2).st_mtim.tv_sec))
+    case OT: return (r1 < r2 || (r2 == 0 && st_mtimcmp(st1, st2, <)));
+    case NT: return (r1 > r2 || (r1 == 0 && st_mtimcmp(st1, st2, >)));
+#else
     case OT: return (r1 < r2 || (r2 == 0 && st1.st_mtime < st2.st_mtime));
     case NT: return (r1 > r2 || (r1 == 0 && st1.st_mtime > st2.st_mtime));
+#endif
     case EF: return (same_file (s, t, &st1, &st2));
     }
   return (FALSE);
++++++ bash-4.2-patches.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/bash-4.2-patches/bash-4.2-pwd.patch 
new/bash-4.2-patches/bash-4.2-pwd.patch
--- old/bash-4.2-patches/bash-4.2-pwd.patch     2011-10-25 19:04:39.000000000 
+0200
+++ new/bash-4.2-patches/bash-4.2-pwd.patch     2012-03-06 10:32:00.000000000 
+0100
@@ -1,394 +1,393 @@
-*** ../bash-4.2-patched/bashline.c     2011-01-16 15:32:47.000000000 -0500
---- bashline.c 2011-07-08 16:30:01.000000000 -0400
-***************
-*** 122,125 ****
---- 122,128 ----
-  static int bash_push_line __P((void));
-  
-+ static rl_icppfunc_t *save_directory_hook __P((void));
-+ static void reset_directory_hook __P((rl_icppfunc_t *));
-+ 
-  static void cleanup_expansion_error __P((void));
-  static void maybe_make_readline_line __P((char *));
-***************
-*** 244,251 ****
---- 249,262 ----
-  int dircomplete_spelling = 0;
-  
-+ /* Expand directory names during word/filename completion. */
-+ int dircomplete_expand = 0;
-+ 
-  static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
-  static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
-  /* )) */
-  
-+ static const char *default_filename_quote_characters = " 
\t\n\\\"'@<>=;|&()#$`?*[!:{~";      /*}*/
-+ static char *custom_filename_quote_characters = 0;
-+ 
-  static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
-  
-***************
-*** 502,506 ****
-    /* Tell the completer that we might want to follow symbolic links or
-       do other expansion on directory names. */
-!   rl_directory_rewrite_hook = bash_directory_completion_hook;
-  
-    rl_filename_rewrite_hook = bash_filename_rewrite_hook;
---- 513,517 ----
-    /* Tell the completer that we might want to follow symbolic links or
-       do other expansion on directory names. */
-!   set_directory_hook ();
-  
-    rl_filename_rewrite_hook = bash_filename_rewrite_hook;
-***************
-*** 530,534 ****
-  
-    /* characters that need to be quoted when appearing in filenames. */
-!   rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";    /*}*/
-  
-    rl_filename_quoting_function = bash_quote_filename;
---- 541,545 ----
-  
-    /* characters that need to be quoted when appearing in filenames. */
-!   rl_filename_quote_characters = default_filename_quote_characters;
-  
-    rl_filename_quoting_function = bash_quote_filename;
-***************
-*** 565,570 ****
-    rl_attempted_completion_function = attempt_shell_completion;
-    rl_completion_entry_function = NULL;
--   rl_directory_rewrite_hook = bash_directory_completion_hook;
-    rl_ignore_some_completions_function = filename_completion_ignore;
-  }
-  
---- 588,595 ----
-    rl_attempted_completion_function = attempt_shell_completion;
-    rl_completion_entry_function = NULL;
-    rl_ignore_some_completions_function = filename_completion_ignore;
-+   rl_filename_quote_characters = default_filename_quote_characters;
-+ 
-+   set_directory_hook ();
-  }
-  
-***************
-*** 1280,1283 ****
---- 1311,1316 ----
-    rl_ignore_some_completions_function = filename_completion_ignore;
-  
-+   rl_filename_quote_characters = default_filename_quote_characters;
-+ 
-    /* Determine if this could be a command word.  It is if it appears at
-       the start of the line (ignoring preceding whitespace), or if it
-***************
-*** 2694,2697 ****
---- 2754,2803 ----
-  }
-  
-+ /* Functions to save and restore the appropriate directory hook */
-+ /* This is not static so the shopt code can call it */
-+ void
-+ set_directory_hook ()
-+ {
-+   if (dircomplete_expand)
-+     {
-+       rl_directory_completion_hook = bash_directory_completion_hook;
-+       rl_directory_rewrite_hook = (rl_icppfunc_t *)0;
-+     }
-+   else
-+     {
-+       rl_directory_rewrite_hook = bash_directory_completion_hook;
-+       rl_directory_completion_hook = (rl_icppfunc_t *)0;
-+     }
-+ }
-+ 
-+ static rl_icppfunc_t *
-+ save_directory_hook ()
-+ {
-+   rl_icppfunc_t *ret;
-+ 
-+   if (dircomplete_expand)
-+     {
-+       ret = rl_directory_completion_hook;
-+       rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
-+     }
-+   else
-+     {
-+       ret = rl_directory_rewrite_hook;
-+       rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
-+     }
-+ 
-+   return ret;
-+ }
-+ 
-+ static void
-+ restore_directory_hook (hookf)
-+      rl_icppfunc_t *hookf;
-+ {
-+   if (dircomplete_expand)
-+     rl_directory_completion_hook = hookf;
-+   else
-+     rl_directory_rewrite_hook = hookf;
-+ }
-+ 
-  /* Handle symbolic link references and other directory name
-     expansions while hacking completion.  This should return 1 if it modifies
-***************
-*** 2703,2720 ****
-  {
-    char *local_dirname, *new_dirname, *t;
-!   int return_value, should_expand_dirname;
-    WORD_LIST *wl;
-    struct stat sb;
-  
-!   return_value = should_expand_dirname = 0;
-    local_dirname = *dirname;
-  
-!   if (mbschr (local_dirname, '$'))
-!     should_expand_dirname = 1;
-    else
-      {
-        t = mbschr (local_dirname, '`');
-        if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 
0)
-!      should_expand_dirname = 1;
-      }
-  
---- 2809,2837 ----
-  {
-    char *local_dirname, *new_dirname, *t;
-!   int return_value, should_expand_dirname, nextch, closer;
-    WORD_LIST *wl;
-    struct stat sb;
-  
-!   return_value = should_expand_dirname = nextch = closer = 0;
-    local_dirname = *dirname;
-  
-!   if (t = mbschr (local_dirname, '$'))
-!     {
-!       should_expand_dirname = '$';
-!       nextch = t[1];
-!       /* Deliberately does not handle the deprecated $[...] arithmetic
-!       expansion syntax */
-!       if (nextch == '(')
-!      closer = ')';
-!       else if (nextch == '{')
-!      closer = '}';
-!       else
-!      nextch = 0;
-!     }
-    else
-      {
-        t = mbschr (local_dirname, '`');
-        if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 
0)
-!      should_expand_dirname = '`';
-      }
-  
-***************
-*** 2740,2743 ****
---- 2857,2877 ----
-         dispose_words (wl);
-         local_dirname = *dirname;
-+        /* XXX - change rl_filename_quote_characters here based on
-+           should_expand_dirname/nextch/closer.  This is the only place
-+           custom_filename_quote_characters is modified. */
-+        if (rl_filename_quote_characters && *rl_filename_quote_characters)
-+          {
-+            int i, j, c;
-+            i = strlen (default_filename_quote_characters);
-+            custom_filename_quote_characters = xrealloc 
(custom_filename_quote_characters, i+1);
-+            for (i = j = 0; c = default_filename_quote_characters[i]; i++)
-+              {
-+                if (c == should_expand_dirname || c == nextch || c == closer)
-+                  continue;
-+                custom_filename_quote_characters[j++] = c;
-+              }
-+            custom_filename_quote_characters[j] = '\0';
-+            rl_filename_quote_characters = custom_filename_quote_characters;
-+          }
-       }
-        else
-***************
-*** 3003,3012 ****
-    orig_func = rl_completion_entry_function;
-    orig_attempt_func = rl_attempted_completion_function;
--   orig_dir_func = rl_directory_rewrite_hook;
-    orig_ignore_func = rl_ignore_some_completions_function;
-    orig_rl_completer_word_break_characters = 
rl_completer_word_break_characters;
-    rl_completion_entry_function = rl_filename_completion_function;
-    rl_attempted_completion_function = (rl_completion_func_t *)NULL;
--   rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
-    rl_ignore_some_completions_function = filename_completion_ignore;
-    rl_completer_word_break_characters = " \t\n\"\'";
---- 3137,3147 ----
-    orig_func = rl_completion_entry_function;
-    orig_attempt_func = rl_attempted_completion_function;
-    orig_ignore_func = rl_ignore_some_completions_function;
-    orig_rl_completer_word_break_characters = 
rl_completer_word_break_characters;
-+ 
-+   orig_dir_func = save_directory_hook ();
-+ 
-    rl_completion_entry_function = rl_filename_completion_function;
-    rl_attempted_completion_function = (rl_completion_func_t *)NULL;
-    rl_ignore_some_completions_function = filename_completion_ignore;
-    rl_completer_word_break_characters = " \t\n\"\'";
-***************
-*** 3016,3023 ****
-    rl_completion_entry_function = orig_func;
-    rl_attempted_completion_function = orig_attempt_func;
--   rl_directory_rewrite_hook = orig_dir_func;
-    rl_ignore_some_completions_function = orig_ignore_func;
-    rl_completer_word_break_characters = 
orig_rl_completer_word_break_characters;
-  
-    return r;
-  }
---- 3151,3159 ----
-    rl_completion_entry_function = orig_func;
-    rl_attempted_completion_function = orig_attempt_func;
-    rl_ignore_some_completions_function = orig_ignore_func;
-    rl_completer_word_break_characters = 
orig_rl_completer_word_break_characters;
-  
-+   restore_directory_hook (orig_dir_func);
-+ 
-    return r;
-  }
-*** ../bash-4.2-patched/bashline.h     2009-01-04 14:32:22.000000000 -0500
---- bashline.h 2011-07-08 16:22:22.000000000 -0400
-***************
-*** 34,41 ****
---- 34,46 ----
-  extern int bash_re_edit __P((char *));
-  
-+ extern void bashline_set_event_hook __P((void));
-+ extern void bashline_reset_event_hook __P((void));
-+ 
-  extern int bind_keyseq_to_unix_command __P((char *));
-  
-  extern char **bash_default_completion __P((const char *, int, int, int, 
int));
-  
-+ void set_directory_hook __P((void));
-+ 
-  /* Used by programmable completion code. */
-  extern char *command_word_completion_function __P((const char *, int));
-*** ../bash-4.2-patched/builtins/shopt.def     2010-07-02 22:42:44.000000000 
-0400
---- builtins/shopt.def 2011-07-08 16:31:28.000000000 -0400
-***************
-*** 62,65 ****
---- 62,69 ----
-  #include "bashgetopt.h"
-  
-+ #if defined (READLINE)
-+ #  include "../bashline.h"
-+ #endif
-+ 
-  #if defined (HISTORY)
-  #  include "../bashhist.h"
-***************
-*** 95,99 ****
-  extern int no_empty_command_completion;
-  extern int force_fignore;
-! extern int dircomplete_spelling;
-  
-  extern int enable_hostname_completion __P((int));
---- 100,104 ----
-  extern int no_empty_command_completion;
-  extern int force_fignore;
-! extern int dircomplete_spelling, dircomplete_expand;
-  
-  extern int enable_hostname_completion __P((int));
-***************
-*** 122,125 ****
---- 127,134 ----
-  #endif
-  
-+ #if defined (READLINE)
-+ static int shopt_set_complete_direxpand __P((char *, int));
-+ #endif
-+ 
-  static int shopt_login_shell;
-  static int shopt_compat31;
-***************
-*** 151,154 ****
---- 160,164 ----
-    { "compat41", &shopt_compat41, set_compatibility_level },
-  #if defined (READLINE)
-+   { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
-    { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
-  #endif
-***************
-*** 536,539 ****
---- 547,561 ----
-  }
-  
-+ #if defined (READLINE)
-+ static int
-+ shopt_set_complete_direxpand (option_name, mode)
-+      char *option_name;
-+      int mode;
-+ {
-+   set_directory_hook ();
-+   return 0;
-+ }
-+ #endif
-+ 
-  #if defined (RESTRICTED_SHELL)
-  /* Don't allow the value of restricted_shell to be modified. */
-*** ../bash-4.2-patched/doc/bash.1     2011-01-16 15:31:39.000000000 -0500
---- doc/bash.1 2011-08-27 13:20:57.000000000 -0400
-***************
-*** 8949,8952 ****
---- 8993,9006 ----
-  The default bash behavior remains as in previous versions.
-  .TP 8
-+ .B direxpand
-+ If set,
-+ .B bash
-+ replaces directory names with the results of word expansion when performing
-+ filename completion.  This changes the contents of the readline editing
-+ buffer.
-+ If not set,
-+ .B bash
-+ attempts to preserve what the user typed.
-+ .TP 8
-  .B dirspell
-  If set,
-*** ../bash-4.2-patched/doc/bashref.texi       2011-01-16 15:31:57.000000000 
-0500
---- doc/bashref.texi   2011-08-27 13:20:59.000000000 -0400
-***************
-*** 4536,4539 ****
---- 4561,4571 ----
-  The default Bash behavior remains as in previous versions.
-  
-+ @item direxpand
-+ If set, Bash
-+ replaces directory names with the results of word expansion when performing
-+ filename completion.  This changes the contents of the readline editing
-+ buffer.
-+ If not set, Bash attempts to preserve what the user typed.
-+ 
-  @item dirspell
-  If set, Bash
-*** ../bash-4.2-patched/tests/shopt.right      2010-07-02 23:36:30.000000000 
-0400
---- tests/shopt.right  2011-09-02 09:24:27.000000000 -0400
-***************
-*** 13,16 ****
---- 13,17 ----
-  shopt -u compat40
-  shopt -u compat41
-+ shopt -u direxpand
-  shopt -u dirspell
-  shopt -u dotglob
-***************
-*** 69,72 ****
---- 70,74 ----
-  shopt -u compat40
-  shopt -u compat41
-+ shopt -u direxpand
-  shopt -u dirspell
-  shopt -u dotglob
-***************
-*** 102,105 ****
---- 104,108 ----
-  compat40             off
-  compat41             off
-+ direxpand            off
-  dirspell             off
-  dotglob              off
+From b3203139c0ad0bd9fa902d5e7d8bf9064a74775f Mon Sep 17 00:00:00 2001
+From: Chet Ramey <chet.ra...@case.edu>
+Date: Wed, 23 Nov 2011 22:58:51 +0000
+Subject: Bash-4.2 direxpand shopt variable and associated changes, including 
heuristics to avoid quoting shell variables during word completion
+
+---
+diff --git a/bashline.c b/bashline.c
+index 52c6de6..d42f3f0 100644
+--- a/bashline.c
++++ b/bashline.c
+@@ -121,6 +121,9 @@ static int bash_directory_completion_hook __P((char **));
+ static int filename_completion_ignore __P((char **));
+ static int bash_push_line __P((void));
+ 
++static rl_icppfunc_t *save_directory_hook __P((void));
++static void reset_directory_hook __P((rl_icppfunc_t *));
++
+ static void cleanup_expansion_error __P((void));
+ static void maybe_make_readline_line __P((char *));
+ static void set_up_new_line __P((char *));
+@@ -243,10 +246,16 @@ int force_fignore = 1;
+ /* Perform spelling correction on directory names during word completion */
+ int dircomplete_spelling = 0;
+ 
++/* Expand directory names during word/filename completion. */
++int dircomplete_expand = 0;
++
+ static char *bash_completer_word_break_characters = " \t\n\"'@><=;|&(:";
+ static char *bash_nohostname_word_break_characters = " \t\n\"'><=;|&(:";
+ /* )) */
+ 
++static const char *default_filename_quote_characters = " 
\t\n\\\"'@<>=;|&()#$`?*[!:{~";       /*}*/
++static char *custom_filename_quote_characters = 0;
++
+ static rl_hook_func_t *old_rl_startup_hook = (rl_hook_func_t *)NULL;
+ 
+ static int dot_in_path = 0;
+@@ -501,7 +510,7 @@ initialize_readline ()
+ 
+   /* Tell the completer that we might want to follow symbolic links or
+      do other expansion on directory names. */
+-  rl_directory_rewrite_hook = bash_directory_completion_hook;
++  set_directory_hook ();
+ 
+   rl_filename_rewrite_hook = bash_filename_rewrite_hook;
+ 
+@@ -529,7 +538,7 @@ initialize_readline ()
+   enable_hostname_completion (perform_hostname_completion);
+ 
+   /* characters that need to be quoted when appearing in filenames. */
+-  rl_filename_quote_characters = " \t\n\\\"'@<>=;|&()#$`?*[!:{~";     /*}*/
++  rl_filename_quote_characters = default_filename_quote_characters;
+ 
+   rl_filename_quoting_function = bash_quote_filename;
+   rl_filename_dequoting_function = bash_dequote_filename;
+@@ -564,8 +573,10 @@ bashline_reset ()
+   tilde_initialize ();
+   rl_attempted_completion_function = attempt_shell_completion;
+   rl_completion_entry_function = NULL;
+-  rl_directory_rewrite_hook = bash_directory_completion_hook;
+   rl_ignore_some_completions_function = filename_completion_ignore;
++  rl_filename_quote_characters = default_filename_quote_characters;
++
++  set_directory_hook ();
+ }
+ 
+ /* Contains the line to push into readline. */
+@@ -1279,6 +1290,9 @@ attempt_shell_completion (text, start, end)
+   matches = (char **)NULL;
+   rl_ignore_some_completions_function = filename_completion_ignore;
+ 
++  rl_filename_quote_characters = default_filename_quote_characters;
++  set_directory_hook ();
++
+   /* Determine if this could be a command word.  It is if it appears at
+      the start of the line (ignoring preceding whitespace), or if it
+      appears after a character that separates commands.  It cannot be a
+@@ -1591,6 +1605,12 @@ command_word_completion_function (hint_text, state)
+           }
+         else
+           {
++           if (dircomplete_expand && dot_or_dotdot (filename_hint))
++              {
++                dircomplete_expand = 0;
++                set_directory_hook ();
++                dircomplete_expand = 1;
++              }
+             mapping_over = 4;
+             goto inner;
+           }
+@@ -1791,6 +1811,9 @@ globword:
+ 
+  inner:
+   val = rl_filename_completion_function (filename_hint, istate);
++  if (mapping_over == 4 && dircomplete_expand)
++    set_directory_hook ();
++
+   istate = 1;
+ 
+   if (val == 0)
+@@ -2693,6 +2716,52 @@ bash_filename_rewrite_hook (fname, fnlen)
+   return conv;
+ }
+ 
++/* Functions to save and restore the appropriate directory hook */
++/* This is not static so the shopt code can call it */
++void
++set_directory_hook ()
++{
++  if (dircomplete_expand)
++    {
++      rl_directory_completion_hook = bash_directory_completion_hook;
++      rl_directory_rewrite_hook = (rl_icppfunc_t *)0;
++    }
++  else
++    {
++      rl_directory_rewrite_hook = bash_directory_completion_hook;
++      rl_directory_completion_hook = (rl_icppfunc_t *)0;
++    }
++}
++
++static rl_icppfunc_t *
++save_directory_hook ()
++{
++  rl_icppfunc_t *ret;
++
++  if (dircomplete_expand)
++    {
++      ret = rl_directory_completion_hook;
++      rl_directory_completion_hook = (rl_icppfunc_t *)NULL;
++    }
++  else
++    {
++      ret = rl_directory_rewrite_hook;
++      rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
++    }
++
++  return ret;
++}
++
++static void
++restore_directory_hook (hookf)
++     rl_icppfunc_t *hookf;
++{
++  if (dircomplete_expand)
++    rl_directory_completion_hook = hookf;
++  else
++    rl_directory_rewrite_hook = hookf;
++}
++
+ /* Handle symbolic link references and other directory name
+    expansions while hacking completion.  This should return 1 if it modifies
+    the DIRNAME argument, 0 otherwise.  It should make sure not to modify
+@@ -2702,20 +2771,31 @@ bash_directory_completion_hook (dirname)
+      char **dirname;
+ {
+   char *local_dirname, *new_dirname, *t;
+-  int return_value, should_expand_dirname;
++  int return_value, should_expand_dirname, nextch, closer;
+   WORD_LIST *wl;
+   struct stat sb;
+ 
+-  return_value = should_expand_dirname = 0;
++  return_value = should_expand_dirname = nextch = closer = 0;
+   local_dirname = *dirname;
+ 
+-  if (mbschr (local_dirname, '$'))
+-    should_expand_dirname = 1;
++  if (t = mbschr (local_dirname, '$'))
++    {
++      should_expand_dirname = '$';
++      nextch = t[1];
++      /* Deliberately does not handle the deprecated $[...] arithmetic
++       expansion syntax */
++      if (nextch == '(')
++      closer = ')';
++      else if (nextch == '{')
++      closer = '}';
++      else
++      nextch = 0;
++    }
+   else
+     {
+       t = mbschr (local_dirname, '`');
+       if (t && unclosed_pair (local_dirname, strlen (local_dirname), "`") == 
0)
+-      should_expand_dirname = 1;
++      should_expand_dirname = '`';
+     }
+ 
+ #if defined (HAVE_LSTAT)
+@@ -2739,6 +2819,23 @@ bash_directory_completion_hook (dirname)
+         free (new_dirname);
+         dispose_words (wl);
+         local_dirname = *dirname;
++        /* XXX - change rl_filename_quote_characters here based on
++           should_expand_dirname/nextch/closer.  This is the only place
++           custom_filename_quote_characters is modified. */
++        if (rl_filename_quote_characters && *rl_filename_quote_characters)
++          {
++            int i, j, c;
++            i = strlen (default_filename_quote_characters);
++            custom_filename_quote_characters = xrealloc 
(custom_filename_quote_characters, i+1);
++            for (i = j = 0; c = default_filename_quote_characters[i]; i++)
++              {
++                if (c == should_expand_dirname || c == nextch || c == closer)
++                  continue;
++                custom_filename_quote_characters[j++] = c;
++              }
++            custom_filename_quote_characters[j] = '\0';
++            rl_filename_quote_characters = custom_filename_quote_characters;
++          }
+       }
+       else
+       {
+@@ -3002,12 +3099,13 @@ bash_complete_filename_internal (what_to_do)
+ 
+   orig_func = rl_completion_entry_function;
+   orig_attempt_func = rl_attempted_completion_function;
+-  orig_dir_func = rl_directory_rewrite_hook;
+   orig_ignore_func = rl_ignore_some_completions_function;
+   orig_rl_completer_word_break_characters = 
rl_completer_word_break_characters;
++
++  orig_dir_func = save_directory_hook ();
++
+   rl_completion_entry_function = rl_filename_completion_function;
+   rl_attempted_completion_function = (rl_completion_func_t *)NULL;
+-  rl_directory_rewrite_hook = (rl_icppfunc_t *)NULL;
+   rl_ignore_some_completions_function = filename_completion_ignore;
+   rl_completer_word_break_characters = " \t\n\"\'";
+ 
+@@ -3015,10 +3113,11 @@ bash_complete_filename_internal (what_to_do)
+ 
+   rl_completion_entry_function = orig_func;
+   rl_attempted_completion_function = orig_attempt_func;
+-  rl_directory_rewrite_hook = orig_dir_func;
+   rl_ignore_some_completions_function = orig_ignore_func;
+   rl_completer_word_break_characters = 
orig_rl_completer_word_break_characters;
+ 
++  restore_directory_hook (orig_dir_func);
++
+   return r;
+ }
+ 
+diff --git a/bashline.h b/bashline.h
+index 9daa8f9..38964ea 100644
+--- a/bashline.h
++++ b/bashline.h
+@@ -33,10 +33,15 @@ extern void bashline_reset __P((void));
+ extern void bashline_reinitialize __P((void));
+ extern int bash_re_edit __P((char *));
+ 
++extern void bashline_set_event_hook __P((void));
++extern void bashline_reset_event_hook __P((void));
++
+ extern int bind_keyseq_to_unix_command __P((char *));
+ 
+ extern char **bash_default_completion __P((const char *, int, int, int, int));
+ 
++void set_directory_hook __P((void));
++
+ /* Used by programmable completion code. */
+ extern char *command_word_completion_function __P((const char *, int));
+ extern char *bash_groupname_completion_function __P((const char *, int));
+diff --git a/builtins/shopt.def b/builtins/shopt.def
+index 27685aa..6cd8c4f 100644
+--- a/builtins/shopt.def
++++ b/builtins/shopt.def
+@@ -61,6 +61,10 @@ $END
+ #include "common.h"
+ #include "bashgetopt.h"
+ 
++#if defined (READLINE)
++#  include "../bashline.h"
++#endif
++
+ #if defined (HISTORY)
+ #  include "../bashhist.h"
+ #endif
+@@ -94,7 +98,7 @@ extern int extended_glob;
+ extern int hist_verify, history_reediting, perform_hostname_completion;
+ extern int no_empty_command_completion;
+ extern int force_fignore;
+-extern int dircomplete_spelling;
++extern int dircomplete_spelling, dircomplete_expand;
+ 
+ extern int enable_hostname_completion __P((int));
+ #endif
+@@ -121,6 +125,10 @@ static int set_compatibility_level __P((char *, int));
+ static int set_restricted_shell __P((char *, int));
+ #endif
+ 
++#if defined (READLINE)
++static int shopt_set_complete_direxpand __P((char *, int));
++#endif
++
+ static int shopt_login_shell;
+ static int shopt_compat31;
+ static int shopt_compat32;
+@@ -150,6 +158,7 @@ static struct {
+   { "compat40", &shopt_compat40, set_compatibility_level },
+   { "compat41", &shopt_compat41, set_compatibility_level },
+ #if defined (READLINE)
++  { "direxpand", &dircomplete_expand, shopt_set_complete_direxpand },
+   { "dirspell", &dircomplete_spelling, (shopt_set_func_t *)NULL },
+ #endif
+   { "dotglob", &glob_dot_filenames, (shopt_set_func_t *)NULL },
+@@ -535,6 +544,17 @@ set_compatibility_level (option_name, mode)
+   return 0;
+ }
+ 
++#if defined (READLINE)
++static int
++shopt_set_complete_direxpand (option_name, mode)
++     char *option_name;
++     int mode;
++{
++  set_directory_hook ();
++  return 0;
++}
++#endif
++
+ #if defined (RESTRICTED_SHELL)
+ /* Don't allow the value of restricted_shell to be modified. */
+ 
+diff --git a/doc/bash.1 b/doc/bash.1
+index 0ba4f8e..103d27e 100644
+--- a/doc/bash.1
++++ b/doc/bash.1
+@@ -8948,6 +8948,16 @@ parameter expansion as a special character.  The single 
quotes must match
+ quoted.  This is the behavior of posix mode through version 4.1.
+ The default bash behavior remains as in previous versions.
+ .TP 8
++.B direxpand
++If set,
++.B bash
++replaces directory names with the results of word expansion when performing
++filename completion.  This changes the contents of the readline editing
++buffer.
++If not set,
++.B bash
++attempts to preserve what the user typed.
++.TP 8
+ .B dirspell
+ If set,
+ .B bash
+diff --git a/doc/bashref.texi b/doc/bashref.texi
+index b4fd8d3..ae982d5 100644
+--- a/doc/bashref.texi
++++ b/doc/bashref.texi
+@@ -4535,6 +4535,13 @@ parameter expansion as a special character.  The single 
quotes must match
+ quoted.  This is the behavior of @sc{posix} mode through version 4.1.
+ The default Bash behavior remains as in previous versions.
+ 
++@item direxpand
++If set, Bash
++replaces directory names with the results of word expansion when performing
++filename completion.  This changes the contents of the readline editing
++buffer.
++If not set, Bash attempts to preserve what the user typed.
++
+ @item dirspell
+ If set, Bash
+ attempts spelling correction on directory names during word completion 
+diff --git a/tests/shopt.right b/tests/shopt.right
+index 4080503..0d3c08c 100644
+--- a/tests/shopt.right
++++ b/tests/shopt.right
+@@ -12,6 +12,7 @@ shopt -u compat31
+ shopt -u compat32
+ shopt -u compat40
+ shopt -u compat41
++shopt -u direxpand
+ shopt -u dirspell
+ shopt -u dotglob
+ shopt -u execfail
+@@ -68,6 +69,7 @@ shopt -u compat31
+ shopt -u compat32
+ shopt -u compat40
+ shopt -u compat41
++shopt -u direxpand
+ shopt -u dirspell
+ shopt -u dotglob
+ shopt -u execfail
+@@ -101,6 +103,7 @@ compat31           off
+ compat32              off
+ compat40              off
+ compat41              off
++direxpand             off
+ dirspell              off
+ dotglob               off
+ execfail              off
+--
+cgit v0.9.0.2

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to