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_unmerged = 0;
|
||||||
static int show_modified = 0;
|
static int show_modified = 0;
|
||||||
static int show_killed = 0;
|
static int show_killed = 0;
|
||||||
|
static int show_other_directories = 0;
|
||||||
static int line_terminator = '\n';
|
static int line_terminator = '\n';
|
||||||
|
|
||||||
static int prefix_len = 0, prefix_offset = 0;
|
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;
|
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
|
* Read a directory tree. We currently ignore anything but
|
||||||
* directories, regular files and symlinks. That's because git
|
* 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;
|
continue;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case DT_DIR:
|
case DT_DIR:
|
||||||
|
if (show_other_directories) {
|
||||||
|
if (!dir_exists(fullname, baselen + len))
|
||||||
|
break;
|
||||||
|
}
|
||||||
memcpy(fullname + baselen + len, "/", 2);
|
memcpy(fullname + baselen + len, "/", 2);
|
||||||
read_directory(fullname, fullname,
|
read_directory(fullname, fullname,
|
||||||
baselen + len + 1);
|
baselen + len + 1);
|
||||||
@ -622,6 +640,10 @@ int main(int argc, const char **argv)
|
|||||||
show_killed = 1;
|
show_killed = 1;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(arg, "--directory")) {
|
||||||
|
show_other_directories = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!strcmp(arg, "-u") || !strcmp(arg, "--unmerged")) {
|
if (!strcmp(arg, "-u") || !strcmp(arg, "--unmerged")) {
|
||||||
/* There's no point in showing unmerged unless
|
/* There's no point in showing unmerged unless
|
||||||
* you also show the stage information.
|
* you also show the stage information.
|
||||||
|
Loading…
Reference in New Issue
Block a user