I'm pretty sure "valid" in this sense means "passes the SVN)_IS_VALID_REVNUM(rev) check", not "points to a known-good revision at which PATH existed".
On 03/02/2012 09:55 AM, Ruhe Julian wrote: > > Hi Michael, > > > > I used client calls only because I am a user of svn not a dev. I did not > want to modify any svn client code for my purposes. If you can access more > suitable API calls for a solution of the problem the better. But I doubt > from what I see in the signature of svn_ra_get_deleted_rev() that it is of > much use. The method expects a valid end_revision and this is something > you do not have initially. Imagine the object1 one existing in –r1:n and > deleted in n+1 (HEAD) and object two existing in –r1:2 only with HEAD at > n+1 as well. In both cases you need an educated guess for end_revision to > get an useful answaer an not an exception. > > > > *Von:*C. Michael Pilato [mailto:cmpil...@collab.net] > *Gesendet:* Freitag, 2. März 2012 15:32 > *An:* Ruhe Julian > *Cc:* dev@subversion.apache.org > *Betreff:* Re: Suggestion for: "Improve svn log with 'forward' revision > range" (Issue 3830) > > > > 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> <mailto:cmpil...@collab.net> > CollabNet <> www.collab.net <http://www.collab.net> <> Distributed > Development On Demand -- C. Michael Pilato <cmpil...@collab.net> CollabNet <> www.collab.net <> Distributed Development On Demand
signature.asc
Description: OpenPGP digital signature