Modified: subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/util.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/util.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/util.c 
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/util.c Wed 
Mar 22 15:21:11 2023
@@ -481,7 +481,7 @@ svn_wc__fetch_base_func(const char **fil
                         apr_pool_t *scratch_pool)
 {
   struct svn_wc__shim_fetch_baton_t *sfb = baton;
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
   svn_error_t *err;
   const char *local_abspath = svn_dirent_join(sfb->base_abspath, path,
                                               scratch_pool);

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-metadata.sql
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-metadata.sql?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-metadata.sql 
(original)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-metadata.sql 
Wed Mar 22 15:21:11 2023
@@ -779,16 +779,29 @@ PRAGMA user_version = 32;
 /* ------------------------------------------------------------------------- */
 /* Format 33 adds support for configurable pristine checksum kinds with
    the following schema changes:
-   - Add the 'pristine_checksum_kind' column to the SETTINGS table. */
+   - Add the 'pristine_checksum_kind' column to the SETTINGS table.
+   - Add the 'pristine_checksum_use_salt' column to the SETTINGS table.
+   - Add the GLOBAL_SETTINGS table. */
 -- STMT_UPGRADE_TO_33
 ALTER TABLE SETTINGS ADD COLUMN pristine_checksum_kind INTEGER;
+ALTER TABLE SETTINGS ADD COLUMN pristine_checksum_use_salt INTEGER;
 
 UPDATE SETTINGS
-SET pristine_checksum_kind = 1 /* svn_wc__db_pristine_checksum_sha1 */
+SET pristine_checksum_kind = 1 /* svn_wc__db_pristine_checksum_sha1 */,
+    pristine_checksum_use_salt = 0
 WHERE pristine_checksum_kind IS NULL;
 
+/* This table contains settings specific to the whole database instance. */
+CREATE TABLE GLOBAL_SETTINGS (
+  id  INTEGER NOT NULL PRIMARY KEY CHECK (id = 0),
+  salt  BLOB NOT NULL
+);
+
 PRAGMA user_version = 33;
 
+--STMT_UPGRADE_33_INSERT_GLOBAL_SETTINGS
+INSERT INTO GLOBAL_SETTINGS VALUES (0, ?1);
+
 /* ------------------------------------------------------------------------- */
 /* Format 34 ....  */
 

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-queries.sql
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-queries.sql?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-queries.sql 
(original)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc-queries.sql 
Wed Mar 22 15:21:11 2023
@@ -1856,12 +1856,21 @@ SELECT pristine.checksum, pristine.hydra
 FROM pristine WHERE refcount = 0
 
 -- STMT_SELECT_SETTINGS
-SELECT store_pristine, pristine_checksum_kind FROM settings WHERE wc_id = ?1
+SELECT store_pristine,
+       pristine_checksum_kind,
+       pristine_checksum_use_salt,
+       (SELECT salt FROM global_settings WHERE id = 0)
+FROM settings WHERE wc_id = ?1
 
 -- STMT_UPSERT_SETTINGS
-INSERT INTO settings (wc_id, store_pristine, pristine_checksum_kind)
-VALUES (?1, ?2, ?3)
-ON CONFLICT(wc_id) DO UPDATE SET store_pristine=?2, pristine_checksum_kind=?3
+INSERT INTO settings (wc_id,
+                      store_pristine,
+                      pristine_checksum_kind,
+                      pristine_checksum_use_salt)
+VALUES (?1, ?2, ?3, ?4)
+ON CONFLICT(wc_id) DO UPDATE SET store_pristine=?2,
+                                 pristine_checksum_kind=?3,
+                                 pristine_checksum_use_salt=?4
 
 /* ------------------------------------------------------------------------- */
 

Modified: subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc.h 
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc.h Wed 
Mar 22 15:21:11 2023
@@ -232,9 +232,8 @@ extern "C" {
 /* Starting from this version, pristine checksum kind can be configured. */
 #define SVN_WC__HAS_PRISTINE_CHECKSUM_KIND 33
 
-/* Starting from this version, salted SHA-1 can be used as the pristine
-   checksum kind. */
-#define SVN_WC__HAS_PRISTINE_CHECKSUM_SHA1_SALTED 33
+/* Starting from this version, pristine checksum can be salted. */
+#define SVN_WC__HAS_PRISTINE_CHECKSUM_SALT 33
 
 /* Return true iff error E indicates an "is not a working copy" type
    of error, either because something wasn't a working copy at all, or
@@ -514,7 +513,7 @@ svn_wc__conflicted_for_update_p(svn_bool
 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,
@@ -710,8 +709,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,

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.c 
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.c Wed 
Mar 22 15:21:11 2023
@@ -144,7 +144,7 @@ typedef struct insert_base_baton_t {
   svn_depth_t depth;
 
   /* for inserting files */
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
 
   /* for inserting symlinks */
   const char *target;
@@ -200,7 +200,7 @@ typedef struct insert_working_baton_t {
   svn_depth_t depth;
 
   /* for inserting (copied/moved-here) files */
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
 
   /* for inserting symlinks */
   const char *target;
@@ -245,7 +245,7 @@ typedef struct insert_external_baton_t {
   const apr_hash_t *dav_cache;
 
   /* for inserting files */
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
 
   /* for inserting symlinks */
   const char *target;
@@ -312,7 +312,7 @@ read_info(svn_wc__db_status_t *status,
           apr_time_t *changed_date,
           const char **changed_author,
           svn_depth_t *depth,
-          const svn_checksum_t **checksum,
+          const svn_wc__db_checksum_t **checksum,
           const char **target,
           const char **original_repos_relpath,
           apr_int64_t *original_repos_id,
@@ -779,8 +779,8 @@ insert_base_node(const insert_base_baton
                                  path_for_error_message(wcroot, local_relpath,
                                                         scratch_pool));
 
-      SVN_ERR(svn_sqlite__bind_checksum(stmt, 14, pibb->checksum,
-                                        scratch_pool));
+      SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 14, 
pibb->checksum,
+                                               scratch_pool));
 
       if (recorded_size != SVN_INVALID_FILESIZE)
         {
@@ -1053,8 +1053,8 @@ insert_working_node(const insert_working
 
   if (piwb->kind == svn_node_file && present)
     {
-      SVN_ERR(svn_sqlite__bind_checksum(stmt, 14, piwb->checksum,
-                                        scratch_pool));
+      SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 14, 
piwb->checksum,
+                                               scratch_pool));
     }
 
   if (piwb->original_repos_relpath != NULL)
@@ -1368,7 +1368,9 @@ init_db(/* output values */
         svn_depth_t root_node_depth,
         svn_boolean_t store_pristine,
         svn_checksum_kind_t pristine_checksum_kind,
+        svn_boolean_t pristine_checksum_use_salt,
         const char *wcroot_abspath,
+        apr_pool_t *result_pool,
         apr_pool_t *scratch_pool)
 {
   svn_sqlite__stmt_t *stmt;
@@ -1400,17 +1402,13 @@ init_db(/* output values */
           case svn_checksum_sha1:
             db_checksum_kind = svn_wc__db_pristine_checksum_sha1;
             break;
-          case svn_checksum_sha1_salted:
-            SVN_ERR_ASSERT(target_format >= 
SVN_WC__HAS_PRISTINE_CHECKSUM_SHA1_SALTED);
-            db_checksum_kind = svn_wc__db_pristine_checksum_sha1_salted;
-            break;
           default:
             SVN_ERR_MALFUNCTION();
         }
 
       SVN_ERR(svn_sqlite__get_statement(&stmt, db, STMT_UPSERT_SETTINGS));
-      SVN_ERR(svn_sqlite__bindf(stmt, "idd",
-                                *wc_id, store_pristine, db_checksum_kind));
+      SVN_ERR(svn_sqlite__bindf(stmt, "iddd", *wc_id, store_pristine,
+                                db_checksum_kind, pristine_checksum_use_salt));
       SVN_ERR(svn_sqlite__insert(NULL, stmt));
     }
 
@@ -1463,6 +1461,7 @@ create_db(svn_sqlite__db_t **sdb,
           svn_depth_t root_node_depth,
           svn_boolean_t store_pristine,
           svn_checksum_kind_t pristine_checksum_kind,
+          svn_boolean_t pristine_checksum_use_salt,
           svn_boolean_t exclusive,
           apr_int32_t timeout,
           apr_pool_t *result_pool,
@@ -1478,8 +1477,9 @@ create_db(svn_sqlite__db_t **sdb,
                                 *sdb, target_format, repos_root_url, 
repos_uuid,
                                 root_node_repos_relpath, root_node_revision,
                                 root_node_depth, store_pristine,
-                                pristine_checksum_kind, dir_abspath,
-                                scratch_pool),
+                                pristine_checksum_kind,
+                                pristine_checksum_use_salt,
+                                dir_abspath, result_pool, scratch_pool),
                         *sdb);
 
   return SVN_NO_ERROR;
@@ -1497,11 +1497,13 @@ svn_wc__db_init(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 *scratch_pool)
 {
   svn_sqlite__db_t *sdb;
   apr_int64_t repos_id;
   apr_int64_t wc_id;
+  const svn_wc__db_checksum_kind_t *resolved_checksum_kind;
   svn_wc__db_wcroot_t *wcroot;
   svn_boolean_t sqlite_exclusive = FALSE;
   apr_int32_t sqlite_timeout = 0; /* default timeout */
@@ -1528,15 +1530,20 @@ svn_wc__db_init(svn_wc__db_t *db,
                     repos_root_url, repos_uuid, SDB_FILE,
                     repos_relpath, initial_rev, depth,
                     store_pristine, pristine_checksum_kind,
+                    pristine_checksum_use_salt,
                     sqlite_exclusive, sqlite_timeout,
                     db->state_pool, scratch_pool));
 
+  SVN_ERR(svn_wc__db_util_read_settings(NULL, &resolved_checksum_kind,
+                                        sdb, target_format, wc_id,
+                                        db->state_pool, scratch_pool));
+
   /* Create the WCROOT for this directory.  */
   SVN_ERR(svn_wc__db_pdh_create_wcroot(&wcroot,
                         apr_pstrdup(db->state_pool, local_abspath),
                         sdb, wc_id, FORMAT_FROM_SDB,
                         FALSE /* auto-upgrade */,
-                        store_pristine, pristine_checksum_kind,
+                        store_pristine, resolved_checksum_kind,
                         db->state_pool, scratch_pool));
 
   /* Any previously cached children may now have a new WCROOT, most likely that
@@ -1572,9 +1579,10 @@ svn_wc__db_init(svn_wc__db_t *db,
 svn_error_t *
 svn_wc__db_get_settings(int *format_p,
                         svn_boolean_t *store_pristine_p,
-                        svn_checksum_kind_t *pristine_checksum_kind_p,
+                        const svn_wc__db_checksum_kind_t 
**pristine_checksum_kind_p,
                         svn_wc__db_t *db,
                         const char *local_abspath,
+                        apr_pool_t *result_pool,
                         apr_pool_t *scratch_pool)
 {
   svn_wc__db_wcroot_t *wcroot;
@@ -1592,7 +1600,9 @@ svn_wc__db_get_settings(int *format_p,
   if (store_pristine_p)
     *store_pristine_p = wcroot->store_pristine;
   if (pristine_checksum_kind_p)
-    *pristine_checksum_kind_p = wcroot->pristine_checksum_kind;
+    *pristine_checksum_kind_p = svn_wc__db_checksum_kind_dup(
+                                  wcroot->pristine_checksum_kind,
+                                  result_pool);
 
   return SVN_NO_ERROR;
 }
@@ -1893,7 +1903,7 @@ svn_wc__db_base_add_file(svn_wc__db_t *d
                          svn_revnum_t changed_rev,
                          apr_time_t changed_date,
                          const char *changed_author,
-                         const svn_checksum_t *checksum,
+                         const svn_wc__db_checksum_t *checksum,
                          apr_hash_t *dav_cache,
                          svn_boolean_t delete_working,
                          svn_boolean_t update_actual_props,
@@ -2623,7 +2633,7 @@ svn_wc__db_base_get_info_internal(svn_wc
                                   apr_time_t *changed_date,
                                   const char **changed_author,
                                   svn_depth_t *depth,
-                                  const svn_checksum_t **checksum,
+                                  const svn_wc__db_checksum_t **checksum,
                                   const char **target,
                                   svn_wc__db_lock_t **lock,
                                   svn_boolean_t *had_props,
@@ -2699,8 +2709,8 @@ svn_wc__db_base_get_info_internal(svn_wc
             }
           else
             {
-              err = svn_sqlite__column_checksum(checksum, stmt, 5,
-                                                result_pool);
+              err = svn_wc__db_util_column_wc_checksum(checksum, wcroot, stmt, 
5,
+                                                       result_pool, 
scratch_pool);
               if (err != NULL)
                 err = svn_error_createf(
                         err->apr_err, err,
@@ -2766,7 +2776,7 @@ svn_wc__db_base_get_info(svn_wc__db_stat
                          apr_time_t *changed_date,
                          const char **changed_author,
                          svn_depth_t *depth,
-                         const svn_checksum_t **checksum,
+                         const svn_wc__db_checksum_t **checksum,
                          const char **target,
                          svn_wc__db_lock_t **lock,
                          svn_boolean_t *had_props,
@@ -3061,7 +3071,7 @@ svn_wc__db_depth_get_info(svn_wc__db_sta
                           apr_time_t *changed_date,
                           const char **changed_author,
                           svn_depth_t *depth,
-                          const svn_checksum_t **checksum,
+                          const svn_wc__db_checksum_t **checksum,
                           const char **target,
                           svn_boolean_t *had_props,
                           apr_hash_t **props,
@@ -3134,8 +3144,8 @@ svn_wc__db_depth_get_info(svn_wc__db_sta
             }
           else
             {
-              err = svn_sqlite__column_checksum(checksum, stmt, 5,
-                                                result_pool);
+              err = svn_wc__db_util_column_wc_checksum(checksum, wcroot, stmt, 
5,
+                                                       result_pool, 
scratch_pool);
               if (err != NULL)
                 err = svn_error_createf(
                         err->apr_err, err,
@@ -3425,7 +3435,7 @@ svn_wc__db_external_add_file(svn_wc__db_
                              apr_time_t changed_date,
                              const char *changed_author,
 
-                             const svn_checksum_t *checksum,
+                             const svn_wc__db_checksum_t *checksum,
 
                              const apr_hash_t *dav_cache,
 
@@ -4034,6 +4044,7 @@ cross_db_copy(svn_wc__db_wcroot_t *src_w
               int dst_op_depth,
               int dst_np_op_depth,
               svn_node_kind_t kind,
+              const svn_wc__db_checksum_t *new_checksum,
               const apr_array_header_t *children,
               apr_int64_t copyfrom_id,
               const char *copyfrom_relpath,
@@ -4044,7 +4055,7 @@ cross_db_copy(svn_wc__db_wcroot_t *src_w
   svn_revnum_t changed_rev;
   apr_time_t changed_date;
   const char *changed_author;
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
   apr_hash_t *props;
   svn_depth_t depth;
 
@@ -4058,6 +4069,9 @@ cross_db_copy(svn_wc__db_wcroot_t *src_w
                     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
                     src_wcroot, src_relpath, scratch_pool, scratch_pool));
 
+  if (new_checksum)
+    checksum = new_checksum;
+
   if (dst_status != svn_wc__db_status_not_present
       && dst_status != svn_wc__db_status_excluded
       && dst_status != svn_wc__db_status_server_excluded)
@@ -4656,6 +4670,7 @@ db_op_copy(svn_wc__db_wcroot_t *src_wcro
            const char *src_relpath,
            svn_wc__db_wcroot_t *dst_wcroot,
            const char *dst_relpath,
+           const svn_wc__db_checksum_t *new_checksum,
            const svn_skel_t *work_items,
            int move_op_depth,
            apr_pool_t *scratch_pool)
@@ -4903,7 +4918,7 @@ db_op_copy(svn_wc__db_wcroot_t *src_wcro
     {
       SVN_ERR(cross_db_copy(src_wcroot, src_relpath, dst_wcroot,
                             dst_relpath, dst_presence, dst_op_depth,
-                            dst_np_op_depth, kind,
+                            dst_np_op_depth, kind, new_checksum,
                             children, copyfrom_id, copyfrom_relpath,
                             copyfrom_rev, scratch_pool));
     }
@@ -4926,6 +4941,8 @@ struct op_copy_baton
 
   svn_boolean_t is_move;
   const char *dst_op_root_relpath;
+
+  const svn_wc__db_checksum_t *new_checksum;
 };
 
 /* Helper for svn_wc__db_op_copy(). */
@@ -4956,7 +4973,8 @@ op_copy_txn(svn_wc__db_wcroot_t *wcroot,
 
   SVN_ERR(db_op_copy(ocb->src_wcroot, ocb->src_relpath,
                      ocb->dst_wcroot, ocb->dst_relpath,
-                     ocb->work_items, move_op_depth, scratch_pool));
+                     ocb->new_checksum, ocb->work_items,
+                     move_op_depth, scratch_pool));
 
   return SVN_NO_ERROR;
 }
