From: ZheNing Hu <adlternative@xxxxxxxxx> This commit standardizes the code format. For git ls-file --dedup option added relevant descriptions in Documentation/git-ls-files.txt and wrote t/t3012-ls-files-dedup.sh test script to prove the correctness of--dedup option. this patch fixed: https://github.com/gitgitgadget/git/issues/198 Thanks. Signed-off-by: ZheNing Hu <adlternative@xxxxxxxxx> --- Documentation/git-ls-files.txt | 4 +++ builtin/ls-files.c | 20 ++++++----- t/t3012-ls-files-dedup.sh | 63 ++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 9 deletions(-) create mode 100755 t/t3012-ls-files-dedup.sh diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index cbcf5263dd0..41a9c5a8b27 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -13,6 +13,7 @@ SYNOPSIS (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])* (-[c|d|o|i|s|u|k|m])* [--eol] + [--dedup] [-x <pattern>|--exclude=<pattern>] [-X <file>|--exclude-from=<file>] [--exclude-per-directory=<file>] @@ -81,6 +82,9 @@ OPTIONS \0 line termination on output and do not quote filenames. See OUTPUT below for more information. +--dedup:: + Suppress duplicates entries when conflicts happen or + specify -d -m at the same time. -x <pattern>:: --exclude=<pattern>:: Skip untracked files matching pattern. diff --git a/builtin/ls-files.c b/builtin/ls-files.c index 66a7e251a46..bc4eded19ab 100644 --- a/builtin/ls-files.c +++ b/builtin/ls-files.c @@ -302,7 +302,7 @@ static void show_files(struct repository *repo, struct dir_struct *dir) { int i; struct strbuf fullname = STRBUF_INIT; - const struct cache_entry *last_stage=NULL; + const struct cache_entry *last_stage = NULL; /* For cached/deleted files we don't need to even do the readdir */ if (show_others || show_killed) { @@ -317,7 +317,8 @@ static void show_files(struct repository *repo, struct dir_struct *dir) if (show_cached || show_stage) { for (i = 0; i < repo->index->cache_nr; i++) { const struct cache_entry *ce = repo->index->cache[i]; - if(show_cached && delete_dup){ + + if (show_cached && delete_dup) { switch (ce_stage(ce)) { case 0: default: @@ -328,7 +329,7 @@ static void show_files(struct repository *repo, struct dir_struct *dir) if (last_stage && !strcmp(last_stage->name, ce->name)) continue; - last_stage=ce; + last_stage = ce; } } construct_fullname(&fullname, repo, ce); @@ -351,7 +352,8 @@ static void show_files(struct repository *repo, struct dir_struct *dir) const struct cache_entry *ce = repo->index->cache[i]; struct stat st; int err; - if(delete_dup){ + + if (delete_dup) { switch (ce_stage(ce)) { case 0: default: @@ -362,7 +364,7 @@ static void show_files(struct repository *repo, struct dir_struct *dir) if (last_stage && !strcmp(last_stage->name, ce->name)) continue; - last_stage=ce; + last_stage = ce; } } construct_fullname(&fullname, repo, ce); @@ -375,10 +377,10 @@ static void show_files(struct repository *repo, struct dir_struct *dir) if (ce_skip_worktree(ce)) continue; err = lstat(fullname.buf, &st); - if(delete_dup && show_deleted && show_modified && err) + if (delete_dup && show_deleted && show_modified && err) show_ce(repo, dir, ce, fullname.buf, tag_removed); - else{ - if (show_deleted && err)/* you can't find it,so it's actually removed at all! */ + else { + if (show_deleted && err) show_ce(repo, dir, ce, fullname.buf, tag_removed); if (show_modified && ie_modified(repo->index, ce, &st, 0)) show_ce(repo, dir, ce, fullname.buf, tag_modified); @@ -610,7 +612,7 @@ int cmd_ls_files(int argc, const char **argv, const char *cmd_prefix) N_("pretend that paths removed since <tree-ish> are still present")), OPT__ABBREV(&abbrev), OPT_BOOL(0, "debug", &debug_mode, N_("show debugging data")), - OPT_BOOL(0, "dedup", &delete_dup, N_("delete duplicate entry in index")), + OPT_BOOL(0, "dedup", &delete_dup, N_("suppress duplicate entries")), OPT_END() }; diff --git a/t/t3012-ls-files-dedup.sh b/t/t3012-ls-files-dedup.sh new file mode 100755 index 00000000000..00c7f65cfc1 --- /dev/null +++ b/t/t3012-ls-files-dedup.sh @@ -0,0 +1,63 @@ +#!/bin/sh + +test_description='git ls-files --dedup test. + +This test prepares the following in the cache: + + a.txt - a file(base) + a.txt - a file(master) + a.txt - a file(dev) + b.txt - a file + delete.txt - a file + expect1 - a file + expect2 - a file + +' + +. ./test-lib.sh + +test_expect_success 'master branch setup and write expect1 expect2 and commit' ' + touch a.txt && + touch b.txt && + touch delete.txt && + cat <<-EOF >expect1 && + M a.txt + H b.txt + H delete.txt + H expect1 + H expect2 + EOF + cat <<-EOF >expect2 && + C a.txt + R delete.txt + EOF + git add a.txt b.txt delete.txt expect1 expect2 && + git commit -m master:1 +' + +test_expect_success 'main commit again' ' + echo a>a.txt && + echo b>b.txt && + echo delete>delete.txt && + git add a.txt b.txt delete.txt && + git commit -m master:2 +' + +test_expect_success 'dev commit' ' + git checkout HEAD~ && + git switch -c dev && + echo change>a.txt && + git add a.txt && + git commit -m dev:1 +' + +test_expect_success 'dev merge master' ' + test_must_fail git merge master && + git ls-files -t --dedup >actual1 && + test_cmp expect1 actual1 && + rm delete.txt && + git ls-files -d -m -t --dedup >actual2 && + test_cmp expect2 actual2 +' + +test_done -- gitgitgadget