Anonymous committed f5d600e

Avoid chdir() in list_commands_in_dir()

The function list_commands_in_dir() tried to be lazy and just chdir()
to the directory which entries it listed, so that the check if the
file is executable could be done on dir->d_name.

However, there is no good reason to jump around wildly just to find
all Git commands.

Instead, have a strbuf and construct the full path dynamically.

Signed-off-by: Johannes Schindelin <>
Signed-off-by: Junio C Hamano <>

  • Participants
  • Parent commits b6f637d

Comments (0)

Files changed (1)

 	int prefix_len = strlen(prefix);
 	DIR *dir = opendir(path);
 	struct dirent *de;
+	struct strbuf buf = STRBUF_INIT;
+	int len;
-	if (!dir || chdir(path))
+	if (!dir)
 		return 0;
+	strbuf_addf(&buf, "%s/", path);
+	len = buf.len;
 	while ((de = readdir(dir)) != NULL) {
 		int entlen;
 		if (prefixcmp(de->d_name, prefix))
-		if (!is_executable(de->d_name))
+		strbuf_setlen(&buf, len);
+		strbuf_addstr(&buf, de->d_name);
+		if (!is_executable(buf.buf))
 		entlen = strlen(de->d_name) - prefix_len;
 		add_cmdname(cmds, de->d_name + prefix_len, entlen);
+	strbuf_release(&buf);
 	return longest;