Return-Path: X-Original-To: apmail-subversion-commits-archive@minotaur.apache.org Delivered-To: apmail-subversion-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 68907DDA7 for ; Thu, 27 Dec 2012 04:05:18 +0000 (UTC) Received: (qmail 95353 invoked by uid 500); 27 Dec 2012 04:05:18 -0000 Delivered-To: apmail-subversion-commits-archive@subversion.apache.org Received: (qmail 95208 invoked by uid 500); 27 Dec 2012 04:05:18 -0000 Mailing-List: contact commits-help@subversion.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@subversion.apache.org Delivered-To: mailing list commits@subversion.apache.org Received: (qmail 95040 invoked by uid 99); 27 Dec 2012 04:05:17 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Dec 2012 04:05:16 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Dec 2012 04:04:54 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5CF0D2388B34; Thu, 27 Dec 2012 04:04:08 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1426116 [6/16] - in /subversion/branches/javahl-ra: ./ build/ build/ac-macros/ build/generator/ build/win32/ contrib/server-side/svncutter/ notes/ subversion/bindings/cxxhl/ subversion/bindings/swig/ subversion/bindings/swig/perl/native/ s... Date: Thu, 27 Dec 2012 04:03:55 -0000 To: commits@subversion.apache.org From: vmpn@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20121227040408.5CF0D2388B34@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Modified: subversion/branches/javahl-ra/subversion/libsvn_repos/fs-wrap.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_repos/fs-wrap.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_repos/fs-wrap.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_repos/fs-wrap.c Thu Dec 27 04:03:49 2012 @@ -743,6 +743,7 @@ svn_error_t * svn_repos_fs_get_inherited_props(apr_array_header_t **inherited_props_p, svn_fs_root_t *root, const char *path, + const char *propname, svn_repos_authz_func_t authz_read_func, void *authz_read_baton, apr_pool_t *result_pool, @@ -757,7 +758,7 @@ svn_repos_fs_get_inherited_props(apr_arr while (!(parent_path[0] == '/' && parent_path[1] == '\0')) { svn_boolean_t allowed = TRUE; - apr_hash_t *parent_properties; + apr_hash_t *parent_properties = NULL; svn_pool_clear(iterpool); parent_path = svn_fspath__dirname(parent_path, scratch_pool); @@ -767,8 +768,25 @@ svn_repos_fs_get_inherited_props(apr_arr authz_read_baton, iterpool)); if (allowed) { - SVN_ERR(svn_fs_node_proplist(&parent_properties, root, - parent_path, result_pool)); + if (propname) + { + svn_string_t *propval; + + SVN_ERR(svn_fs_node_prop(&propval, root, parent_path, propname, + result_pool)); + if (propval) + { + parent_properties = apr_hash_make(result_pool); + apr_hash_set(parent_properties, propname, + APR_HASH_KEY_STRING, propval); + } + } + else + { + SVN_ERR(svn_fs_node_proplist(&parent_properties, root, + parent_path, result_pool)); + } + if (parent_properties && apr_hash_count(parent_properties)) { svn_prop_inherited_item_t *i_props = Modified: subversion/branches/javahl-ra/subversion/libsvn_repos/reporter.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_repos/reporter.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_repos/reporter.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_repos/reporter.c Thu Dec 27 04:03:49 2012 @@ -717,11 +717,13 @@ delta_files(report_baton_t *b, void *fil zero-copy code. */ if (b->zero_copy_limit > 0 && s_path == NULL) { - zero_copy_baton_t baton = { b->zero_copy_limit - , dhandler - , dbaton - , FALSE}; + zero_copy_baton_t baton; svn_boolean_t called = FALSE; + + baton.zero_copy_limit = b->zero_copy_limit; + baton.dhandler = dhandler; + baton.dbaton = dbaton; + baton.zero_copy_succeeded = FALSE; SVN_ERR(svn_fs_try_process_file_contents(&called, b->t_root, t_path, send_zero_copy_delta, Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/auth.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/auth.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/auth.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/auth.c Thu Dec 27 04:03:49 2012 @@ -422,9 +422,9 @@ svn_auth_get_platform_specific_provider( const char *library_label, *library_name; const char *provider_function_name, *version_function_name; library_name = apr_psprintf(pool, - "libsvn_auth_%s-%d.so.0", + "libsvn_auth_%s-%d.so.%d", provider_name, - SVN_VER_MAJOR); + SVN_VER_MAJOR, SVN_SOVERSION); library_label = apr_psprintf(pool, "svn_%s", provider_name); provider_function_name = apr_psprintf(pool, "svn_auth_get_%s_%s_provider", Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/cmdline.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/cmdline.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/cmdline.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/cmdline.c Thu Dec 27 04:03:49 2012 @@ -52,6 +52,9 @@ #include "svn_xml.h" #include "svn_base64.h" #include "svn_config.h" +#include "svn_sorts.h" +#include "svn_props.h" +#include "svn_subst.h" #include "private/svn_cmdline_private.h" #include "private/svn_utf_private.h" @@ -758,3 +761,165 @@ svn_cmdline__apply_config_options(apr_ha return SVN_NO_ERROR; } + +/* Return a copy, allocated in POOL, of the next line of text from *STR + * up to and including a CR and/or an LF. Change *STR to point to the + * remainder of the string after the returned part. If there are no + * characters to be returned, return NULL; never return an empty string. + */ +static const char * +next_line(const char **str, apr_pool_t *pool) +{ + const char *start = *str; + const char *p = *str; + + /* n.b. Throughout this fn, we never read any character after a '\0'. */ + /* Skip over all non-EOL characters, if any. */ + while (*p != '\r' && *p != '\n' && *p != '\0') + p++; + /* Skip over \r\n or \n\r or \r or \n, if any. */ + if (*p == '\r' || *p == '\n') + { + char c = *p++; + + if ((c == '\r' && *p == '\n') || (c == '\n' && *p == '\r')) + p++; + } + + /* Now p points after at most one '\n' and/or '\r'. */ + *str = p; + + if (p == start) + return NULL; + + return svn_string_ncreate(start, p - start, pool)->data; +} + +const char * +svn_cmdline__indent_string(const char *str, + const char *indent, + apr_pool_t *pool) +{ + svn_stringbuf_t *out = svn_stringbuf_create_empty(pool); + const char *line; + + while ((line = next_line(&str, pool))) + { + svn_stringbuf_appendcstr(out, indent); + svn_stringbuf_appendcstr(out, line); + } + return out->data; +} + +svn_error_t * +svn_cmdline__print_prop_hash(svn_stream_t *out, + apr_hash_t *prop_hash, + svn_boolean_t names_only, + apr_pool_t *pool) +{ + apr_array_header_t *sorted_props; + int i; + + sorted_props = svn_sort__hash(prop_hash, svn_sort_compare_items_lexically, + pool); + for (i = 0; i < sorted_props->nelts; i++) + { + svn_sort__item_t item = APR_ARRAY_IDX(sorted_props, i, svn_sort__item_t); + const char *pname = item.key; + svn_string_t *propval = item.value; + const char *pname_stdout; + + if (svn_prop_needs_translation(pname)) + SVN_ERR(svn_subst_detranslate_string(&propval, propval, + TRUE, pool)); + + SVN_ERR(svn_cmdline_cstring_from_utf8(&pname_stdout, pname, pool)); + + if (out) + { + pname_stdout = apr_psprintf(pool, " %s\n", pname_stdout); + SVN_ERR(svn_subst_translate_cstring2(pname_stdout, &pname_stdout, + APR_EOL_STR, /* 'native' eol */ + FALSE, /* no repair */ + NULL, /* no keywords */ + FALSE, /* no expansion */ + pool)); + + SVN_ERR(svn_stream_puts(out, pname_stdout)); + } + else + { + /* ### We leave these printfs for now, since if propval wasn't + translated above, we don't know anything about its encoding. + In fact, it might be binary data... */ + printf(" %s\n", pname_stdout); + } + + if (!names_only) + { + /* Add an extra newline to the value before indenting, so that + * every line of output has the indentation whether the value + * already ended in a newline or not. */ + const char *newval = apr_psprintf(pool, "%s\n", propval->data); + const char *indented_newval = svn_cmdline__indent_string(newval, + " ", + pool); + if (out) + { + SVN_ERR(svn_stream_puts(out, indented_newval)); + } + else + { + printf("%s", indented_newval); + } + } + } + + return SVN_NO_ERROR; +} + +svn_error_t * +svn_cmdline__print_xml_prop_hash(svn_stringbuf_t **outstr, + apr_hash_t *prop_hash, + svn_boolean_t names_only, + svn_boolean_t inherited_props, + apr_pool_t *pool) +{ + apr_array_header_t *sorted_props; + int i; + + if (*outstr == NULL) + *outstr = svn_stringbuf_create_empty(pool); + + sorted_props = svn_sort__hash(prop_hash, svn_sort_compare_items_lexically, + pool); + for (i = 0; i < sorted_props->nelts; i++) + { + svn_sort__item_t item = APR_ARRAY_IDX(sorted_props, i, svn_sort__item_t); + const char *pname = item.key; + svn_string_t *propval = item.value; + + if (names_only) + { + svn_xml_make_open_tag( + outstr, pool, svn_xml_self_closing, + inherited_props ? "inherited_property" : "property", + "name", pname, NULL); + } + else + { + const char *pname_out; + + if (svn_prop_needs_translation(pname)) + SVN_ERR(svn_subst_detranslate_string(&propval, propval, + TRUE, pool)); + + SVN_ERR(svn_cmdline_cstring_from_utf8(&pname_out, pname, pool)); + + svn_cmdline__print_xml_prop(outstr, pname_out, propval, + inherited_props, pool); + } + } + + return SVN_NO_ERROR; +} Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/config_file.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/config_file.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/config_file.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/config_file.c Thu Dec 27 04:03:49 2012 @@ -796,6 +796,9 @@ svn_config_ensure(const char *config_dir "### http-timeout Timeout for HTTP requests in seconds" NL "### http-compression Whether to compress HTTP requests" NL + "### http-max-connections Maximum number of parallel server" NL + "### connections to use for any given" NL + "### HTTP operation." NL "### neon-debug-mask Debug mask for Neon HTTP library" NL "### ssl-authority-files List of files, each of a trusted CA" NL @@ -807,6 +810,9 @@ svn_config_ensure(const char *config_dir "### http-library Which library to use for http/https" NL "### connections." NL + "### http-bulk-updates Whether to request bulk update" NL + "### responses or to fetch each file" NL + "### in an individual request. " NL "### store-passwords Specifies whether passwords used" NL "### to authenticate against a" NL "### Subversion server may be cached" NL @@ -826,8 +832,7 @@ svn_config_ensure(const char *config_dir "### unencrypted (i.e., as plaintext)." NL #endif "### store-auth-creds Specifies whether any auth info" NL - "### (passwords as well as server certs)" - NL + "### (passwords, server certs, etc.)" NL "### may be cached to disk." NL "### username Specifies the default username." NL "###" NL Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/error.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/error.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/error.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/error.c Thu Dec 27 04:03:49 2012 @@ -221,6 +221,8 @@ svn_error_quick_wrap(svn_error_t *child, new_msg); } +/* Messages in tracing errors all point to this static string. */ +static const char error_tracing_link[] = "traced call"; svn_error_t * svn_error__trace(const char *file, long line, svn_error_t *err) @@ -235,8 +237,11 @@ svn_error__trace(const char *file, long /* Only do the work when an error occurs. */ if (err) { + svn_error_t *trace; svn_error__locate(file, line); - return svn_error_quick_wrap(err, SVN_ERR__TRACED); + trace = make_error_internal(err->apr_err, err); + trace->message = error_tracing_link; + return trace; } return SVN_NO_ERROR; @@ -250,7 +255,9 @@ svn_error_compose_create(svn_error_t *er { if (err1 && err2) { - svn_error_compose(err1, err2); + svn_error_compose(err1, + svn_error_quick_wrap(err2, + _("Additional errors:"))); return err1; } return err1 ? err1 : err2; @@ -381,7 +388,7 @@ svn_error__is_tracing_link(svn_error_t * ### we add a boolean field to svn_error_t that's set only for ### these "placeholder error chain" items. Not such a bad idea, ### really... */ - return (err && err->message && !strcmp(err->message, SVN_ERR__TRACED)); + return (err && err->message && !strcmp(err->message, error_tracing_link)); #else return FALSE; #endif Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/named_atomic.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/named_atomic.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/named_atomic.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/named_atomic.c Thu Dec 27 04:03:49 2012 @@ -80,12 +80,12 @@ /* Particle that will be appended to the namespace name to form the * name of the mutex / lock file used for that namespace. */ -#define MUTEX_NAME_SUFFIX "Mutex" +#define MUTEX_NAME_SUFFIX ".mutex" /* Particle that will be appended to the namespace name to form the * name of the shared memory file that backs that namespace. */ -#define SHM_NAME_SUFFIX "Shm" +#define SHM_NAME_SUFFIX ".shm" /* Platform-dependent implementations of our basic atomic operations. * NA_SYNCHRONIZE(op) will ensure that the OP gets executed atomically. @@ -162,9 +162,11 @@ synched_cmpxchg(volatile apr_int64_t *me } #define NA_SYNCHRONIZE(_atomic,op)\ + do{\ SVN_ERR(lock(_atomic->mutex));\ op;\ - SVN_ERR(unlock(_atomic->mutex,SVN_NO_ERROR)); + SVN_ERR(unlock(_atomic->mutex,SVN_NO_ERROR));\ + }while(0) #define NA_SYNCHRONIZE_IS_FAST FALSE @@ -238,6 +240,7 @@ struct svn_atomic_namespace__t /* On most operating systems APR implements file locks per process, not * per file. I.e. the lock file will only sync. among processes but within * a process, we must use a mutex to sync the threads. */ +/* Compare ../libsvn_fs_fs/fs.h:SVN_FS_FS__USE_LOCK_MUTEX */ #if APR_HAS_THREADS && !defined(WIN32) #define USE_THREAD_MUTEX 1 #else @@ -305,7 +308,7 @@ delete_lock_file(void *arg) const char *lock_name = NULL; /* locks have already been cleaned up. Simply close the file */ - apr_file_close(mutex->lock_file); + apr_status_t status = apr_file_close(mutex->lock_file); /* Remove the file from disk. This will fail if there ares still other * users of this lock file, i.e. namespace. */ @@ -313,10 +316,12 @@ delete_lock_file(void *arg) if (lock_name) apr_file_remove(lock_name, mutex->pool); - return 0; + return status; } -/* Validate the ATOMIC parameter, i.e it's address. +/* Validate the ATOMIC parameter, i.e it's address. Correct code will + * never need this but if someone should accidentally to use a NULL or + * incomplete structure, let's catch that here instead of segfaulting. */ static svn_error_t * validate(svn_named_atomic__t *atomic) @@ -413,7 +418,9 @@ svn_atomic_namespace__create(svn_atomic_ APR_OS_DEFAULT, result_pool)); - /* Make sure the last user of our lock file will actually remove it + /* Make sure the last user of our lock file will actually remove it. + * Please note that only the last file handle begin closed will actually + * remove the underlying file (see docstring for apr_file_remove). */ apr_pool_cleanup_register(result_pool, &new_ns->mutex, delete_lock_file, Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/opt.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/opt.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/opt.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/opt.c Thu Dec 27 04:03:49 2012 @@ -34,6 +34,10 @@ #include #include +#ifndef WIN32 +#include +#endif + #include "svn_cmdline.h" #include "svn_version.h" #include "svn_types.h" @@ -1121,6 +1125,17 @@ svn_opt__print_version_info(const char * svn_version_ext_build_host(info))); SVN_ERR(svn_cmdline_printf(pool, "%s\n", svn_version_ext_copyright(info))); +#if !defined(SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE) && !defined(WIN32) + /* FIXME: Checking this config variable is the wrong thing to do, + since it apparently means that the simple auth provider is + disabled, not that plaintext password storage is disabled. + So in either the configure option is misnamed, or its + implementation is too simplistic. */ + SVN_ERR(svn_cmdline_fputs( + _("WARNING: Plaintext password storage is enabled!\n\n"), + stdout, pool)); +#endif /* SVN_DISABLE_PLAINTEXT_PASSWORD_STORAGE && !WIN32 */ + if (footer) { SVN_ERR(svn_cmdline_printf(pool, "%s\n", footer)); Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/properties.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/properties.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/properties.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/properties.c Thu Dec 27 04:03:49 2012 @@ -33,6 +33,90 @@ #include "svn_ctype.h" +/* All Subversion-specific versioned node properties + * known to this client, that are applicable to both a file and a dir. + */ +#define SVN_PROP__NODE_COMMON_PROPS SVN_PROP_MERGEINFO, \ + SVN_PROP_TEXT_TIME, \ + SVN_PROP_OWNER, \ + SVN_PROP_GROUP, \ + SVN_PROP_UNIX_MODE, + +/* All Subversion-specific versioned node properties + * known to this client, that are applicable to a dir only. + */ +#define SVN_PROP__NODE_DIR_ONLY_PROPS SVN_PROP_IGNORE, \ + SVN_PROP_INHERITABLE_IGNORES, \ + SVN_PROP_INHERITABLE_AUTO_PROPS, \ + SVN_PROP_EXTERNALS, + +/* All Subversion-specific versioned node properties + * known to this client, that are applicable to a file only. + */ +#define SVN_PROP__NODE_FILE_ONLY_PROPS SVN_PROP_MIME_TYPE, \ + SVN_PROP_EOL_STYLE, \ + SVN_PROP_KEYWORDS, \ + SVN_PROP_EXECUTABLE, \ + SVN_PROP_NEEDS_LOCK, \ + SVN_PROP_SPECIAL, + +static const char *const known_rev_props[] + = { SVN_PROP_REVISION_ALL_PROPS + NULL }; + +static const char *const known_node_props[] + = { SVN_PROP__NODE_COMMON_PROPS + SVN_PROP__NODE_DIR_ONLY_PROPS + SVN_PROP__NODE_FILE_ONLY_PROPS + NULL }; + +static const char *const known_dir_props[] + = { SVN_PROP__NODE_COMMON_PROPS + SVN_PROP__NODE_DIR_ONLY_PROPS + NULL }; + +static const char *const known_file_props[] + = { SVN_PROP__NODE_COMMON_PROPS + SVN_PROP__NODE_FILE_ONLY_PROPS + NULL }; + +static svn_boolean_t +is_known_prop(const char *prop_name, + const char *const *known_props) +{ + while (*known_props) + { + if (strcmp(prop_name, *known_props++) == 0) + return TRUE; + } + return FALSE; +} + +svn_boolean_t +svn_prop_is_known_svn_rev_prop(const char *prop_name) +{ + return is_known_prop(prop_name, known_rev_props); +} + +svn_boolean_t +svn_prop_is_known_svn_node_prop(const char *prop_name) +{ + return is_known_prop(prop_name, known_node_props); +} + +svn_boolean_t +svn_prop_is_known_svn_file_prop(const char *prop_name) +{ + return is_known_prop(prop_name, known_file_props); +} + +svn_boolean_t +svn_prop_is_known_svn_dir_prop(const char *prop_name) +{ + return is_known_prop(prop_name, known_dir_props); +} + + svn_boolean_t svn_prop_is_svn_prop(const char *prop_name) { Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/skel.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/skel.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/skel.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/skel.c Thu Dec 27 04:03:49 2012 @@ -784,7 +784,7 @@ svn_skel__parse_prop(svn_string_t **prop svn_error_t * svn_skel__unparse_proplist(svn_skel_t **skel_p, - apr_hash_t *proplist, + const apr_hash_t *proplist, apr_pool_t *pool) { svn_skel_t *skel = svn_skel__make_empty_list(pool); @@ -794,7 +794,8 @@ svn_skel__unparse_proplist(svn_skel_t ** if (proplist) { /* Loop over hash entries */ - for (hi = apr_hash_first(pool, proplist); hi; hi = apr_hash_next(hi)) + for (hi = apr_hash_first(pool, (apr_hash_t *)proplist); hi; + hi = apr_hash_next(hi)) { const void *key; void *val; Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/sqlite.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/sqlite.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/sqlite.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/sqlite.c Thu Dec 27 04:03:49 2012 @@ -43,14 +43,17 @@ #endif #ifdef SVN_SQLITE_INLINE -/* Include sqlite3 inline, making all symbols private. */ - #define SQLITE_API static - #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) - #pragma GCC diagnostic ignored "-Wunused-function" - #endif - #include +/* Import the sqlite3 API vtable from sqlite3wrapper.c */ +# define SQLITE_OMIT_DEPRECATED +# include +extern const sqlite3_api_routines *const svn_sqlite3__api_funcs; +extern int (*const svn_sqlite3__api_initialize)(void); +extern int (*const svn_sqlite3__api_config)(int, ...); +# define sqlite3_api svn_sqlite3__api_funcs +# define sqlite3_initialize svn_sqlite3__api_initialize +# define sqlite3_config svn_sqlite3__api_config #else - #include +# include #endif #if !SQLITE_VERSION_AT_LEAST(3,7,12) @@ -168,7 +171,7 @@ exec_sql2(svn_sqlite__db_t *db, const ch if (sqlite_err != SQLITE_OK && sqlite_err != ignored_err) { svn_error_t *err = svn_error_createf(SQLITE_ERROR_CODE(sqlite_err), NULL, - _("%s, executing statement '%s'"), + _("sqlite: %s, executing statement '%s'"), err_msg, sql); sqlite3_free(err_msg); return err; @@ -256,8 +259,8 @@ step_with_expectation(svn_sqlite__stmt_t return svn_error_create(SVN_ERR_SQLITE_ERROR, svn_sqlite__reset(stmt), expecting_row - ? _("Expected database row missing") - : _("Extra database row found")); + ? _("sqlite: Expected database row missing") + : _("sqlite: Extra database row found")); return SVN_NO_ERROR; } @@ -469,8 +472,7 @@ svn_sqlite__bind_properties(svn_sqlite__ if (props == NULL) return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, NULL, 0)); - SVN_ERR(svn_skel__unparse_proplist(&skel, (apr_hash_t *)props, - scratch_pool)); + SVN_ERR(svn_skel__unparse_proplist(&skel, props, scratch_pool)); properties = svn_skel__unparse(skel, scratch_pool); return svn_error_trace(svn_sqlite__bind_blob(stmt, slot, @@ -579,6 +581,21 @@ svn_sqlite__column_token(svn_sqlite__stm return svn_token__from_word_strict(map, word); } +int +svn_sqlite__column_token_null(svn_sqlite__stmt_t *stmt, + int column, + const svn_token_map_t *map, + int null_val) +{ + /* cast from 'unsigned char' to regular 'char' */ + const char *word = (const char *)sqlite3_column_text(stmt->s3stmt, column); + + if (!word) + return null_val; + + return svn_token__from_word_strict(map, word); +} + svn_error_t * svn_sqlite__column_properties(apr_hash_t **props, svn_sqlite__stmt_t *stmt, Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/string.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/string.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/string.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/string.c Thu Dec 27 04:03:49 2012 @@ -37,30 +37,108 @@ #include "svn_private_config.h" -/* Our own realloc, since APR doesn't have one. Note: this is a - generic realloc for memory pools, *not* for strings. */ -static void * -my__realloc(char *data, apr_size_t oldsize, apr_size_t request, - apr_pool_t *pool) -{ - void *new_area; - - /* kff todo: it's a pity APR doesn't give us this -- sometimes it - could realloc the block merely by extending in place, sparing us - a memcpy(), but only the pool would know enough to be able to do - this. We should add a realloc() to APR if someone hasn't - already. */ - - /* malloc new area */ - new_area = apr_palloc(pool, request); - /* copy data to new area */ - memcpy(new_area, data, oldsize); +/* Allocate the space for a memory buffer from POOL. + * Return a pointer to the new buffer in *DATA and its size in *SIZE. + * The buffer size will be at least MINIMUM_SIZE. + * + * N.B.: The stringbuf creation functions use this, but since stringbufs + * always consume at least 1 byte for the NUL terminator, the + * resulting data pointers will never be NULL. + */ +static APR_INLINE void +membuf_create(void **data, apr_size_t *size, + apr_size_t minimum_size, apr_pool_t *pool) +{ + /* apr_palloc will allocate multiples of 8. + * Thus, we would waste some of that memory if we stuck to the + * smaller size. Note that this is safe even if apr_palloc would + * use some other aligment or none at all. */ + minimum_size = APR_ALIGN_DEFAULT(minimum_size); + *data = (!minimum_size ? NULL : apr_palloc(pool, minimum_size)); + *size = minimum_size; +} + +/* Ensure that the size of a given memory buffer is at least MINIMUM_SIZE + * bytes. If *SIZE is already greater than or equal to MINIMUM_SIZE, + * this function does nothing. + * + * If *SIZE is 0, the allocated buffer size will be MINIMUM_SIZE + * rounded up to the nearest APR alignment boundary. Otherwse, *SIZE + * will be multiplied by a power of two such that the result is + * greater or equal to MINIMUM_SIZE. The pointer to the new buffer + * will be returned in *DATA, and its size in *SIZE. + */ +static APR_INLINE void +membuf_ensure(void **data, apr_size_t *size, + apr_size_t minimum_size, apr_pool_t *pool) +{ + if (minimum_size > *size) + { + apr_size_t new_size = *size; + + if (new_size == 0) + /* APR will increase odd allocation sizes to the next + * multiple for 8, for instance. Take advantage of that + * knowledge and allow for the extra size to be used. */ + new_size = minimum_size; + else + while (new_size < minimum_size) + { + /* new_size is aligned; doubling it should keep it aligned */ + const apr_size_t prev_size = new_size; + new_size *= 2; + + /* check for apr_size_t overflow */ + if (prev_size > new_size) + { + new_size = minimum_size; + break; + } + } - /* I'm NOT freeing old area here -- cuz we're using pools, ugh. */ + membuf_create(data, size, new_size, pool); + } +} - /* return new area */ - return new_area; +void +svn_membuf__create(svn_membuf_t *membuf, apr_size_t size, apr_pool_t *pool) +{ + membuf_create(&membuf->data, &membuf->size, size, pool); + membuf->pool = pool; +} + +void +svn_membuf__ensure(svn_membuf_t *membuf, apr_size_t size) +{ + membuf_ensure(&membuf->data, &membuf->size, size, membuf->pool); +} + +void +svn_membuf__resize(svn_membuf_t *membuf, apr_size_t size) +{ + const void *const old_data = membuf->data; + const apr_size_t old_size = membuf->size; + + membuf_ensure(&membuf->data, &membuf->size, size, membuf->pool); + if (membuf->data && old_data && old_data != membuf->data) + memcpy(membuf->data, old_data, old_size); +} + +/* Always provide an out-of-line implementation of svn_membuf__zero */ +#undef svn_membuf__zero +void +svn_membuf__zero(svn_membuf_t *membuf) +{ + SVN_MEMBUF__ZERO(membuf); +} + +/* Always provide an out-of-line implementation of svn_membuf__nzero */ +#undef svn_membuf__nzero +void +svn_membuf__nzero(svn_membuf_t *membuf, apr_size_t size) +{ + SVN_MEMBUF__NZERO(membuf, size); } static APR_INLINE svn_boolean_t @@ -283,28 +361,6 @@ svn_stringbuf__morph_into_string(svn_str /* svn_stringbuf functions */ -/* Create a stringbuf referring to (not copying) an existing block of memory - * at DATA, of which SIZE bytes are the user data and BLOCKSIZE bytes are - * allocated in total. DATA[SIZE] must be a zero byte. */ -static svn_stringbuf_t * -create_stringbuf(char *data, apr_size_t size, apr_size_t blocksize, - apr_pool_t *pool) -{ - svn_stringbuf_t *new_string; - - new_string = apr_palloc(pool, sizeof(*new_string)); - - SVN_ERR_ASSERT_NO_RETURN(size < blocksize); - SVN_ERR_ASSERT_NO_RETURN(data[size] == '\0'); - - new_string->data = data; - new_string->len = size; - new_string->blocksize = blocksize; - new_string->pool = pool; - - return new_string; -} - svn_stringbuf_t * svn_stringbuf_create_empty(apr_pool_t *pool) { @@ -317,24 +373,17 @@ svn_stringbuf_create_ensure(apr_size_t b void *mem; svn_stringbuf_t *new_string; - /* apr_palloc will allocate multiples of 8. - * Thus, we would waste some of that memory if we stuck to the - * smaller size. Note that this is safe even if apr_palloc would - * use some other aligment or none at all. */ - ++blocksize; /* + space for '\0' */ - blocksize = APR_ALIGN_DEFAULT(blocksize); /* Allocate memory for svn_string_t and data in one chunk. */ - mem = apr_palloc(pool, sizeof(*new_string) + blocksize); + membuf_create(&mem, &blocksize, blocksize + sizeof(*new_string), pool); /* Initialize header and string */ new_string = mem; - new_string->data = (char*)mem + sizeof(*new_string); new_string->data[0] = '\0'; new_string->len = 0; - new_string->blocksize = blocksize; + new_string->blocksize = blocksize - sizeof(*new_string); new_string->pool = pool; return new_string; @@ -375,9 +424,15 @@ svn_stringbuf_createv(apr_pool_t *pool, { char *data = apr_pvsprintf(pool, fmt, ap); apr_size_t size = strlen(data); + svn_stringbuf_t *new_string; + + new_string = apr_palloc(pool, sizeof(*new_string)); + new_string->data = data; + new_string->len = size; + new_string->blocksize = size + 1; + new_string->pool = pool; - /* wrap an svn_stringbuf_t around the new data */ - return create_stringbuf(data, size, size + 1, pool); + return new_string; } @@ -444,38 +499,15 @@ svn_stringbuf_isempty(const svn_stringbu void svn_stringbuf_ensure(svn_stringbuf_t *str, apr_size_t minimum_size) { + void *mem = NULL; ++minimum_size; /* + space for '\0' */ - /* Keep doubling capacity until have enough. */ - if (str->blocksize < minimum_size) + membuf_ensure(&mem, &str->blocksize, minimum_size, str->pool); + if (mem && mem != str->data) { - if (str->blocksize == 0) - /* APR will increase odd allocation sizes to the next - * multiple for 8, for instance. Take advantage of that - * knowledge and allow for the extra size to be used. */ - str->blocksize = APR_ALIGN_DEFAULT(minimum_size); - else - while (str->blocksize < minimum_size) - { - /* str->blocksize is aligned; - * doubling it should keep it aligned */ - apr_size_t prev_size = str->blocksize; - str->blocksize *= 2; - - /* check for apr_size_t overflow */ - if (prev_size > str->blocksize) - { - str->blocksize = minimum_size; - break; - } - } - - str->data = (char *) my__realloc(str->data, - str->len + 1, - /* We need to maintain (and thus copy) - the trailing nul */ - str->blocksize, - str->pool); + if (str->data) + memcpy(mem, str->data, str->len + 1); + str->data = mem; } } @@ -1134,3 +1166,108 @@ svn__i64toa_sep(apr_int64_t number, char return apr_pstrdup(pool, buffer); } +unsigned int +svn_cstring__similarity(const char *stra, const char *strb, + svn_membuf_t *buffer, apr_size_t *rlcs) +{ + svn_string_t stringa, stringb; + stringa.data = stra; + stringa.len = strlen(stra); + stringb.data = strb; + stringb.len = strlen(strb); + return svn_string__similarity(&stringa, &stringb, buffer, rlcs); +} + +unsigned int +svn_string__similarity(const svn_string_t *stringa, + const svn_string_t *stringb, + svn_membuf_t *buffer, apr_size_t *rlcs) +{ + const char *stra = stringa->data; + const char *strb = stringb->data; + const apr_size_t lena = stringa->len; + const apr_size_t lenb = stringb->len; + const apr_size_t total = lena + lenb; + const char *enda = stra + lena; + const char *endb = strb + lenb; + apr_size_t lcs = 0; + + /* Skip the common prefix ... */ + while (stra < enda && strb < endb && *stra == *strb) + { + ++stra; ++strb; + ++lcs; + } + + /* ... and the common suffix */ + while (stra < enda && strb < endb) + { + --enda; --endb; + if (*enda != *endb) + { + ++enda; ++endb; + break; + } + + ++lcs; + } + + if (stra < enda && strb < endb) + { + const apr_size_t resta = enda - stra; + const apr_size_t restb = endb - strb; + const apr_size_t slots = (resta > restb ? restb : resta); + apr_size_t *curr, *prev; + const char *pstr; + + /* The outer loop must iterate on the longer string. */ + if (resta < restb) + { + pstr = stra; + stra = strb; + strb = pstr; + + pstr = enda; + enda = endb; + endb = pstr; + } + + /* Allocate two columns in the LCS matrix + ### Optimize this to (slots + 2) instesd of 2 * (slots + 1) */ + svn_membuf__ensure(buffer, 2 * (slots + 1) * sizeof(apr_size_t)); + svn_membuf__nzero(buffer, (slots + 2) * sizeof(apr_size_t)); + prev = buffer->data; + curr = prev + slots + 1; + + /* Calculate LCS length of the remainder */ + for (pstr = stra; pstr < enda; ++pstr) + { + int i; + for (i = 1; i <= slots; ++i) + { + if (*pstr == strb[i-1]) + curr[i] = prev[i-1] + 1; + else + curr[i] = (curr[i-1] > prev[i] ? curr[i-1] : prev[i]); + } + + /* Swap the buffers, making the previous one current */ + { + apr_size_t *const temp = prev; + prev = curr; + curr = temp; + } + } + + lcs += prev[slots]; + } + + if (rlcs) + *rlcs = lcs; + + /* Return similarity ratio rounded to 4 significant digits */ + if (total) + return(unsigned int)((2000 * lcs + total/2) / total); + else + return 1000; +} Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/sysinfo.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/sysinfo.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/sysinfo.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/sysinfo.c Thu Dec 27 04:03:49 2012 @@ -133,10 +133,14 @@ svn_sysinfo__linked_libs(apr_pool_t *poo lib->compiled_version = APR_VERSION_STRING; lib->runtime_version = apr_pstrdup(pool, apr_version_string()); +/* Don't list APR-Util if it isn't linked in, which it may not be if + * we're using APR 2.x+ which combined APR-Util into APR. */ +#ifdef APU_VERSION_STRING lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t); lib->name = "APR-Util"; lib->compiled_version = APU_VERSION_STRING; lib->runtime_version = apr_pstrdup(pool, apu_version_string()); +#endif lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t); lib->name = "SQLite"; Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/temp_serializer.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/temp_serializer.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/temp_serializer.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/temp_serializer.c Thu Dec 27 04:03:49 2012 @@ -86,11 +86,11 @@ align_buffer_end(svn_temp_serializer__co { apr_size_t current_len = context->buffer->len; apr_size_t aligned_len = APR_ALIGN_DEFAULT(current_len); - if (aligned_len != current_len) - { - svn_stringbuf_ensure(context->buffer, aligned_len); - context->buffer->len = aligned_len; - } + + if (aligned_len + 1 > context->buffer->blocksize) + svn_stringbuf_ensure(context->buffer, aligned_len); + + context->buffer->len = aligned_len; } /* Begin the serialization process for the SOURCE_STRUCT and all objects Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crashrpt.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crashrpt.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crashrpt.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crashrpt.c Thu Dec 27 04:03:49 2012 @@ -21,6 +21,9 @@ * ==================================================================== */ +/* prevent "empty compilation unit" warning on e.g. UNIX */ +typedef int win32_crashrpt__dummy; + #ifdef WIN32 #ifdef SVN_USE_WIN32_CRASHHANDLER Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crypto.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crypto.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crypto.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/win32_crypto.c Thu Dec 27 04:03:49 2012 @@ -21,6 +21,9 @@ * ==================================================================== */ +/* prevent "empty compilation unit" warning on e.g. UNIX */ +typedef int win32_crypto__dummy; + /* ==================================================================== */ #if defined(WIN32) && !defined(__MINGW32__) Modified: subversion/branches/javahl-ra/subversion/libsvn_subr/win32_xlate.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_subr/win32_xlate.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_subr/win32_xlate.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_subr/win32_xlate.c Thu Dec 27 04:03:49 2012 @@ -21,6 +21,9 @@ * ==================================================================== */ +/* prevent "empty compilation unit" warning on e.g. UNIX */ +typedef int win32_xlate__dummy; + #ifdef WIN32 /* Define _WIN32_DCOM for CoInitializeEx(). */ Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/adm_crawler.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/adm_crawler.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/adm_crawler.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/adm_crawler.c Thu Dec 27 04:03:49 2012 @@ -659,7 +659,7 @@ svn_wc_crawl_revisions5(svn_wc_context_t &repos_relpath, &repos_root_url, NULL, NULL, NULL, NULL, &target_depth, NULL, NULL, &target_lock, - NULL, NULL, + NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool); @@ -807,7 +807,7 @@ svn_wc_crawl_revisions5(svn_wc_context_t err = svn_wc__db_base_get_info(&parent_status, NULL, NULL, &parent_repos_relpath, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, + NULL, NULL, NULL, db, parent_abspath, scratch_pool, scratch_pool); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/adm_files.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/adm_files.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/adm_files.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/adm_files.c Thu Dec 27 04:03:49 2012 @@ -175,7 +175,7 @@ svn_wc__text_base_path_to_read(const cha const svn_checksum_t *checksum; SVN_ERR(svn_wc__db_read_pristine_info(&status, &kind, NULL, NULL, NULL, NULL, - &checksum, NULL, NULL, + &checksum, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); @@ -231,7 +231,7 @@ svn_wc__get_pristine_contents(svn_stream *size = SVN_INVALID_FILESIZE; SVN_ERR(svn_wc__db_read_pristine_info(&status, &kind, NULL, NULL, NULL, NULL, - &sha1_checksum, NULL, NULL, + &sha1_checksum, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/adm_ops.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/adm_ops.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/adm_ops.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/adm_ops.c Thu Dec 27 04:03:49 2012 @@ -903,8 +903,6 @@ static svn_error_t * add_from_disk(svn_wc__db_t *db, const char *local_abspath, svn_node_kind_t kind, - svn_wc_notify_func2_t notify_func, - void *notify_baton, apr_pool_t *scratch_pool) { if (kind == svn_node_file) @@ -1275,7 +1273,7 @@ svn_wc_add4(svn_wc_context_t *wc_ctx, if (!copyfrom_url) /* Case 2a: It's a simple add */ { - SVN_ERR(add_from_disk(db, local_abspath, kind, notify_func, notify_baton, + SVN_ERR(add_from_disk(db, local_abspath, kind, scratch_pool)); if (kind == svn_node_dir && !db_row_exists) { @@ -1361,7 +1359,6 @@ svn_wc_add_from_disk(svn_wc_context_t *w SVN_ERR(check_can_add_to_parent(NULL, NULL, wc_ctx->db, local_abspath, scratch_pool, scratch_pool)); SVN_ERR(add_from_disk(wc_ctx->db, local_abspath, kind, - notify_func, notify_baton, scratch_pool)); /* Report the addition to the caller. */ @@ -1600,7 +1597,7 @@ revert_restore(svn_wc__db_t *db, svn_boolean_t notify_required; const apr_array_header_t *conflict_files; svn_filesize_t recorded_size; - apr_time_t recorded_mod_time; + apr_time_t recorded_time; apr_finfo_t finfo; #ifdef HAVE_SYMLINK svn_boolean_t special; @@ -1620,7 +1617,7 @@ revert_restore(svn_wc__db_t *db, err = svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - &recorded_size, &recorded_mod_time, NULL, + &recorded_size, &recorded_time, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool); @@ -1651,7 +1648,7 @@ revert_restore(svn_wc__db_t *db, status = svn_wc__db_status_normal; kind = svn_kind_unknown; recorded_size = SVN_INVALID_FILESIZE; - recorded_mod_time = 0; + recorded_time = 0; } } else if (err) @@ -1774,9 +1771,9 @@ revert_restore(svn_wc__db_t *db, ourselves. And we already have everything we need, because we called stat ourselves. */ if (recorded_size != SVN_INVALID_FILESIZE - && recorded_mod_time != 0 + && recorded_time != 0 && recorded_size == finfo.size - && recorded_mod_time == finfo.mtime) + && recorded_time == finfo.mtime) { modified = FALSE; } @@ -2330,6 +2327,11 @@ svn_wc__internal_remove_from_revision_co SVN_ERR(svn_wc__db_is_wcroot(&is_root, db, local_abspath, scratch_pool)); + SVN_ERR(svn_wc__write_check(db, is_root ? local_abspath + : svn_dirent_dirname(local_abspath, + scratch_pool), + scratch_pool)); + SVN_ERR(svn_wc__db_op_remove_node(&left_something, db, local_abspath, destroy_wf /* destroy_wc */, @@ -2441,9 +2443,19 @@ svn_wc_add_lock2(svn_wc_context_t *wc_ct } /* if svn:needs-lock is present, then make the file read-write. */ - SVN_ERR(svn_wc__internal_propget(&needs_lock, wc_ctx->db, local_abspath, - SVN_PROP_NEEDS_LOCK, scratch_pool, - scratch_pool)); + err = svn_wc__internal_propget(&needs_lock, wc_ctx->db, local_abspath, + SVN_PROP_NEEDS_LOCK, scratch_pool, + scratch_pool); + + if (err && err->apr_err == SVN_ERR_WC_PATH_UNEXPECTED_STATUS) + { + /* The node has non wc representation (e.g. deleted), so + we don't want to touch the in-wc file */ + svn_error_clear(err); + return SVN_NO_ERROR; + } + SVN_ERR(err); + if (needs_lock) SVN_ERR(svn_io_set_file_read_write(local_abspath, FALSE, scratch_pool)); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/ambient_depth_filter_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/ambient_depth_filter_editor.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/ambient_depth_filter_editor.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/ambient_depth_filter_editor.c Thu Dec 27 04:03:49 2012 @@ -132,7 +132,7 @@ ambient_read_info(svn_wc__db_status_t *s err = svn_wc__db_base_get_info(status, kind, NULL, NULL, NULL, NULL, NULL, NULL, NULL, depth, NULL, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/cleanup.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/cleanup.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/cleanup.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/cleanup.c Thu Dec 27 04:03:49 2012 @@ -217,6 +217,8 @@ svn_wc_cleanup3(svn_wc_context_t *wc_ctx SVN_ERR(svn_wc__db_base_clear_dav_cache_recursive(db, local_abspath, scratch_pool)); + SVN_ERR(svn_wc__db_vacuum(db, local_abspath, scratch_pool)); + /* We're done with this DB, so proactively close it. */ SVN_ERR(svn_wc__db_close(db)); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.c Thu Dec 27 04:03:49 2012 @@ -409,10 +409,10 @@ svn_wc__conflict_skel_add_prop_conflict( svn_wc__db_t *db, const char *wri_abspath, const char *marker_abspath, - apr_hash_t *mine_props, - apr_hash_t *their_old_props, - apr_hash_t *their_props, - apr_hash_t *conflicted_prop_names, + const apr_hash_t *mine_props, + const apr_hash_t *their_old_props, + const apr_hash_t *their_props, + const apr_hash_t *conflicted_prop_names, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { @@ -464,7 +464,7 @@ svn_wc__conflict_skel_add_prop_conflict( svn_skel__prepend_str("", prop_conflict, result_pool); /* No old_props */ conflict_names = svn_skel__make_empty_list(result_pool); - for (hi = apr_hash_first(scratch_pool, conflicted_prop_names); + for (hi = apr_hash_first(scratch_pool, (apr_hash_t *)conflicted_prop_names); hi; hi = apr_hash_next(hi)) { @@ -1804,7 +1804,7 @@ setup_tree_conflict_desc(svn_wc_conflict err = svn_wc__db_base_get_info(&status, &kind, &revision, &repos_relpath, &repos_root_url, &repos_uuid, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool); @@ -2648,7 +2648,8 @@ conflict_status_walker(void *baton, { if (my_choice == svn_wc_conflict_choose_mine_conflict) SVN_ERR(svn_wc__db_update_moved_away_conflict_victim( - &work_items, local_abspath, cswb->db, + &work_items, + cswb->db, local_abspath, cswb->notify_func, cswb->notify_baton, cswb->cancel_func, cswb->cancel_baton, scratch_pool, scratch_pool)); @@ -2864,3 +2865,19 @@ svn_wc_resolved_conflict5(svn_wc_context notify_func, notify_baton, scratch_pool)); } + +/* Constructor for the result-structure returned by conflict callbacks. */ +svn_wc_conflict_result_t * +svn_wc_create_conflict_result(svn_wc_conflict_choice_t choice, + const char *merged_file, + apr_pool_t *pool) +{ + svn_wc_conflict_result_t *result = apr_pcalloc(pool, sizeof(*result)); + result->choice = choice; + result->merged_file = merged_file; + result->save_merged = FALSE; + + /* If we add more fields to svn_wc_conflict_result_t, add them here. */ + + return result; +} Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.h URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.h?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.h (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/conflicts.h Thu Dec 27 04:03:49 2012 @@ -182,10 +182,10 @@ svn_wc__conflict_skel_add_prop_conflict( svn_wc__db_t *db, const char *wri_abspath, const char *marker_abspath, - apr_hash_t *mine_props, - apr_hash_t *their_old_props, - apr_hash_t *their_props, - apr_hash_t *conflicted_prop_names, + const apr_hash_t *mine_props, + const apr_hash_t *their_old_props, + const apr_hash_t *their_props, + const apr_hash_t *conflicted_prop_names, apr_pool_t *result_pool, apr_pool_t *scratch_pool); @@ -261,6 +261,8 @@ svn_wc__conflict_skel_resolve(svn_boolea * Output arguments can be NULL if the value is not necessary. * * ### stsp asks: what is LOCATIONS? + * ### Set *LOCATIONS to an array of (svn_wc_conflict_version_t *) + * representing ... * * TEXT_, PROP_ and TREE_CONFLICTED (when not NULL) will be set to TRUE * when the conflict contains the specified kind of conflict, otherwise Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/copy.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/copy.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/copy.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/copy.c Thu Dec 27 04:03:49 2012 @@ -807,6 +807,11 @@ svn_wc_copy3(svn_wc_context_t *wc_ctx, void *notify_baton, apr_pool_t *scratch_pool) { + /* Verify that we have the required write lock. */ + SVN_ERR(svn_wc__write_check(wc_ctx->db, + svn_dirent_dirname(dst_abspath, scratch_pool), + scratch_pool)); + return svn_error_trace(copy_or_move(wc_ctx, src_abspath, dst_abspath, metadata_only, FALSE /* is_move */, TRUE /* allow_mixed_revisions */, @@ -943,6 +948,14 @@ svn_wc__move2(svn_wc_context_t *wc_ctx, { svn_wc__db_t *db = wc_ctx->db; + /* Verify that we have the required write locks. */ + SVN_ERR(svn_wc__write_check(wc_ctx->db, + svn_dirent_dirname(src_abspath, scratch_pool), + scratch_pool)); + SVN_ERR(svn_wc__write_check(wc_ctx->db, + svn_dirent_dirname(dst_abspath, scratch_pool), + scratch_pool)); + SVN_ERR(copy_or_move(wc_ctx, src_abspath, dst_abspath, TRUE /* metadata_only */, TRUE /* is_move */, Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/crop.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/crop.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/crop.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/crop.c Thu Dec 27 04:03:49 2012 @@ -196,8 +196,8 @@ svn_wc_exclude(svn_wc_context_t *wc_ctx, svn_revnum_t revision; const char *repos_relpath, *repos_root, *repos_uuid; - SVN_ERR(svn_wc__check_wc_root(&is_root, NULL, &is_switched, - wc_ctx->db, local_abspath, scratch_pool)); + SVN_ERR(svn_wc__db_is_switched(&is_root, &is_switched, NULL, + wc_ctx->db, local_abspath, scratch_pool)); if (is_root) { Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/deprecated.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/deprecated.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/deprecated.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/deprecated.c Thu Dec 27 04:03:49 2012 @@ -2471,27 +2471,36 @@ svn_wc_merge_props2(svn_wc_notify_state_ { const char *local_abspath; svn_error_t *err; + svn_wc_context_t *wc_ctx; struct conflict_func_1to2_baton conflict_wrapper; + if (base_merge && !dry_run) + return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, + U_("base_merge=TRUE is no longer supported; " + "see notes/api-errata/1.7/wc006.txt")); + SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, scratch_pool)); conflict_wrapper.inner_func = conflict_func; conflict_wrapper.inner_baton = conflict_baton; - err = svn_wc__perform_props_merge(state, - svn_wc__adm_get_db(adm_access), - local_abspath, - NULL /* left_version */, - NULL /* right_version */, - baseprops, - propchanges, - base_merge, - dry_run, - conflict_func ? conflict_func_1to2_wrapper - : NULL, - &conflict_wrapper, - NULL, NULL, - scratch_pool); + SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL, + svn_wc__adm_get_db(adm_access), + scratch_pool)); + + err = svn_wc_merge_props3(state, + wc_ctx, + local_abspath, + NULL /* left_version */, + NULL /* right_version */, + baseprops, + propchanges, + dry_run, + conflict_func ? conflict_func_1to2_wrapper + : NULL, + &conflict_wrapper, + NULL, NULL, + scratch_pool); if (err) switch(err->apr_err) @@ -2501,7 +2510,9 @@ svn_wc_merge_props2(svn_wc_notify_state_ err->apr_err = SVN_ERR_UNVERSIONED_RESOURCE; break; } - return svn_error_trace(err); + return svn_error_trace( + svn_error_compose_create(err, + svn_wc_context_destroy(wc_ctx))); } svn_error_t * @@ -3196,6 +3207,38 @@ svn_wc_get_actual_target(const char *pat return svn_error_trace(svn_wc_context_destroy(wc_ctx)); } +/* This function has no internal variant as its behavior on switched + non-directories is not what you would expect. But this happens to + be the legacy behavior of this function. */ +svn_error_t * +svn_wc_is_wc_root2(svn_boolean_t *wc_root, + svn_wc_context_t *wc_ctx, + const char *local_abspath, + apr_pool_t *scratch_pool) +{ + svn_boolean_t is_root; + svn_boolean_t is_switched; + svn_kind_t kind; + svn_error_t *err; + SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath)); + + err = svn_wc__db_is_switched(&is_root, &is_switched, &kind, + wc_ctx->db, local_abspath, scratch_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); + + return svn_error_create(SVN_ERR_ENTRY_NOT_FOUND, err, err->message); + } + + *wc_root = is_root || (kind == svn_kind_dir && is_switched); + + return SVN_NO_ERROR; +} + svn_error_t * svn_wc_is_wc_root(svn_boolean_t *wc_root, const char *path, Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/diff_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/diff_editor.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/diff_editor.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/diff_editor.c Thu Dec 27 04:03:49 2012 @@ -170,7 +170,7 @@ get_pristine_file(const char **result_ab if (!use_base) { SVN_ERR(svn_wc__db_read_pristine_info(NULL, NULL, NULL, NULL, NULL, NULL, - &checksum, NULL, NULL, + &checksum, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); } @@ -178,7 +178,7 @@ get_pristine_file(const char **result_ab { SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &checksum, - NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); } @@ -557,7 +557,7 @@ file_diff(struct edit_baton *eb, if (have_base) SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &revert_base_revnum, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); @@ -610,8 +610,8 @@ file_diff(struct edit_baton *eb, apr_hash_t *baseprops; /* Get svn:mime-type from pristine props (in BASE or WORKING) of PATH. */ - SVN_ERR(svn_wc__get_pristine_props(&baseprops, db, local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&baseprops, db, local_abspath, + scratch_pool, scratch_pool)); if (baseprops) base_mimetype = get_prop_mimetype(baseprops); else @@ -731,8 +731,8 @@ file_diff(struct edit_baton *eb, || status == svn_wc__db_status_copied || status == svn_wc__db_status_moved_here); - SVN_ERR(svn_wc__get_pristine_props(&baseprops, db, local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&baseprops, db, local_abspath, + scratch_pool, scratch_pool)); /* baseprops will be NULL for added nodes */ if (!baseprops) @@ -984,8 +984,8 @@ report_wc_file_as_added(struct edit_bato emptyprops = apr_hash_make(scratch_pool); if (eb->use_text_base) - SVN_ERR(svn_wc__get_pristine_props(&wcprops, db, local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&wcprops, db, local_abspath, + scratch_pool, scratch_pool)); else SVN_ERR(svn_wc__get_actual_props(&wcprops, db, local_abspath, scratch_pool, scratch_pool)); @@ -996,16 +996,21 @@ report_wc_file_as_added(struct edit_bato if (eb->use_text_base) - SVN_ERR(get_pristine_file(&source_file, db, local_abspath, - FALSE, scratch_pool, scratch_pool)); + { + SVN_ERR(get_pristine_file(&source_file, db, local_abspath, + FALSE, scratch_pool, scratch_pool)); + translated_file = source_file; /* No translation needed */ + } else - source_file = local_abspath; + { + source_file = local_abspath; - SVN_ERR(svn_wc__internal_translated_file( + SVN_ERR(svn_wc__internal_translated_file( &translated_file, source_file, db, local_abspath, SVN_WC_TRANSLATE_TO_NF | SVN_WC_TRANSLATE_USE_GLOBAL_TMP, eb->cancel_func, eb->cancel_baton, scratch_pool, scratch_pool)); + } SVN_ERR(eb->callbacks->file_added(NULL, NULL, NULL, path, @@ -1054,8 +1059,8 @@ report_wc_directory_as_added(struct edit eb->changelist_hash, scratch_pool)) { if (eb->use_text_base) - SVN_ERR(svn_wc__get_pristine_props(&wcprops, db, local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&wcprops, db, local_abspath, + scratch_pool, scratch_pool)); else SVN_ERR(svn_wc__get_actual_props(&wcprops, db, local_abspath, scratch_pool, scratch_pool)); @@ -1227,8 +1232,9 @@ delete_entry(const char *path, SVN_ERR(get_pristine_file(&textbase, db, local_abspath, eb->use_text_base, pool, pool)); - SVN_ERR(svn_wc__get_pristine_props(&baseprops, eb->db, local_abspath, - pool, pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&baseprops, + eb->db, local_abspath, + pool, pool)); base_mimetype = get_prop_mimetype(baseprops); SVN_ERR(eb->callbacks->file_deleted(NULL, NULL, path, @@ -1349,9 +1355,10 @@ close_directory(void *dir_baton, { if (db->eb->use_text_base) { - SVN_ERR(svn_wc__get_pristine_props(&originalprops, - eb->db, db->local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&originalprops, + eb->db, db->local_abspath, + scratch_pool, + scratch_pool)); } else { @@ -1362,9 +1369,9 @@ close_directory(void *dir_baton, scratch_pool, scratch_pool)); /* Load the BASE and repository directory properties. */ - SVN_ERR(svn_wc__get_pristine_props(&base_props, - eb->db, db->local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_base_get_props(&base_props, + eb->db, db->local_abspath, + scratch_pool, scratch_pool)); repos_props = apply_propchanges(base_props, db->propchanges); @@ -1461,7 +1468,7 @@ open_file(const char *path, SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &fb->base_checksum, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, eb->db, fb->local_abspath, fb->pool, fb->pool)); @@ -1640,7 +1647,7 @@ close_file(void *file_baton, NULL, NULL, NULL, NULL, &pristine_checksum, NULL, NULL, - &had_props, NULL, + &had_props, NULL, NULL, db, fb->local_abspath, scratch_pool, scratch_pool)); Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/diff_local.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/diff_local.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/diff_local.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/diff_local.c Thu Dec 27 04:03:49 2012 @@ -172,7 +172,7 @@ file_diff(struct diff_baton *eb, &base_revision, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &base_checksum, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, db, local_abspath, scratch_pool, scratch_pool)); @@ -239,12 +239,13 @@ file_diff(struct diff_baton *eb, /* We show a deletion of what was actually deleted */ SVN_ERR_ASSERT(status == svn_wc__db_status_deleted); - SVN_ERR(svn_wc__get_pristine_props(&del_props, db, local_abspath, - scratch_pool, scratch_pool)); + SVN_ERR(svn_wc__db_read_pristine_props(&del_props, db, local_abspath, + scratch_pool, scratch_pool)); SVN_ERR(svn_wc__db_read_pristine_info(NULL, NULL, NULL, NULL, NULL, NULL, &del_checksum, NULL, - NULL, db, local_abspath, + NULL, NULL, + db, local_abspath, scratch_pool, scratch_pool)); } @@ -513,9 +514,7 @@ diff_status_callback(void *baton, /* Report the prop change. */ /* ### This case should probably be extended for git-diff, but this is what the old diff code provided */ - if (status->node_status == svn_wc_status_deleted - || status->node_status == svn_wc_status_replaced - || status->prop_status == svn_wc_status_modified) + if (status->prop_status == svn_wc_status_modified) { apr_array_header_t *propchanges; apr_hash_t *baseprops; Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/entries.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/entries.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/entries.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/entries.c Thu Dec 27 04:03:49 2012 @@ -64,12 +64,12 @@ typedef struct db_node_t { svn_revnum_t revision; svn_node_kind_t kind; /* ### should switch to svn_kind_t */ svn_checksum_t *checksum; - svn_filesize_t translated_size; + svn_filesize_t recorded_size; svn_revnum_t changed_rev; apr_time_t changed_date; const char *changed_author; svn_depth_t depth; - apr_time_t last_mod_time; + apr_time_t recorded_time; apr_hash_t *properties; svn_boolean_t file_external; } db_node_t; @@ -231,7 +231,7 @@ get_info_for_deleted(svn_wc_entry_t *ent checksum, NULL, NULL /* lock */, - &entry->has_props, + &entry->has_props, NULL, NULL, db, entry_abspath, @@ -255,7 +255,7 @@ get_info_for_deleted(svn_wc_entry_t *ent &entry->depth, checksum, NULL, - &entry->has_props, + &entry->has_props, NULL, db, entry_abspath, result_pool, @@ -297,6 +297,7 @@ get_info_for_deleted(svn_wc_entry_t *ent SVN_ERR(svn_wc__db_base_get_info(&status, NULL, &entry->revision, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, db, entry_abspath, result_pool, scratch_pool)); @@ -565,7 +566,7 @@ read_one_entry(const svn_wc_entry_t **ne NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, + NULL, NULL, NULL, NULL, db, entry_abspath, scratch_pool, scratch_pool)); @@ -1463,7 +1464,7 @@ insert_node(svn_sqlite__db_t *sdb, node->changed_rev, node->changed_date, node->changed_author, - node->last_mod_time)); + node->recorded_time)); if (node->repos_relpath) { @@ -1513,8 +1514,8 @@ insert_node(svn_sqlite__db_t *sdb, SVN_ERR(svn_sqlite__bind_properties(stmt, 15, node->properties, scratch_pool)); - if (node->translated_size != SVN_INVALID_FILESIZE) - SVN_ERR(svn_sqlite__bind_int64(stmt, 16, node->translated_size)); + if (node->recorded_size != SVN_INVALID_FILESIZE) + SVN_ERR(svn_sqlite__bind_int64(stmt, 16, node->recorded_size)); if (node->file_external) SVN_ERR(svn_sqlite__bind_int(stmt, 20, 1)); @@ -1905,8 +1906,8 @@ write_entry(struct write_baton **entry_n base_node->op_depth = 0; base_node->parent_relpath = parent_relpath; base_node->revision = entry->revision; - base_node->last_mod_time = entry->text_time; - base_node->translated_size = entry->working_size; + base_node->recorded_time = entry->text_time; + base_node->recorded_size = entry->working_size; if (entry->depth != svn_depth_exclude) base_node->depth = entry->depth; @@ -2103,12 +2104,12 @@ write_entry(struct write_baton **entry_n below_working_node->checksum = text_base_info->revert_base.sha1_checksum; } - below_working_node->translated_size = 0; + below_working_node->recorded_size = 0; below_working_node->changed_rev = SVN_INVALID_REVNUM; below_working_node->changed_date = 0; below_working_node->changed_author = NULL; below_working_node->depth = svn_depth_infinity; - below_working_node->last_mod_time = 0; + below_working_node->recorded_time = 0; below_working_node->properties = NULL; SVN_ERR(insert_node(sdb, below_working_node, scratch_pool)); } @@ -2120,8 +2121,8 @@ write_entry(struct write_baton **entry_n working_node->local_relpath = local_relpath; working_node->parent_relpath = parent_relpath; working_node->changed_rev = SVN_INVALID_REVNUM; - working_node->last_mod_time = entry->text_time; - working_node->translated_size = entry->working_size; + working_node->recorded_time = entry->text_time; + working_node->recorded_size = entry->working_size; if (entry->depth != svn_depth_exclude) working_node->depth = entry->depth; Modified: subversion/branches/javahl-ra/subversion/libsvn_wc/externals.c URL: http://svn.apache.org/viewvc/subversion/branches/javahl-ra/subversion/libsvn_wc/externals.c?rev=1426116&r1=1426115&r2=1426116&view=diff ============================================================================== --- subversion/branches/javahl-ra/subversion/libsvn_wc/externals.c (original) +++ subversion/branches/javahl-ra/subversion/libsvn_wc/externals.c Thu Dec 27 04:03:49 2012 @@ -163,13 +163,16 @@ svn_wc_parse_externals_description3(apr_ svn_boolean_t canonicalize_url, apr_pool_t *pool) { - apr_array_header_t *lines = svn_cstring_split(desc, "\n\r", TRUE, pool); int i; + apr_array_header_t *externals = NULL; + apr_array_header_t *lines = svn_cstring_split(desc, "\n\r", TRUE, pool); const char *parent_directory_display = svn_path_is_url(parent_directory) ? parent_directory : svn_dirent_local_style(parent_directory, pool); + /* If an error occurs halfway through parsing, *externals_p should stay + * untouched. So, store the list in a local var first. */ if (externals_p) - *externals_p = apr_array_make(pool, 1, sizeof(svn_wc_external_item2_t *)); + externals = apr_array_make(pool, 1, sizeof(svn_wc_external_item2_t *)); for (i = 0; i < lines->nelts; i++) { @@ -327,13 +330,63 @@ svn_wc_parse_externals_description3(apr_ item->url = svn_dirent_canonicalize(item->url, pool); } - if (externals_p) - APR_ARRAY_PUSH(*externals_p, svn_wc_external_item2_t *) = item; + if (externals) + APR_ARRAY_PUSH(externals, svn_wc_external_item2_t *) = item; } + if (externals_p) + *externals_p = externals; + 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 { @@ -462,7 +515,7 @@ open_file(const char *path, NULL, NULL, NULL, &eb->changed_rev, &eb->changed_date, &eb->changed_author, NULL, &eb->original_checksum, NULL, NULL, - &eb->had_props, NULL, + &eb->had_props, NULL, NULL, eb->db, eb->local_abspath, eb->pool, file_pool)); @@ -685,14 +738,10 @@ close_file(void *file_baton, &new_pristine_props, &new_actual_props, eb->db, eb->local_abspath, - svn_kind_file, NULL /* server_baseprops*/, base_props, actual_props, regular_prop_changes, - TRUE /* base_merge */, - FALSE /* dry_run */, - eb->cancel_func, eb->cancel_baton, pool, pool)); } else @@ -1018,7 +1067,7 @@ svn_wc__crawl_file_external(svn_wc_conte err = svn_wc__db_base_get_info(NULL, &kind, &revision, &repos_relpath, &repos_root_url, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &lock, - NULL, &update_root, + NULL, NULL, &update_root, db, local_abspath, scratch_pool, scratch_pool); @@ -1185,7 +1234,7 @@ is_external_rolled_out(svn_boolean_t *is err = svn_wc__db_base_get_info(NULL, NULL, NULL, &repos_relpath, &repos_root_url, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, wc_ctx->db, xinfo->local_abspath, scratch_pool, scratch_pool);