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>
This commit is contained in:
parent
03febf99bc
commit
9518eb2629
22
ls-files.c
22
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.
|
||||
|
Loading…
Reference in New Issue
Block a user