| /* |
| * svn_ra.h : structures related to repository access |
| * |
| * ==================================================================== |
| * Copyright (c) 2000-2002 CollabNet. All rights reserved. |
| * |
| * This software is licensed as described in the file COPYING, which |
| * you should have received as part of this distribution. The terms |
| * are also available at http://subversion.tigris.org/license-1.html. |
| * If newer versions of this license are posted there, you may use a |
| * newer version instead, at your option. |
| * |
| * This software consists of voluntary contributions made by many |
| * individuals. For exact contribution history, see the revision |
| * history and logs, available at http://subversion.tigris.org/. |
| * ==================================================================== |
| */ |
| |
| |
| |
| |
| #ifndef SVN_RA_H |
| #define SVN_RA_H |
| |
| #include <apr_pools.h> |
| #include <apr_tables.h> |
| |
| #include "svn_error.h" |
| #include "svn_delta.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif /* __cplusplus */ |
| |
| |
| /*----------------------------------------------------------------------*/ |
| |
| /* Misc. declarations */ |
| |
| /* This is a function type which allows the RA layer to fetch working |
| copy (WC) properties. |
| |
| The BATON is provided along with the function pointer and should |
| be passed back in. This will be the CALLBACK_BATON or the CLOSE_BATON |
| as appropriate. |
| |
| PATH is relative to the "root" of the session, defined by the REPOS_URL |
| passed to the RA->open() vtable call. |
| |
| NAME is the name of the property to fetch. If the property is present, |
| then it is returned in VALUE. Otherwise, *VALUE is set to NULL. |
| */ |
| typedef svn_error_t *(*svn_ra_get_wc_prop_func_t) (void *baton, |
| const char *relpath, |
| const char *name, |
| const svn_string_t **value, |
| apr_pool_t *pool); |
| |
| /* This is a function type which allows the RA layer to store working |
| copy (WC) properties. |
| |
| See the comments for svn_ra_get_wc_prop_func_t to for BATON, PATH, and |
| NAME. |
| |
| The VALUE is the value that will be stored for the property. |
| */ |
| typedef svn_error_t *(*svn_ra_set_wc_prop_func_t) (void *baton, |
| const char *path, |
| const char *name, |
| const svn_string_t *value, |
| apr_pool_t *pool); |
| |
| /* A function type for retrieving the youngest revision from a repos. */ |
| typedef svn_error_t *(*svn_ra_get_latest_revnum_func_t) |
| (void *session_baton, |
| svn_revnum_t *latest_revnum); |
| |
| /*----------------------------------------------------------------------*/ |
| |
| /* The update Reporter */ |
| |
| /* A vtable structure which allows a working copy to describe a |
| subset (or possibly all) of its working-copy to an RA layer. */ |
| |
| typedef struct svn_ra_reporter_t |
| { |
| /* Describe a working copy PATH as being at a particular REVISION; |
| this will *override* any previous set_path() calls made on parent |
| paths. PATH is relative to the URL specified in open(). */ |
| svn_error_t *(*set_path) (void *report_baton, |
| const char *path, |
| svn_revnum_t revision); |
| |
| /* Describing a working copy PATH as missing. */ |
| svn_error_t *(*delete_path) (void *report_baton, |
| const char *path); |
| |
| /* WC calls this when the state report is finished; any directories |
| or files not explicitly `set' above are assumed to be at the |
| baseline revision originally passed into do_update(). */ |
| svn_error_t *(*finish_report) (void *report_baton); |
| |
| /* If an error occurs during a report, this routine should cause the |
| filesystem transaction to be aborted & cleaned up. */ |
| svn_error_t *(*abort_report) (void *report_baton); |
| |
| } svn_ra_reporter_t; |
| |
| /*----------------------------------------------------------------------*/ |
| |
| /*** Authentication ***/ |
| |
| /* This is the 2nd draft of client-side authentication; in the first |
| draft, the client presumed to be in control of selecting auth |
| methods and then "pushing" data at the RA layer. In this draft, |
| the RA layer is presumed to be in control; as server challenges are |
| made, it "pulls" data from the client via callbacks. */ |
| |
| |
| /* List all known authenticator objects (protocols) here. */ |
| enum svn_ra_auth_method |
| { |
| svn_ra_auth_username, |
| svn_ra_auth_simple_password |
| }; |
| /* ### someday add other protocols here: PRIVATE_KEY, CERT, etc. */ |
| |
| |
| /* Authenticators: these are small "protocol" vtables that are |
| implemented by libsvn_client, but are driven by the RA layer. |
| |
| (Because they're related to authentication, we define them here in |
| svn_ra.h) |
| |
| The RA layer is challenged by the server, and then fetches one of |
| these vtables in order to retrieve the necessary authentication |
| info from the client. */ |
| |
| |
| /* A protocol which only needs a username. (used by ra_local) |
| (matches type svn_ra_auth_username above.) */ |
| typedef struct svn_ra_username_authenticator_t |
| { |
| /* Get a username from the client. */ |
| svn_error_t *(*get_username) (char **username, |
| void *auth_baton, |
| svn_boolean_t force_prompt, |
| apr_pool_t *pool); |
| |
| /* Store a username in the client. */ |
| svn_error_t *(*store_username) (const char *username, |
| void *auth_baton); |
| |
| } svn_ra_username_authenticator_t; |
| |
| |
| |
| /* A protocol which needs a username and password (used by ra_dav) |
| (matches type svn_ra_auth_simple_password above.) */ |
| typedef struct svn_ra_simple_password_authenticator_t |
| { |
| /* Get a username and password from the client. If FORCE_PROMPT is |
| set, then a prompt will be displayed to the user automatically |
| (rather than looking for cached info from command-line or file.) |
| |
| *USERNAME and *PASSWORD will not only be returned to the RA |
| layer, but libsvn_client will also cache them in the AUTH_BATON. */ |
| svn_error_t *(*get_user_and_pass) (char **username, |
| char **password, |
| void *auth_baton, |
| svn_boolean_t force_prompt, |
| apr_pool_t *pool); |
| |
| /* If any authentication info has been cached in AUTH_BATON (as a |
| result of calling get_user_and_pass), ask the client to store it |
| in the working copy. |
| |
| If this routine is NULL, that means the client is unable (or |
| unwilling) to store auth data. */ |
| svn_error_t *(*store_user_and_pass) (void *auth_baton); |
| |
| } svn_ra_simple_password_authenticator_t; |
| |
| |
| |
| /* A collection of callbacks implemented by libsvn_client which allows |
| an RA layer to "pull" information from the client application, or |
| possibly store information. libsvn_client passes this vtable to |
| RA->open(). |
| |
| Each routine takes a CALLBACK_BATON originally provided with the |
| vtable. */ |
| typedef struct svn_ra_callbacks_t |
| { |
| /* Open a unique temporary file for writing in the working copy. |
| This file will be automatically deleted when FP is closed. */ |
| svn_error_t *(*open_tmp_file) (apr_file_t **fp, |
| void *callback_baton); |
| |
| /* Retrieve an AUTHENTICATOR/AUTH_BATON pair from the client, |
| which represents the protocol METHOD. */ |
| svn_error_t *(*get_authenticator) (void **authenticator, |
| void **auth_baton, |
| enum svn_ra_auth_method method, |
| void *callback_baton, |
| apr_pool_t *pool); |
| |
| /*** The following items may be set to NULL to disallow the RA layer |
| to perform the respective operations of the vtable functions. |
| Perhaps WC props are not defined or are in invalid for this |
| session, or perhaps the commit operation this RA session will |
| perform is a server-side only one that shouldn't do post-commit |
| processing on a working copy path. ***/ |
| |
| /* Fetch working copy properties. |
| ### we might have a problem if the RA layer ever wants a property |
| ### that corresponds to a different revision of the file than |
| ### what is in the WC. we'll cross that bridge one day... */ |
| svn_ra_get_wc_prop_func_t get_wc_prop; |
| |
| /* Set working copy properties. */ |
| svn_ra_set_wc_prop_func_t set_wc_prop; |
| |
| } svn_ra_callbacks_t; |
| |
| |
| |
| /*----------------------------------------------------------------------*/ |
| |
| /* The RA Library */ |
| |
| |
| /* A vtable structure which encapsulates all the functionality of a |
| particular repository-access implementation. |
| |
| Note: libsvn_client will keep an array of these objects, |
| representing all RA libraries that it has simultaneously loaded |
| into memory. Depending on the situation, the client can look |
| through this array and find the appropriate implementation it |
| needs. */ |
| |
| typedef struct svn_ra_plugin_t |
| { |
| /* The proper name of the ra library, (e.g. "ra_dav" or "ra_local") */ |
| const char *name; |
| |
| /* Short doc string printed out by `svn -v` */ |
| const char *description; |
| |
| /* The vtable hooks */ |
| |
| /* Open a repository session to REPOS_URL. Return an opaque object |
| representing this session in *SESSION_BATON, allocated in POOL. |
| |
| CALLBACKS/CALLBACK_BATON is a table of callbacks provided by the |
| client; see svn_ra_callbacks_t above. |
| |
| All RA requests require a session_baton; they will continue to |
| use POOL for memory allocation. */ |
| svn_error_t *(*open) (void **session_baton, |
| svn_stringbuf_t *repos_URL, |
| const svn_ra_callbacks_t *callbacks, |
| void *callback_baton, |
| apr_pool_t *pool); |
| |
| /* Close a repository session. This frees any memory used by the |
| session baton. (To free the session baton itself, simply free |
| the pool it was created in.) */ |
| svn_error_t *(*close) (void *session_baton); |
| |
| /* Get the latest revision number from the repository. This is |
| useful for the `svn status' command. :) */ |
| svn_error_t *(*get_latest_revnum) (void *session_baton, |
| svn_revnum_t *latest_revnum); |
| |
| /* Get the latest revision number at time TIME. */ |
| svn_error_t *(*get_dated_revision) (void *session_baton, |
| svn_revnum_t *revision, |
| apr_time_t tm); |
| |
| /* Set *EDITOR and *EDIT_BATON to an editor for committing changes |
| to the repository, using LOG_MSG as the log message. The |
| revisions being committed against are passed to the editor |
| functions, starting with the rev argument to open_root. The path |
| root of the commit is in the SESSION_BATON's url. |
| |
| These three functions all share CLOSE_BATON: |
| |
| * GET_FUNC is used by the RA layer to fetch any WC properties |
| during the commit. |
| |
| * SET_FUNC is used by the RA layer to set any WC properties, |
| after the commit completes. |
| |
| * CLOSE_FUNC is used by the RA layer to bump the revisions of |
| each committed item, after the commit completes. It may be |
| called multiple times. |
| |
| Any of these functions may be null. |
| |
| After the editor's close_edit function returns successfully, |
| *NEW_REV holds either the new revision, or SVN_INVALID_REVNUM if |
| the commit was a no-op (i.e. nothing was committed); |
| *COMMITTED_DATE holds the repository-side date, or NULL if the |
| date is unavailable; *COMMITTED_AUTHOR holds the repository-side |
| author (i.e., the one recorded as the author of the commit in the |
| repository), or NULL if the author is unavailable. Allocate the |
| latter two in the session. Any of NEW_REV, COMMITTED_DATE, or |
| COMMITTED_AUTHOR may be null, in which case not touched. |
| */ |
| svn_error_t *(*get_commit_editor) (void *session_baton, |
| const svn_delta_editor_t **editor, |
| void **edit_baton, |
| svn_revnum_t *new_rev, |
| const char **committed_date, |
| const char **committed_author, |
| svn_stringbuf_t *log_msg); |
| |
| /* Push the contents of PATH at REVISION into an existing STREAM; |
| PATH is interpreted relative to the url in SESSION_BATON. |
| |
| If REVISION is SVN_INVALID_REVNUM (meaning 'head') and |
| *FETCHED_REV is not NULL, then this function will set |
| *FETCHED_REV to the actual revision that was retrieved. (Some |
| callers want to know, and some don't.) |
| |
| If PROPS is non NULL, it will contain the properties of the file. |
| This means *all* properties: not just ones controlled by the |
| user and stored in the repository fs, but non-tweakable ones |
| generated by the SCM system itself (e.g. 'wcprops', 'entryprops', |
| etc.) |
| |
| ### The parsing of props will be be cleaned up/factorized soon. |
| */ |
| svn_error_t *(*get_file) (void *session_baton, |
| const char *path, |
| svn_revnum_t revision, |
| svn_stream_t *stream, |
| svn_revnum_t *fetched_rev, |
| apr_hash_t **props); |
| |
| |
| /* Check out revision REVISION of the url specified in |
| SESSION_BATON, using EDITOR and EDIT_BATON to create the working |
| copy. If RECURSE is non-zero, create the full working tree, else |
| just its topmost directory. */ |
| svn_error_t *(*do_checkout) (void *session_baton, |
| svn_revnum_t revision, |
| svn_boolean_t recurse, |
| const svn_delta_edit_fns_t *editor, |
| void *edit_baton); |
| |
| |
| /* Ask the network layer to update a working copy. |
| |
| The client initially provides an UPDATE_EDITOR/BATON to the RA |
| layer; this editor contains knowledge of where the change will |
| begin in the working copy (when open_root() is called). |
| |
| In return, the client receives a REPORTER/REPORT_BATON. The |
| client then describes its working-copy revision numbers by making |
| calls into the REPORTER structure; the RA layer assumes that all |
| paths are relative to the URL used to create SESSION_BATON. |
| |
| When finished, the client calls REPORTER->finish_report(). The RA |
| layer then drives UPDATE_EDITOR to update the working copy. |
| UPDATE_TARGET is an optional single path component will restrict |
| the scope of things affected by the update to an entry in the |
| directory represented by the SESSION_BATON's URL, or NULL if the |
| entire directory is meant to be updated. |
| |
| The working copy will be updated to REVISION_TO_UPDATE_TO, or the |
| "latest" revision if this arg is invalid. */ |
| svn_error_t *(*do_update) (void *session_baton, |
| const svn_ra_reporter_t **reporter, |
| void **report_baton, |
| svn_revnum_t revision_to_update_to, |
| svn_stringbuf_t *update_target, |
| svn_boolean_t recurse, |
| const svn_delta_edit_fns_t *update_editor, |
| void *update_baton); |
| |
| /* Ask the network layer to 'switch' a working copy to a new |
| SWITCH_URL; it's another form of do_update(). |
| |
| [Please note: this function cannot be used to switch a single |
| file, only a working copy directory. The main caller of this |
| routine, svn_client_switch, uses get_file and svn_wc_install_file |
| to switch a single file. |
| |
| The client initially provides an UPDATE_EDITOR/BATON to the RA |
| layer; this editor contains knowledge of where the change will |
| begin in the working copy (when open_root() is called). |
| |
| In return, the client receives a REPORTER/REPORT_BATON. The |
| client then describes its working-copy revision numbers by making |
| calls into the REPORTER structure; the RA layer assumes that all |
| paths are relative to the URL used to create SESSION_BATON. |
| |
| When finished, the client calls REPORTER->finish_report(). The RA |
| layer then drives UPDATE_EDITOR to update the working copy. |
| UPDATE_TARGET is an optional single path component will restrict |
| the scope of things affected by the update to an entry in the |
| directory represented by the SESSION_BATON's URL, or NULL if the |
| entire directory is meant to be updated. |
| |
| The working copy will be updated to REVISION_TO_UPDATE_TO, or the |
| "latest" revision if this arg is invalid. */ |
| svn_error_t *(*do_switch) (void *session_baton, |
| const svn_ra_reporter_t **reporter, |
| void **report_baton, |
| svn_revnum_t revision_to_update_to, |
| svn_stringbuf_t *update_target, |
| svn_boolean_t recurse, |
| svn_stringbuf_t *switch_url, |
| const svn_delta_edit_fns_t *update_editor, |
| void *update_baton); |
| |
| /* Ask the network layer to describe the status of a working copy |
| with respect to the HEAD revision of the repository. |
| |
| The client initially provides an STATUS_EDITOR/BATON to the RA |
| layer; this editor contains knowledge of where the change will |
| begin in the working copy (when open_root() is called). |
| |
| In return, the client receives a REPORTER/REPORT_BATON. The |
| client then describes its working-copy revision numbers by making |
| calls into the REPORTER structure; the RA layer assumes that all |
| paths are relative to the URL used to create SESSION_BATON. |
| |
| When finished, the client calls REPORTER->finish_report(). The RA |
| layer then drives STATUS_EDITOR to report, essentially, what |
| would would be modified in the working copy were the client to |
| call do_update(). STATUS_TARGET is an optional single path |
| component will restrict the scope of the status report to an |
| entry in the directory represented by the SESSION_BATON's URL, or |
| NULL if the entire directory is meant to be examined. */ |
| svn_error_t *(*do_status) (void *session_baton, |
| const svn_ra_reporter_t **reporter, |
| void **report_baton, |
| svn_stringbuf_t *status_target, |
| svn_boolean_t recurse, |
| const svn_delta_edit_fns_t *status_editor, |
| void *status_baton); |
| |
| |
| /* Ask the network layer to perform a merge of the differences |
| between START_PATH:START_REVISION and END_PATH:END_REVISION into |
| the working copy. Return a *REPORTER object (and *REPORT_BATON) |
| that the caller can use to describe the working copy target. |
| START_PATH and END_PATH are relative to the *SESSION_BATON's URL. |
| |
| When the callers has finished describing his working copy via the |
| *REPORTER interface, use SETUP_EDITOR/SETUP_EDIT_BATON and |
| FINISH_EDITOR/FINISH_EDIT_BATON to actually perform the merge. |
| |
| MERGE_TARGET, also relative to the *SESSION_BATON's URL, |
| describes the filesystem path associated with the working copy |
| target. */ |
| svn_error_t *(*do_merge) (void *session_baton, |
| const svn_ra_reporter_t **reporter, |
| void **report_baton, |
| const char *start_path, |
| svn_revnum_t start_revision, |
| const char *end_path, |
| svn_revnum_t end_revision, |
| const char *merge_target, |
| const svn_delta_edit_fns_t *setup_editor, |
| void *setup_edit_baton, |
| const svn_delta_edit_fns_t *finish_editor, |
| void *finish_edit_baton); |
| |
| |
| /* Invoke RECEIVER with RECEIVER_BATON on each log message from |
| START to END. START may be greater or less than END; this just |
| controls whether the log messages are processed in descending or |
| ascending revision number order. |
| |
| If START or END is SVN_INVALID_REVNUM, it defaults to youngest. |
| |
| If PATHS is non-null and has one or more elements, then only show |
| revisions in which at least one of PATHS was changed (i.e., if |
| file, text or props changed; if dir, props changed or an entry |
| was added or deleted). Each path is an svn_stringbuf_t *, |
| relative to the session's common parent. |
| |
| If DISCOVER_CHANGED_PATHS, then each call to receiver passes a |
| `const apr_hash_t *' for the receiver's CHANGED_PATHS argument; |
| the hash's keys are all the paths committed in that revision. |
| Otherwise, each call to receiver passes null for CHANGED_PATHS. |
| |
| If any invocation of RECEIVER returns error, return that error |
| immediately and without wrapping it. |
| |
| See also the documentation for `svn_log_message_receiver_t'. */ |
| svn_error_t *(*get_log) (void *session_baton, |
| const apr_array_header_t *paths, |
| svn_revnum_t start, |
| svn_revnum_t end, |
| svn_boolean_t discover_changed_paths, |
| svn_log_message_receiver_t receiver, |
| void *receiver_baton); |
| |
| /* Yoshiki Hayashi <yoshiki@xemacs.org> points out that a more |
| generic way to support 'discover_changed__paths' in logs would be |
| to have these two functions: |
| |
| svn_error_t *(*get_rev_prop) (void *session_baton, |
| svn_string_t **value, |
| svn_string_t *name, |
| svn_revnum_t revision); |
| |
| svn_error_t *(get_changed_paths) (void *session_baton, |
| apr_array_header_t **changed_paths, |
| svn_revnum_t revision); |
| |
| Although log requests are common enough to deserve special |
| support (to optimize network usage), these two more generic |
| functions are still good ideas. Don't want to implement them |
| right now, as am concentrating on the log functionality, but we |
| will probably want them eventually, hence this start block. */ |
| |
| |
| /* Set *KIND to node kind associated with PATH at REVISION. If PATH |
| does not exist under REVISION, set *KIND to svn_node_none. PATH |
| is relative to the session's parent URL. */ |
| svn_error_t *(*check_path) (svn_node_kind_t *kind, |
| void *session_baton, |
| const char *path, |
| svn_revnum_t revision); |
| |
| |
| } svn_ra_plugin_t; |
| |
| |
| /* svn_ra_init_func_t : |
| |
| libsvn_client will be reponsible for loading each RA DSO it needs. |
| However, all "ra_FOO" implementations *must* export a function named |
| `svn_ra_FOO_init()' of type `svn_ra_init_func_t'. |
| |
| When called by libsvn_client, this routine adds an entry (or |
| entries) to the hash table for any URL schemes it handles. The hash |
| value must be of type (svn_ra_plugin_t *). POOL is a pool for |
| allocating configuration / one-time data. |
| |
| This type is defined to use the "C Calling Conventions" to ensure that |
| abi_version is the first parameter. The RA plugin must check that value |
| before accessing the other parameters. |
| |
| ### need to force this to be __cdecl on Windows... how?? |
| */ |
| typedef svn_error_t *(*svn_ra_init_func_t) (int abi_version, |
| apr_pool_t *pool, |
| apr_hash_t *hash); |
| |
| /* The current ABI (Application Binary Interface) version for the |
| RA plugin model. This version number will change when the ABI |
| between the SVN core (e.g. libsvn_client) and the RA plugin changes. |
| |
| An RA plugin should verify that the passed version number is acceptable |
| before accessing the rest of the parameters, and before returning any |
| information. |
| |
| It is entirely acceptable for an RA plugin to accept multiple ABI |
| versions. It can simply interpret the parameters based on the version, |
| and it can return different plugin structures. |
| |
| |
| VSN DATE REASON FOR CHANGE |
| --- ---------- ------------------------------------------------ |
| 1 2001-02-17 Initial revision. |
| */ |
| #define SVN_RA_ABI_VERSION 1 |
| |
| |
| /** Public RA implementations: ADD MORE HERE as necessary. **/ |
| |
| svn_error_t * svn_ra_dav_init (int abi_version, |
| apr_pool_t *pool, |
| apr_hash_t *hash); |
| svn_error_t * svn_ra_local_init (int abi_version, |
| apr_pool_t *pool, |
| apr_hash_t *hash); |
| |
| |
| /*----------------------------------------------------------------------*/ |
| |
| /*** Public Interfaces ***/ |
| |
| /* Every user of the RA layer *must* call this routine and hold on to |
| the RA_BATON returned. This baton contains all known methods of |
| accessing a repository, for use within most svn_client_* routines. */ |
| svn_error_t * svn_ra_init_ra_libs (void **ra_baton, apr_pool_t *pool); |
| |
| |
| /* Return an ra vtable-LIBRARY (already within RA_BATON) which can |
| handle URL. A number of svn_client_* routines will call this |
| internally, but client apps might use it too. |
| |
| For reference, note that according to W3 RFC 1738, a valid URL is |
| of the following form: |
| |
| scheme://<user>:<password>@<host>:<port>/<url-path> |
| |
| Common URLs are as follows: |
| |
| http://subversion.tigris.org/index.html |
| file:///home/joeuser/documents/resume.txt |
| |
| Of interest is the file URL schema, which takes the form |
| file://<host>/<path>, where <host> and <path> are optional. The `/' |
| between <host> and <path> is NOT part of path, yet the RFC doesn't |
| specify how <path> should be formatted. SVN will count on the |
| portability layer to be able to handle the specific formatting of |
| the <path> on a per-system basis. */ |
| svn_error_t *svn_ra_get_ra_library (svn_ra_plugin_t **library, |
| void *ra_baton, |
| const char *URL, |
| apr_pool_t *pool); |
| |
| /* Return a *DESCRIPTIONS string (allocated in POOL) that is a textual |
| list of all available RA libraries. */ |
| svn_error_t *svn_ra_print_ra_libraries (svn_stringbuf_t **descriptions, |
| void *ra_baton, |
| apr_pool_t *pool); |
| |
| |
| |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* SVN_RA_H */ |
| |
| |
| /* ---------------------------------------------------------------- |
| * local variables: |
| * eval: (load-file "../../tools/dev/svn-dev.el") |
| * end: |
| */ |