diff options
author | Linus Torvalds <torvalds@osdl.org> | 2006-01-04 13:31:25 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-01-07 21:34:02 -0800 |
commit | 9518eb262980d5048ef71e4450ef2cf78d7df6b5 (patch) | |
tree | f4dcffed9509398142d5f0766acd67ee61a099e8 /ls-files.c | |
parent | 03febf99bc77001af6709ee1c17d3dc5e71e8990 (diff) | |
download | git-9518eb262980d5048ef71e4450ef2cf78d7df6b5.tar.gz |
ls-files -o: optionally skip showing the contents in "untracked" directories
Darrin Thompson notes that git-ls-files -o reports all the unknown
files it finds in a work area. Subversion and probably other systems
"simply ignore all the files and directories inside an unknown
directory and just note the directory as unknown."
With --directory option, ls-files --others shows untracked directories
without descending into them.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'ls-files.c')
-rw-r--r-- | ls-files.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/ls-files.c b/ls-files.c index cd87430127..841c98a710 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 *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) + 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 *path, const char *base, int baselen) 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. |