mirror of
git://git.sv.gnu.org/coreutils.git
synced 2026-07-25 10:16:53 +02:00
cp: issue correct warning and ignore duplicate source dirs
* src/copy.c (copy_internal): Handle the case where we have the same destination directory as already encountered, which can only be due to the corresponding source directory being specified multiple times. * tests/cp/duplicate-sources.sh: Add a test for the new multiply specified directory case, and the existing multiply specified file case. * tests/local.mk: Reference the new test. * NEWS: Mention the bug fix.
This commit is contained in:
@@ -2,6 +2,12 @@ GNU coreutils NEWS -*- outline -*-
|
||||
|
||||
* Noteworthy changes in release ?.? (????-??-??) [?]
|
||||
|
||||
** Bug fixes
|
||||
|
||||
cp no longer issues an incorrect warning about directory hardlinks when a
|
||||
source directory is specified multiple times. Instead a warning is issued
|
||||
and the duplicate source directory is skipped, as already the case for files.
|
||||
|
||||
** New features
|
||||
|
||||
chroot accepts the new --skip-chdir option to not change the working directory
|
||||
|
||||
+11
@@ -2187,6 +2187,17 @@ copy_internal (char const *src_name, char const *dst_name,
|
||||
*copy_into_self = true;
|
||||
goto un_backup;
|
||||
}
|
||||
else if (same_name (dst_name, earlier_file))
|
||||
{
|
||||
error (0, 0, _("warning: source directory %s "
|
||||
"specified more than once"),
|
||||
quote (top_level_src_name));
|
||||
/* We only do backups in move mode and for non dirs,
|
||||
and in move mode this won't be the issue as the source will
|
||||
be missing for subsequent attempts.
|
||||
There we just warn and return here. */
|
||||
return true;
|
||||
}
|
||||
else if (x->dereference == DEREF_ALWAYS)
|
||||
{
|
||||
/* This happens when e.g., encountering a directory for the
|
||||
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/sh
|
||||
# Ensure cp warns about but otherwise ignores source
|
||||
# items specified multiple times.
|
||||
|
||||
# Copyright (C) 2014 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src
|
||||
print_ver_ cp
|
||||
|
||||
mkdir a b || framework_failure_
|
||||
touch f || framework_failure_
|
||||
|
||||
cp -a a a f f b 2>err || fail=1
|
||||
|
||||
cat <<EOF >exp
|
||||
cp: warning: source directory 'a' specified more than once
|
||||
cp: warning: source file 'f' specified more than once
|
||||
EOF
|
||||
|
||||
compare exp err || fail=1
|
||||
|
||||
Exit $fail
|
||||
@@ -427,6 +427,7 @@ all_tests = \
|
||||
tests/cp/dir-rm-dest.sh \
|
||||
tests/cp/dir-slash.sh \
|
||||
tests/cp/dir-vs-file.sh \
|
||||
tests/cp/duplicate-sources.sh \
|
||||
tests/cp/existing-perm-dir.sh \
|
||||
tests/cp/existing-perm-race.sh \
|
||||
tests/cp/fail-perm.sh \
|
||||
|
||||
Reference in New Issue
Block a user