You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2011/09/09 11:48:00 UTC
svn commit: r1167062 -
/subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c
Author: philip
Date: Fri Sep 9 09:47:59 2011
New Revision: 1167062
URL: http://svn.apache.org/viewvc?rev=1167062&view=rev
Log:
Add a test for issue 4002, commit of modified file-external file.
* subversion/tests/libsvn_wc/op-depth-test.c
(wc_propset): New.
(struct nodes_row_t): Add file_external member.
(print_row): Print file-externals.
(compare_nodes_rows): Compare file-external status.
(check_db_rows): Select file-external column.
(commit_file_external): New test.
(test_funcs): Add new test.
Modified:
subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c
Modified: subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c?rev=1167062&r1=1167061&r2=1167062&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c Fri Sep 9 09:47:59 2011
@@ -264,6 +264,23 @@ wc_move(svn_test__sandbox_t *b, const ch
FALSE, FALSE, NULL, NULL, NULL, ctx, b->pool);
}
+static svn_error_t *
+wc_propset(svn_test__sandbox_t *b,
+ const char *name,
+ const char *value,
+ const char *path)
+{
+ svn_client_ctx_t *ctx;
+ apr_array_header_t *paths = apr_array_make(b->pool, 1,
+ sizeof(const char *));
+
+ SVN_ERR(svn_client_create_context(&ctx, b->pool));
+ APR_ARRAY_PUSH(paths, const char *) = wc_path(b, path);
+ return svn_client_propset_local(name, svn_string_create(value, b->pool),
+ paths, svn_depth_empty, TRUE, NULL, ctx,
+ b->pool);
+}
+
/* Create the Greek tree on disk in the WC, and commit it. */
static svn_error_t *
add_and_commit_greek_tree(svn_test__sandbox_t *b)
@@ -299,6 +316,7 @@ typedef struct nodes_row_t {
const char *presence;
svn_revnum_t repo_revnum;
const char *repo_relpath;
+ svn_boolean_t file_external;
} nodes_row_t;
/* Macro for filling in the REPO_* fields of a non-base NODES_ROW_T
@@ -310,15 +328,25 @@ static const char *
print_row(const nodes_row_t *row,
apr_pool_t *result_pool)
{
+ const char *file_external_str;
+
if (row == NULL)
return "(null)";
+
+ if (row->file_external)
+ file_external_str = ", file-external";
+ else
+ file_external_str = "";
+
if (row->repo_revnum == SVN_INVALID_REVNUM)
- return apr_psprintf(result_pool, "%d, %s, %s",
- row->op_depth, row->local_relpath, row->presence);
+ return apr_psprintf(result_pool, "%d, %s, %s%s",
+ row->op_depth, row->local_relpath, row->presence,
+ file_external_str);
else
- return apr_psprintf(result_pool, "%d, %s, %s, from ^/%s@%d",
+ return apr_psprintf(result_pool, "%d, %s, %s, from ^/%s@%d%s",
row->op_depth, row->local_relpath, row->presence,
- row->repo_relpath, (int)row->repo_revnum);
+ row->repo_relpath, (int)row->repo_revnum,
+ file_external_str);
}
/* A baton to pass through svn_hash_diff() to compare_nodes_rows(). */
@@ -359,7 +387,8 @@ compare_nodes_rows(const void *key, apr_
}
else if (expected->repo_revnum != found->repo_revnum
|| (strcmp_null(expected->repo_relpath, found->repo_relpath) != 0)
- || (strcmp_null(expected->presence, found->presence) != 0))
+ || (strcmp_null(expected->presence, found->presence) != 0)
+ || (expected->file_external != found->file_external))
{
b->errors = svn_error_createf(
SVN_ERR_TEST_FAILED, b->errors,
@@ -388,7 +417,8 @@ check_db_rows(svn_test__sandbox_t *b,
int i;
svn_sqlite__stmt_t *stmt;
static const char *const statements[] = {
- "SELECT op_depth, presence, local_relpath, revision, repos_path "
+ "SELECT op_depth, presence, local_relpath, revision, repos_path, "
+ " file_external "
"FROM nodes "
"WHERE local_relpath = ?1 OR local_relpath LIKE ?2",
NULL };
@@ -418,6 +448,7 @@ check_db_rows(svn_test__sandbox_t *b,
row->local_relpath = svn_sqlite__column_text(stmt, 2, b->pool);
row->repo_revnum = svn_sqlite__column_revnum(stmt, 3);
row->repo_relpath = svn_sqlite__column_text(stmt, 4, b->pool);
+ row->file_external = !svn_sqlite__column_is_null(stmt, 5);
key = apr_psprintf(b->pool, "%d %s", row->op_depth, row->local_relpath);
apr_hash_set(found_hash, key, APR_HASH_KEY_STRING, row);
@@ -3405,6 +3436,35 @@ test_case_rename(const svn_test_opts_t *
return SVN_NO_ERROR;
}
+
+static svn_error_t *
+commit_file_external(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+ svn_test__sandbox_t b;
+
+ SVN_ERR(svn_test__sandbox_create(&b, "commit_file_external", opts, pool));
+ file_write(&b, "f", "this is f\n");
+ SVN_ERR(wc_add(&b, "f"));
+ SVN_ERR(wc_propset(&b, "svn:externals", "^/f g", ""));
+ SVN_ERR(wc_commit(&b, ""));
+ SVN_ERR(wc_update(&b, "", 1));
+ file_write(&b, "g", "this is f\nmodified via g\n");
+ SVN_ERR(wc_commit(&b, ""));
+ SVN_ERR(wc_update(&b, "", 2));
+
+ {
+ nodes_row_t rows[] = {
+ { 0, "", "normal", 2, "" },
+ { 0, "f", "normal", 2, "f" },
+ { 0, "g", "normal", 2, "f", TRUE },
+ { 0 }
+ };
+ SVN_ERR(check_db_rows(&b, "", rows));
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* ---------------------------------------------------------------------- */
/* The list of test functions */
@@ -3463,5 +3523,7 @@ struct svn_test_descriptor_t test_funcs[
SVN_TEST_OPTS_XFAIL(test_case_rename,
"test_case_rename on case (in)sensitive system"),
#endif
+ SVN_TEST_OPTS_PASS(commit_file_external,
+ "commit_file_external (issue #4002)"),
SVN_TEST_NULL
};