Page MenuHomePhabricator

new files are empty for arc diff --create and --update
Closed, ResolvedPublic

Description

When creating or updating a diff with the arc command line tool new files are always blank, only the svn properties show.

Here's a run with trace enabled:

arc diff --update D4515 --trace
libphutil loaded from '/usr/local/lib/php/libphutil/src'.
arcanist loaded from '/usr/local/lib/php/arcanist/src'.
Config: Reading user configuration file "/home/smh/.arcrc"...
Config: Did not find system configuration at "/etc/arcconfig".
Working Copy: Reading .arcconfig from "/usr/home/smh/freebsd/base/head2/.arcconfig".
Working Copy: Path "/usr/home/smh/freebsd/base/head2" is part of `svn` working copy "/usr/home/smh/freebsd/base/head2".
Working Copy: Project root is at "/usr/home/smh/freebsd/base/head2".
Config: Did not find local configuration at "/usr/home/smh/freebsd/base/head2/.svn/arc/config".
>>> [0] <conduit> conduit.connect() <bytes = 420>
>>> [1] <http> https://reviews.freebsd.org/api/conduit.connect
<<< [1] <http> 827,275 us
<<< [0] <conduit> 827,639 us
>>> [2] <exec> $ svn --xml status
<<< [2] <exec> 2,687,389 us
You have untracked files in this working copy.

  Working copy: /usr/home/smh/freebsd/base/head2/

  Untracked changes in working copy:
  (To ignore these changes, add them to "svn:ignore".)
    1.patch
    3348.patch
    D4104.diff
    ahci.patch
    ahci1.patch
    efi-zfs.patch
    mfc-missing.pl

    Ignore these untracked files and continue? [y/N] y

>>> [3] <event> diff.didCollectChanges <listeners = 0>
<<< [3] <event> 123 us
>>> [4] <conduit> differential.query() <bytes = 192>
>>> [5] <http> https://reviews.freebsd.org/api/differential.query
<<< [5] <http> 258,454 us
<<< [4] <conduit> 258,658 us
>>> [6] <conduit> differential.getcommitmessage() <bytes = 215>
>>> [7] <http> https://reviews.freebsd.org/api/differential.getcommitmessage
<<< [7] <http> 263,777 us
<<< [6] <conduit> 263,946 us
>>> [8] <conduit> differential.parsecommitmessage() <bytes = 1644>
>>> [9] <http> https://reviews.freebsd.org/api/differential.parsecommitmessage
<<< [9] <http> 261,697 us
<<< [8] <conduit> 261,920 us
>>> [10] <event> diff.didBuildMessage <listeners = 0>
<<< [10] <event> 58 us
>>> [11] <exec> $ vi  '/tmp//edit.2nyolm6hrneowos8/differential-update-comments'
* Module structure cleanup
* Removed unused vars and funcs
* Improved error checking
* Enabled compiler warnings
* Fixed void pointer arithmetic warning in lz4.c
* Output probe progress and summary
* Fixed _MSC_EXTENSIONS #if vs #ifdef checks

# Updating D4515: ZFS EFI Boot Support #2
#
# Enter a brief description of the changes included in this update.
# The first line is used as subject, next lines as comment.
#
# If you intended to create a new revision, use:
#  $ arc diff --create

