]> git.ipfire.org Git - thirdparty/git.git/commitdiff
builtin/add: error out when passing untracked path with -u
authorGhanshyam Thakkar <shyamthakkar001@gmail.com>
Wed, 3 Apr 2024 18:14:52 +0000 (23:44 +0530)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Apr 2024 21:55:22 +0000 (14:55 -0700)
When passing untracked path with -u option, it silently succeeds.
There is no error message and the exit code is zero. This is
inconsistent with other instances of git commands where the expected
argument is a known path. In those other instances, we error out when
the path is not known.

Fix this by passing a character array to add_files_to_cache() to
collect the pathspec matching information and report the error if a
pathspec does not match any cache entry. Also add a testcase to cover
this scenario.

Signed-off-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/add.c
t/t2200-add-update.sh

index dc4b42d0ad3d16020db3ed93cbe99d04426882af..1937c190978005f9f74fa8e6b2a964b80f5a3b2e 100644 (file)
@@ -370,6 +370,7 @@ 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;
 
        git_config(add_config, NULL);
@@ -549,13 +550,18 @@ int cmd_add(int argc, const char **argv, const char *prefix)
 
        begin_odb_transaction();
 
+       ps_matched = xcalloc(pathspec.nr, 1);
        if (add_renormalize)
                exit_status |= renormalize_tracked_files(&pathspec, 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 && !ignore_add_errors &&
+           report_path_error(ps_matched, &pathspec))
+               exit(128);
+
        if (add_new_files)
                exit_status |= add_files(&dir, flags);
 
@@ -568,6 +574,7 @@ finish:
                               COMMIT_LOCK | SKIP_IF_UNCHANGED))
                die(_("unable to write new index file"));
 
+       free(ps_matched);
        dir_clear(&dir);
        clear_pathspec(&pathspec);
        return exit_status;
index c01492f33f860db2d6ae8764c94c084429abeef5..df235ac306e7126f7090bc62c451e906b174c387 100755 (executable)
@@ -65,6 +65,16 @@ test_expect_success 'update did not touch untracked files' '
        test_must_be_empty out
 '
 
+test_expect_success 'error out when passing untracked path' '
+       git reset --hard &&
+       echo content >>baz &&
+       echo content >>top &&
+       test_must_fail git add -u baz top 2>err &&
+       test_grep -e "error: pathspec .baz. did not match any file(s) known to git" err &&
+       git diff --cached --name-only >actual &&
+       test_must_be_empty actual
+'
+
 test_expect_success 'cache tree has not been corrupted' '
 
        git ls-files -s |