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@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@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@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@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@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@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 <cmpil...@collab.net> CollabNet <> www.collab.net <> Distributed Development On Demand
signature.asc
Description: OpenPGP digital signature