[PATCH 12/13] Implement close_file
From: Ramkumar Ramachandra <artagnon_at_gmail.com>
Date: Wed, 7 Jul 2010 02:14:52 +0200
close_file measures the length of the temporary file to write text
Signed-off-by: Ramkumar Ramachandra <artagnon_at_gmail.com>
--- dump_editor.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 76 insertions(+), 0 deletions(-) diff --git a/dump_editor.c b/dump_editor.c index 51d5ebe..6f74af9 100644 --- a/dump_editor.c +++ b/dump_editor.c @@ -522,6 +522,82 @@ svn_error_t *close_file(void *file_baton, const char *text_checksum, apr_pool_t *pool) { + struct edit_baton *eb = file_baton; + apr_file_t *temp_file; + svn_stream_t *temp_filestream; + apr_finfo_t *info = apr_pcalloc(pool, sizeof(apr_finfo_t)); + + /* We didn't write the property headers because we were + waiting for file_prop_change; write them now */ + SVN_ERR(dump_props(eb, &dump_props_pending, FALSE, pool)); + + /* The prop headers have already been dumped in dump_node */ + /* Dump the text headers */ + if (must_dump_text) { + /* text-delta header */ + SVN_ERR(svn_stream_printf(eb->stream, pool, + SVN_REPOS_DUMPFILE_TEXT_DELTA + ": true\n")); + + /* Measure the length */ + SVN_ERR(svn_io_stat(info, eb->temp_filepath, APR_FINFO_SIZE, pool)); + + /* text-content-length header */ + SVN_ERR(svn_stream_printf(eb->stream, pool, + SVN_REPOS_DUMPFILE_TEXT_CONTENT_LENGTH + ": %lu\n", + (unsigned long)info->size)); + /* text-content-md5 header */ + SVN_ERR(svn_stream_printf(eb->stream, pool, + SVN_REPOS_DUMPFILE_TEXT_CONTENT_MD5 + ": %s\n", + text_checksum)); + } + + /* content-length header: if both text and props are absent, + skip this block */ + if (must_dump_props || dump_props_pending) + SVN_ERR(svn_stream_printf(eb->stream, pool, + SVN_REPOS_DUMPFILE_CONTENT_LENGTH + ": %ld\n\n", + (unsigned long)info->size + eb->propstring->len)); + else if (must_dump_text) + SVN_ERR(svn_stream_printf(eb->stream, pool, + SVN_REPOS_DUMPFILE_CONTENT_LENGTH + ": %ld\n\n", + (unsigned long)info->size)); + + /* Dump the props; the propstring should have already been + written in dump_node or above */ + if (must_dump_props || dump_props_pending) { + SVN_ERR(svn_stream_write(eb->stream, eb->propstring->data, + &(eb->propstring->len))); + + /* Cleanup */ + must_dump_props = dump_props_pending = FALSE; + apr_hash_clear(eb->properties); + apr_hash_clear(eb->del_properties); + } + + /* Dump the text */ + if (must_dump_text) { + + /* Open the temporary file, map it to a stream, copy + the stream to eb->stream, close and delete the + file */ + SVN_ERR(svn_io_file_open(&temp_file, eb->temp_filepath, APR_READ, 0600, pool)); + temp_filestream = svn_stream_from_aprfile2(temp_file, TRUE, pool); + SVN_ERR(svn_stream_copy3(temp_filestream, eb->stream, NULL, NULL, pool)); + + /* Cleanup */ + SVN_ERR(svn_io_file_close(temp_file, pool)); + SVN_ERR(svn_stream_close(temp_filestream)); + SVN_ERR(svn_io_remove_file2(eb->temp_filepath, TRUE, pool)); + must_dump_text = FALSE; + } + + SVN_ERR(svn_stream_printf(eb->stream, pool, "\n\n")); + return SVN_NO_ERROR; } -- 1.7.1Received on 2010-07-07 02:14:30 CEST |
This is an archived mail posted to the Subversion Dev mailing list.
This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.