- Have extracted only the ra_dav part of the patch (for ease of
review ) and fixed the factorizations.
- Also attached are design files that help understand the patch.
- I have tested this with a test case on all three protocols ( the
test currently passes only over ra_dav )
[[[
Partial fix for Issue #443: post-commit hook script (error) output
lost.
Includes post-commit hook stderr propagation for ra_dav
Does not include post-commit hook stderr propagation for ra_local
and ra_svn.
Does not include the pre-revprop-change fix.
* subversion/libsvn_ra/ra_loader.c
(svn_ra_find_protocol): New API to find out which
schema/protocol
would be used, given a URL.
(svn_ra_get_commit_editor2): New version of the API to use
the new commit_editor function and hence use the new callback.
* subversion/libsvn_ra/ra_loader.h
(svn_ra__vtable_t): Added comments for get_commit_editor and
intoduced a new member get_commit_editor2 which now uses the
svn_commit_callback2_t.
* subversion/include/svn_repos.h
(svn_repos_get_commit_editor3): New API to accomodate the
svn_commit_callback2_t callback type.
* subversion/include/svn_types.h
(svn_commit_callback2_t): Ah, the core change. A callback that
takes the post_commit_err parameter.
* subversion/include/svn_client.h
(svn_client_commit_info2_t): The structure that carries the
commit success parameters now has to carry the post_commit_err
too.
(svn_client_mkdir): mkdir should now use the new structure -
svn_client_commit_info2_t.
(svn_client_delete): delete should now use the new structure -
svn_client_commit_info2_t.
(svn_client_commit3): New API that uses
svn_client_commit_info2_t.
(svn_client_copy2): New API that uses svn_client_commit_info2_t.
* subversion/include/svn_ra.h
(svn_ra_find_protocol): New API declaration added.
(svn_ra_get_commit_editor2): New API that uses the new callback.
* subversion/libsvn_ra_local/ra_plugin.c
(ra_local_vtable): ra_local's vtable does NOT have callback2.
* subversion/libsvn_client/delete.c
(delete_urls): delete_urls now uses the
svn_client_commit_info2_t structure.
Call svn_ra_get_commit_editor2() if ra_dav.
Call svn_ra_get_commit_editor() otherwise.
(svn_client_delete): svn_client_delete should now use
svn_client_commit_info2_t.
* subversion/libsvn_client/client.h
(svn_client__commit_get_baton): Should now use the new commit
info structrure - svn_client_commit_info2_t.
(svn_client__commit_callback2): New callback that now takes
post_commit_err as one of its parameters.
* subversion/libsvn_client/copy.c
(repos_to_repos_copy): Now uses the svn_client_commit_info2_t
structure.
Call svn_ra_get_commit_editor2() if ra_dav.
Call svn_ra_get_commit_editor() otherwise.
(wc_to_repos_copy): Now uses the svn_client_commit_info2_t
structure.
Call svn_ra_get_commit_editor2() if ra_dav.
Call svn_ra_get_commit_editor() otherwise.
(setup_copy): Now uses svn_client_commit_info2_t.
(svn_client_copy2): New version of API that takes a
svn_client_commit_info2_t for commit_info.
(svn_client_move3): New version of API that takes a
svn_client_commit_info2_t for commit_info.
* subversion/libsvn_client/commit_util.c
(commit_baton): Now uses svn_client_commit_info2_t.
(svn_client__commit_get_baton): Now uses
svn_client_commit_info2_t.
(svn_client__commit_callback2): This callback function
fills the svn_client_commit_info2_t structure with the
post_commit_err, if any.
* subversion/libsvn_client/add.c
(mkdir_urls): Now uses svn_client_commit_info2_t.
Calls svn_ra_get_commit_editor2() if ra_dav.
Calls svn_ra_get_commit_editor() otherwise.
(svn_client_mkdir): Now uses svn_client_commit_info2_t.
* subversion/libsvn_client/commit.c
(get_ra_editor): Now uses svn_client_commit_info2_t.
Calls svn_ra_get_commit_editor2() if ra_dav.
Calls svn_ra_get_commit_editor() otherwise.
(svn_client_import2): get_ra_editor now passed typecasted
commit_info.
(svn_client_commit3): New version of API that uses
svn_client_commit_info2_t.
(svn_client_commit2): A svn_client_commit_info2_t is allocated
and passed back as svn_client_commit_info_t. This doesn't matter
as svn_client_commit_info2_t is one member more than
svn_client_commit_info_t.
* subversion/mod_dav_svn/merge.c
(#include): Included svn_xml.h
(dav_svn__merge_response): Now takes an extra post_commit_err
parameter. If the post_commit_err is available,
- Adds the SVN namespace
- post-commit-err element to hold the post_commit_err
to the merge response.
* subversion/mod_dav_svn/dav_svn.h
(dav_svn__merge_response): Now takes a new post_commit_err
parameter.
* subversion/mod_dav_svn/version.c
(dav_svn_merge): If post-commit hook returns an error,
pass it along to dav_svn__merge_response.
* subversion/clients/cmdline/cl.h
(svn_cl__print_commit_info2): Declaration for the new function
that ultimately prints out the post-commit hook's stderr to
the user.
* subversion/clients/cmdline/mkdir-cmd.c
(svn_cl__mkdir): Now uses svn_client_commit_info2_t and
svn_cl__print_commit_info2.
* subversion/clients/cmdline/move-cmd.c
(svn_cl__move): Now uses svn_client_commit_info2_t and
svn_cl__print_commit_info2.
* subversion/clients/cmdline/copy-cmd.c
(svn_cl__copy): Now uses svn_client_commit_info2_t and
svn_cl__print_commit_info2.
* subversion/clients/cmdline/util.c
(svn_cl__print_commit_info2): Home at last!!! New version of
API.
svn_cl__print_commit_info2 is the function that ultimately
prints out the post_commit_error to the user.
* subversion/clients/cmdline/commit-cmd.c
(svn_cl__commit): Now uses svn_client_commit_info2_t and
svn_cl__print_commit_info2 for callback.
* subversion/clients/cmdline/delete-cmd.c
(svn_cl__delete): Now uses svn_client_commit_info2_t and
svn_cl__print_commit_info2 for callback.
* subversion/tests/clients/cmdline/commit_tests.py
(post_commit_hook_test): New function to test the post-commit
hook's propogation of stderr to the client.
(test_list): Added post_commit_hook_test to list of tests.
* subversion/libsvn_repos/hooks.c
(svn_repos__hooks_post_commit): Now runs the post-commit hook
with the read_errstream parameter as TRUE.
* subversion/libsvn_repos/commit.c
(edit_baton): Added new member - callback2, to hold a callback
of type svn_commit_callback2_t. Also added comments that
callback
should be removed once all code uses callback2.
(close_edit): Handles the post-commit stderr. Decides whether
to use the callback or the callback2 member of the edit baton.
(svn_repos_get_commit_editor3): Uses svn_commit_callback2_t for
callback type, and fills callback2 of the edit baton.
(svn_repos_get_commit_editor2): Still uses svn_commit_callback_t
and fills the callback member of the edit baton.
* subversion/libsvn_ra_svn/client.c
(ra_svn_vtable): ra_svn's vtable doesnt have a
get_commit_editor2 member.
* subversion/libsvn_ra_dav/merge.c
(merge_elements): Added the post-commit-err element.
(merge_ctx_t): Added the post_commit_err member.
(validate_element): Make ELEM_post_commit_err a valid element.
(end_element): Add case, and handle ELEM_post_commit_err.
(svn_ra_dav__merge_activity2): New merge function to handle
post-commit hook's stderr.
* subversion/libsvn_ra_dav/ra_dav.h
(svn_ra_dav__get_commit_editor2): New version of API, using
svn_commit_callback2_t.
(enum): Added ELEM_post_commit_err member.
(svn_ra_dav__merge_activity2): Declaration for new version of
API.
* subversion/libsvn_ra_dav/session.c
(dav_vtable): Now contains a get_commit_editor2 function, but no
get_commit_editor function.
* subversion/libsvn_ra_dav/commit.c
(commit_ctx_t): Added the callback2 member.
(commit_close_edit): Now uses te svn_ra_dav__merge_activity2
function.
(svn_ra_dav__get_commit_editor2): Now fills the callback2 member
(svn_ra_dav__get_commit_editor): Still fills the callback member
]]]
READING GUIDE :
- Please follow the sequence numbers to examine control flow
- The server side sequence is preceeded with a 'S'
- Detailed explanation is present in the accompanying doc 443.flow.txt
+------------------------------------------------+
| Code flow for following patch for issue #443 |
+------------------------------------------------+
Client Side
-----------
0.svn_client_commit3()
6. | +---> svn_cl__print_commit_info2
| |(use svn_client_commit_info2_t (X) )
| |
V ^ libsvn_client
+---------------------------------------------------+
| 1.svn_ra_open.......................... |
| 2.svn_ra_get_commit_editor2 \ |
| +-------------------------+ . |
| | +---------------------+ | . |
| | | X--->callback_baton | | . |
| | +---------------------+ | . |
| | | | . |
| | V | . |
| | edit_baton | . |
| +-------------------------+ . |
| - . |
| - . |
| 3.vtable->close_edit . |
| . . |
| . . |
| . 5.callback() . |
| . ^ . |
| . . . |
| . . . |
+-----------.--------------.-------------.----------+
. . .
----------------.--------------.-------------.--------------------------
. libsvn_ra . . client accesses ra_dav, ra_local
----------------.--------------.-------------.-------------------------- and ra_svn via libsvn_ra.
.libsvn_ra_dav . .
-----+ +-----.--------------.-------------.----------------+ +----- dav_vtable is of type
| | . . . | | svn_ra__vtable_t which
| | . ^ V | | now contains get_commit_editor2
r | | . . [dav_vtable] | | r which can handle the new
a | | V . | | a commit_info type callback.
- | | 4.close_edit \.......<........ | | -
l | | 4.1.svn_ra_dav__merge_activity2 . | | s
o | | 4.1.1.ne_xml_push_handler ^ | | v
c | | ..4.1.2.send the request and handle. | | n
a | | . the merge-response. . | |
l | | . 4.2execute the callback.....>..... | |
| | . | |
| | . | |
| | .<........................................ . | |
| | . . | |
| | . . | |
| | . . | |
| | . . | |
| | . . | |
| | . . | |
| | . . | |
-----+ +-.------------------------------------------.------+ +-----
. .
. Over the network... .
. .
. | | .
. | | .
--.--+-----------------+----------------+----.-------------+----
. | . |
. | . |
. Server Side .
. ------------- .
+-----.------------------------------------------.--------------------+
| . . |
| . apache server . |
| . . |
+-----.------------------------------------------.--------------------+
. .
V merge-request (deltav) ^ merge-response (deltav)
. .
. .
. mod_dav_svn .
+--------.------------------------------------------.---------+
| V . |
| S1.dav_svn_merge . |
| S1.1svn_repos_fs_commit_txn . |
| S1.2extract the post-commit hook's stderr . |
| S1.3dav_svn__merge_response...................... |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
+-------------------------------------------------------------+
Client Server
------ ------
0 svn_client_commit3()
(for svn mkdir, cp, mv, rm, start directly at step 2-
that is, svn_ra_open() is not part of the commit
flow for these commands )
1 svn_ra_open()
- Get appropriate vtable.
2 svn_ra_get_commit_editor2()
- Fill callback baton with callback
structure. Also fill edit baton member
with callback baton.
3 vtable->close_edit
- close the editor (edit_baton is a
parameter).
4 close_edit
- close_edit calls appropriate callback
in libsvn_client. Also returns various
commit info (from 4.1.3) and callback
baton.
4.1 svn_ra_dav__merge_activity2
4.1.1 ne_xml_push_handler
- Push validate handler etc., The validate
handler uses the merge_elements structure
to validate the merge-response elements.
Merge_elements now has an entry for
post-commit-err.
4.1.2 send request
1 dav_svn_merge
1.1 svn_repos_fs_commit_txn [*]
1.2 extract post-commit hook's stderr
1.3 dav_svn__merge_response()
4.1.3 handle merge-response
4.2 execute the callback
5 The commit callback fills in X, the values
that are returned back from the server
after commit. These include revision, date,
author... now also post_commit_err.
6 svn_cl__print_commit_info2()
Can now handle an extra parameter that contains the
post-commit hook's stderr by using
svn_client_commit_info2_t (X) which
has an additional post-commit-err param
for post-commit hook's stderr.
[*]
1.1 [4.1.2.1] svn_repos_fs_commit_txn
executes the pre-commit hook, the commit txn and the post-commit hook.
The post-commit hook's stderr is kept in serr->child.
1.2 [4.1.2.2] extract post-commit hook's stderr
The post commit hook's stderr will be determined by checking for
SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED in serr->apr_err. The value of
serr->child->message which is the post-commit hook's stderr is stored.
1.3 [4.1.2.3] dav_svn__merge_response
The post-commit hook's stderr is now an extra parameter to this func.
The merge response now created by dav_svn__merge_response would contain
a <post-commit-err> element if the stderr is not NULL.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Jun 28 13:56:04 2005