Author: cmpilato
Date: Wed Nov 28 17:03:30 2012
New Revision: 1414814
URL: http://svn.apache.org/viewvc?rev=1414814&view=rev
Log:
Sync the 'issue-4194-dev' branch with recent trunk changes.
(Merged /subversion/trunk:r1414432-1414811.)
Added:
subversion/branches/issue-4194-dev/subversion/bindings/cxxhl/
- copied from r1414811, subversion/trunk/subversion/bindings/cxxhl/
Modified:
subversion/branches/issue-4194-dev/ (props changed)
subversion/branches/issue-4194-dev/Makefile.in
subversion/branches/issue-4194-dev/build.conf
subversion/branches/issue-4194-dev/build/generator/gen_make.py
subversion/branches/issue-4194-dev/configure.ac
subversion/branches/issue-4194-dev/subversion/include/svn_error_codes.h
subversion/branches/issue-4194-dev/subversion/libsvn_client/merge.c
subversion/branches/issue-4194-dev/subversion/libsvn_wc/externals.c
subversion/branches/issue-4194-dev/subversion/libsvn_wc/props.c
subversion/branches/issue-4194-dev/subversion/libsvn_wc/wc.h
subversion/branches/issue-4194-dev/subversion/tests/libsvn_subr/path-test.c
Propchange: subversion/branches/issue-4194-dev/
------------------------------------------------------------------------------
Merged /subversion/trunk:r1414432-1414811
Modified: subversion/branches/issue-4194-dev/Makefile.in
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/Makefile.in?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/Makefile.in (original)
+++ subversion/branches/issue-4194-dev/Makefile.in Wed Nov 28 17:03:30 2012
@@ -156,6 +156,8 @@ CTYPES_PYTHON_SRC_DIR = $(abs_srcdir)/su
JAVAHL_JAR=subversion/bindings/javahl/svn-javahl.jar
JAVAHL_INCLUDES= @JNI_INCLUDES@
-I$(abs_builddir)/subversion/bindings/javahl/include
+CXXHL_INCLUDES = -I$(abs_srcdir)/subversion/bindings/cxxhl/include
+
SVN_APR_CONFIG = @SVN_APR_CONFIG@
SVN_APR_INCLUDES = @SVN_APR_INCLUDES@
SVN_APRUTIL_CONFIG = @SVN_APRUTIL_CONFIG@
@@ -196,6 +198,9 @@ COMPILE_JAVAHL_CXX = $(LIBTOOL) $(LTCXXF
COMPILE_JAVAHL_JAVAC = $(JAVAC) $(JAVAC_FLAGS)
COMPILE_JAVAHL_JAVAH = $(JAVAH)
+# special compilation for files destined for cxxhl
+COMPILE_CXXHL_CXX = $(LIBTOOL) $(LTCXXFLAGS) --mode=compile $(COMPILE_CXX)
$(LT_CFLAGS) $(CXXHL_INCLUDES) -o $@ -c
+
LINK = $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LT_LDFLAGS) $(CFLAGS)
$(LDFLAGS) -rpath $(libdir)
LINK_LIB = $(LINK) $(LT_SO_VERSION)
LINK_CXX = $(LIBTOOL) $(LTCXXFLAGS) --mode=link $(CXX) $(LT_LDFLAGS)
$(CXXFLAGS) $(LDFLAGS) -rpath $(libdir)
Modified: subversion/branches/issue-4194-dev/build.conf
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/build.conf?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/build.conf (original)
+++ subversion/branches/issue-4194-dev/build.conf Wed Nov 28 17:03:30 2012
@@ -38,6 +38,8 @@ private-includes =
subversion/include/private/*.h
subversion/bindings/swig/include/*.swg
subversion/libsvn_delta/compose_delta.c
+ subversion/bindings/cxxhl/include/*.h
+ subversion/bindings/cxxhl/include/types/*.h
private-built-includes =
subversion/svn_private_config.h
subversion/libsvn_fs_fs/rep-cache-db.h
@@ -623,6 +625,22 @@ link-cmd = $(LINK_JAVAHL_CXX)
# ----------------------------------------------------------------------------
#
+# C++HL targets
+#
+
+[libsvncxxhl]
+description = Subversion C++ HighLevel binding
+type = lib
+path = subversion/bindings/cxxhl
+libs = libsvn_repos libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_diff
+ libsvn_subr libsvn_fs aprutil apriconv apr
+sources = src/*.cpp src/types/*.cpp
+install = cxxhl-lib
+compile-cmd = $(COMPILE_CXXHL_CXX)
+link-cmd = $(LINK_CXX_LIB)
+
+# ----------------------------------------------------------------------------
+#
# TESTING TARGETS
#
Modified: subversion/branches/issue-4194-dev/build/generator/gen_make.py
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/build/generator/gen_make.py?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/build/generator/gen_make.py (original)
+++ subversion/branches/issue-4194-dev/build/generator/gen_make.py Wed Nov 28
17:03:30 2012
@@ -423,8 +423,9 @@ class Generator(gen_base.GeneratorBase):
# certain areas require hooks for extra install rules defined
# in Makefile.in
### we should turn AREA into an object, then test it instead of this
- if area[:5] == 'swig-' and area[-4:] != '-lib' or \
- area[:7] == 'javahl-' \
+ if area[:5] == 'swig-' and area[-4:] != '-lib' \
+ or area[:7] == 'javahl-' \
+ or area[:6] == 'cxxhl-' \
or area == 'tools':
ezt_area.extra_install = 'yes'
Modified: subversion/branches/issue-4194-dev/configure.ac
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/configure.ac?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/configure.ac (original)
+++ subversion/branches/issue-4194-dev/configure.ac Wed Nov 28 17:03:30 2012
@@ -988,7 +988,7 @@ AS_HELP_STRING([--enable-maintainer-mode
dnl Enable some extra warnings. Put these before the user's flags
dnl so the user can specify flags that override these.
CFLAGS="-Wpointer-arith -Wwrite-strings -Wshadow -ansi -Wall
-Wformat=2 -Wunused -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wno-multichar -Wredundant-decls -Wnested-externs
-Wunreachable-code -Winline -Wno-long-long $CFLAGS"
- CXXFLAGS="-Wpointer-arith -Wwrite-strings -Wshadow $CXXFLAGS"
+ CXXFLAGS="-Wpointer-arith -Wwrite-strings -Wshadow -ansi -Wall
$CXXFLAGS"
dnl some additional flags that can be handy for an occasional review,
dnl but throw too many warnings in svn code, of too little importance,
@@ -996,7 +996,7 @@ AS_HELP_STRING([--enable-maintainer-mode
dnl switches enabled.
dnl CFLAGS="-Wswitch-enum -Wswitch-default $CFLAGS"
- dnl Add each of the following flags only if the compiler accepts it.
+ dnl Add each of the following flags only if the C compiler accepts it.
CFLAGS_KEEP="$CFLAGS"
AC_LANG_PUSH([C])
@@ -1026,6 +1026,23 @@ AS_HELP_STRING([--enable-maintainer-mode
AC_LANG_POP([C])
CFLAGS="$CFLAGS_KEEP"
+
+ dnl Add each of the following flags only if the C++ compiler accepts
it.
+
+ CXXFLAGS_KEEP="$CXXFLAGS"
+ AC_LANG_PUSH([C++])
+
+ CXXFLAGS="-Wextra-tokens $CXXFLAGS_KEEP"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[]])], [CXXFLAGS_KEEP="$CXXFLAGS"])
+
+ CXXFLAGS="-Wshorten-64-to-32 $CXXFLAGS_KEEP"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[]])], [CXXFLAGS_KEEP="$CXXFLAGS"])
+
+ CXXFLAGS="-Wno-system-headers $CXXFLAGS_KEEP"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[]])], [CXXFLAGS_KEEP="$CXXFLAGS"])
+
+ AC_LANG_POP([C++])
+ CXXFLAGS="$CXXFLAGS_KEEP"
fi
fi
])
Modified:
subversion/branches/issue-4194-dev/subversion/include/svn_error_codes.h
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/include/svn_error_codes.h?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/include/svn_error_codes.h
(original)
+++ subversion/branches/issue-4194-dev/subversion/include/svn_error_codes.h Wed
Nov 28 17:03:30 2012
@@ -545,6 +545,11 @@ SVN_ERROR_START
SVN_ERR_WC_CATEGORY_START + 40,
"Mixed-revision working copy was found but not expected")
+ /** @since New in 1.8 */
+ SVN_ERRDEF(SVN_ERR_WC_DUPLICATE_EXTERNALS_TARGET,
+ SVN_ERR_WC_CATEGORY_START + 41,
+ "Duplicate targets in svn:externals property")
+
/* fs errors */
SVN_ERRDEF(SVN_ERR_FS_GENERAL,
Modified: subversion/branches/issue-4194-dev/subversion/libsvn_client/merge.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/libsvn_client/merge.c?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/libsvn_client/merge.c
(original)
+++ subversion/branches/issue-4194-dev/subversion/libsvn_client/merge.c Wed Nov
28 17:03:30 2012
@@ -260,9 +260,6 @@ typedef struct merge_cmd_baton_t {
SOURCES_ANCESTRAL is FALSE. */
svn_boolean_t reintegrate_merge; /* Whether this is a --reintegrate
merge or not. */
- const char *added_path; /* Set to the dir path whenever the
- dir is added as a child of a
- versioned dir (dry-run only) */
const merge_target_t *target; /* Description of merge target node */
/* The left and right URLs and revs. The value of this field changes to
@@ -490,6 +487,35 @@ dry_run_added_p(const merge_cmd_baton_t
APR_HASH_KEY_STRING) != NULL);
}
+/* Return true iff we're in dry-run mode and a parent of EDIT_RELPATH
+ would have been added by now if we weren't in dry-run mode.
+ Used to avoid spurious notifications (e.g. conflicts) from a merge
+ attempt into an existing target which would have been deleted if we
+ weren't in dry_run mode (issue #2584). Assumes that WCPATH is
+ still versioned (e.g. has an associated entry). */
+static svn_boolean_t
+dry_run_added_parent_p(const merge_cmd_baton_t *merge_b,
+ const char *edit_relpath,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ const char *abspath;
+
+ if (!merge_b->dry_run)
+ return FALSE;
+
+ abspath = svn_dirent_join(merge_b->target->abspath, edit_relpath,
+ scratch_pool);
+ for (i = 0; i < (svn_path_component_count(edit_relpath) - 1); i++)
+ {
+ abspath = svn_dirent_dirname(abspath, scratch_pool);
+ if (apr_hash_get(merge_b->dry_run_added, abspath,
+ APR_HASH_KEY_STRING))
+ return TRUE;
+ }
+ return FALSE;
+}
+
/* Return whether any WC path was put in conflict by the merge
operation corresponding to MERGE_B. */
static APR_INLINE svn_boolean_t
@@ -1857,8 +1883,8 @@ merge_file_added(svn_wc_notify_state_t *
if (obstr_state != svn_wc_notify_state_inapplicable)
{
- if (merge_b->dry_run && merge_b->added_path
- && svn_dirent_is_child(merge_b->added_path, mine_abspath, NULL))
+ if (merge_b->dry_run
+ && dry_run_added_parent_p(merge_b, mine_relpath, scratch_pool))
{
if (content_state)
*content_state = svn_wc_notify_state_changed;
@@ -2337,13 +2363,15 @@ merge_dir_added(svn_wc_notify_state_t *s
if (obstr_state != svn_wc_notify_state_inapplicable)
{
- if (state && merge_b->dry_run && merge_b->added_path
- && svn_dirent_is_child(merge_b->added_path, local_abspath, NULL))
+ if (state && merge_b->dry_run
+ && dry_run_added_parent_p(merge_b, local_relpath, scratch_pool))
{
*state = svn_wc_notify_state_changed;
}
else if (state)
- *state = obstr_state;
+ {
+ *state = obstr_state;
+ }
return SVN_NO_ERROR;
}
@@ -2358,9 +2386,10 @@ merge_dir_added(svn_wc_notify_state_t *s
/* Unversioned or schedule-delete */
if (merge_b->dry_run)
{
- merge_b->added_path = apr_pstrdup(merge_b->pool, local_abspath);
- apr_hash_set(merge_b->dry_run_added, merge_b->added_path,
- APR_HASH_KEY_STRING, merge_b->added_path);
+ const char *added_path = apr_pstrdup(merge_b->pool,
+ local_abspath);
+ apr_hash_set(merge_b->dry_run_added, added_path,
+ APR_HASH_KEY_STRING, added_path);
}
else
{
@@ -2385,15 +2414,22 @@ merge_dir_added(svn_wc_notify_state_t *s
/* The dir is not known to Subversion, or is schedule-delete.
* We will make it schedule-add. */
if (!merge_b->dry_run)
- SVN_ERR(svn_wc_add4(merge_b->ctx->wc_ctx, local_abspath,
- svn_depth_infinity,
- copyfrom_url, copyfrom_rev,
- merge_b->ctx->cancel_func,
- merge_b->ctx->cancel_baton,
- NULL, NULL, /* no notification func! */
- scratch_pool));
+ {
+ SVN_ERR(svn_wc_add4(merge_b->ctx->wc_ctx, local_abspath,
+ svn_depth_infinity,
+ copyfrom_url, copyfrom_rev,
+ merge_b->ctx->cancel_func,
+ merge_b->ctx->cancel_baton,
+ NULL, NULL, /* no notification func! */
+ scratch_pool));
+ }
else
- merge_b->added_path = apr_pstrdup(merge_b->pool, local_abspath);
+ {
+ const char *added_path = apr_pstrdup(merge_b->pool,
+ local_abspath);
+ apr_hash_set(merge_b->dry_run_added, added_path,
+ APR_HASH_KEY_STRING, added_path);
+ }
if (state)
*state = svn_wc_notify_state_changed;
}
@@ -2431,9 +2467,6 @@ merge_dir_added(svn_wc_notify_state_t *s
}
break;
case svn_node_file:
- if (merge_b->dry_run)
- merge_b->added_path = NULL;
-
if (is_versioned && dry_run_deleted_p(merge_b, local_abspath))
{
/* ### TODO: Retain record of this dir being added to
@@ -2455,8 +2488,6 @@ merge_dir_added(svn_wc_notify_state_t *s
}
break;
default:
- if (merge_b->dry_run)
- merge_b->added_path = NULL;
if (state)
*state = svn_wc_notify_state_unknown;
break;
@@ -9163,7 +9194,6 @@ do_merge(apr_hash_t **modified_subtrees,
be reset for each merge source iteration. */
merge_cmd_baton.merge_source = *source;
merge_cmd_baton.implicit_src_gap = NULL;
- merge_cmd_baton.added_path = NULL;
merge_cmd_baton.add_necessitated_merge = FALSE;
merge_cmd_baton.dry_run_deletions =
dry_run ? apr_hash_make(iterpool) : NULL;
Modified: subversion/branches/issue-4194-dev/subversion/libsvn_wc/externals.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/libsvn_wc/externals.c?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/libsvn_wc/externals.c
(original)
+++ subversion/branches/issue-4194-dev/subversion/libsvn_wc/externals.c Wed Nov
28 17:03:30 2012
@@ -164,10 +164,8 @@ svn_wc_parse_externals_description3(apr_
apr_pool_t *pool)
{
int i;
- unsigned int len;
apr_array_header_t *externals = NULL;
apr_array_header_t *lines = svn_cstring_split(desc, "\n\r", TRUE, pool);
- apr_hash_t *duplicate_check = apr_hash_make(pool);
const char *parent_directory_display = svn_path_is_url(parent_directory) ?
parent_directory : svn_dirent_local_style(parent_directory, pool);
@@ -332,21 +330,6 @@ svn_wc_parse_externals_description3(apr_
item->url = svn_dirent_canonicalize(item->url, pool);
}
- /* Has the same WC target path already been mentioned in this prop? */
- len = apr_hash_count(duplicate_check);
- apr_hash_set(duplicate_check, item->target_dir, APR_HASH_KEY_STRING, "");
- if (len == apr_hash_count(duplicate_check))
- {
- /* Hashtable length is unchanged. This must be a duplicate. */
- return svn_error_createf
- (SVN_ERR_CLIENT_INVALID_EXTERNALS_DESCRIPTION, NULL,
- _("Invalid %s property on '%s': "
- "target '%s' appears more than once"),
- SVN_PROP_EXTERNALS,
- parent_directory_display,
- item->target_dir);
- }
-
if (externals)
APR_ARRAY_PUSH(externals, svn_wc_external_item2_t *) = item;
}
@@ -357,6 +340,53 @@ svn_wc_parse_externals_description3(apr_
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_wc__externals_find_target_dups(apr_array_header_t **duplicate_targets,
+ apr_array_header_t *externals,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool)
+{
+ int i;
+ unsigned int len;
+ unsigned int len2;
+ const char *target;
+ apr_hash_t *targets = apr_hash_make(scratch_pool);
+ apr_hash_t *targets2 = NULL;
+ *duplicate_targets = NULL;
+
+ for (i = 0; i < externals->nelts; i++)
+ {
+ target = APR_ARRAY_IDX(externals, i,
+ svn_wc_external_item2_t*)->target_dir;
+ len = apr_hash_count(targets);
+ apr_hash_set(targets, target, APR_HASH_KEY_STRING, "");
+ if (len == apr_hash_count(targets))
+ {
+ /* Hashtable length is unchanged. This must be a duplicate. */
+
+ /* Collapse multiple duplicates of the same target by using a second
+ * hash layer. */
+ if (! targets2)
+ targets2 = apr_hash_make(scratch_pool);
+ len2 = apr_hash_count(targets2);
+ apr_hash_set(targets2, target, APR_HASH_KEY_STRING, "");
+ if (len2 < apr_hash_count(targets2))
+ {
+ /* The second hash list just got bigger, i.e. this target has
+ * not been counted as duplicate before. */
+ if (! *duplicate_targets)
+ {
+ *duplicate_targets = apr_array_make(
+ pool, 1, sizeof(svn_wc_external_item2_t*));
+ }
+ APR_ARRAY_PUSH((*duplicate_targets), const char *) = target;
+ }
+ /* Else, this same target has already been recorded as a duplicate,
+ * don't count it again. */
+ }
+ }
+ return SVN_NO_ERROR;
+}
struct edit_baton
{
Modified: subversion/branches/issue-4194-dev/subversion/libsvn_wc/props.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/libsvn_wc/props.c?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/libsvn_wc/props.c (original)
+++ subversion/branches/issue-4194-dev/subversion/libsvn_wc/props.c Wed Nov 28
17:03:30 2012
@@ -2168,9 +2168,34 @@ svn_wc_canonicalize_svn_prop(const svn_s
an svn:externals line. As it happens, our parse code
checks for this, so all we have to is invoke it --
we're not interested in the parsed result, only in
- whether or the parsing errored. */
- SVN_ERR(svn_wc_parse_externals_description3
- (NULL, path, propval->data, FALSE, pool));
+ whether or not the parsing errored. */
+ apr_array_header_t *externals = NULL;
+ apr_array_header_t *duplicate_targets = NULL;
+ SVN_ERR(svn_wc_parse_externals_description3(&externals, path,
+ propval->data, FALSE,
+ /*scratch_*/pool));
+ SVN_ERR(svn_wc__externals_find_target_dups(&duplicate_targets,
+ externals,
+ /*scratch_*/pool,
+ /*scratch_*/pool));
+ if (duplicate_targets && duplicate_targets->nelts > 0)
+ {
+ const char *more_str = "";
+ if (duplicate_targets->nelts > 1)
+ {
+ more_str = apr_psprintf(/*scratch_*/pool,
+ _(" (%d more duplicate targets found)"),
+ duplicate_targets->nelts - 1);
+ }
+ return svn_error_createf(
+ SVN_ERR_WC_DUPLICATE_EXTERNALS_TARGET, NULL,
+ _("Invalid %s property on '%s': "
+ "target '%s' appears more than once%s"),
+ SVN_PROP_EXTERNALS,
+ svn_dirent_local_style(path, pool),
+ APR_ARRAY_IDX(duplicate_targets, 0, const char*),
+ more_str);
+ }
}
}
else if (strcmp(propname, SVN_PROP_KEYWORDS) == 0)
Modified: subversion/branches/issue-4194-dev/subversion/libsvn_wc/wc.h
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/libsvn_wc/wc.h?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/libsvn_wc/wc.h (original)
+++ subversion/branches/issue-4194-dev/subversion/libsvn_wc/wc.h Wed Nov 28
17:03:30 2012
@@ -755,6 +755,16 @@ svn_wc__fetch_base_func(const char **fil
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
+/* Find duplicate targets in *EXTERNALS, a list of svn_wc_external_item2_t*
+ * elements, and store each target string in *DUPLICATE_TARGETS as const
+ * char * elements. *DUPLICATE_TARGETS will be NULL if no duplicates were
+ * found. */
+svn_error_t *
+svn_wc__externals_find_target_dups(apr_array_header_t **duplicate_targets,
+ apr_array_header_t *externals,
+ apr_pool_t *pool,
+ apr_pool_t *scratch_pool);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
Modified:
subversion/branches/issue-4194-dev/subversion/tests/libsvn_subr/path-test.c
URL:
http://svn.apache.org/viewvc/subversion/branches/issue-4194-dev/subversion/tests/libsvn_subr/path-test.c?rev=1414814&r1=1414813&r2=1414814&view=diff
==============================================================================
--- subversion/branches/issue-4194-dev/subversion/tests/libsvn_subr/path-test.c
(original)
+++ subversion/branches/issue-4194-dev/subversion/tests/libsvn_subr/path-test.c
Wed Nov 28 17:03:30 2012
@@ -1202,7 +1202,6 @@ test_path_splitext(apr_pool_t *pool)
const char *path;
const char *path_root;
const char *path_ext;
- svn_boolean_t result;
} tests[] = {
{ "no-ext", "no-ext", "" },
{ "test-file.py", "test-file.", "py" },