[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.1
Received 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.