Pristine text is now stored in the "Pristine Store" accessed by
svn_wc__db_pristine_...(), if you build with
"CFLAGS=-DSVN_EXPERIMENTAL_PRISTINE".
With one more significant change (in the attached patch) it is "close"
to working.
Things keeping it in "experimental" mode:
* It's still suffering a few test failures - see below.
* The WC upgrade code isn't written - see below.
* The removal of unreferenced texts from the store is incomplete.
Things that are not blocking:
* Switch from using MD-5 checksums as the key, to using SHA-1.
(I think that's a nice separate task that we can do afterwards, or
even in the middle of everything else. I have made the code store both
checksums when installing a new pristine text and accept either kind of
checksum when looking up an existing pristine text.)
PROBLEMS AND TEST FAILURES
==========================
Here's what happens running the test suite (with the attached patch):
[[[
FAIL: db-test: Unknown test failure; see tests.log.
- The test tries to add a BASE_NODE checksum without first
installing the pristine text in the store, which now fails
an assertion.
FAIL: basic_tests.py 40: automatic conflict resolution
- File A/D/G/rho ends up empty after 'resolve' and 'update'.
FAIL: diff_tests.py 4: replace a file with a file
- Diff output is blank for file A/D/G/rho; should show a mod.
FAIL: externals_tests.py 1: test checkouts with externals
- workqueue.c:1918: assertion failed (src_stream != NULL)
- a file external?
FAIL: externals_tests.py 15: should not be able to mv or rm a file external
FAIL: externals_tests.py 16: place a file external into a directory external
FAIL: externals_tests.py 18: binary file externals
FAIL: externals_tests.py 23: tag directory with file externals from wc to url
FAIL: prop_tests.py 9: props work when reverting a replacement
- reverting a replacement
- due to entry_modify()?
FAIL: revert_tests.py 3: revert a replaced file with no properties
FAIL: revert_tests.py 5: revert svn cp PATH PATH replace file with props
FAIL: revert_tests.py 6: revert a merge replacement of file with history
FAIL: revert_tests.py 7: revert svn cp URL PATH replace file with props
FAIL: revert_tests.py 8: revert file after second replace
FAIL: revert_tests.py 18: reverted replace with history restores checksum
FAIL: special_tests.py 7: merge symlink into file
]]]
Experience with squashing the earlier failures suggests they will all be
caused by a rather smaller number of issues. Some of the main causes
are:
* Some problem related to file-externals doesn't work.
* Calls to entry_modify, on a node that is replaced, lose the checksum
recorded on the base node, and thus lose track of its pristine text.
UPGRADING OLD WORKING COPIES
============================
The next step (which can be done in parallel with fixing the above
problems) is upgrading old WCs. I have a plan for the procedure to
upgrade an old WC:
1. For each pristine text that is present in the old location: if its
checksum is not stored in the DB row for that node, calculate and store
its MD-5 checksum in the DB row for that node. (Or SHA-1 if we've
switched to using SHA-1 already).
2. For each pristine text that is present in the old location: install
a copy of it in the Pristine Store (which includes calculating the other
checksum) and then delete it from the old location.
3. Bump the WC format number to indicate the upgrade is functionally
complete.
If anyone wants to tackle any of these, that would be great. I'll be
around this week and on holiday next week.
- Julian
Implement the Pristine Store version of one more function, conditional on
SVN_EXPERIMENTAL_PRISTINE.
* subversion/libsvn_wc/update_editor.c
(close_file): When we dereference the old pristine text, remove it from
the store.
===================================================================
Cleaning up the temporary files left by a failed commit.
* subversion/libsvn_client/commit.c
(remove_tmpfiles): ### Docs.
(svn_wc_pristine_remove): ### Declaration.
(remove_unused_pristine_texts): ### New function.
(svn_client_commit4): ### Use it.
### TODO: Removal needs to be in a WC-layer 'clean up after failed
commit' func.
===================================================================
Assertions.
* subversion/libsvn_wc/adm_ops.c
(svn_wc__process_committed_internal, svn_wc_queue_committed3): Assert that
both MD-5 and SHA-1 checksums are provided for the new text, if any.
### Not honoured by legacy svn_wc_queue_committed2().
* subversion/libsvn_wc/wc_db.c
(VERIFY_PRISTINE_PRESENT): New macro.
(insert_base_node, insert_working_node): Add assertions.
(svn_wc__db_base_add_file, svn_wc__db_op_copy_file,
svn_wc__db_global_commit): Assert that the pristine text is already stored.
* subversion/libsvn_wc/wc_db.h
(svn_wc__db_base_add_file): Require that the pristine text is already
stored.
* subversion/libsvn_wc/workqueue.c
(log_do_committed): Assert that the pristine text is already stored.
===================================================================
Test suite temporary changes.
* subversion/tests/cmdline/svntest/wc.py
(text_base_path):
### Skip tests that try to access the text-base directly.
### TODO: implement with system("sqlite3 ... select ...")?
* subversion/tests/cmdline/diff_tests.py
(check_diff_output):
### debugging
* subversion/tests/cmdline/externals_tests.py
(externals_test_setup):
### Don't include a file-external in the general test set-up. If it is
included, the initial checkout fails in each test that uses this.
===================================================================
FAIL: db-test: Unknown test failure; see tests.log.
- The test triggers an assertion because it tries to add a BASE_NODE
checksum without first installing the pristine text in the store.
FAIL: basic_tests.py 40: automatic conflict resolution
- File A/D/G/rho ends up empty after 'resolve' and 'update'.
FAIL: diff_tests.py 4: replace a file with a file
- Diff output is blank for file A/D/G/rho, whereas it should show a mod.
FAIL: externals_tests.py 1: test checkouts with externals
- File external? workqueue.c:1918: assertion failed (src_stream != NULL)
FAIL: externals_tests.py 15: should not be able to mv or rm a file external
FAIL: externals_tests.py 16: place a file external into a directory external
FAIL: externals_tests.py 18: binary file externals
FAIL: externals_tests.py 23: tag directory with file externals from wc to url
FAIL: prop_tests.py 9: props work when reverting a replacement
- reverting a replacement
FAIL: revert_tests.py 3: revert a replaced file with no properties
FAIL: revert_tests.py 5: revert svn cp PATH PATH replace file with props
FAIL: revert_tests.py 6: revert a merge replacement of file with history
FAIL: revert_tests.py 7: revert svn cp URL PATH replace file with props
FAIL: revert_tests.py 8: revert file after second replace
FAIL: revert_tests.py 18: reverted replace with history restores checksum
FAIL: special_tests.py 7: merge symlink into file
--This line, and those below, will be ignored--
Index: subversion/libsvn_client/commit.c
===================================================================
--- subversion/libsvn_client/commit.c (revision 947837)
+++ subversion/libsvn_client/commit.c (working copy)
@@ -800,7 +800,11 @@ svn_client_import3(svn_commit_info_t **c
}
-/* Remove (if it exists) each file whose path is given by a value in the
+/* Clean up the pristine text store by removing each temporary pristine text
+ * file that was going to be used but is no longer needed because the commit
+ * failed.
+ *
+ * Remove (if it exists) each temporary file whose path is listed in the
* hash TEMPFILES, which is a mapping from (const char *) path to (const
* char *) tempfile abspath. Ignore the keys of TEMPFILES. */
static svn_error_t *
@@ -831,6 +835,49 @@ remove_tmpfiles(apr_hash_t *tempfiles,
}
+/* Clean up the pristine text store by removing each temporary pristine text
+ * file that was going to be used but is no longer needed because the commit
+ * failed.
+ *
+ * Remove (if it is not referenced) each pristine text whose SHA-1 checksum
+ * is listed in the hash SHA1_CHECKSUMS, which is a mapping from (const
+ * char *) path to (const svn_checksum_t *) SHA-1 checksum. */
+svn_error_t *
+svn_wc_pristine_remove(svn_wc_context_t *wc_ctx,
+ const char *wri_abspath,
+ const svn_checksum_t *sha1_checksum,
+ apr_pool_t *scratch_pool);
+static svn_error_t *
+remove_unused_pristine_texts(svn_wc_context_t *wc_ctx,
+ const apr_hash_t *sha1_checksums,
+ apr_pool_t *pool)
+{
+ apr_hash_index_t *hi;
+ apr_pool_t *iterpool;
+
+ /* Split if there's nothing to be done. */
+ if (! sha1_checksums)
+ return SVN_NO_ERROR;
+
+ iterpool = svn_pool_create(pool);
+
+ /* Clean up any tempfiles. */
+ for (hi = apr_hash_first(pool, sha1_checksums); hi; hi = apr_hash_next(hi))
+ {
+ const char *local_abspath = svn__apr_hash_index_key(hi);
+ const svn_checksum_t *sha1_checksum = svn__apr_hash_index_val(hi);
+
+ svn_pool_clear(iterpool);
+
+/* SVN_ERR(svn_wc__pristine_remove(wc_ctx, local_abspath,
+ sha1_checksum, iterpool));*/
+ }
+ svn_pool_destroy(iterpool);
+
+ return SVN_NO_ERROR;
+}
+
+
static svn_error_t *
reconcile_errors(svn_error_t *commit_err,
@@ -1069,7 +1116,7 @@ svn_client_commit4(svn_commit_info_t **c
apr_hash_t *lock_tokens;
apr_hash_t *tempfiles = NULL;
apr_hash_t *md5_checksums;
- apr_hash_t *sha1_checksums;
+ apr_hash_t *sha1_checksums = NULL;
apr_array_header_t *commit_items;
svn_error_t *cmt_err = SVN_NO_ERROR, *unlock_err = SVN_NO_ERROR;
svn_error_t *bump_err = SVN_NO_ERROR, *cleanup_err = SVN_NO_ERROR;
@@ -1292,6 +1339,12 @@ svn_client_commit4(svn_commit_info_t **c
if (! unlock_err)
cleanup_err = remove_tmpfiles(tempfiles, pool);
+
+ /* All of the pristine texts we installed should be referenced now,
+ so this attempt to remove them is pure paranoia. */
+ if (! cleanup_err)
+ cleanup_err = remove_unused_pristine_texts(ctx->wc_ctx,
+ sha1_checksums, pool);
}
/* As per our promise, if *commit_info_p isn't set, provide a default where
Index: subversion/libsvn_wc/adm_ops.c
===================================================================
--- subversion/libsvn_wc/adm_ops.c (revision 948412)
+++ subversion/libsvn_wc/adm_ops.c (working copy)
@@ -513,6 +513,11 @@ svn_wc__process_committed_internal(svn_w
{
svn_wc__db_kind_t kind;
+ SVN_ERR_ASSERT((md5_checksum == NULL && sha1_checksum == NULL)
+ || (md5_checksum != NULL && sha1_checksum != NULL
+ && md5_checksum->kind == svn_checksum_md5
+ && sha1_checksum->kind == svn_checksum_sha1));
+
SVN_ERR(svn_wc__db_read_kind(&kind, db, local_abspath, TRUE, scratch_pool));
SVN_ERR(process_committed_leaf(db, local_abspath,
@@ -676,6 +681,10 @@ svn_wc_queue_committed3(svn_wc_committed
committed_queue_item_t *cqi;
SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+ SVN_ERR_ASSERT((md5_checksum == NULL && sha1_checksum == NULL)
+ || (md5_checksum != NULL && sha1_checksum != NULL
+ && md5_checksum->kind == svn_checksum_md5
+ && sha1_checksum->kind == svn_checksum_sha1));
queue->have_recursive |= recurse;
Index: subversion/libsvn_wc/update_editor.c
===================================================================
--- subversion/libsvn_wc/update_editor.c (revision 948388)
+++ subversion/libsvn_wc/update_editor.c (working copy)
@@ -4550,8 +4553,8 @@ merge_file(svn_skel_t **work_items,
* text_base_abspath is the appropriate path: the "revert-base" path
* if the node is replaced, else the usual text-base path. */
SVN_ERR(svn_wc__ultimate_base_text_path(&text_base_abspath,
- eb->db, fb->local_abspath,
- pool, pool));
+ eb->db, fb->local_abspath,
+ pool, pool));
SVN_ERR(svn_wc__loggy_move(&work_item, eb->db, pb->local_abspath,
new_text_base_tmp_abspath,
text_base_abspath,
@@ -4676,6 +4679,24 @@ close_file(void *file_baton,
SVN_ERR_ASSERT(new_text_base_md5_checksum &&
new_text_base_sha1_checksum &&
new_text_base_abspath);
+#ifdef SVN_DEBUG
+ {
+ /* A pristine text is required. */
+ svn_boolean_t present;
+
+ SVN_ERR(svn_wc__db_pristine_check(&present, eb->db, fb->local_abspath,
+ new_text_base_sha1_checksum,
+ svn_wc__db_checkmode_usable, pool));
+ if (!present)
+ SVN_DBG(("add/w/hist: %s/%s/%s\n", new_text_base_abspath,
+ svn_checksum_to_cstring_display(new_text_base_md5_checksum,
+ pool),
+ svn_checksum_to_cstring_display(new_text_base_sha1_checksum,
+ pool)));
+ /* ### It may be in a *different* wc_db's pristine store.
+ SVN_ERR_ASSERT(present); */
+ }
+#endif
}
else
{
@@ -4696,22 +4717,6 @@ close_file(void *file_baton,
expected_md5_digest,
svn_checksum_to_cstring_display(new_text_base_md5_checksum, pool));
-#ifdef SVN_EXPERIMENTAL_PRISTINE
- /* If we had a text change, drop the pristine into its proper place. */
- /* ### Caution: there is as yet no code to ever remove these pristine
- files when they are superseded. */
- /* The WC-NG way is to install the new pristine text in two steps: move it
- into the pristine store now, and then later in a single transaction
- update the BASE_NODE to include a reference to this pristine text's
- checksum. In the old WC-1 way, installation of this file happens later
- (in merge_file()) as a single move into place, being part of the loggy
- action of updating the WC metadata. */
- if (fb->new_text_base_tmp_abspath)
- SVN_ERR(svn_wc__db_pristine_install(eb->db, fb->new_text_base_tmp_abspath,
- new_text_base_sha1_checksum,
- new_text_base_md5_checksum, pool));
-#endif
-
SVN_ERR(svn_wc_read_kind(&kind, eb->wc_ctx, fb->local_abspath, TRUE, pool));
if (kind == svn_node_none && ! fb->adding_file)
return svn_error_createf(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
@@ -4913,14 +4918,6 @@ close_file(void *file_baton,
all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
}
- if (fb->copied_text_base_abspath)
- {
- SVN_ERR(svn_wc__wq_build_file_remove(&work_item, eb->db,
- fb->copied_text_base_abspath,
- pool, pool));
- all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
- }
-
/* ### NOTE: from this point onwards, we make several changes to the
### database in a non-transactional way. we also queue additional
### work after these changes. some revamps need to be performed to
@@ -4929,6 +4926,7 @@ close_file(void *file_baton,
/* Insert/replace the BASE node with all of the new metadata. */
{
+ const svn_checksum_t *old_checksum = NULL;
#ifdef SVN_EXPERIMENTAL_PRISTINE
/* Set the 'checksum' column of the file's BASE_NODE row to
* NEW_TEXT_BASE_SHA1_CHECKSUM. The pristine text identified by that
@@ -4939,20 +4937,58 @@ close_file(void *file_baton,
#endif
const char *serialised;
+ /* Get the old base checksum before we overwrite it. */
+ {
+ svn_error_t *err;
+
+ err = svn_wc__db_base_get_info(NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL,
+ &old_checksum, NULL, NULL, NULL,
+ eb->db, fb->local_abspath,
+ pool, pool);
+ if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ old_checksum = NULL;
+ }
+ else
+ SVN_ERR(err);
+ }
+
+#ifdef SVN_EXPERIMENTAL_PRISTINE
+ /* If we had a text change, drop the pristine into its proper place.
+ The WC-NG way is to install the new pristine text in two steps: move it
+ into the pristine store now, and then later in a single transaction
+ update the BASE_NODE to include a reference to this pristine text's
+ checksum. In the old WC-1 way, installation of this file happens
+ as a single move into place (in merge_file()), being part of the loggy
+ action of updating the WC metadata. */
+ /* ### Caution: there is as yet no code to ever remove these pristine
+ files when they are superseded. */
+ /* When we have a single DB with a single pristine store, we won't need
+ to install this new text-base if it's copied, but for now we usually
+ do need to install it. (The only time this is redundant is when it's
+ copied from another file in the same directory.) */
+ if (new_text_base_abspath)
+ SVN_ERR(svn_wc__db_pristine_install(eb->db, new_text_base_abspath,
+ new_text_base_sha1_checksum,
+ new_text_base_md5_checksum,
+ pool));
+#endif
+
+ if (fb->copied_text_base_abspath)
+ {
+ SVN_ERR(svn_wc__wq_build_file_remove(&work_item, eb->db,
+ fb->copied_text_base_abspath,
+ pool, pool));
+ all_work_items = svn_wc__wq_merge(all_work_items, work_item, pool);
+ }
+
/* If we don't have a NEW checksum, then the base must not have changed.
Just carry over the old checksum. */
if (new_checksum == NULL)
{
- SVN_ERR(svn_wc__db_base_get_info(NULL, NULL, NULL,
- NULL, NULL, NULL,
- NULL, NULL, NULL,
- NULL, NULL,
- &new_checksum, NULL, NULL, NULL,
- eb->db, fb->local_abspath,
- pool, pool));
- /* SVN_EXPERIMENTAL_PRISTINE:
- new_checksum is originally MD-5 but will later be SHA-1. That's
- OK here because we just read it and write it back. */
+ new_checksum = old_checksum;
}
if (kind != svn_node_none)
@@ -4974,6 +5010,13 @@ close_file(void *file_baton,
all_work_items,
pool));
+#ifdef SVN_EXPERIMENTAL_PRISTINE
+ /* Remove the old pristine text (if nothing else references it). */
+ if (old_checksum)
+ SVN_ERR(svn_wc__db_pristine_remove(eb->db, fb->local_abspath,
+ old_checksum, pool));
+#endif
+
/* ### ugh. deal with preserving the file external value in the database.
### there is no official API, so we do it this way. maybe we should
### have a temp API into wc_db. */
@@ -5065,8 +5108,8 @@ close_file(void *file_baton,
/* We have one less referrer to the directory's bump information. */
SVN_ERR(maybe_bump_dir_info(eb, fb->bump_info, pool));
- /* Skip notifications about files which were already notified for
- another reason */
+ /* Send a notification to the callback function. (Skip notifications
+ about files which were already notified for another reason.) */
if (eb->notify_func && !fb->already_notified)
{
const svn_string_t *mime_type;
Index: subversion/libsvn_wc/wc_db.c
===================================================================
--- subversion/libsvn_wc/wc_db.c (revision 948388)
+++ subversion/libsvn_wc/wc_db.c (working copy)
@@ -55,6 +55,19 @@
#define NOT_IMPLEMENTED() \
return svn_error__malfunction(TRUE, __FILE__, __LINE__, "Not implemented.")
+/* Raise an assertion failure if the pristine text identified by CHECKSUM is
+ not present in the pristine store that belongs to WRI_ABSPATH in DB. */
+#define VERIFY_PRISTINE_PRESENT(db, wri_abspath, checksum, scratch_pool) \
+ do { \
+ svn_boolean_t __present; \
+ \
+ SVN_ERR(svn_wc__db_pristine_check(&__present, \
+ (db), (wri_abspath), (checksum), \
+ svn_wc__db_checkmode_usable, \
+ (scratch_pool))); \
+ SVN_ERR_ASSERT(__present); \
+ } while (0)
+
/*
* Some filename constants.
@@ -641,6 +654,21 @@ insert_base_node(void *baton, svn_sqlite
}
else if (pibb->kind == svn_wc__db_kind_file)
{
+#ifdef SVN_DEBUG
+ if (pibb->status == svn_wc__db_status_normal)
+ {
+ SVN_ERR_ASSERT(pibb->checksum != NULL);
+ /* ### SVN_ERR_ASSERT(pibb->checksum->kind == svn_checksum_sha1); */
+ /* ### VERIFY_PRISTINE_PRESENT(...) ? */
+ /* ### maybe sthg like: SVN_ERR_ASSERT(pibb->translated_size !=
+ SVN_INVALID_FILESIZE); ... but that's not always true. */
+ }
+ else
+ {
+ SVN_ERR_ASSERT(pibb->checksum == NULL);
+ SVN_ERR_ASSERT(pibb->translated_size == SVN_INVALID_FILESIZE);
+ }
+#endif
SVN_ERR(svn_sqlite__bind_checksum(stmt, 14, pibb->checksum,
scratch_pool));
if (pibb->translated_size != SVN_INVALID_FILESIZE)
@@ -751,6 +779,8 @@ insert_working_node(void *baton,
}
else if (piwb->kind == svn_wc__db_kind_file)
{
+ /* ### SVN_ERR_ASSERT(piwb->checksum != NULL); ? */
+ /* ### SVN_ERR_ASSERT(piwb->checksum->kind == svn_checksum_sha1); ? */
SVN_ERR(svn_sqlite__bind_checksum(stmt, 11, piwb->checksum,
scratch_pool));
}
@@ -1208,6 +1238,8 @@ svn_wc__db_base_add_file(svn_wc__db_t *d
SVN_ERR_ASSERT(props != NULL);
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(changed_rev));
SVN_ERR_ASSERT(checksum != NULL);
+ /* NOT YET: SVN_ERR_ASSERT(checksum->kind == svn_checksum_sha1); */
+ VERIFY_PRISTINE_PRESENT(db, local_abspath, checksum, scratch_pool);
SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
local_abspath, svn_sqlite__mode_readwrite,
@@ -2319,6 +2351,10 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db
&& original_uuid && checksum
&& original_revision != SVN_INVALID_REVNUM));
SVN_ERR_ASSERT(conflict == NULL); /* ### can't handle yet */
+#ifdef SVN_DEBUG
+ if (checksum)
+ VERIFY_PRISTINE_PRESENT(db, local_abspath, checksum, scratch_pool);
+#endif
SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
local_abspath, svn_sqlite__mode_readwrite,
@@ -4693,6 +4729,11 @@ svn_wc__db_global_commit(svn_wc__db_t *d
SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(new_revision));
SVN_ERR_ASSERT(new_checksum == NULL || new_children == NULL);
+#ifdef SVN_DEBUG
+ if (new_checksum)
+ VERIFY_PRISTINE_PRESENT(db, local_abspath, new_checksum, scratch_pool);
+#endif
+
SVN_ERR(svn_wc__db_pdh_parse_local_abspath(&pdh, &local_relpath, db,
local_abspath, svn_sqlite__mode_readwrite,
scratch_pool, scratch_pool));
Index: subversion/libsvn_wc/wc_db.h
===================================================================
--- subversion/libsvn_wc/wc_db.h (revision 947979)
+++ subversion/libsvn_wc/wc_db.h (working copy)
@@ -494,7 +494,7 @@ svn_wc__db_base_add_directory(svn_wc__db
CHANGED_AUTHOR>.
The checksum of the file contents is given in CHECKSUM. An entry in
- the pristine text base is NOT required when this API is called.
+ the pristine text base IS REQUIRED when this API is called.
If the translated size of the file (its contents, translated as defined
by its properties) is known, then pass it as TRANSLATED_SIZE. Otherwise,
Index: subversion/libsvn_wc/workqueue.c
===================================================================
--- subversion/libsvn_wc/workqueue.c (revision 948099)
+++ subversion/libsvn_wc/workqueue.c (working copy)
@@ -1407,6 +1407,20 @@ log_do_committed(svn_wc__db_t *db,
svn_filesize_t translated_size;
apr_time_t last_mod_time;
+ SVN_ERR_ASSERT(new_checksum != NULL);
+#ifdef SVN_DEBUG
+ {
+ /* A pristine text is required. */
+ svn_boolean_t present;
+
+ SVN_ERR(svn_wc__db_pristine_check(&present, db, local_abspath,
+ new_checksum,
+ svn_wc__db_checkmode_usable,
+ scratch_pool));
+ SVN_ERR_ASSERT(present);
+ }
+#endif
+
SVN_ERR(svn_wc__db_global_commit(db, local_abspath,
new_revision, new_date, new_author,
new_checksum,
Index: subversion/tests/cmdline/diff_tests.py
===================================================================
--- subversion/tests/cmdline/diff_tests.py (revision 947837)
+++ subversion/tests/cmdline/diff_tests.py (working copy)
@@ -102,6 +102,9 @@ def check_diff_output(diff_output, name,
i += 1
# no suitable diff found
+ print "Diff name:", name
+ print "Diff type:", diff_type
+ print "Diff output:", diff_output
return 1
def count_diff_output(diff_output):
Index: subversion/tests/cmdline/externals_tests.py
===================================================================
--- subversion/tests/cmdline/externals_tests.py (revision 947837)
+++ subversion/tests/cmdline/externals_tests.py (working copy)
@@ -162,7 +162,7 @@ def externals_test_setup(sbox):
externals_desc = \
external_url_for["A/B/gamma"] + " gamma\n"
- change_external(B_path, externals_desc, commit=False)
+ #change_external(B_path, externals_desc, commit=False)
externals_desc = \
"exdir_G " + external_url_for["A/C/exdir_G"] + "\n" + \
@@ -191,13 +191,14 @@ def externals_test_setup(sbox):
# Commit the property changes.
expected_output = svntest.wc.State(wc_init_dir, {
- 'A/B' : Item(verb='Sending'),
+ #'A/B' : Item(verb='Sending'),
'A/C' : Item(verb='Sending'),
'A/D' : Item(verb='Sending'),
})
expected_status = svntest.actions.get_virginal_state(wc_init_dir, 5)
- expected_status.tweak('A/B', 'A/C', 'A/D', wc_rev=6, status=' ')
+ expected_status.tweak('A/C', 'A/D', wc_rev=6, status=' ')
+ #expected_status.tweak('A/B', 'A/C', 'A/D', wc_rev=6, status=' ')
svntest.actions.run_and_verify_commit(wc_init_dir,
expected_output,
Index: subversion/tests/cmdline/svntest/wc.py
===================================================================
--- subversion/tests/cmdline/svntest/wc.py (revision 947837)
+++ subversion/tests/cmdline/svntest/wc.py (working copy)
@@ -820,6 +820,8 @@ def text_base_path(file_path):
"""Return the path to the text-base file for the versioned file
FILE_PATH."""
dot_svn = svntest.main.get_admin_name()
+ raise svntest.Skip("""Accessing the text-base is not currently
+ supported for WC-NG.""")
return os.path.join(os.path.dirname(file_path), dot_svn, 'text-base',
os.path.basename(file_path) + '.svn-base')