svn_error_t * svn_fs_x__dag_increment_mergeinfo_count(dag_node_t *node, apr_int64_t increment, apr_pool_t *pool) { node_revision_t *noderev; /* Sanity check: this node better be mutable! */ if (! svn_fs_x__dag_check_mutable(node)) { svn_string_t *idstr = svn_fs_x__id_unparse(node->id, pool); return svn_error_createf (SVN_ERR_FS_NOT_MUTABLE, NULL, "Can't increment mergeinfo count on *immutable* node-revision %s", idstr->data); } if (increment == 0) return SVN_NO_ERROR; /* Go get a fresh NODE-REVISION for this node. */ SVN_ERR(get_node_revision(&noderev, node)); noderev->mergeinfo_count += increment; if (noderev->mergeinfo_count < 0) { svn_string_t *idstr = svn_fs_x__id_unparse(node->id, pool); return svn_error_createf (SVN_ERR_FS_CORRUPT, NULL, apr_psprintf(pool, _("Can't increment mergeinfo count on node-revision %%s " "to negative value %%%s"), APR_INT64_T_FMT), idstr->data, noderev->mergeinfo_count); } if (noderev->mergeinfo_count > 1 && noderev->kind == svn_node_file) { svn_string_t *idstr = svn_fs_x__id_unparse(node->id, pool); return svn_error_createf (SVN_ERR_FS_CORRUPT, NULL, apr_psprintf(pool, _("Can't increment mergeinfo count on *file* " "node-revision %%s to %%%s (> 1)"), APR_INT64_T_FMT), idstr->data, noderev->mergeinfo_count); } /* Flush it out. */ return svn_fs_x__put_node_revision(node->fs, noderev->id, noderev, FALSE, pool); }
svn_error_t * svn_fs_x__dag_set_has_mergeinfo(dag_node_t *node, svn_boolean_t has_mergeinfo, apr_pool_t *pool) { node_revision_t *noderev; /* Sanity check: this node better be mutable! */ if (! svn_fs_x__dag_check_mutable(node)) { svn_string_t *idstr = svn_fs_x__id_unparse(node->id, pool); return svn_error_createf (SVN_ERR_FS_NOT_MUTABLE, NULL, "Can't set mergeinfo flag on *immutable* node-revision %s", idstr->data); } /* Go get a fresh NODE-REVISION for this node. */ SVN_ERR(get_node_revision(&noderev, node)); noderev->has_mergeinfo = has_mergeinfo; /* Flush it out. */ return svn_fs_x__put_node_revision(node->fs, noderev->id, noderev, FALSE, pool); }
/* Wrap read_rep_offsets_body(), extracting its TXN_ID from our NODEREV_ID, and adding an error message. */ static svn_error_t * read_rep_offsets(svn_fs_x__representation_t **rep_p, char *string, const svn_fs_x__id_t *noderev_id, apr_pool_t *result_pool, apr_pool_t *scratch_pool) { svn_error_t *err = svn_fs_x__parse_representation(rep_p, svn_stringbuf_create_wrap(string, scratch_pool), result_pool, scratch_pool); if (err) { const svn_string_t *id_unparsed; const char *where; id_unparsed = svn_fs_x__id_unparse(noderev_id, scratch_pool); where = apr_psprintf(scratch_pool, _("While reading representation offsets " "for node-revision '%s':"), id_unparsed->data); return svn_error_quick_wrap(err, where); } return SVN_NO_ERROR; }
svn_error_t * svn_fs_x__dag_set_proplist(dag_node_t *node, apr_hash_t *proplist, apr_pool_t *pool) { node_revision_t *noderev; /* Sanity check: this node better be mutable! */ if (! svn_fs_x__dag_check_mutable(node)) { svn_string_t *idstr = svn_fs_x__id_unparse(node->id, pool); return svn_error_createf (SVN_ERR_FS_NOT_MUTABLE, NULL, "Can't set proplist on *immutable* node-revision %s", idstr->data); } /* Go get a fresh NODE-REVISION for this node. */ SVN_ERR(get_node_revision(&noderev, node)); /* Set the new proplist. */ return svn_fs_x__set_proplist(node->fs, noderev, proplist, pool); }
svn_error_t * svn_fs_x__write_noderev(svn_stream_t *outfile, svn_fs_x__noderev_t *noderev, apr_pool_t *scratch_pool) { svn_string_t *str_id; str_id = svn_fs_x__id_unparse(&noderev->noderev_id, scratch_pool); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_ID ": %s\n", str_id->data)); str_id = svn_fs_x__id_unparse(&noderev->node_id, scratch_pool); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_NODE ": %s\n", str_id->data)); str_id = svn_fs_x__id_unparse(&noderev->copy_id, scratch_pool); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPY ": %s\n", str_id->data)); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TYPE ": %s\n", (noderev->kind == svn_node_file) ? SVN_FS_X__KIND_FILE : SVN_FS_X__KIND_DIR)); if (svn_fs_x__id_used(&noderev->predecessor_id)) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PRED ": %s\n", svn_fs_x__id_unparse(&noderev->predecessor_id, scratch_pool)->data)); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COUNT ": %d\n", noderev->predecessor_count)); if (noderev->data_rep) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_TEXT ": %s\n", svn_fs_x__unparse_representation (noderev->data_rep, noderev->kind == svn_node_dir, scratch_pool, scratch_pool)->data)); if (noderev->prop_rep) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_PROPS ": %s\n", svn_fs_x__unparse_representation (noderev->prop_rep, TRUE, scratch_pool, scratch_pool)->data)); SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_CPATH ": %s\n", auto_escape_path(noderev->created_path, scratch_pool))); if (noderev->copyfrom_path) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYFROM ": %ld" " %s\n", noderev->copyfrom_rev, auto_escape_path(noderev->copyfrom_path, scratch_pool))); if ( ( noderev->copyroot_rev != svn_fs_x__get_revnum(noderev->noderev_id.change_set)) || (strcmp(noderev->copyroot_path, noderev->created_path) != 0)) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_COPYROOT ": %ld" " %s\n", noderev->copyroot_rev, auto_escape_path(noderev->copyroot_path, scratch_pool))); if (noderev->mergeinfo_count > 0) SVN_ERR(svn_stream_printf(outfile, scratch_pool, HEADER_MINFO_CNT ": %" APR_INT64_T_FMT "\n", noderev->mergeinfo_count)); if (noderev->has_mergeinfo) SVN_ERR(svn_stream_puts(outfile, HEADER_MINFO_HERE ": y\n")); return svn_stream_puts(outfile, "\n"); }
/* Write a single change entry, path PATH, change CHANGE, to STREAM. All temporary allocations are in SCRATCH_POOL. */ static svn_error_t * write_change_entry(svn_stream_t *stream, svn_fs_x__change_t *change, apr_pool_t *scratch_pool) { const char *idstr; const char *change_string = NULL; const char *kind_string = ""; svn_stringbuf_t *buf; apr_size_t len; switch (change->change_kind) { case svn_fs_path_change_modify: change_string = ACTION_MODIFY; break; case svn_fs_path_change_add: change_string = ACTION_ADD; break; case svn_fs_path_change_delete: change_string = ACTION_DELETE; break; case svn_fs_path_change_replace: change_string = ACTION_REPLACE; break; case svn_fs_path_change_reset: change_string = ACTION_RESET; break; default: return svn_error_createf(SVN_ERR_FS_CORRUPT, NULL, _("Invalid change type %d"), change->change_kind); } idstr = svn_fs_x__id_unparse(&change->noderev_id, scratch_pool)->data; SVN_ERR_ASSERT(change->node_kind == svn_node_dir || change->node_kind == svn_node_file); kind_string = apr_psprintf(scratch_pool, "-%s", change->node_kind == svn_node_dir ? SVN_FS_X__KIND_DIR : SVN_FS_X__KIND_FILE); buf = svn_stringbuf_createf(scratch_pool, "%s %s%s %s %s %s %s\n", idstr, change_string, kind_string, change->text_mod ? FLAG_TRUE : FLAG_FALSE, change->prop_mod ? FLAG_TRUE : FLAG_FALSE, change->mergeinfo_mod == svn_tristate_true ? FLAG_TRUE : FLAG_FALSE, auto_escape_path(change->path.data, scratch_pool)); if (SVN_IS_VALID_REVNUM(change->copyfrom_rev)) { svn_stringbuf_appendcstr(buf, apr_psprintf(scratch_pool, "%ld %s", change->copyfrom_rev, auto_escape_path(change->copyfrom_path, scratch_pool))); } svn_stringbuf_appendbyte(buf, '\n'); /* Write all change info in one write call. */ len = buf->len; return svn_error_trace(svn_stream_write(stream, buf->data, &len)); }