You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2010/08/10 22:56:05 UTC

svn commit: r984206 [4/35] - in /subversion/branches/ignore-mergeinfo: ./ build/ build/generator/ build/generator/templates/ build/hudson/ build/hudson/jobs/subversion-1.6.x-solaris/ build/hudson/jobs/subversion-1.6.x-ubuntu/ build/hudson/jobs/subversi...

Modified: subversion/branches/ignore-mergeinfo/subversion/include/svn_subst.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/include/svn_subst.h?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/include/svn_subst.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/include/svn_subst.h Tue Aug 10 20:55:56 2010
@@ -198,15 +198,16 @@ svn_subst_keywords_differ(const svn_subs
 
 
 /**
- * Copy and translate the data in stream @a src into stream @a dst.  It is
- * assumed that @a src is a readable stream and @a dst is a writable stream.
- *
- * If @a eol_str is non-@c NULL, replace whatever bytestring @a src uses to
- * denote line endings with @a eol_str in the output.  If @a src has an
- * inconsistent line ending style, then: if @a repair is @c FALSE, return
- * @c SVN_ERR_IO_INCONSISTENT_EOL, else if @a repair is @c TRUE, convert any
- * line ending in @a src to @a eol_str in @a dst.  Recognized line endings are:
- * "\n", "\r", and "\r\n".
+ * Copy and translate the data in @a src_stream into @a dst_stream.  It is
+ * assumed that @a src_stream is a readable stream and @a dst_stream is a
+ * writable stream.
+ *
+ * If @a eol_str is non-@c NULL, replace whatever bytestring @a src_stream
+ * uses to denote line endings with @a eol_str in the output.  If
+ * @a src_stream has an inconsistent line ending style, then: if @a repair
+ * is @c FALSE, return @c SVN_ERR_IO_INCONSISTENT_EOL, else if @a repair is
+ * @c TRUE, convert any line ending in @a src_stream to @a eol_str in
+ * @a dst_stream.  Recognized line endings are: "\n", "\r", and "\r\n".
  *
  * Expand and contract keywords using the contents of @a keywords as the
  * new values.  If @a expand is @c TRUE, expand contracted keywords and
@@ -293,13 +294,14 @@ svn_subst_translate_stream(svn_stream_t 
  * operations.  Reads and writes may be mixed.
  *
  * If @a eol_str is non-@c NULL, replace whatever bytestring the input uses
- * to denote line endings with @a eol_str in the output.  If the input has an
- * inconsistent line ending style, then: if @a repair is @c FALSE, return
- * @c SVN_ERR_IO_INCONSISTENT_EOL, else if @a repair is @c TRUE, convert any
- * line ending to @a eol_str in @a .  Recognized line endings are:
- * "\n", "\r", and "\r\n".
+ * to denote line endings with @a eol_str in the output.  If the input has
+ * an inconsistent line ending style, then: if @a repair is @c FALSE, then a
+ * subsequent read, write or other operation on the stream will return
+ * @c SVN_ERR_IO_INCONSISTENT_EOL when the inconsistency is detected, else
+ * if @a repair is @c TRUE, convert any line ending to @a eol_str.
+ * Recognized line endings are: "\n", "\r", and "\r\n".
  *
- * The stream returned is allocated in @a pool.
+ * The stream returned is allocated in @a result_pool.
  *
  * If the inner stream implements resetting via svn_stream_reset(),
  * or marking and seeking via svn_stream_mark() and svn_stream_seek(),
@@ -313,7 +315,7 @@ svn_subst_stream_translated(svn_stream_t
                             svn_boolean_t repair,
                             apr_hash_t *keywords,
                             svn_boolean_t expand,
-                            apr_pool_t *pool);
+                            apr_pool_t *result_pool);
 
 
 /** Return a stream which performs eol translation and keyword
@@ -411,8 +413,32 @@ svn_subst_stream_from_specialfile(svn_st
  * If @a eol_str and @a keywords are @c NULL, behavior is just a byte-for-byte
  * copy.
  *
+ * @a cancel_func and @a cancel_baton will be called (if not NULL)
+ * periodically to check for cancellation.
+ *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_subst_copy_and_translate4(const char *src,
+                              const char *dst,
+                              const char *eol_str,
+                              svn_boolean_t repair,
+                              apr_hash_t *keywords,
+                              svn_boolean_t expand,
+                              svn_boolean_t special,
+                              svn_cancel_func_t cancel_func,
+                              void *cancel_baton,
+                              apr_pool_t *pool);
+
+
+/**
+ * Similar to svn_subst_copy_and_translate4() but without a cancellation
+ * function and baton.
+ *
  * @since New in 1.3.
+ * @deprecated Provided for backward compatibility with the 1.6 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_subst_copy_and_translate3(const char *src,
                               const char *dst,
@@ -423,6 +449,7 @@ svn_subst_copy_and_translate3(const char
                               svn_boolean_t special,
                               apr_pool_t *pool);
 
+
 /**
  * Similar to svn_subst_copy_and_translate3() except that @a keywords is a
  * @c svn_subst_keywords_t struct instead of a keywords hash.

Modified: subversion/branches/ignore-mergeinfo/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/include/svn_wc.h?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/include/svn_wc.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/include/svn_wc.h Tue Aug 10 20:55:56 2010
@@ -415,6 +415,7 @@ svn_wc_adm_open_anchor(svn_wc_adm_access
  *
  * @a pool is used only for local processing, it is not used for the batons.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_adm_retrieve(svn_wc_adm_access_t **adm_access,
                     svn_wc_adm_access_t *associated,
@@ -428,6 +429,7 @@ svn_wc_adm_retrieve(svn_wc_adm_access_t 
  * svn_wc_adm_retrieve() with @a path replaced by the parent directory of
  * @a path.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_adm_probe_retrieve(svn_wc_adm_access_t **adm_access,
                           svn_wc_adm_access_t *associated,
@@ -512,6 +514,7 @@ svn_wc_adm_probe_try(svn_wc_adm_access_t
  *
  * @since New in 1.6
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_adm_close2(svn_wc_adm_access_t *adm_access,
                   apr_pool_t *scratch_pool);
@@ -527,10 +530,12 @@ svn_error_t *
 svn_wc_adm_close(svn_wc_adm_access_t *adm_access);
 
 /** Return the path used to open the access baton @a adm_access */
+SVN_DEPRECATED
 const char *
 svn_wc_adm_access_path(const svn_wc_adm_access_t *adm_access);
 
 /** Return the pool used by access baton @a adm_access */
+SVN_DEPRECATED
 apr_pool_t *
 svn_wc_adm_access_pool(const svn_wc_adm_access_t *adm_access);
 
@@ -2347,9 +2352,13 @@ typedef struct svn_wc_diff_callbacks4_t
    *
    * This function is called for @a path before any of the callbacks are
    * called for a child of @a path.
+   *
+   * If the callback returns @c TRUE in @a *skip_children, children
+   * of this directory will be skipped.
    */
   svn_error_t *(*dir_opened)(const char *local_dir_abspath,
                              svn_boolean_t *tree_conflicted,
+                             svn_boolean_t *skip_children,
                              const char *path,
                              svn_revnum_t rev,
                              void *diff_baton,
@@ -3100,14 +3109,13 @@ svn_wc_entry_dup(const svn_wc_entry_t *e
  * *prop_conflicted_p, and @a *tree_conflicted_p.  If one or two of the
  * answers are uninteresting, simply pass @c NULL pointers for those.
  *
- * If @a path is unversioned or does not exist, return
+ * If @a local_abspath is unversioned or does not exist, return
  * #SVN_ERR_WC_PATH_NOT_FOUND.
  *
- * @a adm_access is the admin access baton of the parent directory.
- *
- * If the @a path has corresponding text conflict files (with suffix .mine,
- * .theirs, etc.) that cannot be found, assume that the text conflict has
- * been resolved by the user and return @c FALSE in @a *text_conflicted_p.
+ * If the @a local_abspath has corresponding text conflict files (with suffix
+ * .mine, .theirs, etc.) that cannot be found, assume that the text conflict
+ * has been resolved by the user and return @c FALSE in @a
+ * *text_conflicted_p.
  *
  * Similarly, if a property conflicts file (.prej suffix) is said to exist,
  * but it cannot be found, assume that the property conflicts have been
@@ -3166,26 +3174,13 @@ svn_wc_conflicted_p(svn_boolean_t *text_
                     const svn_wc_entry_t *entry,
                     apr_pool_t *pool);
 
-/** Set @a *url and @a *rev to the ancestor URL and revision for
- * @a local_abspath, allocating in @a result_pool.  Any temporary
- * allocations are performed using @a scratch_pool.
+
+/** Set @a *url and @a *rev to the ancestor URL and revision for @a path,
+ * allocating in @a pool.  @a adm_access must be an access baton for @a path.
  *
  * If @a url or @a rev is NULL, then ignore it (just don't return the
  * corresponding information).
  *
- * @since New in 1.7.
- */
-svn_error_t *
-svn_wc_get_ancestry2(const char **url,
-                     svn_revnum_t *rev,
-                     svn_wc_context_t *wc_ctx,
-                     const char *local_abspath,
-                     apr_pool_t *result_pool,
-                     apr_pool_t *scratch_pool);
-
-/** Similar to svn_wc_get_ancestry2(), but using an adm_access baton / relative
- * path parameter pair.
- *
  * @deprecated Provided for backward compatibility with the 1.6 API.
  */
 SVN_DEPRECATED
@@ -3445,10 +3440,12 @@ svn_wc_maybe_set_repos_root(svn_wc_adm_a
  * @defgroup svn_wc_status Working copy status.
  * @{
  *
- * We have two functions for getting working copy status: one function
- * for getting the status of exactly one thing, and another for
- * getting the statuses of (potentially) multiple things.
+ * We have three functions for getting working copy status: one function
+ * for getting the status of exactly one thing, another for
+ * getting the statuses of (potentially) multiple things and a third for
+ * gettting the working copy out-of-dateness with respect to the repository.
  *
+ * Why do we have two different functions for getting working copy status?
  * The concept of depth, as explained in the documentation for
  * svn_depth_t, may be useful in understanding this.  Suppose we're
  * getting the status of directory D:
@@ -3460,12 +3457,10 @@ svn_wc_maybe_set_repos_root(svn_wc_adm_a
  * become cumbersome: you'd have to roll through a hash to find one
  * lone status.
  *
- * So we have svn_wc_status() for depth-empty (just D itself), and
- * svn_wc_get_status_editor() for depth-immediates and depth-infinity,
- * since the latter two involve multiple return values.
- *
- * @note The status structures may contain a @c NULL ->entry field.
- * This indicates an item that is not versioned in the working copy.
+ * So we have svn_wc_status3() for depth-empty (just D itself), and
+ * svn_wc_walk_status() for depth-immediates and depth-infinity,
+ * since the latter two involve multiple return values. And for
+ * out-of-dateness information we have svn_wc_get_status_editor5().
  */
 
 /** The type of status for the working copy. */
@@ -3526,7 +3521,161 @@ enum svn_wc_status_kind
  * versions.  Therefore, to preserve binary compatibility, users
  * should not directly allocate structures of this type.
  *
+ * @since New in 1.7.
+ */
+typedef struct svn_wc_status3_t
+{
+  /** The kind of node as recorded in the working copy */
+  svn_node_kind_t kind;
+
+  /** The depth of the node as recorded in the working copy
+   * (#svn_depth_unknown for files or when no depth is set) */
+  svn_depth_t depth;
+
+  /** Can be @c NULL if not under version control. */
+  const svn_wc_entry_t *entry;
+
+  /** The status of the entry itself, including its text if it is a file. */
+  enum svn_wc_status_kind text_status;
+
+  /** The status of the entry's properties. */
+  enum svn_wc_status_kind prop_status;
+
+  /** a directory can be 'locked' if a working copy update was interrupted. */
+  svn_boolean_t locked;
+
+  /** a file or directory can be 'copied' if it's scheduled for
+   * addition-with-history (or part of a subtree that is scheduled as such.).
+   */
+  svn_boolean_t copied;
+
+  /** a file or directory can be 'switched' if the switch command has been
+   * used.  If this is TRUE, then file_external will be FALSE.
+   */
+  svn_boolean_t switched;
+
+  /** The entry's text status in the repository. */
+  enum svn_wc_status_kind repos_text_status;
+
+  /** The entry's property status in the repository. */
+  enum svn_wc_status_kind repos_prop_status;
+
+  /** The entry's lock in the repository, if any. */
+  const svn_lock_t *repos_lock;
+
+  /** Set to the URI (actual or expected) of the item. */
+  const char *url;
+
+  /**
+   * @defgroup svn_wc_status_ood WC out-of-date info from the repository
+   * @{
+   *
+   * When the working copy item is out-of-date compared to the
+   * repository, the following fields represent the state of the
+   * youngest revision of the item in the repository.  If the working
+   * copy is not out of date, the fields are initialized as described
+   * below.
+   */
+
+  /** Set to the youngest committed revision, or #SVN_INVALID_REVNUM
+   * if not out of date.
+   */
+  svn_revnum_t ood_last_cmt_rev;
+
+  /** Set to the most recent commit date, or @c 0 if not out of date.
+   */
+  apr_time_t ood_last_cmt_date;
+
+  /** Set to the node kind of the youngest commit, or #svn_node_none
+   * if not out of date.
+   */
+  svn_node_kind_t ood_kind;
+
+  /** Set to the user name of the youngest commit, or @c NULL if not
+   * out of date or non-existent.  Because a non-existent @c
+   * svn:author property has the same behavior as an out-of-date
+   * working copy, examine @c ood_last_cmt_rev to determine whether
+   * the working copy is out of date.
+   */
+  const char *ood_last_cmt_author;
+
+  /** @} */
+
+  /** If the item is a file that was added to the working copy with an
+   * svn:externals; if file_external is TRUE, then switched is always
+   * FALSE.
+   */
+  svn_boolean_t file_external;
+
+  /** The actual status of the text compared to the pristine base of the
+   * file. This value isn't masked by other working copy statuses.
+   * @c pristine_text_status is #svn_wc_status_none if this value was
+   * not calculated during the status walk.
+   */
+  enum svn_wc_status_kind pristine_text_status;
+
+  /** The actual status of the properties compared to the pristine base of
+   * the node. This value isn't masked by other working copy statuses.
+   * @c pristine_prop_status is #svn_wc_status_none if this value was
+   * not calculated during the status walk.
+   */
+  enum svn_wc_status_kind pristine_prop_status;
+
+  /** Base revision.  */
+  svn_revnum_t revision;
+
+  /** Last revision this was changed */
+  svn_revnum_t changed_rev;
+
+  /** Last commit author of this item */
+  const char *changed_author;
+
+  /** Date of last commit. */
+  apr_time_t changed_date;
+
+  /** The locally present lock token.
+   */
+  const char *lock_token;
+
+  /** The locally present lock owner.
+   */
+  const char *lock_owner;
+
+  /** The locally present lock comment.
+   */
+  const char *lock_comment;
+
+  /** The locally present lock creation date.
+   */
+  apr_time_t lock_creation_date;
+  
+  /** Set to TRUE if the item is the victim of a conflict. */
+  svn_boolean_t conflicted;
+
+  /** If the path is under version control, versioned is TRUE. */
+  svn_boolean_t versioned;
+
+  /** Which changelist this item is part of, or NULL if not part of any. */
+  const char *changelist;
+
+  /** The leading part of the url, not including the wc root and subsequent
+   * paths. */
+  const char *repos_root_url;
+
+  /** The path relative to the wc root. */
+  const char *repos_relpath;
+
+  /* NOTE! Please update svn_wc_dup_status3() when adding new fields here. */
+} svn_wc_status3_t;
+
+/**
+ * ### All diffs are not yet known.
+ * Same as svn_wc_status3_t, but without the #svn_boolean_t 'versioned'
+ * field. Instead an item that is not versioned has the 'entry' field set to
+ * @c NULL.
+ *
  * @since New in 1.2.
+ * @deprecated Provided for backward compatibility with the 1.6 API.
  */
 typedef struct svn_wc_status2_t
 {
@@ -3633,7 +3782,6 @@ typedef struct svn_wc_status2_t
    */
   enum svn_wc_status_kind pristine_prop_status;
 
-  /* NOTE! Please update svn_wc_dup_status2() when adding new fields here. */
 } svn_wc_status2_t;
 
 
@@ -3676,13 +3824,23 @@ typedef struct svn_wc_status_t
 } svn_wc_status_t;
 
 
-
 /**
  * Return a deep copy of the @a orig_stat status structure, allocated
  * in @a pool.
  *
- * @since New in 1.2.
+ * @since New in 1.7.
  */
+svn_wc_status3_t *
+svn_wc_dup_status3(const svn_wc_status3_t *orig_stat,
+                   apr_pool_t *pool);
+
+/**
+ * Same as svn_wc_dup_status3(), but for older svn_wc_status_t structures.
+ *
+ * @since New in 1.2
+ * @deprecated Provided for backward compatibility with the 1.6 API.
+ */
+SVN_DEPRECATED
 svn_wc_status2_t *
 svn_wc_dup_status2(const svn_wc_status2_t *orig_stat,
                    apr_pool_t *pool);
@@ -3708,10 +3866,7 @@ svn_wc_dup_status(const svn_wc_status_t 
  * this function can reveal the following things:
  *
  *    - #svn_wc_status_none : @a local_abspath is not versioned, and is
- *                            either not present on disk, or is ignored
- *                            by svn's default ignore regular expressions
- *                            or the svn:ignore property setting for
- *                            @a local_abspath's parent directory.
+ *                            not present on disk
  *
  *    - #svn_wc_status_missing : @a local_abspath is versioned, but is
  *                               missing from the working copy.
@@ -3727,7 +3882,7 @@ svn_wc_dup_status(const svn_wc_status_t 
  * @since New in 1.7.
  */
 svn_error_t *
-svn_wc_status3(svn_wc_status2_t **status,
+svn_wc_status3(svn_wc_status3_t **status,
                svn_wc_context_t *wc_ctx,
                const char *local_abspath,
                apr_pool_t *result_pool,
@@ -3779,7 +3934,7 @@ svn_wc_status(svn_wc_status_t **status,
  */
 typedef svn_error_t *(*svn_wc_status_func4_t)(void *baton,
                                               const char *local_abspath,
-                                              const svn_wc_status2_t *status,
+                                              const svn_wc_status3_t *status,
                                               apr_pool_t *scratch_pool);
 
 /**
@@ -3816,7 +3971,7 @@ typedef void (*svn_wc_status_func_t)(voi
 
 /**
  * Walk the working copy status of @a local_abspath using @a wc_ctx, by
- * creating #svn_wc_status2_t structures and sending these through
+ * creating #svn_wc_status3_t structures and sending these through
  * @a status_func / @a status_baton.
  *
  *  * Assuming the target is a directory, then:
@@ -3840,9 +3995,6 @@ typedef void (*svn_wc_status_func_t)(voi
  * If @a no_ignore is set, statuses that would typically be ignored
  * will instead be reported.
  *
- * If @a get_excluded is true, statuses for the roots of excluded subtrees
- * are reported.  Otherwise excluded subtrees are ignored.
- *
  * @a ignore_patterns is an array of file patterns matching
  * unversioned files to ignore for the purposes of status reporting,
  * or @c NULL if the default set of ignorable file patterns should be used.
@@ -3864,7 +4016,6 @@ svn_wc_walk_status(svn_wc_context_t *wc_
                    svn_depth_t depth,
                    svn_boolean_t get_all,
                    svn_boolean_t no_ignore,
-                   svn_boolean_t get_excluded,
                    const apr_array_header_t *ignore_patterns,
                    svn_wc_status_func4_t status_func,
                    void *status_baton,
@@ -3876,7 +4027,7 @@ svn_wc_walk_status(svn_wc_context_t *wc_
 
 /**
  * Set @a *editor and @a *edit_baton to an editor that generates
- * #svn_wc_status2_t structures and sends them through @a status_func /
+ * #svn_wc_status3_t structures and sends them through @a status_func /
  * @a status_baton.  @a anchor_abspath is a working copy directory
  * directory which will be used as the root of our editor.  If @a
  * target_basename is not "", it represents a node in the @a anchor_abspath
@@ -4260,6 +4411,22 @@ svn_wc_delete(const char *path,
               void *notify_baton,
               apr_pool_t *pool);
 
+/**
+ * Register @a local_abspath as a new file external aimed at
+ * @a external_url, @a external_peg_rev, and @a external_rev.
+ *
+ * If not @c NULL, @a external_peg_rev and @a external_rev must each
+ * be of kind @c svn_opt_revision_number or @c svn_opt_revision_head.
+ *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_wc_register_file_external(svn_wc_context_t *wc_ctx,
+                              const char *local_abspath,
+                              const char *external_url,
+                              const svn_opt_revision_t *external_peg_rev,
+                              const svn_opt_revision_t *external_rev,
+                              apr_pool_t *scratch_pool);
 
 /**
  * Put @a local_abspath under version control by adding an entry in its
@@ -4568,7 +4735,7 @@ svn_wc_remove_from_revision_control(svn_
 
 /**
  * Assuming @a local_abspath is under version control or a tree conflict
- * victime and in a state of conflict, then take @a local_abspath *out*
+ * victim and in a state of conflict, then take @a local_abspath *out*
  * of this state.  If @a resolve_text is TRUE then any text conflict is
  * resolved, if @a resolve_tree is TRUE then any tree conflicts are
  * resolved. If @a resolve_prop is set to "" all property conflicts are
@@ -4745,10 +4912,6 @@ svn_wc_committed_queue_create(apr_pool_t
  * Queue committed items to be processed later by
  * svn_wc_process_committed_queue2().
  *
- * All pointer data passed to this function (@a local_abspath,
- * @a wcprop_changes * and @a checksum) should remain valid until the
- * queue has been processed by svn_wc_process_committed_queue2().
- *
  * Record in @a queue that @a local_abspath will need to be bumped
  * after a commit succeeds.
  *
@@ -4765,23 +4928,45 @@ svn_wc_committed_queue_create(apr_pool_t
  * If @a remove_changelist is @c TRUE, any association with a
  * changelist will be removed.
  *
- * If @a local_abspath is a file and @a checksum is non-NULL, use @a checksum
+ * If @a local_abspath is a file and @a md5_checksum is non-NULL, use @a md5_checksum
  * as the checksum for the new text base. Otherwise, calculate the checksum
  * if needed.
  *   ### [JAF]  No, it doesn't calculate the checksum, it stores null in wc.db:
  *   ### see svn_wc__process_committed_internal().
  *
+ * If @a sha1_checksum is non-NULL, use it instead of @a md5_checksum to
+ * identify the node's pristine text.
+ * ### NOT YET IMPLEMENTED.
+ *
  * If @a recurse is TRUE and @a local_abspath is a directory, then bump every
- * versioned object at or under @a path.  This is usually done for
+ * versioned object at or under @a local_abspath.  This is usually done for
  * copied trees.
  *
- * Temporary allocations will be performed in @a scratch_pool, and persistent
- * allocations will use the same pool as @a queue used when it was created.
+ * ### In the present implementation, if a recursive directory item is in
+ *     the queue, then any children (at any depth) of that directory that
+ *     are also in the queue as separate items will get:
+ *       'wcprop_changes' = NULL;
+ *       'remove_lock' = FALSE;
+ *       'remove_changelist' from the recursive parent item;
+ *       'md5_checksum' from the child item in the queue;
+ *     and any children (at any depth) of that directory that are NOT in
+ *     the queue as separate items will get:
+ *       'wcprop_changes' = NULL;
+ *       'remove_lock' = FALSE;
+ *       'remove_changelist' from the recursive parent item;
+ *       'md5_checksum' = NULL  ### means what?
  *
  * @note the @a recurse parameter should be used with extreme care since
  * it will bump ALL nodes under the directory, regardless of their
  * actual inclusion in the new revision.
  *
+ * All pointer data passed to this function (@a local_abspath,
+ * @a wcprop_changes and the checksums) should remain valid until the
+ * queue has been processed by svn_wc_process_committed_queue2().
+ *
+ * Temporary allocations will be performed in @a scratch_pool, and persistent
+ * allocations will use the same pool as @a queue used when it was created.
+ *
  * @since New in 1.7.
  */
 svn_error_t *
@@ -4791,11 +4976,13 @@ svn_wc_queue_committed3(svn_wc_committed
                         const apr_array_header_t *wcprop_changes,
                         svn_boolean_t remove_lock,
                         svn_boolean_t remove_changelist,
-                        const svn_checksum_t *checksum,
+                        const svn_checksum_t *md5_checksum,
+                        const svn_checksum_t *sha1_checksum,
                         apr_pool_t *scratch_pool);
 
 /** Same as svn_wc_queue_committed3() except @a path doesn't have to be an
- * abspath and @a adm_access is unused.
+ * abspath and @a adm_access is unused and a SHA-1 checksum cannot be
+ * specified.
  *
  * @since New in 1.6.
  *
@@ -4810,7 +4997,7 @@ svn_wc_queue_committed2(svn_wc_committed
                         const apr_array_header_t *wcprop_changes,
                         svn_boolean_t remove_lock,
                         svn_boolean_t remove_changelist,
-                        const svn_checksum_t *checksum,
+                        const svn_checksum_t *md5_checksum,
                         apr_pool_t *scratch_pool);
 
 
@@ -5036,7 +5223,8 @@ svn_wc_crawl_revisions5(svn_wc_context_t
  * @since New in 1.6.
  * @deprecated Provided for compatibility with the 1.6 API.
  */
-SVN_DEPRECATED svn_error_t *
+SVN_DEPRECATED
+svn_error_t *
 svn_wc_crawl_revisions4(const char *path,
                         svn_wc_adm_access_t *adm_access,
                         const svn_ra_reporter3_t *reporter,
@@ -5058,6 +5246,7 @@ svn_wc_crawl_revisions4(const char *path
  *
  * @deprecated Provided for compatibility with the 1.5 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_crawl_revisions3(const char *path,
                         svn_wc_adm_access_t *adm_access,
@@ -5560,6 +5749,49 @@ svn_wc_prop_list(apr_hash_t **props,
                  apr_pool_t *pool);
 
 
+/** Return the set of "pristine" properties for @a local_abspath.
+ *
+ * There are node states where properties do not make sense. For these
+ * cases, NULL will be returned in @a *props. Otherwise, a hash table
+ * will always be returned (but may be empty, indicating no properties).
+ *
+ * If the node is locally-added, then @a *props will be set to NULL since
+ * pristine properties are undefined. Note: if this addition is replacing a
+ * previously-deleted node, then the replaced node's properties are not
+ * available until the addition is reverted.
+ *
+ * If the node has been copied (from another node in the repository), then
+ * the pristine properties will correspond to those original properties.
+ *
+ * If the node is locally-deleted, these properties will correspond to
+ * the BASE node's properties, as checked-out from the repository. Note: if
+ * this deletion is a child of a copy, then the pristine properties will
+ * correspond to that copy's properties, not any potential BASE node. The
+ * BASE node's properties will not be accessible until the copy is reverted.
+ *
+ * Nodes that are incomplete, excluded, absent, or not present at the
+ * node's revision will return NULL in @a props.
+ *
+ * If the node is not versioned, SVN_ERR_WC_PATH_NOT_FOUND will be returned.
+ *
+ * ### until we get to single-db: if the node has been marked for deletion,
+ * ### is a directory, and the directory is missing on disk, then the
+ * ### pristine properties will not be available; SVN_ERR_PROPERTY_NOT_FOUND
+ * ### will be returned.
+ *
+ * @a props will be allocated in @a result_pool, and all temporary
+ * allocations will be performed in @a scratch_pool.
+ *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_wc_get_pristine_props(apr_hash_t **props,
+                          svn_wc_context_t *wc_ctx,
+                          const char *local_abspath,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool);
+                          
+
 /** Set @a *value to the value of property @a name for @a path, allocating
  * @a *value in @a pool.  If no such prop, set @a *value to @c NULL.
  * @a name may be a regular or wc property; if it is an entry property,
@@ -6294,17 +6526,14 @@ svn_wc_merge(const char *left,
  * representing the original set of properties that @a propchanges is
  * working against.  @a wc_ctx contains a lock for @a local_abspath.
  *
- * If @a base_merge is @c FALSE only the working properties will be changed,
- * if it is @c TRUE both the base and working properties will be changed.
+ * Only the working properties will be changed.
  *
  * If @a state is non-NULL, set @a *state to the state of the properties
  * after the merge.
  *
  * If conflicts are found when merging working properties, they are
  * described in a temporary .prej file (or appended to an already-existing
- * .prej file), and the entry is marked "conflicted".  Base properties
- * are changed unconditionally, if @a base_merge is @c TRUE, they never result
- * in a conflict.
+ * .prej file), and the entry is marked "conflicted".
  *
  * If @a cancel_func is non-NULL, invoke it with @a cancel_baton at various
  * points during the operation.  If it returns an error (typically
@@ -6323,7 +6552,6 @@ svn_wc_merge_props3(svn_wc_notify_state_
                     const svn_wc_conflict_version_t *right_version,
                     apr_hash_t *baseprops,
                     const apr_array_header_t *propchanges,
-                    svn_boolean_t base_merge,
                     svn_boolean_t dry_run,
                     svn_wc_conflict_resolver_func_t conflict_func,
                     void *conflict_baton,
@@ -6331,8 +6559,14 @@ svn_wc_merge_props3(svn_wc_notify_state_
                     void *cancel_baton,
                     apr_pool_t *scratch_pool);
 
+
 /** Similar to svn_wc_merge_props3, but takes an access baton and relative
- * path, no cancel_function and no left and right version.
+ * path, no cancel_function, and no left and right version.
+ *
+ * This function has the @a base_merge parameter which (when TRUE) will
+ * apply @a propchanges to this node's pristine set of properties. This
+ * functionality is not supported on newer APIs -- pristine information
+ * should only be changed through an update editor drive.
  *
  * @since New in 1.5.
  * @deprecated Provided for backward compatibility with the 1.6 API.
@@ -6431,10 +6665,20 @@ svn_wc_get_pristine_contents(svn_stream_
                              apr_pool_t *scratch_pool);
 
 
-/** Returns a path to the pristine copy of @a path. Should use
- * svn_wc_get_pristine_contents() instead.
+/** Set *PRISTINE_PATH to the path of the "normal" pristine text file for
+ * the versioned file PATH.
+ *
+ * If PATH does not have a pristine text, set *PRISTINE_PATH to a path where
+ * nothing exists on disk (in a directory that does exist).
+ *
+ * @note: Before version 1.7, the behaviour in that case was to provide the
+ * path where the pristine text *would be* if it were present.  The new
+ * behaviour is intended to provide backward compatibility for callers that
+ * open or test the provided path immediately, and not for callers that
+ * store the path for later use.
  *
  * @deprecated Provided for backwards compatibility with the 1.5 API.
+ * Callers should use svn_wc_get_pristine_contents() instead.
  */
 SVN_DEPRECATED
 svn_error_t *
@@ -6507,8 +6751,9 @@ typedef svn_error_t * (*svn_wc_upgrade_g
                                     const char **repos_uuid,
                                     void *baton,
                                     const char *url,
-                                    apr_pool_t *scratch_pool,
-                                    apr_pool_t *result_pool);
+                                    apr_pool_t *result_pool,
+                                    apr_pool_t *scratch_pool);
+
 
 /**
  * Upgrade the working copy at @a local_abspath to the latest metadata
@@ -6539,7 +6784,8 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
                void *cancel_baton,
                svn_wc_notify_func2_t notify_func,
                void *notify_baton,
-               apr_pool_t *pool);
+               apr_pool_t *scratch_pool);
+
 
 /** Relocation validation callback typedef.
  *
@@ -6549,8 +6795,8 @@ svn_wc_upgrade(svn_wc_context_t *wc_ctx,
  * @a baton is a closure object; it should be provided by the
  * implementation, and passed by the caller.
  *
- * If @a root is TRUE, then the implementation should make sure that @a url
- * is the repository root.  Else, it can be an URL inside the repository.
+ * If @a root_url is passed, then the implementation should make sure that
+ * @a url is the repository root.
  * @a pool may be used for temporary allocations.
  *
  * @since New in 1.5.
@@ -6561,8 +6807,11 @@ typedef svn_error_t *(*svn_wc_relocation
                                                        const char *root_url,
                                                        apr_pool_t *pool);
 
-/** Similar to #svn_wc_relocation_validator3_t, but without
- * the @a root_url arguments.
+/** Similar to #svn_wc_relocation_validator3_t, but with
+ * the @a root argument.
+ *
+ * If @a root is TRUE, then the implementation should make sure that @a url
+ * is the repository root.  Else, it can be an URL inside the repository.
  *
  * @deprecated Provided for backwards compatibility with the 1.4 API.
  */
@@ -6808,6 +7057,9 @@ svn_wc_create_tmp_file(apr_file_t **fp,
  * whose newlines and keywords are converted using the translation
  * as requested by @a flags.
  *
+ * If @a cancel_func is non-NULL, call it with @a cancel_baton to determine
+ * if the client has cancelled the operation.
+ *
  * When translating to the normal form, inconsistent eol styles will be
  * repaired when appropriate for the given setting.  When translating
  * from normal form, no EOL repair is performed (consistency is assumed).
@@ -6838,13 +7090,15 @@ svn_wc_translated_file3(const char **xla
                         svn_wc_context_t *wc_ctx,
                         const char *versioned_abspath,
                         apr_uint32_t flags,
+                        svn_cancel_func_t cancel_func,
+                        void *cancel_baton,
                         apr_pool_t *result_pool,
                         apr_pool_t *scratch_pool);
 
 
 /** Similar to svn_wc_translated_file3(), but with an adm_access baton
- * and relative paths instead of a wc_context and absolute paths, and
- * with a single pool.
+ * and relative paths instead of a wc_context and absolute paths, with
+ * a single pool, and no cancellation func/baton.
  *
  * @since New in 1.4.
  * @deprecated Provided for compatibility with the 1.6 API
@@ -6931,9 +7185,13 @@ svn_wc_translated_stream(svn_stream_t **
  * is usually about to become the new text base anyway, but the installation
  * of the new text base is outside the scope of this function.)
  *
- * If @a digest is non-NULL, put the MD5 checksum of (@a local_abspath
- * translated to repository-normal form) into @a digest, which must point to
- * @c APR_MD5_DIGESTSIZE bytes of storage.
+ * If @a new_text_base_md5_checksum is non-NULL, set
+ * @a *new_text_base_md5_checksum to the MD5 checksum of (@a local_abspath
+ * translated to repository-normal form), allocated in @a result_pool.
+ *
+ * If @a new_text_base_sha1_checksum in non-NULL, store a copy of (@a
+ * local_abspath translated to repository-normal form) in the pristine text
+ * store, and set @a *new_text_base_sha1_checksum to its SHA-1 checksum.
  *
  * If @a fulltext, send the untranslated copy of @a local_abspath through
  * @a editor as full-text; else send it as svndiff against the current text
@@ -6951,7 +7209,8 @@ svn_wc_translated_stream(svn_stream_t **
  */
 svn_error_t *
 svn_wc_transmit_text_deltas3(const char **tempfile,
-                             unsigned char digest[],
+                             const svn_checksum_t **new_text_base_md5_checksum,
+                             const svn_checksum_t **new_text_base_sha1_checksum,
                              svn_wc_context_t *wc_ctx,
                              const char *local_abspath,
                              svn_boolean_t fulltext,
@@ -6961,11 +7220,13 @@ svn_wc_transmit_text_deltas3(const char 
                              apr_pool_t *scratch_pool);
 
 /** Similar to svn_wc_transmit_text_deltas3(), but with a relative path
- * and adm_access baton.
+ * and adm_access baton, and the checksum output is an MD5 digest instead of
+ * two svn_checksum_t objects.
  *
  * @since New in 1.4.
  * @deprecated Provided for backwards compatibility with the 1.6 API.
  */
+SVN_DEPRECATED
 svn_error_t *
 svn_wc_transmit_text_deltas2(const char **tempfile,
                              unsigned char digest[],
@@ -7355,6 +7616,32 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx,
 
 /** @} */
 
+/**
+ * Set @a kind to the @c svn_node_kind_t of @a abspath.  Use @a wc_ctx
+ * to access the working copy, and @a scratch_pool for all temporary
+ * allocations.
+ *
+ * If @a abspath is not under version control, set @a kind to @c svn_node_none.
+ * If it is versioned but hidden and @a show_hidden is @c FALSE, also return @c
+ * svn_node_none.
+ *
+ * ### What does hidden really mean?
+ * ### What happens when show_hidden is TRUE?
+ *
+ * If the node's info is incomplete, it may or may not have a known node kind
+ * set. If the kind is not known (yet), set @a kind to @c svn_node_unknown.
+ * Otherwise return the node kind even though the node is marked incomplete.
+ *
+ * @since New in 1.7.
+ */
+svn_error_t *
+svn_wc_read_kind(svn_node_kind_t *kind,
+                 svn_wc_context_t *wc_ctx,
+                 const char *abspath,
+                 svn_boolean_t show_hidden,
+                 apr_pool_t *scratch_pool);
+
+
 /** @} */
 
 #ifdef __cplusplus

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/add.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/add.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/add.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/add.c Tue Aug 10 20:55:56 2010
@@ -515,12 +515,16 @@ add(void *baton, apr_pool_t *result_pool
     }
   else if (kind == svn_node_file)
     err = add_file(b->local_abspath, b->ctx, scratch_pool);
+  else if (kind == svn_node_none)
+    return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+                             _("'%s' not found"),
+                             svn_dirent_local_style(b->local_abspath,
+                                                    scratch_pool));
   else
-    err = svn_wc_add4(b->ctx->wc_ctx, b->local_abspath, b->depth, NULL,
-                      SVN_INVALID_REVNUM,
-                      b->ctx->cancel_func, b->ctx->cancel_baton,
-                      b->ctx->notify_func2, b->ctx->notify_baton2,
-                      scratch_pool);
+    return svn_error_createf(SVN_ERR_UNSUPPORTED_FEATURE, NULL,
+                             _("Unsupported node kind for path '%s'"),
+                             svn_dirent_local_style(b->local_abspath,
+                                                    scratch_pool));
 
   /* Ignore SVN_ERR_ENTRY_EXISTS when FORCE is set.  */
   if (err && err->apr_err == SVN_ERR_ENTRY_EXISTS && b->force)
@@ -560,14 +564,16 @@ add_parent_dirs(svn_client_ctx_t *ctx,
 
   parent_abspath = svn_dirent_dirname(local_abspath, scratch_pool);
 
-  /* ### Do we need locks here?  Are locks being enforced? 1.6 used to
-         acquire and release locks. */
   SVN_ERR(add_parent_dirs(ctx, parent_abspath, scratch_pool));
   SVN_ERR(svn_wc_add4(ctx->wc_ctx, local_abspath, svn_depth_infinity,
                       NULL, SVN_INVALID_REVNUM,
                       ctx->cancel_func, ctx->cancel_baton,
                       ctx->notify_func2, ctx->notify_baton2,
                       scratch_pool));
+  /* ### New dir gets added with its own per-directory lock which we
+     must release.  This code should be redundant when we move to a
+     single db. */
+  SVN_ERR(svn_wc__release_write_lock(ctx->wc_ctx, local_abspath, scratch_pool));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/blame.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/blame.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/blame.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/blame.c Tue Aug 10 20:55:56 2010
@@ -107,8 +107,8 @@ struct delta_baton {
   svn_txdelta_window_handler_t wrapped_handler;
   void *wrapped_baton;
   struct file_rev_baton *file_rev_baton;
-  apr_file_t *source_file;  /* the delta source */
-  apr_file_t *file;  /* the result of the delta */
+  svn_stream_t *source_stream;  /* the delta source */
+  svn_stream_t *stream;  /* the result of the delta */
   const char *filename;
 };
 
@@ -325,9 +325,9 @@ window_handler(svn_txdelta_window_t *win
      It is important to do this early, since otherwise, they will be deleted
      before all handles are closed, which leads to failures on some platforms
      when new tempfiles are to be created. */
-  if (dbaton->source_file)
-    SVN_ERR(svn_io_file_close(dbaton->source_file, frb->currpool));
-  SVN_ERR(svn_io_file_close(dbaton->file, frb->currpool));
+  if (dbaton->source_stream)
+    SVN_ERR(svn_stream_close(dbaton->source_stream));
+  SVN_ERR(svn_stream_close(dbaton->stream));
 
   /* If we are including merged revisions, we need to add each rev to the
      merged chain. */
@@ -455,24 +455,24 @@ file_rev_handler(void *baton, const char
 
   /* Prepare the text delta window handler. */
   if (frb->last_filename)
-    SVN_ERR(svn_io_file_open(&delta_baton->source_file, frb->last_filename,
-                             APR_READ, APR_OS_DEFAULT, frb->currpool));
+    SVN_ERR(svn_stream_open_readonly(&delta_baton->source_stream, frb->last_filename,
+                                     frb->currpool, pool));
   else
     /* Means empty stream below. */
-    delta_baton->source_file = NULL;
-  last_stream = svn_stream_from_aprfile2(delta_baton->source_file, TRUE, pool);
+    delta_baton->source_stream = NULL;
+  last_stream = svn_stream_disown(delta_baton->source_stream, pool);
 
   if (frb->include_merged_revisions && !frb->merged_revision)
     filepool = frb->filepool;
   else
     filepool = frb->currpool;
 
-  SVN_ERR(svn_io_open_unique_file3(&delta_baton->file,
-                                   &delta_baton->filename,
-                                   NULL,
-                                   svn_io_file_del_on_pool_cleanup,
-                                   filepool, filepool));
-  cur_stream = svn_stream_from_aprfile2(delta_baton->file, TRUE, frb->currpool);
+  SVN_ERR(svn_stream_open_unique(&delta_baton->stream,
+                                 &delta_baton->filename,
+                                 NULL,
+                                 svn_io_file_del_on_pool_cleanup,
+                                 filepool, filepool));
+  cur_stream = svn_stream_disown(delta_baton->stream, filepool);
 
   /* Get window handler for applying delta. */
   svn_txdelta_apply(last_stream, cur_stream, NULL, NULL,
@@ -680,7 +680,7 @@ svn_client_blame5(const char *target,
     {
       /* If the local file is modified we have to call the handler on the
          working copy file with keywords unexpanded */
-      svn_wc_status2_t *status;
+      svn_wc_status3_t *status;
 
       SVN_ERR(svn_wc_status3(&status, ctx->wc_ctx, target_abspath_or_url, pool,
                              pool));

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cat.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cat.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cat.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cat.c Tue Aug 10 20:55:56 2010
@@ -68,8 +68,7 @@ cat_local_file(svn_wc_context_t *wc_ctx,
 
   SVN_ERR_ASSERT(SVN_CLIENT__REVKIND_IS_LOCAL_TO_WC(revision->kind));
 
-  SVN_ERR(svn_wc__node_get_kind(&kind, wc_ctx, local_abspath, FALSE,
-                                scratch_pool));
+  SVN_ERR(svn_wc_read_kind(&kind, wc_ctx, local_abspath, FALSE, scratch_pool));
 
   if (kind == svn_node_unknown || kind == svn_node_none)
     return svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
@@ -86,18 +85,17 @@ cat_local_file(svn_wc_context_t *wc_ctx,
     {
       SVN_ERR(svn_wc_get_pristine_contents2(&input, wc_ctx, local_abspath,
                                             scratch_pool, scratch_pool));
-
       if (input == NULL)
         return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
                  _("'%s' has no base revision until it is committed"),
                  svn_dirent_local_style(local_abspath, scratch_pool));
 
-      SVN_ERR(svn_wc_get_prop_diffs2(NULL, &props, wc_ctx, local_abspath,
-                                     scratch_pool, scratch_pool));
+      SVN_ERR(svn_wc_get_pristine_props(&props, wc_ctx, local_abspath,
+                                        scratch_pool, scratch_pool));
     }
   else
     {
-      svn_wc_status2_t *status;
+      svn_wc_status3_t *status;
 
       SVN_ERR(svn_stream_open_readonly(&input, local_abspath, scratch_pool,
                                        scratch_pool));

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/changelist.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/changelist.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/changelist.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/changelist.c Tue Aug 10 20:55:56 2010
@@ -66,8 +66,7 @@ set_node_changelist(const char *local_ab
                                  b->changelist_hash, pool))
     return SVN_NO_ERROR;
 
-  SVN_ERR(svn_wc__node_get_kind(&kind, b->ctx->wc_ctx, local_abspath,
-                                FALSE, pool));
+  SVN_ERR(svn_wc_read_kind(&kind, b->ctx->wc_ctx, local_abspath, FALSE, pool));
 
   /* We only care about files right now. */
   if (kind != svn_node_file)
@@ -194,7 +193,7 @@ get_node_changelist(const char *local_ab
   svn_node_kind_t kind;
   const char *changelist;
 
-  SVN_ERR(svn_wc__node_get_kind(&kind, b->wc_ctx, local_abspath, FALSE, pool));
+  SVN_ERR(svn_wc_read_kind(&kind, b->wc_ctx, local_abspath, FALSE, pool));
   SVN_ERR(svn_wc__node_get_changelist(&changelist, b->wc_ctx,
                                       local_abspath, pool, pool));
 

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/checkout.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/checkout.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/checkout.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/checkout.c Tue Aug 10 20:55:56 2010
@@ -47,11 +47,41 @@
 
 /*** Public Interfaces. ***/
 
+static svn_error_t *
+initialize_area(svn_revnum_t *result_rev,
+                const char *local_abspath,
+                const svn_opt_revision_t *revision,
+                const char *session_url,
+                const char *repos_root,
+                const char *uuid,
+                svn_revnum_t revnum,
+                svn_depth_t depth,
+                svn_boolean_t *use_sleep,
+                svn_boolean_t ignore_externals,
+                svn_boolean_t allow_unver_obstructions,
+                svn_boolean_t innercheckout,
+                svn_client_ctx_t *ctx,
+                apr_pool_t *pool)
+{
+  if (depth == svn_depth_unknown)
+    depth = svn_depth_infinity;
+
+  /* Make the unversioned directory into a versioned one.  */
+  SVN_ERR(svn_wc_ensure_adm4(ctx->wc_ctx, local_abspath, session_url,
+                             repos_root, uuid, revnum, depth, pool));
+  /* Have update fix the incompleteness. */
+  return svn_error_return(svn_client__update_internal(result_rev, local_abspath,
+                                    revision, depth, TRUE, ignore_externals,
+                                    allow_unver_obstructions,
+                                    use_sleep, FALSE, innercheckout,
+                                    ctx, pool));
+}
+
 
 svn_error_t *
 svn_client__checkout_internal(svn_revnum_t *result_rev,
                               const char *url,
-                              const char *path,
+                              const char *local_abspath,
                               const svn_opt_revision_t *peg_revision,
                               const svn_opt_revision_t *revision,
                               const svn_client__ra_session_from_path_results *ra_cache,
@@ -70,13 +100,11 @@ svn_client__checkout_internal(svn_revnum
   const char *session_url;
   svn_node_kind_t kind;
   const char *uuid, *repos_root;
-  const char *local_abspath;
 
   /* Sanity check.  Without these, the checkout is meaningless. */
-  SVN_ERR_ASSERT(path != NULL);
+  SVN_ERR_ASSERT(local_abspath != NULL);
   SVN_ERR_ASSERT(url != NULL);
-
-  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
+  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
   /* Fulfill the docstring promise of svn_client_checkout: */
   if ((revision->kind != svn_opt_revision_number)
@@ -150,15 +178,18 @@ svn_client__checkout_internal(svn_revnum
       (SVN_ERR_UNSUPPORTED_FEATURE , NULL,
        _("URL '%s' refers to a file, not a directory"), session_url);
 
-  SVN_ERR(svn_io_check_path(path, &kind, pool));
+  SVN_ERR(svn_io_check_path(local_abspath, &kind, pool));
 
   if (kind == svn_node_none)
     {
       /* Bootstrap: create an incomplete working-copy root dir.  Its
          entries file should only have an entry for THIS_DIR with a
          URL, revnum, and an 'incomplete' flag.  */
-      SVN_ERR(svn_io_make_dir_recursively(path, pool));
-      goto initialize_area;
+      SVN_ERR(svn_io_make_dir_recursively(local_abspath, pool));
+      err = initialize_area(result_rev, local_abspath, revision, session_url,
+                            repos_root, uuid, revnum, depth, use_sleep,
+                            ignore_externals, allow_unver_obstructions,
+                            innercheckout, ctx, pool);
     }
   else if (kind == svn_node_dir)
     {
@@ -168,65 +199,55 @@ svn_client__checkout_internal(svn_revnum
       SVN_ERR(svn_wc_check_wc2(&wc_format, ctx->wc_ctx, local_abspath, pool));
       if (! wc_format)
         {
-        initialize_area:
-
-          if (depth == svn_depth_unknown)
-            depth = svn_depth_infinity;
-
-          /* Make the unversioned directory into a versioned one.  */
-          SVN_ERR(svn_wc_ensure_adm4(ctx->wc_ctx, local_abspath, session_url,
-                                     repos_root, uuid, revnum, depth,
-                                     pool));
-          /* Have update fix the incompleteness. */
-          err = svn_client__update_internal(result_rev, path, revision,
-                                            depth, TRUE, ignore_externals,
-                                            allow_unver_obstructions,
-                                            use_sleep, FALSE, innercheckout,
-                                            ctx, pool);
-          goto done;
+          err = initialize_area(result_rev, local_abspath, revision, session_url,
+                                repos_root, uuid, revnum, depth, use_sleep,
+                                ignore_externals, allow_unver_obstructions,
+                                innercheckout, ctx, pool);
         }
-
-      /* Get PATH's entry. */
-      SVN_ERR(svn_wc__node_get_url(&entry_url, ctx->wc_ctx, local_abspath,
-                                   pool, pool));
-
-      /* If PATH's existing URL matches the incoming one, then
-         just update.  This allows 'svn co' to restart an
-         interrupted checkout. */
-      if (strcmp(entry_url, session_url) == 0)
+      else
         {
-          err = svn_client__update_internal(result_rev, path, revision,
-                                            depth, TRUE, ignore_externals,
-                                            allow_unver_obstructions,
-                                            use_sleep, FALSE, innercheckout,
-                                            ctx, pool);
+          /* Get PATH's URL. */
+          SVN_ERR(svn_wc__node_get_url(&entry_url, ctx->wc_ctx, local_abspath,
+                                       pool, pool));
+
+          /* If PATH's existing URL matches the incoming one, then
+             just update.  This allows 'svn co' to restart an
+             interrupted checkout. */
+          if (strcmp(entry_url, session_url) == 0)
+            {
+              err = svn_client__update_internal(result_rev, local_abspath,
+                                                revision, depth, TRUE,
+                                                ignore_externals,
+                                                allow_unver_obstructions,
+                                                use_sleep, FALSE, innercheckout,
+                                                ctx, pool);
+            }
+          else
+            return svn_error_createf(
+                          SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
+                          _("'%s' is already a working copy for a different URL;"
+                            " use 'svn update' to update it"),
+                          svn_dirent_local_style(local_abspath, pool));
         }
-      else
-        return svn_error_createf(
-                      SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
-                      _("'%s' is already a working copy for a different URL;"
-                        " use 'svn update' to update it"),
-                      svn_dirent_local_style(path, pool));
     }
   else
     {
       return svn_error_createf(SVN_ERR_WC_NODE_KIND_CHANGE, NULL,
                                _("'%s' already exists and is not a directory"),
-                               svn_dirent_local_style(path, pool));
+                               svn_dirent_local_style(local_abspath, pool));
     }
 
- done:
   if (err)
     {
       /* Don't rely on the error handling to handle the sleep later, do
          it now */
-      svn_io_sleep_for_timestamps(path, pool);
+      svn_io_sleep_for_timestamps(local_abspath, pool);
       return svn_error_return(err);
     }
   *use_sleep = TRUE;
 
   if (sleep_here)
-    svn_io_sleep_for_timestamps(path, pool);
+    svn_io_sleep_for_timestamps(local_abspath, pool);
 
   return SVN_NO_ERROR;
 }
@@ -243,8 +264,13 @@ svn_client_checkout3(svn_revnum_t *resul
                      svn_client_ctx_t *ctx,
                      apr_pool_t *pool)
 {
-  return svn_client__checkout_internal(result_rev, URL, path, peg_revision,
-                                       revision, NULL, depth, ignore_externals,
+  const char *local_abspath;
+
+  SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
+
+  return svn_client__checkout_internal(result_rev, URL, local_abspath,
+                                       peg_revision, revision, NULL, depth,
+                                       ignore_externals,
                                        allow_unver_obstructions, FALSE, NULL,
                                        ctx, pool);
 }

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cleanup.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cleanup.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cleanup.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/cleanup.c Tue Aug 10 20:55:56 2010
@@ -62,7 +62,7 @@ svn_client_cleanup(const char *path,
 /* callback baton for fetch_repos_info */
 struct repos_info_baton
 {
-  apr_pool_t *pool;
+  apr_pool_t *state_pool;
   svn_client_ctx_t *ctx;
   const char *last_repos;
   const char *last_uuid;
@@ -75,8 +75,8 @@ fetch_repos_info(const char **repos_root
                  const char **repos_uuid,
                  void *baton,
                  const char *url,
-                 apr_pool_t *scratch_pool,
-                 apr_pool_t *result_pool)
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
 {
   struct repos_info_baton *ri = baton;
   apr_pool_t *subpool;
@@ -98,8 +98,8 @@ fetch_repos_info(const char **repos_root
   SVN_ERR(svn_ra_get_uuid2(ra_session, repos_uuid, result_pool));
 
   /* Store data for further calls */
-  ri->last_repos = apr_pstrdup(ri->pool, *repos_root);
-  ri->last_uuid = apr_pstrdup(ri->pool, *repos_uuid);
+  ri->last_repos = apr_pstrdup(ri->state_pool, *repos_root);
+  ri->last_uuid = apr_pstrdup(ri->state_pool, *repos_uuid);
 
   svn_pool_destroy(subpool);
 
@@ -117,7 +117,8 @@ svn_client_upgrade(const char *path,
   apr_pool_t *iterpool;
   svn_opt_revision_t rev = {svn_opt_revision_unspecified, {0}};
   struct repos_info_baton info_baton;
-  info_baton.pool = scratch_pool;
+
+  info_baton.state_pool = scratch_pool;
   info_baton.ctx = ctx;
   info_baton.last_repos = NULL;
   info_baton.last_uuid = NULL;
@@ -177,8 +178,8 @@ svn_client_upgrade(const char *path,
              upgraded if it's a dir. If it's a file then the lookup is done
              in an adm_dir belonging to the real wc and since that was
              updated before the externals no error is returned. */
-          err = svn_wc__node_get_kind(&kind, ctx->wc_ctx, external_abspath,
-                                        FALSE, iterpool);
+          err = svn_wc_read_kind(&kind, ctx->wc_ctx, external_abspath, FALSE,
+                                 iterpool);
 
           if (err && err->apr_err == SVN_ERR_WC_UPGRADE_REQUIRED)
             {

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/client.h
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/client.h?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/client.h (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/client.h Tue Aug 10 20:55:56 2010
@@ -250,8 +250,8 @@ svn_client__get_youngest_common_ancestor
    that it is the same node in both PEG_REVISION and REVISION.  If it
    is not, then @c SVN_ERR_CLIENT_UNRELATED_RESOURCES is returned.
 
-   BASE_DIR is the working copy path the ra_session corresponds to, should
-   only be used if PATH_OR_URL is a url.
+   BASE_DIR_ABSPATH is the working copy path the ra_session corresponds to,
+   should only be used if PATH_OR_URL is a url.
 
    If PEG_REVISION's kind is svn_opt_revision_unspecified, it is
    interpreted as "head" for a URL or "working" for a working-copy path.
@@ -269,7 +269,7 @@ svn_client__ra_session_from_path(svn_ra_
                                  svn_revnum_t *rev_p,
                                  const char **url_p,
                                  const char *path_or_url,
-                                 const char *base_dir,
+                                 const char *base_dir_abspath,
                                  const svn_opt_revision_t *peg_revision,
                                  const svn_opt_revision_t *revision,
                                  svn_client_ctx_t *ctx,
@@ -376,7 +376,7 @@ svn_client__default_walker_error_handler
       - READ_ONLY_WC indicates that the RA layer should not attempt to
         modify the WC props directly.
 
-   BASE_DIR may be NULL if the RA operation does not correspond to a
+   BASE_DIR_ABSPATH may be NULL if the RA operation does not correspond to a
    working copy (in which case, USE_ADMIN should be FALSE).
 
    The calling application's authentication baton is provided in CTX,
@@ -387,7 +387,7 @@ svn_client__default_walker_error_handler
 svn_error_t *
 svn_client__open_ra_session_internal(svn_ra_session_t **ra_session,
                                      const char *base_url,
-                                     const char *base_dir,
+                                     const char *base_dir_abspath,
                                      const apr_array_header_t *commit_items,
                                      svn_boolean_t use_admin,
                                      svn_boolean_t read_only_wc,
@@ -483,23 +483,24 @@ svn_client__make_local_parents(const cha
 
 /*** Checkout, update and switch ***/
 
-/* Update a working copy PATH to REVISION, and (if not NULL) set
+/* Update a working copy LOCAL_ABSPATH to REVISION, and (if not NULL) set
    RESULT_REV to the update revision.
 
    If DEPTH is svn_depth_unknown, then use whatever depth is already
-   set for PATH, or @c svn_depth_infinity if PATH does not exist.
+   set for LOCAL_ABSPATH, or @c svn_depth_infinity if LOCAL_ABSPATH does
+   not exist.
 
    Else if DEPTH is svn_depth_infinity, then update fully recursively
    (resetting the existing depth of the working copy if necessary).
-   Else if DEPTH is svn_depth_files, update all files under PATH (if
+   Else if DEPTH is svn_depth_files, update all files under LOCAL_ABSPATH (if
    any), but exclude any subdirectories.  Else if DEPTH is
    svn_depth_immediates, update all files and include immediate
    subdirectories (at svn_depth_empty).  Else if DEPTH is
-   svn_depth_empty, just update PATH; if PATH is a directory, that
-   means touching only its properties not its entries.
+   svn_depth_empty, just update LOCAL_ABSPATH; if LOCAL_ABSPATH is a
+   directory, that means touching only its properties not its entries.
 
    If DEPTH_IS_STICKY is set and DEPTH is not svn_depth_unknown, then
-   in addition to updating PATH, also set its sticky ambient depth
+   in addition to updating LOCAL_ABSPATH, also set its sticky ambient depth
    value to DEPTH.
 
    If IGNORE_EXTERNALS is true, do no externals processing.
@@ -510,7 +511,7 @@ svn_client__make_local_parents(const cha
    to TRUE if a sleep is required, and will not change
    *TIMESTAMP_SLEEP if no sleep is required.
 
-   If ALLOW_UNVER_OBSTRUCTIONS is TRUE, unversioned children of PATH
+   If ALLOW_UNVER_OBSTRUCTIONS is TRUE, unversioned children of LOCAL_ABSPATH
    that obstruct items added from the repos are tolerated; if FALSE,
    these obstructions cause the update to fail.
 
@@ -524,7 +525,7 @@ svn_client__make_local_parents(const cha
 */
 svn_error_t *
 svn_client__update_internal(svn_revnum_t *result_rev,
-                            const char *path,
+                            const char *local_abspath,
                             const svn_opt_revision_t *revision,
                             svn_depth_t depth,
                             svn_boolean_t depth_is_sticky,
@@ -569,15 +570,15 @@ typedef struct
   svn_node_kind_t *kind_p;
 } svn_client__ra_session_from_path_results;
 
-/* Checkout into PATH a working copy of URL at REVISION, and (if not
+/* Checkout into LOCAL_ABSPATH a working copy of URL at REVISION, and (if not
    NULL) set RESULT_REV to the checked out revision.
 
    If DEPTH is svn_depth_infinity, then check out fully recursively.
-   Else if DEPTH is svn_depth_files, checkout all files under PATH (if
+   Else if DEPTH is svn_depth_files, checkout all files under LOCAL_ABSPATH (if
    any), but not subdirectories.  Else if DEPTH is
    svn_depth_immediates, check out all files and include immediate
    subdirectories (at svn_depth_empty).  Else if DEPTH is
-   svn_depth_empty, just check out PATH, with none of its entries.
+   svn_depth_empty, just check out LOCAL_ABSPATH, with none of its entries.
 
    DEPTH must be a definite depth, not (e.g.) svn_depth_unknown.
 
@@ -591,18 +592,18 @@ typedef struct
    If TIMESTAMP_SLEEP is NULL this function will sleep before
    returning to ensure timestamp integrity.  If TIMESTAMP_SLEEP is not
    NULL then the function will not sleep but will set *TIMESTAMP_SLEEP
-   to TRUE if a sleep is required, and will not change
-   *TIMESTAMP_SLEEP if no sleep is required.  If
-   ALLOW_UNVER_OBSTRUCTIONS is TRUE, unversioned children of PATH that
-   obstruct items added from the repos are tolerated; if FALSE, these
-   obstructions cause the checkout to fail.
+   to TRUE if a sleep is required, and will not change *TIMESTAMP_SLEEP
+   if no sleep is required.  If ALLOW_UNVER_OBSTRUCTIONS is TRUE,
+   unversioned children of LOCAL_ABSPATH that obstruct items added from
+   the repos are tolerated; if FALSE, these obstructions cause the checkout
+   to fail.
 
    If INNERCHECKOUT is true, no anchor check is performed on the target.
    */
 svn_error_t *
 svn_client__checkout_internal(svn_revnum_t *result_rev,
                               const char *URL,
-                              const char *path,
+                              const char *local_abspath,
                               const svn_opt_revision_t *peg_revision,
                               const svn_opt_revision_t *revision,
                               const svn_client__ra_session_from_path_results *ra_cache,
@@ -732,7 +733,7 @@ svn_client__get_diff_summarize_editor(co
 typedef struct
 {
     /* The absolute source path or url. */
-    const char *src;
+    const char *src_abspath_or_url;
 
     /* The base name of the object.  It should be the same for both src
        and dst. */
@@ -755,7 +756,7 @@ typedef struct
     svn_revnum_t src_revnum;
 
     /* The absolute destination path or url */
-    const char *dst;
+    const char *dst_abspath_or_url;
 
     /* The absolute source path or url of the destination's parent. */
     const char *dst_parent_abspath;
@@ -924,10 +925,13 @@ svn_client__condense_commit_items(const 
    *NEW_TEXT_BASE_ABSPATHS to a hash that maps (const char *) paths (from
    the items' paths) to the (const char *) abspaths of these files.
 
-   MD5 checksums, if available,  for the new text bases of committed
-   files are stored in *CHECKSUMS, which maps const char* paths (from the
-   items' paths) to const svn_checksum_t * digests.  CHECKSUMS may be
-   null.  */
+   If MD5_CHECKSUMS is not NULL, set *MD5_CHECKSUMS to a hash containing,
+   for each file transmitted, a mapping from the commit-item's (const
+   char *) path to the (const svn_checksum_t *) MD5 checksum of its new text
+   base.  Similarly for SHA1_CHECKSUMS.
+
+   Use POOL for all allocations.
+   */
 svn_error_t *
 svn_client__do_commit(const char *base_url,
                       const apr_array_header_t *commit_items,
@@ -935,7 +939,8 @@ svn_client__do_commit(const char *base_u
                       void *edit_baton,
                       const char *notify_path_prefix,
                       apr_hash_t **new_text_base_abspaths,
-                      apr_hash_t **checksums,
+                      apr_hash_t **md5_checksums,
+                      apr_hash_t **sha1_checksums,
                       svn_client_ctx_t *ctx,
                       apr_pool_t *pool);
 
@@ -946,7 +951,7 @@ svn_client__do_commit(const char *base_u
 /* Handle changes to the svn:externals property described by EXTERNALS_OLD,
 
    EXTERNALS_NEW, and AMBIENT_DEPTHS.  The tree's top level directory
-   is at TO_PATH and corresponds to FROM_URL URL in the repository,
+   is at TO_ABSPATH and corresponds to FROM_URL URL in the repository,
    which has a root URL of REPOS_ROOT_URL.  A write lock should be
    held.
 
@@ -982,7 +987,7 @@ svn_client__handle_externals(apr_hash_t 
                              apr_hash_t *externals_new,
                              apr_hash_t *ambient_depths,
                              const char *from_url,
-                             const char *to_path,
+                             const char *to_abspath,
                              const char *repos_root_url,
                              svn_depth_t requested_depth,
                              svn_boolean_t *timestamp_sleep,
@@ -996,7 +1001,7 @@ svn_client__handle_externals(apr_hash_t 
    checked out -- they will have no administrative subdirectories.
 
    The checked out or exported tree's top level directory is at
-   TO_PATH and corresponds to FROM_URL URL in the repository, which
+   TO_ABSPATH and corresponds to FROM_URL URL in the repository, which
    has a root URL of REPOS_ROOT_URL.
 
    REQUESTED_DEPTH is the requested_depth of the driving operation; it
@@ -1011,7 +1016,7 @@ svn_client__handle_externals(apr_hash_t 
 svn_error_t *
 svn_client__fetch_externals(apr_hash_t *externals,
                             const char *from_url,
-                            const char *to_path,
+                            const char *to_abspath,
                             const char *repos_root_url,
                             svn_depth_t requested_depth,
                             svn_boolean_t is_export,

Modified: subversion/branches/ignore-mergeinfo/subversion/libsvn_client/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/ignore-mergeinfo/subversion/libsvn_client/commit.c?rev=984206&r1=984205&r2=984206&view=diff
==============================================================================
--- subversion/branches/ignore-mergeinfo/subversion/libsvn_client/commit.c (original)
+++ subversion/branches/ignore-mergeinfo/subversion/libsvn_client/commit.c Tue Aug 10 20:55:56 2010
@@ -46,7 +46,6 @@
 #include "svn_time.h"
 #include "svn_sorts.h"
 #include "svn_props.h"
-#include "svn_iter.h"
 
 #include "client.h"
 #include "private/svn_wc_private.h"
@@ -611,11 +610,13 @@ get_ra_editor(svn_ra_session_t **ra_sess
 {
   void *commit_baton;
   apr_hash_t *commit_revprops;
+  const char *base_dir_abspath;
+
+  SVN_ERR(svn_dirent_get_absolute(&base_dir_abspath, base_dir, pool));
 
   /* Open an RA session to URL. */
-  SVN_ERR(svn_client__open_ra_session_internal(ra_session,
-                                               base_url, base_dir,
-                                               commit_items,
+  SVN_ERR(svn_client__open_ra_session_internal(ra_session, base_url,
+                                               base_dir_abspath, commit_items,
                                                is_commit, !is_commit,
                                                ctx, pool));
 
@@ -809,27 +810,24 @@ remove_tmpfiles(apr_hash_t *tempfiles,
                 apr_pool_t *pool)
 {
   apr_hash_index_t *hi;
-  apr_pool_t *subpool;
+  apr_pool_t *iterpool;
 
   /* Split if there's nothing to be done. */
   if (! tempfiles)
     return SVN_NO_ERROR;
 
-  /* Make a subpool. */
-  subpool = svn_pool_create(pool);
+  iterpool = svn_pool_create(pool);
 
   /* Clean up any tempfiles. */
   for (hi = apr_hash_first(pool, tempfiles); hi; hi = apr_hash_next(hi))
     {
       const char *path = svn__apr_hash_index_val(hi);
 
-      svn_pool_clear(subpool);
+      svn_pool_clear(iterpool);
 
-      SVN_ERR(svn_io_remove_file2(path, TRUE, subpool));
+      SVN_ERR(svn_io_remove_file2(path, TRUE, iterpool));
     }
-
-  /* Remove the subpool. */
-  svn_pool_destroy(subpool);
+  svn_pool_destroy(iterpool);
 
   return SVN_NO_ERROR;
 }
@@ -934,29 +932,23 @@ collect_lock_tokens(apr_hash_t **result,
   return SVN_NO_ERROR;
 }
 
-struct post_commit_baton
-{
-  svn_wc_committed_queue_t *queue;
-  apr_pool_t *qpool;
-  svn_wc_context_t *wc_ctx;
-  svn_boolean_t keep_changelists;
-  svn_boolean_t keep_locks;
-  apr_hash_t *checksums;
-};
-
+/* Put ITEM onto QUEUE, allocating it in QUEUE's pool...
+ * If a checksum is provided, it can be the MD5 and/or the SHA1. */
 static svn_error_t *
-post_process_commit_item(void *baton, void *this_item, apr_pool_t *pool)
+post_process_commit_item(svn_wc_committed_queue_t *queue,
+                         const svn_client_commit_item3_t *item,
+                         svn_wc_context_t *wc_ctx,
+                         svn_boolean_t keep_changelists,
+                         svn_boolean_t keep_locks,
+                         const svn_checksum_t *md5_checksum,
+                         const svn_checksum_t *sha1_checksum,
+                         apr_pool_t *scratch_pool)
 {
-  struct post_commit_baton *btn = baton;
-  apr_pool_t *subpool = btn->qpool;
-
-  svn_client_commit_item3_t *item =
-    *(svn_client_commit_item3_t **)this_item;
   svn_boolean_t loop_recurse = FALSE;
   svn_boolean_t remove_lock;
 
   /* Is it a missing, deleted directory?
- 
+
      ### Temporary: once we centralise this sort of node is just a
      normal delete and will get handled by the post-commit queue. */
   if (item->kind == svn_node_dir
@@ -965,10 +957,11 @@ post_process_commit_item(void *baton, vo
       svn_boolean_t obstructed;
 
       SVN_ERR(svn_wc__node_is_status_obstructed(&obstructed,
-                                                btn->wc_ctx, item->path, pool));
+                                                wc_ctx, item->path,
+                                                scratch_pool));
       if (obstructed)
         return svn_wc__temp_mark_missing_not_present(item->path,
-                                                     btn->wc_ctx, pool);
+                                                     wc_ctx, scratch_pool);
     }
 
   if ((item->state_flags & SVN_CLIENT_COMMIT_ITEM_ADD)
@@ -976,57 +969,35 @@ post_process_commit_item(void *baton, vo
       && (item->copyfrom_url))
     loop_recurse = TRUE;
 
-  remove_lock = (! btn->keep_locks && (item->state_flags
+  remove_lock = (! keep_locks && (item->state_flags
                                        & SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN));
 
-  /* Allocate the queue in a longer-lived pool than (iter)pool:
-     we want it to survive the next iteration. */
-  return svn_wc_queue_committed3(btn->queue, item->path,
+  return svn_wc_queue_committed3(queue, item->path,
                                  loop_recurse, item->incoming_prop_changes,
-                                 remove_lock, !btn->keep_changelists,
-                                 apr_hash_get(btn->checksums,
-                                              item->path,
-                                              APR_HASH_KEY_STRING),
-                                 subpool);
+                                 remove_lock, !keep_changelists,
+                                 md5_checksum, sha1_checksum, scratch_pool);
 }
 
 
 static svn_error_t *
-commit_item_is_changed(void *baton, void *this_item, apr_pool_t *pool)
+check_nonrecursive_dir_delete(const char *target_path,
+                              svn_wc_context_t *wc_ctx,
+                              svn_depth_t depth,
+                              apr_pool_t *pool)
 {
-  svn_client_commit_item3_t **item = this_item;
-
-  if ((*item)->state_flags != SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN)
-    svn_iter_break(pool);
-
-  return SVN_NO_ERROR;
-}
-
-struct check_dir_delete_baton
-{
-  svn_wc_context_t *wc_ctx;
-  svn_depth_t depth;
-};
-
-static svn_error_t *
-check_nonrecursive_dir_delete(void *baton, void *this_item, apr_pool_t *pool)
-{
-  struct check_dir_delete_baton *btn = baton;
   const char *target_abspath, *lock_abspath;
   svn_boolean_t locked_here;
   svn_node_kind_t kind;
 
-  SVN_ERR(svn_dirent_get_absolute(&target_abspath, *(const char **)this_item,
-                                  pool));
+  SVN_ERR(svn_dirent_get_absolute(&target_abspath, target_path, pool));
 
-  SVN_ERR(svn_wc__node_get_kind(&kind, btn->wc_ctx, target_abspath, FALSE,
-                                pool));
+  SVN_ERR(svn_wc_read_kind(&kind, wc_ctx, target_abspath, FALSE, pool));
   if (kind == svn_node_dir)
     lock_abspath = target_abspath;
   else
     lock_abspath = svn_dirent_dirname(target_abspath, pool);
 
-  SVN_ERR(svn_wc_locked2(&locked_here, NULL, btn->wc_ctx, lock_abspath, pool));
+  SVN_ERR(svn_wc_locked2(&locked_here, NULL, wc_ctx, lock_abspath, pool));
   if (!locked_here)
     return svn_error_create(SVN_ERR_WC_LOCKED, NULL,
                            _("Are all targets part of the same working copy?"));
@@ -1047,22 +1018,22 @@ check_nonrecursive_dir_delete(void *bato
      ### This would be fairly easy to fix, though: just, well,
      ### check the above conditions!
   */
-  if (btn->depth != svn_depth_infinity)
+  if (depth != svn_depth_infinity)
     {
       if (kind == svn_node_dir)
         {
-          svn_wc_status2_t *status;
+          svn_wc_status3_t *status;
 
           /* ### Looking at schedule is probably enough, no need for
                  pristine compare etc. */
-          SVN_ERR(svn_wc_status3(&status, btn->wc_ctx, target_abspath, pool,
+          SVN_ERR(svn_wc_status3(&status, wc_ctx, target_abspath, pool,
                                  pool));
           if (status->text_status == svn_wc_status_deleted ||
               status->text_status == svn_wc_status_replaced)
             {
               const apr_array_header_t *children;
 
-              SVN_ERR(svn_wc__node_get_children(&children, btn->wc_ctx,
+              SVN_ERR(svn_wc__node_get_children(&children, wc_ctx,
                                                 target_abspath, TRUE, pool,
                                                 pool));
 
@@ -1092,19 +1063,20 @@ svn_client_commit4(svn_commit_info_t **c
   void *edit_baton;
   svn_ra_session_t *ra_session;
   const char *log_msg;
-  const char *base_dir;
+  const char *base_abspath;
   const char *base_url;
   const char *target;
   apr_array_header_t *rel_targets;
   apr_hash_t *committables;
   apr_hash_t *lock_tokens;
   apr_hash_t *tempfiles = NULL;
-  apr_hash_t *checksums;
+  apr_hash_t *md5_checksums;
+  apr_hash_t *sha1_checksums;
   apr_array_header_t *commit_items;
   svn_error_t *cmt_err = SVN_NO_ERROR, *unlock_err = SVN_NO_ERROR;
   svn_error_t *bump_err = SVN_NO_ERROR, *cleanup_err = SVN_NO_ERROR;
   svn_boolean_t commit_in_progress = FALSE;
-  const char *current_dir = "";
+  const char *current_abspath;
   const char *notify_prefix;
   int i;
 
@@ -1119,45 +1091,45 @@ svn_client_commit4(svn_commit_info_t **c
     }
 
   /* Condense the target list. */
-  SVN_ERR(svn_dirent_condense_targets(&base_dir, &rel_targets, targets,
+  SVN_ERR(svn_dirent_condense_targets(&base_abspath, &rel_targets, targets,
                                       depth == svn_depth_infinity,
                                       pool, pool));
 
   /* No targets means nothing to commit, so just return. */
-  if (! base_dir)
-    goto cleanup;
+  if (base_abspath == NULL)
+    {
+      /* As per our promise, if *commit_info_p isn't set, provide a
+         default where rev = SVN_INVALID_REVNUM. */
+      if (! *commit_info_p)
+        *commit_info_p = svn_create_commit_info(pool);
+      return SVN_NO_ERROR;
+    }
+
+  SVN_ERR_ASSERT(rel_targets != NULL);
 
-  /* If we calculated only a base_dir and no relative targets, this
+  /* If we calculated only a base and no relative targets, this
      must mean that we are being asked to commit (effectively) a
      single path. */
-  if ((! rel_targets) || (! rel_targets->nelts))
+  if (rel_targets->nelts == 0)
     {
-      const char *parent_dir, *name;
+      const char *name;
 
-      SVN_ERR(svn_wc_get_actual_target2(&parent_dir, &name, ctx->wc_ctx,
-                                        base_dir, pool, pool));
-      if (*name)
-        {
-          svn_node_kind_t kind;
+      /* Recompute our base directory, and push the resulting name (which
+         may be "") into the list of relative targets.  */
+      SVN_ERR(svn_wc_get_actual_target2(&base_abspath, &name, ctx->wc_ctx,
+                                        base_abspath, pool, pool));
 
-          /* Our new "grandfather directory" is the parent directory
-             of the former one. */
-          base_dir = apr_pstrdup(pool, parent_dir);
-
-          /* Make the array if it wasn't already created. */
-          if (! rel_targets)
-            rel_targets = apr_array_make(pool, targets->nelts, sizeof(name));
-
-          /* Now, push this name as a relative path to our new
-             base directory. */
-          APR_ARRAY_PUSH(rel_targets, const char *) = name;
-
-          target = svn_dirent_join(base_dir, name, pool);
-          SVN_ERR(svn_io_check_path(target, &kind, pool));
-        }
+      APR_ARRAY_PUSH(rel_targets, const char *) = name;
     }
 
-  SVN_ERR(svn_wc__acquire_write_lock(NULL, ctx->wc_ctx, base_dir, pool, pool));
+  /* Determine prefix to strip from the commit notify messages */
+  SVN_ERR(svn_dirent_get_absolute(&current_abspath, "", pool));
+  notify_prefix = svn_dirent_get_longest_ancestor(current_abspath,
+                                                  base_abspath,
+                                                  pool);
+
+  SVN_ERR(svn_wc__acquire_write_lock(NULL, ctx->wc_ctx, base_abspath,
+                                     pool, pool));
 
   /* One day we might support committing from multiple working copies, but
      we don't yet.  This check ensures that we don't silently commit a
@@ -1166,19 +1138,23 @@ svn_client_commit4(svn_commit_info_t **c
      At the same time, if a non-recursive commit is desired, do not
      allow a deleted directory as one of the targets. */
   {
-    struct check_dir_delete_baton btn;
+    apr_pool_t *iterpool = svn_pool_create(pool);
 
-    btn.wc_ctx = ctx->wc_ctx;
-    btn.depth = depth;
-    SVN_ERR(svn_iter_apr_array(NULL, targets,
-                               check_nonrecursive_dir_delete, &btn,
-                               pool));
+    for (i = 0; i < targets->nelts; i++)
+      {
+        const char *target_path = APR_ARRAY_IDX(targets, i, const char *);
+
+        svn_pool_clear(iterpool);
+        SVN_ERR(check_nonrecursive_dir_delete(target_path, ctx->wc_ctx, depth,
+                                              iterpool));
+      }
+    svn_pool_destroy(iterpool);
   }
 
   /* Crawl the working copy for commit items. */
   if ((cmt_err = svn_client__harvest_committables(&committables,
                                                   &lock_tokens,
-                                                  base_dir,
+                                                  base_abspath,
                                                   rel_targets,
                                                   depth,
                                                   ! keep_locks,
@@ -1202,13 +1178,21 @@ svn_client_commit4(svn_commit_info_t **c
      or prop modifications), then we return here to avoid committing a
      revision with no changes. */
   {
-    svn_boolean_t not_found_changed_path = TRUE;
+    svn_boolean_t found_changed_path = FALSE;
+
+    for (i = 0; i < commit_items->nelts; ++i)
+      {
+        svn_client_commit_item3_t *item =
+          APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *);
 
+        if (item->state_flags != SVN_CLIENT_COMMIT_ITEM_LOCK_TOKEN)
+          {
+            found_changed_path = TRUE;
+            break;
+          }
+      }
 
-    cmt_err = svn_iter_apr_array(&not_found_changed_path,
-                                 commit_items,
-                                 commit_item_is_changed, NULL, pool);
-    if (not_found_changed_path || cmt_err)
+    if (!found_changed_path)
       goto cleanup;
   }
 
@@ -1239,7 +1223,7 @@ svn_client_commit4(svn_commit_info_t **c
 
   if ((cmt_err = get_ra_editor(&ra_session,
                                &editor, &edit_baton, ctx,
-                               base_url, base_dir, log_msg,
+                               base_url, base_abspath, log_msg,
                                commit_items, revprop_table, commit_info_p,
                                TRUE, lock_tokens, keep_locks, pool)))
     goto cleanup;
@@ -1247,40 +1231,40 @@ svn_client_commit4(svn_commit_info_t **c
   /* Make a note that we have a commit-in-progress. */
   commit_in_progress = TRUE;
 
-  if ((cmt_err = svn_dirent_get_absolute(&current_dir,
-                                         current_dir, pool)))
-    goto cleanup;
-
-  /* Determine prefix to strip from the commit notify messages */
-  notify_prefix = svn_dirent_get_longest_ancestor(current_dir, base_dir, pool);
-
   /* Perform the commit. */
   cmt_err = svn_client__do_commit(base_url, commit_items, editor, edit_baton,
-                                  notify_prefix, &tempfiles, &checksums, ctx,
-                                  pool);
+                                  notify_prefix, &tempfiles, &md5_checksums,
+                                  &sha1_checksums, ctx, pool);
 
   /* Handle a successful commit. */
   if ((! cmt_err)
       || (cmt_err->apr_err == SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED))
     {
       svn_wc_committed_queue_t *queue = svn_wc_committed_queue_create(pool);
-      struct post_commit_baton btn;
-
-      btn.queue = queue;
-      btn.qpool = pool;
-      btn.wc_ctx = ctx->wc_ctx;
-      btn.keep_changelists = keep_changelists;
-      btn.keep_locks = keep_locks;
-      btn.checksums = checksums;
+      apr_pool_t *iterpool = svn_pool_create(pool);
 
       /* Make a note that our commit is finished. */
       commit_in_progress = FALSE;
 
-      bump_err = svn_iter_apr_array(NULL, commit_items,
-                                    post_process_commit_item, &btn,
-                                    pool);
-      if (bump_err)
-        goto cleanup;
+      for (i = 0; i < commit_items->nelts; i++)
+        {
+          svn_client_commit_item3_t *item
+            = APR_ARRAY_IDX(commit_items, i, svn_client_commit_item3_t *);
+
+          svn_pool_clear(iterpool);
+          bump_err = post_process_commit_item(queue, item, ctx->wc_ctx,
+                                              keep_changelists, keep_locks,
+                                              apr_hash_get(md5_checksums,
+                                                           item->path,
+                                                           APR_HASH_KEY_STRING),
+                                              apr_hash_get(sha1_checksums,
+                                                           item->path,
+                                                           APR_HASH_KEY_STRING),
+                                              iterpool);
+          if (bump_err)
+            goto cleanup;
+        }
+      svn_pool_destroy(iterpool);
 
       SVN_ERR_ASSERT(*commit_info_p);
       bump_err
@@ -1292,7 +1276,7 @@ svn_client_commit4(svn_commit_info_t **c
     }
 
   /* Sleep to ensure timestamp integrity. */
-  svn_io_sleep_for_timestamps(base_dir, pool);
+  svn_io_sleep_for_timestamps(base_abspath, pool);
 
  cleanup:
   /* Abort the commit if it is still in progress. */
@@ -1306,7 +1290,7 @@ svn_client_commit4(svn_commit_info_t **c
      clean-up. */
   if (! bump_err)
     {
-      unlock_err = svn_wc__release_write_lock(ctx->wc_ctx, base_dir, pool);
+      unlock_err = svn_wc__release_write_lock(ctx->wc_ctx, base_abspath, pool);
 
       if (! unlock_err)
         cleanup_err = remove_tmpfiles(tempfiles, pool);