Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/freebsd/poudriere.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Drewery <bryan@shatow.net>2022-05-28 19:35:04 +0300
committerBryan Drewery <bryan@shatow.net>2022-06-06 20:27:45 +0300
commit4c1cd0ec7be455bafcef176361cf4b2579b1d261 (patch)
treeba6559eac7338a45bbde1aefdfd6a9ef1b4d833b
parent73b3a5169b640460c9bb8cbd295764e9e74838ab (diff)
Update bin/sh from FreeBSD 68700941c7ad58d6fa8eda82f3f370d87670fa6a
-rw-r--r--external/sh/histedit.c35
-rw-r--r--external/sh/jobs.c2
2 files changed, 35 insertions, 2 deletions
diff --git a/external/sh/histedit.c b/external/sh/histedit.c
index 3c113333..453260a2 100644
--- a/external/sh/histedit.c
+++ b/external/sh/histedit.c
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
#include <fcntl.h>
#include <limits.h>
#include <paths.h>
+#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -73,12 +74,14 @@ EditLine *el; /* editline cookie */
int displayhist;
static int savehist;
static FILE *el_in, *el_out;
+static bool in_command_completion;
static char *fc_replace(const char *, char *, char *);
static int not_fcnumber(const char *);
static int str_to_event(const char *, int);
static int comparator(const void *, const void *, void *);
static char **sh_matches(const char *, int, int);
+static const char *append_char_function(const char *);
static unsigned char sh_complete(EditLine *, int);
static const char *
@@ -602,8 +605,10 @@ static char
size_t i = 0, size = 16, uniq;
size_t curpos = end - start, lcstring = -1;
+ in_command_completion = false;
if (start > 0 || memchr("/.~", text[0], 3) != NULL)
return (NULL);
+ in_command_completion = true;
if ((free_path = path = strdup(pathval())) == NULL)
goto out;
if ((matches = malloc(size * sizeof(matches[0]))) == NULL)
@@ -697,6 +702,32 @@ out:
}
/*
+ * If we don't specify this function as app_func in the call to fn_complete2,
+ * libedit will use the default one, which adds a " " to plain files and
+ * a "/" to directories regardless of whether it's a command name or a plain
+ * path (relative or absolute). We never want to add "/" to commands.
+ *
+ * For example, after I did "mkdir rmdir", "rmdi" would be autocompleted to
+ * "rmdir/" instead of "rmdir ".
+ */
+static const char *
+append_char_function(const char *name)
+{
+ struct stat stbuf;
+ char *expname = name[0] == '~' ? fn_tilde_expand(name) : NULL;
+ const char *rs;
+
+ if (!in_command_completion &&
+ stat(expname ? expname : name, &stbuf) == 0 &&
+ S_ISDIR(stbuf.st_mode))
+ rs = "/";
+ else
+ rs = " ";
+ free(expname);
+ return (rs);
+}
+
+/*
* This is passed to el_set(el, EL_ADDFN, ...) so that it's possible to
* bind a key (tab by default) to execute the function.
*/
@@ -704,8 +735,8 @@ unsigned char
sh_complete(EditLine *sel, int ch __unused)
{
return (unsigned char)fn_complete2(sel, NULL, sh_matches,
- L" \t\n\"\\'`@$><=;|&{(", NULL, NULL, (size_t)100,
- NULL, &((int) {0}), NULL, NULL, FN_QUOTE_MATCH);
+ L" \t\n\"\\'`@$><=;|&{(", NULL, append_char_function,
+ (size_t)100, NULL, &((int) {0}), NULL, NULL, FN_QUOTE_MATCH);
}
#else
diff --git a/external/sh/jobs.c b/external/sh/jobs.c
index c0ba7d75..ff36bfa6 100644
--- a/external/sh/jobs.c
+++ b/external/sh/jobs.c
@@ -587,6 +587,8 @@ waitcmdloop(struct job *job)
return retval;
}
} else {
+ if (njobs == 0)
+ return 0;
for (jp = jobtab ; jp < jobtab + njobs; jp++)
if (jp->used && jp->state == JOBDONE) {
if (! iflag || ! jp->changed)