*** ../bash-4.3/externs.h 2014-01-02 14:58:20.000000000 -0500 --- externs.h 2014-03-13 14:42:57.000000000 -0400 *************** *** 325,328 **** --- 325,329 ---- 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 */ *** ../bash-4.3/lib/sh/shquote.c 2013-03-31 21:53:32.000000000 -0400 --- lib/sh/shquote.c 2014-03-13 14:42:57.000000000 -0400 *************** *** 312,313 **** --- 312,327 ---- 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; + } *** ../bash-4.3/pcomplete.c 2013-08-26 15:23:45.000000000 -0400 --- pcomplete.c 2014-03-17 09:10:40.000000000 -0400 *************** *** 184,187 **** --- 184,188 ---- COMPSPEC *pcomp_curcs; const char *pcomp_curcmd; + const char *pcomp_curtxt; #ifdef DEBUG *************** *** 754,757 **** --- 755,783 ---- 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 && + sh_contains_quotes (text)) /* guess */ + dfn = (*rl_filename_dequoting_function) ((char *)text, rl_completion_quote_character); else dfn = savestring (text); *************** *** 1523,1527 **** { COMPSPEC *cs, *oldcs; ! const char *oldcmd; STRINGLIST *ret; --- 1549,1553 ---- { COMPSPEC *cs, *oldcs; ! const char *oldcmd, *oldtxt; STRINGLIST *ret; *************** *** 1546,1552 **** --- 1572,1580 ---- 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); *************** *** 1554,1557 **** --- 1582,1586 ---- pcomp_curcs = oldcs; pcomp_curcmd = oldcmd; + pcomp_curtxt = oldtxt; /* We need to conditionally handle setting *retryp here */