~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
~
/tmp//edit.2nyolm6hrneowos8/differential-update-comments: 16 lines, 491 characters.
<<< [11] <exec> 24,926,230 us
Linting...
>>> [12] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/common/self_reloc.c'
<<< [12] <exec> 18,642 us
>>> [13] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/Makefile'
<<< [13] <exec> 17,601 us
>>> [14] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/Makefile'
<<< [14] <exec> 17,785 us
>>> [15] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/boot1.c'
<<< [15] <exec> 18,320 us
>>> [16] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/boot_module.h'@
<<< [16] <exec> 12,060 us
>>> [17] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/boot_module.h'
<<< [17] <exec> 17,140 us
>>> [18] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/ufs_module.c'@
<<< [18] <exec> 12,310 us
>>> [19] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/ufs_module.c'
<<< [19] <exec> 17,255 us
>>> [20] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/zfs_module.c'@
<<< [20] <exec> 11,908 us
>>> [21] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/zfs_module.c'
<<< [21] <exec> 17,612 us
>>> [22] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/amd64/efibind.h'
<<< [22] <exec> 18,035 us
>>> [23] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/arm64/efibind.h'
<<< [23] <exec> 17,693 us
>>> [24] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/efilib.h'
<<< [24] <exec> 17,901 us
>>> [25] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/i386/efibind.h'
<<< [25] <exec> 18,216 us
>>> [26] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/libefi/handles.c'
<<< [26] <exec> 17,760 us
>>> [27] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/Makefile'
<<< [27] <exec> 17,577 us
>>> [28] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/conf.c'
<<< [28] <exec> 17,443 us
>>> [29] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/devicename.c'
<<< [29] <exec> 17,648 us
>>> [30] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/main.c'
<<< [30] <exec> 18,105 us
>>> [31] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/zfs/zfs.c'
<<< [31] <exec> 17,686 us
>>> [32] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/cddl/boot/zfs/lz4.c'
<<< [32] <exec> 17,967 us
Examining paths for linter 'python'.
Examining path 'sys/boot/common/self_reloc.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/efilib.h'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/conf.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/main.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/zfs/zfs.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Testing "include" rules.
  Path does not match include rule: (\.py$)
  Path does not match any include rules, discarding.
Found 0 matching paths for linter 'python'.
Examining paths for linter 'spelling'.
Examining path 'sys/boot/common/self_reloc.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/efilib.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/conf.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/main.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/zfs/zfs.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Found 18 matching paths for linter 'spelling'.
Examining paths for linter 'chmod'.
Examining path 'sys/boot/common/self_reloc.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/efilib.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/conf.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/main.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/zfs/zfs.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Found 18 matching paths for linter 'chmod'.
Examining paths for linter 'merge-conflict'.
Examining path 'sys/boot/common/self_reloc.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/efilib.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/conf.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/main.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/zfs/zfs.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Found 18 matching paths for linter 'merge-conflict'.
Examining paths for linter 'filename'.
Examining path 'sys/boot/common/self_reloc.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/efilib.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/Makefile'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/conf.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/efi/loader/main.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/boot/zfs/zfs.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Including path by default because there is no "include" rule.
  Testing global "exclude" rules.
  Path does not match global "exclude" rule: (contrib|crypto).
  Path matches.
Found 18 matching paths for linter 'filename'.
Examining paths for linter 'json'.
Examining path 'sys/boot/common/self_reloc.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/boot1.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/boot_module.h'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/ufs_module.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/boot1/zfs_module.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/amd64/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/arm64/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/efilib.h'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/include/i386/efibind.h'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/libefi/handles.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/Makefile'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/conf.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/devicename.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/efi/loader/main.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/boot/zfs/zfs.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Examining path 'sys/cddl/boot/zfs/lz4.c'...
  Testing "include" rules.
  Path does not match include rule: (\.arclint|\.json$)
  Path does not match any include rules, discarding.
Found 0 matching paths for linter 'json'.
>>> [33] <exec> $ which 'pep8'
<<< [33] <exec> 4,965 us
>>> [34] <lint> Filename <paths = 18>
<<< [34] <lint> 128 us
>>> [35] <lint> Merge Conflicts <paths = 18>
<<< [35] <lint> 8,486 us
>>> [36] <lint> Chmod <paths = 18>
<<< [36] <lint> 1,386 us
>>> [37] <lint> Spellchecker <paths = 18>
<<< [37] <lint> 299,351 us
>>> [38] <lint> Filename <paths = 18>
<<< [38] <lint> 66 us
>>> [39] <lint> Merge Conflicts <paths = 18>
<<< [39] <lint> 54 us
>>> [40] <lint> Chmod <paths = 18>
<<< [40] <lint> 52 us
>>> [41] <lint> Spellchecker <paths = 18>
<<< [41] <lint> 51 us
 LINT OKAY  No lint problems.
