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;
}
else {
/* match with FNM_PATHNAME:
- * exclude has base (baselen long) inplicitly
+ * exclude has base (baselen long) implicitly
* in front of it.
*/
int baselen = x->baselen;
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
/* 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:
return;
fputs(tag, stdout);
- write_name_quoted("", ent->name + offset, line_terminator, stdout);
+ write_name_quoted("", 0, ent->name + offset, line_terminator, stdout);
putchar(line_terminator);
}
if (!show_stage) {
fputs(tag, stdout);
- write_name_quoted("", ce->name + offset, line_terminator, stdout);
+ write_name_quoted("", 0, ce->name + offset,
+ line_terminator, stdout);
putchar(line_terminator);
}
else {
ntohl(ce->ce_mode),
sha1_to_hex(ce->sha1),
ce_stage(ce));
- write_name_quoted("", ce->name + offset, line_terminator, stdout);
+ write_name_quoted("", 0, ce->name + offset,
+ line_terminator, stdout);
putchar(line_terminator);
}
}
static const char ls_files_usage[] =
"git-ls-files [-z] [-t] (--[cached|deleted|others|stage|unmerged|killed|modified])* "
"[ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] "
- "[ --exclude-per-directory=<filename> ] [--] [<file>]*";
+ "[ --exclude-per-directory=<filename> ] [--full-name] [--] [<file>]*";
int main(int argc, const char **argv)
{
prefix = setup_git_directory();
if (prefix)
prefix_offset = strlen(prefix);
+ git_config(git_default_config);
for (i = 1; i < argc; i++) {
const char *arg = argv[i];
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.