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,