C. Michael Pilato wrote on Thu, Nov 18, 2010 at 09:09:57 -0500: > On 11/18/2010 09:02 AM, C. Michael Pilato wrote: > > On 11/18/2010 08:43 AM, Daniel Shahaf wrote: > >> Yes, that's what I meant, but I see that Philip already committed a fix. > >> > >> Question to FS people: > >> > >> Is the svn_fs_history_location(svn_fs_history_prev()) approach > >> equivalent to the svn_fs_copied_from() approach? > > > > No. > > > > svn_fs_copied_from() will only return information about copies when you ask > > it of the actual copy target. > > > > svn_fs_history_prev() will traverse history thru copies for any subtree of > > the copy. > > > > For example, in our Greek tree, if r2 is a move of '/A' to '/Z', then: > > > > svn_fs_copied_from('/Z', r2) = '/A', r1 > > > > svn_fs_copied_from('/Z/B/E/alpha', r2) = NULL, SVN_INVALID_REVNUM > > > > but: > > > > svn_fs_history_prev('/Z', r2) = '/A', r1 > > > > svn_fs_history_prev('/Z/B/E/alpha', r2) = '/A/B/E/alpha', r1 >
Okay. > Another subtlety. Say some other change is committed in our under '/Z' in > r3 (but not to '/Z/B/E/alpha'): > > svn_fs_copied_from('/Z', r3) = NULL, SVN_INVALID_REVNUM > svn_fs_copied_from('/Z/B/E/alpha', r3) = NULL, SVN_INVALID_REVNUM > > svn_fs_history_prev('/Z', r3) = '/Z', r2 > svn_fs_history_prev('/Z/B/E/alpha', r3) = '/Z/B/E/alpha', r2 > Wouldn't the results of the above four calls be the same regardless of whether or not r3 touched /Z/B/E/alpha? > Notice that svn_fs_copied_from() doesn't see the copy because the > node-revision for /z...@3 was not the exact target of a copy. > Understood. > Notice also that svn_fs_history_prev() doesn't return information about the > copy source either, because the previous "interesting history location" is > the copy itself. > Okay; in other words, svn_fs_history_prev() considers a path-revision which are the *result* of a copy operation an "interesting" location. (So the first call will return the copy target, /z...@2, and only the next call will return /a...@rn with N<2.) > Another nuance not demonstrated by my simple example is that > svn_fs_history_prev() might not really return "the copy source", even when > you query the exact copy target. Why? Because the source of the copy might > not be an "interesting history location". Maybe you did 'svn copy > ^/tr...@20 ^/branches/branch' (creating r21), but prior to your commit, the > last time ^/trunk changed was r10. svn_fs_history_prev('^/branches/branch', > r21) will return '^/trunk', r10, *not* '^/trunk', r20. > Okay; in other words, "being copied to" isn't a "interesting" history location. >From this I understand that, if r20 did not touch '^/trunk', then the two calls: svn_fs_history_prev('^/branches/branch', r21) svn_fs_history_prev('^/trunk', r20) will behave identically. On the other hand, in your example, I expect that svn_fs_copied_from() will return /tr...@20? (not because you said so, but because I expect /something/ to return /tr...@20) > Confused yet? > I believe that I am not confused. > -- > C. Michael Pilato <cmpil...@collab.net> > CollabNet <> www.collab.net <> Distributed Development On Demand > Thank you very much for the thorough explanations. :-) Daniel