Index: head/etc/mtree/BSD.tests.dist =================================================================== --- head/etc/mtree/BSD.tests.dist (revision 351835) +++ head/etc/mtree/BSD.tests.dist (revision 351836) @@ -1,1100 +1,1102 @@ # $FreeBSD$ # # Please see the file src/etc/mtree/README before making changes to this file. # /set type=dir uname=root gname=wheel mode=0755 . bin cat .. chflags .. chmod .. date .. dd .. echo .. expr .. ln .. ls .. mkdir .. mv .. pax .. pkill .. pwait .. rm .. rmdir .. sh builtins .. errors .. execution .. expansion .. invocation .. parameters .. parser .. set-e .. .. sleep .. test .. .. cddl lib .. sbin .. usr.bin ctfconvert .. ztest .. .. usr.sbin dtrace common aggs .. arithmetic .. arrays .. assocs .. begin .. bitfields .. buffering .. builtinvar .. cg .. clauses .. cpc .. decls .. drops .. dtraceUtil .. end .. env .. enum .. error .. exit .. fbtprovider .. funcs .. grammar .. include .. inline .. io .. ip .. java_api .. json .. lexer .. llquantize .. mdb .. mib .. misc .. multiaggs .. offsetof .. operators .. pid .. plockstat .. pointers .. pragma .. predicates .. preprocessor .. print .. printa .. printf .. privs .. probes .. proc .. profile-n .. providers .. raise .. rates .. safety .. scalars .. sched .. scripting .. sdt .. sizeof .. speculation .. stability .. stack .. stackdepth .. stop .. strlen .. strtoll .. struct .. sugar .. syscall .. sysevent .. tick-n .. trace .. tracemem .. translators .. typedef .. types .. uctf .. union .. usdt .. ustack .. vars .. version .. .. i386 arrays .. funcs .. pid .. ustack .. .. amd64 arrays .. .. .. zfsd .. .. .. etc rc.d .. .. games .. gnu lib .. usr.bin diff .. .. .. lib atf libatf-c detail .. .. libatf-c++ detail .. .. test-programs .. .. csu dynamic .. dynamiclib .. static .. .. googletest gmock .. gmock_main .. gtest .. gtest_main .. .. libarchive .. libbe .. libc c063 .. db .. gen execve .. posix_spawn .. .. hash data .. .. iconv .. inet .. locale .. net getaddrinfo data .. .. .. nss .. regex data .. .. resolv .. rpc .. ssp .. setjmp .. stdio .. stdlib .. string .. sys .. time .. tls dso .. .. termios .. ttyio .. .. libcam .. libcasper services cap_dns .. cap_grp .. cap_pwd .. cap_sysctl .. .. .. libcrypt .. libdevdctl .. libkvm .. libmp .. libnv .. libproc .. libregex data .. .. librt .. libsbuf .. libthr dlopen .. .. libutil .. libxo .. msun .. .. libexec atf atf-check .. atf-sh .. .. rtld-elf .. tftpd .. .. sbin bectl .. dhclient .. devd .. growfs .. ifconfig .. mdconfig .. pfctl files .. .. ping .. ping6 .. .. secure lib .. libexec .. usr.bin .. usr.sbin .. .. share examples tests atf .. googletest .. plain .. tap .. .. .. zoneinfo .. .. sys acl .. aio .. audit .. auditpipe .. capsicum .. cddl zfs bin .. include .. tests acl cifs .. nontrivial .. trivial .. .. atime .. bootfs .. cache .. cachefile .. clean_mirror .. cli_root zfs_upgrade .. zfs_promote .. zfs_clone .. zfs_property .. zfs_destroy .. zpool_create .. zpool_history .. zpool_expand .. zpool_remove .. zfs_mount .. zfs_unshare .. zdb .. zpool_online .. zpool_get .. zpool_export .. zfs_copies .. zfs_get .. zfs .. zpool_clear .. zpool_import blockfiles .. .. zpool .. zpool_offline .. zpool_replace .. zfs_rollback .. zpool_set .. zfs_send .. zfs_set .. zpool_detach .. zfs_diff .. zpool_scrub .. zfs_inherit .. zfs_snapshot .. zfs_share .. zpool_destroy .. zpool_status .. zfs_unmount .. zfs_receive .. zfs_create .. zpool_upgrade blockfiles .. .. zpool_add .. zfs_rename .. zpool_attach .. zfs_reservation .. .. cli_user misc .. zfs_list .. zpool_iostat .. zpool_list .. .. compression .. ctime .. delegate .. devices .. exec .. grow_pool .. grow_replicas .. history .. hotplug .. hotspare .. inheritance .. interop .. inuse .. iscsi .. large_files .. largest_pool .. link_count .. migration .. mmap .. mount .. mv_files .. nestedfs .. no_space .. online_offline .. pool_names .. poolversion .. quota .. redundancy .. refquota .. refreserv .. rename_dirs .. replacement .. reservation .. rootpool .. rsend .. scrub_mirror .. slog .. snapshot .. snapused .. sparse .. threadsappend .. truncate .. txg_integrity .. userquota .. utils_test .. write_dirs .. xattr .. zfsd .. zil .. zinject .. zones .. zvol zvol_ENOSPC .. zvol_cli .. zvol_misc .. zvol_swap .. .. zvol_thrash .. .. .. .. devrandom .. dtrace .. fifo .. file .. fs fusefs .. tmpfs .. .. geom class concat .. eli .. gate .. gpt .. mirror .. nop .. part .. raid3 .. shsec .. stripe .. uzip etalon .. .. .. .. kern acct .. execve .. pipe .. .. kqueue libkqueue .. .. mac bsdextended .. portacl .. .. mqueue .. net .. netinet .. netipsec tunnel .. .. netmap .. netpfil common .. pf ioctl .. .. .. opencrypto .. pjdfstest chflags .. chmod .. chown .. ftruncate .. granular .. link .. mkdir .. mkfifo .. mknod .. open .. rename .. rmdir .. symlink .. truncate .. unlink .. utimensat .. .. posixshm .. sys .. vfs .. vm .. .. usr.bin apply .. awk .. basename .. bmake archives fmt_44bsd .. fmt_44bsd_mod .. fmt_oldbsd .. .. basic t0 .. t1 .. t2 .. t3 .. .. execution ellipsis .. empty .. joberr .. plus .. .. shell builtin .. meta .. path .. path_select .. replace .. select .. .. suffixes basic .. src_wild1 .. src_wild2 .. .. syntax directive-t0 .. enl .. funny-targets .. semi .. .. sysmk t0 2 1 .. .. mk .. .. t1 2 1 .. .. mk .. .. t2 2 1 .. .. mk .. .. .. variables modifier_M .. modifier_t .. opt_V .. t0 .. .. .. bsdcat .. calendar .. cmp .. compress .. cpio .. col .. comm .. csplit .. cut .. dc .. diff .. dirname .. du .. file2c .. find .. fold .. getconf .. grep .. gzip .. head .. hexdump .. ident .. indent .. join .. jot .. lastcomm .. limits .. m4 .. mkimg .. ncal .. opensm .. + patch + .. pr .. printf .. procstat .. rs .. sdiff .. sed regress.multitest.out .. .. seq .. soelim .. stat .. tail .. tar .. timeout .. tr .. truncate .. units .. uudecode .. uuencode .. uniq .. vmstat .. xargs .. xinstall .. xo .. yacc yacc .. .. .. usr.sbin chown .. etcupdate .. extattr .. fstyp .. makefs .. mixer .. newsyslog .. nmtree .. praudit .. pw .. rpcbind .. sa .. .. .. # vim: set expandtab ts=4 sw=4: Index: head/usr.bin/patch/Makefile =================================================================== --- head/usr.bin/patch/Makefile (revision 351835) +++ head/usr.bin/patch/Makefile (revision 351836) @@ -1,8 +1,13 @@ # $OpenBSD: Makefile,v 1.4 2005/05/16 15:22:46 espie Exp $ # $FreeBSD$ +.include + PROG= patch SRCS= backupfile.c inp.c mkpath.c patch.c pch.c util.c + +HAS_TESTS= +SUBDIR.${MK_TESTS}+= tests .include Index: head/usr.bin/patch/tests/Makefile =================================================================== --- head/usr.bin/patch/tests/Makefile (nonexistent) +++ head/usr.bin/patch/tests/Makefile (revision 351836) @@ -0,0 +1,12 @@ +# $FreeBSD$ + +PACKAGE= tests + +ATF_TESTS_SH+= unified_patch_test + +${PACKAGE}FILES+= PR74127-cline.diff +${PACKAGE}FILES+= PR74127-good.diff +${PACKAGE}FILES+= PR74127-repro.diff +${PACKAGE}FILES+= PR74127.in + +.include Property changes on: head/usr.bin/patch/tests/Makefile ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Index: head/usr.bin/patch/tests/PR74127-cline.diff =================================================================== --- head/usr.bin/patch/tests/PR74127-cline.diff (nonexistent) +++ head/usr.bin/patch/tests/PR74127-cline.diff (revision 351836) @@ -0,0 +1,4 @@ +file.c +@@ -3,1 +3,1 @@ +- set Log(compressProg) /usr/local/bin/gzip ++ set Log(compressProg) /usr/bin/gzip Property changes on: head/usr.bin/patch/tests/PR74127-cline.diff ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +on \ No newline at end of property Index: head/usr.bin/patch/tests/PR74127-good.diff =================================================================== --- head/usr.bin/patch/tests/PR74127-good.diff (nonexistent) +++ head/usr.bin/patch/tests/PR74127-good.diff (revision 351836) @@ -0,0 +1,4 @@ +file.c +@@ -3,1 +3,1 @@ +- set Log(compressProg) gzip ++ set Log(compressProg) /usr/local/bin/gzip Property changes on: head/usr.bin/patch/tests/PR74127-good.diff ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +usr.bin/patch/tests/PR74127-cline.diff \ No newline at end of property Index: head/usr.bin/patch/tests/PR74127-repro.diff =================================================================== --- head/usr.bin/patch/tests/PR74127-repro.diff (nonexistent) +++ head/usr.bin/patch/tests/PR74127-repro.diff (revision 351836) @@ -0,0 +1,4 @@ +file.c +@@ -5,1 +5,1 @@ +- set Log(compressProg) /usr/local/bin/gzip ++ set Log(compressProg) /usr/bin/gzip Property changes on: head/usr.bin/patch/tests/PR74127-repro.diff ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +usr.bin/patch/tests/PR74127-cline.diff \ No newline at end of property Index: head/usr.bin/patch/tests/PR74127.in =================================================================== --- head/usr.bin/patch/tests/PR74127.in (nonexistent) +++ head/usr.bin/patch/tests/PR74127.in (revision 351836) @@ -0,0 +1,14 @@ +# This program is used to compress log files +if {![info exists Log(compressProg)]} { + set Log(compressProg) gzip +} + +# Flush interval +if {![info exists Log(flushInterval)]} { + set Log(flushInterval) [expr {60 * 1000}] +} + +# This is used to turn on an alternate debug log file +if {![info exist Log(debug_log)]} { + set Log(debug_log) 0 +} Property changes on: head/usr.bin/patch/tests/PR74127.in ___________________________________________________________________ Added: fbsd:nokeywords ## -0,0 +1 ## +on \ No newline at end of property Index: head/usr.bin/patch/tests/unified_patch_test.sh =================================================================== --- head/usr.bin/patch/tests/unified_patch_test.sh (nonexistent) +++ head/usr.bin/patch/tests/unified_patch_test.sh (revision 351836) @@ -0,0 +1,140 @@ +# +# SPDX-License-Identifier: BSD-2-Clause-FreeBSD +# +# Copyright (c) 2019 Kyle Evans +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +# $FreeBSD$ + +atf_test_case basic +basic_body() +{ + printf "a\nb\nc\nd\ne\nf\ng\nh\ni\n" > foo_full + printf "a\nb\nc\n" > foo_start + printf "g\nh\ni\n" > foo_end + printf "d\ne\nf\n" > foo_middle + + diff -u foo_start foo_full > foo_start2full.diff + diff -u foo_end foo_full > foo_end2full.diff + diff -u foo_middle foo_full > foo_mid2full.diff + + # Check lengths... each should have all 9 lines + 3 line header + atf_check -o inline:"12" -x \ + "cat foo_start2full.diff | wc -l | tr -d '[:space:]'" + atf_check -o inline:"12" -x \ + "cat foo_end2full.diff | wc -l | tr -d '[:space:]'" + atf_check -o inline:"12" -x \ + "cat foo_mid2full.diff | wc -l | tr -d '[:space:]'" + + # Apply the patch! Should succeed + atf_check -o ignore patch foo_start foo_start2full.diff \ + -o foo_start2full + atf_check -o ignore patch foo_end foo_end2full.diff \ + -o foo_end2full + atf_check -o ignore patch foo_middle foo_mid2full.diff \ + -o foo_mid2full + + # And these should all produce equivalent to the original full + atf_check -o ignore diff foo_start2full foo_full + atf_check -o ignore diff foo_end2full foo_full + atf_check -o ignore diff foo_mid2full foo_full +} + +atf_test_case limited_ctx +limited_ctx_head() +{ + atf_set "descr" "Verify correct behavior with limited context (PR 74127)" +} +limited_ctx_body() +{ + + # First; PR74127-repro.diff should not have applied, but it instead + # assumed a match and added the modified line at the offset specified... + atf_check -s not-exit:0 -o ignore -e ignore patch -o _.out \ + "$(atf_get_srcdir)/PR74127.in" \ + "$(atf_get_srcdir)/PR74127-repro.diff" + + # Let's extend that and make sure a similarly ill-contexted diff does + # not apply even with the correct line number + atf_check -s not-exit:0 -o ignore -e ignore patch -o _.out \ + "$(atf_get_srcdir)/PR74127.in" \ + "$(atf_get_srcdir)/PR74127-line.diff" + + # Correct line number and correct old line should always work + atf_check -o ignore -e ignore patch -o _.out \ + "$(atf_get_srcdir)/PR74127.in" \ + "$(atf_get_srcdir)/PR74127-good.diff" +} + +atf_test_case file_creation +file_creation_body() +{ + + echo "x" > foo + diff -u /dev/null foo > foo.diff + rm foo + + atf_check -x "patch -s < foo.diff" + atf_check -o ignore stat foo +} + +# This test is motivated by long-standing bugs that occasionally slip by in +# commits. If a file is created by a diff, patch(1) will happily duplicate the +# contents as many times as you apply the diff. It should instead detect that +# a source of /dev/null creates the file, so it shouldn't exist. Furthermore, +# the reverse of creation is deletion -- hence the next test. +atf_test_case file_nodupe +file_nodupe_body() +{ + + # WIP + atf_expect_fail "patch(1) erroneously duplicates created files" + echo "x" > foo + diff -u /dev/null foo > foo.diff + + atf_check -x "patch -s < foo.diff" + atf_check -s not-exit:0 -x "patch -fs < foo.diff" +} + +atf_test_case file_removal +file_removal_body() +{ + + # WIP + atf_expect_fail "patch(1) does not yet recognize /dev/null as creation" + + echo "x" > foo + diff -u /dev/null foo > foo.diff + + atf_check -x "patch -Rs < foo.diff" + atf_check -s not-exit:0 -o ignore stat foo +} + +atf_init_test_cases() +{ + atf_add_test_case basic + atf_add_test_case limited_ctx + atf_add_test_case file_creation + atf_add_test_case file_nodupe + atf_add_test_case file_removal +} Property changes on: head/usr.bin/patch/tests/unified_patch_test.sh ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property