X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=ls-files.c;h=6af3b091b049d8ded1999405b4da7191f2b36a4c;hb=36383a3df37116f6022b5a0f7331fb19337c4730;hp=74ec8c0aeeb52a3bed8a0ac9da8fb9ba5ef66187;hpb=8f1d2e6f49ee51ac062ab38337a6a70dd1998def;p=git.git diff --git a/ls-files.c b/ls-files.c index 74ec8c0a..6af3b091 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,17 @@ static void add_name(const char *pathname, int len) 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) /* can't */ + return 0; + return !strncmp(active_cache[pos]->name, dirname, len); +} + /* * Read a directory tree. We currently ignore anything but * directories, regular files and symlinks. That's because git @@ -281,8 +293,12 @@ static void read_directory(const char *path, const char *base, int baselen) /* fallthrough */ case DT_DIR: memcpy(fullname + baselen + len, "/", 2); + len++; + if (show_other_directories && + !dir_exists(fullname, baselen + len)) + break; read_directory(fullname, fullname, - baselen + len + 1); + baselen + len); continue; case DT_REG: case DT_LNK: @@ -622,6 +638,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.