Running unit tests...
No unit test engine is configured for this project.
>>> [42] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/common/self_reloc.c'
>>> [43] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/common/self_reloc.c'@
>>> [44] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/Makefile'
>>> [45] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/Makefile'@
>>> [46] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/Makefile'
>>> [47] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/Makefile'@
>>> [48] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/boot1.c'
>>> [49] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/boot1.c'@
<<< [43] <exec> 20,429 us
>>> [50] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/boot_module.h'
<<< [42] <exec> 25,617 us
<<< [44] <exec> 22,382 us
<<< [45] <exec> 20,045 us
>>> [51] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/boot_module.h'@
<<< [47] <exec> 17,124 us
>>> [52] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/ufs_module.c'
<<< [46] <exec> 23,235 us
<<< [49] <exec> 16,278 us
>>> [53] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/ufs_module.c'@
>>> [54] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/boot1/zfs_module.c'
<<< [48] <exec> 26,384 us
<<< [51] <exec> 15,649 us
>>> [55] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/boot1/zfs_module.c'@
<<< [50] <exec> 22,264 us
>>> [56] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/amd64/efibind.h'
>>> [57] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/include/amd64/efibind.h'@
<<< [53] <exec> 17,752 us
>>> [58] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/arm64/efibind.h'
<<< [52] <exec> 24,185 us
>>> [59] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/include/arm64/efibind.h'@
<<< [55] <exec> 16,116 us
>>> [60] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/efilib.h'
<<< [54] <exec> 24,948 us
>>> [61] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/include/efilib.h'@
<<< [57] <exec> 17,951 us
>>> [62] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/include/i386/efibind.h'
<<< [56] <exec> 23,751 us
>>> [63] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/include/i386/efibind.h'@
<<< [58] <exec> 22,041 us
<<< [59] <exec> 18,848 us
>>> [64] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/libefi/handles.c'
>>> [65] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/libefi/handles.c'@
<<< [61] <exec> 17,397 us
>>> [66] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/Makefile'
<<< [60] <exec> 23,839 us
>>> [67] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/loader/Makefile'@
<<< [62] <exec> 22,037 us
<<< [63] <exec> 18,279 us
>>> [68] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/conf.c'
>>> [69] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/loader/conf.c'@
<<< [65] <exec> 17,908 us
>>> [70] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/devicename.c'
<<< [64] <exec> 23,781 us
>>> [71] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/loader/devicename.c'@
<<< [66] <exec> 21,621 us
<<< [67] <exec> 18,083 us
>>> [72] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/efi/loader/main.c'
>>> [73] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/efi/loader/main.c'@
<<< [69] <exec> 18,234 us
>>> [74] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/boot/zfs/zfs.c'
<<< [68] <exec> 23,790 us
>>> [75] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/boot/zfs/zfs.c'@
<<< [71] <exec> 17,955 us
>>> [76] <exec> $ svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 'sys/cddl/boot/zfs/lz4.c'
<<< [70] <exec> 24,740 us
>>> [77] <exec> $ svn info '/usr/home/smh/freebsd/base/head2/sys/cddl/boot/zfs/lz4.c'@
<<< [73] <exec> 18,321 us
<<< [72] <exec> 22,684 us
<<< [75] <exec> 15,517 us
<<< [74] <exec> 22,352 us
<<< [77] <exec> 16,014 us
<<< [76] <exec> 21,481 us
>>> [78] <exec> $ svn info .
<<< [78] <exec> 13,129 us
>>> [79] <conduit> repository.query() <bytes = 195>
>>> [80] <http> https://reviews.freebsd.org/api/repository.query
<<< [80] <http> 228,661 us
<<< [79] <conduit> 228,905 us
>>> [81] <conduit> differential.creatediff() <bytes = 175496>
>>> [82] <http> https://reviews.freebsd.org/api/differential.creatediff
<<< [82] <http> 1,261,748 us
<<< [81] <conduit> 1,261,980 us
>>> [83] <event> diff.wasCreated <listeners = 0>
<<< [83] <event> 61 us
 SKIP STAGING  Phabricator does not support staging areas for this repository.