@@ -4967,6 +4985,7 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
                    const char *dst_abspath,
                    const char *dst_op_root_abspath,
                    svn_boolean_t is_move,
+                   const svn_wc__db_checksum_t *new_checksum,
                    const svn_skel_t *work_items,
                    apr_pool_t *scratch_pool)
 {
@@ -4992,6 +5011,7 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
   ocb.is_move = is_move;
   ocb.dst_op_root_relpath = svn_dirent_skip_ancestor(ocb.dst_wcroot->abspath,
                                                      dst_op_root_abspath);
+  ocb.new_checksum = new_checksum;
 
   /* Call with the sdb in src_wcroot. It might call itself again to
      also obtain a lock in dst_wcroot */
@@ -5902,7 +5922,7 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db
                         const char *original_root_url,
                         const char *original_uuid,
                         svn_revnum_t original_revision,
-                        const svn_checksum_t *checksum,
+                        const svn_wc__db_checksum_t *checksum,
                         svn_boolean_t update_actual_props,
                         const apr_hash_t *new_actual_props,
                         svn_boolean_t is_move,
@@ -8935,7 +8955,7 @@ read_info(svn_wc__db_status_t *status,
           apr_time_t *changed_date,
           const char **changed_author,
           svn_depth_t *depth,
-          const svn_checksum_t **checksum,
+          const svn_wc__db_checksum_t **checksum,
           const char **target,
           const char **original_repos_relpath,
           apr_int64_t *original_repos_id,
@@ -9061,8 +9081,11 @@ read_info(svn_wc__db_status_t *status,
             {
 
               err = svn_error_compose_create(
-                        err, svn_sqlite__column_checksum(checksum, stmt_info, 
6,
-                                                         result_pool));
+                        err,
+                        svn_wc__db_util_column_wc_checksum(checksum, wcroot,
+                                                           stmt_info, 6,
+                                                           result_pool,
+                                                           scratch_pool));
             }
         }
       if (recorded_size)
@@ -9260,7 +9283,7 @@ svn_wc__db_read_info_internal(svn_wc__db
                               apr_time_t *changed_date,
                               const char **changed_author,
                               svn_depth_t *depth,
-                              const svn_checksum_t **checksum,
+                              const svn_wc__db_checksum_t **checksum,
                               const char **target,
                               const char **original_repos_relpath,
                               apr_int64_t *original_repos_id,
@@ -9304,7 +9327,7 @@ svn_wc__db_read_info(svn_wc__db_status_t
                      apr_time_t *changed_date,
                      const char **changed_author,
                      svn_depth_t *depth,
-                     const svn_checksum_t **checksum,
+                     const svn_wc__db_checksum_t **checksum,
                      const char **target,
                      const char **original_repos_relpath,
                      const char **original_root_url,
@@ -9744,7 +9767,7 @@ read_single_info(const struct svn_wc__db
 {
   struct svn_wc__db_info_t *mtb;
   apr_int64_t repos_id;
-  const svn_checksum_t *checksum;
+  const svn_wc__db_checksum_t *checksum;
   const char *original_repos_relpath;
   svn_boolean_t have_work;
   apr_hash_t *properties;
@@ -9928,7 +9951,7 @@ svn_wc__db_read_pristine_info(svn_wc__db
                               apr_time_t *changed_date,
                               const char **changed_author,
                               svn_depth_t *depth,  /* dirs only */
-                              const svn_checksum_t **checksum, /* files only */
+                              const svn_wc__db_checksum_t **checksum, /* files 
only */
                               const char **target, /* symlinks only */
                               svn_boolean_t *had_props,
                               apr_hash_t **props,
@@ -10033,7 +10056,8 @@ svn_wc__db_read_pristine_info(svn_wc__db
       else
         {
           svn_error_t *err2;
-          err2 = svn_sqlite__column_checksum(checksum, stmt, 6, result_pool);
+          err2 = svn_wc__db_util_column_wc_checksum(checksum, wcroot, stmt, 6,
+                                                    result_pool, scratch_pool);
 
           if (err2 != NULL)
             {
@@ -10143,7 +10167,7 @@ svn_wc__db_read_children_walker_info(con
 
 svn_error_t *
 svn_wc__db_read_node_install_info(const char **wcroot_abspath,
-                                  const svn_checksum_t **checksum,
+                                  const svn_wc__db_checksum_t **checksum,
                                   apr_hash_t **pristine_props,
                                   apr_time_t *changed_date,
                                   svn_wc__db_t *db,
@@ -10193,7 +10217,8 @@ svn_wc__db_read_node_install_info(const
   if (have_row)
     {
       if (checksum)
-        err = svn_sqlite__column_checksum(checksum, stmt, 6, result_pool);
+        err = svn_wc__db_util_column_wc_checksum(checksum, wcroot, stmt, 6,
+                                                 result_pool, scratch_pool);
 
       if (!err && pristine_props)
         {
@@ -11782,7 +11807,7 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
             svn_revnum_t changed_rev,
             apr_time_t changed_date,
             const char *changed_author,
-            const svn_checksum_t *new_checksum,
+            const svn_wc__db_checksum_t *new_checksum,
             apr_hash_t *new_dav_cache,
             svn_boolean_t keep_changelist,
             svn_boolean_t no_unlock,
@@ -12007,8 +12032,8 @@ commit_node(svn_wc__db_wcroot_t *wcroot,
                                 changed_author,
                                 prop_blob.data, prop_blob.len));
 
-      SVN_ERR(svn_sqlite__bind_checksum(stmt, 13, new_checksum,
-                                        scratch_pool));
+      SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 13, new_checksum,
+                                               scratch_pool));
       SVN_ERR(svn_sqlite__bind_properties(stmt, 15, new_dav_cache,
                                           scratch_pool));
       if (inherited_prop_blob.data != NULL)
@@ -12094,7 +12119,7 @@ svn_wc__db_global_commit(svn_wc__db_t *d
                          svn_revnum_t changed_revision,
                          apr_time_t changed_date,
                          const char *changed_author,
-                         const svn_checksum_t *new_checksum,
+                         const svn_wc__db_checksum_t *new_checksum,
                          apr_hash_t *new_dav_cache,
                          svn_boolean_t keep_changelist,
                          svn_boolean_t no_unlock,
@@ -12136,7 +12161,7 @@ svn_wc__db_global_update(svn_wc__db_t *d
                          apr_time_t new_changed_date,
                          const char *new_changed_author,
                          const apr_array_header_t *new_children,
-                         const svn_checksum_t *new_checksum,
+                         const svn_wc__db_checksum_t *new_checksum,
                          const char *new_target,
                          const apr_hash_t *new_dav_cache,
                          const svn_skel_t *conflict,
@@ -13485,28 +13510,35 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_
                          const char *repos_uuid,
                          svn_boolean_t store_pristine,
                          svn_checksum_kind_t pristine_checksum_kind,
+                         svn_boolean_t pristine_checksum_use_salt,
                          apr_pool_t *scratch_pool)
 {
   svn_wc__db_wcroot_t *wcroot;
+  const svn_wc__db_checksum_kind_t *resolved_checksum_kind;
 
   /* Upgrade is inherently exclusive so specify exclusive locking. */
-  SVN_ERR(create_db(sdb, repos_id, wc_id, target_format,
-                    dir_abspath, repos_root_url, repos_uuid,
+  SVN_ERR(create_db(sdb, repos_id, wc_id,
+                    target_format, dir_abspath, repos_root_url, repos_uuid,
                     SDB_FILE,
                     NULL, SVN_INVALID_REVNUM, svn_depth_unknown,
                     store_pristine,
                     pristine_checksum_kind,
+                    pristine_checksum_use_salt,
                     TRUE /* exclusive */,
                     0 /* timeout */,
                     wc_db->state_pool, scratch_pool));
 
+  SVN_ERR(svn_wc__db_util_read_settings(NULL, &resolved_checksum_kind,
+                                        *sdb, target_format, *wc_id,
+                                        wc_db->state_pool, scratch_pool));
+
   SVN_ERR(svn_wc__db_pdh_create_wcroot(&wcroot,
                                        apr_pstrdup(wc_db->state_pool,
                                                    dir_abspath),
                                        *sdb, *wc_id, FORMAT_FROM_SDB,
                                        FALSE /* auto-upgrade */,
                                        store_pristine,
-                                       pristine_checksum_kind,
+                                       resolved_checksum_kind,
                                        wc_db->state_pool, scratch_pool));
 
   /* The WCROOT is complete. Stash it into DB.  */
@@ -16254,7 +16286,7 @@ typedef struct commit_queue_item_t
 
   /* The pristine text checksum. NULL if the old value should be kept
      and for directories */
-  const svn_checksum_t *new_checksum;
+  const svn_wc__db_checksum_t *new_checksum;
 
   apr_hash_t *new_dav_cache; /* New DAV cache for the node */
 } commit_queue_item_t;
@@ -16307,7 +16339,7 @@ svn_wc__db_commit_queue_add(svn_wc__db_c
                             svn_boolean_t is_commited,
                             svn_boolean_t remove_lock,
                             svn_boolean_t remove_changelist,
-                            const svn_checksum_t *new_checksum,
+                            const svn_wc__db_checksum_t *new_checksum,
                             apr_hash_t *new_dav_cache,
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool)
@@ -16354,14 +16386,14 @@ process_committed_leaf(svn_wc__db_t *db,
                        svn_wc__db_status_t status,
                        svn_node_kind_t kind,
                        svn_boolean_t prop_mods,
-                       const svn_checksum_t *old_checksum,
+                       const svn_wc__db_checksum_t *old_checksum,
                        svn_revnum_t new_revnum,
                        apr_time_t new_changed_date,
                        const char *new_changed_author,
                        apr_hash_t *new_dav_cache,
                        svn_boolean_t remove_lock,
                        svn_boolean_t remove_changelist,
-                       const svn_checksum_t *checksum,
+                       const svn_wc__db_checksum_t *checksum,
                        apr_pool_t *scratch_pool)
 {
   svn_revnum_t new_changed_rev = new_revnum;
@@ -16501,13 +16533,13 @@ process_committed_internal(svn_wc__db_t
                            apr_hash_t *new_dav_cache,
                            svn_boolean_t remove_lock,
                            svn_boolean_t remove_changelist,
-                           const svn_checksum_t *new_checksum,
+                           const svn_wc__db_checksum_t *new_checksum,
                            apr_hash_t *items_by_relpath,
                            apr_pool_t *scratch_pool)
 {
   svn_wc__db_status_t status;
   svn_node_kind_t kind;
-  const svn_checksum_t *old_checksum;
+  const svn_wc__db_checksum_t *old_checksum;
   svn_boolean_t prop_mods;
 
   SVN_ERR(svn_wc__db_read_info_internal(&status, &kind, NULL, NULL, NULL, 
NULL, NULL,

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.h 
(original)
+++ subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db.h Wed 
Mar 22 15:21:11 2023
@@ -220,6 +220,89 @@ typedef struct svn_wc__db_fileinfo_t {
 
 /* ### where/how to handle: text_time, locks, working_size */
 
+/* @defgroup svn_wc__db_checksum  Working copy checksums
+   @{
+*/
+
+/* Structure holding the information about a working copy checksum kind. */
+typedef struct svn_wc__db_checksum_kind_t
+{
+  svn_checksum_kind_t value;
+  const svn_string_t *salt;
+} svn_wc__db_checksum_kind_t;
+
+/* Create a new svn_wc__db_checksum_kind_t object.  SALT doesn't need to
+   have a specific lifetime, because it will be copied by the function
+   internally. */
+svn_wc__db_checksum_kind_t *
+svn_wc__db_checksum_kind_make(svn_checksum_kind_t kind,
+                              const svn_string_t *salt,
+                              apr_pool_t *result_pool);
+
+/* Duplicate an existing svn_wc__db_checksum_kind_t object.
+   If KIND is NULL then NULL is returned. */
+svn_wc__db_checksum_kind_t *
+svn_wc__db_checksum_kind_dup(const svn_wc__db_checksum_kind_t *kind,
+                             apr_pool_t *result_pool);
+
+/* Structure holding the information about a working copy checksum. */
+typedef struct svn_wc__db_checksum_t
+{
+  const svn_checksum_t *value;
+  const svn_string_t *salt;
+} svn_wc__db_checksum_t;
+
+/* Create a new svn_wc__db_checksum_t object.  VALUE and SALT don't need to
+   have a specific lifetime, because they will be copied by the function
+   internally. */
+svn_wc__db_checksum_t *
+svn_wc__db_checksum_make(const svn_checksum_t *value,
+                         const svn_string_t *salt,
+                         apr_pool_t *result_pool);
+
+/* Duplicate an existing svn_wc__db_checksum_t object.
+   If CHECKSUM is NULL then NULL is returned. */
+svn_wc__db_checksum_t *
+svn_wc__db_checksum_dup(const svn_wc__db_checksum_t *checksum,
+                        apr_pool_t *result_pool);
+
+/* Checks if two svn_wc__db_checksum_t objects match. */
+svn_boolean_t
+svn_wc__db_checksum_match(const svn_wc__db_checksum_t *checksum1,
+                          const svn_wc__db_checksum_t *checksum2);
+
+/* Return a stream that calculates WC checksums for all data read and
+   written.  The stream STREAM is used to read and write all data.
+
+   When the resulting stream is closed, *READ_CHECKSUM_P and *WRITE_CHECKSUM_P
+   are set to point to the resulting checksums, of type CHECKSUM_KIND and
+   using SALT.  Both READ_CHECKSUM_P and WRITE_CHECKSUM_P can be null, in
+   which case the respective checksum isn't calculated.
+
+   Read and write operations can be mixed without interfering. */
+svn_stream_t *
+svn_wc__db_checksum_stream(svn_wc__db_checksum_t **read_checksum_p,
+                           svn_wc__db_checksum_t **write_checksum_p,
+                           svn_stream_t *stream,
+                           svn_checksum_kind_t checksum_kind,
+                           const svn_string_t *salt,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool);
+
+/* Read the contents of the readable stream STREAM and return its
+   checksum of type CHECKSUM_KIND and using SALT, in *CHECKSUM_P.
+
+   The stream will be closed before this function returns (regardless
+   of the result, or any possible error). */
+svn_error_t *
+svn_wc__db_checksum_stream_contents(svn_wc__db_checksum_t **checksum_p,
+                                    svn_stream_t *stream,
+                                    svn_checksum_kind_t checksum_kind,
+                                    const svn_string_t *salt,
+                                    apr_pool_t *result_pool,
+                                    apr_pool_t *scratch_pool);
+
+/* @} */
 
 /*
   @defgroup svn_wc__db_admin  General administrative functions
@@ -298,7 +381,7 @@ svn_wc__db_close(svn_wc__db_t *db);
    depth, not svn_depth_unknown.
 
    Create the working copy with the given TARGET_FORMAT and settings
-   STORE_PRISTINE and PRISTINE_CHECKSUM_KIND.
+   STORE_PRISTINE, PRISTINE_CHECKSUM_KIND and PRISTINE_CHECKSUM_USE_SALT.
 
    Use SCRATCH_POOL for temporary allocations.
 */
@@ -313,6 +396,7 @@ svn_wc__db_init(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 *scratch_pool);
 
 /* Return the working copy settings *FORMAT_P, *STORE_PRISTINE_P and
@@ -323,9 +407,10 @@ svn_wc__db_init(svn_wc__db_t *db,
 svn_error_t *
 svn_wc__db_get_settings(int *format_p,
                         svn_boolean_t *store_pristine_p,
-                        svn_checksum_kind_t *pristine_checksum_kind_p,
+                        const svn_wc__db_checksum_kind_t 
**pristine_checksum_kind_p,
                         svn_wc__db_t *db,
                         const char *local_abspath,
+                        apr_pool_t *result_pool,
                         apr_pool_t *scratch_pool);
 
 /* Compute the LOCAL_RELPATH for the given LOCAL_ABSPATH, relative
@@ -549,7 +634,7 @@ svn_wc__db_base_add_file(svn_wc__db_t *d
                          svn_revnum_t changed_rev,
                          apr_time_t changed_date,
                          const char *changed_author,
-                         const svn_checksum_t *checksum,
+                         const svn_wc__db_checksum_t *checksum,
                          apr_hash_t *dav_cache,
                          svn_boolean_t delete_working,
                          svn_boolean_t update_actual_props,
@@ -814,7 +899,7 @@ svn_wc__db_base_get_info(svn_wc__db_stat
                          apr_time_t *changed_date,
                          const char **changed_author,
                          svn_depth_t *depth,
-                         const svn_checksum_t **checksum,
+                         const svn_wc__db_checksum_t **checksum,
                          const char **target,
                          svn_wc__db_lock_t **lock,
                          svn_boolean_t *had_props,
@@ -940,7 +1025,7 @@ svn_wc__db_base_get_lock_tokens_recursiv
 svn_error_t *
 svn_wc__db_pristine_get_future_path(const char **pristine_abspath,
                                     const char *wcroot_abspath,
-                                    const svn_checksum_t *checksum,
+                                    const svn_wc__db_checksum_t *checksum,
                                     apr_pool_t *result_pool,
                                     apr_pool_t *scratch_pool);
 
@@ -960,7 +1045,7 @@ svn_wc__db_pristine_read(svn_stream_t **
                          svn_filesize_t *size,
                          svn_wc__db_t *db,
                          const char *wri_abspath,
-                         const svn_checksum_t *checksum,
+                         const svn_wc__db_checksum_t *checksum,
                          apr_pool_t *result_pool,
                          apr_pool_t *scratch_pool);
 
@@ -985,7 +1070,7 @@ typedef struct svn_wc__db_install_data_t
 svn_error_t *
 svn_wc__db_pristine_prepare_install(svn_stream_t **stream,
                                     svn_wc__db_install_data_t **install_data,
-                                    svn_checksum_t **checksum,
+                                    svn_wc__db_checksum_t **checksum,
                                     svn_checksum_t **md5_checksum,
                                     svn_wc__db_t *db,
                                     const char *wri_abspath,
@@ -998,7 +1083,7 @@ svn_wc__db_pristine_prepare_install(svn_
    contents, CHECKSUM, and whose MD-5 checksum is MD5_CHECKSUM. */
 svn_error_t *
 svn_wc__db_pristine_install(svn_wc__db_install_data_t *install_data,
-                            const svn_checksum_t *checksum,
+                            const svn_wc__db_checksum_t *checksum,
                             const svn_checksum_t *md5_checksum,
                             apr_pool_t *scratch_pool);
 
@@ -1018,7 +1103,7 @@ svn_error_t *
 svn_wc__db_pristine_get_md5(const svn_checksum_t **md5_checksum,
                             svn_wc__db_t *db,
                             const char *wri_abspath,
-                            const svn_checksum_t *checksum,
+                            const svn_wc__db_checksum_t *checksum,
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool);
 
@@ -1035,7 +1120,7 @@ svn_wc__db_pristine_get_md5(const svn_ch
 
    Allocate *CHECKSUM in RESULT_POOL. */
 svn_error_t *
-svn_wc__db_pristine_lookup_by_md5(const svn_checksum_t **checksum,
+svn_wc__db_pristine_lookup_by_md5(const svn_wc__db_checksum_t **checksum,
                                   svn_wc__db_t *db,
                                   const char *wri_abspath,
                                   const svn_checksum_t *md5_checksum,
@@ -1049,7 +1134,7 @@ svn_wc__db_pristine_lookup_by_md5(const
 svn_error_t *
 svn_wc__db_pristine_remove(svn_wc__db_t *db,
                            const char *wri_abspath,
-                           const svn_checksum_t *checksum,
+                           const svn_wc__db_checksum_t *checksum,
                            apr_pool_t *scratch_pool);
 
 
@@ -1070,7 +1155,7 @@ svn_wc__db_pristine_check(svn_boolean_t
                           svn_boolean_t *hydrated,
                           svn_wc__db_t *db,
                           const char *wri_abspath,
-                          const svn_checksum_t *checksum,
+                          const svn_wc__db_checksum_t *checksum,
                           apr_pool_t *scratch_pool);
 
 /* If the pristine store for WRI_ABSPATH in DB contains a pristine text with
@@ -1079,7 +1164,7 @@ svn_wc__db_pristine_check(svn_boolean_t
 svn_error_t *
 svn_wc__db_pristine_dehydrate(svn_wc__db_t *db,
                               const char *wri_abspath,
-                              const svn_checksum_t *checksum,
+                              const svn_wc__db_checksum_t *checksum,
                               apr_pool_t *scratch_pool);
 
 /* @defgroup svn_wc__db_external  External management
@@ -1107,7 +1192,7 @@ svn_wc__db_external_add_file(svn_wc__db_
                              apr_time_t changed_date,
                              const char *changed_author,
 
-                             const svn_checksum_t *checksum,
+                             const svn_wc__db_checksum_t *checksum,
 
                              const apr_hash_t *dav_cache,
 
@@ -1306,7 +1391,7 @@ svn_wc__db_commit_queue_add(svn_wc__db_c
                             svn_boolean_t is_commited,
                             svn_boolean_t remove_lock,
                             svn_boolean_t remove_changelist,
-                            const svn_checksum_t *new_checksum,
+                            const svn_wc__db_checksum_t *new_checksum,
                             apr_hash_t *new_dav_cache,
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool);
@@ -1374,6 +1459,9 @@ svn_wc__db_externals_gather_definitions(
  * a move. The delete-half of the move needs to be created separately
  * with svn_wc__db_op_delete().
  *
+ * If NEW_CHECKSUM is non-NULL, use it as the checksum of the pristine
+ * contents of the copied node.
+ *
  * Add WORK_ITEMS to the work queue. */
 svn_error_t *
 svn_wc__db_op_copy(svn_wc__db_t *db,
@@ -1381,6 +1469,7 @@ svn_wc__db_op_copy(svn_wc__db_t *db,
                    const char *dst_abspath,
                    const char *dst_op_root_abspath,
                    svn_boolean_t is_move,
+                   const svn_wc__db_checksum_t *new_checksum,
                    const svn_skel_t *work_items,
                    apr_pool_t *scratch_pool);
 
@@ -1459,7 +1548,7 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db
                         const char *original_root_url,
                         const char *original_uuid,
                         svn_revnum_t original_revision,
-                        const svn_checksum_t *checksum,
+                        const svn_wc__db_checksum_t *checksum,
                         svn_boolean_t update_actual_props,
                         const apr_hash_t *new_actual_props,
                         svn_boolean_t is_move,
@@ -1961,7 +2050,7 @@ svn_wc__db_read_info(svn_wc__db_status_t
                      apr_time_t *changed_date,
                      const char **changed_author,
                      svn_depth_t *depth,  /* dirs only */
-                     const svn_checksum_t **checksum, /* files only */
+                     const svn_wc__db_checksum_t **checksum, /* files only */
                      const char **target, /* symlinks only */
 
                      /* ### the following fields if copied/moved (history) */
@@ -2119,7 +2208,7 @@ svn_wc__db_read_pristine_info(svn_wc__db
                               apr_time_t *changed_date,
                               const char **changed_author,
                               svn_depth_t *depth,  /* dirs only */
-                              const svn_checksum_t **checksum, /* files only */
+                              const svn_wc__db_checksum_t **checksum, /* files 
only */
                               const char **target, /* symlinks only */
                               svn_boolean_t *had_props,
                               apr_hash_t **props,
@@ -2140,7 +2229,7 @@ svn_wc__db_read_pristine_info(svn_wc__db
    */
 svn_error_t *
 svn_wc__db_read_node_install_info(const char **wcroot_abspath,
-                                  const svn_checksum_t **checksum,
+                                  const svn_wc__db_checksum_t **checksum,
                                   apr_hash_t **pristine_props,
                                   apr_time_t *changed_date,
                                   svn_wc__db_t *db,
@@ -2543,7 +2632,7 @@ svn_wc__db_global_commit(svn_wc__db_t *d
                          svn_revnum_t changed_revision,
                          apr_time_t changed_date,
                          const char *changed_author,
-                         const svn_checksum_t *new_checksum,
+                         const svn_wc__db_checksum_t *new_checksum,
                          apr_hash_t *new_dav_cache,
                          svn_boolean_t keep_changelist,
                          svn_boolean_t no_unlock,
@@ -2589,7 +2678,7 @@ svn_wc__db_global_update(svn_wc__db_t *d
                          apr_time_t new_changed_date,
                          const char *new_changed_author,
                          const apr_array_header_t *new_children,
-                         const svn_checksum_t *new_checksum,
+                         const svn_wc__db_checksum_t *new_checksum,
                          const char *new_target,
                          const apr_hash_t *new_dav_cache,
                          const svn_skel_t *conflict,
@@ -2959,6 +3048,7 @@ svn_wc__db_upgrade_begin(svn_sqlite__db_
                          const char *repos_uuid,
                          svn_boolean_t store_pristine,
                          svn_checksum_kind_t pristine_checksum_kind,
+                         svn_boolean_t pristine_checksum_use_salt,
                          apr_pool_t *scratch_pool);
 
 /* Simply insert (or replace) one row in the EXTERNALS table. */
@@ -3114,7 +3204,7 @@ typedef svn_error_t * (*svn_wc__db_textb
   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,

Added: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_checksum.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_checksum.c?rev=1908640&view=auto
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_checksum.c
 (added)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_checksum.c
 Wed Mar 22 15:21:11 2023
@@ -0,0 +1,305 @@
+/*
+ * wc_db_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.
+ * ====================================================================
+ */
+
+#define SVN_WC__I_AM_WC_DB
+
+#include "wc_db.h"
+
+static svn_wc__db_checksum_kind_t *
+make_checksum_kind(svn_checksum_kind_t value,
+                   const svn_string_t *salt,
+                   apr_pool_t *result_pool)
+{
+  svn_wc__db_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__db_checksum_kind_t *
+svn_wc__db_checksum_kind_make(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__db_checksum_kind_t *
+svn_wc__db_checksum_kind_dup(const svn_wc__db_checksum_kind_t *kind,
+                             apr_pool_t *result_pool)
+{
+  if (kind)
+    return make_checksum_kind(kind->value, kind->salt, result_pool);
+  else
+    return NULL;
+}
+
+static svn_wc__db_checksum_t *
+make_checksum(const svn_checksum_t *value,
+              const svn_string_t *salt,
+              apr_pool_t *result_pool)
+{
+  svn_wc__db_checksum_t *result;
+
+  result = apr_pcalloc(result_pool, sizeof(*result));
+  result->value = svn_checksum_dup(value, result_pool);
+  result->salt = svn_string_dup(salt, result_pool);
+
+  return result;
+}
+
+svn_wc__db_checksum_t *
+svn_wc__db_checksum_make(const svn_checksum_t *value,
+                         const svn_string_t *salt,
+                         apr_pool_t *result_pool)
+{
+  return make_checksum(value, salt, result_pool);
+}
+
+svn_wc__db_checksum_t *
+svn_wc__db_checksum_dup(const svn_wc__db_checksum_t *checksum,
+                        apr_pool_t *result_pool)
+{
+  if (checksum)
+    return make_checksum(checksum->value, checksum->salt, result_pool);
+  else
+    return NULL;
+}
+
+svn_boolean_t
+svn_wc__db_checksum_match(const svn_wc__db_checksum_t *checksum1,
+                          const svn_wc__db_checksum_t *checksum2)
+{
+  return svn_string_compare(checksum1->salt, checksum2->salt) &&
+         svn_checksum_match(checksum1->value, checksum2->value);
+}
+
+/* Baton for the pristine checksum stream. */
+typedef struct checksum_stream_baton_t
+{
+  apr_pool_t *pool;
+  svn_stream_t *stream;
+  const svn_string_t *salt;
+  svn_checksum_ctx_t *read_ctx;
+  svn_wc__db_checksum_t **read_checksum_p;
+  svn_checksum_ctx_t *write_ctx;
+  svn_wc__db_checksum_t **write_checksum_p;
+} checksum_stream_baton_t;
+
+/* Implements svn_read_fn_t. */
+static svn_error_t *
+checksum_stream_read_fn(void *baton, char *buffer, apr_size_t *len)
+{
+  checksum_stream_baton_t *b = baton;
+
+  SVN_ERR(svn_stream_read2(b->stream, buffer, len));
+
+  if (b->read_ctx)
+    SVN_ERR(svn_checksum_update(b->read_ctx, buffer, *len));
+
+  return SVN_NO_ERROR;
+}
+
+/* Implements svn_read_fn_t. */
+static svn_error_t *
+checksum_stream_read_full_fn(void *baton, char *buffer, apr_size_t *len)
+{
+  checksum_stream_baton_t *b = baton;
+
+  SVN_ERR(svn_stream_read_full(b->stream, buffer, len));
+
+  if (b->read_ctx)
+    SVN_ERR(svn_checksum_update(b->read_ctx, buffer, *len));
+
+  return SVN_NO_ERROR;
+}
+
+/* Implements svn_write_fn_t. */
+static svn_error_t *
+checksum_stream_write_fn(void *baton, const char *buffer, apr_size_t *len)
+{
+  checksum_stream_baton_t *b = baton;
+
+  SVN_ERR(svn_stream_write(b->stream, buffer, len));
+
+  if (b->write_ctx)
+    SVN_ERR(svn_checksum_update(b->write_ctx, buffer, *len));
+
+  return SVN_NO_ERROR;
+}
+
+/* Implements svn_stream_data_available_fn_t. */
+static svn_error_t *
+checksum_stream_data_available_fn(void *baton, svn_boolean_t *data_available)
+{
+  checksum_stream_baton_t *b = baton;
+
+  SVN_ERR(svn_stream_data_available(b->stream, data_available));
+
+  return SVN_NO_ERROR;
+}
+
+/* Implements svn_stream_seek_fn_t. */
+static svn_error_t *
+checksum_stream_seek_fn(void *baton, const svn_stream_mark_t *mark)
+{
+  checksum_stream_baton_t *b = baton;
+
+  /* Only reset support. */
+  if (mark)
+    {
+      return svn_error_create(SVN_ERR_STREAM_SEEK_NOT_SUPPORTED,
+                              NULL, NULL);
+    }
+  else
+    {
+      if (b->read_ctx)
+        SVN_ERR(svn_checksum_ctx_reset(b->read_ctx));
+
+      if (b->write_ctx)
+        SVN_ERR(svn_checksum_ctx_reset(b->write_ctx));
+
+      SVN_ERR(svn_stream_reset(b->stream));
+    }
+
+  return SVN_NO_ERROR;
+}
+
+/* Implements svn_close_fn_t. */
+static svn_error_t *
+checksum_stream_close_fn(void *baton)
+{
+  checksum_stream_baton_t *b = baton;
+
+  if (b->read_ctx)
+    {
+      svn_checksum_t *checksum;
+      SVN_ERR(svn_checksum_final(&checksum, b->read_ctx, b->pool));
+      *b->read_checksum_p = make_checksum(checksum, b->salt, b->pool);
+    }
+
+  if (b->write_ctx)
+    {
+      svn_checksum_t *checksum;
+      SVN_ERR(svn_checksum_final(&checksum, b->write_ctx, b->pool));
+      *b->write_checksum_p = make_checksum(checksum, b->salt, b->pool);
+    }
+
+  SVN_ERR(svn_stream_close(b->stream));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_stream_t *
+make_checksum_stream(svn_wc__db_checksum_t **read_checksum_p,
+                     svn_wc__db_checksum_t **write_checksum_p,
+                     svn_stream_t *inner_stream,
+                     svn_checksum_kind_t checksum_kind,
+                     const svn_string_t *salt,
+                     apr_pool_t *result_pool,
+                     apr_pool_t *scratch_pool)
+{
+  checksum_stream_baton_t *baton;
+  svn_stream_t *checksum_stream;
+
+  if (!read_checksum_p && !write_checksum_p)
+    return inner_stream;
+
+  baton = apr_pcalloc(result_pool, sizeof(*baton));
+  baton->pool = result_pool;
+  baton->stream = inner_stream;
+  baton->salt = svn_string_dup(salt, result_pool);
+
+  if (read_checksum_p)
+    baton->read_ctx = svn_checksum_ctx_create2(checksum_kind, salt, 
result_pool);
+  else
+    baton->read_ctx = NULL;
+
+  baton->read_checksum_p = read_checksum_p;
+
+  if (write_checksum_p)
+    baton->write_ctx = svn_checksum_ctx_create2(checksum_kind, salt, 
result_pool);
+  else
+    baton->write_ctx = NULL;
+
+  baton->write_checksum_p = write_checksum_p;
+
+  checksum_stream = svn_stream_create(baton, result_pool);
+
+  if (svn_stream_supports_partial_read(inner_stream))
+    {
+      svn_stream_set_read2(checksum_stream,
+                           checksum_stream_read_fn,
+                           checksum_stream_read_full_fn);
+    }
+  else
+    {
+      svn_stream_set_read2(checksum_stream,
+                           NULL,
+                           checksum_stream_read_full_fn);
+    }
+
+  svn_stream_set_write(checksum_stream, checksum_stream_write_fn);
+  svn_stream_set_data_available(checksum_stream, 
checksum_stream_data_available_fn);
+  if (svn_stream_supports_reset(inner_stream))
+    svn_stream_set_seek(checksum_stream, checksum_stream_seek_fn);
+  svn_stream_set_close(checksum_stream, checksum_stream_close_fn);
+
+  return checksum_stream;
+}
+
+svn_stream_t *
+svn_wc__db_checksum_stream(svn_wc__db_checksum_t **read_checksum_p,
+                           svn_wc__db_checksum_t **write_checksum_p,
+                           svn_stream_t *stream,
+                           svn_checksum_kind_t checksum_kind,
+                           const svn_string_t *salt,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool)
+{
+  return make_checksum_stream(read_checksum_p, write_checksum_p, stream,
+                              checksum_kind, salt,
+                              result_pool, scratch_pool);
+}
+
+svn_error_t *
+svn_wc__db_checksum_stream_contents(svn_wc__db_checksum_t **checksum_p,
+                                    svn_stream_t *stream,
+                                    svn_checksum_kind_t checksum_kind,
+                                    const svn_string_t *salt,
+                                    apr_pool_t *result_pool,
+                                    apr_pool_t *scratch_pool)
+{
+  svn_stream_t *checksum_stream;
+
+  checksum_stream =  make_checksum_stream(checksum_p, NULL, stream,
+                                          checksum_kind, salt,
+                                          result_pool, scratch_pool);
+  SVN_ERR(svn_stream_copy3(checksum_stream, svn_stream_empty(scratch_pool),
+                           NULL, NULL, scratch_pool));
+
+  return SVN_NO_ERROR;
+}

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_pristine.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_pristine.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_pristine.c
 (original)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_pristine.c
 Wed Mar 22 15:21:11 2023
@@ -52,12 +52,12 @@
 static svn_error_t *
 get_pristine_fname(const char **pristine_abspath,
                    const char *wcroot_abspath,
-                   const svn_checksum_t *checksum,
+                   const svn_wc__db_checksum_t *checksum,
                    apr_pool_t *result_pool,
                    apr_pool_t *scratch_pool)
 {
   const char *base_dir_abspath;
-  const char *hexdigest = svn_checksum_to_cstring(checksum, scratch_pool);
+  const char *hexdigest;
   const char *checksum_prefix;
   const char *subdir;
   char shard[3];
@@ -66,7 +66,9 @@ get_pristine_fname(const char **pristine
   SVN_ERR_ASSERT(pristine_abspath != NULL);
   SVN_ERR_ASSERT(svn_dirent_is_absolute(wcroot_abspath));
   SVN_ERR_ASSERT(checksum != NULL);
+  SVN_ERR_ASSERT(checksum->value != NULL);
 
+  hexdigest = svn_checksum_to_cstring(checksum->value, scratch_pool);
   base_dir_abspath = svn_dirent_join_many(scratch_pool,
                                           wcroot_abspath,
                                           svn_wc_get_adm_dir(scratch_pool),
@@ -77,17 +79,33 @@ get_pristine_fname(const char **pristine
   SVN_ERR_ASSERT(hexdigest != NULL);
 
   /* Prefix the subdir name with the checksum kind. */
-  switch (checksum->kind)
+  if (checksum->value->kind == svn_checksum_sha1 &&
+      svn_string_isempty(checksum->salt))
     {
-      case svn_checksum_sha1:
-        /* No prefix for SHA1 for historical reasons. */
-        checksum_prefix = "";
-        break;
-      case svn_checksum_sha1_salted:
-        checksum_prefix = "ssh1-";
-        break;
-      default:
-        SVN_ERR_MALFUNCTION();
+      /* Compatibility: use empty prefix for non-salted SHA1. */
+      checksum_prefix = "";
+    }
+  else
+    {
+      const char *salt_str;
+      const char *kind_str;
+
+      if (svn_string_isempty(checksum->salt))
+        salt_str = "";
+      else
+        salt_str = "s";
+
+      switch (checksum->value->kind)
+        {
+          case svn_checksum_sha1:
+            kind_str = "sha1";
+            break;
+          default:
+            SVN_ERR_MALFUNCTION();
+        }
+
+      checksum_prefix = apr_pstrcat(scratch_pool, salt_str, kind_str, "-",
+                                    SVN_VA_NULL);
     }
 
   /* Get the first two characters of the digest, for the shard name. */
@@ -113,7 +131,7 @@ get_pristine_fname(const char **pristine
 svn_error_t *
 svn_wc__db_pristine_get_future_path(const char **pristine_abspath,
                                     const char *wcroot_abspath,
-                                    const svn_checksum_t *checksum,
+                                    const svn_wc__db_checksum_t *checksum,
                                     apr_pool_t *result_pool,
                                     apr_pool_t *scratch_pool)
 {
@@ -132,7 +150,7 @@ stmt_select_pristine(svn_boolean_t *have
                      svn_filesize_t *size,
                      svn_boolean_t *hydrated,
                      svn_wc__db_wcroot_t *wcroot,
-                     const svn_checksum_t *checksum,
+                     const svn_wc__db_checksum_t *checksum,
                      apr_pool_t *result_pool,
                      apr_pool_t *scratch_pool)
 {
@@ -145,7 +163,8 @@ stmt_select_pristine(svn_boolean_t *have
               ? STMT_SELECT_PRISTINE_F32
               : STMT_SELECT_PRISTINE_F31);
   SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_num));
-  SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, checksum, scratch_pool));
+  SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 1, checksum,
+                                           scratch_pool));
   SVN_ERR(svn_sqlite__step(have_row, stmt));
   if (!*have_row)
     {
@@ -189,7 +208,7 @@ static svn_error_t *
 pristine_read_txn(svn_stream_t **contents,
                   svn_filesize_t *size,
                   svn_wc__db_wcroot_t *wcroot,
-                  const svn_checksum_t *checksum,
+                  const svn_wc__db_checksum_t *checksum,
                   const char *pristine_abspath,
                   apr_pool_t *result_pool,
                   apr_pool_t *scratch_pool)
@@ -207,7 +226,7 @@ pristine_read_txn(svn_stream_t **content
       return svn_error_createf(SVN_ERR_WC_PATH_NOT_FOUND, NULL,
                                _("Pristine text '%s' not present"),
                                svn_checksum_to_cstring_display(
-                                 checksum, scratch_pool));
+                                 checksum->value, scratch_pool));
     }
 
   if (contents)
@@ -241,7 +260,7 @@ svn_wc__db_pristine_read(svn_stream_t **
                          svn_filesize_t *size,
                          svn_wc__db_t *db,
                          const char *wri_abspath,
-                         const svn_checksum_t *checksum,
+                         const svn_wc__db_checksum_t *checksum,
                          apr_pool_t *result_pool,
                          apr_pool_t *scratch_pool)
 {
@@ -349,7 +368,7 @@ pristine_install_txn(svn_wc__db_wcroot_t
                      /* The target path for the file (within the pristine 
store). */
                      const char *pristine_abspath,
                      /* The pristine text's checksum. */
-                     const svn_checksum_t *checksum,
+                     const svn_wc__db_checksum_t *checksum,
                      /* The pristine text's MD-5 checksum. */
                      const svn_checksum_t *md5_checksum,
                      apr_pool_t *scratch_pool)
@@ -395,7 +414,8 @@ pristine_install_txn(svn_wc__db_wcroot_t
   stmt_num = (wcroot->format >= SVN_WC__HAS_OPTIONAL_PRISTINE
               ? STMT_UPSERT_PRISTINE_F32 : STMT_UPSERT_PRISTINE_F31);
   SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, stmt_num));
-  SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, checksum, scratch_pool));
+  SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 1, checksum,
+                                           scratch_pool));
   SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool));
   SVN_ERR(svn_sqlite__bind_int64(stmt, 3, install_data->size));
   if (wcroot->format >= SVN_WC__HAS_OPTIONAL_PRISTINE)
@@ -408,7 +428,7 @@ pristine_install_txn(svn_wc__db_wcroot_t
 svn_error_t *
 svn_wc__db_pristine_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 *wri_abspath,
@@ -435,7 +455,7 @@ svn_wc__db_pristine_prepare_install(svn_
 svn_error_t *
 svn_wc__db_pristine_prepare_install_internal(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_wcroot_t *wcroot,
                                              svn_boolean_t hydrated,
@@ -474,9 +494,10 @@ svn_wc__db_pristine_prepare_install_inte
     stream = svn_stream_checksummed2(stream, NULL, md5_checksum_p,
                                      svn_checksum_md5, FALSE, result_pool);
   if (checksum_p)
-    stream = svn_stream_checksummed2(stream, NULL, checksum_p,
-                                     wcroot->pristine_checksum_kind,
-                                     FALSE, result_pool);
+    stream = svn_wc__db_checksum_stream(NULL, checksum_p, stream,
+                                        wcroot->pristine_checksum_kind->value,
+                                        wcroot->pristine_checksum_kind->salt,
+                                        result_pool, scratch_pool);
 
   *stream_p = stream;
   *install_data_p = install_data;
@@ -486,7 +507,7 @@ svn_wc__db_pristine_prepare_install_inte
 
 svn_error_t *
 svn_wc__db_pristine_install(svn_wc__db_install_data_t *install_data,
-                            const svn_checksum_t *checksum,
+                            const svn_wc__db_checksum_t *checksum,
                             const svn_checksum_t *md5_checksum,
                             apr_pool_t *scratch_pool)
 {
@@ -494,6 +515,7 @@ svn_wc__db_pristine_install(svn_wc__db_i
   const char *pristine_abspath;
 
   SVN_ERR_ASSERT(checksum != NULL);
+  SVN_ERR_ASSERT(checksum->value != NULL);
   SVN_ERR_ASSERT(md5_checksum != NULL);
   SVN_ERR_ASSERT(md5_checksum->kind == svn_checksum_md5);
 
@@ -530,7 +552,7 @@ svn_error_t *
 svn_wc__db_pristine_get_md5(const svn_checksum_t **md5_checksum,
                             svn_wc__db_t *db,
                             const char *wri_abspath,
-                            const svn_checksum_t *checksum,
+                            const svn_wc__db_checksum_t *checksum,
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool)
 {
@@ -540,6 +562,7 @@ svn_wc__db_pristine_get_md5(const svn_ch
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
   SVN_ERR_ASSERT(checksum != NULL);
+  SVN_ERR_ASSERT(checksum->value != NULL);
 
   SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
                               wri_abspath, scratch_pool, scratch_pool));
@@ -552,7 +575,7 @@ svn_wc__db_pristine_get_md5(const svn_ch
     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_ASSERT((*md5_checksum)->kind == svn_checksum_md5);
@@ -562,7 +585,7 @@ svn_wc__db_pristine_get_md5(const svn_ch
 
 
 svn_error_t *
-svn_wc__db_pristine_lookup_by_md5(const svn_checksum_t **checksum,
+svn_wc__db_pristine_lookup_by_md5(const svn_wc__db_checksum_t **checksum,
                                   svn_wc__db_t *db,
                                   const char *wri_abspath,
                                   const svn_checksum_t *md5_checksum,
@@ -593,7 +616,8 @@ svn_wc__db_pristine_lookup_by_md5(const
                              svn_checksum_to_cstring_display(md5_checksum,
                                                              scratch_pool));
 
-  SVN_ERR(svn_sqlite__column_checksum(checksum, stmt, 0, result_pool));
+  SVN_ERR(svn_wc__db_util_column_wc_checksum(checksum, wcroot, stmt, 0,
+                                             result_pool, scratch_pool));
 
   return svn_error_trace(svn_sqlite__reset(stmt));
 }
@@ -608,7 +632,7 @@ svn_wc__db_pristine_lookup_by_md5(const
 static svn_error_t *
 pristine_remove_if_unreferenced_txn(svn_sqlite__db_t *sdb,
                                     svn_wc__db_wcroot_t *wcroot,
-                                    const svn_checksum_t *checksum,
+                                    const svn_wc__db_checksum_t *checksum,
                                     const char *pristine_abspath,
                                     apr_pool_t *scratch_pool)
 {
@@ -618,7 +642,8 @@ pristine_remove_if_unreferenced_txn(svn_
   /* Remove the DB row, if refcount is 0. */
   SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
                                     STMT_DELETE_PRISTINE_IF_UNREFERENCED));
-  SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, checksum, scratch_pool));
+  SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 1, checksum,
+                                           scratch_pool));
   SVN_ERR(svn_sqlite__update(&affected_rows, stmt));
 
   /* If we removed the DB row, then remove the file. */
@@ -635,7 +660,7 @@ pristine_remove_if_unreferenced_txn(svn_
  * Implements 'notes/wc-ng/pristine-store' section A-3(b). */
 static svn_error_t *
 pristine_remove_if_unreferenced(svn_wc__db_wcroot_t *wcroot,
-                                const svn_checksum_t *checksum,
+                                const svn_wc__db_checksum_t *checksum,
                                 apr_pool_t *scratch_pool)
 {
   const char *pristine_abspath;
@@ -656,7 +681,7 @@ pristine_remove_if_unreferenced(svn_wc__
 svn_error_t *
 svn_wc__db_pristine_remove(svn_wc__db_t *db,
                            const char *wri_abspath,
-                           const svn_checksum_t *checksum,
+                           const svn_wc__db_checksum_t *checksum,
                            apr_pool_t *scratch_pool)
 {
   svn_wc__db_wcroot_t *wcroot;
@@ -664,12 +689,7 @@ svn_wc__db_pristine_remove(svn_wc__db_t
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
   SVN_ERR_ASSERT(checksum != NULL);
-  /* ### Transitional: look up the checksum by MD-5.  Return an error
-   * if the pristine text is not in the store. */
-  if (checksum->kind == svn_checksum_md5)
-    SVN_ERR(svn_wc__db_pristine_lookup_by_md5(&checksum, db, wri_abspath,
-                                              checksum,
-                                              scratch_pool, scratch_pool));
+  SVN_ERR_ASSERT(checksum->value != NULL);
 
   SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
                               wri_abspath, scratch_pool, scratch_pool));
@@ -741,7 +761,7 @@ pristine_cleanup_wcroot(svn_wc__db_wcroo
   while (! err)
     {
       svn_boolean_t have_row;
-      const svn_checksum_t *checksum;
+      const svn_wc__db_checksum_t *checksum;
 
       svn_pool_clear(iterpool);
 
@@ -749,8 +769,8 @@ pristine_cleanup_wcroot(svn_wc__db_wcroo
       if (! have_row)
         break;
 
-      SVN_ERR(svn_sqlite__column_checksum(&checksum, stmt, 0,
-                                          iterpool));
+      SVN_ERR(svn_wc__db_util_column_wc_checksum(&checksum, wcroot, stmt, 0,
+                                                 iterpool, iterpool));
       err = pristine_remove_if_unreferenced(wcroot, checksum,
                                             iterpool);
     }
@@ -786,34 +806,35 @@ svn_wc__db_pristine_check(svn_boolean_t
                           svn_boolean_t *hydrated,
                           svn_wc__db_t *db,
                           const char *wri_abspath,
-                          const svn_checksum_t *checksum,
+                          const svn_wc__db_checksum_t *checksum,
                           apr_pool_t *scratch_pool)
 {
   svn_wc__db_wcroot_t *wcroot;
   const char *local_relpath;
-  svn_boolean_t have_row;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath));
   SVN_ERR_ASSERT(checksum != NULL);
+  SVN_ERR_ASSERT(checksum->value != NULL);
 
   SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
                               wri_abspath, scratch_pool, scratch_pool));
   VERIFY_USABLE_WCROOT(wcroot);
 
-  if (checksum->kind != wcroot->pristine_checksum_kind)
+  if (checksum->value->kind == wcroot->pristine_checksum_kind->value &&
+      svn_string_compare(checksum->salt, wcroot->pristine_checksum_kind->salt))
+    {
+      /* Check that there is an entry in the PRISTINE table. */
+      SVN_ERR(stmt_select_pristine(present, NULL, NULL, hydrated,
+                                   wcroot, checksum,
+                                   scratch_pool, scratch_pool));
+    }
+  else
     {
       *present = FALSE;
       if (hydrated)
         *hydrated = FALSE;
-
-      return SVN_NO_ERROR;
     }
 
-  /* Check that there is an entry in the PRISTINE table. */
-  SVN_ERR(stmt_select_pristine(&have_row, NULL, NULL, hydrated,
-                               wcroot, checksum,
-                               scratch_pool, scratch_pool));
-  *present = have_row;
   return SVN_NO_ERROR;
 }
 
@@ -821,7 +842,7 @@ svn_wc__db_pristine_check(svn_boolean_t
 svn_error_t *
 svn_wc__db_pristine_dehydrate(svn_wc__db_t *db,
                               const char *wri_abspath,
-                              const svn_checksum_t *checksum,
+                              const svn_wc__db_checksum_t *checksum,
                               apr_pool_t *scratch_pool)
 {
   svn_wc__db_wcroot_t *wcroot;
@@ -842,7 +863,7 @@ svn_wc__db_pristine_dehydrate(svn_wc__db
 
 svn_error_t *
 svn_wc__db_pristine_dehydrate_internal(svn_wc__db_wcroot_t *wcroot,
-                                       const svn_checksum_t *checksum,
+                                       const svn_wc__db_checksum_t *checksum,
                                        apr_pool_t *scratch_pool)
 {
   const char *pristine_abspath;
@@ -854,7 +875,8 @@ svn_wc__db_pristine_dehydrate_internal(s
 
   SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
                                     STMT_UPDATE_PRISTINE_HYDRATED));
-  SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, checksum, scratch_pool));
+  SVN_ERR(svn_wc__db_util_bind_wc_checksum(wcroot, stmt, 1, checksum,
+                                           scratch_pool));
   SVN_ERR(svn_sqlite__bind_int(stmt, 2, FALSE));
   SVN_ERR(svn_sqlite__update(NULL, stmt));
 

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_private.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_private.h?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_private.h 
(original)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_private.h 
Wed Mar 22 15:21:11 2023
@@ -112,7 +112,7 @@ typedef struct svn_wc__db_wcroot_t {
   svn_boolean_t store_pristine;
 
   /* The checksum kind used for the pristine contents. */
-  svn_checksum_kind_t pristine_checksum_kind;
+  const svn_wc__db_checksum_kind_t *pristine_checksum_kind;
 
 } svn_wc__db_wcroot_t;
 
@@ -121,8 +121,6 @@ typedef struct svn_wc__db_wcroot_t {
 typedef enum svn_wc__db_pristine_checksum_kind_t
 {
   svn_wc__db_pristine_checksum_sha1 = 1,
-  /* Available in working copy format 33 and later. */
-  svn_wc__db_pristine_checksum_sha1_salted = 2
 } svn_wc__db_pristine_checksum_kind_t;
 
 
@@ -133,8 +131,9 @@ svn_wc__db_close_many_wcroots(apr_hash_t
                               apr_pool_t *scratch_pool);
 
 
-/* Construct a new svn_wc__db_wcroot_t. The WCROOT_ABSPATH and SDB parameters
-   must have lifetime of at least RESULT_POOL.  */
+/* Construct a new svn_wc__db_wcroot_t. The WCROOT_ABSPATH, SDB and
+   PRISTINE_CHECKSUM_KIND parameters must have lifetime of at least
+   RESULT_POOL.  */
 svn_error_t *
 svn_wc__db_pdh_create_wcroot(svn_wc__db_wcroot_t **wcroot,
                              const char *wcroot_abspath,
@@ -143,7 +142,7 @@ svn_wc__db_pdh_create_wcroot(svn_wc__db_
                              int format,
                              svn_boolean_t verify_format,
                              svn_boolean_t store_pristine,
-                             svn_checksum_kind_t pristine_checksum_kind,
+                             const svn_wc__db_checksum_kind_t 
*pristine_checksum_kind,
                              apr_pool_t *result_pool,
                              apr_pool_t *scratch_pool);
 
@@ -235,6 +234,33 @@ svn_wc__db_util_open_db(svn_sqlite__db_t
                         apr_pool_t *result_pool,
                         apr_pool_t *scratch_pool);
 
+/* Read and return the settings for WC_ID in SDB. */
+svn_error_t *
+svn_wc__db_util_read_settings(svn_boolean_t *store_pristine_p,
+                              const svn_wc__db_checksum_kind_t 
**pristine_checksum_kind_p,
+                              svn_sqlite__db_t *sdb,
+                              int format,
+                              apr_int64_t wc_id,
+                              apr_pool_t *result_pool,
+                              apr_pool_t *scratch_pool);
+
+/* Deserialize SQLite column data as svn_wc__db_checksum_t. */
+svn_error_t *
+svn_wc__db_util_column_wc_checksum(const svn_wc__db_checksum_t **checksum_p,
+                                   svn_wc__db_wcroot_t *wcroot,
+                                   svn_sqlite__stmt_t *stmt,
+                                   int slot,
+                                   apr_pool_t *result_pool,
+                                   apr_pool_t *scratch_pool);
+
+/* Serialize SQLite column data as svn_wc__db_checksum_t. */
+svn_error_t *
+svn_wc__db_util_bind_wc_checksum(svn_wc__db_wcroot_t *wcroot,
+                                 svn_sqlite__stmt_t *stmt,
+                                 int slot,
+                                 const svn_wc__db_checksum_t *checksum,
+                                 apr_pool_t *scratch_pool);
+
 /* Like svn_wc__db_wq_add() but taking WCROOT */
 svn_error_t *
 svn_wc__db_wq_add_internal(svn_wc__db_wcroot_t *wcroot,
@@ -254,7 +280,7 @@ svn_wc__db_read_info_internal(svn_wc__db
                               apr_time_t *changed_date,
                               const char **changed_author,
                               svn_depth_t *depth,
-                              const svn_checksum_t **checksum,
+                              const svn_wc__db_checksum_t **checksum,
                               const char **target,
                               const char **original_repos_relpath,
                               apr_int64_t *original_repos_id,
@@ -287,7 +313,7 @@ svn_wc__db_base_get_info_internal(svn_wc
                                   apr_time_t *changed_date,
                                   const char **changed_author,
                                   svn_depth_t *depth,
-                                  const svn_checksum_t **checksum,
+                                  const svn_wc__db_checksum_t **checksum,
                                   const char **target,
                                   svn_wc__db_lock_t **lock,
                                   svn_boolean_t *had_props,
@@ -322,7 +348,7 @@ svn_wc__db_depth_get_info(svn_wc__db_sta
                           apr_time_t *changed_date,
                           const char **changed_author,
                           svn_depth_t *depth,
-                          const svn_checksum_t **checksum,
+                          const svn_wc__db_checksum_t **checksum,
                           const char **target,
                           svn_boolean_t *had_props,
                           apr_hash_t **props,
@@ -584,7 +610,7 @@ svn_wc__db_verify_db_full_internal(svn_w
 svn_error_t *
 svn_wc__db_pristine_prepare_install_internal(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_wcroot_t *wcroot,
                                              svn_boolean_t hydrated,
@@ -595,7 +621,7 @@ svn_wc__db_pristine_prepare_install_inte
    of DB+WRI_ABSPATH. */
 svn_error_t *
 svn_wc__db_pristine_dehydrate_internal(svn_wc__db_wcroot_t *wcroot,
-                                       const svn_checksum_t *checksum,
+                                       const svn_wc__db_checksum_t *checksum,
                                        apr_pool_t *scratch_pool);
 
 #endif /* WC_DB_PRIVATE_H */

Modified: 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_textbase.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_textbase.c?rev=1908640&r1=1908639&r2=1908640&view=diff
==============================================================================
--- 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_textbase.c
 (original)
+++ 
subversion/branches/pristine-checksum-salt/subversion/libsvn_wc/wc_db_textbase.c
 Wed Mar 22 15:21:11 2023
@@ -91,7 +91,7 @@ svn_wc__db_textbase_walk(svn_wc__db_t *d
       svn_boolean_t have_row;
       const char *node_relpath;
       int op_depth;
-      const svn_checksum_t *checksum;
+      const svn_wc__db_checksum_t *checksum;
       const char *node_abspath;
       svn_boolean_t have_props;
       svn_filesize_t recorded_size;
@@ -120,7 +120,8 @@ svn_wc__db_textbase_walk(svn_wc__db_t *d
       node_abspath = svn_dirent_join(wcroot->abspath, node_relpath, iterpool);
       op_depth = svn_sqlite__column_int(stmt, 2);
 
-      err = svn_sqlite__column_checksum(&checksum, stmt, 3, iterpool);
+      err = svn_wc__db_util_column_wc_checksum(&checksum, wcroot, stmt, 3,
+                                               iterpool, iterpool);
       if (err)
         return svn_error_compose_create(err, svn_sqlite__reset(stmt));
 
@@ -165,7 +166,7 @@ textbase_hydrate(svn_wc__db_wcroot_t *wc
                  void *fetch_baton,
                  svn_cancel_func_t cancel_func,
                  void *cancel_baton,
-                 const svn_checksum_t *checksum,
+                 const svn_wc__db_checksum_t *checksum,
                  const char *repos_root_url,
                  const char *repos_relpath,
                  svn_revnum_t revision,
@@ -173,7 +174,7 @@ textbase_hydrate(svn_wc__db_wcroot_t *wc
 {
   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;
 
@@ -191,10 +192,10 @@ textbase_hydrate(svn_wc__db_wcroot_t *wc
     return svn_error_compose_create(err,
              svn_wc__db_pristine_install_abort(install_data, scratch_pool));
 
-  if (!svn_checksum_match(checksum, install_checksum))
+  if (!svn_wc__db_checksum_match(checksum, install_checksum))
     {
       err = svn_checksum_mismatch_err(
-              checksum, install_checksum, scratch_pool,
+              checksum->value, install_checksum->value, scratch_pool,
               _("Checksum mismatch while fetching text base"));
 
       return svn_error_compose_create(err,
@@ -244,7 +245,7 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
   while (1)
     {
       svn_boolean_t have_row;
-      const svn_checksum_t *checksum;
+      const svn_wc__db_checksum_t *checksum;
       svn_boolean_t hydrated;
       svn_boolean_t referenced;
       svn_error_t *err;
@@ -262,7 +263,8 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
       if (!have_row)
         break;
 
-      err = svn_sqlite__column_checksum(&checksum, stmt, 0, iterpool);
+      err = svn_wc__db_util_column_wc_checksum(&checksum, wcroot, stmt, 0,
+                                               iterpool, iterpool);
       if (err)
         return svn_error_compose_create(err, svn_sqlite__reset(stmt));
 
@@ -282,7 +284,8 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
                   return svn_error_createf(
                            SVN_ERR_WC_CORRUPT, svn_sqlite__reset(stmt),
                            _("Unexpected entry for '%s'"),
-                           svn_checksum_to_cstring_display(checksum, 
iterpool));
+                           svn_checksum_to_cstring_display(checksum->value,
+                                                           iterpool));
                 }
 
               if (!repos_root_url)
@@ -294,7 +297,8 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
                       return svn_error_createf(
                                SVN_ERR_WC_CORRUPT, svn_sqlite__reset(stmt),
                                _("Unexpected entry for '%s'"),
-                               svn_checksum_to_cstring_display(checksum, 
iterpool));
+                               svn_checksum_to_cstring_display(checksum->value,
+                                                               iterpool));
                     }
 
                   err = svn_wc__db_fetch_repos_info(&repos_root_url, NULL, 
wcroot,
@@ -308,7 +312,8 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
                   return svn_error_createf(
                            SVN_ERR_WC_CORRUPT, svn_sqlite__reset(stmt),
                            _("Unexpected entry for '%s'"),
-                           svn_checksum_to_cstring_display(checksum, 
iterpool));
+                           svn_checksum_to_cstring_display(checksum->value,
+                                                           iterpool));
                 }
 
               revision = svn_sqlite__column_revnum(stmt, 5);
@@ -317,7 +322,8 @@ svn_wc__db_textbase_sync(svn_wc__db_t *d
                   return svn_error_createf(
                            SVN_ERR_WC_CORRUPT, svn_sqlite__reset(stmt),
                            _("Unexpected entry for '%s'"),
-                           svn_checksum_to_cstring_display(checksum, 
iterpool));
+                           svn_checksum_to_cstring_display(checksum->value,
+                                                           iterpool));
                 }
 
               err = textbase_hydrate(wcroot, fetch_callback, fetch_baton,



Reply via email to