From 6099222717e97badb90a01ca948a2482f9177038 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Wed, 19 Jun 1996 01:59:12 +0000 Subject: [PATCH] (do_copy): When the force and backup options have been specified and the source and destination are the same name for an existing, regular file, convert the user's command, e.g. `cp --force --backup foo foo' to `cp --force foo fooSUFFIX' where SUFFIX is determined by any version control options used. At urging of (most recently) Karl Berry. --- src/cp.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/cp.c b/src/cp.c index a48f4e5409..aa8548da61 100644 --- a/src/cp.c +++ b/src/cp.c @@ -502,11 +502,28 @@ do_copy (int argc, char **argv) source = argv[optind]; + /* When the force and backup options have been specified and + the source and destination are the same name for an existing + regular file, convert the user's command, e.g. + `cp --force --backup foo foo' to `cp --force foo fooSUFFIX' + where SUFFIX is determined by any version control options used. */ + + if (flag_force + && backup_type != none + && STREQ (source, dest) + && !new_dst && S_ISREG (sb.st_mode)) + { + backup_type = none; + new_dest = find_backup_file_name (dest); + if (new_dest == NULL) + error (1, 0, _("virtual memory exhausted")); + } + /* When the destination is specified with a trailing slash and the source exists but is not a directory, convert the user's command `cp source dest/' to `cp source dest/basename(source)'. */ - if (dest[strlen (dest) - 1] == '/' + else if (dest[strlen (dest) - 1] == '/' && lstat (source, &source_stats) == 0 && !S_ISDIR (source_stats.st_mode)) { -- 2.47.2