Doing this inside our client code would be significantly easier, because
that code has access to the svn_ra_get_deleted_rev() API.
/**
* Given @a path at revision @a peg_revision, set @a *revision_deleted to the
* revision @a path was first deleted, within the inclusive revision range
* defined by @a peg_revision and @a end_revision. @a path is relative
* to the URL in @a session.
*
* If @a path does not exist at @a peg_revision or was not deleted within
* the specified range, then set @a *revision_deleted to @c SVN_INVALID_REVNUM.
* If @a peg_revision or @a end_revision are invalid or if @a peg_revision is
* greater than @a end_revision, then return @c SVN_ERR_CLIENT_BAD_REVISION.
*
* Use @a pool for all allocations.
*
* @since New in 1.6.
*/
svn_error_t *
svn_ra_get_deleted_rev(svn_ra_session_t *session,
const char *path,
svn_revnum_t peg_revision,
svn_revnum_t end_revision,
svn_revnum_t *revision_deleted,
apr_pool_t *pool);
On 03/02/2012 09:04 AM, Ruhe Julian wrote:
>
> Hi,
>
>
>
> Stefan Sperling asked me to post some details in respect of a suggestion I
> wanted to make for issue 3830
>
> http://subversion.tigris.org/issues/show_bug.cgi?id=3830
>
>
>
> It took me some time to understand that it is _/not/_ possible for the svn
> client to display the future of an object in some revision when it no
> longer resists on the initial path or was replaced by another object on
> the same path.
>
> Well, here is the pseudo code of my algorithm to determine the forward
> history & backward history of a svn path_at_peg in logarithmic time (it
> should terminate quickly in most real world situations):
>
>
>
> log[] getFullRemoteLog(urlOfObject, revOfObject)
>
> url = urlOfObject
>
> peg = revOfObject
>
> // start to fetch complete forward & backward log of url_at_peg
>
> endRev = repsitory.getLastChangedRevision()
>
> try
>
> // first try the regular way
>
>
>
> // using HEAD instead of HEAD’s rev number
> as endRev produces wrong results in svn 1.6.
>
> // see
> http://subversion.tigris.org/issues/show_bug.cgi?id=3931
>
> return svn log url_at_peg -r endRev:1
>
> catch exception
>
> // OK, no problem. Remote file does no
> longer exist on HEAD. Proceed.
>
>
>
> startRev = peg
>
> youngestRev = determineYoungestRevision(url,
> startRev.number(), endRev.number(), false)
>
> return svn log url_at_peg -r youngestRev:1
>
>
>
> rev determineYoungestRevision(url, startRev, endRev, objectFound)
>
> if startRev == endRev
>
> return startRev
>
>
>
> testRev = startRev + (endRev - startRev) / 2
>
> if objectFound
>
> try
>
> svn info url_at_testRev -r
> startRev
>
> // test revision exists =>
> proceed forward in history
>
>
> determineYoungestRevision(url, testRev, endRev, true)
>
> catch exception
>
> // test revision does not
> exist => go backward in history
>
>
> determineYoungestRevision(url, startRev, testRev - 1 , true)
>
>
>
> // right object not yet found
>
> try
>
> log[] = svn log url_at_testRev -r testRev:1
>
> // object hit! But is it the right one?
>
> for i:log.length // no need to improve as
> svn requests dominate Running time
>
> if log[i -
> 1].getRevision() >= startRev && log[i].getRevision() <= startRev
>
> // right
> object found! Now find youngest object revision.
>
> return
> determineYoungestRevision(url, log[0].getRevision(), endRev, true)
>
> // not the right object!
>
> return determineYoungestRevision(url,
> startRev, log[log.length - 1].getRevision() - 2, false)
>
> catch exception
>
> // no object hit!
>
> return determineLastYoungestRevision(url,
> startRev, testRev.getNumber() - 1, false)
>
>
>
> Greetings,
> Julian
>
> p.s. please cc me. I am not subscribed
>
--
C. Michael Pilato <cmpilato_at_collab.net>
CollabNet <> www.collab.net <> Distributed Development On Demand
Received on 2012-03-02 15:32:54 CET