+static int recursiveDumpDir(Repository::Transaction *txn, svn_fs_root_t *fs_root,
+ const QByteArray &pathname, const QString &finalPathName,
+ apr_pool_t *pool)
+{
+ // get the dir listing
+ apr_hash_t *entries;
+ SVN_ERR(svn_fs_dir_entries(&entries, fs_root, pathname, pool));
+ AprAutoPool dirpool(pool);
+
+ for (apr_hash_index_t *i = apr_hash_first(pool, entries); i; i = apr_hash_next(i)) {
+ dirpool.clear();
+ const void *vkey;
+ void *value;
+ apr_hash_this(i, &vkey, NULL, &value);
+
+ svn_fs_dirent_t *dirent = reinterpret_cast<svn_fs_dirent_t *>(value);
+ QByteArray entryName = pathname + '/' + dirent->name;
+ QString entryFinalName = finalPathName + '/' + dirent->name;
+
+ if (dirent->kind == svn_node_dir) {
+ if (recursiveDumpDir(txn, fs_root, entryName, entryFinalName, dirpool) == EXIT_FAILURE)
+ return EXIT_FAILURE;
+ } else if (dirent->kind == svn_node_file) {
+ if (dumpBlob(txn, fs_root, entryName, entryFinalName, dirpool) == EXIT_FAILURE)
+ return EXIT_FAILURE;
+ }
+ }
+}
+
+static bool wasDir(svn_fs_t *fs, int revnum, const char *pathname, apr_pool_t *pool)
+{
+ AprAutoPool subpool(pool);
+ svn_fs_root_t *fs_root;
+ if (svn_fs_revision_root(&fs_root, fs, revnum, subpool) != SVN_NO_ERROR)
+ return false;
+
+ svn_boolean_t is_dir;
+ if (svn_fs_is_dir(&is_dir, fs_root, pathname, subpool) != SVN_NO_ERROR)
+ return false;
+
+ return is_dir;
+}
+