>>> [84] <conduit> harbormaster.queryautotargets() <bytes = 288>
>>> [85] <http> https://reviews.freebsd.org/api/harbormaster.queryautotargets
<<< [85] <http> 352,876 us
<<< [84] <conduit> 353,073 us
>>> [86] <conduit> harbormaster.sendmessage() <bytes = 272>
>>> [87] <http> https://reviews.freebsd.org/api/harbormaster.sendmessage
>>> [88] <conduit> harbormaster.sendmessage() <bytes = 272>
>>> [89] <http> https://reviews.freebsd.org/api/harbormaster.sendmessage
<<< [87] <http> 241,719 us
<<< [86] <conduit> 252,599 us
<<< [89] <http> 776,997 us
<<< [88] <conduit> 777,171 us
>>> [90] <conduit> differential.updaterevision() <bytes = 1999>
>>> [91] <http> https://reviews.freebsd.org/api/differential.updaterevision
<<< [91] <http> 806,636 us
<<< [90] <conduit> 806,799 us
Updated an existing Differential revision:
        Revision URI: https://reviews.freebsd.org/D4515

Included changes:
  M       sys/boot/common/self_reloc.c
  M       sys/boot/efi/Makefile
  M       sys/boot/efi/boot1/Makefile
  M       sys/boot/efi/boot1/boot1.c
  A       sys/boot/efi/boot1/boot_module.h
  A       sys/boot/efi/boot1/ufs_module.c
  A       sys/boot/efi/boot1/zfs_module.c
  M       sys/boot/efi/include/amd64/efibind.h
  M       sys/boot/efi/include/arm64/efibind.h
  M       sys/boot/efi/include/efilib.h
  M       sys/boot/efi/include/i386/efibind.h
  M       sys/boot/efi/libefi/handles.c
  M       sys/boot/efi/loader/Makefile
  M       sys/boot/efi/loader/conf.c
  M       sys/boot/efi/loader/devicename.c
  M       sys/boot/efi/loader/main.c
  M       sys/boot/zfs/zfs.c
  M       sys/cddl/boot/zfs/lz4.c

Event Timeline

stevenh raised the priority of this task from to Needs Triage.
stevenh updated the task description. (Show Details)
stevenh changed the edit policy from "All Users" to "Custom Policy".
stevenh added a project: Bug Report.
stevenh added a subscriber: stevenh.

An example if this bug can be seen here: https://reviews.freebsd.org/differential/diff/11161/
The three added files should have contents.

Please see Contributing Bug Reports. Specifically, concise steps to reproduce and version of Phabricator are needed.

Yes, we can't help with this without better reproduction steps. In particular, I can't reproduce this. Here's what I did:

  • I added a new file to a Subversion repository:
epriestley@orbital ~/dev/scratch/svn-test $ svn st
A       new-file
epriestley@orbital ~/dev/scratch/svn-test $ cat new-file 
apple
banana
cherry
  • I created a diff with arc diff --create:
epriestley@orbital ~/dev/scratch/svn-test $ arc diff --create --conduit-uri=https://secure.phabricator.com/
...
Created a new Differential revision:
        Revision URI: https://secure.phabricator.com/D14750

Included changes:
  A       new-file

This worked correctly, and the revision properly reflects the file content (see D14750 for the result).

I think the problem is because of Subversion automatic properties. For the FreeBSD Subversion repository, automatic properties get added, like this:

Index: foo.txt
===================================================================
--- foo.txt	(nonexistent)
+++ foo.txt	(working copy)
@@ -0,0 +1 @@
+foo

Property changes on: foo.txt
___________________________________________________________________
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

epriestly, if you retry adding a file, but add some properties, say svn:eol-style, and then create a diff, maybe you can then reproduce the problem?

Btw, I would be glad to specify the Phabricator version, but I can't see it from the web UI at https://reviews.freebsd.org/. Any idea where the version may be found? (The "Contributing Bug Reports" document referenced above talks about a Config -> Versions menu item, but I don't see that. Maybe it is an admin-only option?)

Adding Eitan, since he's our Phabricator wrangler.

I added some properties:

epriestley@orbital ~/dev/scratch/svn-test $ svn status
A       new-file
epriestley@orbital ~/dev/scratch/svn-test $ svn diff
Index: new-file
===================================================================
--- new-file	(revision 0)
+++ new-file	(working copy)
@@ -0,0 +1,3 @@
+apple
+banana
+cherry

Property changes on: new-file
___________________________________________________________________
Added: some-property
## -0,0 +1 ##
+some-value
Added: svn:keywords
## -0,0 +1 ##
+FreeBSD=%H
\ No newline at end of property

Then I created a diff:

$ arc diff --create --conduit-uri=https://secure.phabricator.com/
...
Created a new Differential revision:
        Revision URI: https://secure.phabricator.com/D14751

