/* Create a repository with a filesystem based on OPTS in a subdir NAME, * commit the standard Greek tree as revision 1, and set *REPOS_URL to * the URL we will use to access it. * * ### This always returns a file: URL. We should upgrade this to use the * test suite's specified URL scheme instead. */ static svn_error_t * create_greek_repos(const char **repos_url, const char *name, const svn_test_opts_t *opts, apr_pool_t *pool) { svn_repos_t *repos; svn_revnum_t committed_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; /* Create a filesytem and repository. */ SVN_ERR(svn_test__create_repos(&repos, name, opts, pool)); /* Prepare and commit a txn containing the Greek tree. */ SVN_ERR(svn_fs_begin_txn2(&txn, svn_repos_fs(repos), 0 /* rev */, 0 /* flags */, pool)); SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool)); SVN_ERR(svn_test__create_greek_tree(txn_root, pool)); SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &committed_rev, txn, pool)); SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(committed_rev)); SVN_ERR(svn_uri_get_file_url_from_dirent(repos_url, name, pool)); return SVN_NO_ERROR; }
/* Create a packed filesystem in DIR. Set the shard size to SHARD_SIZE and create NUM_REVS number of revisions (in addition to r0). Use POOL for allocations. After this function successfully completes, the filesystem's youngest revision number will be the same as NUM_REVS. */ static svn_error_t * create_packed_filesystem(const char *dir, const svn_test_opts_t *opts, int num_revs, int shard_size, apr_pool_t *pool) { svn_fs_t *fs; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict; svn_revnum_t after_rev; apr_pool_t *subpool = svn_pool_create(pool); apr_pool_t *iterpool; int version; /* Create a filesystem, then close it */ SVN_ERR(svn_test__create_fs(&fs, dir, opts, subpool)); svn_pool_destroy(subpool); subpool = svn_pool_create(pool); /* Rewrite the format file */ SVN_ERR(svn_io_read_version_file(&version, svn_dirent_join(dir, "format", subpool), subpool)); SVN_ERR(write_format(dir, version, shard_size, subpool)); /* Reopen the filesystem */ SVN_ERR(svn_fs_open(&fs, dir, NULL, subpool)); /* Revision 1: the Greek tree */ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool)); SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool)); SVN_ERR(svn_test__create_greek_tree(txn_root, subpool)); SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool)); SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev)); /* Revisions 2 thru NUM_REVS-1: content tweaks to "iota". */ iterpool = svn_pool_create(subpool); while (after_rev < num_revs) { svn_pool_clear(iterpool); SVN_ERR(svn_fs_begin_txn(&txn, fs, after_rev, iterpool)); SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); SVN_ERR(svn_test__set_file_contents(txn_root, "iota", get_rev_contents(after_rev + 1, iterpool), iterpool)); SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, iterpool)); SVN_TEST_ASSERT(SVN_IS_VALID_REVNUM(after_rev)); } svn_pool_destroy(iterpool); svn_pool_destroy(subpool); /* Now pack the FS */ return svn_fs_pack(dir, NULL, NULL, NULL, NULL, pool); }
/* Create a packed filesystem in DIR. Set the shard size to SHARD_SIZE and create MAX_REV number of revisions. Use POOL for allocations. */ static svn_error_t * create_packed_filesystem(const char *dir, svn_test_opts_t *opts, int max_rev, int shard_size, apr_pool_t *pool) { svn_fs_t *fs; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict; svn_revnum_t after_rev; apr_pool_t *subpool = svn_pool_create(pool); apr_pool_t *iterpool; /* Create a filesystem, then close it */ SVN_ERR(svn_test__create_fs(&fs, dir, opts, subpool)); svn_pool_destroy(subpool); subpool = svn_pool_create(pool); /* Rewrite the format file */ SVN_ERR(write_format(dir, SVN_FS_FS__MIN_PACKED_FORMAT, shard_size, subpool)); /* Reopen the filesystem */ SVN_ERR(svn_fs_open(&fs, dir, NULL, subpool)); /* Revision 1: the Greek tree */ SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, subpool)); SVN_ERR(svn_fs_txn_root(&txn_root, txn, subpool)); SVN_ERR(svn_test__create_greek_tree(txn_root, subpool)); SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, subpool)); /* Revisions 2-11: A bunch of random changes. */ iterpool = svn_pool_create(subpool); while (after_rev < max_rev + 1) { svn_pool_clear(iterpool); SVN_ERR(svn_fs_begin_txn(&txn, fs, after_rev, iterpool)); SVN_ERR(svn_fs_txn_root(&txn_root, txn, iterpool)); SVN_ERR(svn_test__set_file_contents(txn_root, "iota", get_rev_contents(after_rev + 1, iterpool), iterpool)); SVN_ERR(svn_fs_commit_txn(&conflict, &after_rev, txn, iterpool)); } svn_pool_destroy(iterpool); svn_pool_destroy(subpool); /* Now pack the FS */ return svn_fs_pack(dir, NULL, NULL, NULL, NULL, pool); }