Re: git-ls-files -o no recurse?
From: Darrin Thompson <hidden>
Date: 2016-06-15 22:42:16
Subsystem:
the rest · Maintainer:
Linus Torvalds
Here's a rejiggered version of the original Linus patch. The names have been changed a little. Enjoy. It prevents git from recursing into "other" directories when used with the -o option. --- ls-files.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) applies-to: 4e7e791ecc24975530de1f2855cf5f17f112140b 741ec8ad5b7f3717bb462c2becfd00974da7ec16
diff --git a/ls-files.c b/ls-files.c
index 5e9ac71..cba8ca1 100644
--- a/ls-files.c
+++ b/ls-files.c@@ -19,6 +19,7 @@ static int show_stage = 0; static int show_unmerged = 0; static int show_modified = 0; static int show_killed = 0; +static int show_other_directories = 0; static int line_terminator = '\n'; static int prefix_len = 0, prefix_offset = 0;
@@ -233,6 +234,19 @@ static void add_name(const char *pathnam dir[nr_dir++] = ent; } +static int dir_exists(const char *dirname, int len) +{ + int pos = cache_name_pos(dirname, len); + if (pos >= 0) + return 1; + pos = -pos-1; + if (pos >= active_nr) + return 0; + if (strncmp(active_cache[pos]->name, dirname, len)) + return 0; + return active_cache[pos]->name[len] == '/'; +} + /* * Read a directory tree. We currently ignore anything but * directories, regular files and symlinks. That's because git
@@ -280,6 +294,10 @@ static void read_directory(const char *p continue; /* fallthrough */ case DT_DIR: + if (show_other_directories) { + if (!dir_exists(fullname, baselen + len)) + break; + } memcpy(fullname + baselen + len, "/", 2); read_directory(fullname, fullname, baselen + len + 1);
@@ -622,6 +640,10 @@ int main(int argc, const char **argv) show_killed = 1; continue; } + if (!strcmp(arg, "--directory")) { + show_other_directories = 1; + continue; + } if (!strcmp(arg, "-u") || !strcmp(arg, "--unmerged")) { /* There's no point in showing unmerged unless * you also show the stage information.
--- 0.99.9i