Add a dump editor and write out skeleton callback functions according
to the API documentation of svn_delta_editor_t. Also expose
get_dump_editor through a header.

Signed-off-by: Ramkumar Ramachandra <[email protected]>
---
 Makefile      |    4 +-
 dump_editor.c |  143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 dump_editor.h |    8 +++
 dumpr_util.h  |   29 ++++++++++++
 4 files changed, 182 insertions(+), 2 deletions(-)
 create mode 100644 dump_editor.c
 create mode 100644 dump_editor.h
 create mode 100644 dumpr_util.h

diff --git a/Makefile b/Makefile
index e4d106e..fea646e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
 svndumpr: *.c *.h
-       $(CC) -Wall -Werror -DAPR_POOL_DEBUG -ggdb3 -O0 -o $@ svndumpr.c 
debug_editor.c -lsvn_client-1 -I. -I/usr/local/include/subversion-1 
-I/usr/include/apr-1.0
+       $(CC) -Wall -Werror -DAPR_POOL_DEBUG -ggdb3 -O0 -o $@ svndumpr.c 
debug_editor.c dump_editor.c -lsvn_client-1 -I. 
-I/usr/local/include/subversion-1 -I/usr/include/apr-1.0
 
 svndumpr_bench: *.c *.h
-       $(CC) -O2 -o $@ svndumpr.c debug_editor.c -lsvn_client-1 -I. 
-I/usr/local/include/subversion-1 -I/usr/include/apr-1.0
+       $(CC) -O2 -o $@ svndumpr.c debug_editor.c dump_editor.c -lsvn_client-1 
-I. -I/usr/local/include/subversion-1 -I/usr/include/apr-1.0
 
 clean:
        $(RM) svndumpr svndumpr_bench
diff --git a/dump_editor.c b/dump_editor.c
new file mode 100644
index 0000000..2fdf93c
--- /dev/null
+++ b/dump_editor.c
@@ -0,0 +1,143 @@
+/* Licensed under a two-clause BSD-style license.
+ * See LICENSE for details.
+ */
+
+#include "svn_pools.h"
+#include "svn_error.h"
+#include "svn_iter.h"
+#include "svn_repos.h"
+#include "svn_string.h"
+#include "svn_dirent_uri.h"
+#include "svn_path.h"
+#include "svn_time.h"
+#include "svn_checksum.h"
+#include "svn_props.h"
+
+#include "dumpr_util.h"
+
+svn_error_t *open_root(void *edit_baton,
+                       svn_revnum_t base_revision,
+                       apr_pool_t *pool,
+                       void **root_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *delete_entry(const char *path,
+                          svn_revnum_t revision,
+                          void *parent_baton,
+                          apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *add_directory(const char *path,
+                           void *parent_baton,
+                           const char *copyfrom_path,
+                           svn_revnum_t copyfrom_rev,
+                           apr_pool_t *pool,
+                           void **child_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *open_directory(const char *path,
+                            void *parent_baton,
+                            svn_revnum_t base_revision,
+                            apr_pool_t *pool,
+                            void **child_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *close_directory(void *dir_baton,
+                             apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *add_file(const char *path,
+                      void *parent_baton,
+                      const char *copyfrom_path,
+                      svn_revnum_t copyfrom_rev,
+                      apr_pool_t *pool,
+                      void **file_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *open_file(const char *path,
+                       void *parent_baton,
+                       svn_revnum_t ancestor_revision,
+                       apr_pool_t *pool,
+                       void **file_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *change_dir_prop(void *parent_baton,
+                             const char *name,
+                             const svn_string_t *value,
+                             apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *change_file_prop(void *file_baton,
+                              const char *name,
+                              const svn_string_t *value,
+                              apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *apply_textdelta(void *file_baton, const char *base_checksum,
+                             apr_pool_t *pool,
+                             svn_txdelta_window_handler_t *handler,
+                             void **handler_baton)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *close_file(void *file_baton,
+                       const char *text_checksum,
+                       apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *close_edit(void *edit_baton, apr_pool_t *pool)
+{
+       return SVN_NO_ERROR;
+}
+
+svn_error_t *get_dump_editor(const svn_delta_editor_t **editor,
+                             void **edit_baton,
+                             svn_revnum_t from_rev,
+                             apr_pool_t *pool)
+{
+       struct edit_baton *eb = apr_pcalloc(pool, sizeof(struct edit_baton));
+       eb->current_rev = from_rev;
+       SVN_ERR(svn_stream_for_stdout(&(eb->stream), pool));
+       svn_delta_editor_t *de = svn_delta_default_editor(pool);
+       
+       de->open_root = open_root;
+       de->delete_entry = delete_entry;
+       de->add_directory = add_directory;
+       de->open_directory = open_directory;
+       de->close_directory = close_directory;
+       de->change_dir_prop = change_dir_prop;
+       de->change_file_prop = change_file_prop;
+       de->apply_textdelta = apply_textdelta;
+       de->add_file = add_file;
+       de->open_file = open_file;
+       de->close_file = close_file;
+       de->close_edit = close_edit;
+
+       /* Set the edit_baton and editor */
+       *edit_baton = eb;
+       *editor = de;
+
+       return SVN_NO_ERROR;
+}
+ 
diff --git a/dump_editor.h b/dump_editor.h
new file mode 100644
index 0000000..9c70b74
--- /dev/null
+++ b/dump_editor.h
@@ -0,0 +1,8 @@
+#ifndef DUMP_EDITOR_H_
+#define DUMP_EDITOR_H_
+
+svn_error_t *get_dump_editor(const svn_delta_editor_t **editor,
+                            void **edit_baton,
+                            svn_revnum_t to_rev,
+                            apr_pool_t *pool);
+#endif
diff --git a/dumpr_util.h b/dumpr_util.h
new file mode 100644
index 0000000..d206c19
--- /dev/null
+++ b/dumpr_util.h
@@ -0,0 +1,29 @@
+#ifndef DUMPR_UTIL_H_
+#define DUMPR_UTIL_H_
+
+struct edit_baton {
+       /* The stream to dump to: stdout */
+       svn_stream_t *stream;
+
+       /* pool is for per-edit-session allocations */
+       apr_pool_t *pool;
+
+       svn_revnum_t current_rev;
+       
+       /* Store the properties that changed */
+       apr_hash_t *properties;
+       apr_hash_t *del_properties; /* Value is always 0x1 */
+       svn_stringbuf_t *propstring;
+
+       /* Path of changed file */
+       const char *changed_path;
+
+       /* Was a copy command issued? */
+       svn_boolean_t is_copy;
+
+       /* Temporary file to write delta to along with its checksum */
+       char *temp_filepath;
+       svn_checksum_t *checksum;
+};
+
+#endif
-- 
1.7.1

Reply via email to