There is some wrong code in libsvn_client/externals.c:switch_file_external which
does
else
{
svn_node_kind_t disk_kind;
SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
if (kind == svn_node_file || kind == svn_node_dir)
return svn_error_createf(SVN_ERR_WC_PATH_FOUND, NULL,
_("The file external '%s' can not be "
"created because the node exists."),
svn_dirent_local_style(local_abspath,
scratch_pool));
}
We get disk kind but don't use it. This is triggered by an unversioned file
obstructing an incoming file external:
svnadmin create repo
svn -mm import repo/format file://`pwd`/repo/A/f
svnmucc -mm propset svn:externals '^/A/f g' file://`pwd`/repo/A
svn co file://`pwd`/repo@1 wc
echo g > wc/A/g
svn up wc
At present this update shows a tree conflict for A/g but doesn't record it, and
A/g contents are not updated:
$ svn up wc
Updating 'wc':
U wc/A
Fetching external item into 'wc/A/g':
A wc/A/g
Updated external to revision 2.
At revision 2.
$ svn st wc
M X wc/A/g
If we change the code to use disk kind then the external is skipped, and A/g
remains unversioned. However a subsequent no-op update to the same revision will
not skip and do the notification/non-recording.
It's not clear to me what the behaviour should be, I'll commit a test with the
current behaviour.