]> git.ipfire.org Git - thirdparty/git.git/commitdiff
unpack-trees: add special cwd handling
authorElijah Newren <newren@gmail.com>
Thu, 9 Dec 2021 05:08:28 +0000 (05:08 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 9 Dec 2021 21:33:12 +0000 (13:33 -0800)
When running commands such as `git reset --hard` from a subdirectory, if
that subdirectory is in the way of adding needed files, bail with an
error message.

Note that this change looks kind of like it duplicates the new lines of
code from the previous commit in verify_clean_subdirectory().  However,
when we are preserving untracked files, we would rather any error
messages about untracked files being in the way take precedence over
error messages about a subdirectory that happens to be the_original_cwd
being in the way.  But in the UNPACK_RESET_OVERWRITE_UNTRACKED case,
there is no untracked checking to be done, so we simply add a special
case near the top of verify_absent_1.

Acked-by: Derrick Stolee <stolee@gmail.com>
Acked-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
t/t2501-cwd-empty.sh
unpack-trees.c

index 398908dfc936c3d53c4add00f333c10fdf11caf8..5af1fec6fec2f63207046372e0d6ca6978e7fa66 100755 (executable)
@@ -121,7 +121,7 @@ test_expect_success 'reset --hard does not clean cwd incidentally' '
 '
 
 test_expect_success 'reset --hard fails if cwd needs to be removed' '
-       test_required_dir_removal failure git reset --hard fd_conflict
+       test_required_dir_removal success git reset --hard fd_conflict
 '
 
 test_expect_success 'merge does not clean cwd incidentally' '
index 6bc16f3a714bde74f468608d98988d87caf43765..5852807d2fbe886ad9de5146d123170c3df8de39 100644 (file)
@@ -2261,10 +2261,19 @@ static int verify_absent_1(const struct cache_entry *ce,
        int len;
        struct stat st;
 
-       if (o->index_only || !o->update ||
-           o->reset == UNPACK_RESET_OVERWRITE_UNTRACKED)
+       if (o->index_only || !o->update)
                return 0;
 
+       if (o->reset == UNPACK_RESET_OVERWRITE_UNTRACKED) {
+               /* Avoid nuking startup_info->original_cwd... */
+               if (startup_info->original_cwd &&
+                   !strcmp(startup_info->original_cwd, ce->name))
+                       return add_rejected_path(o, ERROR_CWD_IN_THE_WAY,
+                                                ce->name);
+               /* ...but nuke anything else. */
+               return 0;
+       }
+
        len = check_leading_path(ce->name, ce_namelen(ce), 0);
        if (!len)
                return 0;