static svn_error_t * open_file(const char *path, void *parent_baton, svn_revnum_t ancestor_revision, apr_pool_t *pool, void **file_baton) { struct dir_baton *pb = parent_baton; struct edit_baton *eb = pb->edit_baton; const char *cmp_path = NULL; svn_revnum_t cmp_rev = SVN_INVALID_REVNUM; /* If the parent directory has explicit comparison path and rev, record the same for this one. */ if (ARE_VALID_COPY_ARGS(pb->cmp_path, pb->cmp_rev)) { cmp_path = svn_relpath_join(pb->cmp_path, svn_relpath_basename(path, pool), pool); cmp_rev = pb->cmp_rev; } SVN_ERR(dump_node(eb, path, svn_node_file, svn_node_action_change, FALSE, cmp_path, cmp_rev, pool)); *file_baton = NULL; /* muhahahaha again */ return SVN_NO_ERROR; }
/* Push information about another directory onto the linked list RB->db. * * CHILD_BATON is the baton returned by the commit editor. RELPATH is the * repository-relative path of this directory. IS_ADDED is true iff this * directory is being added (with or without history). If added with * history then COPYFROM_PATH/COPYFROM_REV are the copyfrom source, else * are NULL/SVN_INVALID_REVNUM. */ static void push_directory(struct revision_baton *rb, void *child_baton, const char *relpath, svn_boolean_t is_added, const char *copyfrom_path, svn_revnum_t copyfrom_rev) { struct directory_baton *child_db = apr_pcalloc(rb->pool, sizeof (*child_db)); SVN_ERR_ASSERT_NO_RETURN( is_added || (copyfrom_path == NULL && copyfrom_rev == SVN_INVALID_REVNUM)); /* If this node is an existing (not newly added) child of a copied node, calculate where it was copied from. */ if (!is_added && ARE_VALID_COPY_ARGS(rb->db->copyfrom_path, rb->db->copyfrom_rev)) { const char *name = svn_relpath_basename(relpath, NULL); copyfrom_path = svn_relpath_join(rb->db->copyfrom_path, name, rb->pool); copyfrom_rev = rb->db->copyfrom_rev; } child_db->baton = child_baton; child_db->relpath = relpath; child_db->copyfrom_path = copyfrom_path; child_db->copyfrom_rev = copyfrom_rev; child_db->parent = rb->db; rb->db = child_db; }
static svn_error_t * open_directory(const char *path, void *parent_baton, svn_revnum_t base_revision, apr_pool_t *pool, void **child_baton) { struct dir_baton *pb = parent_baton; struct edit_baton *eb = pb->edit_baton; struct dir_baton *new_db; const char *cmp_path = NULL; svn_revnum_t cmp_rev = SVN_INVALID_REVNUM; /* If the parent directory has explicit comparison path and rev, record the same for this one. */ if (ARE_VALID_COPY_ARGS(pb->cmp_path, pb->cmp_rev)) { cmp_path = svn_relpath_join(pb->cmp_path, svn_relpath_basename(path, pool), pool); cmp_rev = pb->cmp_rev; } new_db = make_dir_baton(path, cmp_path, cmp_rev, eb, pb, FALSE, pool); *child_baton = new_db; return SVN_NO_ERROR; }