coreutils 'cp' output change

Recently we ran into a problem with the 'ln' utility in coreutils. One of the eudev developers used the '-r' option, but my 'ln' in Precise Puppy does not have that option.
It turned out that the 'ln' in coreutils version 8.20 (as used in Ubuntu Raring Ringtail) does have the '-r' option, but earlier versions don't -- well, I don't know exactly what version it was introduced, but it was recent, within the last year.

Now, I have discovered another change in coreutils, this time in the 'cp' utility. I was using Woof in Raring Puppy, and noticed an error message from '3builddistro'.

The problem is that 'cp' outputs an error message with a different format to earlier versions. I fixed it in 3builddistro:
 #cp -a --remove-destination packages-${DISTRO_FILE_PREFIX}/${ONEPKG}/* sandbox3/rootfs-complete/ 2> /dev/null

#w003 problem. pet pkg seamonkey_addon_adblock has files in /usr/lib/seamonkey but in rootfs-complete
#usr/lib/seamonkey is a symlink to seamonkey-1.1.14 and copy fails. this will follow path with a
#symlink (hopefully doesn't break something else)...
#looks okay. the --remove-destination ensures that if target file already exists as a symlink
#it will be deleted first and won't be followed. shit no, it changed /usr/lib/seamonkey into a dir...
#cp -r --preserve=mode,ownership,timestamps,links --dereference --remove-destination packages-${DISTRO_FILE_PREFIX}/${ONEPKG}/* sandbox3/rootfs-complete/ 2> /dev/null
#/usr/sbin/petget solves this a different way, let's try that...

#130430 new problem with coreutils 8.20... ex building raring pup...
#ex: cp -a --remove-destination packages-raring/synclient/* sandbox3/rootfs-complete/
#coreutils 5.2.1 stderr: cannot overwrite non-directory `sandbox3/rootfs-complete/usr/X11' with directory `packages-raring/synclient/usr/X11'
#coreutils 8.20 (in Raring) stderr: cp: cannot overwrite non-directory ‘sandbox3/rootfs-complete/usr/X11’ with directory ‘packages-raring/synclient/usr/X11’
#...!!!! ok, attempt to fix...

cp -a --remove-destination packages-${DISTRO_FILE_PREFIX}/${ONEPKG}/* sandbox3/rootfs-complete/ 2> /tmp/3builddistro-cp-errlog
sync #110727 running drake pup 0.3 with k2.6.39-3 new laptop, mysterious loss of dirs/files. try sync.
if [ -s /tmp/3builddistro-cp-errlog ];then #130430 next line fixes those quote chars...
cat /tmp/3builddistro-cp-errlog | grep 'cannot overwrite non-directory' | tr '[`‘’]' "'" | cut -f 2 -d "'" |
while read ONEDIRSYMLINK
do
xONEDIRSYMLINK="`echo -n "$ONEDIRSYMLINK" | sed -e 's%sandbox3/rootfs-complete%%'`"
#adding that extra trailing / does the trick...
cp -a --remove-destination packages-${DISTRO_FILE_PREFIX}/${ONEPKG}${xONEDIRSYMLINK}/* sandbox3/rootfs-complete${xONEDIRSYMLINK}/
done
fi
#...now seems ok. note, there are two places in woof v003 where this problem occurs: /usr/lib/seamonkey
# and /usr/share/cups/model.


...see the "130430" date where I changed the code.

Woof commit:
http://bkhome.org/fossil/woof2.cgi/info/bf15545a21


Posted on 30 Apr 2013, 9:20


Comments:

Posted on 30 Apr 2013, 9:36 by BarryK
ln --relative
I have just been informed by Alexey D. That 'ln' gained the '-r' option in coreutils version 8.16:

http://savannah.gnu.org/forum/forum.php?forum_id=7170

...a useful option!