Merge branch 'master' into next
* master: Optionally do not list empty directories in git-ls-files --others Document git-rebase behavior on conflicts. Fix error handling for nonexistent names
This commit is contained in:
33
ls-files.c
33
ls-files.c
@ -21,6 +21,7 @@ static int show_unmerged = 0;
|
||||
static int show_modified = 0;
|
||||
static int show_killed = 0;
|
||||
static int show_other_directories = 0;
|
||||
static int hide_empty_directories = 0;
|
||||
static int show_valid_bit = 0;
|
||||
static int line_terminator = '\n';
|
||||
|
||||
@ -259,11 +260,12 @@ static int dir_exists(const char *dirname, int len)
|
||||
* Also, we ignore the name ".git" (even if it is not a directory).
|
||||
* That likely will not change.
|
||||
*/
|
||||
static void read_directory(const char *path, const char *base, int baselen)
|
||||
static int read_directory(const char *path, const char *base, int baselen)
|
||||
{
|
||||
DIR *dir = opendir(path);
|
||||
DIR *fdir = opendir(path);
|
||||
int contents = 0;
|
||||
|
||||
if (dir) {
|
||||
if (fdir) {
|
||||
int exclude_stk;
|
||||
struct dirent *de;
|
||||
char fullname[MAXPATHLEN + 1];
|
||||
@ -271,7 +273,7 @@ static void read_directory(const char *path, const char *base, int baselen)
|
||||
|
||||
exclude_stk = push_exclude_per_directory(base, baselen);
|
||||
|
||||
while ((de = readdir(dir)) != NULL) {
|
||||
while ((de = readdir(fdir)) != NULL) {
|
||||
int len;
|
||||
|
||||
if ((de->d_name[0] == '.') &&
|
||||
@ -289,6 +291,7 @@ static void read_directory(const char *path, const char *base, int baselen)
|
||||
|
||||
switch (DTYPE(de)) {
|
||||
struct stat st;
|
||||
int subdir, rewind_base;
|
||||
default:
|
||||
continue;
|
||||
case DT_UNKNOWN:
|
||||
@ -302,22 +305,32 @@ static void read_directory(const char *path, const char *base, int baselen)
|
||||
case DT_DIR:
|
||||
memcpy(fullname + baselen + len, "/", 2);
|
||||
len++;
|
||||
rewind_base = nr_dir;
|
||||
subdir = read_directory(fullname, fullname,
|
||||
baselen + len);
|
||||
if (show_other_directories &&
|
||||
!dir_exists(fullname, baselen + len))
|
||||
(subdir || !hide_empty_directories) &&
|
||||
!dir_exists(fullname, baselen + len)) {
|
||||
// Rewind the read subdirectory
|
||||
while (nr_dir > rewind_base)
|
||||
free(dir[--nr_dir]);
|
||||
break;
|
||||
read_directory(fullname, fullname,
|
||||
baselen + len);
|
||||
}
|
||||
contents += subdir;
|
||||
continue;
|
||||
case DT_REG:
|
||||
case DT_LNK:
|
||||
break;
|
||||
}
|
||||
add_name(fullname, baselen + len);
|
||||
contents++;
|
||||
}
|
||||
closedir(dir);
|
||||
closedir(fdir);
|
||||
|
||||
pop_exclude_per_directory(exclude_stk);
|
||||
}
|
||||
|
||||
return contents;
|
||||
}
|
||||
|
||||
static int cmp_name(const void *p1, const void *p2)
|
||||
@ -699,6 +712,10 @@ int main(int argc, const char **argv)
|
||||
show_other_directories = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "--no-empty-directory")) {
|
||||
hide_empty_directories = 1;
|
||||
continue;
|
||||
}
|
||||
if (!strcmp(arg, "-u") || !strcmp(arg, "--unmerged")) {
|
||||
/* There's no point in showing unmerged unless
|
||||
* you also show the stage information.
|
||||
|
Reference in New Issue
Block a user