thanks for the quick fix :) Att *IGOR GIAMONIANO*
Em qui., 5 de nov. de 2026 às 10:39, Pádraig Brady <[email protected]> escreveu: > On 05/11/2026 03:00, Collin Funk wrote: > > Collin Funk <[email protected]> writes: > > > >> Thanks for the detailed report! > >> > >> I can reproduce it on coreutils-9.12 as well. I'll take a look at it > >> later today. > > > > This patch should do the trick. The issue also occurs with target > > directories, i.e., the following commands: > > > > $ touch a; mkdir -p b > > $ mv --exchange a b > > mv: cannot exchange 'a' and 'b/a': Unknown error -1 > > $ mv --exchange --target-directory=b a > > mv: cannot exchange 'a' and 'b/a': Unknown error -1 > > > > So, I've added test cases for those and the more common invocation that > > you shared. > > > > I'll push it tomorrow to allow others a chance to review. > > > > Thanks again for the report, > > Collin > > I'd s/EEXIST/ENOENT/ in the commit summary. > I'd mention the error in the commit message to > help folks looking for a solution, something like: > > mv: cannot exchange 'exist' and 'missing': Unknown error -1 > > I'd also adjust the source comment like: > > diff --git a/src/copy.c b/src/copy.c > index cfd9deaad..273ed676f 100644 > --- a/src/copy.c > +++ b/src/copy.c > @@ -1749,9 +1749,8 @@ copy_internal (char const *src_name, char const > *dst_name, > } > else if (errno == ENOENT) > { > - /* Using renameatu would fail with ENOENT as well. > - Prefer the error message describing the failed rename > - instead of the failed stat. */ > + /* Using RENAME_EXCHANGE would fail with ENOENT as well, > + so set accordingly for that implied but skipped > renamatu(). */ > if (x->exchange) > rename_errno = ENOENT; > new_dst = true; > > The tests may fail where RENAME_EXCHANGE returns ENOTSUP I think. > In that case it's better to use a separate directory for the ENOENT test: > > diff --git a/tests/mv/mv-exchange.sh b/tests/mv/mv-exchange.sh > index cd237dcb0..42846c638 100755 > --- a/tests/mv/mv-exchange.sh > +++ b/tests/mv/mv-exchange.sh > @@ -49,9 +49,10 @@ compare /dev/null out || fail=1 > compare exp-err err || fail=1 > > # Test the behavior with a missing destination in a target directory. > -echo "mv: cannot exchange 'b' and 'a/b': $ENOENT" >exp-err || > framework_failure_ > +mkdir d || framework_failure_ > +echo "mv: cannot exchange 'b' and 'd/b': $ENOENT" >exp-err || > framework_failure_ > for opt in '' --target-directory=; do > - returns_ 1 mv --exchange b ${opt}a >out 2>err || fail=1 > + returns_ 1 mv --exchange b ${opt}d >out 2>err || fail=1 > compare /dev/null out || fail=1 > compare exp-err err || fail=1 > done > > cheers, > Padraig >
