Hello!
I've found a potential bug in
svn_wc__db_wcroot_parse_local_abspath
function.
Suppose the following directories structure:
working_copy_root
|
+----nested_working_copy_root
+----not_versioned_symlink
Suppose also that not_versioned_symlink points to "nested_working_copy_root".
I want to find the working copy root to which "not_versioned_symlink" belongs,
so I call
"svn_wc__db_wcroot_parse_local_abspath" with a path to "not_versioned_symlink".
There're 2 options.
1. if the cache (db->dir_data in this function) is empty the function will
check the symlink's
parent (i.e. "working_copy_root") and will call "svn_wc__db_read_info_internal"
on it,
so that "retry_if_dir" variable will be set to TRUE,
and "not_versioned_symlink" will be eventually found as working copy root
(because it points to a
working copy root).
2. But if the cache already contains a record about "working_copy_root", the
function will check the
symlink's parent (i.e. "working_copy_root"), discover it in the cache, and
hence return
"working_copy_root" as a resulting root.
So the function depends on the cache contents.
The only reason why "svn add" find the correct (in the context of addition)
root (i.e.
"working_copy_root") is that a record about "working_copy_root" gets into the
cache while obtaining
a lock on "working_copy_root", so it's just a luck. And btw "svn info
not_versioned_symlink" thinks
that "not_versioned_symlink" itself is a working copy, not "working_copy_root".
The question is what's the expected working copy root should this function
return on this example?
To my opinion, it should return "not_versioned_symlink" without regarding the
cache contents,
because the most of the commands (except "svn add") expect this behaviour. For
"svn add" there
should be another code that processes symlink case separatedly.
Unfortunately I can't provide a reproducing code now, but I hope the
algorithm's authors will easily
understand what I am writing about.