The first option to be introduced is --sparse, which puts ls-files in "sparse mode". In this mode, cached entries are divided into - checkout entries: shown by --cached (new behavior with --sparse) - no-checkout entries: show by --no-checkout (new option) - orphaned entries: shown by --orphaned (new option) Orphaned entries are themselves no-checkout ones but for some reasons still be present in working directory. While at it, fix "--deleted" running out of checkout area. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/git-ls-files.txt | 24 +++++++++++++++++++++- builtin-ls-files.c | 41 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 59 insertions(+), 6 deletions(-) diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index 9f85d60..1de68e2 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -10,8 +10,9 @@ SYNOPSIS -------- [verse] 'git ls-files' [-z] [-t] [-v] - (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])\* + (--[cached|deleted|others|ignored|stage|unmerged|killed|modified|orphaned|no-checkout])\* (-[c|d|o|i|s|u|k|m])\* + [--sparse] [-x <pattern>|--exclude=<pattern>] [-X <file>|--exclude-from=<file>] [--exclude-per-directory=<file>] @@ -32,7 +33,9 @@ OPTIONS ------- -c:: --cached:: - Show cached files in the output (default) + Show cached files in the output (default). When used with --sparse, + show only cached files that are marked "checkout", no-checkout + entries will be excluded. -d:: --deleted:: @@ -72,6 +75,21 @@ OPTIONS to file/directory conflicts for checkout-index to succeed. +--no-checkout:: + Show no-checkout entries. This option implies --sparse. + +--orphaned:: + Show orphaned entries. Orphaned entries are no-checkout + entries that are present in working directory. This option + implies --sparse. + +--sparse:: + When --sparse is passed, cached files will be divided into two + parts: checkout entries and no-checkout entries. + --cached will only show checkout entries. + No-checkout entries can be shown using --orphaned or + --no-checkout (or both). + -z:: \0 line termination on output. @@ -107,6 +125,8 @@ OPTIONS Identify the file status with the following tags (followed by a space) at the start of each line: H:: cached + -:: no-checkout entries + O:: orphaned entries M:: unmerged R:: removed/deleted C:: modified/changed diff --git a/builtin-ls-files.c b/builtin-ls-files.c index 068f424..873de15 100644 --- a/builtin-ls-files.c +++ b/builtin-ls-files.c @@ -20,6 +20,9 @@ static int show_unmerged; static int show_modified; static int show_killed; static int show_valid_bit; +static int show_orphaned; +static int show_no_checkout; +static int sparse_checkout; static int line_terminator = '\n'; static int prefix_len; @@ -35,6 +38,8 @@ static const char *tag_removed = ""; static const char *tag_other = ""; static const char *tag_killed = ""; static const char *tag_modified = ""; +static const char *tag_orphaned = ""; +static const char *tag_no_checkout = ""; /* @@ -235,7 +240,7 @@ static void show_files(struct dir_struct *dir, const char *prefix) if (show_killed) show_killed_files(dir); } - if (show_cached | show_stage) { + if (show_cached | show_stage | show_orphaned | show_no_checkout) { for (i = 0; i < active_nr; i++) { struct cache_entry *ce = active_cache[i]; int dtype = ce_to_dtype(ce); @@ -245,6 +250,16 @@ static void show_files(struct dir_struct *dir, const char *prefix) continue; if (ce->ce_flags & CE_UPDATE) continue; + if (sparse_checkout && ce_no_checkout(ce)) { + struct stat st; + if (show_no_checkout) + show_ce_entry(tag_no_checkout, ce); + if (show_orphaned && !lstat(ce->name, &st)) + show_ce_entry(tag_orphaned, ce); + continue; + } + if (!(show_cached | show_stage)) + continue; show_ce_entry(ce_stage(ce) ? tag_unmerged : tag_cached, ce); } } @@ -257,7 +272,7 @@ static void show_files(struct dir_struct *dir, const char *prefix) if (excluded(dir, ce->name, &dtype) != dir->show_ignored) continue; err = lstat(ce->name, &st); - if (show_deleted && err) + if (show_deleted && err && ce_checkout(ce)) show_ce_entry(tag_removed, ce); if (show_modified && ce_modified(ce, &st, 0)) show_ce_entry(tag_modified, ce); @@ -423,7 +438,8 @@ int report_path_error(const char *ps_matched, const char **pathspec, int prefix_ } static const char ls_files_usage[] = - "git ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* " + "git ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified|orphaned|no-checkout])* " + "[ --sparse ] " "[ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] " "[ --exclude-per-directory=<filename> ] [--exclude-standard] " "[--full-name] [--abbrev] [--] [<file>]*"; @@ -457,6 +473,8 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) tag_modified = "C "; tag_other = "? "; tag_killed = "K "; + tag_orphaned = "O "; + tag_no_checkout = "- "; if (arg[1] == 'v') show_valid_bit = 1; continue; @@ -465,6 +483,21 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) show_cached = 1; continue; } + if (!strcmp(arg, "--sparse")) { + sparse_checkout = 1; + continue; + } + if (!strcmp(arg, "--orphaned")) { + show_orphaned = 1; + sparse_checkout = 1; + require_work_tree = 1; + continue; + } + if (!strcmp(arg, "--no-checkout")) { + show_no_checkout = 1; + sparse_checkout = 1; + continue; + } if (!strcmp(arg, "-d") || !strcmp(arg, "--deleted")) { show_deleted = 1; continue; @@ -593,7 +626,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) /* With no flags, we default to showing the cached files */ if (!(show_stage | show_deleted | show_others | show_unmerged | - show_killed | show_modified)) + show_killed | show_modified | show_orphaned | show_no_checkout)) show_cached = 1; read_cache(); -- 1.6.0.2.488.gf604a -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html