Author: kotkov
Date: Wed Mar 22 15:21:11 2023
New Revision: 1908640
URL: http://svn.apache.org/viewvc?rev=1908640&view=rev
Log:
On the 'pristine-checksum-salt' branch: Use a dynamically salted SHA-1 checksum
in the working copy. The dynamic salt is generated during the creation of
the wc.db.
This changeset introduces a couple of new entities: svn_wc_checksum_kind_t
and the more low-level svn_wc__db_checksum_kind_t and svn_wc__db_checksum_t.
They can be viewed as the augmented versions of our existing checksum objects
that also carry the information about a checksum salt. These new entities are
used as a drop-in replacement for the existing checksum objects on the various
layers of libsvn_wc. This allows us to transition into a state where the
pristine checksums use a dynamically generated salt.
* subversion/libsvn_wc/wc-metadata.sql
(STMT_UPGRADE_TO_33): Add the 'pristine_checksum_use_salt' column to the
SETTINGS table. Add the GLOBAL_SETTINGS table, currently containing one
entry with the salt value used for this wc.db.
(STMT_UPGRADE_33_INSERT_GLOBAL_SETTINGS): New.
* subversion/libsvn_wc/wc-queries.sql
(STMT_SELECT_SETTINGS): Return the new `pristine_checksum_use_salt` value.
Return the salt value from GLOBAL_SETTINGS.
(STMT_UPSERT_SETTINGS): Allow changing the new `pristine_checksum_use_salt`
value.
* subversion/include/svn_wc.h
(struct svn_wc_checksum_kind_t,
svn_wc_checksum_kind_create,
svn_wc_checksum_kind_dup): New.
(struct svn_wc_info_t): Use the new checksum kind object to store the
information about a pristine checksum kind.
* subversion/include/private/svn_wc_private.h
(svn_wc__get_settings): Use the new checksum kind object to return the
information about a pristine checksum kind.
* subversion/libsvn_wc/wc_db.h
(struct svn_wc__db_checksum_kind_t,
svn_wc__db_checksum_kind_make,
svn_wc__db_checksum_kind_dup,
struct svn_wc__db_checksum_t,
svn_wc__db_checksum_make,
svn_wc__db_checksum_dup,
svn_wc__db_checksum_match,
svn_wc__db_checksum_stream,
svn_wc__db_checksum_stream_contents): New.
(svn_wc__db_init,
svn_wc__db_upgrade_begin): Accept a new `pristine_checksum_use_salt`
argument.
(svn_wc__db_get_settings): Use the new checksum kind object to return the
information about a pristine checksum kind.
(svn_wc__db_base_add_file,
svn_wc__db_base_get_info,
svn_wc__db_pristine_get_future_path,
svn_wc__db_pristine_read,
svn_wc__db_pristine_prepare_install,
svn_wc__db_pristine_install,
svn_wc__db_pristine_get_md5,
svn_wc__db_pristine_lookup_by_md5,
svn_wc__db_pristine_remove,
svn_wc__db_pristine_check,
svn_wc__db_pristine_dehydrate,
svn_wc__db_external_add_file,
svn_wc__db_commit_queue_add,
svn_wc__db_op_copy_file,
svn_wc__db_read_info,
svn_wc__db_read_pristine_info,
svn_wc__db_read_node_install_info,
svn_wc__db_global_commit,
svn_wc__db_global_update,
svn_wc__db_textbase_walk_cb_t): Use the new checksum object.
(svn_wc__db_op_copy): Accept a new optional `new_checksum` argument
indicating that the target should use the specified checksum.
* subversion/libsvn_wc/wc_db_private.h
(struct svn_wc__db_wcroot_t): Use the new checkum kind object for a pristine
checksum kind.
(enum svn_wc__db_pristine_checksum_kind_t): Remove the no longer required
`svn_wc__db_pristine_checksum_sha1_salted` value.
(svn_wc__db_pdh_create_wcroot): Use the new checksum kind object.
(svn_wc__db_util_read_settings,
svn_wc__db_util_column_wc_checksum,
svn_wc__db_util_bind_wc_checksum): New.
(svn_wc__db_read_info_internal,
svn_wc__db_base_get_info_internal,
svn_wc__db_depth_get_info,
svn_wc__db_pristine_prepare_install_internal,
svn_wc__db_pristine_dehydrate_internal): Use the new checksum object.
* subversion/libsvn_wc/wc.h
(SVN_WC__HAS_PRISTINE_CHECKSUM_SHA1_SALTED): Remove.
(SVN_WC__HAS_PRISTINE_CHECKSUM_SALT): New.
(svn_wc__perform_file_merge,
svn_wc__internal_transmit_text_deltas): Use the new checksum object.
* subversion/libsvn_wc/textbase.h
(svn_wc__textbase_get_contents,
svn_wc__textbase_setaside,
svn_wc__textbase_setaside_wq,
svn_wc__textbase_prepare_install): Use the new checksum object.
* subversion/libsvn_wc/adm_crawler.c
(maybe_restore_node, svn_wc_restore2, svn_wc__internal_transmit_text_deltas):
Use the new checksum object.
(read_and_checksum_pristine_text): Use the new checksum object. Adjust the
MD5 checksum lookup.
(svn_wc_transmit_text_deltas4): Convert between the new and old checksum
objects.
* subversion/libsvn_wc/adm_files.c
(init_adm): Accept a new `pristine_checksum_use_salt` argument.
(svn_wc__internal_ensure_adm): Determine appropriate checksum salt settings.
Adjust call to svn_wc__db_get_settings().
* subversion/libsvn_wc/adm_ops.c
(): Include svn_string_private.h.
(svn_wc_queue_committed4): Convert between the new and old checksum objects.
(svn_wc_process_committed_queue2): Use the new checksum object.
(struct get_pristine_lazyopen_baton_t,
get_pristine_lazyopen_func,
svn_wc__get_pristine_contents_by_checksum): Retrofit the existing logic
onto the new checksum objects.
* subversion/libsvn_wc/checksum.c: New file.
* subversion/libsvn_wc/conflicts.c
(svn_wc_resolved_conflict5): Adjust call to svn_wc__db_get_settings().
* subversion/libsvn_wc/copy.c
(copy_versioned_file, copy_versioned_dir): Handle cases where we need
to pass a new checksum for the copied node.
* subversion/libsvn_wc/deprecated.c
(svn_wc_crawl_revisions5,
svn_wc_transmit_text_deltas3,
svn_wc_restore,
svn_wc_get_pristine_contents2,
svn_wc_revert6,
svn_wc_get_diff_editor6,
svn_wc_diff6,
svn_wc_get_status_editor5,
svn_wc_get_update_editor4,
svn_wc_get_switch_editor4,
svn_wc_merge5): Adjust calls to svn_wc__db_get_settings().
(svn_wc_queue_committed2,
svn_wc_process_committed4): Convert between the new and old checksum objects.
* subversion/libsvn_wc/diff_editor.c
(struct file_baton_t,
svn_wc__diff_base_working_diff,
svn_wc__diff_local_only_file,
svn_wc__diff_base_only_file): Use the new checksum object.
(close_file): Use the new checksum object. Adjust the MD5 checksum lookup.
* subversion/libsvn_wc/entries.c
(get_info_for_deleted): Use the new checksum object.
(read_one_entry): Use the new checksum object. Adjust the MD5 checksum
lookup.
* subversion/libsvn_wc/externals.c
(struct edit_baton): Use the new checksum object.
(apply_textdelta, close_file): Use the new checksum object. Adjust the MD5
checksum lookup.
* subversion/libsvn_wc/info.c
(svn_wc_info_dup): Duplicate the `pristine_checksum_kind` field.
(build_info_for_node): Adjust to use the new checksum and checksum kind
objects.
(svn_wc__get_settings): Convert between two checksum kind objects.
* subversion/libsvn_wc/node.c
(svn_wc__node_get_md5): Use the current salt value for the checksum.
* subversion/libsvn_wc/questions.c
(compare_and_verify, svn_wc__internal_file_modified_p): Use the new checksum
object.
* subversion/libsvn_wc/textbase.c
(compare_and_verify, check_file_modified, open_textbase,
svn_wc__textbase_get_contents, svn_wc__textbase_setaside,
svn_wc__textbase_setaside_wq, svn_wc__textbase_prepare_install):
Use the new checksum object.
(svn_wc_textbase_sync): Adjust call to svn_wc__db_get_settings().
* subversion/libsvn_wc/update_editor.c
(struct handler_baton, struct file_baton, svn_wc__perform_file_merge):
Use the new checksum object.
(window_handler): Use the new checksum object. Adjust the MD5 checksum
lookup.
* subversion/libsvn_wc/upgrade.c
(): Include svn_string_private.h.
(migrate_text_bases): Use the new checksum object.
(bump_to_33): Generate a new random salt when upgrading.
(svn_wc__upgrade): Adjust call to svn_wc__db_upgrade_begin().
* subversion/libsvn_wc/util.c
(svn_wc__fetch_base_func): Use the new checksum object.
* subversion/libsvn_wc/wc_db.c
(struct insert_base_baton_t,
struct insert_working_baton_t,
struct insert_external_baton_t,
insert_base_node,
insert_working_node,
read_info): Use the new checksum object.
(create_db): Accept the new `pristine_checksum_use_salt` argument.
(init_db): Accept the new `pristine_checksum_use_salt` argument. Use it when
writing the initial settings. Adjust the code that sets a pristine checksum
kind.
(svn_wc__db_init): Accept the new `pristine_checksum_use_salt` argument.
Fetch the resulting checksum kind information.
(svn_wc__db_get_settings): Use the new checksum kind object to return the
information about a pristine checksum kind.
(svn_wc__db_base_add_file,
svn_wc__db_base_get_info_internal,
svn_wc__db_base_get_info,
svn_wc__db_depth_get_info,
svn_wc__db_external_add_file,
svn_wc__db_op_copy_file,
svn_wc__db_read_info_internal,
svn_wc__db_read_info,
read_single_info,
svn_wc__db_read_pristine_info,
svn_wc__db_read_node_install_info,
svn_wc__db_global_commit,
svn_wc__db_global_update,
struct commit_queue_item_t,
svn_wc__db_commit_queue_add,
process_committed_leaf,
process_committed_internal): Use the new checksum object.
(struct op_copy_baton, cross_db_copy, db_op_copy, op_copy_txn,
svn_wc__db_op_copy): Handle the introduced `new_checksum` argument.
(svn_wc__db_upgrade_begin): Handle the introduced `pristine_checksum_use_salt`
argument. Fetch the resulting checksum kind information.
* subversion/libsvn_wc/wc_db_checksum.c: New file.
* subversion/libsvn_wc/wc_db_pristine.c
(get_pristine_fname): Use the new checksum object. Generate the subdir
prefix based on it.
(svn_wc__db_pristine_get_future_path,
stmt_select_pristine,
pristine_read_txn,
svn_wc__db_pristine_read,
pristine_install_txn,
svn_wc__db_pristine_prepare_install,
svn_wc__db_pristine_prepare_install_internal,
svn_wc__db_pristine_install,
svn_wc__db_pristine_get_md5,
svn_wc__db_pristine_lookup_by_md5,
pristine_remove_if_unreferenced_txn,
pristine_remove_if_unreferenced,
pristine_cleanup_wcroot,
svn_wc__db_pristine_dehydrate,
svn_wc__db_pristine_dehydrate_internal): Use the new checksum object.
(svn_wc__db_pristine_remove): Use the new checksum object. Remove the
transitional MD5 lookup. This function is not used anywhere except the
tests and in those tests we have an appropriate wc checksum.
(svn_wc__db_pristine_check): Use the new checksum object. Only lookup
in the db if we have a matching checksum kind and salt.
* subversion/libsvn_wc/wc_db_textbase.c
(svn_wc__db_textbase_walk,
textbase_hydrate,
svn_wc__db_textbase_sync): Use the new checksum object.
* subversion/libsvn_wc/wc_db_update_move.c
(tc_editor_add_file,
tc_editor_incoming_add_file,
struct working_node_version_t,
tc_editor_alter_file,
tc_editor_update_incoming_moved_file,
get_info,
update_moved_away_node,
get_working_info,
update_incoming_moved_node,
tc_editor_update_add_new_file): Use the new checksum object.
(tc_editor_update_add_merge_files): Use the new checksum object.
Use svn_wc__db_checksum_stream_contents() instead of svn_io_file_checksum2().
* subversion/libsvn_wc/wc_db_util.c
(): Include svn_string_private.h.
(svn_wc__db_util_column_wc_checksum,
svn_wc__db_util_bind_wc_checksum): New utility functions.
(svn_wc__db_util_read_settings): New function, based on …
* subversion/libsvn_wc/wc_db_wcroot.c
(read_settings): …this function, which is now removed.
(fetch_sdb_info,
svn_wc__db_pdh_create_wcroot,
svn_wc__db_wcroot_parse_local_abspath): Use the new checksum kind object.
* subversion/libsvn_wc/workqueue.c
(run_file_install): Use the new checksum object.
* subversion/libsvn_client/checkout.c
(svn_client__checkout_internal): Adjust call to svn_wc__get_settings().
* subversion/svn/info-cmd.c
(print_info): Adjust the code that outputs the working copy checksum kind.
* subversion/tests/cmdline/svntest/wc.py
(text_base_path): The new subdir prefix for a salted checksum is `ssha1-`.
* subversion/tests/libsvn_client/client-test.c
(test_wc_add_scenarios): Adjust call to svn_wc__get_settings().
* subversion/tests/libsvn_wc/db-test.c
(test_getting_info, test_inserting_nodes, test_working_info,
test_externals_store): Use the new checksum object.
* subversion/tests/libsvn_wc/pristine-store-test.c
(pristine_write_read, pristine_delete_while_open, reject_mismatching_text,
pristine_install_dehydrated, pristine_dehydrate): Use the new checksum
object. Adjust calls to svn_wc__db_get_settings().
* subversion/tests/libsvn_wc/wc-test.c
(test_get_pristine_copy_path): Adjust call to svn_wc__db_get_settings().
Added:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/checksum.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_checksum.c
Modified:
subversion/branches/pristine-checksum-salt/subversion/include/private/svn_wc_private.h
subversion/branches/pristine-checksum-salt/subversion/include/svn_wc.h
subversion/branches/pristine-checksum-salt/subversion/libsvn_client/checkout.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_crawler.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_files.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_ops.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/conflicts.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/copy.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/deprecated.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/diff_editor.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/entries.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/externals.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/info.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/node.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/questions.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.h
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/update_editor.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/upgrade.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/util.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-metadata.sql
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-queries.sql
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc.h
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.h
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_pristine.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_private.h
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_textbase.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_update_move.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_util.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_wcroot.c
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/workqueue.c
subversion/branches/pristine-checksum-salt/subversion/svn/info-cmd.c
subversion/branches/pristine-checksum-salt/subversion/tests/cmdline/svntest/wc.py
subversion/branches/pristine-checksum-salt/subversion/tests/libsvn_client/client-test.c
subversion/branches/pristine-checksum-salt/subversion/tests/libsvn_wc/db-test.c
subversion/branches/pristine-checksum-salt/subversion/tests/libsvn_wc/pristine-store-test.c
subversion/branches/pristine-checksum-salt/subversion/tests/libsvn_wc/wc-test.c
Modified:
subversion/branches/pristine-checksum-salt/subversion/include/private/svn_wc_private.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/include/private/svn_wc_private.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/include/private/svn_wc_private.h
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/include/private/svn_wc_private.h
Wed Mar 22 15:21:11 2023
@@ -2336,9 +2336,10 @@ svn_wc__upgrade(int *result_format_p,
svn_error_t *
svn_wc__get_settings(int *format_p,
svn_boolean_t *store_pristine_p,
- svn_checksum_kind_t *pristine_checksum_kind_p,
+ const svn_wc_checksum_kind_t **pristine_checksum_kind_p,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
#ifdef __cplusplus
Modified: subversion/branches/pristine-checksum-salt/subversion/include/svn_wc.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/include/svn_wc.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/include/svn_wc.h
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/include/svn_wc.h Wed
Mar 22 15:21:11 2023
@@ -3251,6 +3251,49 @@ svn_wc_entry_dup(const svn_wc_entry_t *e
/**
+ * This struct contains information about a checksum kind used by
+ * the working copy.
+ *
+ * @note Fields may be added to the end of this structure in future
+ * versions. Therefore, users shouldn't allocate structures of this
+ * type, to preserve binary compatibility.
+ *
+ * @since New in 1.15.
+ */
+typedef struct svn_wc_checksum_kind_t
+{
+ /** The type of checksum. */
+ svn_checksum_kind_t value;
+
+ /** The additional salt used for the checksummed data. */
+ const svn_string_t *salt;
+} svn_wc_checksum_kind_t;
+
+/**
+ * Create a new #svn_wc_checksum_kind_t structure, where the structure
+ * itself all its properties will be allocated from @a result_pool.
+ * @a salt doesn't need to have a specific lifetime, because it will
+ * be copied by the function internally.
+ *
+ * @since New in 1.15.
+ */
+svn_wc_checksum_kind_t *
+svn_wc_checksum_kind_create(svn_checksum_kind_t value,
+ const svn_string_t *salt,
+ apr_pool_t *result_pool);
+
+/**
+ * Return a duplicate of @a kind, allocated in @a result_pool.
+ * No part of the new structure will be shared with @a kind.
+ * If @a kind is @c NULL then @c NULL is returned.
+ *
+ * @since New in 1.15.
+ */
+svn_wc_checksum_kind_t *
+svn_wc_checksum_kind_dup(const svn_wc_checksum_kind_t *kind,
+ apr_pool_t *result_pool);
+
+/**
* This struct contains information about a working copy node.
*
* @note Fields may be added to the end of this structure in future
@@ -3325,7 +3368,7 @@ typedef struct svn_wc_info_t
* Checksum kind used for the pristine content.
* @since New in 1.15.
*/
- svn_checksum_kind_t pristine_checksum_kind;
+ const svn_wc_checksum_kind_t *pristine_checksum_kind;
} svn_wc_info_t;
/**
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_client/checkout.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_client/checkout.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/libsvn_client/checkout.c
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/libsvn_client/checkout.c
Wed Mar 22 15:21:11 2023
@@ -227,8 +227,8 @@ svn_client__checkout_internal(svn_revnum
{
svn_boolean_t wc_store_pristine;
- SVN_ERR(svn_wc__get_settings(NULL, &wc_store_pristine, NULL,
- ctx->wc_ctx, local_abspath,
scratch_pool));
+ SVN_ERR(svn_wc__get_settings(NULL, &wc_store_pristine, NULL,
ctx->wc_ctx,
+ local_abspath, NULL, scratch_pool));
if ((target_store_pristine && !wc_store_pristine) ||
(!target_store_pristine && wc_store_pristine))
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_crawler.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_crawler.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_crawler.c
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_crawler.c
Wed Mar 22 15:21:11 2023
@@ -173,7 +173,7 @@ maybe_restore_node(svn_wc__db_t *db,
svn_error_t *err;
svn_wc__db_status_t wrk_status;
svn_node_kind_t wrk_kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
svn_boolean_t conflicted;
err = svn_wc__db_read_info(&wrk_status, &wrk_kind, NULL, NULL, NULL,
@@ -230,7 +230,7 @@ svn_wc_restore2(svn_wc_context_t *wc_ctx
svn_wc__db_status_t status;
svn_node_kind_t kind;
svn_node_kind_t disk_kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
SVN_ERR(svn_io_check_path(local_abspath, &disk_kind, scratch_pool));
@@ -999,24 +999,23 @@ read_and_checksum_pristine_text(svn_stre
}
else
{
+ const svn_wc__db_checksum_t *checksum;
const svn_checksum_t *expected_md5;
SVN_ERR(svn_wc__db_read_info(NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, &expected_md5,
+ NULL, NULL, NULL, NULL, &checksum,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL,
db, local_abspath,
result_pool, scratch_pool));
- if (expected_md5 == NULL)
+ if (checksum->value == NULL)
return svn_error_createf(SVN_ERR_WC_CORRUPT, NULL,
_("Pristine checksum for file '%s' is
missing"),
svn_dirent_local_style(local_abspath,
scratch_pool));
- if (expected_md5->kind != svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_get_md5(&expected_md5, db, local_abspath,
- expected_md5,
- result_pool, scratch_pool));
+ SVN_ERR(svn_wc__db_pristine_get_md5(&expected_md5, db, local_abspath,
+ checksum, result_pool,
scratch_pool));
*expected_md5_checksum = expected_md5;
/* Arrange to set ACTUAL_MD5_CHECKSUM to the MD5 of what is *actually*
@@ -1063,7 +1062,7 @@ open_txdelta_stream(svn_txdelta_stream_t
svn_error_t *
svn_wc__internal_transmit_text_deltas(svn_stream_t *tempstream,
const svn_checksum_t
**new_text_base_md5_checksum,
- const svn_checksum_t
**new_text_base_checksum,
+ const svn_wc__db_checksum_t
**new_text_base_checksum,
svn_wc__db_t *db,
const char *local_abspath,
svn_boolean_t fulltext,
@@ -1075,7 +1074,7 @@ svn_wc__internal_transmit_text_deltas(sv
const svn_checksum_t *expected_md5_checksum; /* recorded MD5 of BASE_S. */
svn_checksum_t *verify_md5_checksum; /* calc'd MD5 of BASE_STREAM */
svn_checksum_t *local_md5_checksum; /* calc'd MD5 of LOCAL_STREAM */
- svn_checksum_t *local_checksum; /* calc'd checksum of LOCAL_STREAM */
+ svn_wc__db_checksum_t *local_checksum; /* calc'd checksum of LOCAL_STREAM */
svn_wc__db_install_data_t *install_data = NULL;
svn_error_t *err;
svn_error_t *err2;
@@ -1236,8 +1235,8 @@ svn_wc__internal_transmit_text_deltas(sv
local_checksum,
local_md5_checksum,
scratch_pool));
- *new_text_base_checksum = svn_checksum_dup(local_checksum,
- result_pool);
+ *new_text_base_checksum = svn_wc__db_checksum_dup(local_checksum,
+ result_pool);
}
/* Close the file baton, and get outta here. */
@@ -1259,13 +1258,20 @@ svn_wc_transmit_text_deltas4(const svn_c
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- return svn_wc__internal_transmit_text_deltas(NULL,
- new_text_base_md5_checksum,
- new_text_base_sha1_checksum,
- wc_ctx->db, local_abspath,
- fulltext, editor,
- file_baton, result_pool,
- scratch_pool);
+ const svn_wc__db_checksum_t *new_checksum = NULL;
+
+ SVN_ERR(svn_wc__internal_transmit_text_deltas(
+ NULL,
+ new_text_base_md5_checksum,
+ new_text_base_sha1_checksum ? &new_checksum : NULL,
+ wc_ctx->db, local_abspath,
+ fulltext, editor, file_baton,
+ result_pool, scratch_pool));
+
+ if (new_text_base_sha1_checksum)
+ *new_text_base_sha1_checksum = new_checksum->value;
+
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_files.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_files.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_files.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_files.c
Wed Mar 22 15:21:11 2023
@@ -209,6 +209,7 @@ init_adm(svn_wc__db_t *db,
svn_depth_t depth,
svn_boolean_t store_pristine,
svn_checksum_kind_t pristine_checksum_kind,
+ svn_boolean_t pristine_checksum_use_salt,
apr_pool_t *pool)
{
/* First, make an empty administrative area. */
@@ -231,7 +232,8 @@ init_adm(svn_wc__db_t *db,
SVN_ERR(svn_wc__db_init(db, target_format, local_abspath,
repos_relpath, repos_root_url, repos_uuid,
initial_rev, depth, store_pristine,
- pristine_checksum_kind, pool));
+ pristine_checksum_kind,
+ pristine_checksum_use_salt, pool));
/* Stamp ENTRIES and FORMAT files for old clients. */
SVN_ERR(svn_io_file_create(svn_wc__adm_child(local_abspath,
@@ -303,23 +305,28 @@ svn_wc__internal_ensure_adm(svn_wc__db_t
if (present_format == 0)
{
svn_checksum_kind_t pristine_checksum_kind;
+ svn_boolean_t pristine_checksum_use_salt;
- if (target_format >= SVN_WC__HAS_PRISTINE_CHECKSUM_SHA1_SALTED)
+ pristine_checksum_kind = svn_checksum_sha1;
+
+ if (target_format >= SVN_WC__HAS_PRISTINE_CHECKSUM_SALT)
{
- /* The format of a working copy is new enough to support checksum
- kinds other than plain SHA-1. */
- pristine_checksum_kind = svn_checksum_sha1_salted;
+ /* The format of a working copy is new enough to support using salted
+ pristine checksums, so enable them. */
+ pristine_checksum_use_salt = TRUE;
}
else
{
- /* Compatibility: use plain SHA-1. */
- pristine_checksum_kind = svn_checksum_sha1;
+ /* Compatibility: don't use the pristine checksum salt. */
+ pristine_checksum_use_salt = FALSE;
}
return svn_error_trace(init_adm(db, target_format, local_abspath,
repos_relpath, repos_root_url,
repos_uuid,
revision, depth, store_pristine,
- pristine_checksum_kind, scratch_pool));
+ pristine_checksum_kind,
+ pristine_checksum_use_salt,
+ scratch_pool));
}
else if (present_format != target_format)
{
@@ -331,7 +338,7 @@ svn_wc__internal_ensure_adm(svn_wc__db_t
}
SVN_ERR(svn_wc__db_get_settings(NULL, &wc_store_pristine, NULL, db,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if ((store_pristine && !wc_store_pristine) ||
(!store_pristine && wc_store_pristine))
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_ops.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_ops.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_ops.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/adm_ops.c
Wed Mar 22 15:21:11 2023
@@ -58,6 +58,7 @@
#include "private/svn_dep_compat.h"
#include "private/svn_sorts_private.h"
#include "private/svn_subr_private.h"
+#include "private/svn_string_private.h"
struct svn_wc_committed_queue_t
@@ -140,6 +141,7 @@ svn_wc_queue_committed4(svn_wc_committed
{
const char *wcroot_abspath;
svn_wc__db_commit_queue_t *db_queue;
+ const svn_wc__db_checksum_t *pristine_checksum;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
@@ -163,10 +165,28 @@ svn_wc_queue_committed4(svn_wc_committed
svn_hash_sets(queue->wc_queues, wcroot_abspath, db_queue);
}
+ if (checksum)
+ {
+ const svn_wc__db_checksum_kind_t *pristine_checksum_kind;
+
+ SVN_ERR(svn_wc__db_get_settings(NULL, NULL,
+ &pristine_checksum_kind,
+ wc_ctx->db, wcroot_abspath,
+ scratch_pool, scratch_pool));
+
+ pristine_checksum = svn_wc__db_checksum_make(checksum,
+
pristine_checksum_kind->salt,
+ queue->pool);
+ }
+ else
+ {
+ pristine_checksum = NULL;
+ }
+
return svn_error_trace(
svn_wc__db_commit_queue_add(db_queue, local_abspath, recurse,
is_committed, remove_lock,
- remove_changelist, checksum,
+ remove_changelist, pristine_checksum,
svn_wc__prop_array_to_hash(wcprop_changes,
queue->pool),
queue->pool, scratch_pool));
@@ -765,11 +785,11 @@ get_pristine_copy_path(const char **pris
svn_boolean_t store_pristine;
svn_wc__db_status_t status;
svn_node_kind_t kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
const char *wcroot_abspath;
SVN_ERR(svn_wc__db_get_settings(NULL, &store_pristine, NULL, db,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE,
NULL, NULL);
@@ -825,7 +845,7 @@ get_pristine_copy_path(const char **pris
return svn_error_createf(SVN_ERR_WC_DB_ERROR, NULL,
_("The pristine text with checksum '%s' was "
"not found"),
- svn_checksum_to_cstring_display(checksum,
+
svn_checksum_to_cstring_display(checksum->value,
scratch_pool));
SVN_ERR(svn_wc__db_pristine_get_future_path(pristine_path_p,
@@ -878,7 +898,7 @@ typedef struct get_pristine_lazyopen_bat
{
svn_wc_context_t *wc_ctx;
const char *wri_abspath;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
} get_pristine_lazyopen_baton_t;
@@ -891,19 +911,10 @@ get_pristine_lazyopen_func(svn_stream_t
apr_pool_t *scratch_pool)
{
get_pristine_lazyopen_baton_t *b = baton;
- const svn_checksum_t *checksum;
svn_stream_t *stream;
- /* If we have an MD5, we'll use it to look up the actual checksum. */
- if (b->checksum->kind == svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_lookup_by_md5(&checksum, b->wc_ctx->db,
- b->wri_abspath, b->checksum,
- scratch_pool, scratch_pool));
- else
- checksum = b->checksum;
-
SVN_ERR(svn_wc__db_pristine_read(&stream, NULL, b->wc_ctx->db,
- b->wri_abspath, checksum,
+ b->wri_abspath, b->checksum,
result_pool, scratch_pool));
if (!stream)
return svn_error_create(SVN_ERR_WC_PRISTINE_DEHYDRATED, NULL, NULL);
@@ -920,14 +931,20 @@ svn_wc__get_pristine_contents_by_checksu
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ /* For historical reasons, this function only supports retrieving
+ the pristine contents without a salt. */
+ static const svn_string_t empty_salt = SVN__STATIC_STRING("");
+ const svn_wc__db_checksum_t *pristine_checksum;
svn_boolean_t present;
svn_boolean_t hydrated;
*contents = NULL;
+ pristine_checksum = svn_wc__db_checksum_make(checksum, &empty_salt,
+ scratch_pool);
SVN_ERR(svn_wc__db_pristine_check(&present, &hydrated, wc_ctx->db,
- wri_abspath, checksum, scratch_pool));
-
+ wri_abspath, pristine_checksum,
+ scratch_pool));
if (present && hydrated)
{
get_pristine_lazyopen_baton_t *gpl_baton;
@@ -935,7 +952,7 @@ svn_wc__get_pristine_contents_by_checksu
gpl_baton = apr_pcalloc(result_pool, sizeof(*gpl_baton));
gpl_baton->wc_ctx = wc_ctx;
gpl_baton->wri_abspath = wri_abspath;
- gpl_baton->checksum = checksum;
+ gpl_baton->checksum = pristine_checksum;
*contents = svn_stream_lazyopen_create(get_pristine_lazyopen_func,
gpl_baton, FALSE, result_pool);
Added:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/checksum.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/checksum.c?rev=1908640&view=auto
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/checksum.c
(added)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/checksum.c
Wed Mar 22 15:21:11 2023
@@ -0,0 +1,56 @@
+/*
+ * checksum.c: working with WC checksums
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ */
+
+#include "svn_wc.h"
+
+static svn_wc_checksum_kind_t *
+make_checksum_kind(svn_checksum_kind_t value,
+ const svn_string_t *salt,
+ apr_pool_t *result_pool)
+{
+ svn_wc_checksum_kind_t *result;
+
+ result = apr_pcalloc(result_pool, sizeof(*result));
+ result->value = value;
+ result->salt = svn_string_dup(salt, result_pool);
+
+ return result;
+}
+
+svn_wc_checksum_kind_t *
+svn_wc_checksum_kind_create(svn_checksum_kind_t value,
+ const svn_string_t *salt,
+ apr_pool_t *result_pool)
+{
+ return make_checksum_kind(value, salt, result_pool);
+}
+
+svn_wc_checksum_kind_t *
+svn_wc_checksum_kind_dup(const svn_wc_checksum_kind_t *kind,
+ apr_pool_t *result_pool)
+{
+ if (kind)
+ return make_checksum_kind(kind->value, kind->salt, result_pool);
+ else
+ return NULL;
+}
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/conflicts.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/conflicts.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/conflicts.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/conflicts.c
Wed Mar 22 15:21:11 2023
@@ -3368,7 +3368,7 @@ svn_wc_resolved_conflict5(svn_wc_context
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
Modified: subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/copy.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/copy.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/copy.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/copy.c Wed
Mar 22 15:21:11 2023
@@ -250,10 +250,12 @@ copy_versioned_file(svn_wc__db_t *db,
apr_pool_t *scratch_pool)
{
svn_skel_t *work_items = NULL;
+ svn_wc__db_checksum_t *new_checksum;
if (within_one_wc)
{
/* In case we are copying within one WC, it already has the pristine. */
+ new_checksum = NULL;
}
else
{
@@ -268,7 +270,7 @@ copy_versioned_file(svn_wc__db_t *db,
{
svn_stream_t *install_stream;
svn_wc__db_install_data_t *install_data;
- svn_checksum_t *install_checksum;
+ svn_wc__db_checksum_t *install_checksum;
svn_checksum_t *install_md5_checksum;
svn_error_t *err;
@@ -288,6 +290,11 @@ copy_versioned_file(svn_wc__db_t *db,
install_checksum,
install_md5_checksum,
scratch_pool));
+ new_checksum = install_checksum;
+ }
+ else
+ {
+ new_checksum = NULL;
}
}
@@ -355,8 +362,8 @@ copy_versioned_file(svn_wc__db_t *db,
/* Copy the (single) node's metadata, and move the new filesystem node
into place. */
SVN_ERR(svn_wc__db_op_copy(db, src_abspath, dst_abspath,
- dst_op_root_abspath, is_move, work_items,
- scratch_pool));
+ dst_op_root_abspath, is_move, new_checksum,
+ work_items, scratch_pool));
if (notify_func)
{
@@ -422,8 +429,8 @@ copy_versioned_dir(svn_wc__db_t *db,
/* Copy the (single) node's metadata, and move the new filesystem node
into place. */
SVN_ERR(svn_wc__db_op_copy(db, src_abspath, dst_abspath,
- dst_op_root_abspath, is_move, work_items,
- scratch_pool));
+ dst_op_root_abspath, is_move, NULL,
+ work_items, scratch_pool));
if (notify_func)
{
@@ -531,7 +538,7 @@ copy_versioned_dir(svn_wc__db_t *db,
any actual files */
SVN_ERR(svn_wc__db_op_copy(db, child_src_abspath,
child_dst_abspath, dst_op_root_abspath,
- is_move, NULL, iterpool));
+ is_move, NULL, NULL, iterpool));
/* Don't recurse on children when all we do is creating not-present
children */
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/deprecated.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/deprecated.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/deprecated.c
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/deprecated.c
Wed Mar 22 15:21:11 2023
@@ -175,7 +175,7 @@ svn_wc_crawl_revisions5(svn_wc_context_t
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE,
NULL, NULL);
@@ -525,7 +525,7 @@ svn_wc_transmit_text_deltas3(const svn_c
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -653,7 +653,7 @@ svn_wc_restore(svn_wc_context_t *wc_ctx,
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -784,7 +784,7 @@ svn_wc_get_pristine_contents2(svn_stream
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -850,7 +850,8 @@ svn_wc_queue_committed2(svn_wc_committed
{
svn_wc_context_t *wc_ctx;
const char *local_abspath;
- const svn_checksum_t *sha1_checksum = NULL;
+ const svn_checksum_t *sha1_checksum;
+ const svn_wc__db_checksum_t *pristine_checksum = NULL;
SVN_ERR(svn_wc__context_create_with_db(&wc_ctx, NULL,
svn_wc__adm_get_db(adm_access),
@@ -860,7 +861,7 @@ svn_wc_queue_committed2(svn_wc_committed
if (md5_checksum != NULL)
{
svn_error_t *err;
- err = svn_wc__db_pristine_lookup_by_md5(&sha1_checksum, wc_ctx->db,
+ err = svn_wc__db_pristine_lookup_by_md5(&pristine_checksum, wc_ctx->db,
local_abspath, md5_checksum,
svn_wc__get_committed_queue_pool(queue),
scratch_pool);
@@ -869,12 +870,17 @@ svn_wc_queue_committed2(svn_wc_committed
if (err && err->apr_err == SVN_ERR_WC_DB_ERROR)
{
svn_error_clear(err);
- sha1_checksum = NULL;
+ pristine_checksum = NULL;
}
else
SVN_ERR(err);
}
+ if (pristine_checksum)
+ sha1_checksum = pristine_checksum->value;
+ else
+ sha1_checksum = NULL;
+
SVN_ERR(svn_wc_queue_committed3(queue, wc_ctx, local_abspath, recurse,
wcprop_changes,
remove_lock, remove_changelist,
@@ -944,7 +950,8 @@ svn_wc_process_committed4(const char *pa
svn_wc__db_t *db = svn_wc__adm_get_db(adm_access);
const char *local_abspath;
const svn_checksum_t *md5_checksum;
- const svn_checksum_t *sha1_checksum = NULL;
+ const svn_checksum_t *sha1_checksum;
+ const svn_wc__db_checksum_t *pristine_checksum = NULL;
svn_wc_context_t *wc_ctx;
svn_wc_committed_queue_t *queue;
@@ -959,19 +966,24 @@ svn_wc_process_committed4(const char *pa
if (md5_checksum != NULL)
{
svn_error_t *err;
- err = svn_wc__db_pristine_lookup_by_md5(&sha1_checksum, db,
+ err = svn_wc__db_pristine_lookup_by_md5(&pristine_checksum, db,
local_abspath, md5_checksum,
pool, pool);
if (err && err->apr_err == SVN_ERR_WC_DB_ERROR)
{
svn_error_clear(err);
- sha1_checksum = NULL;
+ pristine_checksum = NULL;
}
else
SVN_ERR(err);
}
+ if (pristine_checksum)
+ sha1_checksum = pristine_checksum->value;
+ else
+ sha1_checksum = NULL;
+
queue = svn_wc_committed_queue_create(pool);
SVN_ERR(svn_wc_queue_committed3(queue, wc_ctx, local_abspath, recurse,
wcprop_changes, remove_lock,
@@ -1244,7 +1256,7 @@ svn_wc_revert6(svn_wc_context_t *wc_ctx,
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -2260,7 +2272,7 @@ svn_wc_get_diff_editor6(const svn_delta_
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- anchor_abspath, scratch_pool));
+ anchor_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -2478,7 +2490,7 @@ svn_wc_diff6(svn_wc_context_t *wc_ctx,
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -3188,7 +3200,7 @@ svn_wc_get_status_editor5(const svn_delt
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- anchor_abspath, scratch_pool));
+ anchor_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -3842,7 +3854,7 @@ svn_wc_get_update_editor4(const svn_delt
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- anchor_abspath, scratch_pool));
+ anchor_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -4035,7 +4047,7 @@ svn_wc_get_switch_editor4(const svn_delt
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- anchor_abspath, scratch_pool));
+ anchor_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
@@ -4820,7 +4832,7 @@ svn_wc_merge5(enum svn_wc_merge_outcome_
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__get_settings(NULL, &store_pristine, NULL, wc_ctx,
- target_abspath, scratch_pool));
+ target_abspath, NULL, scratch_pool));
if (!store_pristine)
return svn_error_create(SVN_ERR_WC_DEPRECATED_API_STORE_PRISTINE, NULL,
NULL);
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/diff_editor.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/diff_editor.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/diff_editor.c
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/diff_editor.c
Wed Mar 22 15:21:11 2023
@@ -219,7 +219,7 @@ struct file_baton_t
svn_boolean_t has_propchange;
/* The current BASE checksum and props */
- const svn_checksum_t *base_checksum;
+ const svn_wc__db_checksum_t *base_checksum;
apr_hash_t *base_props;
/* The resulting from apply_textdelta */
@@ -396,8 +396,8 @@ svn_wc__diff_base_working_diff(svn_wc__d
svn_boolean_t props_mod;
svn_boolean_t files_same = FALSE;
svn_wc__db_status_t base_status;
- const svn_checksum_t *working_checksum;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *working_checksum;
+ const svn_wc__db_checksum_t *checksum;
svn_filesize_t recorded_size;
apr_time_t recorded_time;
const char *pristine_file;
@@ -933,7 +933,7 @@ svn_wc__diff_local_only_file(svn_wc__db_
svn_diff_source_t *copyfrom_src = NULL;
svn_wc__db_status_t status;
svn_node_kind_t kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
const char *original_repos_relpath;
svn_revnum_t original_revision;
svn_boolean_t had_props;
@@ -1386,7 +1386,7 @@ svn_wc__diff_base_only_file(svn_wc__db_t
{
svn_wc__db_status_t status;
svn_node_kind_t kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
apr_hash_t *props;
void *file_baton = NULL;
svn_boolean_t skip = FALSE;
@@ -2180,20 +2180,21 @@ close_file(void *file_baton,
const svn_checksum_t *result_checksum;
if (fb->temp_file_path)
- result_checksum = svn_checksum__from_digest_md5(fb->result_digest,
- scratch_pool);
+ {
+ result_checksum = svn_checksum__from_digest_md5(fb->result_digest,
+ scratch_pool);
+ }
else
- result_checksum = fb->base_checksum;
+ {
+ SVN_ERR(svn_wc__db_pristine_get_md5(&result_checksum,
+ eb->db, fb->local_abspath,
+ fb->base_checksum,
+ scratch_pool, scratch_pool));
+ }
SVN_ERR(svn_checksum_parse_hex(&expected_checksum, svn_checksum_md5,
expected_md5_digest, scratch_pool));
- if (result_checksum->kind != svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_get_md5(&result_checksum,
- eb->db, fb->local_abspath,
- result_checksum,
- scratch_pool, scratch_pool));
-
if (!svn_checksum_match(expected_checksum, result_checksum))
return svn_checksum_mismatch_err(
expected_checksum,
@@ -2252,7 +2253,7 @@ close_file(void *file_baton,
if (eb->diff_pristine)
{
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
SVN_ERR(svn_wc__db_read_pristine_info(NULL, NULL, NULL, NULL, NULL,
NULL, &checksum, NULL, NULL,
&local_props,
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/entries.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/entries.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/entries.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/entries.c
Wed Mar 22 15:21:11 2023
@@ -214,7 +214,7 @@ static svn_error_t *
get_info_for_deleted(svn_wc_entry_t *entry,
svn_node_kind_t *kind,
const char **repos_relpath,
- const svn_checksum_t **checksum,
+ const svn_wc__db_checksum_t **checksum,
svn_wc__db_lock_t **lock,
svn_wc__db_t *db,
const char *entry_abspath,
@@ -403,7 +403,7 @@ read_one_entry(const svn_wc_entry_t **ne
svn_wc__db_status_t status;
svn_wc__db_lock_t *lock;
const char *repos_relpath;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
svn_filesize_t translated_size;
svn_wc_entry_t *entry = alloc_entry(result_pool);
const char *entry_relpath;
@@ -924,14 +924,13 @@ read_one_entry(const svn_wc_entry_t **ne
if (checksum)
{
- /* We got a SHA-1, get the corresponding MD-5. */
- if (checksum->kind != svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_get_md5(&checksum, db,
- dir_abspath, checksum,
- scratch_pool, scratch_pool));
+ const svn_checksum_t *md5_checksum;
- SVN_ERR_ASSERT(checksum->kind == svn_checksum_md5);
- entry->checksum = svn_checksum_to_cstring(checksum, result_pool);
+ SVN_ERR(svn_wc__db_pristine_get_md5(&md5_checksum, db,
+ dir_abspath, checksum,
+ scratch_pool, scratch_pool));
+ SVN_ERR_ASSERT(md5_checksum->kind == svn_checksum_md5);
+ entry->checksum = svn_checksum_to_cstring(md5_checksum, result_pool);
}
if (conflicted)
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/externals.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/externals.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/externals.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/externals.c
Wed Mar 22 15:21:11 2023
@@ -487,11 +487,11 @@ struct edit_baton
/* What was there before the update */
svn_revnum_t original_revision;
- const svn_checksum_t *original_checksum;
+ const svn_wc__db_checksum_t *original_checksum;
/* What we are installing now */
svn_wc__db_install_data_t *install_data;
- svn_checksum_t *new_checksum;
+ svn_wc__db_checksum_t *new_checksum;
svn_checksum_t *new_md5_checksum;
/* List of incoming propchanges */
@@ -614,13 +614,10 @@ apply_textdelta(void *file_baton,
SVN_ERR(svn_checksum_parse_hex(&expected_checksum, svn_checksum_md5,
base_checksum_digest, pool));
- if (eb->original_checksum->kind != svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_get_md5(&original_md5,
- eb->db, eb->wri_abspath,
- eb->original_checksum,
- pool, pool));
- else
- original_md5 = eb->original_checksum;
+ SVN_ERR(svn_wc__db_pristine_get_md5(&original_md5,
+ eb->db, eb->wri_abspath,
+ eb->original_checksum,
+ pool, pool));
if (!svn_checksum_match(expected_checksum, original_md5))
return svn_error_trace(svn_checksum_mismatch_err(
@@ -693,18 +690,12 @@ close_file(void *file_baton,
SVN_ERR(svn_checksum_parse_hex(&expected_md5_checksum, svn_checksum_md5,
expected_md5_digest, pool));
- if (actual_md5_checksum == NULL)
+ if (actual_md5_checksum == NULL && eb->original_checksum)
{
- actual_md5_checksum = eb->original_checksum;
-
- if (actual_md5_checksum != NULL
- && actual_md5_checksum->kind != svn_checksum_md5)
- {
- SVN_ERR(svn_wc__db_pristine_get_md5(&actual_md5_checksum,
- eb->db, eb->wri_abspath,
- actual_md5_checksum,
- pool, pool));
- }
+ SVN_ERR(svn_wc__db_pristine_get_md5(&actual_md5_checksum,
+ eb->db, eb->wri_abspath,
+ eb->original_checksum,
+ pool, pool));
}
if (! svn_checksum_match(expected_md5_checksum, actual_md5_checksum))
@@ -736,8 +727,8 @@ close_file(void *file_baton,
apr_hash_t *new_pristine_props = NULL;
apr_hash_t *new_actual_props = NULL;
apr_hash_t *new_dav_props = NULL;
- const svn_checksum_t *new_checksum = NULL;
- const svn_checksum_t *original_checksum = NULL;
+ const svn_wc__db_checksum_t *new_checksum = NULL;
+ const svn_wc__db_checksum_t *original_checksum = NULL;
svn_boolean_t added = !SVN_IS_VALID_REVNUM(eb->original_revision);
Modified: subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/info.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/info.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/info.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/info.c Wed
Mar 22 15:21:11 2023
@@ -67,6 +67,8 @@ svn_wc_info_dup(const svn_wc_info_t *inf
new_info->moved_from_abspath = apr_pstrdup(pool, info->moved_from_abspath);
if (info->moved_to_abspath)
new_info->moved_to_abspath = apr_pstrdup(pool, info->moved_to_abspath);
+ new_info->pristine_checksum_kind =
+ svn_wc_checksum_kind_dup(info->pristine_checksum_kind, pool);
return new_info;
}
@@ -97,6 +99,8 @@ build_info_for_node(svn_wc__info2_t **in
svn_boolean_t have_base;
svn_boolean_t have_more_work;
svn_wc_info_t *wc_info;
+ const svn_wc__db_checksum_kind_t *pristine_checksum_kind;
+ const svn_wc__db_checksum_t *pristine_checksum;
tmpinfo = apr_pcalloc(result_pool, sizeof(*tmpinfo));
tmpinfo->kind = kind;
@@ -108,8 +112,14 @@ build_info_for_node(svn_wc__info2_t **in
SVN_ERR(svn_wc__db_get_settings(&wc_info->wc_format,
&wc_info->store_pristine,
- &wc_info->pristine_checksum_kind,
- db, local_abspath, scratch_pool));
+ &pristine_checksum_kind,
+ db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ wc_info->pristine_checksum_kind =
+ svn_wc_checksum_kind_create(pristine_checksum_kind->value,
+ pristine_checksum_kind->salt,
+ result_pool);
SVN_ERR(svn_wc__db_read_info(&status, &db_kind, &tmpinfo->rev,
&repos_relpath,
@@ -117,7 +127,7 @@ build_info_for_node(svn_wc__info2_t **in
&tmpinfo->last_changed_rev,
&tmpinfo->last_changed_date,
&tmpinfo->last_changed_author,
- &wc_info->depth, &wc_info->checksum, NULL,
+ &wc_info->depth, &pristine_checksum, NULL,
&original_repos_relpath,
&original_repos_root_url, &original_uuid,
&original_revision, &lock,
@@ -128,6 +138,10 @@ build_info_for_node(svn_wc__info2_t **in
&have_base, &have_more_work, NULL,
db, local_abspath,
result_pool, scratch_pool));
+ if (pristine_checksum)
+ wc_info->checksum = pristine_checksum->value;
+ else
+ wc_info->checksum = NULL;
if (original_repos_root_url != NULL)
{
@@ -216,10 +230,14 @@ build_info_for_node(svn_wc__info2_t **in
&tmpinfo->last_changed_date,
&tmpinfo->last_changed_author,
&wc_info->depth,
- &wc_info->checksum,
+ &pristine_checksum,
NULL, NULL, NULL,
db, local_abspath,
result_pool, scratch_pool));
+ if (pristine_checksum)
+ wc_info->checksum = pristine_checksum->value;
+ else
+ wc_info->checksum = NULL;
if (w_status == svn_wc__db_status_deleted)
{
@@ -562,14 +580,24 @@ svn_wc__get_info(svn_wc_context_t *wc_ct
svn_error_t *
svn_wc__get_settings(int *format_p,
svn_boolean_t *store_pristine_p,
- svn_checksum_kind_t *pristine_checksum_kind_p,
+ const svn_wc_checksum_kind_t **pristine_checksum_kind_p,
svn_wc_context_t *wc_ctx,
const char *local_abspath,
+ apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ const svn_wc__db_checksum_kind_t *pristine_checksum_kind;
+
SVN_ERR(svn_wc__db_get_settings(format_p, store_pristine_p,
- pristine_checksum_kind_p,
- wc_ctx->db, local_abspath, scratch_pool));
+ &pristine_checksum_kind,
+ wc_ctx->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (pristine_checksum_kind_p)
+ *pristine_checksum_kind_p = svn_wc_checksum_kind_create(
+ pristine_checksum_kind->value,
+ pristine_checksum_kind->salt,
+ result_pool);
return SVN_NO_ERROR;
}
Modified: subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/node.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/node.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/node.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/node.c Wed
Mar 22 15:21:11 2023
@@ -869,12 +869,22 @@ svn_wc__node_get_md5(const svn_checksum_
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(svn_wc__db_pristine_get_md5(md5_checksum,
- wc_ctx->db,
- wri_abspath,
- checksum,
- result_pool,
- scratch_pool));
+ const svn_wc__db_checksum_kind_t *pristine_checksum_kind;
+ const svn_wc__db_checksum_t *pristine_checksum;
+
+ SVN_ERR(svn_wc__db_get_settings(NULL, NULL,
+ &pristine_checksum_kind,
+ wc_ctx->db, wri_abspath,
+ scratch_pool, scratch_pool));
+
+ pristine_checksum = svn_wc__db_checksum_make(
+ checksum, pristine_checksum_kind->salt, scratch_pool);
+
+ SVN_ERR(svn_wc__db_pristine_get_md5(md5_checksum, wc_ctx->db,
+ wri_abspath, pristine_checksum,
+ result_pool, scratch_pool));
+
+ return SVN_NO_ERROR;
}
svn_error_t *
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/questions.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/questions.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/questions.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/questions.c
Wed Mar 22 15:21:11 2023
@@ -101,7 +101,7 @@ compare_and_verify(svn_boolean_t *modifi
svn_wc__db_t *db,
const char *versioned_file_abspath,
svn_filesize_t versioned_file_size,
- const svn_checksum_t *pristine_checksum,
+ const svn_wc__db_checksum_t *pristine_checksum,
svn_boolean_t has_props,
svn_boolean_t props_mod,
svn_boolean_t exact_comparison,
@@ -113,7 +113,7 @@ compare_and_verify(svn_boolean_t *modifi
svn_boolean_t special = FALSE;
svn_boolean_t need_translation;
svn_stream_t *v_stream; /* versioned_file */
- svn_checksum_t *v_checksum;
+ svn_wc__db_checksum_t *v_checksum;
svn_error_t *err;
SVN_ERR_ASSERT(svn_dirent_is_absolute(versioned_file_abspath));
@@ -189,31 +189,34 @@ compare_and_verify(svn_boolean_t *modifi
if (exact_comparison)
{
- svn_checksum_t *working_checksum;
- svn_checksum_t *detranslated_checksum;
- svn_checksum_t *retranslated_checksum;
-
- v_stream = svn_stream_checksummed2(v_stream,
- &working_checksum, NULL,
- pristine_checksum->kind, TRUE,
- scratch_pool);
+ svn_wc__db_checksum_t *working_checksum;
+ svn_wc__db_checksum_t *detranslated_checksum;
+ svn_wc__db_checksum_t *retranslated_checksum;
+
+ v_stream = svn_wc__db_checksum_stream(
+ &working_checksum, NULL, v_stream,
+ pristine_checksum->value->kind,
+ pristine_checksum->salt,
+ scratch_pool, scratch_pool);
v_stream = svn_subst_stream_translated(v_stream,
pristine_eol_str, TRUE,
keywords, FALSE,
scratch_pool);
- v_stream = svn_stream_checksummed2(v_stream,
- &detranslated_checksum, NULL,
- pristine_checksum->kind, TRUE,
- scratch_pool);
+ v_stream = svn_wc__db_checksum_stream(
+ &detranslated_checksum, NULL, v_stream,
+ pristine_checksum->value->kind,
+ pristine_checksum->salt,
+ scratch_pool, scratch_pool);
v_stream = svn_subst_stream_translated(v_stream, eol_str, FALSE,
keywords, TRUE,
scratch_pool);
- v_stream = svn_stream_checksummed2(v_stream,
- &retranslated_checksum, NULL,
- pristine_checksum->kind, TRUE,
- scratch_pool);
+ v_stream = svn_wc__db_checksum_stream(
+ &retranslated_checksum, NULL, v_stream,
+ pristine_checksum->value->kind,
+ pristine_checksum->salt,
+ scratch_pool, scratch_pool);
err = svn_stream_copy3(v_stream, svn_stream_empty(scratch_pool),
NULL, NULL, scratch_pool);
@@ -223,8 +226,10 @@ compare_and_verify(svn_boolean_t *modifi
else
SVN_ERR(err);
- if (svn_checksum_match(detranslated_checksum, pristine_checksum)
&&
- svn_checksum_match(working_checksum, retranslated_checksum))
+ if (svn_wc__db_checksum_match(detranslated_checksum,
+ pristine_checksum) &&
+ svn_wc__db_checksum_match(working_checksum,
+ retranslated_checksum))
{
*modified_p = FALSE;
}
@@ -250,16 +255,18 @@ compare_and_verify(svn_boolean_t *modifi
}
/* Get checksum of detranslated (normalized) content. */
- err = svn_stream_contents_checksum(&v_checksum, v_stream,
- pristine_checksum->kind,
- scratch_pool, scratch_pool);
+ err = svn_wc__db_checksum_stream_contents(
+ &v_checksum, v_stream,
+ pristine_checksum->value->kind,
+ pristine_checksum->salt,
+ scratch_pool, scratch_pool);
/* Convert EACCESS on working copy path to WC specific error code. */
if (err && APR_STATUS_IS_EACCES(err->apr_err))
return svn_error_create(SVN_ERR_WC_PATH_ACCESS_DENIED, err, NULL);
else
SVN_ERR(err);
- *modified_p = (! svn_checksum_match(v_checksum, pristine_checksum));
+ *modified_p = (! svn_wc__db_checksum_match(v_checksum, pristine_checksum));
return SVN_NO_ERROR;
}
@@ -273,7 +280,7 @@ svn_wc__internal_file_modified_p(svn_boo
{
svn_wc__db_status_t status;
svn_node_kind_t kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
svn_filesize_t recorded_size;
apr_time_t recorded_mod_time;
svn_boolean_t has_props;
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.c
Wed Mar 22 15:21:11 2023
@@ -34,7 +34,7 @@ compare_and_verify(svn_boolean_t *modifi
svn_wc__db_t *db,
const char *versioned_file_abspath,
svn_filesize_t versioned_file_size,
- const svn_checksum_t *pristine_checksum,
+ const svn_wc__db_checksum_t *pristine_checksum,
svn_boolean_t has_props,
svn_boolean_t props_mod,
apr_pool_t *scratch_pool)
@@ -45,7 +45,7 @@ compare_and_verify(svn_boolean_t *modifi
svn_boolean_t special = FALSE;
svn_boolean_t need_translation;
svn_stream_t *v_stream; /* versioned_file */
- svn_checksum_t *v_checksum;
+ svn_wc__db_checksum_t *v_checksum;
svn_error_t *err;
SVN_ERR_ASSERT(svn_dirent_is_absolute(versioned_file_abspath));
@@ -130,16 +130,19 @@ compare_and_verify(svn_boolean_t *modifi
}
/* Get checksum of detranslated (normalized) content. */
- err = svn_stream_contents_checksum(&v_checksum, v_stream,
- pristine_checksum->kind,
- scratch_pool, scratch_pool);
+ err = svn_wc__db_checksum_stream_contents(
+ &v_checksum, v_stream,
+ pristine_checksum->value->kind,
+ pristine_checksum->salt,
+ scratch_pool, scratch_pool);
+
/* Convert EACCESS on working copy path to WC specific error code. */
if (err && APR_STATUS_IS_EACCES(err->apr_err))
return svn_error_create(SVN_ERR_WC_PATH_ACCESS_DENIED, err, NULL);
else
SVN_ERR(err);
- *modified_p = (! svn_checksum_match(v_checksum, pristine_checksum));
+ *modified_p = (! svn_wc__db_checksum_match(v_checksum, pristine_checksum));
return SVN_NO_ERROR;
}
@@ -150,7 +153,7 @@ check_file_modified(svn_boolean_t *modif
const char *local_abspath,
svn_filesize_t recorded_size,
apr_time_t recorded_time,
- const svn_checksum_t *pristine_checksum,
+ const svn_wc__db_checksum_t *pristine_checksum,
svn_boolean_t has_props,
svn_boolean_t props_mod,
apr_pool_t *scratch_pool)
@@ -199,18 +202,18 @@ static svn_error_t *
open_textbase(svn_stream_t **contents_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *textbase_checksum,
+ const svn_wc__db_checksum_t *textbase_checksum,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_wc__db_status_t status;
svn_node_kind_t kind;
- const svn_checksum_t *checksum;
+ const svn_wc__db_checksum_t *checksum;
svn_filesize_t recorded_size;
apr_time_t recorded_time;
svn_boolean_t have_props;
svn_boolean_t props_mod;
- const svn_checksum_t *target_checksum;
+ const svn_wc__db_checksum_t *target_checksum;
svn_stream_t *contents;
SVN_ERR(svn_wc__db_read_info(&status, &kind, NULL, NULL, NULL, NULL, NULL,
@@ -271,12 +274,12 @@ open_textbase(svn_stream_t **contents_p,
return SVN_NO_ERROR;
}
- if (checksum && svn_checksum_match(checksum, target_checksum))
+ if (checksum && svn_wc__db_checksum_match(checksum, target_checksum))
{
svn_boolean_t store_pristine;
SVN_ERR(svn_wc__db_get_settings(NULL, &store_pristine, NULL, db,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (!store_pristine)
{
svn_boolean_t modified;
@@ -318,7 +321,7 @@ svn_error_t *
svn_wc__textbase_get_contents(svn_stream_t **contents_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_boolean_t ignore_enoent,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
@@ -349,7 +352,7 @@ svn_error_t *
svn_wc__textbase_setaside(const char **result_abspath_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -395,7 +398,7 @@ svn_wc__textbase_setaside_wq(const char
svn_skel_t **cleanup_work_item_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -446,7 +449,7 @@ svn_wc__textbase_setaside_wq(const char
svn_error_t *
svn_wc__textbase_prepare_install(svn_stream_t **stream_p,
svn_wc__db_install_data_t **install_data_p,
- svn_checksum_t **checksum_p,
+ svn_wc__db_checksum_t **checksum_p,
svn_checksum_t **md5_checksum_p,
svn_wc__db_t *db,
const char *local_abspath,
@@ -486,7 +489,7 @@ textbase_walk_cb(svn_boolean_t *referenc
void *baton,
const char *local_abspath,
int op_depth,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_boolean_t have_props,
svn_boolean_t props_mod,
svn_filesize_t recorded_size,
@@ -568,7 +571,7 @@ svn_wc_textbase_sync(svn_wc_context_t *w
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
SVN_ERR(svn_wc__db_get_settings(NULL, &store_pristine, NULL, wc_ctx->db,
- local_abspath, scratch_pool));
+ local_abspath, NULL, scratch_pool));
if (store_pristine)
return SVN_NO_ERROR;
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.h
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.h
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/textbase.h
Wed Mar 22 15:21:11 2023
@@ -54,7 +54,7 @@ svn_error_t *
svn_wc__textbase_get_contents(svn_stream_t **contents_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_boolean_t ignore_enoent,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
@@ -70,7 +70,7 @@ svn_error_t *
svn_wc__textbase_setaside(const char **result_abspath_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -89,7 +89,7 @@ svn_wc__textbase_setaside_wq(const char
svn_skel_t **cleanup_work_item_p,
svn_wc__db_t *db,
const char *local_abspath,
- const svn_checksum_t *checksum,
+ const svn_wc__db_checksum_t *checksum,
svn_cancel_func_t cancel_func,
void *cancel_baton,
apr_pool_t *result_pool,
@@ -106,7 +106,7 @@ svn_wc__textbase_setaside_wq(const char
svn_error_t *
svn_wc__textbase_prepare_install(svn_stream_t **stream_p,
svn_wc__db_install_data_t **install_data_p,
- svn_checksum_t **checksum_p,
+ svn_wc__db_checksum_t **checksum_p,
svn_checksum_t **md5_checksum_p,
svn_wc__db_t *db,
const char *local_abspath,
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/update_editor.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/update_editor.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
---
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/update_editor.c
(original)
+++
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/update_editor.c
Wed Mar 22 15:21:11 2023
@@ -432,7 +432,7 @@ struct handler_baton
/* A calculated checksum of NEW_TEXT_BASE_TMP_ABSPATH, which we'll use for
eventually writing the pristine. */
- svn_checksum_t * new_text_base_checksum;
+ svn_wc__db_checksum_t * new_text_base_checksum;
};
@@ -757,10 +757,10 @@ struct file_baton
/* If there are file content changes, these are the checksums of the
resulting new text base, which is in the pristine store, else NULL. */
const svn_checksum_t *new_text_base_md5_checksum;
- const svn_checksum_t *new_text_base_checksum;
+ const svn_wc__db_checksum_t *new_text_base_checksum;
/* The checksum of the file before the update */
- const svn_checksum_t *original_checksum;
+ const svn_wc__db_checksum_t *original_checksum;
/* An array of svn_prop_t structures, representing all the property
changes to be applied to this file. Once a file baton is
@@ -1049,7 +1049,7 @@ window_handler(svn_txdelta_window_t *win
fb->new_text_base_md5_checksum =
svn_checksum__from_digest_md5(hb->new_text_base_md5_digest, fb->pool);
fb->new_text_base_checksum =
- svn_checksum_dup(hb->new_text_base_checksum, fb->pool);
+ svn_wc__db_checksum_dup(hb->new_text_base_checksum, fb->pool);
/* Store the new pristine text in the pristine store now. Later, in a
single transaction we will update the BASE_NODE to include a
@@ -3865,17 +3865,19 @@ apply_textdelta(void *file_baton,
check our RECORDED_BASE_CHECKSUM. (In WC-1, we could not do this test
for replaced nodes because we didn't store the checksum of the "revert
base". In WC-NG, we do and we can.) */
- recorded_base_checksum = fb->original_checksum;
/* If we have a checksum that we want to compare to a MD5 checksum,
ensure that it is a MD5 checksum */
- if (recorded_base_checksum
- && expected_base_checksum
- && recorded_base_checksum->kind != svn_checksum_md5)
- SVN_ERR(svn_wc__db_pristine_get_md5(&recorded_base_checksum,
- eb->db, eb->wcroot_abspath,
- recorded_base_checksum, pool, pool));
-
+ if (fb->original_checksum && expected_base_checksum)
+ {
+ SVN_ERR(svn_wc__db_pristine_get_md5(&recorded_base_checksum,
+ eb->db, eb->wcroot_abspath,
+ fb->original_checksum, pool, pool));
+ }
+ else
+ {
+ recorded_base_checksum = NULL;
+ }
if (!svn_checksum_match(expected_base_checksum, recorded_base_checksum))
return svn_error_createf(SVN_ERR_WC_CORRUPT_TEXT_BASE, NULL,
@@ -4074,8 +4076,8 @@ svn_wc__perform_file_merge(svn_skel_t **
svn_wc__db_t *db,
const char *local_abspath,
const char *wri_abspath,
- const svn_checksum_t *new_checksum,
- const svn_checksum_t *original_checksum,
+ const svn_wc__db_checksum_t *new_checksum,
+ const svn_wc__db_checksum_t *original_checksum,
apr_hash_t *old_actual_props,
const apr_array_header_t *ext_patterns,
svn_revnum_t old_revision,
@@ -4431,7 +4433,7 @@ close_file(void *file_baton,
svn_skel_t *work_item;
apr_pool_t *scratch_pool = fb->pool; /* Destroyed at function exit */
svn_boolean_t keep_recorded_info = FALSE;
- const svn_checksum_t *new_checksum;
+ const svn_wc__db_checksum_t *new_checksum;
apr_array_header_t *iprops = NULL;
svn_boolean_t install_pristine;
const char *install_from = NULL;
@@ -5505,7 +5507,7 @@ svn_wc_add_repos_file4(svn_wc_context_t
svn_node_kind_t kind;
const char *tmp_text_base_abspath;
svn_checksum_t *new_text_base_md5_checksum;
- svn_checksum_t *new_text_base_checksum;
+ svn_wc__db_checksum_t *new_text_base_checksum;
const char *source_abspath = NULL;
svn_skel_t *all_work_items = NULL;
svn_skel_t *work_item;
Modified:
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/upgrade.c
URL:
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/upgrade.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/upgrade.c
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/upgrade.c
Wed Mar 22 15:21:11 2023
@@ -44,6 +44,7 @@
#include "private/svn_wc_private.h"
#include "private/svn_sqlite.h"
#include "private/svn_token.h"
+#include "private/svn_string_private.h"
/* WC-1.0 administrative area extensions */
#define SVN_WC__BASE_EXT ".svn-base" /* for text and prop bases */
@@ -1038,6 +1039,8 @@ migrate_text_bases(apr_hash_t **text_bas
/* Calculate its checksums and copy it to the pristine store */
{
+ static const svn_string_t empty_salt = SVN__STATIC_STRING("");
+ svn_wc__db_checksum_t *pristine_checksum;
const char *pristine_path;
const char *text_base_path;
const char *temp_path;
@@ -1080,9 +1083,12 @@ migrate_text_bases(apr_hash_t **text_bas
SVN_ERR(svn_sqlite__bind_int64(stmt, 3, finfo.size));
SVN_ERR(svn_sqlite__insert(NULL, stmt));
+ pristine_checksum = svn_wc__db_checksum_make(sha1_checksum,
+ &empty_salt,
+ iterpool);
SVN_ERR(svn_wc__db_pristine_get_future_path(&pristine_path,
new_wcroot_abspath,
- sha1_checksum,
+ pristine_checksum,
iterpool, iterpool));
/* Ensure any sharding directories exist. */
@@ -1440,7 +1446,23 @@ bump_to_33(void *baton,
svn_sqlite__db_t *sdb,
apr_pool_t *scratch_pool)
{
+ svn_sqlite__stmt_t *stmt;
+ unsigned char salt[32];
+ apr_status_t status;
+
SVN_ERR(svn_sqlite__exec_statements(sdb, STMT_UPGRADE_TO_33));
+
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
+ STMT_UPGRADE_33_INSERT_GLOBAL_SETTINGS));
+
+ status = apr_generate_random_bytes(salt, sizeof(salt));
+ if (status)
+ return svn_error_wrap_apr(status, NULL);
+
+ SVN_ERR(svn_sqlite__bind_blob(stmt, 1, salt, sizeof(salt)));
+
+ SVN_ERR(svn_sqlite__insert(NULL, stmt));
+
return SVN_NO_ERROR;
}
@@ -2115,7 +2137,8 @@ svn_wc__upgrade(int *result_format_p,
&data.repos_id, &data.wc_id,
db, target_format, data.root_abspath,
this_dir->repos, this_dir->uuid,
- TRUE, svn_checksum_sha1, scratch_pool));
+ TRUE, svn_checksum_sha1, FALSE,
+ scratch_pool));
/* Migrate the entries over to the new database.
### We need to think about atomicity here.