svn_error_t * svn_wc__open_writable_base(svn_stream_t **stream, const char **temp_base_abspath, svn_checksum_t **md5_checksum, svn_checksum_t **sha1_checksum, svn_wc__db_t *db, const char *wri_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { const char *temp_dir_abspath; SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath)); SVN_ERR(svn_wc__db_pristine_get_tempdir(&temp_dir_abspath, db, wri_abspath, scratch_pool, scratch_pool)); SVN_ERR(svn_stream_open_unique(stream, temp_base_abspath, temp_dir_abspath, svn_io_file_del_none, result_pool, scratch_pool)); if (md5_checksum) *stream = svn_stream_checksummed2(*stream, NULL, md5_checksum, svn_checksum_md5, FALSE, result_pool); if (sha1_checksum) *stream = svn_stream_checksummed2(*stream, NULL, sha1_checksum, svn_checksum_sha1, FALSE, result_pool); return SVN_NO_ERROR; }
svn_error_t * svn_fs_file_checksum(svn_checksum_t **checksum, svn_checksum_kind_t kind, svn_fs_root_t *root, const char *path, svn_boolean_t force, apr_pool_t *pool) { SVN_ERR(root->vtable->file_checksum(checksum, kind, root, path, pool)); if (force && (*checksum == NULL || (*checksum)->kind != kind)) { svn_stream_t *contents, *checksum_contents; SVN_ERR(svn_fs_file_contents(&contents, root, path, pool)); checksum_contents = svn_stream_checksummed2(contents, checksum, NULL, kind, TRUE, pool); /* This will force a read of any remaining data (which is all of it in this case) and dump the checksum into checksum->digest. */ SVN_ERR(svn_stream_close(checksum_contents)); } return SVN_NO_ERROR; }
svn_error_t * svn_wc__db_pristine_prepare_install(svn_stream_t **stream, svn_wc__db_install_data_t **install_data, svn_checksum_t **sha1_checksum, svn_checksum_t **md5_checksum, svn_wc__db_t *db, const char *wri_abspath, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_wc__db_wcroot_t *wcroot; const char *local_relpath; const char *temp_dir_abspath; SVN_ERR_ASSERT(svn_dirent_is_absolute(wri_abspath)); SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db, wri_abspath, scratch_pool, scratch_pool)); VERIFY_USABLE_WCROOT(wcroot); temp_dir_abspath = pristine_get_tempdir(wcroot, scratch_pool, scratch_pool); *install_data = apr_pcalloc(result_pool, sizeof(**install_data)); (*install_data)->wcroot = wcroot; SVN_ERR_W(svn_stream__create_for_install(stream, temp_dir_abspath, result_pool, scratch_pool), _("Unable to create pristine install stream")); (*install_data)->inner_stream = *stream; if (md5_checksum) *stream = svn_stream_checksummed2(*stream, NULL, md5_checksum, svn_checksum_md5, FALSE, result_pool); if (sha1_checksum) *stream = svn_stream_checksummed2(*stream, NULL, sha1_checksum, svn_checksum_sha1, FALSE, result_pool); return SVN_NO_ERROR; }
svn_stream_t * svn_stream_checksummed(svn_stream_t *stream, const unsigned char **read_digest, const unsigned char **write_digest, svn_boolean_t read_all, apr_pool_t *pool) { svn_stream_t *s; struct md5_stream_baton *baton; if (! read_digest && ! write_digest) return stream; baton = apr_palloc(pool, sizeof(*baton)); baton->read_digest = read_digest; baton->write_digest = write_digest; baton->pool = pool; /* Set BATON->proxy to a stream that will fill in BATON->read_checksum * and BATON->write_checksum (if we want them) when it is closed. */ baton->proxy = svn_stream_checksummed2(stream, read_digest ? &baton->read_checksum : NULL, write_digest ? &baton->write_checksum : NULL, svn_checksum_md5, read_all, pool); /* Create a stream that will forward its read/write/close operations to * BATON->proxy and will fill in *READ_DIGEST and *WRITE_DIGEST (if we * want them) after it closes BATON->proxy. */ s = svn_stream_create(baton, pool); svn_stream_set_read(s, read_handler_md5); svn_stream_set_skip(s, skip_handler_md5); svn_stream_set_write(s, write_handler_md5); svn_stream_set_close(s, close_handler_md5); return s; }
/* Get revision B->base_revision of the file described by B from the * repository, through B->edit_baton->ra_session. * * Unless PROPS_ONLY is true: * Set B->path_start_revision to the path of a new temporary file containing * the file's text. * Set B->start_md5_checksum to that file's MD-5 checksum. * Install a pool cleanup handler on B->pool to delete the file. * * Always: * Set B->pristine_props to a new hash containing the file's properties. * * Allocate all results in B->pool. */ static svn_error_t * get_file_from_ra(struct file_baton *b, svn_boolean_t props_only, apr_pool_t *scratch_pool) { if (! props_only) { svn_stream_t *fstream; SVN_ERR(svn_stream_open_unique(&fstream, &(b->path_start_revision), NULL, svn_io_file_del_on_pool_cleanup, b->pool, scratch_pool)); fstream = svn_stream_checksummed2(fstream, NULL, &b->start_md5_checksum, svn_checksum_md5, TRUE, scratch_pool); /* Retrieve the file and its properties */ SVN_ERR(svn_ra_get_file(b->edit_baton->ra_session, b->path, b->base_revision, fstream, NULL, &(b->pristine_props), b->pool)); SVN_ERR(svn_stream_close(fstream)); } else { SVN_ERR(svn_ra_get_file(b->edit_baton->ra_session, b->path, b->base_revision, NULL, NULL, &(b->pristine_props), b->pool)); } return SVN_NO_ERROR; }