Included changes:
  A       new-file

Everything worked fine:

Screen Shot 2015-12-12 at 4.14.36 AM.png (371×1 px, 37 KB)

See D14751.

Hmm, this seems to be caused by Subversion 1.9 (which is the default in the FreeBSD ports collection). If I use Subversion 1.8 to run the svn diff --depth empty --diff-cmd '/usr/local/lib/php/arcanist/scripts/repository/binary_safe_diff.sh' -x -U32767 foo.txt command, the output is:

Index: foo.txt
===================================================================
--- foo.txt	(revision 0)
+++ foo.txt	(working copy)
@@ -0,0 +1 @@
+foo

Property changes on: foo.txt
___________________________________________________________________
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

Whereas with Subversion 1.9, the output of exactly the same command results in:

Index: foo.txt
===================================================================
--- foo.txt	(nonexistent)
+++ foo.txt	(working copy)
@@ -0,0 +1 @@
+foo
Index: foo.txt
===================================================================
--- foo.txt	(nonexistent)
+++ foo.txt	(working copy)

Property changes on: foo.txt
___________________________________________________________________
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

I'm unsure why this occurs though. If I use svn diff --depth empty -diff-cmd /usr/bin/diff -x -U32767 foo.txt, the output does not show the doubled content:

Index: foo.txt
===================================================================
--- foo.txt	(nonexistent)
+++ foo.txt	(working copy)
@@ -0,0 +1 @@
+foo

Property changes on: foo.txt
___________________________________________________________________
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

So now it looks more like a Subversion 1.9 bug. As if we didn't have enough of those. :-(

Can you show me the output of arc version?

T5555 and D9921 are earlier similar interactions, where file content could be doubled with newly added directories.

The test case from D9921 does not have properties, and shows doubled content. It's possible that the behavior of SVN is:

  • if there are no property changes, print the content of the file twice;
  • if there are property changes, print the content of the file once, then the properties of the file separately.

If that's true, we need to adjust the behavior of D9921 to merge the duplicate diffs instead of dropping the first one.

(Or I could be on the wrong track here and these behaviors might not actually be related, or might not be related in the way I hypothesize.)

For me this gives:

$ arc version
php5-arcanist 20150626_2 (devel/arcanist)
php5-libphutil 20150626 (devel/libphutil)

It appears to be the latest version in the FreeBSD ports collection. (But I assume it is old by now :-).

Yes, 6 months is a huge amount of time in the scale of arc, although that version is probably new enough to have D9921 (although I don't know if July 26 is the changes it actually includes, or just the date someone might have published some earlier version, and have no idea what _2 means).

Right, I think I have found the cause. The binary_safe_diff.sh does not preserve the exit code of diff, and it returns 0 even if diff returned 1. Apparently returning 0 causes Subversion 1.9 to emit the file headers again.

For example, if I create script difftest.sh with this in it:

#!/bin/sh
diff "$@"
exit 0

And run svn diff --depth empty --diff-cmd ./difftest.sh -x -U32767 foo.txt, the result is this:

Index: foo.txt
===================================================================
--- foo.txt (nonexistent)
+++ foo.txt (working copy)
@@ -0,0 +1 @@
+foo
Index: foo.txt
===================================================================
--- foo.txt (nonexistent)
+++ foo.txt (working copy)

Property changes on: foo.txt
___________________________________________________________________
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

If I change the exit 0 line to exit 1, the result of svn diff --depth empty --diff-cmd ./difftest.sh -x -U32767 foo.txt becomes this instead:

Index: foo.txt
===================================================================
--- foo.txt (nonexistent)
+++ foo.txt (working copy)
@@ -0,0 +1 @@
+foo

Property changes on: foo.txt
___________________________________________________________________
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

I created D14755 with a simple fix in it.

I also tested on latest arc version no change:
/data/arc/arcanist/bin/arc version
arcanist dae2f0073f019221839924b4b1431c6cba5dcdda (10 Dec 2015)
libphutil 230c3e161c9ad7ee920d003b53e7c4a473a46207 (7 Dec 2015)

Thanks for digging into this! That explanation makes SVN's behavior a lot more reasonable.

@stevenh, D14755 is now in HEAD -- can you verify that it fixed the issue for you?