summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2023-08-15 10:19:47 -0700
committerJunio C Hamano <gitster@pobox.com>2023-08-15 10:19:47 -0700
commit8e12aaa7ceb83c9229b392079ed9e38c36e82b81 (patch)
tree70ab537d344e98f2f8c6a31265c001912ce0f3e3
parentcecd6a5ffce2c35f18e8ac537c9e2f71ac99932b (diff)
parent72695d8214791161a943086e894874b4fd71ba9f (diff)
Merge branch 'st/mv-lstat-fix'
Correct use of lstat() that assumed a failing call would not clobber the statbuf. * st/mv-lstat-fix: mv: handle lstat() failure correctly
-rw-r--r--builtin/mv.c4
-rwxr-xr-xt/t7001-mv.sh7
2 files changed, 9 insertions, 2 deletions
diff --git a/builtin/mv.c b/builtin/mv.c
index fa84fcb20d..05e7156034 100644
--- a/builtin/mv.c
+++ b/builtin/mv.c
@@ -184,7 +184,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
int src_dir_nr = 0, src_dir_alloc = 0;
struct strbuf a_src_dir = STRBUF_INIT;
enum update_mode *modes, dst_mode = 0;
- struct stat st;
+ struct stat st, dest_st;
struct string_list src_for_dst = STRING_LIST_INIT_NODUP;
struct lock_file lock_file = LOCK_INIT;
struct cache_entry *ce;
@@ -304,7 +304,7 @@ int cmd_mv(int argc, const char **argv, const char *prefix)
goto act_on_entry;
}
if (S_ISDIR(st.st_mode)
- && lstat(dst, &st) == 0) {
+ && lstat(dst, &dest_st) == 0) {
bad = _("cannot move directory over file");
goto act_on_entry;
}
diff --git a/t/t7001-mv.sh b/t/t7001-mv.sh
index 898a920532..f136ea76f7 100755
--- a/t/t7001-mv.sh
+++ b/t/t7001-mv.sh
@@ -174,6 +174,13 @@ test_expect_success 'do not move directory over existing directory' '
test_must_fail git mv path2 path0
'
+test_expect_success 'rename directory to non-existing directory' '
+ mkdir dir-a &&
+ >dir-a/f &&
+ git add dir-a &&
+ git mv dir-a non-existing-dir
+'
+
test_expect_success 'move into "."' '
git mv path1/path2/ .
'