aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChet Ramey <chet.ramey@case.edu>2014-04-11 11:05:05 -0400
committerChet Ramey <chet.ramey@case.edu>2014-04-11 11:05:05 -0400
commit2b76266c887cb74ce9d760d5762d2de44b82473a (patch)
tree596d276b65dd8ef9cd1c23de15f05fdeee66553c
parent6ebbb24a5cc6e798e3c8f75e8617908b93a37d65 (diff)
downloadandroid_external_bash-2b76266c887cb74ce9d760d5762d2de44b82473a.tar.gz
android_external_bash-2b76266c887cb74ce9d760d5762d2de44b82473a.tar.bz2
android_external_bash-2b76266c887cb74ce9d760d5762d2de44b82473a.zip
Bash-4.3 patch 10
-rw-r--r--externs.h1
-rw-r--r--lib/sh/shquote.c14
-rw-r--r--patchlevel.h2
-rw-r--r--pcomplete.c32
4 files changed, 47 insertions, 2 deletions
diff --git a/externs.h b/externs.h
index 61fd0eb..8db43f2 100644
--- a/externs.h
+++ b/externs.h
@@ -324,6 +324,7 @@ extern char *sh_un_double_quote __P((char *));
extern char *sh_backslash_quote __P((char *, const char *, int));
extern char *sh_backslash_quote_for_double_quotes __P((char *));
extern int sh_contains_shell_metas __P((char *));
+extern int sh_contains_quotes __P((char *));
/* declarations for functions defined in lib/sh/spell.c */
extern int spname __P((char *, char *));
diff --git a/lib/sh/shquote.c b/lib/sh/shquote.c
index 31cce1c..fff4f81 100644
--- a/lib/sh/shquote.c
+++ b/lib/sh/shquote.c
@@ -311,3 +311,17 @@ sh_contains_shell_metas (string)
return (0);
}
+
+int
+sh_contains_quotes (string)
+ char *string;
+{
+ char *s;
+
+ for (s = string; s && *s; s++)
+ {
+ if (*s == '\'' || *s == '"' || *s == '\\')
+ return 1;
+ }
+ return 0;
+}
diff --git a/patchlevel.h b/patchlevel.h
index 2860f13..f95b837 100644
--- a/patchlevel.h
+++ b/patchlevel.h
@@ -25,6 +25,6 @@
regexp `^#define[ ]*PATCHLEVEL', since that's what support/mkversion.sh
looks for to find the patch level (for the sccs version string). */
-#define PATCHLEVEL 9
+#define PATCHLEVEL 10
#endif /* _PATCHLEVEL_H_ */
diff --git a/pcomplete.c b/pcomplete.c
index a3327ed..70cbc98 100644
--- a/pcomplete.c
+++ b/pcomplete.c
@@ -183,6 +183,7 @@ ITEMLIST it_variables = { LIST_DYNAMIC, it_init_variables, (STRINGLIST *)0 };
COMPSPEC *pcomp_curcs;
const char *pcomp_curcmd;
+const char *pcomp_curtxt;
#ifdef DEBUG
/* Debugging code */
@@ -753,6 +754,32 @@ pcomp_filename_completion_function (text, state)
quoted strings. */
dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
}
+ /* Intended to solve a mismatched assumption by bash-completion. If
+ the text to be completed is empty, but bash-completion turns it into
+ a quoted string ('') assuming that this code will dequote it before
+ calling readline, do the dequoting. */
+ else if (iscompgen && iscompleting &&
+ pcomp_curtxt && *pcomp_curtxt == 0 &&
+ text && (*text == '\'' || *text == '"') && text[1] == text[0] && text[2] == 0 &&
+ rl_filename_dequoting_function)
+ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
+ /* Another mismatched assumption by bash-completion. If compgen is being
+ run as part of bash-completion, and the argument to compgen is not
+ the same as the word originally passed to the programmable completion
+ code, dequote the argument if it has quote characters. It's an
+ attempt to detect when bash-completion is quoting its filename
+ argument before calling compgen. */
+ /* We could check whether gen_shell_function_matches is in the call
+ stack by checking whether the gen-shell-function-matches tag is in
+ the unwind-protect stack, but there's no function to do that yet.
+ We could simply check whether we're executing in a function by
+ checking variable_context, and may end up doing that. */
+ else if (iscompgen && iscompleting && rl_filename_dequoting_function &&
+ pcomp_curtxt && text &&
+ STREQ (pcomp_curtxt, text) == 0 &&
+ variable_context &&
+ sh_contains_quotes (text)) /* guess */
+ dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character);
else
dfn = savestring (text);
}
@@ -1522,7 +1549,7 @@ gen_progcomp_completions (ocmd, cmd, word, start, end, foundp, retryp, lastcs)
COMPSPEC **lastcs;
{
COMPSPEC *cs, *oldcs;
- const char *oldcmd;
+ const char *oldcmd, *oldtxt;
STRINGLIST *ret;
cs = progcomp_search (ocmd);
@@ -1545,14 +1572,17 @@ gen_progcomp_completions (ocmd, cmd, word, start, end, foundp, retryp, lastcs)
oldcs = pcomp_curcs;
oldcmd = pcomp_curcmd;
+ oldtxt = pcomp_curtxt;
pcomp_curcs = cs;
pcomp_curcmd = cmd;
+ pcomp_curtxt = word;
ret = gen_compspec_completions (cs, cmd, word, start, end, foundp);
pcomp_curcs = oldcs;
pcomp_curcmd = oldcmd;
+ pcomp_curtxt = oldtxt;
/* We need to conditionally handle setting *retryp here */
if (retryp)