/*
 * ra_local.h : shared internal declarations for ra_local module
 *
 * ====================================================================
 * 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_LIBSVN_RA_LOCAL_H
#define SVN_LIBSVN_RA_LOCAL_H

#include <apr_pools.h>
#include <apr_tables.h>

#include "svn_error.h"
#include "svn_string.h"
#include "svn_path.h"
#include "svn_delta.h"
#include "svn_fs.h"
#include "svn_repos.h"
#include "svn_ra.h"

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/** Structures **/

/* A baton which represents a single ra_local session. */
typedef struct svn_ra_local__session_baton_t
{
  /* Each ra_local session does ALL allocation from this pool!  Kind
     of like an Apache transaction, I guess. :) */
  apr_pool_t *pool;
  
  /* A `file://' URL containing a local repository and path. */
  svn_stringbuf_t *repository_URL;

  /* The user accessing the repository. */
  char *username;

  /* The URL above, split into two components. */
  const svn_string_t *repos_path;
  const svn_string_t *fs_path;

  /* A repository object. */
  svn_repos_t *repos;

  /* The filesystem object associated with REPOS above (for
     convenience). */
  svn_fs_t *fs;

  /* Callback stuff. */
  const svn_ra_callbacks_t *callbacks;
  void *callback_baton;

} svn_ra_local__session_baton_t;




/*** Making changes to a filesystem, editor-style.  */

/* Hook function type for commits.  When a filesystem commit succeeds,
 * an instance of this is invoked on the NEW_REVISION, DATE, and
 * AUTHOR of the commit, along with the BATON closure.
 *
 * See also svn_ra_local__get_editor.
 *
 * NOTE: this "hook" is not related to the standard repository hooks
 * run before and after commits, which are configured in the
 * repository's conf/ subdirectory.  When most users say "hook",
 * they're talking about those, not about this function type.
 */
typedef svn_error_t *svn_ra_local__commit_hook_t (svn_revnum_t new_revision,
                                                  const char *date,
                                                  const char *author,
                                                  void *baton);




/** Private routines **/

    


/* Given a `file://' URL, figure out which portion specifies a
   repository on local disk, and return in REPOS_PATH; return the
   remainder (the path *within* the repository's filesystem) in
   FS_PATH.  Allocate the return values in POOL.  Currently, we are
   not expecting to handle `file://hostname/'-type URLs; hostname, in
   this case, is expected to be the empty string.  Also, the path
   which follows the */
svn_error_t *
svn_ra_local__split_URL (const svn_string_t **repos_path,
                         const svn_string_t **fs_path,
                         svn_stringbuf_t *URL,
                         apr_pool_t *pool);




/* Recursively walk over REVNUM:PATH inside an already-open repository
   FS, and drive a checkout EDITOR.  URL is the base ancestry that
   will be stored in the working copy.  Allocate all data in POOL. */
svn_error_t *
svn_ra_local__checkout (svn_fs_t *fs, 
                        svn_revnum_t revnum, 
                        svn_boolean_t recurse,
                        svn_stringbuf_t *URL,
                        const svn_string_t *fs_path,
                        const svn_delta_edit_fns_t *editor, 
                        void *edit_baton,
                        apr_pool_t *pool);


/* Return an EDITOR and EDIT_BATON to commit changes to SESSION->fs,
 * beginning at location `rev:SESSION->base_path', where "rev" is the
 * argument given to open_root().  Store SESSION->user as the
 * author of the commit and LOG_MSG as the commit message.
 *
 * FS is a previously opened file system.
 *
 * Calling (*EDITOR)->close_edit completes the commit.  Before
 * close_edit returns, but after the commit has succeeded, it will
 * invoke HOOK with the new revision number, the commit date (as a
 * const char *), commit author (as a const char *), and HOOK_BATON
 * as arguments.  If HOOK returns an error, that error will be
 * returned from close_edit, otherwise close_edit will return
 * successfully (unless it encountered an error before invoking HOOK).
 *
 * NOTE: this HOOK is not related to the standard repository hooks
 * run before and after commits, which are configured in the
 * repository's conf/ subdirectory.  When most users say "hook",
 * they're referring to those, not to this HOOK argument.
 */
svn_error_t *svn_ra_local__get_editor (const svn_delta_editor_t **editor,
                                       void **edit_baton,
                                       svn_ra_local__session_baton_t *session,
                                       svn_stringbuf_t *log_msg,
                                       svn_ra_local__commit_hook_t *hook,
                                       void *hook_baton,
                                       apr_pool_t *pool);



/* Return an EDITOR and EDIT_BATON which "wrap" around a given
   UPDATE_EDITOR and UPDATE_EDIT_BATON.  SESSION is the currently open
   ra_local session object.

   The editor returned is a customized 'pipe' editor that slightly
   tweaks the way the UPDATE_EDITOR is driven; specifically, extra
   'entry props' are inserted into the stream whenever {open_root,
   open_file, open_dir, add_file, add_dir} are called.

   BASE_PATH is an absolute fs path that is prepended to all paths
   that pass through;  the resulting fs paths are queried for
   entry-props.
*/
svn_error_t *
svn_ra_local__get_update_pipe_editor (svn_delta_edit_fns_t **editor,
                                      struct svn_pipe_edit_baton **edit_baton,
                                      const svn_delta_edit_fns_t *update_editor,
                                      void *update_edit_baton,
                                      svn_ra_local__session_baton_t *session,
                                      svn_stringbuf_t *base_path,
                                      apr_pool_t *pool);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SVN_LIBSVN_RA_LOCAL_H */


/* ----------------------------------------------------------------
 * local variables:
 * eval: (load-file "../../tools/dev/svn-dev.el")
 * end:
 */
