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 2012/10/21 04:00:47 UTC
svn commit: r1400556 [7/29] - in /subversion/branches/ev2-export: ./ build/
build/ac-macros/ build/generator/ build/generator/templates/ build/hudson/
contrib/client-side/emacs/ contrib/client-side/svn-push/
contrib/client-side/svnmerge/ contrib/hook-s...
Modified: subversion/branches/ev2-export/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_repos.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_repos.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_repos.h Sun Oct 21 02:00:31 2012
@@ -653,6 +653,20 @@ svn_error_t *
svn_repos_recover(const char *path,
apr_pool_t *pool);
+/**
+ * Take an exclusive lock on @a path to prevent commits and then
+ * invoke @a freeze_body passing @a baton. The repository may be
+ * readable by Subversion while frozen, or it may be unreadable,
+ * depending on which FS backend the repository uses.
+ *
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_repos_freeze(const char *path,
+ svn_error_t *(*freeze_body)(void *baton, apr_pool_t *pool),
+ void *baton,
+ apr_pool_t *pool);
+
/** This function is a wrapper around svn_fs_berkeley_logfiles(),
* returning log file paths relative to the root of the repository.
*
@@ -764,16 +778,25 @@ const char *
svn_repos_post_unlock_hook(svn_repos_t *repos,
apr_pool_t *pool);
-/** Set the environment that @a repos's hooks will inherit to @a hooks_env,
- * a hash table where keys and values represent names and values of environment
- * variables. @a hooks_env must live at least as long as @a repos.
+/** Set the environment that @a repos's hooks will inherit.
+ * The environment is specified in a file at @a hooks_env_path.
+ * If @a hooks_env_path is @c NULL, the file is searched at its
+ * default location in the repository. If @a hooks_env_path is
+ * not absolute, it specifies a path relative to the parent of
+ * the file's default location in the repository.
+ *
+ * The @a result_pool should be the same pool that @a repos was allocated in.
+ * The @a scratch_pool is used for temporary allocations.
*
- * If this function is not called, hooks will run in an empty environment.
+ * If this function is not called, or if the file does not list any
+ * environment variables, hooks will run in an empty environment.
*
* @since New in 1.8. */
-void
+svn_error_t *
svn_repos_hooks_setenv(svn_repos_t *repos,
- apr_hash_t *hooks_env);
+ const char *hooks_env_path,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/** @} */
@@ -819,6 +842,13 @@ svn_repos_hooks_setenv(svn_repos_t *repo
* avoid sending data through @a editor/@a edit_baton which is not
* authorized for transmission.
*
+ * @a zero_copy_limit controls up to which size in bytes data blocks may
+ * be sent using the zero-copy code path. On that path, a number of
+ * in-memory copy operations have been eliminated to maximize throughput.
+ * However, until the whole block has been pushed to the network stack,
+ * other clients may get blocked. Thus, be careful when using larger
+ * values here. 0 disables the optimization.
+ *
* All allocation for the context and collected state will occur in
* @a pool.
*
@@ -851,7 +881,33 @@ svn_repos_hooks_setenv(svn_repos_t *repo
* than or equal to the depth of the working copy, then the editor
* operations will affect only paths at or above @a depth.
*
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_repos_begin_report3(void **report_baton,
+ svn_revnum_t revnum,
+ svn_repos_t *repos,
+ const char *fs_base,
+ const char *target,
+ const char *tgt_path,
+ svn_boolean_t text_deltas,
+ svn_depth_t depth,
+ svn_boolean_t ignore_ancestry,
+ svn_boolean_t send_copyfrom_args,
+ const svn_delta_editor_t *editor,
+ void *edit_baton,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ apr_size_t zero_copy_limit,
+ apr_pool_t *pool);
+
+/**
+ * The same as svn_repos_begin_report3(), but setting the @a zero_copy_limit
+ * to 0.
+ *
* @since New in 1.5.
+ *
+ * @deprecated Provided for backward compatibility with the 1.7 API.
*/
svn_error_t *
svn_repos_begin_report2(void **report_baton,
@@ -903,7 +959,7 @@ svn_repos_begin_report(void **report_bat
/**
- * Given a @a report_baton constructed by svn_repos_begin_report2(),
+ * Given a @a report_baton constructed by svn_repos_begin_report3(),
* record the presence of @a path, at @a revision with depth @a depth,
* in the current tree.
*
@@ -974,7 +1030,7 @@ svn_repos_set_path(void *report_baton,
apr_pool_t *pool);
/**
- * Given a @a report_baton constructed by svn_repos_begin_report2(),
+ * Given a @a report_baton constructed by svn_repos_begin_report3(),
* record the presence of @a path in the current tree, containing the contents
* of @a link_path at @a revision with depth @a depth.
*
@@ -1040,7 +1096,7 @@ svn_repos_link_path(void *report_baton,
svn_boolean_t start_empty,
apr_pool_t *pool);
-/** Given a @a report_baton constructed by svn_repos_begin_report2(),
+/** Given a @a report_baton constructed by svn_repos_begin_report3(),
* record the non-existence of @a path in the current tree.
*
* @a path may not be underneath a path on which svn_repos_set_path3()
@@ -1056,7 +1112,7 @@ svn_repos_delete_path(void *report_baton
const char *path,
apr_pool_t *pool);
-/** Given a @a report_baton constructed by svn_repos_begin_report2(),
+/** Given a @a report_baton constructed by svn_repos_begin_report3(),
* finish the report and drive the editor as specified when the report
* baton was constructed.
*
@@ -1073,7 +1129,7 @@ svn_repos_finish_report(void *report_bat
apr_pool_t *pool);
-/** Given a @a report_baton constructed by svn_repos_begin_report2(),
+/** Given a @a report_baton constructed by svn_repos_begin_report3(),
* abort the report. This function can be called anytime before
* svn_repos_finish_report() is called.
*
@@ -1147,7 +1203,7 @@ svn_repos_abort_report(void *report_bato
* the total size of the delta.
*
* ### svn_repos_dir_delta2 is mostly superseded by the reporter
- * ### functionality (svn_repos_begin_report2 and friends).
+ * ### functionality (svn_repos_begin_report3 and friends).
* ### svn_repos_dir_delta2 does allow the roots to be transaction
* ### roots rather than just revision roots, and it has the
* ### entry_props flag. Almost all of Subversion's own code uses the
@@ -1284,14 +1340,14 @@ svn_repos_replay(svn_fs_root_t *root,
*
* Calling @a (*editor)->close_edit completes the commit.
*
- * If @a callback is non-NULL, then before @c close_edit returns (but
+ * If @a commit_callback is non-NULL, then before @c close_edit returns (but
* after the commit has succeeded) @c close_edit will invoke
- * @a callback with a filled-in #svn_commit_info_t *, @a callback_baton,
- * and @a pool or some subpool thereof as arguments. If @a callback
+ * @a commit_callback with a filled-in #svn_commit_info_t *, @a commit_baton,
+ * and @a pool or some subpool thereof as arguments. If @a commit_callback
* returns an error, that error will be returned from @c close_edit,
* otherwise if there was a post-commit hook failure, then that error
* will be returned with code SVN_ERR_REPOS_POST_COMMIT_HOOK_FAILED.
- * (Note that prior to Subversion 1.6, @a callback cannot be NULL; if
+ * (Note that prior to Subversion 1.6, @a commit_callback cannot be NULL; if
* you don't need a callback, pass a dummy function.)
*
* Calling @a (*editor)->abort_edit aborts the commit, and will also
@@ -1312,8 +1368,8 @@ svn_repos_get_commit_editor5(const svn_d
const char *repos_url,
const char *base_path,
apr_hash_t *revprop_table,
- svn_commit_callback2_t callback,
- void *callback_baton,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
svn_repos_authz_callback_t authz_callback,
void *authz_baton,
apr_pool_t *pool);
@@ -1338,8 +1394,8 @@ svn_repos_get_commit_editor4(const svn_d
const char *base_path,
const char *user,
const char *log_msg,
- svn_commit_callback2_t callback,
- void *callback_baton,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
svn_repos_authz_callback_t authz_callback,
void *authz_baton,
apr_pool_t *pool);
@@ -2293,7 +2349,7 @@ svn_repos_fs_change_txn_props(svn_fs_txn
* @{
*
* As it turns out, the svn_repos_replay2(), svn_repos_dir_delta2() and
- * svn_repos_begin_report2() interfaces can be extremely useful for
+ * svn_repos_begin_report3() interfaces can be extremely useful for
* examining the repository, or more exactly, changes to the repository.
* These drivers allows for differences between two trees to be
* described using an editor.
@@ -2346,7 +2402,7 @@ typedef struct svn_repos_node_t
* repos's filesystem.
*
* The editor can also be driven by svn_repos_dir_delta2() or
- * svn_repos_begin_report2(), but unless you have special needs,
+ * svn_repos_begin_report3(), but unless you have special needs,
* svn_repos_replay2() is preferred.
*
* Invoke svn_repos_node_from_baton() on @a edit_baton to obtain the root
@@ -3219,6 +3275,31 @@ svn_repos_check_revision_access(svn_repo
void *authz_read_baton,
apr_pool_t *pool);
+/**
+ * Set @a *inherited_values to a depth-first ordered array of
+ * #svn_prop_inherited_item_t * structures (the path_or_url members of
+ * which are relative filesystem paths) representing the properties
+ * inherited by @a path in @a root. If no properties are inherited,
+ * then set @a *inherited_values to an empty array.
+ *
+ * If optional @a authz_read_func is non-NULL, then use this function
+ * (along with optional @a authz_read_baton) to check the readability
+ * of each parent path from which properties are inherited. Silently omit
+ * properties for unreadable parent paths.
+ *
+ * Allocate @a *inherited_props in @a result_pool. Use @a scratch_pool for
+ * temporary allocations.
+ *
+ * @since New in 1.8.
+ */
+svn_error_t *
+svn_repos_fs_get_inherited_props(apr_array_header_t **inherited_props,
+ svn_fs_root_t *root,
+ const char *path,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
/** Capabilities **/
Modified: subversion/branches/ev2-export/subversion/include/svn_string.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_string.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_string.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_string.h Sun Oct 21 02:00:31 2012
@@ -307,6 +307,45 @@ void
svn_stringbuf_appendcstr(svn_stringbuf_t *targetstr,
const char *cstr);
+/** Read @a count bytes from @a bytes and insert them into @a str at
+ * position @a pos and following. The resulting string will be
+ * @c count+str->len bytes long. If @c pos is larger or equal to the
+ * number of bytes currently used in @a str, simply append @a bytes.
+ *
+ * Reallocs if necessary. @a str is affected, nothing else is.
+ *
+ * @note The inserted string may be a sub-range if @a str.
+ */
+void
+svn_stringbuf_insert(svn_stringbuf_t *str,
+ apr_size_t pos,
+ const char *bytes,
+ apr_size_t count);
+
+/** Removes @a count bytes from @a str, starting at position @a pos.
+ * If that range exceeds the current string data, @a str gets truncated
+ * at @a pos. If the latter is larger or equal to @c str->pos, this will
+ * be a no-op. Otherwise, the resulting string will be @c str->len-count
+ * bytes long.
+ */
+void
+svn_stringbuf_remove(svn_stringbuf_t *str,
+ apr_size_t pos,
+ apr_size_t count);
+
+/** Faster but functionally equivalent to the following sequence:
+ * @code
+ * svn_stringbuf_remove(str, pos, old_count);
+ * svn_stringbuf_insert(str, pos, bytes, new_count);
+ * @endcode
+ */
+void
+svn_stringbuf_replace(svn_stringbuf_t *str,
+ apr_size_t pos,
+ apr_size_t old_count,
+ const char *bytes,
+ apr_size_t new_count);
+
/** Return a duplicate of @a original_string. */
svn_stringbuf_t *
svn_stringbuf_dup(const svn_stringbuf_t *original_string, apr_pool_t *pool);
Modified: subversion/branches/ev2-export/subversion/include/svn_types.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_types.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_types.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_types.h Sun Oct 21 02:00:31 2012
@@ -509,7 +509,7 @@ svn_depth_to_word(svn_depth_t depth);
svn_depth_t
svn_depth_from_word(const char *word);
-/* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
+/** Return #svn_depth_infinity if boolean @a recurse is TRUE, else
* return #svn_depth_files.
*
* @note New code should never need to use this, it is called only
@@ -520,7 +520,7 @@ svn_depth_from_word(const char *word);
#define SVN_DEPTH_INFINITY_OR_FILES(recurse) \
((recurse) ? svn_depth_infinity : svn_depth_files)
-/* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
+/** Return #svn_depth_infinity if boolean @a recurse is TRUE, else
* return #svn_depth_immediates.
*
* @note New code should never need to use this, it is called only
@@ -531,7 +531,7 @@ svn_depth_from_word(const char *word);
#define SVN_DEPTH_INFINITY_OR_IMMEDIATES(recurse) \
((recurse) ? svn_depth_infinity : svn_depth_immediates)
-/* Return #svn_depth_infinity if boolean @a recurse is TRUE, else
+/** Return #svn_depth_infinity if boolean @a recurse is TRUE, else
* return #svn_depth_empty.
*
* @note New code should never need to use this, it is called only
@@ -542,7 +542,7 @@ svn_depth_from_word(const char *word);
#define SVN_DEPTH_INFINITY_OR_EMPTY(recurse) \
((recurse) ? svn_depth_infinity : svn_depth_empty)
-/* Return a recursion boolean based on @a depth.
+/** Return a recursion boolean based on @a depth.
*
* Although much code has been converted to use depth, some code still
* takes a recurse boolean. In most cases, it makes sense to treat
@@ -1261,7 +1261,7 @@ svn_location_segment_dup(const svn_locat
*/
typedef unsigned long svn_linenum_t;
-/* The maximum value of an svn_linenum_t.
+/** The maximum value of an svn_linenum_t.
*
* @since New in 1.7.
*/
Modified: subversion/branches/ev2-export/subversion/include/svn_version.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_version.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_version.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_version.h Sun Oct 21 02:00:31 2012
@@ -34,6 +34,7 @@
#ifndef APR_STRINGIFY
#include <apr_general.h>
#endif
+#include <apr_tables.h>
#include "svn_types.h"
@@ -256,6 +257,153 @@ const svn_version_t *
svn_subr_version(void);
+/**
+ * Extended version infomation, including info about the running system.
+ *
+ * @since New in 1.8.
+ */
+typedef struct svn_version_extended_t svn_version_extended_t;
+
+/**
+ * Return version information for the running program. If @a verbose
+ * is true, collect extra information that may be expensive to
+ * retrieve (for example, the OS release name, list of shared
+ * libraries, etc.). Use @a pool for all allocations.
+ *
+ * @since New in 1.8.
+ */
+const svn_version_extended_t *
+svn_version_extended(svn_boolean_t verbose,
+ apr_pool_t *pool);
+
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The date when the libsvn_subr library was compiled, in the
+ * format defined by the C standard macro @c __DATE__.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_build_date(const svn_version_extended_t *ext_info);
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The time when the libsvn_subr library was compiled, in the
+ * format defined by the C standard macro @c __TIME__.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_build_time(const svn_version_extended_t *ext_info);
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The canonical host triplet (arch-vendor-osname) of the
+ * system where libsvn_subr was compiled.
+ *
+ * @note On Unix-like systems (includng Mac OS X), this string is the
+ * same as the output of the config.guess script.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_build_host(const svn_version_extended_t *ext_info);
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The localized copyright notice.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_copyright(const svn_version_extended_t *ext_info);
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The canonical host triplet (arch-vendor-osname) of the
+ * system where the current process is running.
+ *
+ * @note This string may not be the same as the output of config.guess
+ * on the same system.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_runtime_host(const svn_version_extended_t *ext_info);
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return The "commercial" release name of the running operating
+ * system, if available. Not to be confused with, e.g., the output of
+ * "uname -v" or "uname -r". The returned value may be @c NULL.
+ *
+ * @since New in 1.8.
+ */
+const char *
+svn_version_ext_runtime_osname(const svn_version_extended_t *ext_info);
+
+/**
+ * Dependent library information.
+ * Describes the name and versions of known dependencies
+ * used by libsvn_subr.
+ *
+ * @since New in 1.8.
+ */
+typedef struct svn_version_ext_linked_lib_t
+{
+ const char *name; /**< Library name */
+ const char *compiled_version; /**< Compile-time version string */
+ const char *runtime_version; /**< Run-time version string (optional) */
+} svn_version_ext_linked_lib_t;
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return Array of svn_version_ext_linked_lib_t describing dependent
+ * libraries. The returned value may be @c NULL.
+ *
+ * @since New in 1.8.
+ */
+const apr_array_header_t *
+svn_version_ext_linked_libs(const svn_version_extended_t *ext_info);
+
+
+/**
+ * Loaded shared library information.
+ * Describes the name and, where available, version of the shared libraries
+ * loaded by the running program.
+ *
+ * @since New in 1.8.
+ */
+typedef struct svn_version_ext_loaded_lib_t
+{
+ const char *name; /**< Library name */
+ const char *version; /**< Library version (optional) */
+} svn_version_ext_loaded_lib_t;
+
+
+/**
+ * Accessor for svn_version_extended_t.
+ *
+ * @return Array of svn_version_ext_loaded_lib_t describing loaded
+ * shared libraries. The returned value may be @c NULL.
+ *
+ * @note On Mac OS X, the loaded frameworks, private frameworks and
+ * system libraries will not be listed.
+ *
+ * @since New in 1.8.
+ */
+const apr_array_header_t *
+svn_version_ext_loaded_libs(const svn_version_extended_t *ext_info);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Modified: subversion/branches/ev2-export/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_wc.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_wc.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_wc.h Sun Oct 21 02:00:31 2012
@@ -828,7 +828,7 @@ svn_error_t *
svn_wc_external_item2_create(svn_wc_external_item2_t **item,
apr_pool_t *pool);
-/* Same as svn_wc_external_item2_create() except the pointer to the new
+/** Same as svn_wc_external_item2_create() except the pointer to the new
* empty item is 'const' which is stupid since the next thing you need to do
* is fill in its fields.
*
@@ -1142,7 +1142,7 @@ typedef enum svn_wc_notify_action_t
/** The mergeinfo on path was updated. @since New in 1.7. */
svn_wc_notify_merge_record_info,
- /** An working copy directory was upgraded to the latest format
+ /** A working copy directory was upgraded to the latest format.
* @since New in 1.7. */
svn_wc_notify_upgraded_path,
@@ -1229,12 +1229,22 @@ typedef enum svn_wc_notify_action_t
* @since New in 1.8. */
svn_wc_notify_failed_obstruction,
- /** Conflict resolver is starting or done.
+ /** Conflict resolver is starting.
* This can be used by clients to detect when to display conflict summary
* information, for example.
* @since New in 1.8. */
svn_wc_notify_conflict_resolver_starting,
- svn_wc_notify_conflict_resolver_done
+
+ /** Conflict resolver is done.
+ * This can be used by clients to detect when to display conflict summary
+ * information, for example.
+ * @since New in 1.8. */
+ svn_wc_notify_conflict_resolver_done,
+
+ /** The current operation left local changes of something that was deleted
+ * The changes are available on (and below) the notified path
+ * @since New in 1.8. */
+ svn_wc_notify_left_local_modifications
} svn_wc_notify_action_t;
@@ -1583,10 +1593,6 @@ typedef enum svn_wc_conflict_reason_t
svn_wc_conflict_reason_replaced,
/** Object is moved away. @since New in 1.8. */
svn_wc_conflict_reason_moved_away,
- /** Object is moved away and was edited post-move. @since New in 1.8. */
- /* ### Do we really need this. The edit state is on a different node,
- which might just change while the tree conflict exists? */
- svn_wc_conflict_reason_moved_away_and_edited,
/** Object is moved here. @since New in 1.8. */
svn_wc_conflict_reason_moved_here
@@ -1675,7 +1681,7 @@ typedef struct svn_wc_conflict_version_t
*
* Set the @c repos_url field of the created struct to @a repos_url, the
* @c path_in_repos field to @a path_in_repos, the @c peg_rev field to
- * @a peg_rev and the the @c node_kind to @c node_kind. Make only shallow
+ * @a peg_rev and the @c node_kind to @c node_kind. Make only shallow
* copies of the pointer arguments.
*
* @since New in 1.8.
@@ -1944,7 +1950,7 @@ svn_wc_conflict_description_create_text(
*
* Set the @c local_abspath field of the created struct to @a local_abspath
* (which must be an absolute path), the @c kind field
- * to #svn_wc_conflict_kind_prop, the @c node_kind to @a node_kind, and
+ * to #svn_wc_conflict_kind_property, the @c node_kind to @a node_kind, and
* the @c property_name to @a property_name.
*
* @note: It is the caller's responsibility to set the other required fields
@@ -3719,7 +3725,7 @@ typedef struct svn_wc_status3_t
* @since New in 1.8. */
const char *moved_to_abspath;
- /* TRUE iff the item is a file brought in by an svn:externals definition.
+ /** TRUE iff the item is a file brought in by an svn:externals definition.
* @since New in 1.8. */
svn_boolean_t file_external;
@@ -3845,7 +3851,7 @@ typedef struct svn_wc_status2_t
/**
- * Same as #svn_wc_status2_t, but without the #svn_lock_t 'repos_lock' field.
+ * Same as #svn_wc_status2_t, but without the #svn_lock_t 'repos_lock', const char 'url', #svn_revnum_t 'ood_last_cmt_rev', apr_time_t 'ood_last_cmt_date', #svn_node_kind_t 'ood_kind', const char 'ood_last_cmt_author', #svn_wc_conflict_description_t 'tree_conflict', #svn_boolean_t 'file_external', #svn_wc_status_kind 'pristine_text_status', and #svn_wc_status_kind 'pristine_prop_status' fields.
*
* @deprecated Provided for backward compatibility with the 1.1 API.
*/
@@ -3983,11 +3989,6 @@ svn_wc_status(svn_wc_status_t **status,
*
* @a scratch_pool will be cleared between invocations to the callback.
*
- * ### we might be revamping the status infrastructure, and this callback
- * ### could totally disappear by the end of 1.7 development. however, we
- * ### need to mark the STATUS parameter as "const" so that it is easier
- * ### to reason about who/what can modify those structures.
- *
* @since New in 1.7.
*/
typedef svn_error_t *(*svn_wc_status_func4_t)(void *baton,
@@ -4404,6 +4405,8 @@ svn_wc_copy(const char *src,
* Use @a scratch_pool for temporary allocations.
*
* @since New in 1.7.
+ * @deprecated Provided for backward compatibility with the 1.7 API.
+ * @see svn_client_move7()
*/
svn_error_t *
svn_wc_move(svn_wc_context_t *wc_ctx,
@@ -4556,7 +4559,7 @@ svn_wc_add_from_disk(svn_wc_context_t *w
* working copy as a copy of the original location. The separate working
* copy will be integrated by this step. In this case, which is only used
* by code like that of "svn cp URL@rev path" @a copyfrom_url and
- * @a copyfrom_rev MUST BE the the url and revision of @a local_abspath
+ * @a copyfrom_rev MUST BE the url and revision of @a local_abspath
* in the separate working copy.
*
* 2a) If the node was not versioned before it will be scheduled as a local
@@ -7052,7 +7055,7 @@ typedef svn_error_t * (*svn_wc_upgrade_g
* (typically #SVN_ERR_CANCELLED), return that error immediately.
*
* For each directory converted, @a notify_func will be called with
- * in @a notify_baton action #svn_wc_notify_upgrade_path and as path
+ * in @a notify_baton action #svn_wc_notify_upgraded_path and as path
* the path of the upgraded directory. @a notify_func may be @c NULL
* if this notification is not needed.
*
@@ -7838,7 +7841,8 @@ svn_wc_set_changelist(const char *path,
/**
- * The callback type used by svn_client_get_changelists().
+ * The callback type used by svn_wc_get_changelists() and
+ * svn_client_get_changelists().
*
* On each invocation, @a path is a newly discovered member of the
* changelist, and @a baton is a private function closure.
@@ -7851,7 +7855,10 @@ typedef svn_error_t *(*svn_changelist_re
apr_pool_t *pool);
-/* @since New in 1.7.
+/**
+ * ### TODO: Doc string, please.
+ *
+ * @since New in 1.7.
*/
svn_error_t *
svn_wc_get_changelists(svn_wc_context_t *wc_ctx,
Modified: subversion/branches/ev2-export/subversion/include/svn_xml.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/include/svn_xml.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/include/svn_xml.h (original)
+++ subversion/branches/ev2-export/subversion/include/svn_xml.h Sun Oct 21 02:00:31 2012
@@ -297,7 +297,10 @@ svn_xml_make_header2(svn_stringbuf_t **s
const char *encoding,
apr_pool_t *pool);
-/* Like svn_xml_make_header2, but does not emit encoding information. */
+/** Like svn_xml_make_header2(), but does not emit encoding information.
+ *
+ * @deprecated Provided for backward compatibility with the 1.6 API.
+ */
SVN_DEPRECATED
void
svn_xml_make_header(svn_stringbuf_t **str,
Modified: subversion/branches/ev2-export/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_auth_gnome_keyring/gnome_keyring.c Sun Oct 21 02:00:31 2012
@@ -28,6 +28,7 @@
/*** Includes. ***/
#include <apr_pools.h>
+#include <apr_strings.h>
#include "svn_auth.h"
#include "svn_config.h"
#include "svn_error.h"
@@ -38,7 +39,6 @@
#include "svn_private_config.h"
#include <glib.h>
-#include <dbus/dbus.h>
#include <gnome-keyring.h>
@@ -138,9 +138,9 @@ callback_default_keyring(GnomeKeyringRes
return;
}
-/* Returns the default keyring name. */
+/* Returns the default keyring name, allocated in RESULT_POOL. */
static char*
-get_default_keyring_name(apr_pool_t *pool)
+get_default_keyring_name(apr_pool_t *result_pool)
{
char *def = NULL;
struct gnome_keyring_baton key_info;
@@ -159,7 +159,7 @@ get_default_keyring_name(apr_pool_t *poo
return NULL;
}
- def = strdup(key_info.keyring_name);
+ def = apr_pstrdup(result_pool, key_info.keyring_name);
callback_destroy_data_keyring(&key_info);
return def;
@@ -291,7 +291,6 @@ password_get_gnome_keyring(svn_boolean_t
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
- char *default_keyring = NULL;
GnomeKeyringResult result;
GList *items;
@@ -299,8 +298,6 @@ password_get_gnome_keyring(svn_boolean_t
SVN_ERR(ensure_gnome_keyring_is_unlocked(non_interactive, parameters, pool));
- default_keyring = get_default_keyring_name(pool);
-
if (! apr_hash_get(parameters,
"gnome-keyring-opening-failed",
APR_HASH_KEY_STRING))
@@ -339,8 +336,6 @@ password_get_gnome_keyring(svn_boolean_t
"");
}
- free(default_keyring);
-
return SVN_NO_ERROR;
}
@@ -356,7 +351,6 @@ password_set_gnome_keyring(svn_boolean_t
svn_boolean_t non_interactive,
apr_pool_t *pool)
{
- char *default_keyring = NULL;
GnomeKeyringResult result;
guint32 item_id;
@@ -364,8 +358,6 @@ password_set_gnome_keyring(svn_boolean_t
SVN_ERR(ensure_gnome_keyring_is_unlocked(non_interactive, parameters, pool));
- default_keyring = get_default_keyring_name(pool);
-
if (! apr_hash_get(parameters,
"gnome-keyring-opening-failed",
APR_HASH_KEY_STRING))
@@ -388,8 +380,6 @@ password_set_gnome_keyring(svn_boolean_t
"");
}
- free(default_keyring);
-
*done = (result == GNOME_KEYRING_RESULT_OK);
return SVN_NO_ERROR;
}
@@ -428,12 +418,14 @@ simple_gnome_keyring_save_creds(svn_bool
pool);
}
+#if GLIB_CHECK_VERSION(2,6,0)
static void
log_noop(const gchar *log_domain, GLogLevelFlags log_level,
const gchar *message, gpointer user_data)
{
/* do nothing */
}
+#endif
static void
init_gnome_keyring(void)
@@ -449,7 +441,9 @@ init_gnome_keyring(void)
suppress stderr spam for not only libgnome-keyring, but for
anything else the app is linked to that uses glib logging and
doesn't specify a log_domain. */
+#if GLIB_CHECK_VERSION(2,6,0)
g_log_set_default_handler(log_noop, NULL);
+#endif
}
static const svn_auth_provider_t gnome_keyring_simple_provider = {
Modified: subversion/branches/ev2-export/subversion/libsvn_client/add.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/add.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/add.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/add.c Sun Oct 21 02:00:31 2012
@@ -671,6 +671,8 @@ svn_client_add4(const char *path,
const char *parent_abspath;
const char *local_abspath;
const char *existing_parent_abspath;
+ svn_boolean_t is_wc_root;
+ svn_error_t *err;
if (svn_path_is_url(path))
return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
@@ -678,20 +680,55 @@ svn_client_add4(const char *path,
SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
- /* ### this is a hack.
- ### before we switched to absolute paths, if a user tried to do
- ### 'svn add .', PATH would be "" and PARENT_PATH would also be "",
- ### thus emulating the behavior below. Now that we are using
- ### absolute paths, svn_dirent_dirname() doesn't behave the same way
- ### w.r.t. '.', so we need to include the following hack. This
- ### behavior is tested in schedule_tests-11. */
- if (path[0] == 0)
- parent_abspath = local_abspath;
+ /* See if we're being asked to add a wc-root. That's typically not
+ okay, unless we're in "force" mode. svn_wc__strictly_is_wc_root()
+ will return TRUE even if LOCAL_ABSPATH is a *symlink* to a working
+ copy root, which is a scenario we want to treat differently. */
+ err = svn_wc__strictly_is_wc_root(&is_wc_root, ctx->wc_ctx,
+ local_abspath, pool);
+ if (err)
+ {
+ if (err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND
+ && err->apr_err != SVN_ERR_WC_NOT_WORKING_COPY)
+ {
+ return svn_error_trace(err);
+ }
+
+ svn_error_clear(err);
+ err = NULL; /* SVN_NO_ERROR */
+ is_wc_root = FALSE;
+ }
+ if (is_wc_root)
+ {
+#ifdef HAVE_SYMLINK
+ svn_node_kind_t disk_kind;
+ svn_boolean_t is_special;
+
+ SVN_ERR(svn_io_check_special_path(local_abspath, &disk_kind, &is_special,
+ pool));
+
+ /* A symlink can be an unversioned target and a wcroot. Lets try to add
+ the symlink, which can't be a wcroot. */
+ if (is_special)
+ is_wc_root = FALSE;
+ else
+#endif
+ {
+ if (! force)
+ return svn_error_createf(
+ SVN_ERR_ENTRY_EXISTS, NULL,
+ _("'%s' is already under version control"),
+ svn_dirent_local_style(local_abspath, pool));
+ }
+ }
+
+ if (is_wc_root)
+ parent_abspath = local_abspath; /* We will only add children */
else
parent_abspath = svn_dirent_dirname(local_abspath, pool);
existing_parent_abspath = NULL;
- if (add_parents)
+ if (add_parents && !is_wc_root)
{
apr_pool_t *subpool;
const char *existing_parent_abspath2;
@@ -707,8 +744,8 @@ svn_client_add4(const char *path,
SVN_WC__CALL_WITH_WRITE_LOCK(
add(local_abspath, depth, force, no_ignore, existing_parent_abspath,
ctx, pool),
- ctx->wc_ctx,
- existing_parent_abspath ? existing_parent_abspath : parent_abspath,
+ ctx->wc_ctx, (existing_parent_abspath ? existing_parent_abspath
+ : parent_abspath),
FALSE /* lock_anchor */, pool);
return SVN_NO_ERROR;
}
Modified: subversion/branches/ev2-export/subversion/libsvn_client/cat.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/cat.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/cat.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/cat.c Sun Oct 21 02:00:31 2012
@@ -62,7 +62,6 @@ svn_client__get_normalized_stream(svn_st
svn_string_t *eol_style, *keywords, *special;
const char *eol = NULL;
svn_boolean_t local_mod = FALSE;
- apr_time_t tm;
svn_stream_t *input;
svn_node_kind_t kind;
@@ -118,27 +117,15 @@ svn_client__get_normalized_stream(svn_st
if (eol_style)
svn_subst_eol_style_from_value(&style, &eol, eol_style->data);
- if (local_mod && (! special))
- {
- /* Use the modified time from the working copy if
- the file */
- SVN_ERR(svn_io_file_affected_time(&tm, local_abspath, scratch_pool));
- }
- else
- {
- SVN_ERR(svn_wc__node_get_changed_info(NULL, &tm, NULL, wc_ctx,
- local_abspath, scratch_pool,
- scratch_pool));
- }
-
if (keywords)
{
svn_revnum_t changed_rev;
const char *rev_str;
const char *author;
const char *url;
+ apr_time_t tm;
- SVN_ERR(svn_wc__node_get_changed_info(&changed_rev, NULL, &author, wc_ctx,
+ SVN_ERR(svn_wc__node_get_changed_info(&changed_rev, &tm, &author, wc_ctx,
local_abspath, scratch_pool,
scratch_pool));
SVN_ERR(svn_wc__node_get_url(&url, wc_ctx, local_abspath, scratch_pool,
@@ -152,6 +139,13 @@ svn_client__get_normalized_stream(svn_st
current user's username */
rev_str = apr_psprintf(scratch_pool, "%ldM", changed_rev);
author = _("(local)");
+
+ if (! special)
+ {
+ /* Use the modified time from the working copy for files */
+ SVN_ERR(svn_io_file_affected_time(&tm, local_abspath,
+ scratch_pool));
+ }
}
else
{
Modified: subversion/branches/ev2-export/subversion/libsvn_client/cleanup.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/cleanup.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/cleanup.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/cleanup.c Sun Oct 21 02:00:31 2012
@@ -144,8 +144,9 @@ svn_client_upgrade(const char *path,
upgrade to avoid that errors in the externals causes the wc upgrade to
fail. Thanks to caching the performance penalty of walking the wc a
second time shouldn't be too severe */
- SVN_ERR(svn_client_propget4(&externals, SVN_PROP_EXTERNALS, local_abspath,
- &rev, &rev, NULL, svn_depth_infinity, NULL, ctx,
+ SVN_ERR(svn_client_propget5(&externals, NULL, SVN_PROP_EXTERNALS,
+ local_abspath, &rev, &rev, NULL,
+ svn_depth_infinity, NULL, ctx,
scratch_pool, scratch_pool));
iterpool = svn_pool_create(scratch_pool);
Modified: subversion/branches/ev2-export/subversion/libsvn_client/client.h
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/client.h?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/client.h (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/client.h Sun Oct 21 02:00:31 2012
@@ -217,40 +217,6 @@ svn_client__get_youngest_common_ancestor
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Given PATH_OR_URL, which contains either a working copy path or an
- absolute URL, a peg revision PEG_REVISION, and a desired revision
- REVISION, create an RA connection to that object as it exists in
- that revision, following copy history if necessary. If REVISION is
- younger than PEG_REVISION, then PATH_OR_URL will be checked to see
- 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_ABSPATH is the working copy path the ra_session corresponds to,
- and should only be used if PATH_OR_URL is a url
- ### else NULL? what's it for?
-
- If PEG_REVISION->kind is 'unspecified', the peg revision is 'head'
- for a URL or 'working' for a WC path. If REVISION->kind is
- 'unspecified', the operative revision is the peg revision.
-
- Store the resulting ra_session in *RA_SESSION_P. Store the final
- resolved location of the object in *RESOLVED_LOC_P. RESOLVED_LOC_P
- may be NULL if not wanted.
-
- Use authentication baton cached in CTX to authenticate against the
- repository.
-
- Use POOL for all allocations. */
-svn_error_t *
-svn_client__ra_session_from_path2(svn_ra_session_t **ra_session_p,
- svn_client__pathrev_t **resolved_loc_p,
- const char *path_or_url,
- const char *base_dir_abspath,
- const svn_opt_revision_t *peg_revision,
- const svn_opt_revision_t *revision,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool);
-
/* Ensure that RA_SESSION's session URL matches SESSION_URL,
reparenting that session if necessary.
Store the previous session URL in *OLD_SESSION_URL (so that if the
@@ -562,6 +528,34 @@ svn_client__switch_internal(svn_revnum_t
/* ---------------------------------------------------------------- */
+/*** Inheritable Properties ***/
+
+/* Fetch the inherited properties for the base of LOCAL_ABSPATH as well
+ as any WC roots under LOCAL_ABSPATH (as limited by DEPTH) using
+ RA_SESSION. Store the results in *WCROOT_IPROPS, a hash mapping
+ const char * absolute working copy paths to depth-first ordered arrays
+ of svn_prop_inherited_item_t * structures.
+
+ If LOCAL_ABSPATH has no base then do nothing.
+
+ RA_SESSION should be an open RA session pointing at the URL of PATH,
+ or NULL, in which case this function will open its own temporary session.
+
+ Allocate *WCROOT_IPROPS in RESULT_POOL, use SCRATCH_POOL for temporary
+ allocations.
+*/
+svn_error_t *
+svn_client__get_inheritable_props(apr_hash_t **wcroot_iprops,
+ const char *local_abspath,
+ svn_revnum_t revision,
+ svn_depth_t depth,
+ svn_ra_session_t *ra_session,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool);
+
+/* ---------------------------------------------------------------- */
+
/*** Editor for repository diff ***/
/* Create an editor for a pure repository comparison, i.e. comparing one
@@ -962,32 +956,6 @@ svn_client__do_external_status(svn_clien
void *status_baton,
apr_pool_t *pool);
-/* Baton type for svn_wc__external_info_gatherer(). */
-typedef struct svn_client__external_func_baton_t
-{
- apr_hash_t *externals_old; /* Hash of old externals property values,
- or NULL if the caller doesn't care. */
- apr_hash_t *externals_new; /* Hash of new externals property values,
- or NULL if the caller doesn't care. */
- apr_hash_t *ambient_depths; /* Hash of ambient depth values, or NULL
- if the caller doesn't care. */
- apr_pool_t *result_pool; /* Pool to use for all stored values. */
-
-} svn_client__external_func_baton_t;
-
-
-/* This function gets invoked whenever external changes are encountered.
- This implements the `svn_wc_external_update_t' interface, and can
- be used with an svn_client__external_func_baton_t BATON to gather
- information about changes to externals definitions. */
-svn_error_t *
-svn_client__external_info_gatherer(void *baton,
- const char *local_abspath,
- const svn_string_t *old_val,
- const svn_string_t *new_val,
- svn_depth_t depth,
- apr_pool_t *scratch_pool);
-
/* Baton for svn_client__dirent_fetcher */
struct svn_client__dirent_fetcher_baton_t
{
@@ -1067,21 +1035,6 @@ svn_client__get_detranslated_stream(svn_
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Return true if KIND is a revision kind that is dependent on the working
- * copy. Otherwise, return false. */
-#define SVN_CLIENT__REVKIND_NEEDS_WC(kind) \
- ((kind) == svn_opt_revision_base || \
- (kind) == svn_opt_revision_previous || \
- (kind) == svn_opt_revision_working || \
- (kind) == svn_opt_revision_committed) \
-
-/* Return true if KIND is a revision kind that the WC can supply without
- * contacting the repository. Otherwise, return false. */
-#define SVN_CLIENT__REVKIND_IS_LOCAL_TO_WC(kind) \
- ((kind) == svn_opt_revision_base || \
- (kind) == svn_opt_revision_working || \
- (kind) == svn_opt_revision_committed)
-
/* Return REVISION unless its kind is 'unspecified' in which case return
* a pointer to a statically allocated revision structure of kind 'head'
* if PATH_OR_URL is a URL or 'base' if it is a WC path. */
Modified: subversion/branches/ev2-export/subversion/libsvn_client/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/commit.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/commit.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/commit.c Sun Oct 21 02:00:31 2012
@@ -1620,9 +1620,16 @@ svn_client_commit6(const apr_array_heade
cb.info = &commit_info;
cb.pool = pool;
+ /* Get the RA editor from the first lock target, rather than BASE_ABSPATH.
+ * When committing from multiple WCs, BASE_ABSPATH might be an unrelated
+ * parent of nested working copies. We don't support commits to multiple
+ * repositories so using the first WC to get the RA session is safe. */
cmt_err = svn_error_trace(
svn_client__open_ra_session_internal(&ra_session, NULL, base_url,
- base_abspath, commit_items,
+ APR_ARRAY_IDX(lock_targets,
+ 0,
+ const char *),
+ commit_items,
TRUE, FALSE, ctx, pool));
if (cmt_err)
Modified: subversion/branches/ev2-export/subversion/libsvn_client/commit_util.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/commit_util.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/commit_util.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/commit_util.c Sun Oct 21 02:00:31 2012
@@ -494,8 +494,8 @@ harvest_not_present_for_copy(svn_wc_cont
svn_pool_clear(iterpool);
- SVN_ERR(svn_wc__node_is_status_not_present(¬_present, wc_ctx,
- this_abspath, scratch_pool));
+ SVN_ERR(svn_wc__node_is_not_present(¬_present, NULL, NULL, wc_ctx,
+ this_abspath, scratch_pool));
if (!not_present)
continue;
Modified: subversion/branches/ev2-export/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/copy.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/copy.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/copy.c Sun Oct 21 02:00:31 2012
@@ -246,6 +246,7 @@ do_wc_to_wc_moves_with_locks2(svn_client
const char *dst_parent_abspath,
svn_boolean_t lock_src,
svn_boolean_t lock_dst,
+ svn_boolean_t allow_mixed_revisions,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
@@ -254,11 +255,12 @@ do_wc_to_wc_moves_with_locks2(svn_client
dst_abspath = svn_dirent_join(dst_parent_abspath, pair->base_name,
scratch_pool);
- SVN_ERR(svn_wc_move(ctx->wc_ctx, pair->src_abspath_or_url,
- dst_abspath, FALSE /* metadata_only */,
- ctx->cancel_func, ctx->cancel_baton,
- ctx->notify_func2, ctx->notify_baton2,
- scratch_pool));
+ SVN_ERR(svn_wc__move2(ctx->wc_ctx, pair->src_abspath_or_url,
+ dst_abspath, FALSE /* metadata_only */,
+ allow_mixed_revisions,
+ ctx->cancel_func, ctx->cancel_baton,
+ ctx->notify_func2, ctx->notify_baton2,
+ scratch_pool));
return SVN_NO_ERROR;
}
@@ -269,17 +271,20 @@ do_wc_to_wc_moves_with_locks1(svn_client
const char *dst_parent_abspath,
svn_boolean_t lock_src,
svn_boolean_t lock_dst,
+ svn_boolean_t allow_mixed_revisions,
svn_client_ctx_t *ctx,
apr_pool_t *scratch_pool)
{
if (lock_dst)
SVN_WC__CALL_WITH_WRITE_LOCK(
do_wc_to_wc_moves_with_locks2(pair, dst_parent_abspath, lock_src,
- lock_dst, ctx, scratch_pool),
+ lock_dst, allow_mixed_revisions, ctx,
+ scratch_pool),
ctx->wc_ctx, dst_parent_abspath, FALSE, scratch_pool);
else
SVN_ERR(do_wc_to_wc_moves_with_locks2(pair, dst_parent_abspath, lock_src,
- lock_dst, ctx, scratch_pool));
+ lock_dst, allow_mixed_revisions,
+ ctx, scratch_pool));
return SVN_NO_ERROR;
}
@@ -289,6 +294,7 @@ do_wc_to_wc_moves_with_locks1(svn_client
static svn_error_t *
do_wc_to_wc_moves(const apr_array_header_t *copy_pairs,
const char *dst_path,
+ svn_boolean_t allow_mixed_revisions,
svn_client_ctx_t *ctx,
apr_pool_t *pool)
{
@@ -343,13 +349,15 @@ do_wc_to_wc_moves(const apr_array_header
if (lock_src)
SVN_WC__CALL_WITH_WRITE_LOCK(
do_wc_to_wc_moves_with_locks1(pair, pair->dst_parent_abspath,
- lock_src, lock_dst, ctx, iterpool),
+ lock_src, lock_dst,
+ allow_mixed_revisions, ctx, iterpool),
ctx->wc_ctx, src_parent_abspath,
FALSE, iterpool);
else
SVN_ERR(do_wc_to_wc_moves_with_locks1(pair, pair->dst_parent_abspath,
- lock_src, lock_dst, ctx,
- iterpool));
+ lock_src, lock_dst,
+ allow_mixed_revisions,
+ ctx, iterpool));
}
svn_pool_destroy(iterpool);
@@ -359,18 +367,21 @@ do_wc_to_wc_moves(const apr_array_header
return svn_error_trace(err);
}
-
+/* Verify that the destinations stored in COPY_PAIRS are valid working copy
+ destinations and set pair->dst_parent_abspath and pair->base_name for each
+ item to the resulting location if they do */
static svn_error_t *
-verify_wc_srcs_and_dsts(const apr_array_header_t *copy_pairs,
- svn_boolean_t make_parents,
- svn_boolean_t is_move,
- svn_client_ctx_t *ctx,
- apr_pool_t *pool)
+verify_wc_dsts(const apr_array_header_t *copy_pairs,
+ svn_boolean_t make_parents,
+ svn_boolean_t is_move,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
{
int i;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
- /* Check that all of our SRCs exist, and all the DSTs don't. */
+ /* Check that DST does not exist, but its parent does */
for (i = 0; i < copy_pairs->nelts; i++)
{
svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
@@ -379,20 +390,52 @@ verify_wc_srcs_and_dsts(const apr_array_
svn_pool_clear(iterpool);
- /* Verify that SRC_PATH exists. */
- SVN_ERR(svn_io_check_path(pair->src_abspath_or_url, &pair->src_kind,
- iterpool));
- if (pair->src_kind == svn_node_none)
- return svn_error_createf(
- SVN_ERR_NODE_UNKNOWN_KIND, NULL,
- _("Path '%s' does not exist"),
- svn_dirent_local_style(pair->src_abspath_or_url, pool));
-
/* If DST_PATH does not exist, then its basename will become a new
file or dir added to its parent (possibly an implicit '.').
Else, just error out. */
+ SVN_ERR(svn_wc_read_kind(&dst_kind, ctx->wc_ctx,
+ pair->dst_abspath_or_url, TRUE /* show_hidden */,
+ iterpool));
+ if (dst_kind != svn_node_none)
+ {
+ svn_boolean_t is_not_present;
+ svn_boolean_t is_excluded;
+ svn_boolean_t is_server_excluded;
+
+ SVN_ERR(svn_wc__node_is_not_present(&is_not_present, &is_excluded,
+ &is_server_excluded, ctx->wc_ctx,
+ pair->dst_abspath_or_url,
+ iterpool));
+
+ if (is_excluded || is_server_excluded)
+ {
+ return svn_error_createf(
+ SVN_ERR_WC_OBSTRUCTED_UPDATE,
+ NULL, _("Path '%s' exists, but is excluded"),
+ svn_dirent_local_style(pair->dst_abspath_or_url, iterpool));
+ }
+
+ if (! is_not_present)
+ {
+ svn_boolean_t is_deleted;
+
+ SVN_ERR(svn_wc__node_is_status_deleted(&is_deleted, ctx->wc_ctx,
+ pair->dst_abspath_or_url,
+ scratch_pool));
+
+ if (! is_deleted)
+ return svn_error_createf(
+ SVN_ERR_ENTRY_EXISTS, NULL,
+ _("Path '%s' already exists"),
+ svn_dirent_local_style(pair->dst_abspath_or_url,
+ scratch_pool));
+ }
+ }
+
+ /* Check that there is no unversioned obstruction */
SVN_ERR(svn_io_check_path(pair->dst_abspath_or_url, &dst_kind,
iterpool));
+
if (dst_kind != svn_node_none)
{
if (is_move
@@ -410,7 +453,7 @@ verify_wc_srcs_and_dsts(const apr_array_
SVN_ERR(svn_path_cstring_from_utf8(&dst,
pair->dst_abspath_or_url,
- pool));
+ scratch_pool));
apr_err = apr_filepath_merge(&dst_apr, NULL, dst,
APR_FILEPATH_TRUENAME, iterpool);
@@ -427,7 +470,7 @@ verify_wc_srcs_and_dsts(const apr_array_
{
/* Ok, we have a single case only rename. Get out of here */
svn_dirent_split(&pair->dst_parent_abspath, &pair->base_name,
- pair->dst_abspath_or_url, pool);
+ pair->dst_abspath_or_url, result_pool);
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;
@@ -435,13 +478,14 @@ verify_wc_srcs_and_dsts(const apr_array_
}
return svn_error_createf(
- SVN_ERR_ENTRY_EXISTS, NULL,
- _("Path '%s' already exists"),
- svn_dirent_local_style(pair->dst_abspath_or_url, pool));
+ SVN_ERR_ENTRY_EXISTS, NULL,
+ _("Path '%s' already exists as unversioned node"),
+ svn_dirent_local_style(pair->dst_abspath_or_url,
+ scratch_pool));
}
svn_dirent_split(&pair->dst_parent_abspath, &pair->base_name,
- pair->dst_abspath_or_url, pool);
+ pair->dst_abspath_or_url, result_pool);
/* Make sure the destination parent is a directory and produce a clear
error message if it is not. */
@@ -467,7 +511,7 @@ verify_wc_srcs_and_dsts(const apr_array_
return svn_error_createf(SVN_ERR_WC_NOT_WORKING_COPY, NULL,
_("Path '%s' is not a directory"),
svn_dirent_local_style(
- pair->dst_parent_abspath, pool));
+ pair->dst_parent_abspath, scratch_pool));
}
}
@@ -476,6 +520,43 @@ verify_wc_srcs_and_dsts(const apr_array_
return SVN_NO_ERROR;
}
+static svn_error_t *
+verify_wc_srcs_and_dsts(const apr_array_header_t *copy_pairs,
+ svn_boolean_t make_parents,
+ svn_boolean_t is_move,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+ /* Check that all of our SRCs exist. */
+ for (i = 0; i < copy_pairs->nelts; i++)
+ {
+ svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
+ svn_client__copy_pair_t *);
+ svn_pool_clear(iterpool);
+
+ /* Verify that SRC_PATH exists. */
+ SVN_ERR(svn_wc_read_kind(&pair->src_kind, ctx->wc_ctx,
+ pair->src_abspath_or_url, FALSE, iterpool));
+ if (pair->src_kind == svn_node_none)
+ return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
+ _("Path '%s' does not exist"),
+ svn_dirent_local_style(
+ pair->src_abspath_or_url,
+ scratch_pool));
+ }
+
+ SVN_ERR(verify_wc_dsts(copy_pairs, make_parents, is_move, ctx,
+ result_pool, iterpool));
+
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
/* Path-specific state used as part of path_driver_cb_baton. */
typedef struct path_driver_info_t
@@ -1498,86 +1579,24 @@ repos_to_wc_copy_locked(const apr_array_
apr_pool_t *scratch_pool)
{
int i;
- const char *src_uuid = NULL, *dst_uuid = NULL;
svn_boolean_t same_repositories;
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
/* We've already checked for physical obstruction by a working file.
But there could also be logical obstruction by an entry whose
working file happens to be missing.*/
- for (i = 0; i < copy_pairs->nelts; i++)
- {
- svn_client__copy_pair_t *pair = APR_ARRAY_IDX(copy_pairs, i,
- svn_client__copy_pair_t *);
- svn_node_kind_t kind;
- svn_boolean_t is_excluded;
- svn_boolean_t is_server_excluded;
-
- svn_pool_clear(iterpool);
-
- SVN_ERR(svn_wc_read_kind(&kind, ctx->wc_ctx, pair->dst_abspath_or_url,
- FALSE, iterpool));
- if (kind == svn_node_none)
- continue;
-
- /* ### TODO(#2843): Rework these error report. Maybe we can
- ### simplify the conditions? */
-
- /* Hidden by client exclusion */
- SVN_ERR(svn_wc__node_is_status_excluded(&is_excluded, ctx->wc_ctx,
- pair->dst_abspath_or_url,
- iterpool));
- if (is_excluded)
- {
- return svn_error_createf
- (SVN_ERR_ENTRY_EXISTS,
- NULL, _("'%s' is already under version control"),
- svn_dirent_local_style(pair->dst_abspath_or_url, iterpool));
- }
-
- /* Hidden by server exclusion (not authorized) */
- SVN_ERR(svn_wc__node_is_status_server_excluded(&is_server_excluded,
- ctx->wc_ctx,
- pair->dst_abspath_or_url,
- iterpool));
- if (is_server_excluded)
- {
- return svn_error_createf
- (SVN_ERR_ENTRY_EXISTS,
- NULL, _("'%s' is already under version control"),
- svn_dirent_local_style(pair->dst_abspath_or_url, iterpool));
- }
-
- /* Working file missing to something other than being scheduled
- for addition or in "deleted" state. */
- if (kind != svn_node_dir)
- {
- svn_boolean_t is_deleted;
- svn_boolean_t is_not_present;
-
- SVN_ERR(svn_wc__node_is_status_deleted(&is_deleted, ctx->wc_ctx,
- pair->dst_abspath_or_url,
- iterpool));
- SVN_ERR(svn_wc__node_is_status_not_present(&is_not_present,
- ctx->wc_ctx,
- pair->dst_abspath_or_url,
- iterpool));
- if ((! is_deleted) && (! is_not_present))
- return svn_error_createf
- (SVN_ERR_WC_OBSTRUCTED_UPDATE, NULL,
- _("Entry for '%s' exists (though the working file is missing)"),
- svn_dirent_local_style(pair->dst_abspath_or_url, iterpool));
- }
- }
+ SVN_ERR(verify_wc_dsts(copy_pairs, FALSE, FALSE, ctx,
+ scratch_pool, iterpool));
/* Decide whether the two repositories are the same or not. */
{
svn_error_t *src_err, *dst_err;
const char *parent;
const char *parent_abspath;
+ const char *src_uuid, *dst_uuid;
/* Get the repository uuid of SRC_URL */
- src_err = svn_ra_get_uuid2(ra_session, &src_uuid, scratch_pool);
+ src_err = svn_ra_get_uuid2(ra_session, &src_uuid, iterpool);
if (src_err && src_err->apr_err != SVN_ERR_RA_NO_REPOS_UUID)
return svn_error_trace(src_err);
@@ -1592,7 +1611,7 @@ repos_to_wc_copy_locked(const apr_array_
SVN_ERR(svn_dirent_get_absolute(&parent_abspath, parent, scratch_pool));
dst_err = svn_client_get_repos_root(NULL /* root_url */, &dst_uuid,
parent_abspath, ctx,
- scratch_pool, scratch_pool);
+ iterpool, iterpool);
if (dst_err && dst_err->apr_err != SVN_ERR_RA_NO_REPOS_UUID)
return dst_err;
@@ -1602,7 +1621,6 @@ repos_to_wc_copy_locked(const apr_array_
copy-history is attempted. */
if (src_err || dst_err || (! src_uuid) || (! dst_uuid))
same_repositories = FALSE;
-
else
same_repositories = (strcmp(src_uuid, dst_uuid) == 0);
}
@@ -1753,6 +1771,7 @@ static svn_error_t *
try_copy(const apr_array_header_t *sources,
const char *dst_path_in,
svn_boolean_t is_move,
+ svn_boolean_t allow_mixed_revisions,
svn_boolean_t make_parents,
svn_boolean_t ignore_externals,
const apr_hash_t *revprop_table,
@@ -2038,12 +2057,13 @@ try_copy(const apr_array_header_t *sourc
if ((! srcs_are_urls) && (! dst_is_url))
{
SVN_ERR(verify_wc_srcs_and_dsts(copy_pairs, make_parents, is_move,
- ctx, pool));
+ ctx, pool, pool));
/* Copy or move all targets. */
if (is_move)
- return svn_error_trace(do_wc_to_wc_moves(copy_pairs, dst_path_in, ctx,
- pool));
+ return svn_error_trace(do_wc_to_wc_moves(copy_pairs, dst_path_in,
+ allow_mixed_revisions,
+ ctx, pool));
else
return svn_error_trace(do_wc_to_wc_copies(copy_pairs, ctx, pool));
}
@@ -2092,6 +2112,7 @@ svn_client_copy6(const apr_array_header_
err = try_copy(sources, dst_path,
FALSE /* is_move */,
+ TRUE /* allow_mixed_revisions */,
make_parents,
ignore_externals,
revprop_table,
@@ -2123,6 +2144,7 @@ svn_client_copy6(const apr_array_header_
subpool)
: svn_dirent_join(dst_path, src_basename, subpool),
FALSE /* is_move */,
+ TRUE /* allow_mixed_revisions */,
make_parents,
ignore_externals,
revprop_table,
@@ -2137,10 +2159,11 @@ svn_client_copy6(const apr_array_header_
svn_error_t *
-svn_client_move6(const apr_array_header_t *src_paths,
+svn_client_move7(const apr_array_header_t *src_paths,
const char *dst_path,
svn_boolean_t move_as_child,
svn_boolean_t make_parents,
+ svn_boolean_t allow_mixed_revisions,
const apr_hash_t *revprop_table,
svn_commit_callback2_t commit_callback,
void *commit_baton,
@@ -2174,6 +2197,7 @@ svn_client_move6(const apr_array_header_
err = try_copy(sources, dst_path,
TRUE /* is_move */,
+ allow_mixed_revisions,
make_parents,
FALSE,
revprop_table,
@@ -2204,6 +2228,7 @@ svn_client_move6(const apr_array_header_
src_basename, pool)
: svn_dirent_join(dst_path, src_basename, pool),
TRUE /* is_move */,
+ allow_mixed_revisions,
make_parents,
FALSE,
revprop_table,
Modified: subversion/branches/ev2-export/subversion/libsvn_client/ctx.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/ctx.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/ctx.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/ctx.c Sun Oct 21 02:00:31 2012
@@ -76,9 +76,12 @@ call_conflict_func(svn_wc_conflict_resul
}
svn_error_t *
-svn_client_create_context(svn_client_ctx_t **ctx,
- apr_pool_t *pool)
+svn_client_create_context2(svn_client_ctx_t **ctx,
+ apr_hash_t *cfg_hash,
+ apr_pool_t *pool)
{
+ svn_config_t *cfg_config;
+
*ctx = apr_pcalloc(pool, sizeof(svn_client_ctx_t));
(*ctx)->notify_func2 = call_notify_func;
@@ -87,8 +90,23 @@ svn_client_create_context(svn_client_ctx
(*ctx)->conflict_func2 = call_conflict_func;
(*ctx)->conflict_baton2 = *ctx;
- SVN_ERR(svn_wc_context_create(&(*ctx)->wc_ctx, NULL /* config */, pool,
+ (*ctx)->config = cfg_hash;
+
+ if (cfg_hash)
+ cfg_config = apr_hash_get(cfg_hash, SVN_CONFIG_CATEGORY_CONFIG,
+ APR_HASH_KEY_STRING);
+ else
+ cfg_config = NULL;
+
+ SVN_ERR(svn_wc_context_create(&(*ctx)->wc_ctx, cfg_config, pool,
pool));
return SVN_NO_ERROR;
}
+
+svn_error_t *
+svn_client_create_context(svn_client_ctx_t **ctx,
+ apr_pool_t *pool)
+{
+ return svn_client_create_context2(ctx, NULL, pool);
+}
Modified: subversion/branches/ev2-export/subversion/libsvn_client/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/deprecated.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/deprecated.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/deprecated.c Sun Oct 21 02:00:31 2012
@@ -699,6 +699,25 @@ svn_client_copy(svn_client_commit_info_t
}
svn_error_t *
+svn_client_move6(const apr_array_header_t *src_paths,
+ const char *dst_path,
+ svn_boolean_t move_as_child,
+ svn_boolean_t make_parents,
+ const apr_hash_t *revprop_table,
+ svn_commit_callback2_t commit_callback,
+ void *commit_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+ return svn_error_trace(svn_client_move7(src_paths, dst_path,
+ move_as_child, make_parents,
+ TRUE, /* allow_mixed_revisions */
+ revprop_table,
+ commit_callback, commit_baton,
+ ctx, pool));
+}
+
+svn_error_t *
svn_client_move5(svn_commit_info_t **commit_info_p,
const apr_array_header_t *src_paths,
const char *dst_path,
@@ -1712,6 +1731,26 @@ svn_client_revprop_set(const char *propn
}
svn_error_t *
+svn_client_propget4(apr_hash_t **props,
+ const char *propname,
+ const char *target,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *revision,
+ svn_revnum_t *actual_revnum,
+ svn_depth_t depth,
+ const apr_array_header_t *changelists,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ return svn_error_trace(svn_client_propget5(props, NULL, propname, target,
+ peg_revision, revision,
+ actual_revnum, depth,
+ changelists, ctx,
+ result_pool, scratch_pool));
+}
+
+svn_error_t *
svn_client_propget3(apr_hash_t **props,
const char *propname,
const char *path_or_url,
@@ -1851,6 +1890,70 @@ svn_client_proplist_item_dup(const svn_c
return new_item;
}
+/* Baton for use with wrap_proplist_receiver */
+struct proplist_receiver_wrapper_baton {
+ void *baton;
+ svn_proplist_receiver_t receiver;
+};
+
+/* This implements svn_client_proplist_receiver2_t */
+static svn_error_t *
+proplist_wrapper_receiver(void *baton,
+ const char *path,
+ apr_hash_t *prop_hash,
+ apr_array_header_t *inherited_props,
+ apr_pool_t *pool)
+{
+ struct proplist_receiver_wrapper_baton *plrwb = baton;
+
+ if (plrwb->receiver)
+ return plrwb->receiver(plrwb->baton, path, prop_hash, pool);
+
+ return SVN_NO_ERROR;
+}
+
+static void
+wrap_proplist_receiver(svn_proplist_receiver2_t *receiver2,
+ void **receiver2_baton,
+ svn_proplist_receiver_t receiver,
+ void *receiver_baton,
+ apr_pool_t *pool)
+{
+ struct proplist_receiver_wrapper_baton *plrwb = apr_palloc(pool,
+ sizeof(*plrwb));
+
+ /* Set the user provided old format callback in the baton. */
+ plrwb->baton = receiver_baton;
+ plrwb->receiver = receiver;
+
+ *receiver2_baton = plrwb;
+ *receiver2 = proplist_wrapper_receiver;
+}
+
+svn_error_t *
+svn_client_proplist3(const char *target,
+ const svn_opt_revision_t *peg_revision,
+ const svn_opt_revision_t *revision,
+ svn_depth_t depth,
+ const apr_array_header_t *changelists,
+ svn_proplist_receiver_t receiver,
+ void *receiver_baton,
+ svn_client_ctx_t *ctx,
+ apr_pool_t *pool)
+{
+
+ svn_proplist_receiver2_t receiver2;
+ void *receiver2_baton;
+
+ wrap_proplist_receiver(&receiver2, &receiver2_baton, receiver, receiver_baton,
+ pool);
+
+ return svn_error_trace(svn_client_proplist4(target, peg_revision, revision,
+ depth, changelists, FALSE,
+ receiver2, receiver2_baton,
+ ctx, pool, pool));
+}
+
/* Receiver baton used by proplist2() */
struct proplist_receiver_baton {
apr_array_header_t *props;
Modified: subversion/branches/ev2-export/subversion/libsvn_client/diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/ev2-export/subversion/libsvn_client/diff.c?rev=1400556&r1=1400555&r2=1400556&view=diff
==============================================================================
--- subversion/branches/ev2-export/subversion/libsvn_client/diff.c (original)
+++ subversion/branches/ev2-export/subversion/libsvn_client/diff.c Sun Oct 21 02:00:31 2012
@@ -103,7 +103,7 @@ display_mergeinfo_diff(const char *old_m
hi; hi = apr_hash_next(hi))
{
const char *from_path = svn__apr_hash_index_key(hi);
- apr_array_header_t *merge_revarray = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *merge_revarray = svn__apr_hash_index_val(hi);
svn_string_t *merge_revstr;
svn_pool_clear(iterpool);
@@ -120,7 +120,7 @@ display_mergeinfo_diff(const char *old_m
hi; hi = apr_hash_next(hi))
{
const char *from_path = svn__apr_hash_index_key(hi);
- apr_array_header_t *merge_revarray = svn__apr_hash_index_val(hi);
+ svn_rangelist_t *merge_revarray = svn__apr_hash_index_val(hi);
svn_string_t *merge_revstr;
svn_pool_clear(iterpool);
@@ -1044,6 +1044,9 @@ diff_content_changed(const char *path,
subpool, subpool));
SVN_ERR(svn_stream_copy3(stream, svn_stream_disown(errstream, subpool),
NULL, NULL, subpool));
+
+ /* We have a printed a diff for this path, mark it as visited. */
+ mark_path_as_visited(diff_cmd_baton, path);
}
else /* use libsvn_diff to generate the diff */
{