X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=ls-files.c;h=db2288aeee61bf64f30fdcc4b11e91c0cd3038a0;hb=10bea152a34b2bf1194ede5e0c9e5595ab2100f3;hp=f47114a168f3a7479cbe147f953e5f56af3d2dfc;hpb=500b97e4bb184c954a52550843e6314ecf97a208;p=git.git diff --git a/ls-files.c b/ls-files.c index f47114a1..db2288ae 100644 --- a/ls-files.c +++ b/ls-files.c @@ -9,6 +9,7 @@ #include #include "cache.h" +#include "quote.h" static int show_deleted = 0; static int show_cached = 0; @@ -96,7 +97,7 @@ static int add_excludes_from_file_1(const char *fname, for (i = 0; i < size; i++) { if (buf[i] == '\n') { if (entry != buf + i && entry[0] != '#') { - buf[i] = 0; + buf[i - (i && buf[i-1] == '\r')] = 0; add_exclude(entry, base, baselen, which); } entry = buf + i + 1; @@ -342,7 +343,32 @@ static void show_dir_entry(const char *tag, struct nond_on_fs *ent) if (pathspec && !match(pathspec, ent->name, len)) return; - printf("%s%s%c", tag, ent->name + offset, line_terminator); + fputs(tag, stdout); + write_name_quoted("", ent->name + offset, line_terminator, stdout); + putchar(line_terminator); +} + +static void show_other_files(void) +{ + int i; + for (i = 0; i < nr_dir; i++) { + /* We should not have a matching entry, but we + * may have an unmerged entry for this path. + */ + struct nond_on_fs *ent = dir[i]; + int pos = cache_name_pos(ent->name, ent->len); + struct cache_entry *ce; + if (0 <= pos) + die("bug in show-other-files"); + pos = -pos - 1; + if (pos < active_nr) { + ce = active_cache[pos]; + if (ce_namelen(ce) == ent->len && + !memcmp(ce->name, ent->name, ent->len)) + continue; /* Yup, this one exists unmerged */ + } + show_dir_entry(tag_other, ent); + } } static void show_killed_files(void) @@ -405,15 +431,20 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce) if (pathspec && !match(pathspec, ce->name, len)) return; - if (!show_stage) - printf("%s%s%c", tag, ce->name + offset, line_terminator); - else - printf("%s%06o %s %d\t%s%c", + if (!show_stage) { + fputs(tag, stdout); + write_name_quoted("", ce->name + offset, line_terminator, stdout); + putchar(line_terminator); + } + else { + printf("%s%06o %s %d\t", tag, ntohl(ce->ce_mode), sha1_to_hex(ce->sha1), - ce_stage(ce), - ce->name + offset, line_terminator); + ce_stage(ce)); + write_name_quoted("", ce->name + offset, line_terminator, stdout); + putchar(line_terminator); + } } static void show_files(void) @@ -430,8 +461,7 @@ static void show_files(void) read_directory(path, base, baselen); qsort(dir, nr_dir, sizeof(struct nond_on_fs *), cmp_name); if (show_others) - for (i = 0; i < nr_dir; i++) - show_dir_entry(tag_other, dir[i]); + show_other_files(); if (show_killed) show_killed_files(); } @@ -540,6 +570,7 @@ 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];