Bug 228069

Summary: tar(1) fails to append newer files only (-u, --update), but always appends all files (like -r).
Product: Base System Reporter: Harald Schmalzbauer <bugzilla.freebsd>
Component: binAssignee: freebsd-bugs (Nobody) <bugs>
Status: New ---    
Severity: Affects Some People CC: cem, emaste, kientzle, mm
Priority: ---    
Version: 11.1-STABLE   
Hardware: Any   
OS: Any   
Attachments:
Description Flags
Simple shell test demo which shows tar(1) failing to append only newer files none

Description Harald Schmalzbauer 2018-05-08 14:04:16 UTC
Created attachment 193180 [details]
Simple shell test demo which shows tar(1) failing to append only newer files

I guess this simple script is the shortest description (identically attached as file, respects TEMP environment variable):

#!/bin/sh

#
# Simple test demo which shows tar(1) failing to append only newer
# files to an existing archive.
#

testdir=tobetestarchived
testpath=${TEMP:-/tmp}
testtarfile=test.tar

[ -e "${testpath}"/"${testdir}" ] && rm -R "${testpath}"/"${testdir}"
mkdir "${testpath}"/"${testdir}" ||
	{ echo "Can't write into ${testpath} (\$testpath), exiting."; exit 1; }

cp /COPYRIGHT "${testpath}"/"${testdir}" || echo "No COPYRIGHT in root found" >\
	"${testpath}"/"${testdir}"/COPYRIGHT
date >	"${testpath}"/"${testdir}"/date.txt

echo
echo "Prepared two files for testing tar(1)'s --update feature"
echo "(in ${testpath}/${testdir})."
echo "One is named COPYRIGHT and"
echo -n "    "
stat -f "modification timestamp of COPYRIGHT is %Fm" \
	"${testpath}"/"${testdir}"/COPYRIGHT
#sha1 "${testpath}"/"${testdir}"/COPYRIGHT

tar cPf "${testpath}"/"${testtarfile}" "${testpath}"/"${testdir}" || exit 1
echo
echo "Successfully created a test archive, showing the following content:"
tar tf "${testpath}"/"${testtarfile}"
echo -n "    "
stat -f "Size of the archive: %z Bytes" "${testpath}"/"${testtarfile}"

echo
echo "Now we --update the archive, so only files which have a"
echo "modification time newer than the files in the archive"
echo "should be appended to the archive (none in our case)."
# ?halluzination?
#echo
#echo "Bu surprisingly, COPYRIGHT reports beeing modified,"
#echo "so the --update feature seems to be broken, but in fact,"
#echo "something else is broken:"
#stat -f "modification timestamp of COPYRIGHT is %Fm" \
#	"${testpath}"/"${testdir}"/COPYRIGHT
#sha1 "${testpath}"/"${testdir}"/COPYRIGHT

tar uPf "${testpath}"/"${testtarfile}" "${testpath}"/"${testdir}"  || exit 1
echo "Done."
echo "But all files were appended:"
tar tf "${testpath}"/"${testtarfile}"
echo -n "    "
stat -f "Size of the archive: %z Bytes" "${testpath}"/"${testtarfile}"

echo
echo "No idea why the files were appended, since"
echo -n "    "
stat -f "modification timestamp of COPYRIGHT is %Fm" \
	"${testpath}"/"${testdir}"/COPYRIGHT
echo "    (identical)"
echo

# I was sure I saw the first tar creation run modifing st_mtime,
# which would explain the observed misbehaviour, but I cannot reproduce.  Either
# I had a typo in this very basic script or I'm losing my mind...
#
# If I knew how to, I'd attach some dtrace/gdb or the like to tar in order to
# watch which functions/syscalls are happening...  But I must hope somebody
# else takes over.