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.



Reply via email to