Philip Martin <phi...@codematters.co.uk> writes:

> We already have system for handling create-txn and create-txn-with-props
> so I was thinking of extending that code:
>
> Index: subversion/mod_dav_svn/version.c
> ===================================================================
> --- subversion/mod_dav_svn/version.c    (revision 1820704)
> +++ subversion/mod_dav_svn/version.c    (working copy)
> @@ -152,9 +152,6 @@ get_vsn_options(apr_pool_t *p, apr_text_header *ph
>    apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_INHERITED_PROPS);
>    apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_INLINE_PROPS);
>    apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_REVERSE_FILE_REVS);
> -  apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_SVNDIFF1);
> -  apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_SVNDIFF2);
> -  apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_PUT_RESULT_CHECKSUM);
>    apr_text_append(p, phdr, SVN_DAV_NS_DAV_SVN_LIST);
>    /* Mergeinfo is a special case: here we merely say that the server
>     * knows how to handle mergeinfo -- whether the repository does too
> @@ -297,6 +294,19 @@ get_option(const dav_resource *resource,
>          { "create-txn-with-props",  { 1, 8, 0, "" } },
>        };
>
> +      /* These capabilities are used during commit and when acting as
> +         a WebDAV slave (SVNMasterURI) their availablity depends on
> +         the master version (SVNMasterVersion) rather than our own
> +         (slave) version. */
> +      struct capability_versions_t {
> +        const char *capability_name;
> +        svn_version_t min_version;
> +      } capabilities[] = {
> +        { SVN_DAV_NS_DAV_SVN_SVNDIFF1, { 1, 7, 0, ""} },
> +        { SVN_DAV_NS_DAV_SVN_SVNDIFF2, { 1, 10, 0, ""} },
> +        { SVN_DAV_NS_DAV_SVN_PUT_RESULT_CHECKSUM, { 1, 10, 0, ""} },
> +      };

I would be fine with this approach as well, but perhaps with a few tweaks:

 - I think that it would be better to handle all four capabilities that
   relate to proxied writes in the same place:

     SVN_DAV_NS_DAV_SVN_EPHEMERAL_TXNPROPS
     SVN_DAV_NS_DAV_SVN_SVNDIFF1
     SVN_DAV_NS_DAV_SVN_SVNDIFF2
     SVN_DAV_NS_DAV_SVN_PUT_RESULT_CHECKSUM

   Otherwise, the handling becomes asymmetric, as the first of them is still
   checked using the separate dav_svn__check_ephemeral_txnprops_support()
   function, but the three new capabilities are checked using the new array-
   based approach.

 - The SVN_DAV_NS_DAV_SVN_SVNDIFF1 capability should probably be
   bound to version 1.10 instead of 1.7.

   The reason for that is that mod_dav_svn didn't properly advertise
   svndiff1 support with this specific header until 1.10, and I think
   that we should have the same behavior for the setups with a write-
   through proxy.

   (Even though mod_dav_svn has been able to parse it for a long time,
    currently ra_serf avoids sending svndiff1 to servers that don't
    advertise it with this specific header, as there might be third-party
    implementations of the Subversion's HTTP protocol that can only
    parse svndiff0).


Thanks,
Evgeny Kotkov

Reply via email to