Re: [PATCH v2 2/2] mv: check for missing destination directory before renaming
Junio C Hamano <[email protected]>
| Newsgroups | org.kernel.vger.git |
|---|---|
| Message-ID | <[email protected]> |
"Lucas Zamboni Orioli via GitGitGadget" <[email protected]> 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. */ > + 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?