Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.c Sun Feb 8 03:10:25 2015 @@ -690,17 +690,6 @@ svn_fs_x__ensure_revision_exists(svn_rev _("No such revision %ld"), rev); } -svn_error_t * -svn_fs_x__revision_proplist(apr_hash_t **proplist_p, - svn_fs_t *fs, - svn_revnum_t rev, - apr_pool_t *pool) -{ - SVN_ERR(svn_fs_x__get_revision_proplist(proplist_p, fs, rev, FALSE, pool)); - - return SVN_NO_ERROR; -} - svn_error_t * svn_fs_x__file_length(svn_filesize_t *length, @@ -1108,17 +1097,19 @@ svn_fs_x__ensure_dir_exists(const char * svn_error_t * svn_fs_x__revision_prop(svn_string_t **value_p, - svn_fs_t *fs, - svn_revnum_t rev, - const char *propname, - apr_pool_t *pool) + svn_fs_t *fs, + svn_revnum_t rev, + const char *propname, + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { apr_hash_t *table; SVN_ERR(svn_fs__check_fs(fs, TRUE)); - SVN_ERR(svn_fs_x__revision_proplist(&table, fs, rev, pool)); + SVN_ERR(svn_fs_x__get_revision_proplist(&table, fs, rev, FALSE, + scratch_pool, scratch_pool)); - *value_p = svn_hash_gets(table, propname); + *value_p = svn_string_dup(svn_hash_gets(table, propname), result_pool); return SVN_NO_ERROR; } @@ -1143,7 +1134,11 @@ change_rev_prop_body(void *baton, change_rev_prop_baton_t *cb = baton; apr_hash_t *table; - SVN_ERR(svn_fs_x__revision_proplist(&table, cb->fs, cb->rev, scratch_pool)); + /* Read current revprop values from disk (never from cache). + Even if somehow the cache got out of sync, we want to make sure that + we read, update and write up-to-date data. */ + SVN_ERR(svn_fs_x__get_revision_proplist(&table, cb->fs, cb->rev, TRUE, + scratch_pool, scratch_pool)); if (cb->old_value_p) {
Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.h URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.h?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.h (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/fs_x.h Sun Feb 8 03:10:25 2015 @@ -69,15 +69,6 @@ svn_fs_x__ensure_revision_exists(svn_rev svn_fs_t *fs, apr_pool_t *scratch_pool); -/* Set *PROPLIST to be an apr_hash_t containing the property list of - revision REV as seen in filesystem FS. Use POOL for temporary - allocations. */ -svn_error_t * -svn_fs_x__revision_proplist(apr_hash_t **proplist, - svn_fs_t *fs, - svn_revnum_t rev, - apr_pool_t *pool); - /* Set *LENGTH to the be fulltext length of the node revision specified by NODEREV. */ svn_error_t * @@ -167,15 +158,16 @@ svn_fs_x__write_format(svn_fs_t *fs, svn_boolean_t overwrite, apr_pool_t *scratch_pool); -/* Find the value of the property named PROPNAME in transaction TXN. - Return the contents in *VALUE_P. The contents will be allocated - from POOL. */ +/* Find the value of the property named PROPNAME in transaction REV. + Return the contents in *VALUE_P, allocated from RESULT_POOL. + Use SCRATCH_POOL for temporary allocations. */ svn_error_t * svn_fs_x__revision_prop(svn_string_t **value_p, svn_fs_t *fs, svn_revnum_t rev, const char *propname, - apr_pool_t *pool); + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); /* Change, add, or delete a property on a revision REV in filesystem FS. NAME gives the name of the property, and value, if non-NULL, Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/hotcopy.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/hotcopy.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/hotcopy.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/hotcopy.c Sun Feb 8 03:10:25 2015 @@ -99,15 +99,15 @@ static svn_error_t * entry_name_to_utf8(const char **name_p, const char *name, const char *parent, - apr_pool_t *pool) + apr_pool_t *result_pool) { - svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, pool); + svn_error_t *err = svn_path_cstring_to_utf8(name_p, name, result_pool); if (err && err->apr_err == APR_EINVAL) { return svn_error_createf(err->apr_err, err, _("Error converting entry " "in directory '%s' to UTF-8"), - svn_dirent_local_style(parent, pool)); + svn_dirent_local_style(parent, result_pool)); } return err; } Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/noderevs.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/noderevs.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/noderevs.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/noderevs.c Sun Feb 8 03:10:25 2015 @@ -49,28 +49,6 @@ /* the noderev has copy-root path and revision */ #define NODEREV_HAS_CPATH 0x00040 -/* Our internal representation of an representation. - */ -typedef struct binary_representation_t -{ - /* Checksums digests for the contents produced by this representation. - If has_sha1 is FALSE, sha1_digest is not being used. */ - svn_boolean_t has_sha1; - unsigned char sha1_digest[APR_SHA1_DIGESTSIZE]; - unsigned char md5_digest[APR_MD5_DIGESTSIZE]; - - /* Location of this representation. */ - svn_fs_x__id_t id; - - /* The size of the representation in bytes as seen in the revision - file. */ - svn_filesize_t size; - - /* The size of the fulltext of the representation. If this is 0, - * the fulltext size is equal to representation size in the rev file, */ - svn_filesize_t expanded_size; -} binary_representation_t; - /* Our internal representation of a svn_fs_x__noderev_t. * * We will store path strings in a string container and reference them @@ -181,7 +159,7 @@ svn_fs_x__noderevs_create(int initial_co = apr_array_make(result_pool, 2 * initial_count, sizeof(svn_fs_x__id_t)); noderevs->reps = apr_array_make(result_pool, 2 * initial_count, - sizeof(binary_representation_t)); + sizeof(svn_fs_x__representation_t)); noderevs->noderevs = apr_array_make(result_pool, initial_count, sizeof(binary_noderev_t)); @@ -223,25 +201,17 @@ store_representation(apr_array_header_t apr_hash_t *dict, const svn_fs_x__representation_t *rep) { - binary_representation_t binary_rep = { 0 }; int idx; void *idx_void; if (rep == NULL) return 0; - binary_rep.has_sha1 = rep->has_sha1; - memcpy(binary_rep.sha1_digest, rep->sha1_digest, sizeof(rep->sha1_digest)); - memcpy(binary_rep.md5_digest, rep->md5_digest, sizeof(rep->md5_digest)); - binary_rep.id = rep->id; - binary_rep.size = rep->size; - binary_rep.expanded_size = rep->expanded_size; - - idx_void = apr_hash_get(dict, &binary_rep, sizeof(binary_rep)); + idx_void = apr_hash_get(dict, rep, sizeof(*rep)); idx = (int)(apr_uintptr_t)idx_void; if (idx == 0) { - APR_ARRAY_PUSH(reps, binary_representation_t) = binary_rep; + APR_ARRAY_PUSH(reps, svn_fs_x__representation_t) = *rep; idx = reps->nelts; apr_hash_set(dict, reps->elts + (idx-1) * reps->elt_size, reps->elt_size, (void*)(apr_uintptr_t)idx); @@ -365,8 +335,6 @@ get_representation(svn_fs_x__representat int idx, apr_pool_t *pool) { - binary_representation_t *binary_rep; - /* handle NULL representations */ if (idx == 0) { @@ -382,17 +350,9 @@ get_representation(svn_fs_x__representat idx, reps->nelts); /* no translation required. Just duplicate the info */ - binary_rep = &APR_ARRAY_IDX(reps, idx - 1, binary_representation_t); - - *rep = apr_pcalloc(pool, sizeof(**rep)); - (*rep)->has_sha1 = binary_rep->has_sha1; - memcpy((*rep)->sha1_digest, binary_rep->sha1_digest, - sizeof((*rep)->sha1_digest)); - memcpy((*rep)->md5_digest, binary_rep->md5_digest, - sizeof((*rep)->md5_digest)); - (*rep)->id = binary_rep->id; - (*rep)->size = binary_rep->size; - (*rep)->expanded_size = binary_rep->expanded_size; + *rep = apr_pmemdup(pool, + &APR_ARRAY_IDX(reps, idx - 1, svn_fs_x__representation_t), + sizeof(**rep)); return SVN_NO_ERROR; } @@ -517,8 +477,8 @@ write_reps(svn_packed__int_stream_t *rep int i; for (i = 0; i < reps->nelts; ++i) { - binary_representation_t *rep - = &APR_ARRAY_IDX(reps, i, binary_representation_t); + svn_fs_x__representation_t *rep + = &APR_ARRAY_IDX(reps, i, svn_fs_x__representation_t); svn_packed__add_uint(rep_stream, rep->has_sha1); @@ -635,11 +595,11 @@ read_reps(apr_array_header_t **reps_p, apr_size_t count = svn_packed__int_count(svn_packed__first_int_substream(rep_stream)); apr_array_header_t *reps - = apr_array_make(pool, (int)count, sizeof(binary_representation_t)); + = apr_array_make(pool, (int)count, sizeof(svn_fs_x__representation_t)); for (i = 0; i < count; ++i) { - binary_representation_t rep; + svn_fs_x__representation_t rep; rep.has_sha1 = (svn_boolean_t)svn_packed__get_uint(rep_stream); @@ -674,7 +634,7 @@ read_reps(apr_array_header_t **reps_p, memcpy(rep.sha1_digest, bytes, sizeof(rep.sha1_digest)); } - APR_ARRAY_PUSH(reps, binary_representation_t) = rep; + APR_ARRAY_PUSH(reps, svn_fs_x__representation_t) = rep; } *reps_p = reps; Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.c Sun Feb 8 03:10:25 2015 @@ -698,17 +698,18 @@ parse_revprop(apr_hash_t **properties, * If the data could not be read due to an otherwise recoverable error, * leave *PROPERTIES unchanged. No error will be returned in that case. * - * Allocations will be done in POOL. + * Allocate *PROPERTIES in RESULT_POOL and temporaries in SCRATCH_POOL. */ static svn_error_t * read_non_packed_revprop(apr_hash_t **properties, svn_fs_t *fs, svn_revnum_t rev, apr_int64_t generation, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_stringbuf_t *content = NULL; - apr_pool_t *iterpool = svn_pool_create(pool); + apr_pool_t *iterpool = svn_pool_create(scratch_pool); svn_boolean_t missing = FALSE; int i; @@ -727,7 +728,7 @@ read_non_packed_revprop(apr_hash_t **pro if (content) SVN_ERR(parse_revprop(properties, fs, rev, generation, svn_stringbuf__morph_into_string(content), - pool, iterpool)); + result_pool, iterpool)); svn_pool_clear(iterpool); @@ -1006,7 +1007,8 @@ parse_packed_revprops(svn_fs_t *fs, * *REVPROPS. Use GENERATION to populate the revprop cache, if enabled. * If you want to modify revprop contents / update REVPROPS, READ_ALL * must be set. Otherwise, only the properties of REV are being provided. - * Allocate data in POOL. + * + * Allocate *PROPERTIES in RESULT_POOL and temporaries in SCRATCH_POOL. */ static svn_error_t * read_pack_revprop(packed_revprops_t **revprops, @@ -1014,9 +1016,10 @@ read_pack_revprop(packed_revprops_t **re svn_revnum_t rev, apr_int64_t generation, svn_boolean_t read_all, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { - apr_pool_t *iterpool = svn_pool_create(pool); + apr_pool_t *iterpool = svn_pool_create(scratch_pool); svn_boolean_t missing = FALSE; svn_error_t *err; packed_revprops_t *result; @@ -1031,7 +1034,7 @@ read_pack_revprop(packed_revprops_t **re _("No such packed revision %ld"), rev); /* initialize the result data structure */ - result = apr_pcalloc(pool, sizeof(*result)); + result = apr_pcalloc(result_pool, sizeof(*result)); result->revision = rev; result->generation = generation; @@ -1047,7 +1050,7 @@ read_pack_revprop(packed_revprops_t **re /* there might have been concurrent writes. * Re-read the manifest and the pack file. */ - SVN_ERR(get_revprop_packname(fs, result, pool, iterpool)); + SVN_ERR(get_revprop_packname(fs, result, result_pool, iterpool)); file_path = svn_dirent_join(result->folder, result->filename, iterpool); @@ -1055,15 +1058,15 @@ read_pack_revprop(packed_revprops_t **re &missing, file_path, i + 1 < SVN_FS_X__RECOVERABLE_RETRY_COUNT, - pool)); + result_pool)); /* If we could not find the file, there was a write. * So, we should refresh our revprop generation info as well such * that others may find data we will put into the cache. They would * consider it outdated, otherwise. */ - if (missing && has_revprop_cache(fs, pool)) - SVN_ERR(read_revprop_generation(&result->generation, fs, pool)); + if (missing && has_revprop_cache(fs, iterpool)) + SVN_ERR(read_revprop_generation(&result->generation, fs, iterpool)); } /* the file content should be available now */ @@ -1072,7 +1075,7 @@ read_pack_revprop(packed_revprops_t **re _("Failed to read revprop pack file for r%ld"), rev); /* parse it. RESULT will be complete afterwards. */ - err = parse_packed_revprops(fs, result, read_all, pool, iterpool); + err = parse_packed_revprops(fs, result, read_all, result_pool, iterpool); svn_pool_destroy(iterpool); if (err) return svn_error_createf(SVN_ERR_FS_CORRUPT, err, @@ -1092,7 +1095,8 @@ svn_fs_x__get_revision_proplist(apr_hash svn_fs_t *fs, svn_revnum_t rev, svn_boolean_t bypass_cache, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_fs_x__data_t *ffd = fs->fsap_data; apr_int64_t generation = 0; @@ -1101,20 +1105,20 @@ svn_fs_x__get_revision_proplist(apr_hash *proplist_p = NULL; /* should they be available at all? */ - SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, pool)); + SVN_ERR(svn_fs_x__ensure_revision_exists(rev, fs, scratch_pool)); /* Try cache lookup first. */ - if (!bypass_cache && has_revprop_cache(fs, pool)) + if (!bypass_cache && has_revprop_cache(fs, scratch_pool)) { svn_boolean_t is_cached; svn_fs_x__pair_cache_key_t key = { 0 }; - SVN_ERR(read_revprop_generation(&generation, fs, pool)); + SVN_ERR(read_revprop_generation(&generation, fs, scratch_pool)); key.revision = rev; key.second = generation; SVN_ERR(svn_cache__get((void **) proplist_p, &is_cached, - ffd->revprop_cache, &key, pool)); + ffd->revprop_cache, &key, result_pool)); if (is_cached) return SVN_NO_ERROR; } @@ -1125,7 +1129,8 @@ svn_fs_x__get_revision_proplist(apr_hash if (!svn_fs_x__is_packed_revprop(fs, rev)) { svn_error_t *err = read_non_packed_revprop(proplist_p, fs, rev, - generation, pool); + generation, result_pool, + scratch_pool); if (err) { if (!APR_STATUS_IS_ENOENT(err->apr_err)) @@ -1142,7 +1147,8 @@ svn_fs_x__get_revision_proplist(apr_hash if (!*proplist_p) { packed_revprops_t *revprops; - SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, FALSE, pool)); + SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, FALSE, + result_pool, scratch_pool)); *proplist_p = revprops->properties; } @@ -1160,7 +1166,8 @@ svn_fs_x__get_revision_proplist(apr_hash * file in *TMP_PATH and the file path that it must be moved to in * *FINAL_PATH. * - * Use POOL for allocations. + * Allocate *FINAL_PATH and *TMP_PATH in RESULT_POOL. Use SCRATCH_POOL + * for temporary allocations. */ static svn_error_t * write_non_packed_revprop(const char **final_path, @@ -1168,17 +1175,21 @@ write_non_packed_revprop(const char **fi svn_fs_t *fs, svn_revnum_t rev, apr_hash_t *proplist, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_stream_t *stream; - *final_path = svn_fs_x__path_revprops(fs, rev, pool); + *final_path = svn_fs_x__path_revprops(fs, rev, result_pool); /* ### do we have a directory sitting around already? we really shouldn't ### have to get the dirname here. */ SVN_ERR(svn_stream_open_unique(&stream, tmp_path, - svn_dirent_dirname(*final_path, pool), - svn_io_file_del_none, pool, pool)); - SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool)); + svn_dirent_dirname(*final_path, + scratch_pool), + svn_io_file_del_none, + result_pool, scratch_pool)); + SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, + scratch_pool)); SVN_ERR(svn_stream_close(stream)); return SVN_NO_ERROR; @@ -1354,7 +1365,10 @@ repack_revprops(svn_fs_t *fs, * [REVPROPS->START_REVISION + START, REVPROPS->START_REVISION + END - 1] * of REVPROPS->MANIFEST. Add the name of old file to FILES_TO_DELETE, * auto-create that array if necessary. Return an open file stream to - * the new file in *STREAM allocated in POOL. + * the new file in *STREAM allocated in RESULT_POOL. Allocate the paths + * in *FILES_TO_DELETE from the same pool that contains the array itself. + * + * Use SCRATCH_POOL for temporary allocations. */ static svn_error_t * repack_stream_open(svn_stream_t **stream, @@ -1363,7 +1377,8 @@ repack_stream_open(svn_stream_t **stream int start, int end, apr_array_header_t **files_to_delete, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { apr_int64_t tag; const char *tag_string; @@ -1379,10 +1394,11 @@ repack_stream_open(svn_stream_t **stream const char*); if (*files_to_delete == NULL) - *files_to_delete = apr_array_make(pool, 3, sizeof(const char*)); + *files_to_delete = apr_array_make(result_pool, 3, sizeof(const char*)); APR_ARRAY_PUSH(*files_to_delete, const char*) - = svn_dirent_join(revprops->folder, old_filename, pool); + = svn_dirent_join(revprops->folder, old_filename, + (*files_to_delete)->pool); /* increase the tag part, i.e. the counter after the dot */ tag_string = strchr(old_filename, '.'); @@ -1392,7 +1408,8 @@ repack_stream_open(svn_stream_t **stream old_filename); SVN_ERR(svn_cstring_atoi64(&tag, tag_string + 1)); - new_filename = svn_string_createf(pool, "%ld.%" APR_INT64_T_FMT, + new_filename = svn_string_createf((*files_to_delete)->pool, + "%ld.%" APR_INT64_T_FMT, revprops->start_revision + start, ++tag); @@ -1404,9 +1421,10 @@ repack_stream_open(svn_stream_t **stream /* create a file stream for the new file */ SVN_ERR(svn_io_file_open(&file, svn_dirent_join(revprops->folder, new_filename->data, - pool), - APR_WRITE | APR_CREATE, APR_OS_DEFAULT, pool)); - *stream = svn_stream_from_aprfile2(file, FALSE, pool); + scratch_pool), + APR_WRITE | APR_CREATE, APR_OS_DEFAULT, + result_pool)); + *stream = svn_stream_from_aprfile2(file, FALSE, result_pool); return SVN_NO_ERROR; } @@ -1415,7 +1433,8 @@ repack_stream_open(svn_stream_t **stream * PROPLIST. Return a new file in *TMP_PATH that the caller shall move * to *FINAL_PATH to make the change visible. Files to be deleted will * be listed in *FILES_TO_DELETE which may remain unchanged / unallocated. - * Use POOL for allocations. + * + * Allocate output values in RESULT_POOL and temporaries from SCRATCH_POOL. */ static svn_error_t * write_packed_revprop(const char **final_path, @@ -1424,7 +1443,8 @@ write_packed_revprop(const char **final_ svn_fs_t *fs, svn_revnum_t rev, apr_hash_t *proplist, - apr_pool_t *pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { svn_fs_x__data_t *ffd = fs->fsap_data; packed_revprops_t *revprops; @@ -1436,16 +1456,18 @@ write_packed_revprop(const char **final_ /* read the current revprop generation. This value will not change * while we hold the global write lock to this FS. */ - if (has_revprop_cache(fs, pool)) - SVN_ERR(read_revprop_generation(&generation, fs, pool)); + if (has_revprop_cache(fs, scratch_pool)) + SVN_ERR(read_revprop_generation(&generation, fs, scratch_pool)); /* read contents of the current pack file */ - SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, TRUE, pool)); + SVN_ERR(read_pack_revprop(&revprops, fs, rev, generation, TRUE, + scratch_pool, scratch_pool)); /* serialize the new revprops */ - serialized = svn_stringbuf_create_empty(pool); - stream = svn_stream_from_stringbuf(serialized, pool); - SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, pool)); + serialized = svn_stringbuf_create_empty(scratch_pool); + stream = svn_stream_from_stringbuf(serialized, scratch_pool); + SVN_ERR(svn_hash_write2(proplist, stream, SVN_HASH_TERMINATOR, + scratch_pool)); SVN_ERR(svn_stream_close(stream)); /* calculate the size of the new data */ @@ -1464,12 +1486,13 @@ write_packed_revprop(const char **final_ * in the non-packed case */ *final_path = svn_dirent_join(revprops->folder, revprops->filename, - pool); + result_pool); SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder, - svn_io_file_del_none, pool, pool)); + svn_io_file_del_none, result_pool, + scratch_pool)); SVN_ERR(repack_revprops(fs, revprops, 0, revprops->sizes->nelts, changed_index, serialized, new_total_size, - stream, pool)); + stream, scratch_pool)); } else { @@ -1512,25 +1535,32 @@ write_packed_revprop(const char **final_ right_count = revprops->sizes->nelts - left_count - 1; } + /* Allocate this here such that we can call the repack functions with + * the scratch pool alone. */ + if (*files_to_delete == NULL) + *files_to_delete = apr_array_make(result_pool, 3, + sizeof(const char*)); + /* write the new, split files */ if (left_count) { SVN_ERR(repack_stream_open(&stream, fs, revprops, 0, - left_count, files_to_delete, pool)); + left_count, files_to_delete, + scratch_pool, scratch_pool)); SVN_ERR(repack_revprops(fs, revprops, 0, left_count, changed_index, serialized, new_total_size, - stream, pool)); + stream, scratch_pool)); } if (left_count + right_count < revprops->sizes->nelts) { SVN_ERR(repack_stream_open(&stream, fs, revprops, changed_index, changed_index + 1, files_to_delete, - pool)); + scratch_pool, scratch_pool)); SVN_ERR(repack_revprops(fs, revprops, changed_index, changed_index + 1, changed_index, serialized, new_total_size, - stream, pool)); + stream, scratch_pool)); } if (right_count) @@ -1538,24 +1568,27 @@ write_packed_revprop(const char **final_ SVN_ERR(repack_stream_open(&stream, fs, revprops, revprops->sizes->nelts - right_count, revprops->sizes->nelts, - files_to_delete, pool)); + files_to_delete, scratch_pool, + scratch_pool)); SVN_ERR(repack_revprops(fs, revprops, revprops->sizes->nelts - right_count, revprops->sizes->nelts, changed_index, serialized, new_total_size, stream, - pool)); + scratch_pool)); } /* write the new manifest */ - *final_path = svn_dirent_join(revprops->folder, PATH_MANIFEST, pool); + *final_path = svn_dirent_join(revprops->folder, PATH_MANIFEST, + result_pool); SVN_ERR(svn_stream_open_unique(&stream, tmp_path, revprops->folder, - svn_io_file_del_none, pool, pool)); + svn_io_file_del_none, result_pool, + scratch_pool)); for (i = 0; i < revprops->manifest->nelts; ++i) { const char *filename = APR_ARRAY_IDX(revprops->manifest, i, const char*); - SVN_ERR(svn_stream_printf(stream, pool, "%s\n", filename)); + SVN_ERR(svn_stream_printf(stream, scratch_pool, "%s\n", filename)); } SVN_ERR(svn_stream_close(stream)); @@ -1603,10 +1636,12 @@ svn_fs_x__set_revision_proplist(svn_fs_t /* Serialize the new revprop data */ if (is_packed) SVN_ERR(write_packed_revprop(&final_path, &tmp_path, &files_to_delete, - fs, rev, proplist, scratch_pool)); + fs, rev, proplist, scratch_pool, + scratch_pool)); else SVN_ERR(write_non_packed_revprop(&final_path, &tmp_path, - fs, rev, proplist, scratch_pool)); + fs, rev, proplist, scratch_pool, + scratch_pool)); /* We use the rev file of this revision as the perms reference, * because when setting revprops for the first time, the revprop Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.h URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.h?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.h (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/revprops.h Sun Feb 8 03:10:25 2015 @@ -75,17 +75,19 @@ svn_fs_x__upgrade_cleanup_pack_revprops( void *cancel_baton, apr_pool_t *scratch_pool); -/* Read the revprops for revision REV in FS and return them in *PROPERTIES_P. +/* Read the revprops for revision REV in FS and return them in *PROPLIST_P. * If BYPASS_CACHE is set, don't consult the disks but always read from disk. * - * Allocations will be done in POOL. + * Allocate the *PROPLIST_P in RESULT_POOL and use SCRATCH_POOL for temporary + * allocations. */ svn_error_t * svn_fs_x__get_revision_proplist(apr_hash_t **proplist_p, svn_fs_t *fs, svn_revnum_t rev, svn_boolean_t bypass_cache, - apr_pool_t *pool); + apr_pool_t *result_pool, + apr_pool_t *scratch_pool); /* Set the revision property list of revision REV in filesystem FS to PROPLIST. Use SCRATCH_POOL for temporary allocations. */ Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/tree.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/tree.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/tree.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/tree.c Sun Feb 8 03:10:25 2015 @@ -564,42 +564,45 @@ root_txn_id(svn_fs_root_t *root) } /* Set *NODE_P to a freshly opened dag node referring to the root - directory of ROOT, allocating from RESULT_POOL. */ + directory of ROOT, allocating from RESULT_POOL. Use SCRATCH_POOL + for temporary allocations. */ static svn_error_t * root_node(dag_node_t **node_p, svn_fs_root_t *root, - apr_pool_t *result_pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { if (root->is_txn_root) { /* It's a transaction root. Open a fresh copy. */ return svn_fs_x__dag_txn_root(node_p, root->fs, root_txn_id(root), - result_pool); + result_pool, scratch_pool); } else { /* It's a revision root, so we already have its root directory opened. */ return svn_fs_x__dag_revision_root(node_p, root->fs, root->rev, - result_pool); + result_pool, scratch_pool); } } /* Set *NODE_P to a mutable root directory for ROOT, cloning if necessary, allocating in RESULT_POOL. ROOT must be a transaction root. - Use ERROR_PATH in error messages. */ + Use ERROR_PATH in error messages. Use SCRATCH_POOL for temporaries.*/ static svn_error_t * mutable_root_node(dag_node_t **node_p, svn_fs_root_t *root, const char *error_path, - apr_pool_t *result_pool) + apr_pool_t *result_pool, + apr_pool_t *scratch_pool) { if (root->is_txn_root) { /* It's a transaction root. Open a fresh copy. */ - return svn_fs_x__dag_clone_root(node_p, root->fs, root_txn_id(root), - result_pool); + return svn_fs_x__dag_txn_root(node_p, root->fs, root_txn_id(root), + result_pool, scratch_pool); } else /* If it's not a transaction root, we can't change its contents. */ @@ -969,7 +972,7 @@ open_path(parent_path_t **parent_path_p, { /* Make a parent_path item for the root node, using its own current copy id. */ - SVN_ERR(root_node(&here, root, pool)); + SVN_ERR(root_node(&here, root, pool, iterpool)); rest = path + 1; /* skip the leading '/', it saves in iteration */ } @@ -1186,7 +1189,8 @@ make_path_mutable(svn_fs_root_t *root, else { /* We're trying to clone the root directory. */ - SVN_ERR(mutable_root_node(&clone, root, error_path, result_pool)); + SVN_ERR(mutable_root_node(&clone, root, error_path, result_pool, + scratch_pool)); } /* Update the PARENT_PATH link to refer to the clone. */ @@ -1698,9 +1702,9 @@ compare_dir_structure(svn_boolean_t *cha /* Modified but not copied / replaced or anything? */ SVN_ERR(svn_fs_x__dag_get_node(&lhs_node, fs, &lhs_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_node(&rhs_node, fs, &rhs_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_same_line_of_history(&same_history, lhs_node, rhs_node)); if (same_history) @@ -1949,7 +1953,7 @@ merge(svn_stringbuf_t *conflict_p, dag_node_t *t_ent_node; SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_start, t_ent_node)); mergeinfo_increment -= mergeinfo_start; @@ -1958,7 +1962,7 @@ merge(svn_stringbuf_t *conflict_p, { dag_node_t *s_ent_node; SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_end, s_ent_node)); @@ -2007,11 +2011,11 @@ merge(svn_stringbuf_t *conflict_p, /* Fetch DAG nodes to efficiently access ID parts. */ SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_node(&t_ent_node, fs, &t_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_node(&a_ent_node, fs, &a_entry->id, - iterpool)); + iterpool, iterpool)); /* If either SOURCE-ENTRY or TARGET-ENTRY is not a direct modification of ANCESTOR-ENTRY, declare a conflict. */ @@ -2063,7 +2067,7 @@ merge(svn_stringbuf_t *conflict_p, iterpool)); SVN_ERR(svn_fs_x__dag_get_node(&s_ent_node, fs, &s_entry->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&mergeinfo_s, s_ent_node)); mergeinfo_increment += mergeinfo_s; @@ -2107,11 +2111,14 @@ merge_changes(dag_node_t *ancestor_node, svn_fs_x__txn_id_t txn_id = svn_fs_x__txn_get_id(txn); svn_boolean_t related; - SVN_ERR(svn_fs_x__dag_txn_root(&txn_root_node, fs, txn_id, scratch_pool)); + SVN_ERR(svn_fs_x__dag_txn_root(&txn_root_node, fs, txn_id, scratch_pool, + scratch_pool)); if (ancestor_node == NULL) { - SVN_ERR(svn_fs_x__dag_txn_base_root(&ancestor_node, fs, txn_id, + svn_revnum_t base_rev; + SVN_ERR(svn_fs_x__get_base_rev(&base_rev, fs, txn_id, scratch_pool)); + SVN_ERR(svn_fs_x__dag_revision_root(&ancestor_node, fs, base_rev, scratch_pool, scratch_pool)); } @@ -3625,7 +3632,8 @@ history_prev(svn_fs_history_t **prev_his /* Replace NODE and friends with the information from its predecessor. */ - SVN_ERR(svn_fs_x__dag_get_node(&node, fs, &pred_id, scratch_pool)); + SVN_ERR(svn_fs_x__dag_get_node(&node, fs, &pred_id, scratch_pool, + scratch_pool)); commit_path = svn_fs_x__dag_get_created_path(node); commit_rev = svn_fs_x__dag_get_revision(node); } @@ -4351,7 +4359,8 @@ verify_node(dag_node_t *node, { dag_node_t *pred; int pred_pred_count; - SVN_ERR(svn_fs_x__dag_get_node(&pred, fs, &pred_id, iterpool)); + SVN_ERR(svn_fs_x__dag_get_node(&pred, fs, &pred_id, iterpool, + iterpool)); SVN_ERR(svn_fs_x__dag_get_predecessor_count(&pred_pred_count, pred)); if (pred_pred_count+1 != pred_count) return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL, @@ -4402,7 +4411,7 @@ verify_node(dag_node_t *node, if (svn_fs_x__get_revnum(dirent->id.change_set) == rev) { SVN_ERR(svn_fs_x__dag_get_node(&child, fs, &dirent->id, - iterpool)); + iterpool, iterpool)); SVN_ERR(verify_node(child, rev, parent_nodes, iterpool)); SVN_ERR(svn_fs_x__dag_get_mergeinfo_count(&child_mergeinfo, child)); @@ -4452,7 +4461,7 @@ svn_fs_x__verify_root(svn_fs_root_t *roo When this code is called in the library, we want to ensure we use the on-disk data --- rather than some data that was read in the possibly-distance past and cached since. */ - SVN_ERR(root_node(&root_dir, root, scratch_pool)); + SVN_ERR(root_node(&root_dir, root, scratch_pool, scratch_pool)); /* Recursively verify ROOT_DIR. */ parent_nodes = apr_array_make(scratch_pool, 16, sizeof(dag_node_t *)); Modified: subversion/branches/pin-externals/subversion/libsvn_fs_x/verify.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_fs_x/verify.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_fs_x/verify.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_fs_x/verify.c Sun Feb 8 03:10:25 2015 @@ -713,7 +713,8 @@ verify_revprops(svn_fs_t *fs, /* Access the svn:date revprop. * This implies parsing all revprops for that revision. */ SVN_ERR(svn_fs_x__revision_prop(&date, fs, revision, - SVN_PROP_REVISION_DATE, iterpool)); + SVN_PROP_REVISION_DATE, + iterpool, iterpool)); /* The time stamp is the only revprop that, if given, needs to * have a valid content. */ Modified: subversion/branches/pin-externals/subversion/libsvn_ra/ra_loader.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_ra/ra_loader.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_ra/ra_loader.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_ra/ra_loader.c Sun Feb 8 03:10:25 2015 @@ -52,6 +52,7 @@ #include "ra_loader.h" #include "deprecated.h" +#include "private/svn_auth_private.h" #include "private/svn_ra_private.h" #include "svn_private_config.h" @@ -263,22 +264,12 @@ svn_error_t *svn_ra_open4(svn_ra_session svn_ra_session_t *session; const struct ra_lib_defn *defn; const svn_ra__vtable_t *vtable = NULL; - svn_config_t *servers = NULL; - const char *server_group = NULL; apr_uri_t repos_URI; apr_status_t apr_err; svn_error_t *err; #ifdef CHOOSABLE_DAV_MODULE const char *http_library = DEFAULT_HTTP_LIBRARY; #endif - /* Auth caching parameters. */ - svn_boolean_t store_passwords = SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS; - svn_boolean_t store_auth_creds = SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS; - const char *store_plaintext_passwords - = SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS; - svn_boolean_t store_pp = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP; - const char *store_pp_plaintext - = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT; /* Initialize the return variable. */ *session_p = NULL; @@ -294,100 +285,27 @@ svn_error_t *svn_ra_open4(svn_ra_session repos_URL); if (callbacks->auth_baton) - { - /* The 'store-passwords' and 'store-auth-creds' parameters used to - * live in SVN_CONFIG_CATEGORY_CONFIG. For backward compatibility, - * if values for these parameters have already been set by our - * callers, we use those values as defaults. - * - * Note that we can only catch the case where users explicitly set - * "store-passwords = no" or 'store-auth-creds = no". - * - * However, since the default value for both these options is - * currently (and has always been) "yes", users won't know - * the difference if they set "store-passwords = yes" or - * "store-auth-creds = yes" -- they'll get the expected behaviour. - */ - - if (svn_auth_get_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL) - store_passwords = FALSE; - - if (svn_auth_get_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL) - store_auth_creds = FALSE; - } + SVN_ERR(svn_auth__apply_config_for_server(callbacks->auth_baton, config, + repos_URI.hostname, sesspool)); +#ifdef CHOOSABLE_DAV_MODULE if (config) { + svn_config_t *servers = NULL; + const char *server_group = NULL; + /* Grab the 'servers' config. */ servers = svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS); if (servers) { /* First, look in the global section. */ - SVN_ERR(svn_config_get_bool - (servers, &store_passwords, SVN_CONFIG_SECTION_GLOBAL, - SVN_CONFIG_OPTION_STORE_PASSWORDS, - store_passwords)); - - SVN_ERR(svn_config_get_yes_no_ask - (servers, &store_plaintext_passwords, SVN_CONFIG_SECTION_GLOBAL, - SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS, - SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS)); - - SVN_ERR(svn_config_get_bool - (servers, &store_pp, SVN_CONFIG_SECTION_GLOBAL, - SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP, - store_pp)); - - SVN_ERR(svn_config_get_yes_no_ask - (servers, &store_pp_plaintext, - SVN_CONFIG_SECTION_GLOBAL, - SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, - SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT)); - - SVN_ERR(svn_config_get_bool - (servers, &store_auth_creds, SVN_CONFIG_SECTION_GLOBAL, - SVN_CONFIG_OPTION_STORE_AUTH_CREDS, - store_auth_creds)); - /* Find out where we're about to connect to, and * try to pick a server group based on the destination. */ server_group = svn_config_find_group(servers, repos_URI.hostname, SVN_CONFIG_SECTION_GROUPS, sesspool); - if (server_group) - { - /* Override global auth caching parameters with the ones - * for the server group, if any. */ - SVN_ERR(svn_config_get_bool(servers, &store_auth_creds, - server_group, - SVN_CONFIG_OPTION_STORE_AUTH_CREDS, - store_auth_creds)); - - SVN_ERR(svn_config_get_bool(servers, &store_passwords, - server_group, - SVN_CONFIG_OPTION_STORE_PASSWORDS, - store_passwords)); - - SVN_ERR(svn_config_get_yes_no_ask - (servers, &store_plaintext_passwords, server_group, - SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS, - store_plaintext_passwords)); - - SVN_ERR(svn_config_get_bool - (servers, &store_pp, - server_group, SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP, - store_pp)); - - SVN_ERR(svn_config_get_yes_no_ask - (servers, &store_pp_plaintext, server_group, - SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, - store_pp_plaintext)); - } -#ifdef CHOOSABLE_DAV_MODULE /* Now, which DAV-based RA method do we want to use today? */ http_library = svn_config_get_server_setting(servers, @@ -400,38 +318,9 @@ svn_error_t *svn_ra_open4(svn_ra_session _("Invalid config: unknown HTTP library " "'%s'"), http_library); -#endif } } - - if (callbacks->auth_baton) - { - /* Save auth caching parameters in the auth parameter hash. */ - if (! store_passwords) - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, ""); - - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS, - store_plaintext_passwords); - - if (! store_pp) - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP, - ""); - - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, - store_pp_plaintext); - - if (! store_auth_creds) - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_NO_AUTH_CACHE, ""); - - if (server_group) - svn_auth_set_parameter(callbacks->auth_baton, - SVN_AUTH_PARAM_SERVER_GROUP, server_group); - } +#endif /* Find the library. */ for (defn = ra_libraries; defn->ra_name != NULL; ++defn) Modified: subversion/branches/pin-externals/subversion/libsvn_ra_serf/commit.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_ra_serf/commit.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_ra_serf/commit.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_ra_serf/commit.c Sun Feb 8 03:10:25 2015 @@ -1609,7 +1609,7 @@ change_dir_prop(void *dir_baton, prop = apr_palloc(dir->pool, sizeof(*prop)); prop->name = apr_pstrdup(dir->pool, name); - prop->value = value ? svn_string_dup(value, dir->pool) : NULL; + prop->value = svn_string_dup(value, dir->pool); svn_hash_sets(dir->prop_changes, prop->name, prop); @@ -1879,7 +1879,7 @@ change_file_prop(void *file_baton, prop = apr_palloc(file->pool, sizeof(*prop)); prop->name = apr_pstrdup(file->pool, name); - prop->value = value ? svn_string_dup(value, file->pool) : NULL; + prop->value = svn_string_dup(value, file->pool); svn_hash_sets(file->prop_changes, prop->name, prop); Modified: subversion/branches/pin-externals/subversion/libsvn_repos/hooks.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_repos/hooks.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_repos/hooks.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_repos/hooks.c Sun Feb 8 03:10:25 2015 @@ -522,10 +522,19 @@ lock_token_content(apr_file_t **handle, const char *token = apr_hash_this_key(hi); const char *path = apr_hash_this_val(hi); + if (path == (const char *) 1) + { + /* Special handling for svn_fs_access_t * created by using deprecated + svn_fs_access_add_lock_token() function. */ + path = ""; + } + else + { + path = svn_path_uri_autoescape(path, pool); + } + svn_stringbuf_appendstr(lock_str, - svn_stringbuf_createf(pool, "%s|%s\n", - svn_path_uri_autoescape(path, pool), - token)); + svn_stringbuf_createf(pool, "%s|%s\n", path, token)); } svn_stringbuf_appendcstr(lock_str, "\n"); Modified: subversion/branches/pin-externals/subversion/libsvn_repos/log.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_repos/log.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_repos/log.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_repos/log.c Sun Feb 8 03:10:25 2015 @@ -168,18 +168,23 @@ svn_repos_check_revision_access(svn_repo * AUTHZ_READ_BATON and FS) to check whether each changed-path (and * copyfrom_path) is readable: * + * - If absolutely every changed-path (and copyfrom_path) is + * readable, then return the full CHANGED hash, and set + * *ACCESS_LEVEL to svn_repos_revision_access_full. + * * - If some paths are readable and some are not, then silently - * omit the unreadable paths from the CHANGED hash, and return - * SVN_ERR_AUTHZ_PARTIALLY_READABLE. + * omit the unreadable paths from the CHANGED hash, and set + * *ACCESS_LEVEL to svn_repos_revision_access_partial. * * - If absolutely every changed-path (and copyfrom_path) is - * unreadable, then return an empty CHANGED hash and - * SVN_ERR_AUTHZ_UNREADABLE. (This is to distinguish a revision - * which truly has no changed paths from a revision in which all - * paths are unreadable.) + * unreadable, then return an empty CHANGED hash, and set + * *ACCESS_LEVEL to svn_repos_revision_access_none. (This is + * to distinguish a revision which truly has no changed paths + * from a revision in which all paths are unreadable.) */ static svn_error_t * -detect_changed(apr_hash_t **changed, +detect_changed(svn_repos_revision_access_level_t *access_level, + apr_hash_t **changed, svn_fs_root_t *root, svn_fs_t *fs, apr_hash_t *prefetched_changes, @@ -213,9 +218,12 @@ detect_changed(apr_hash_t **changed, } if (apr_hash_count(changes) == 0) - /* No paths changed in this revision? Uh, sure, I guess the - revision is readable, then. */ - return SVN_NO_ERROR; + { + /* No paths changed in this revision? Uh, sure, I guess the + revision is readable, then. */ + *access_level = svn_repos_revision_access_full; + return SVN_NO_ERROR; + } iterpool = svn_pool_create(pool); for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi)) @@ -364,16 +372,21 @@ detect_changed(apr_hash_t **changed, svn_pool_destroy(iterpool); if (! found_readable) - /* Every changed-path was unreadable. */ - return svn_error_create(SVN_ERR_AUTHZ_UNREADABLE, - NULL, NULL); - - if (found_unreadable) - /* At least one changed-path was unreadable. */ - return svn_error_create(SVN_ERR_AUTHZ_PARTIALLY_READABLE, - NULL, NULL); + { + /* Every changed-path was unreadable. */ + *access_level = svn_repos_revision_access_none; + } + else if (found_unreadable) + { + /* At least one changed-path was unreadable. */ + *access_level = svn_repos_revision_access_partial; + } + else + { + /* Every changed-path was readable. */ + *access_level = svn_repos_revision_access_full; + } - /* Every changed-path was readable. */ return SVN_NO_ERROR; } @@ -1078,33 +1091,27 @@ fill_log_entry(svn_log_entry_t *log_entr && (authz_read_func || discover_changed_paths)) { svn_fs_root_t *newroot; - svn_error_t *patherr; + svn_repos_revision_access_level_t access_level; SVN_ERR(svn_fs_revision_root(&newroot, fs, rev, pool)); - patherr = detect_changed(&changed_paths, - newroot, fs, prefetched_changes, - authz_read_func, authz_read_baton, - pool); + SVN_ERR(detect_changed(&access_level, &changed_paths, + newroot, fs, prefetched_changes, + authz_read_func, authz_read_baton, + pool)); - if (patherr - && patherr->apr_err == SVN_ERR_AUTHZ_UNREADABLE) + if (access_level == svn_repos_revision_access_none) { /* All changed-paths are unreadable, so clear all fields. */ - svn_error_clear(patherr); changed_paths = NULL; get_revprops = FALSE; } - else if (patherr - && patherr->apr_err == SVN_ERR_AUTHZ_PARTIALLY_READABLE) + else if (access_level == svn_repos_revision_access_partial) { /* At least one changed-path was unreadable, so censor all but author and date. (The unreadable paths are already missing from the hash.) */ - svn_error_clear(patherr); censor_revprops = TRUE; } - else if (patherr) - return patherr; /* It may be the case that an authz func was passed in, but the user still doesn't want to see any changed-paths. */ Modified: subversion/branches/pin-externals/subversion/libsvn_repos/reporter.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_repos/reporter.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_repos/reporter.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_repos/reporter.c Sun Feb 8 03:10:25 2015 @@ -495,8 +495,8 @@ get_revision_info(report_baton_t *b, /* Create a result object */ info = apr_palloc(b->pool, sizeof(*info)); info->rev = rev; - info->date = cdate ? svn_string_dup(cdate, b->pool) : NULL; - info->author = author ? svn_string_dup(author, b->pool) : NULL; + info->date = svn_string_dup(cdate, b->pool); + info->author = svn_string_dup(author, b->pool); /* Cache it */ apr_hash_set(b->revision_infos, &info->rev, sizeof(info->rev), info); Modified: subversion/branches/pin-externals/subversion/libsvn_subr/auth.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_subr/auth.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_subr/auth.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_subr/auth.c Sun Feb 8 03:10:25 2015 @@ -685,3 +685,143 @@ svn_auth_get_platform_specific_client_pr return SVN_NO_ERROR; } + +svn_error_t * +svn_auth__apply_config_for_server(svn_auth_baton_t *auth_baton, + apr_hash_t *config, + const char *server_name, + apr_pool_t *scratch_pool) +{ + svn_boolean_t store_passwords = SVN_CONFIG_DEFAULT_OPTION_STORE_PASSWORDS; + svn_boolean_t store_auth_creds = SVN_CONFIG_DEFAULT_OPTION_STORE_AUTH_CREDS; + const char *store_plaintext_passwords + = SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS; + svn_boolean_t store_pp = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP; + const char *store_pp_plaintext + = SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT; + svn_config_t *servers = NULL; + const char *server_group = NULL; + + /* The 'store-passwords' and 'store-auth-creds' parameters used to + * live in SVN_CONFIG_CATEGORY_CONFIG. For backward compatibility, + * if values for these parameters have already been set by our + * callers, we use those values as defaults. + * + * Note that we can only catch the case where users explicitly set + * "store-passwords = no" or 'store-auth-creds = no". + * + * However, since the default value for both these options is + * currently (and has always been) "yes", users won't know + * the difference if they set "store-passwords = yes" or + * "store-auth-creds = yes" -- they'll get the expected behaviour. + */ + + if (svn_auth_get_parameter(auth_baton, + SVN_AUTH_PARAM_DONT_STORE_PASSWORDS) != NULL) + store_passwords = FALSE; + + if (svn_auth_get_parameter(auth_baton, + SVN_AUTH_PARAM_NO_AUTH_CACHE) != NULL) + store_auth_creds = FALSE; + + if (config) + { + /* Grab the 'servers' config. */ + servers = svn_hash_gets(config, SVN_CONFIG_CATEGORY_SERVERS); + if (servers) + { + /* First, look in the global section. */ + + SVN_ERR(svn_config_get_bool + (servers, &store_passwords, SVN_CONFIG_SECTION_GLOBAL, + SVN_CONFIG_OPTION_STORE_PASSWORDS, + store_passwords)); + + SVN_ERR(svn_config_get_yes_no_ask + (servers, &store_plaintext_passwords, SVN_CONFIG_SECTION_GLOBAL, + SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS, + SVN_CONFIG_DEFAULT_OPTION_STORE_PLAINTEXT_PASSWORDS)); + + SVN_ERR(svn_config_get_bool + (servers, &store_pp, SVN_CONFIG_SECTION_GLOBAL, + SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP, + store_pp)); + + SVN_ERR(svn_config_get_yes_no_ask + (servers, &store_pp_plaintext, + SVN_CONFIG_SECTION_GLOBAL, + SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, + SVN_CONFIG_DEFAULT_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT)); + + SVN_ERR(svn_config_get_bool + (servers, &store_auth_creds, SVN_CONFIG_SECTION_GLOBAL, + SVN_CONFIG_OPTION_STORE_AUTH_CREDS, + store_auth_creds)); + + /* Find out where we're about to connect to, and + * try to pick a server group based on the destination. */ + server_group = svn_config_find_group(servers, server_name, + SVN_CONFIG_SECTION_GROUPS, + scratch_pool); + + if (server_group) + { + /* Override global auth caching parameters with the ones + * for the server group, if any. */ + SVN_ERR(svn_config_get_bool(servers, &store_auth_creds, + server_group, + SVN_CONFIG_OPTION_STORE_AUTH_CREDS, + store_auth_creds)); + + SVN_ERR(svn_config_get_bool(servers, &store_passwords, + server_group, + SVN_CONFIG_OPTION_STORE_PASSWORDS, + store_passwords)); + + SVN_ERR(svn_config_get_yes_no_ask + (servers, &store_plaintext_passwords, server_group, + SVN_CONFIG_OPTION_STORE_PLAINTEXT_PASSWORDS, + store_plaintext_passwords)); + + SVN_ERR(svn_config_get_bool + (servers, &store_pp, + server_group, SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP, + store_pp)); + + SVN_ERR(svn_config_get_yes_no_ask + (servers, &store_pp_plaintext, server_group, + SVN_CONFIG_OPTION_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, + store_pp_plaintext)); + } + } + } + + /* Save auth caching parameters in the auth parameter hash. */ + if (! store_passwords) + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, ""); + + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_STORE_PLAINTEXT_PASSWORDS, + store_plaintext_passwords); + + if (! store_pp) + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_DONT_STORE_SSL_CLIENT_CERT_PP, + ""); + + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_STORE_SSL_CLIENT_CERT_PP_PLAINTEXT, + store_pp_plaintext); + + if (! store_auth_creds) + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_NO_AUTH_CACHE, ""); + + if (server_group) + svn_auth_set_parameter(auth_baton, + SVN_AUTH_PARAM_SERVER_GROUP, + apr_pstrdup(auth_baton->pool, server_group)); + + return SVN_NO_ERROR; +} Modified: subversion/branches/pin-externals/subversion/libsvn_subr/cache-membuffer.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_subr/cache-membuffer.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_subr/cache-membuffer.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_subr/cache-membuffer.c Sun Feb 8 03:10:25 2015 @@ -123,7 +123,7 @@ * Use a simple mutex on Windows. Because there is one mutex per segment, * large machines should (and usually can) be configured with large caches * such that read contention is kept low. This is basically the situation - * we head before 1.8. + * we had before 1.8. */ #ifdef WIN32 # define USE_SIMPLE_MUTEX 1 @@ -587,16 +587,15 @@ struct svn_membuffer_t */ apr_uint64_t total_hits; -#if APR_HAS_THREADS +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) /* A lock for intra-process synchronization to the cache, or NULL if * the cache's creator doesn't feel the cache needs to be * thread-safe. */ -# if USE_SIMPLE_MUTEX svn_mutex__t *lock; -# else +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) + /* Same for read-write lock. */ apr_thread_rwlock_t *lock; -# endif /* If set, write access will wait until they get exclusive access. * Otherwise, they will become no-ops if the segment is currently @@ -619,33 +618,32 @@ struct svn_membuffer_t static svn_error_t * read_lock_cache(svn_membuffer_t *cache) { -#if APR_HAS_THREADS -# if USE_SIMPLE_MUTEX +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) return svn_mutex__lock(cache->lock); -# else +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) if (cache->lock) { apr_status_t status = apr_thread_rwlock_rdlock(cache->lock); if (status) return svn_error_wrap_apr(status, _("Can't lock cache mutex")); } -# endif -#endif + + return SVN_NO_ERROR; +#else return SVN_NO_ERROR; +#endif } /* If locking is supported for CACHE, acquire a write lock for it. + * Set *SUCCESS to FALSE, if we couldn't acquire the write lock; + * leave it untouched otherwise. */ static svn_error_t * write_lock_cache(svn_membuffer_t *cache, svn_boolean_t *success) { -#if APR_HAS_THREADS -# if USE_SIMPLE_MUTEX - +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) return svn_mutex__lock(cache->lock); - -# else - +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) if (cache->lock) { apr_status_t status; @@ -668,9 +666,10 @@ write_lock_cache(svn_membuffer_t *cache, _("Can't write-lock cache mutex")); } -# endif -#endif return SVN_NO_ERROR; +#else + return SVN_NO_ERROR; +#endif } /* If locking is supported for CACHE, acquire an unconditional write lock @@ -679,36 +678,29 @@ write_lock_cache(svn_membuffer_t *cache, static svn_error_t * force_write_lock_cache(svn_membuffer_t *cache) { -#if APR_HAS_THREADS -# if USE_SIMPLE_MUTEX - +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) return svn_mutex__lock(cache->lock); - -# else - +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) apr_status_t status = apr_thread_rwlock_wrlock(cache->lock); if (status) return svn_error_wrap_apr(status, _("Can't write-lock cache mutex")); -# endif -#endif return SVN_NO_ERROR; +#else + return SVN_NO_ERROR; +#endif } /* If locking is supported for CACHE, release the current lock - * (read or write). + * (read or write). Return ERR upon success. */ static svn_error_t * unlock_cache(svn_membuffer_t *cache, svn_error_t *err) { -#if APR_HAS_THREADS -# if USE_SIMPLE_MUTEX - +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) return svn_mutex__unlock(cache->lock, err); - -# else - +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) if (cache->lock) { apr_status_t status = apr_thread_rwlock_unlock(cache->lock); @@ -719,13 +711,14 @@ unlock_cache(svn_membuffer_t *cache, svn return svn_error_wrap_apr(status, _("Can't unlock cache mutex")); } -# endif -#endif return err; +#else + return err; +#endif } -/* If supported, guard the execution of EXPR with a read lock to cache. - * Macro has been modeled after SVN_MUTEX__WITH_LOCK. +/* If supported, guard the execution of EXPR with a read lock to CACHE. + * The macro has been modeled after SVN_MUTEX__WITH_LOCK. */ #define WITH_READ_LOCK(cache, expr) \ do { \ @@ -733,8 +726,8 @@ do { SVN_ERR(unlock_cache(cache, (expr))); \ } while (0) -/* If supported, guard the execution of EXPR with a write lock to cache. - * Macro has been modeled after SVN_MUTEX__WITH_LOCK. +/* If supported, guard the execution of EXPR with a write lock to CACHE. + * The macro has been modeled after SVN_MUTEX__WITH_LOCK. * * The write lock process is complicated if we don't allow to wait for * the lock: If we didn't get the lock, we may still need to remove an @@ -1797,17 +1790,14 @@ svn_cache__membuffer_cache_create(svn_me return svn_error_wrap_apr(APR_ENOMEM, "OOM"); } -#if APR_HAS_THREADS +#if (APR_HAS_THREADS && USE_SIMPLE_MUTEX) /* A lock for intra-process synchronization to the cache, or NULL if * the cache's creator doesn't feel the cache needs to be * thread-safe. */ -# if USE_SIMPLE_MUTEX - SVN_ERR(svn_mutex__init(&c[seg].lock, thread_safe, pool)); - -# else - +#elif (APR_HAS_THREADS && !USE_SIMPLE_MUTEX) + /* Same for read-write lock. */ c[seg].lock = NULL; if (thread_safe) { @@ -1817,8 +1807,6 @@ svn_cache__membuffer_cache_create(svn_me return svn_error_wrap_apr(status, _("Can't create cache mutex")); } -# endif - /* Select the behavior of write operations. */ c[seg].allow_blocking_writes = allow_blocking_writes; Modified: subversion/branches/pin-externals/subversion/libsvn_subr/io.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_subr/io.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_subr/io.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_subr/io.c Sun Feb 8 03:10:25 2015 @@ -352,6 +352,25 @@ file_open(apr_file_t **f, if (retry_on_failure) { +#ifdef WIN32 + if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED)) + { + if ((flag & (APR_CREATE | APR_EXCL)) == (APR_CREATE | APR_EXCL)) + return status; /* Can't create if there is something */ + + if (flag & (APR_WRITE | APR_CREATE)) + { + apr_finfo_t finfo; + + if (!apr_stat(&finfo, fname_apr, SVN__APR_FINFO_READONLY, pool)) + { + if (finfo.protection & APR_FREADONLY) + return status; /* Retrying won't fix this */ + } + } + } +#endif + WIN32_RETRY_LOOP(status, apr_file_open(f, fname_apr, flag, perm, pool)); } return status; Modified: subversion/branches/pin-externals/subversion/libsvn_subr/string.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_subr/string.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_subr/string.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_subr/string.c Sun Feb 8 03:10:25 2015 @@ -301,8 +301,9 @@ svn_string_isempty(const svn_string_t *s svn_string_t * svn_string_dup(const svn_string_t *original_string, apr_pool_t *pool) { - return (svn_string_ncreate(original_string->data, - original_string->len, pool)); + return (original_string ? svn_string_ncreate(original_string->data, + original_string->len, pool) + : NULL); } Modified: subversion/branches/pin-externals/subversion/libsvn_wc/copy.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_wc/copy.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_wc/copy.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_wc/copy.c Sun Feb 8 03:10:25 2015 @@ -42,6 +42,7 @@ #include "svn_private_config.h" #include "private/svn_wc_private.h" +/* #define RECORD_MIXED_MOVE */ /*** Code. ***/ @@ -567,10 +568,10 @@ copy_versioned_dir(svn_wc__db_t *db, * The additional parameter IS_MOVE indicates whether this is a copy or * a move operation. * - * If MOVE_DEGRADED_TO_COPY is not NULL and a move had to be degraded - * to a copy, then set *MOVE_DEGRADED_TO_COPY. */ + * If RECORD_MOVE_ON_DELETE is not NULL and a move had to be degraded + * to a copy, then set *RECORD_MOVE_ON_DELETE to FALSE. */ static svn_error_t * -copy_or_move(svn_boolean_t *move_degraded_to_copy, +copy_or_move(svn_boolean_t *record_move_on_delete, svn_wc_context_t *wc_ctx, const char *src_abspath, const char *dst_abspath, @@ -820,8 +821,8 @@ copy_or_move(svn_boolean_t *move_degrade if (is_move && !within_one_wc) { - if (move_degraded_to_copy) - *move_degraded_to_copy = TRUE; + if (record_move_on_delete) + *record_move_on_delete = FALSE; is_move = FALSE; } @@ -865,9 +866,11 @@ copy_or_move(svn_boolean_t *move_degrade scratch_pool), min_rev, max_rev); +#ifndef RECORD_MIXED_MOVE is_move = FALSE; - if (move_degraded_to_copy) - *move_degraded_to_copy = TRUE; + if (record_move_on_delete) + *record_move_on_delete = FALSE; +#endif } } @@ -1054,7 +1057,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx, apr_pool_t *scratch_pool) { svn_wc__db_t *db = wc_ctx->db; - svn_boolean_t move_degraded_to_copy = FALSE; + svn_boolean_t record_on_delete = TRUE; svn_node_kind_t kind; svn_boolean_t conflicted; @@ -1066,7 +1069,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx, svn_dirent_dirname(dst_abspath, scratch_pool), scratch_pool)); - SVN_ERR(copy_or_move(&move_degraded_to_copy, + SVN_ERR(copy_or_move(&record_on_delete, wc_ctx, src_abspath, dst_abspath, TRUE /* metadata_only */, TRUE /* is_move */, @@ -1109,7 +1112,7 @@ svn_wc__move2(svn_wc_context_t *wc_ctx, scratch_pool)); SVN_ERR(svn_wc__db_op_delete(db, src_abspath, - move_degraded_to_copy ? NULL : dst_abspath, + record_on_delete ? dst_abspath : NULL, TRUE /* delete_dir_externals */, NULL /* conflict */, NULL /* work_items */, cancel_func, cancel_baton, Modified: subversion/branches/pin-externals/subversion/libsvn_wc/diff_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_wc/diff_editor.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_wc/diff_editor.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_wc/diff_editor.c Sun Feb 8 03:10:25 2015 @@ -2192,7 +2192,7 @@ change_file_prop(void *file_baton, propchange = apr_array_push(fb->propchanges); propchange->name = apr_pstrdup(fb->pool, name); - propchange->value = value ? svn_string_dup(value, fb->pool) : NULL; + propchange->value = svn_string_dup(value, fb->pool); return SVN_NO_ERROR; } @@ -2217,7 +2217,7 @@ change_dir_prop(void *dir_baton, propchange = apr_array_push(db->propchanges); propchange->name = apr_pstrdup(db->pool, name); - propchange->value = value ? svn_string_dup(value, db->pool) : NULL; + propchange->value = svn_string_dup(value, db->pool); return SVN_NO_ERROR; } Modified: subversion/branches/pin-externals/subversion/libsvn_wc/externals.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_wc/externals.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_wc/externals.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_wc/externals.c Sun Feb 8 03:10:25 2015 @@ -659,7 +659,7 @@ change_file_prop(void *file_baton, propchange = apr_array_push(eb->propchanges); propchange->name = apr_pstrdup(eb->pool, name); - propchange->value = value ? svn_string_dup(value, eb->pool) : NULL; + propchange->value = svn_string_dup(value, eb->pool); return SVN_NO_ERROR; } Modified: subversion/branches/pin-externals/subversion/libsvn_wc/props.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_wc/props.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_wc/props.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_wc/props.c Sun Feb 8 03:10:25 2015 @@ -1272,7 +1272,7 @@ svn_wc__merge_props(svn_skel_t **conflic svn_pool_clear(iterpool); - to_val = to_val ? svn_string_dup(to_val, result_pool) : NULL; + to_val = svn_string_dup(to_val, result_pool); svn_hash_sets(their_props, propname, to_val); Modified: subversion/branches/pin-externals/subversion/libsvn_wc/update_editor.c URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_wc/update_editor.c?rev=1658128&r1=1658127&r2=1658128&view=diff ============================================================================== --- subversion/branches/pin-externals/subversion/libsvn_wc/update_editor.c (original) +++ subversion/branches/pin-externals/subversion/libsvn_wc/update_editor.c Sun Feb 8 03:10:25 2015 @@ -2112,13 +2112,12 @@ add_directory(const char *path, if (tree_conflict) { svn_wc_conflict_reason_t reason; + const char *move_src_op_root_abspath; /* So this deletion wasn't just a deletion, it is actually a replacement. Let's install a better tree conflict. */ - /* ### Should store the conflict in DB to allow reinstalling - ### with theoretically more data in close_directory() */ - - SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, NULL, + SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, + &move_src_op_root_abspath, eb->db, db->local_abspath, tree_conflict, @@ -2130,7 +2129,7 @@ add_directory(const char *path, tree_conflict, eb->db, db->local_abspath, reason, svn_wc_conflict_action_replace, - NULL, + move_src_op_root_abspath, db->pool, scratch_pool)); /* And now stop checking for conflicts here and just perform @@ -2489,7 +2488,7 @@ change_dir_prop(void *dir_baton, propchange = apr_array_push(db->propchanges); propchange->name = apr_pstrdup(db->pool, name); - propchange->value = value ? svn_string_dup(value, db->pool) : NULL; + propchange->value = svn_string_dup(value, db->pool); if (!db->edited && svn_property_kind2(name) == svn_prop_regular_kind) SVN_ERR(mark_directory_edited(db, pool)); @@ -3287,13 +3286,12 @@ add_file(const char *path, if (tree_conflict) { svn_wc_conflict_reason_t reason; + const char *move_src_op_root_abspath; /* So this deletion wasn't just a deletion, it is actually a replacement. Let's install a better tree conflict. */ - /* ### Should store the conflict in DB to allow reinstalling - ### with theoretically more data in close_directory() */ - - SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, NULL, + SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, NULL, + &move_src_op_root_abspath, eb->db, fb->local_abspath, tree_conflict, @@ -3305,7 +3303,7 @@ add_file(const char *path, tree_conflict, eb->db, fb->local_abspath, reason, svn_wc_conflict_action_replace, - NULL, + move_src_op_root_abspath, fb->pool, fb->pool)); /* And now stop checking for conflicts here and just perform @@ -3805,7 +3803,7 @@ change_file_prop(void *file_baton, /* Push a new propchange to the file baton's array of propchanges */ propchange = apr_array_push(fb->propchanges); propchange->name = apr_pstrdup(fb->pool, name); - propchange->value = value ? svn_string_dup(value, fb->pool) : NULL; + propchange->value = svn_string_dup(value, fb->pool); if (!fb->edited && svn_property_kind2(name) == svn_prop_regular_kind) SVN_ERR(mark_file_edited(fb, scratch_pool));
