DEST_NAME if defined. */
static void
-preserve_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
+set_author (const char *dst_name, int dest_desc, const struct stat *src_sb)
{
/* FIXME: Preserve the st_author field via the file descriptor dest_desc. */
#if HAVE_STRUCT_STAT_ST_AUTHOR
}
}
- preserve_author (dst_name, dest_desc, src_sb);
+ set_author (dst_name, dest_desc, src_sb);
if (x->preserve_mode || x->move_mode)
{
{
if (S_ISDIR (src_type))
{
- error (0, 0,
- _("cannot overwrite non-directory %s with directory %s"),
- quote_n (0, dst_name), quote_n (1, src_name));
- return false;
+ if (x->move_mode && x->backup_type != no_backups)
+ {
+ }
+ else
+ {
+ error (0, 0,
+ _("cannot overwrite non-directory %s with directory %s"),
+ quote_n (0, dst_name), quote_n (1, src_name));
+ return false;
+ }
}
/* Don't let the user destroy their data, even if they try hard:
{
if (S_ISDIR (dst_sb.st_mode))
{
- error (0, 0,
- _("cannot overwrite directory %s with non-directory"),
- quote (dst_name));
- return false;
+ if (x->move_mode && x->backup_type != no_backups)
+ {
+ }
+ else
+ {
+ error (0, 0,
+ _("cannot overwrite directory %s with non-directory"),
+ quote (dst_name));
+ return false;
+ }
}
if (x->update)
if (x->move_mode)
{
/* In move_mode, DEST may not be an existing directory. */
- if (S_ISDIR (dst_sb.st_mode))
+ if (S_ISDIR (dst_sb.st_mode) && x->backup_type == no_backups)
{
error (0, 0, _("cannot overwrite directory %s"),
quote (dst_name));
}
/* Don't allow user to move a directory onto a non-directory. */
- if (S_ISDIR (src_sb.st_mode) && !S_ISDIR (dst_sb.st_mode))
+ if (S_ISDIR (src_sb.st_mode) && !S_ISDIR (dst_sb.st_mode)
+ && x->backup_type == no_backups)
{
error (0, 0,
_("cannot move directory onto non-directory: %s -> %s"),
}
}
- if (x->backup_type != no_backups && !S_ISDIR (dst_sb.st_mode))
+ bool backup_directories = true;
+ if (x->backup_type != no_backups
+ && (!S_ISDIR (dst_sb.st_mode) || backup_directories))
{
char *tmp_backup = find_backup_file_name (dst_name,
x->backup_type);
return false;
}
- preserve_author (dst_name, -1, &src_sb);
+ set_author (dst_name, -1, &src_sb);
if (x->preserve_mode || x->move_mode)
{