⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 repos-test.c

📁 subversion-1.4.3-1.tar.gz 配置svn的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
}static svn_error_t *node_tree_delete_under_copy(const char **msg,                            svn_boolean_t msg_only,                            svn_test_opts_t *opts,                            apr_pool_t *pool){   svn_repos_t *repos;  svn_fs_t *fs;  svn_fs_txn_t *txn;  svn_fs_root_t *txn_root, *revision_root, *revision_2_root;  svn_revnum_t youngest_rev;  void *edit_baton;  const svn_delta_editor_t *editor;   svn_repos_node_t *tree;  apr_pool_t *subpool = svn_pool_create(pool);  *msg = "test deletions under copies in node_tree code";  if (msg_only)    return SVN_NO_ERROR;  /* Create a filesystem and repository. */  SVN_ERR(svn_test__create_repos(&repos, "test-repo-del-under-copy",                                  opts->fs_type, pool));  fs = svn_repos_fs(repos);  /* Prepare a txn to receive the greek tree. */  SVN_ERR(svn_fs_begin_txn(&txn, fs, 0, pool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));  /* Create and commit the greek tree. */  SVN_ERR(svn_test__create_greek_tree(txn_root, pool));  SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));  /* Now, commit again, this time after copying a directory, and then     deleting some paths under that directory. */  SVN_ERR(svn_fs_revision_root(&revision_root, fs, youngest_rev, pool));   SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));  SVN_ERR(svn_fs_copy(revision_root, "A", txn_root, "Z", pool));  SVN_ERR(svn_fs_delete(txn_root, "Z/D/G/rho", pool));  SVN_ERR(svn_fs_delete(txn_root, "Z/D/H", pool));  SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));  /* Now, we run the node_tree editor code, and see that a) it doesn't     bomb out, and b) that our nodes are all good. */  SVN_ERR(svn_fs_revision_root(&revision_2_root, fs, youngest_rev, pool));   SVN_ERR(svn_repos_node_editor(&editor, &edit_baton, repos,                                revision_root, revision_2_root,                                 pool, subpool));  SVN_ERR(svn_repos_replay2(revision_2_root, "", SVN_INVALID_REVNUM, FALSE,                            editor, edit_baton, NULL, NULL, subpool));  /* Get the root of the generated tree, and cleanup our mess. */  tree = svn_repos_node_from_baton(edit_baton);  svn_pool_destroy(subpool);  /* See that we got what we expected (fortunately, svn_repos_replay     drivers editor paths in a predictable fashion!). */  if (! (tree /* / */         && tree->child /* /Z */         && tree->child->child /* /Z/D */         && tree->child->child->child /* /Z/D/G */         && tree->child->child->child->child /* /Z/D/G/rho */         && tree->child->child->child->sibling)) /* /Z/D/H */    return svn_error_create(SVN_ERR_TEST_FAILED, NULL,                             "Generated node tree is bogus.");  if (! ((strcmp(tree->name, "") == 0)         && (strcmp(tree->child->name, "Z") == 0)         && (strcmp(tree->child->child->name, "D") == 0)         && (strcmp(tree->child->child->child->name, "G") == 0)         && ((strcmp(tree->child->child->child->child->name, "rho") == 0)             && (tree->child->child->child->child->kind == svn_node_file)             && (tree->child->child->child->child->action == 'D'))         && ((strcmp(tree->child->child->child->sibling->name, "H") == 0)             && (tree->child->child->child->sibling->kind == svn_node_dir)             && (tree->child->child->child->sibling->action == 'D'))))    return svn_error_create(SVN_ERR_TEST_FAILED, NULL,                             "Generated node tree is bogus.");  return SVN_NO_ERROR;}/* Helper for revisions_changed(). */static const char *print_chrevs(const apr_array_header_t *revs_got,             int num_revs_expected,             const svn_revnum_t *revs_expected,             apr_pool_t *pool){  int i;  const char *outstr;  svn_revnum_t rev;  outstr = apr_psprintf(pool, "Got: { ");  if (revs_got)    {      for (i = 0; i < revs_got->nelts; i++)        {          rev = ((svn_revnum_t *)revs_got->elts)[i];          outstr = apr_pstrcat(pool,                                outstr,                               apr_psprintf(pool, "%ld ", rev),                               NULL);        }    }  outstr = apr_pstrcat(pool, outstr, "}  Expected: { ", NULL);  for (i = 0; i < num_revs_expected; i++)    {      outstr = apr_pstrcat(pool,                            outstr,                           apr_psprintf(pool, "%ld ",                                        revs_expected[i]),                           NULL);    }  return apr_pstrcat(pool, outstr, "}", NULL);}/* Implements svn_repos_history_func_t interface.  Accumulate history   revisions the apr_array_header_t * which is the BATON. */static svn_error_t *history_to_revs_array(void *baton,                      const char *path,                      svn_revnum_t revision,                      apr_pool_t *pool){  apr_array_header_t *revs_array = baton;  APR_ARRAY_PUSH(revs_array, svn_revnum_t) = revision;  return SVN_NO_ERROR;}struct revisions_changed_results{  const char *path;  int num_revs;  svn_revnum_t revs_changed[11];};static svn_error_t *revisions_changed(const char **msg,                  svn_boolean_t msg_only,                  svn_test_opts_t *opts,                  apr_pool_t *pool){   apr_pool_t *spool = svn_pool_create(pool);  svn_repos_t *repos;  svn_fs_t *fs;  svn_fs_txn_t *txn;  svn_fs_root_t *txn_root, *rev_root;  svn_revnum_t youngest_rev = 0;    *msg = "test svn_repos_history() (partially)";  if (msg_only)    return SVN_NO_ERROR;  /* Create a filesystem and repository. */  SVN_ERR(svn_test__create_repos(&repos, "test-repo-revisions-changed",                                  opts->fs_type, pool));  fs = svn_repos_fs(repos);  /*** Testing Algorithm ***     1.  Create a greek tree in revision 1.     2.  Make a series of new revisions, changing a file here and file         there.     3.  Loop over each path in each revision, verifying that we get         the right revisions-changed array back from the filesystem.  */  /* Created the greek tree in revision 1. */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__create_greek_tree(txn_root, spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 2 - mu, alpha, omega */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/mu", "2", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/E/alpha", "2", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/H/omega", "2", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 3 - iota, lambda, psi, omega */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "iota", "3", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/lambda", "3", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/H/psi", "3", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/H/omega", "3", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 4 - iota, beta, gamma, pi, rho */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "iota", "4", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/E/beta", "4", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/gamma", "4", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/G/pi", "4", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/G/rho", "4", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 5 - mu, alpha, tau, chi */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/mu", "5", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/B/E/alpha", "5", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/G/tau", "5", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/H/chi", "5", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 6 - move A/D to A/Z */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev, spool));  SVN_ERR(svn_fs_copy(rev_root, "A/D", txn_root, "A/Z", spool));  SVN_ERR(svn_fs_delete(txn_root, "A/D", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 7 - edit A/Z/G/pi */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/Z/G/pi", "7", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 8 - move A/Z back to A/D, edit iota */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev, spool));  SVN_ERR(svn_fs_copy(rev_root, "A/Z", txn_root, "A/D", spool));  SVN_ERR(svn_fs_delete(txn_root, "A/Z", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "iota", "8", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 9 - copy A/D/G to A/D/Q */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev, spool));  SVN_ERR(svn_fs_copy(rev_root, "A/D/G", txn_root, "A/D/Q", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Revision 10 - edit A/D/Q/pi and A/D/Q/rho */  SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, spool));  SVN_ERR(svn_fs_txn_root(&txn_root, txn, spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/Q/pi", "10", spool));  SVN_ERR(svn_test__set_file_contents(txn_root, "A/D/Q/rho", "10", spool));  SVN_ERR(svn_fs_commit_txn(NULL, &youngest_rev, txn, spool));  svn_pool_clear(spool);  /* Now, it's time to verify our results. */  {    int j;    /* Number, and list of, changed revisions for each path.  Note       that for now, bubble-up in directories causes the directory to       appear changed though no entries were added or removed, and no       property mods occurred.  Also note that this matrix represents       only the final state of the paths existing in HEAD of the       repository.       Notice for each revision, you can glance down that revision's       column in this table and see all the paths modified directory or       via bubble-up. */    static const struct revisions_changed_results test_data[25] = {      /* path,          num,    revisions changed... */      { "",              11,    { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 } },      { "iota",           4,    {        8,          4, 3,    1    } },      { "A",             10,    { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1    } },      { "A/mu",           3,    {                 5,       2, 1    } },      { "A/B",            5,    {                 5, 4, 3, 2, 1    } },      { "A/B/lambda",     2,    {                       3,    1    } },      { "A/B/E",          4,    {                 5, 4,    2, 1    } },      { "A/B/E/alpha",    3,    {                 5,       2, 1    } },      { "A/B/E/beta",     2,    {                    4,       1    } },      { "A/B/F",          1,    {                             1    } },      { "A/C",            1,    {                             1    } },      { "A/D",           10,    { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1    } },      { "A/D/gamma",      4,    {        8,    6,    4,       1    } },      { "A/D/G",          6,    {        8, 7, 6, 5, 4,       1    } },      { "A/D/G/pi",       5,    {        8, 7, 6,    4,       1    } },      { "A/D/G/rho",      4,    {        8,    6,    4,       1    } },      { "A/D/G/tau",      4,    {        8,    6, 5,          1    } },      { "A/D/Q",          8,    { 10, 9, 8, 7, 6, 5, 4,       1    } },      { "A/D/Q/pi",       7,    { 10, 9, 8, 7, 6,    4,       1    } },      { "A/D/Q/rho",      6,    { 10, 9, 8,    6,    4,       1    } },      { "A/D/Q/tau",      5,    {     9, 8,    6, 5,          1    } },      { "A/D/H",          6,    {        8,    6, 5,    3, 2, 1    } },      { "A/D/H/chi",      4,    {        8,    6, 5,          1    } },      { "A/D/H/psi",      4,    {        8,    6,       3,    1    } },      { "A/D/H/omega",    5,    {        8,    6,       3, 2, 1    } }    };        /* Now, for each path in the revision, get its changed-revisions       array and compare the array to the static results above.  */    for (j = 0; j < 25; j++)      {        int i;        const char *path = test_data[j].path;        int num_revs = test_data[j].num_revs;        const svn_revnum_t *revs_changed = test_data[j].revs_changed;        apr_array_header_t *revs = apr_array_make(spool, 10,                                                   sizeof(svn_revnum_t));        SVN_ERR(svn_repos_history(fs, path, history_to_revs_array, revs,                                   0, youngest_rev, TRUE, spool));        /* Are we at least looking at the right number of returned           revisions? */        if ((! revs) || (revs->nelts != num_revs))          return svn_error_createf            (SVN_ERR_FS_GENERAL, NULL,             "Changed revisions differ from expected for '%s'\n%s",             path, print_chrevs(revs, num_revs, revs_changed, spool));        /* Do the revisions lists match up exactly? */        for (i = 0; i < num_revs; i++)          {            svn_revnum_t rev = ((svn_revnum_t *)revs->elts)[i];            if (rev != revs_changed[i])              return svn_error_createf                (SVN_ERR_FS_GENERAL, NULL,                 "Changed revisions differ from expected for '%s'\n%s",                 path, print_chrevs(revs, num_revs, revs_changed, spool));          }                /* Clear the per-iteration subpool. */        svn_pool_clear(spool);      }  }  /* Destroy the subpool. */  svn_pool_destroy(spool);  return SVN_NO_ERROR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -