summaryrefslogtreecommitdiff
path: root/subversion/svnfsfs/dump-index-cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/svnfsfs/dump-index-cmd.c')
-rw-r--r--subversion/svnfsfs/dump-index-cmd.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/subversion/svnfsfs/dump-index-cmd.c b/subversion/svnfsfs/dump-index-cmd.c
new file mode 100644
index 0000000..5598c98
--- /dev/null
+++ b/subversion/svnfsfs/dump-index-cmd.c
@@ -0,0 +1,106 @@
+/* dump-index-cmd.c -- implements the dump-index sub-command.
+ *
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ */
+
+#define APR_WANT_BYTEFUNC
+
+#include "svn_dirent_uri.h"
+#include "svn_pools.h"
+#include "private/svn_fs_fs_private.h"
+
+#include "svnfsfs.h"
+
+/* Return the 8 digit hex string for FNVV1, allocated in POOL.
+ */
+static const char *
+fnv1_to_string(apr_uint32_t fnv1,
+ apr_pool_t *pool)
+{
+ /* Construct a checksum object containing FNV1. */
+ svn_checksum_t checksum = { NULL, svn_checksum_fnv1a_32 };
+ apr_uint32_t digest = htonl(fnv1);
+ checksum.digest = (const unsigned char *)&digest;
+
+ /* Convert the digest to hex. */
+ return svn_checksum_to_cstring_display(&checksum, pool);
+}
+
+/* Map svn_fs_fs__p2l_entry_t.type to C string. */
+static const char *item_type_str[]
+ = {"none ", "frep ", "drep ", "fprop", "dprop", "node ", "chgs ", "rep "};
+
+/* Implements svn_fs_fs__dump_index_func_t as printing one table row
+ * containing the fields of ENTRY to the console.
+ */
+static svn_error_t *
+dump_index_entry(const svn_fs_fs__p2l_entry_t *entry,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ const char *type_str
+ = entry->type < (sizeof(item_type_str) / sizeof(item_type_str[0]))
+ ? item_type_str[entry->type]
+ : "???";
+
+ printf("%12" APR_UINT64_T_HEX_FMT " %12" APR_UINT64_T_HEX_FMT
+ " %s %9ld %8" APR_UINT64_T_FMT " %s\n",
+ (apr_uint64_t)entry->offset, (apr_uint64_t)entry->size,
+ type_str, entry->item.revision, entry->item.number,
+ fnv1_to_string(entry->fnv1_checksum, scratch_pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* Read the repository at PATH beginning with revision START_REVISION and
+ * return the result in *FS. Allocate caches with MEMSIZE bytes total
+ * capacity. Use POOL for non-cache allocations.
+ */
+static svn_error_t *
+dump_index(const char *path,
+ svn_revnum_t revision,
+ apr_pool_t *pool)
+{
+ svn_fs_t *fs;
+
+ /* Check repository type and open it. */
+ SVN_ERR(open_fs(&fs, path, pool));
+
+ /* Write header line. */
+ printf(" Start Length Type Revision Item Checksum\n");
+
+ /* Dump the whole index contents */
+ SVN_ERR(svn_fs_fs__dump_index(fs, revision, dump_index_entry, NULL,
+ check_cancel, NULL, pool));
+
+ return SVN_NO_ERROR;
+}
+
+/* This implements `svn_opt_subcommand_t'. */
+svn_error_t *
+subcommand__dump_index(apr_getopt_t *os, void *baton, apr_pool_t *pool)
+{
+ svnfsfs__opt_state *opt_state = baton;
+
+ SVN_ERR(dump_index(opt_state->repository_path,
+ opt_state->start_revision.value.number, pool));
+
+ return SVN_NO_ERROR;
+}