> URL: http://svn.apache.org/r1446169
> Log:
> Following up on r1446118, make the knowledge whether reversed obtaining of
> file revisions is available visible by adding an ra capability.
> 
> This to allow a future blame improvement to decide whether it can use an
> improved algorithm instead of the current one without waiting for an error
> on old servers.

Nice.

A few questions.

When you first added this "reverse order" functionality in 
<http://svn.apache.org/r1445973>, you documented for svn_ra_get_file_revs2() 
and svn_repos_get_file_revs2():

+ * On subversion 1.8 and newer servers this function has been enabled
+ * to support reversion of the revision range for @a include_merged_revision
+ * @c FALSE reporting by switching  @a end with @a start.

Is that still the case or do those functions now support a backwards range with 
merged revisions included?

Reference the capability string in those doc strings.

There's still a big comment on the definition (rather than declaration) of 
svn_repos_get_file_revs2() which says reverse ranges are not supported; that 
should go away or be updated.

For testing, in r1445973:

* subversion/tests/libsvn_repos/repos-test.c
  (test_get_file_revs): Extend test to also walk the revisions backwards.

Would it be true to say that the results of a reverse range should always be 
the reversal of the results from the equivalent forward range?  If so, that 
would be a useful test.  The current test doesn't appear to verify that the 
results are in any particular order.

More below...

> * subversion/include/svn_dav.h
>   (SVN_DAV_NS_DAV_SVN_ATOMIC_REVPROPS): Move new in 1.7 define below one that
>     exists in 1.6.
>   (SVN_DAV_NS_DAV_SVN_INHERITED_PROPS): Mark new in 1.8.
>   (SVN_DAV_NS_DAV_SVN_EPHEMERAL_TXNPROPS): Mark new in 1.8.
>   (SVN_DAV_NS_DAV_SVN_INLINE_PROPS): Mark new in 1.8.
>   (SVN_DAV_NS_DAV_SVN_GET_FILE_REVS_REVERSE): New macro.
> 
> * subversion/include/svn_ra.h
>   (SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE): New macro.
> 
> * subversion/include/svn_ra_svn.h
>   (SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE): New macro.
> 
> * subversion/libsvn_ra_local/ra_plugin.c
>   (svn_ra_local__has_capability): Declare support for reversed file
>     revisions *and* ephemeral txnprops.

That's an unrelated change, fixing ra-local to advertise ephemeral txnprops.  
That's worth drawing attention to, as it indicates we aren't testing that 
feature.  (It would have been better as a separate commit.)

> * subversion/libsvn_ra_serf/options.c
>   (capabilities_headers_iterator_callback): Forward
>     SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE support.
> 
> * subversion/libsvn_ra_svn/client.c
>   (ra_svn_has_capability): Make function table driven. Add
>      SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE support.
> 
> * subversion/mod_dav_svn/version.c
>   (get_vsn_options): Write SVN_DAV_NS_DAV_SVN_GET_FILE_REVS_REVERSE.
> 
> * subversion/svnserve/serve.c
>   (serve): Send SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE support.


> +/**
> + * The capability of a server to walk revisions backwards in
> + * svn_ra_get_file_revs2

Doxygen will make this a hyperlink if you add '()' after the function name.

> + *
> + * @since New in 1.8.
> + */
> +#define SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE "get-file-revs-reversed"

> +/** Presence of this in a DAV header in an OPTIONS response indicates
> + * that the transmitter (in this case, the server) knows how to handle
> + * a reversed fetch of file versions.
> + * @since New in 1.8. */
> +#define SVN_DAV_NS_DAV_SVN_GET_FILE_REVS_REVERSE\
> +            SVN_DAV_PROP_NS_DAV "svn/get-file-revs-rvrs"

> +/* maps to SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE */
> +#define SVN_RA_SVN_CAP_GET_FILE_REVS_REVERSE "file-revs-reverse"

Would it be useful to refer to the relevant DAV/svnserve API functions from 
these two doc strings?

In the doc string of svn_ra_get_file_revs2(), detail what the presence or 
absence of this capability really means to a caller.  Something like:

[[[
    With a forward range, svn_ra_get_file_revs2() calculates the list
    of revisions before starting to send them to the caller.

    When a backward range is requested, with the 'reverse' capability
    (#SVN_RA_CAPABILITY_GET_FILE_REVS_REVERSE) svn_ra_get_file_revs2()
    returns the revisions streamily in backward order, but a request
    for merged revisions throws an error; without the capability, it
    either throws an error or returns an incomplete result.
]]]

- Julian

Reply via email to