Narrow checkout mode introduces an interesting case: some files are not to be checked out (marked CE_NO_CHECKOUT in index) but still exist in working directory. Those files will be ignored by Git unless explicitly specified. In Clearcase, these files are called "eclipsed". I would call them "overlay" for now. Any better term is welcome. The same situation happens for "assume unchanged" bit, but I would expect narrow checkout to be more user-friendly and should notify users these cases so users will not be confused. On this first step, users may check by themselves with "git ls-files --overlay", further steps may make the information visible from "git status". Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- Documentation/git-ls-files.txt | 4 ++++ builtin-ls-files.c | 16 +++++++++++++--- t/t2104-update-index-narrow.sh | 4 ++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index 4f5a37e..9e749ef 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -56,6 +56,9 @@ OPTIONS --stage:: Show staged contents' object name, mode bits and stage number in the output. +--overlay:: + Show files that are marked no-checkout but exist in working directory. + --directory:: If a whole directory is classified as "other", show just its name (with a trailing slash) and not its whole contents. @@ -122,6 +125,7 @@ OPTIONS R:: removed/deleted C:: modified/changed K:: to be killed + !:: overlay files ?:: other -v:: diff --git a/builtin-ls-files.c b/builtin-ls-files.c index f48a157..6e55207 100644 --- a/builtin-ls-files.c +++ b/builtin-ls-files.c @@ -20,6 +20,7 @@ static int show_others; static int show_stage; static int show_unmerged; static int show_modified; +static int show_overlay; static int show_killed; static int show_valid_bit; static int narrow_checkout; @@ -39,6 +40,7 @@ static const char *tag_removed = ""; static const char *tag_other = ""; static const char *tag_killed = ""; static const char *tag_modified = ""; +static const char *tag_overlay = ""; /* @@ -256,7 +258,7 @@ static void show_files(struct dir_struct *dir, const char *prefix) show_ce_entry(ce_stage(ce) ? tag_unmerged : tag_cached, ce); } } - if (show_deleted | show_modified) { + if (show_deleted | show_modified | show_overlay) { for (i = 0; i < active_nr; i++) { struct cache_entry *ce = active_cache[i]; struct stat st; @@ -265,6 +267,8 @@ 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_overlay && ce_no_checkout(ce) && !err) + show_ce_entry(tag_overlay, ce); if (show_deleted && err && ce_checkout(ce)) show_ce_entry(tag_removed, ce); if (show_modified && ce_modified(ce, &st, 0)) @@ -431,7 +435,7 @@ 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|overlay])* " "[ --narrow-checkout ] [--narrow-match=<narrow_spec>] " "[ --ignored ] [--exclude=<pattern>] [--exclude-from=<file>] " "[ --exclude-per-directory=<filename> ] [--exclude-standard] " @@ -466,6 +470,7 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) tag_modified = "C "; tag_other = "? "; tag_killed = "K "; + tag_overlay = "! "; if (arg[1] == 'v') show_valid_bit = 1; continue; @@ -491,6 +496,11 @@ int cmd_ls_files(int argc, const char **argv, const char *prefix) require_work_tree = 1; continue; } + if (!strcmp(arg, "--overlay")) { + show_overlay = 1; + require_work_tree = 1; + continue; + } if (!strcmp(arg, "-o") || !strcmp(arg, "--others")) { show_others = 1; require_work_tree = 1; @@ -610,7 +620,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_overlay)) show_cached = 1; if (narrow_checkout && !show_cached && !show_stage) diff --git a/t/t2104-update-index-narrow.sh b/t/t2104-update-index-narrow.sh index 1a3acdd..79da418 100755 --- a/t/t2104-update-index-narrow.sh +++ b/t/t2104-update-index-narrow.sh @@ -31,6 +31,10 @@ test_expect_success 'ls-files --deleted ignores no-checkout entries' ' touch 1 ' +test_expect_success 'there are overlay entries' ' + test "$(git ls-files --overlay|grep 1|wc -l)" = 2 +' + test_expect_success 'update-index --checkout' ' git update-index --checkout 1 sub/1 && test "$(git ls-files)" = "$(git ls-files --narrow-checkout)"' -- 1.6.0.96.g2fad1.dirty -- 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