Bug 228069 - tar(1) fails to append newer files only (-u, --update), but always appends all files (like -r).
Summary: tar(1) fails to append newer files only (-u, --update), but always appends al...
Status: New
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: 11.1-STABLE
Hardware: Any Any
: --- Affects Some People
Assignee: freebsd-bugs mailing list
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2018-05-08 14:04 UTC by Harald Schmalzbauer
Modified: 2018-05-09 02:23 UTC (History)
4 users (show)

See Also:


Attachments
Simple shell test demo which shows tar(1) failing to append only newer files (2.38 KB, application/x-shellscript)
2018-05-08 14:04 UTC, Harald Schmalzbauer
no flags Details

Note You need to log in before you can comment on or make changes to this bug.
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.