How we will extend ra_dav/mod_dav_svn protocol for locking feature ================================================================== RA->lock() * send http LOCK request with 2 custom headers: - force flag - working-revnum (for OOD check) * mod_dav_svn should call authz_read func on path, if it exists. * generate http LOCK response, which includes standard body that describes almost all the svn_lock_t fields. - add one custom response header: creation-date * what if older server? just returns '405 Method not Allowed'. RA->unlock() * send http UNLOCK request with 1 custom header: - force flag * mod_dav_svn should call authz_read func on path, if it exists. * generate http UNLOCK response: success == "204 no content" * what if older server? just returns '405 Method not Allowed'. ---- RA->get_lock() * do a depth-0 PROPFIND for DAV:lockdiscovery property * mod_dav_svn should call authz_read func on path, if it exists. * response is the same as what comes back in a LOCK response -- a standard property value that describes almost all the svn_lock_t fields. - add one custom response header: X-SVN-creation-date * what if older server? just returns '404 Not Found'. RA->get_locks() * custom REPORT request. * mod_dav_svn should call svn_repos_fs_get_locks(), because it automatically uses the authz_read func to screen out paths. * custom response. * what if older server? return some sort of 4XX response and error indicating the report-type is unknown. *** NOTE: a dumb client can achieve the exact same effect by doing a depth-infinity PROPFIND for the 'DAV:lockdiscovery' property. But this causes mod_dav_svn to do an O(N) traversal of the repository, running svn_fs_get_lock() on each path! Much, *much* slower than allowing fs_get_locks() to do a partial-key database lookup! RA->get_commit_editor2() * stash the incoming hash of tokens. * every time we do a CHECKOUT, PUT, COPY, DELETE, PROPPATCH of a file path, look to see if there's a token available in the hash. If so, put it in the If: header of the request. * send *all* tokens in the If: header of the final MERGE request. -- also send either a new XML body element, or custom header, indicating whether to 'keep_locks' or not. * what if older server? meaningless. why would you have the tokens in the first place. And anyway, the If: tokens will be ignored anyway if the server isn't paying attention to locking.