Re: [PATCH v2 2/2] mv: check for missing destination directory before renaming
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 23, 2026, 18:30 UTC
- Message-ID
- <xmqqo6fximn2.fsf@gitster.g>
- In-Reply-To
- <1a790e001610d3324ec45d86ac67ca5720678cb8.1784812390.git.gitgitgadget@gmail.com>
"Lucas Zamboni Orioli via GitGitGadget" <gitgitgadget@gmail.com> writes:
> + /* > + * If we are going to move SRC to DST on disk, DST's leading > + * directories must already exist. > + */
/* * Our multi-line comment is formatted like this. The * asterisks align vertically. */
Show 16 quoted lines
> + if (!(modes[i] & (INDEX | SPARSE | SKIP_WORKTREE_DIR)) &&
> + !(dst_mode & (SKIP_WORKTREE_DIR | SPARSE))) {
> + char *dst_dir = xstrdup(dst);
> + char *slash = strrchr(dst_dir, '/');
> +
> + if (slash) {
> + struct stat dir_st;
> + *slash = '\0';
> + if (lstat(dst_dir, &dir_st) < 0 && errno == ENOENT) {
> + free(dst_dir);
> + bad = _("destination directory does not exist");
> + goto act_on_entry;
> + }
> + }
> + free(dst_dir);
> + }lstat() can succeed and 'dir_st' may indicate something other than a directory (for example, a symbolic link or a regular file). Alternatively, it can fail with ENOTDIR when, for example, 'dst_dir' is 'a/b/c' and 'a/b' is a file rather than a directory.
Both cases will cause 'git mv' into a path assumed to be a directory to fail. Shouldn't we handle these conditions as well?