On Fri, 29 Mar 2024, Junio C Hamano <gitster@xxxxxxxxx> wrote: > Ghanshyam Thakkar <shyamthakkar001@xxxxxxxxx> writes: > > + if (take_worktree_changes) > > + exit_status |= report_path_error(ps_matched, &pathspec); > > Hmph, are we sure take_worktree_changes is true only when > add_renormalize is false? > > > if (add_new_files) > > exit_status |= add_files(&dir, flags); > > If report_path_error() detected that the pathspec were faulty, > should we still proceed to add new files? This is NOT a rhetorical > question, as I do not know the answer myself. I do not even know > offhand what add_files_to_cache() above did when pathspec elements > are not all consumed---if it does not complain and does not refrain > from doing any change to the index, then we should follow suite and > add_files() here, too. Sorry if I'm missing something, but in your last line after '---', do you mean that we should proceed even after report_path_error() detected error like in the above patch or perhaps something like this: diff --git a/builtin/add.c b/builtin/add.c index dc4b42d0ad..eccda485ed 100644 --- a/builtin/add.c +++ b/builtin/add.c @@ -64,7 +64,8 @@ static int chmod_pathspec(struct pathspec *pathspec, char flip, int show_only) return ret; } -static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) +static int renormalize_tracked_files(const struct pathspec *pathspec, + char *ps_matched, int flags) { int i, retval = 0; @@ -79,7 +80,8 @@ static int renormalize_tracked_files(const struct pathspec *pathspec, int flags) continue; /* do not touch unmerged paths */ if (!S_ISREG(ce->ce_mode) && !S_ISLNK(ce->ce_mode)) continue; /* do not touch non blobs */ - if (pathspec && !ce_path_match(&the_index, ce, pathspec, NULL)) + if (pathspec && + !ce_path_match(&the_index, ce, pathspec, ps_matched)) continue; retval |= add_file_to_index(&the_index, ce->name, flags | ADD_CACHE_RENORMALIZE); @@ -370,7 +372,9 @@ int cmd_add(int argc, const char **argv, const char *prefix) int add_new_files; int require_pathspec; char *seen = NULL; + char *ps_matched = NULL; struct lock_file lock_file = LOCK_INIT; + struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP; git_config(add_config, NULL); @@ -487,7 +491,6 @@ int cmd_add(int argc, const char **argv, const char *prefix) if (pathspec.nr) { int i; char *skip_worktree_seen = NULL; - struct string_list only_match_skip_worktree = STRING_LIST_INIT_NODUP; if (!seen) seen = find_pathspecs_matching_against_index(&pathspec, @@ -544,18 +547,26 @@ int cmd_add(int argc, const char **argv, const char *prefix) free(seen); free(skip_worktree_seen); - string_list_clear(&only_match_skip_worktree, 0); } begin_odb_transaction(); + ps_matched = xcalloc(pathspec.nr, 1); if (add_renormalize) - exit_status |= renormalize_tracked_files(&pathspec, flags); + exit_status |= + renormalize_tracked_files(&pathspec, ps_matched, flags); else exit_status |= add_files_to_cache(the_repository, prefix, - &pathspec, NULL, + &pathspec, ps_matched, include_sparse, flags); + if ((take_worktree_changes || + (add_renormalize && !only_match_skip_worktree.nr)) && include_sparse, flags); + if ((take_worktree_changes || + (add_renormalize && !only_match_skip_worktree.nr)) && + report_path_error(ps_matched, &pathspec)) { + exit_status = 1; + goto cleanup; + } + if (add_new_files) exit_status |= add_files(&dir, flags); @@ -568,6 +579,9 @@ int cmd_add(int argc, const char **argv, const char *prefix) COMMIT_LOCK | SKIP_IF_UNCHANGED)) die(_("unable to write new index file")); +cleanup: + string_list_clear(&only_match_skip_worktree, 0); + free(ps_matched); dir_clear(&dir); clear_pathspec(&pathspec); return exit_status; Although I'm not sure if we should flush_odb_transaction() in the cleanup, because end_odb_transaction() would not be called if we go straight to cleanup.