[PATCH 10/13] Implement file-related functions
From: Ramkumar Ramachandra <artagnon_at_gmail.com>
Date: Wed, 7 Jul 2010 02:14:50 +0200
Implement add_file, open_file and change_file_prop. All of them
Signed-off-by: Ramkumar Ramachandra <artagnon_at_gmail.com>
--- dump_editor.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 62 insertions(+), 0 deletions(-) diff --git a/dump_editor.c b/dump_editor.c index 6077e5c..7006a2c 100644 --- a/dump_editor.c +++ b/dump_editor.c @@ -334,6 +334,31 @@ svn_error_t *add_file(const char *path, apr_pool_t *pool, void **file_baton) { + struct dir_baton *pb = parent_baton; + void *val; + + /* This might be a replacement -- is the path already deleted? */ + val = apr_hash_get(pb->deleted_entries, path, APR_HASH_KEY_STRING); + + /* Detect add-with-history. */ + pb->eb->is_copy = ARE_VALID_COPY_ARGS(copyfrom_path, copyfrom_rev); + + /* Dump the node. */ + SVN_ERR(dump_node(pb->eb, path, + svn_node_file, + val ? svn_node_action_replace : svn_node_action_add, + pb->eb->is_copy ? copyfrom_path : NULL, + pb->eb->is_copy ? copyfrom_rev : SVN_INVALID_REVNUM, + pool)); + + if (val) + /* delete the path, it's now been dumped. */ + apr_hash_set(pb->deleted_entries, path, APR_HASH_KEY_STRING, NULL); + + /* Build a nice file baton to pass to change_file_prop and apply_textdelta */ + pb->eb->changed_path = path; + *file_baton = pb->eb; + return SVN_NO_ERROR; } @@ -343,6 +368,28 @@ svn_error_t *open_file(const char *path, apr_pool_t *pool, void **file_baton) { + struct dir_baton *pb = parent_baton; + const char *cmp_path = NULL; + svn_revnum_t cmp_rev = SVN_INVALID_REVNUM; + + apr_array_header_t *compose_path = apr_array_make(pool, 2, sizeof(const char *)); + /* If the parent directory has explicit comparison path and rev, + record the same for this one. */ + if (pb && ARE_VALID_COPY_ARGS(pb->cmp_path, pb->cmp_rev)) { + APR_ARRAY_PUSH(compose_path, const char *) = pb->cmp_path; + APR_ARRAY_PUSH(compose_path, const char *) = svn_dirent_basename(path, pool); + cmp_path = svn_path_compose(compose_path, pool); + cmp_rev = pb->cmp_rev; + } + + SVN_ERR(dump_node(pb->eb, path, + svn_node_file, svn_node_action_change, + cmp_path, cmp_rev, pool)); + + /* Build a nice file baton to pass to change_file_prop and apply_textdelta */ + pb->eb->changed_path = path; + *file_baton = pb->eb; + return SVN_NO_ERROR; } @@ -387,6 +434,21 @@ svn_error_t *change_file_prop(void *file_baton, const svn_string_t *value, apr_pool_t *pool) { + struct edit_baton *eb = file_baton; + + if (svn_property_kind(NULL, name) != svn_prop_regular_kind) + return SVN_NO_ERROR; + + value ? apr_hash_set(eb->properties, apr_pstrdup(pool, name), + APR_HASH_KEY_STRING, svn_string_dup(value, pool)) : + apr_hash_set(eb->del_properties, apr_pstrdup(pool, name), + APR_HASH_KEY_STRING, (void *)0x1); + + /* Dump the property headers and wait; close_file might need + to write text headers too depending on whether + apply_textdelta is called */ + dump_props_pending = TRUE; + return SVN_NO_ERROR; } -- 1.7.1Received on 2010-07-07 02:14:26 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.