You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ne...@apache.org on 2011/08/21 02:59:19 UTC
svn commit: r1159930 - in /subversion/branches/hold: ./ notes/
subversion/include/ subversion/libsvn_client/ subversion/libsvn_wc/
subversion/mod_dav_svn/ subversion/svn/ subversion/svndumpfilter/
subversion/tests/cmdline/ tools/dist/
Author: neels
Date: Sun Aug 21 00:59:18 2011
New Revision: 1159930
URL: http://svn.apache.org/viewvc?rev=1159930&view=rev
Log:
On 'hold' branch: sync from trunk.
Added:
subversion/branches/hold/notes/hold
- copied unchanged from r1159927, subversion/trunk/notes/hold
Modified:
subversion/branches/hold/ (props changed)
subversion/branches/hold/CHANGES
subversion/branches/hold/notes/moves
subversion/branches/hold/subversion/include/svn_wc.h
subversion/branches/hold/subversion/libsvn_client/client.h
subversion/branches/hold/subversion/libsvn_client/diff.c
subversion/branches/hold/subversion/libsvn_client/merge.c
subversion/branches/hold/subversion/libsvn_client/repos_diff.c
subversion/branches/hold/subversion/libsvn_client/repos_diff_summarize.c
subversion/branches/hold/subversion/libsvn_client/status.c
subversion/branches/hold/subversion/libsvn_wc/adm_ops.c
subversion/branches/hold/subversion/libsvn_wc/tree_conflicts.c
subversion/branches/hold/subversion/libsvn_wc/update_editor.c
subversion/branches/hold/subversion/libsvn_wc/wc-queries.sql
subversion/branches/hold/subversion/libsvn_wc/wc_db.c
subversion/branches/hold/subversion/mod_dav_svn/mod_dav_svn.c
subversion/branches/hold/subversion/svn/main.c
subversion/branches/hold/subversion/svn/tree-conflicts.c
subversion/branches/hold/subversion/svndumpfilter/main.c
subversion/branches/hold/subversion/tests/cmdline/changelist_tests.py
subversion/branches/hold/subversion/tests/cmdline/merge_reintegrate_tests.py
subversion/branches/hold/subversion/tests/cmdline/svndumpfilter_tests.py
subversion/branches/hold/tools/dist/collect_sigs.py
subversion/branches/hold/tools/dist/dist.sh
subversion/branches/hold/tools/dist/release.py
Propchange: subversion/branches/hold/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Aug 21 00:59:18 2011
@@ -54,3 +54,4 @@
/subversion/branches/tree-conflicts:868291-873154
/subversion/branches/tree-conflicts-notify:873926-874008
/subversion/branches/uris-as-urls:1060426-1064427
+/subversion/trunk:1159237-1159927
Modified: subversion/branches/hold/CHANGES
URL: http://svn.apache.org/viewvc/subversion/branches/hold/CHANGES?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/CHANGES (original)
+++ subversion/branches/hold/CHANGES Sun Aug 21 00:59:18 2011
@@ -129,7 +129,7 @@ the 1.6 release: http://subversion.apac
* fixed: executable flag of binary file lost during merge (issue #3686)
* fixed: merging a symlink-turned-regular-file breaks the wc (issue #2530)
* fixed: can't remove file externals (issue #3351)
- * fixed: 'svn unlock' attempts to unlock wrong token on DAV (issue #3794)
+ * fixed: 'svn unlock' attempts to unlock wrong token on DAV (issue #3794)
* fixed: forced DAV 'svn unlock' results in 403, not warning (issue #3801)
* fixed: rm -> ci -> cp = missing directory (issue #2763)
* fixed: 'svn info' returns parent info on missing dirs (issue #3178)
@@ -143,7 +143,7 @@ the 1.6 release: http://subversion.apac
* allow SVNListParentPath to be used with authz (issue #2753)
* allow nav to repo list from repo top with SVNListParentPath (issue #3159)
* allow repositories in the root of a drive on windows (issue #3535)
- * don't destroy mergeinnfo with 'svnadmin load --parent-dir' (issue #3547)
+ * don't destroy mergeinfo with 'svnadmin load --parent-dir' (issue #3547)
* fixed: 'svnadmin hotcopy' does not duplicate symlinks (issue #2591)
* fixed: post-revprop-change errors cancel commit (issue #2990)
* fixed: mod_dav_svn runs pre-revprop-change hook twice (issue #3085)
Modified: subversion/branches/hold/notes/moves
URL: http://svn.apache.org/viewvc/subversion/branches/hold/notes/moves?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/notes/moves (original)
+++ subversion/branches/hold/notes/moves Sun Aug 21 00:59:18 2011
@@ -66,19 +66,19 @@ More queries might be needed (TBD).
== libsvn_wc ==
In the internal wc_db API, the _scan_addition() and _scan_deletion()
-interfaces were be extended to make use of new DB queries to differentiate
+interfaces were extended to make use of new DB queries to differentiate
moved nodes from copied, added, and deleted nodes.
Two functions were built on top of the wc_db API and added to the
private libsvn_wc API:
svn_wc__node_was_moved_away() provides, for a given local_abspath:
- the moved_to abspath within the working copy
- - the relpath of the op-root of the copy operation that created
- the node at the moved_to relpath
+ - the abspath of the op-root of the copy operation that created
+ the node at the moved_to abspath
svn_wc__node_was_moved_here() provides, for a given local_abspath:
- the moved_from abspath within the working copy
- - the relpath of the op-root of the delete operation that deleted
- the node at the moved_from relpath
+ - the abspath of the op-root of the delete operation that deleted
+ the node at the moved_from abspath
More API changes might be needed (TBD).
@@ -110,8 +110,7 @@ Interfaces which have changed behaviour:
- svn_client_status: Status provides the moved-to abspath for a moved-away
nodes, and the moved-from abspath for a moved-here node.
Note that, mostly due to performance reasons, only information about
- roots of moves is provided. Children of moved nodes aren't marked as
- such in some special way.
+ roots of moves is provided. Children of moved nodes aren't marked as such.
- svn_client_info: Like status, except that it also provides move
information about children of moved nodes.
Modified: subversion/branches/hold/subversion/include/svn_wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/include/svn_wc.h?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/include/svn_wc.h (original)
+++ subversion/branches/hold/subversion/include/svn_wc.h Sun Aug 21 00:59:18 2011
@@ -1551,7 +1551,11 @@ typedef enum svn_wc_conflict_reason_t
/** Object is already added or schedule-add. @since New in 1.6. */
svn_wc_conflict_reason_added,
/** Object is already replaced. @since New in 1.7. */
- svn_wc_conflict_reason_replaced
+ svn_wc_conflict_reason_replaced,
+ /** Object is moved away. @since New in 1.8. */
+ svn_wc_conflict_reason_moved_away,
+ /** Object is moved here. @since New in 1.8. */
+ svn_wc_conflict_reason_moved_here
} svn_wc_conflict_reason_t;
Modified: subversion/branches/hold/subversion/libsvn_client/client.h
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/client.h?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/client.h (original)
+++ subversion/branches/hold/subversion/libsvn_client/client.h Sun Aug 21 00:59:18 2011
@@ -595,11 +595,22 @@ svn_client__switch_internal(svn_revnum_t
DEPTH is the depth to recurse.
- RA_SESSION defines the additional RA session for requesting file
- contents.
+ RA_SESSION is an RA session through which this editor may fetch
+ properties, file contents and directory listings of the 'old' side of the
+ diff. It is a separate RA session from the one through which this editor
+ is being driven.
REVISION is the start revision in the comparison.
+ For each deleted directory, if WALK_DELETED_DIRS is true then just call
+ the 'dir_deleted' callback once, otherwise call the 'file_deleted' or
+ 'dir_deleted' callback for each individual node in that subtree.
+
+ If TEXT_DELTAS is FALSE, then do not expect text deltas from the edit
+ drive, nor send text deltas to the diff callbacks.
+ ### TODO: The implementation currently does send text deltas to the diff
+ callbacks in many cases even if they are not wanted.
+
If NOTIFY_FUNC is non-null, invoke it with NOTIFY_BATON for each
file and directory operated on during the edit.
@@ -613,6 +624,7 @@ svn_client__get_diff_editor(const svn_de
svn_ra_session_t *ra_session,
svn_revnum_t revision,
svn_boolean_t walk_deleted_dirs,
+ svn_boolean_t text_deltas,
const svn_wc_diff_callbacks4_t *diff_callbacks,
void *diff_cmd_baton,
svn_cancel_func_t cancel_func,
@@ -626,29 +638,23 @@ svn_client__get_diff_editor(const svn_de
/*** Editor for diff summary ***/
-/* Create an editor for a repository diff summary, i.e. comparing one
- repository version against the other and only providing information
- about the changed items without the text deltas.
+/* Set *CALLBACKS and *CALLBACK_BATON to a set of diff callbacks that will
+ report a diff summary, i.e. only providing information about the changed
+ items without the text deltas.
- TARGET is the target of the diff, relative to the root of the edit.
+ TARGET is the target path, relative to the anchor, of the diff.
SUMMARIZE_FUNC is called with SUMMARIZE_BATON as parameter by the
- created svn_delta_editor_t for each changed item.
-
- See svn_client__get_diff_editor() for a description of the other
- parameters. */
+ created callbacks for each changed item.
+*/
svn_error_t *
-svn_client__get_diff_summarize_editor(const char *target,
- svn_client_diff_summarize_func_t
- summarize_func,
- void *summarize_baton,
- svn_ra_session_t *ra_session,
- svn_revnum_t revision,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- const svn_delta_editor_t **editor,
- void **edit_baton,
- apr_pool_t *pool);
+svn_client__get_diff_summarize_callbacks(
+ svn_wc_diff_callbacks4_t **callbacks,
+ void **callback_baton,
+ const char *target,
+ svn_client_diff_summarize_func_t summarize_func,
+ void *summarize_baton,
+ apr_pool_t *pool);
/* ---------------------------------------------------------------- */
Modified: subversion/branches/hold/subversion/libsvn_client/diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/diff.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/diff.c (original)
+++ subversion/branches/hold/subversion/libsvn_client/diff.c Sun Aug 21 00:59:18 2011
@@ -1753,7 +1753,8 @@ diff_repos_repos(const svn_wc_diff_callb
SVN_ERR(svn_client__get_diff_editor(
&diff_editor, &diff_edit_baton,
NULL, "", depth,
- extra_ra_session, rev1, TRUE,
+ extra_ra_session, rev1, TRUE /* walk_deleted_dirs */,
+ TRUE /* text_deltas */,
callbacks, callback_baton,
ctx->cancel_func, ctx->cancel_baton,
NULL /* no notify_func */, NULL /* no notify_baton */,
@@ -1762,7 +1763,7 @@ diff_repos_repos(const svn_wc_diff_callb
/* We want to switch our txn into URL2 */
SVN_ERR(svn_ra_do_diff3
(ra_session, &reporter, &reporter_baton, rev2, target1,
- depth, ignore_ancestry, TRUE,
+ depth, ignore_ancestry, TRUE /* text_deltas */,
url2, diff_editor, diff_edit_baton, pool));
/* Drive the reporter; do the diff. */
@@ -2038,6 +2039,8 @@ diff_summarize_repos_repos(svn_client_di
const char *target1;
const char *target2;
svn_ra_session_t *ra_session;
+ svn_wc_diff_callbacks4_t *callbacks;
+ void *callback_baton;
/* Prepare info for the repos repos diff. */
SVN_ERR(diff_prepare_repos_repos(&url1, &url2, &base_path, &rev1, &rev2,
@@ -2046,6 +2049,10 @@ diff_summarize_repos_repos(svn_client_di
path1, path2, revision1, revision2,
peg_revision, pool));
+ SVN_ERR(svn_client__get_diff_summarize_callbacks(
+ &callbacks, &callback_baton,
+ target1, summarize_func, summarize_baton, pool));
+
/* Now, we open an extra RA session to the correct anchor
location for URL1. This is used to get the kind of deleted paths. */
SVN_ERR(svn_client__open_ra_session_internal(&extra_ra_session, NULL,
@@ -2053,10 +2060,13 @@ diff_summarize_repos_repos(svn_client_di
TRUE, ctx, pool));
/* Set up the repos_diff editor. */
- SVN_ERR(svn_client__get_diff_summarize_editor
- (target2, summarize_func,
- summarize_baton, extra_ra_session, rev1, ctx->cancel_func,
- ctx->cancel_baton, &diff_editor, &diff_edit_baton, pool));
+ SVN_ERR(svn_client__get_diff_editor(&diff_editor, &diff_edit_baton,
+ NULL /* wc_ctx */, "", depth,
+ extra_ra_session, rev1, TRUE /* walk_deleted_dirs */,
+ FALSE /* text_deltas */,
+ callbacks, callback_baton,
+ ctx->cancel_func, ctx->cancel_baton,
+ NULL /* notify_func */, NULL /* notify_baton */, pool));
/* We want to switch our txn into URL2 */
SVN_ERR(svn_ra_do_diff3
Modified: subversion/branches/hold/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/merge.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/hold/subversion/libsvn_client/merge.c Sun Aug 21 00:59:18 2011
@@ -5022,7 +5022,8 @@ drive_merge_report_editor(const char *ta
merge_b->ctx->wc_ctx, target_abspath,
depth,
merge_b->ra_session2, revision1,
- FALSE,
+ FALSE /* walk_deleted_dirs */,
+ TRUE /* text_deltas */,
&merge_callbacks, merge_b,
merge_b->ctx->cancel_func,
merge_b->ctx->cancel_baton,
Modified: subversion/branches/hold/subversion/libsvn_client/repos_diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/repos_diff.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/repos_diff.c (original)
+++ subversion/branches/hold/subversion/libsvn_client/repos_diff.c Sun Aug 21 00:59:18 2011
@@ -98,6 +98,9 @@ struct edit_baton {
FALSE otherwise. */
svn_boolean_t walk_deleted_repos_dirs;
+ /* Whether to report text deltas */
+ svn_boolean_t text_deltas;
+
/* A callback used to see if the client wishes to cancel the running
operation. */
svn_cancel_func_t cancel_func;
@@ -315,11 +318,19 @@ get_file_mime_types(const char **mimetyp
}
-/* Get revision REVISION of the file described by B from the repository.
- * Set B->path_start_revision to the path of a new temporary file containing
- * the file's text. Set B->pristine_props to a new hash containing the
- * file's properties. Install a pool cleanup handler on B->pool to delete
- * the file.
+/* Get revision B->base_revision of the file described by B from the
+ * repository, through B->edit_baton->ra_session.
+ *
+ * Unless PROPS_ONLY is true:
+ * Set B->path_start_revision to the path of a new temporary file containing
+ * the file's text.
+ * Set B->start_md5_checksum to that file's MD-5 checksum.
+ * Install a pool cleanup handler on B->pool to delete the file.
+ *
+ * Always:
+ * Set B->pristine_props to a new hash containing the file's properties.
+ *
+ * Allocate all results in B->pool.
*/
static svn_error_t *
get_file_from_ra(struct file_baton *b,
@@ -332,7 +343,7 @@ get_file_from_ra(struct file_baton *b,
SVN_ERR(svn_stream_open_unique(&fstream, &(b->path_start_revision), NULL,
svn_io_file_del_on_pool_cleanup,
- scratch_pool, scratch_pool));
+ b->pool, scratch_pool));
fstream = svn_stream_checksummed2(fstream, NULL, &b->start_md5_checksum,
svn_checksum_md5, TRUE, scratch_pool);
@@ -485,7 +496,7 @@ open_root(void *edit_baton,
}
/* Recursively walk tree rooted at DIR (at REVISION) in the repository,
- * reporting all files as deleted. Part of a workaround for issue 2333.
+ * reporting all children as deleted. Part of a workaround for issue 2333.
*
* DIR is a repository path relative to the URL in RA_SESSION. REVISION
* must be a valid revision number, not SVN_INVALID_REVNUM. EB is the
@@ -554,13 +565,20 @@ diff_deleted_dir(const char *dir,
}
if (dirent->kind == svn_node_dir)
- SVN_ERR(diff_deleted_dir(path,
- revision,
- ra_session,
- eb,
- cancel_func,
- cancel_baton,
- iterpool));
+ {
+ const char *wcpath = svn_dirent_join(eb->target, path, iterpool);
+
+ SVN_ERR(eb->diff_callbacks->dir_deleted(
+ NULL, NULL, wcpath,
+ eb->diff_cmd_baton, iterpool));
+ SVN_ERR(diff_deleted_dir(path,
+ revision,
+ ra_session,
+ eb,
+ cancel_func,
+ cancel_baton,
+ iterpool));
+ }
}
svn_pool_destroy(iterpool);
@@ -969,7 +987,7 @@ close_file(void *file_baton,
scratch_pool = b->pool;
- if (expected_md5_digest)
+ if (expected_md5_digest && eb->text_deltas)
{
svn_checksum_t *expected_md5_checksum;
@@ -1325,6 +1343,7 @@ svn_client__get_diff_editor(const svn_de
svn_ra_session_t *ra_session,
svn_revnum_t revision,
svn_boolean_t walk_deleted_dirs,
+ svn_boolean_t text_deltas,
const svn_wc_diff_callbacks4_t *diff_callbacks,
void *diff_cmd_baton,
svn_cancel_func_t cancel_func,
@@ -1355,6 +1374,7 @@ svn_client__get_diff_editor(const svn_de
eb->notify_func = notify_func;
eb->notify_baton = notify_baton;
eb->walk_deleted_repos_dirs = walk_deleted_dirs;
+ eb->text_deltas = text_deltas;
eb->cancel_func = cancel_func;
eb->cancel_baton = cancel_baton;
Modified: subversion/branches/hold/subversion/libsvn_client/repos_diff_summarize.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/repos_diff_summarize.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/repos_diff_summarize.c (original)
+++ subversion/branches/hold/subversion/libsvn_client/repos_diff_summarize.c Sun Aug 21 00:59:18 2011
@@ -1,5 +1,5 @@
/*
- * repos_diff_summarize.c -- The diff summarize editor for summarizing
+ * repos_diff_summarize.c -- The diff callbacks for summarizing
* the differences of two repository versions
*
* ====================================================================
@@ -30,9 +30,9 @@
#include "client.h"
-/* Overall crawler editor baton. */
-struct edit_baton {
- /* The target of the diff, relative to the root of the edit */
+/* Diff callbacks baton. */
+struct summarize_baton_t {
+ /* The target path of the diff, relative to the anchor; "" if target == anchor. */
const char *target;
/* The summarize callback passed down from the API */
@@ -41,412 +41,295 @@ struct edit_baton {
/* The summarize callback baton */
void *summarize_func_baton;
- /* An RA session used to check the kind of deleted paths */
- svn_ra_session_t *ra_session;
-
- /* The start revision for the comparison */
- svn_revnum_t revision;
-
- /* TRUE if the operation needs to walk deleted dirs on the "old" side.
- FALSE otherwise. */
- svn_boolean_t walk_deleted_repos_dirs;
-
- /* A callback used to see if the client wishes to cancel the running
- operation. */
- svn_cancel_func_t cancel_func;
-
- /* A baton to pass to the cancellation callback. */
- void *cancel_baton;
-
+ /* Which paths have a prop change. Key is a (const char *) path; the value
+ * is any non-null pointer to indicate that this path has a prop change. */
+ apr_hash_t *prop_changes;
};
-/* Item baton. */
-struct item_baton {
- /* The overall crawler editor baton */
- struct edit_baton *edit_baton;
-
- /* The summarize filled by the editor calls, NULL if this item hasn't
- been modified (yet) */
- svn_client_diff_summarize_t *summarize;
-
- /* The path of the file or directory within the repository */
- const char *path;
-
- /* The kind of this item */
- svn_node_kind_t node_kind;
-
- /* The file/directory pool */
- apr_pool_t *item_pool;
-};
-
-
-/* Create an item baton, with the fields initialized to EDIT_BATON, PATH,
- * NODE_KIND and POOL, respectively. Allocate the returned structure in POOL.
- */
-static struct item_baton *
-create_item_baton(struct edit_baton *edit_baton,
- const char *path,
- svn_node_kind_t node_kind,
- apr_pool_t *pool)
-{
- struct item_baton *b = apr_pcalloc(pool, sizeof(*b));
-
- b->edit_baton = edit_baton;
- /* Issue #2765: b->path is supposed to be relative to the target.
- If the target is a file, just use an empty path. This way the
- receiver can just concatenate this path to the original path
- without doing any extra checks. */
- if (node_kind == svn_node_file && strcmp(path, edit_baton->target) == 0)
- b->path = "";
- else
- b->path = apr_pstrdup(pool, path);
- b->node_kind = node_kind;
- b->item_pool = pool;
-
- return b;
-}
-
-/* Make sure that this item baton contains a summarize struct.
- * If it doesn't before this call, allocate a new struct in the item's pool,
- * initializing the diff kind to normal.
- * All other fields are also initialized from IB or to NULL/invalid values. */
-static void
-ensure_summarize(struct item_baton *ib)
-{
- svn_client_diff_summarize_t *sum;
- if (ib->summarize)
- return;
-
- sum = apr_pcalloc(ib->item_pool, sizeof(*sum));
-
- sum->node_kind = ib->node_kind;
- sum->summarize_kind = svn_client_diff_summarize_kind_normal;
- sum->path = ib->path;
-
- ib->summarize = sum;
-}
-
-
-/* An svn_delta_editor_t function. The root of the comparison hierarchy */
+/* Call B->summarize_func with B->summarize_func_baton, passing it a
+ * summary object composed from PATH (but made to be relative to the target
+ * of the diff), SUMMARIZE_KIND, PROP_CHANGED (or FALSE if the action is an
+ * add or delete) and NODE_KIND. */
static svn_error_t *
-open_root(void *edit_baton,
- svn_revnum_t base_revision,
- apr_pool_t *pool,
- void **root_baton)
+send_summary(struct summarize_baton_t *b,
+ const char *path,
+ svn_client_diff_summarize_kind_t summarize_kind,
+ svn_boolean_t prop_changed,
+ svn_node_kind_t node_kind,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *ib = create_item_baton(edit_baton, "",
- svn_node_dir, pool);
+ svn_client_diff_summarize_t *sum = apr_pcalloc(scratch_pool, sizeof(*sum));
- *root_baton = ib;
- return SVN_NO_ERROR;
-}
+ /* PATH is relative to the anchor of the diff, but SUM->path needs to be
+ relative to the target of the diff. */
+ sum->path = svn_relpath_skip_ancestor(b->target, path);
+ sum->summarize_kind = summarize_kind;
+ if (summarize_kind == svn_client_diff_summarize_kind_modified
+ || summarize_kind == svn_client_diff_summarize_kind_normal)
+ sum->prop_changed = prop_changed;
+ sum->node_kind = node_kind;
-/* Recursively walk the tree rooted at DIR (at REVISION) in the
- * repository, reporting all files as deleted. Part of a workaround
- * for issue 2333.
- *
- * DIR is a repository path relative to the URL in RA_SESSION. REVISION
- * may be NULL, in which case it defaults to HEAD. EDIT_BATON is the
- * overall crawler editor baton. If CANCEL_FUNC is not NULL, then it
- * should refer to a cancellation function (along with CANCEL_BATON).
- */
-/* ### TODO: Handle depth. */
-static svn_error_t *
-diff_deleted_dir(const char *dir,
- svn_revnum_t revision,
- svn_ra_session_t *ra_session,
- void *edit_baton,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- apr_pool_t *pool)
-{
- struct edit_baton *eb = edit_baton;
- apr_hash_t *dirents;
- apr_pool_t *iterpool = svn_pool_create(pool);
- apr_hash_index_t *hi;
-
- if (cancel_func)
- SVN_ERR(cancel_func(cancel_baton));
-
- SVN_ERR(svn_ra_get_dir2(ra_session,
- &dirents,
- NULL, NULL,
- dir,
- revision,
- SVN_DIRENT_KIND,
- pool));
-
- for (hi = apr_hash_first(pool, dirents); hi;
- hi = apr_hash_next(hi))
- {
- const char *path;
- const char *name = svn__apr_hash_index_key(hi);
- svn_dirent_t *dirent = svn__apr_hash_index_val(hi);
- svn_node_kind_t kind;
- svn_client_diff_summarize_t *sum;
-
- svn_pool_clear(iterpool);
-
- path = svn_relpath_join(dir, name, iterpool);
-
- SVN_ERR(svn_ra_check_path(eb->ra_session,
- path,
- eb->revision,
- &kind,
- iterpool));
-
- sum = apr_pcalloc(iterpool, sizeof(*sum));
- sum->summarize_kind = svn_client_diff_summarize_kind_deleted;
- sum->path = path;
- sum->node_kind = kind;
-
- SVN_ERR(eb->summarize_func(sum,
- eb->summarize_func_baton,
- iterpool));
-
- if (dirent->kind == svn_node_dir)
- SVN_ERR(diff_deleted_dir(path,
- revision,
- ra_session,
- eb,
- cancel_func,
- cancel_baton,
- iterpool));
- }
-
- svn_pool_destroy(iterpool);
+ SVN_ERR(b->summarize_func(sum, b->summarize_func_baton, scratch_pool));
return SVN_NO_ERROR;
}
-/* An svn_delta_editor_t function. */
-static svn_error_t *
-delete_entry(const char *path,
- svn_revnum_t base_revision,
- void *parent_baton,
- apr_pool_t *pool)
-{
- struct item_baton *ib = parent_baton;
- struct edit_baton *eb = ib->edit_baton;
- svn_client_diff_summarize_t *sum;
- svn_node_kind_t kind;
-
- /* We need to know if this is a directory or a file */
- SVN_ERR(svn_ra_check_path(eb->ra_session,
- path,
- eb->revision,
- &kind,
- pool));
-
- sum = apr_pcalloc(pool, sizeof(*sum));
- sum->summarize_kind = svn_client_diff_summarize_kind_deleted;
- sum->path = path;
- sum->node_kind = kind;
-
- SVN_ERR(eb->summarize_func(sum, eb->summarize_func_baton, pool));
-
- if (kind == svn_node_dir)
- SVN_ERR(diff_deleted_dir(path,
- eb->revision,
- eb->ra_session,
- eb,
- eb->cancel_func,
- eb->cancel_baton,
- pool));
-
- return SVN_NO_ERROR;
-}
-
-/* An svn_delta_editor_t function. */
-static svn_error_t *
-add_directory(const char *path,
- void *parent_baton,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_rev,
- apr_pool_t *pool,
- void **child_baton)
+/* Are there any changes to relevant (normal) props in PROPCHANGES? */
+static svn_boolean_t
+props_changed(const apr_array_header_t *propchanges,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *pb = parent_baton;
- struct item_baton *cb;
+ apr_array_header_t *props;
- cb = create_item_baton(pb->edit_baton, path, svn_node_dir, pool);
- ensure_summarize(cb);
- cb->summarize->summarize_kind = svn_client_diff_summarize_kind_added;
-
- *child_baton = cb;
- return SVN_NO_ERROR;
+ svn_error_clear(svn_categorize_props(propchanges, NULL, NULL, &props,
+ scratch_pool));
+ return (props->nelts != 0);
}
-/* An svn_delta_editor_t function. */
+
static svn_error_t *
-open_directory(const char *path,
- void *parent_baton,
- svn_revnum_t base_revision,
- apr_pool_t *pool,
- void **child_baton)
+cb_dir_deleted(svn_wc_notify_state_t *state,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *pb = parent_baton;
- struct item_baton *cb;
+ struct summarize_baton_t *b = diff_baton;
- cb = create_item_baton(pb->edit_baton, path, svn_node_dir, pool);
+ SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_deleted,
+ FALSE, svn_node_dir, scratch_pool));
- *child_baton = cb;
+ if (state)
+ *state = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
return SVN_NO_ERROR;
}
-
-/* An svn_delta_editor_t function. */
static svn_error_t *
-close_directory(void *dir_baton,
- apr_pool_t *pool)
+cb_file_deleted(svn_wc_notify_state_t *state,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ const char *tmpfile1,
+ const char *tmpfile2,
+ const char *mimetype1,
+ const char *mimetype2,
+ apr_hash_t *originalprops,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *ib = dir_baton;
- struct edit_baton *eb = ib->edit_baton;
+ struct summarize_baton_t *b = diff_baton;
- if (ib->summarize)
- SVN_ERR(eb->summarize_func(ib->summarize, eb->summarize_func_baton,
- pool));
+ SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_deleted,
+ FALSE, svn_node_file, scratch_pool));
+ if (state)
+ *state = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
return SVN_NO_ERROR;
}
-
-/* An svn_delta_editor_t function. */
static svn_error_t *
-add_file(const char *path,
- void *parent_baton,
- const char *copyfrom_path,
- svn_revnum_t copyfrom_rev,
- apr_pool_t *pool,
- void **file_baton)
+cb_dir_added(svn_wc_notify_state_t *state,
+ svn_boolean_t *tree_conflicted,
+ svn_boolean_t *skip,
+ svn_boolean_t *skip_children,
+ const char *path,
+ svn_revnum_t rev,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_revision,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *pb = parent_baton;
- struct item_baton *cb;
-
- cb = create_item_baton(pb->edit_baton, path, svn_node_file, pool);
- ensure_summarize(cb);
- cb->summarize->summarize_kind = svn_client_diff_summarize_kind_added;
-
- *file_baton = cb;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
+ if (skip)
+ *skip = FALSE;
+ if (skip_children)
+ *skip_children = FALSE;
return SVN_NO_ERROR;
}
-/* An svn_delta_editor_t function. */
static svn_error_t *
-open_file(const char *path,
- void *parent_baton,
- svn_revnum_t base_revision,
- apr_pool_t *pool,
- void **file_baton)
+cb_dir_opened(svn_boolean_t *tree_conflicted,
+ svn_boolean_t *skip,
+ svn_boolean_t *skip_children,
+ const char *path,
+ svn_revnum_t rev,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *pb = parent_baton;
- struct item_baton *cb;
-
- cb = create_item_baton(pb->edit_baton, path, svn_node_file, pool);
-
- *file_baton = cb;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
+ if (skip)
+ *skip = FALSE;
+ if (skip_children)
+ *skip_children = FALSE;
return SVN_NO_ERROR;
}
-/* An svn_delta_editor_t function. */
static svn_error_t *
-apply_textdelta(void *file_baton,
- const char *base_checksum,
- apr_pool_t *pool,
- svn_txdelta_window_handler_t *handler,
- void **handler_baton)
+cb_dir_closed(svn_wc_notify_state_t *contentstate,
+ svn_wc_notify_state_t *propstate,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ svn_boolean_t dir_was_added,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
{
- struct item_baton *ib = file_baton;
+ struct summarize_baton_t *b = diff_baton;
+ svn_boolean_t prop_change;
- ensure_summarize(ib);
- if (ib->summarize->summarize_kind == svn_client_diff_summarize_kind_normal)
- ib->summarize->summarize_kind = svn_client_diff_summarize_kind_modified;
-
- *handler = svn_delta_noop_window_handler;
- *handler_baton = NULL;
+ prop_change = apr_hash_get(b->prop_changes, path, APR_HASH_KEY_STRING) != NULL;
+ if (dir_was_added || prop_change)
+ SVN_ERR(send_summary(b, path,
+ dir_was_added ? svn_client_diff_summarize_kind_added
+ : svn_client_diff_summarize_kind_normal,
+ prop_change, svn_node_dir, scratch_pool));
+ if (contentstate)
+ *contentstate = svn_wc_notify_state_inapplicable;
+ if (propstate)
+ *propstate = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
return SVN_NO_ERROR;
}
-
-/* An svn_delta_editor_t function. */
static svn_error_t *
-close_file(void *file_baton,
- const char *text_checksum,
- apr_pool_t *pool)
-{
- struct item_baton *fb = file_baton;
- struct edit_baton *eb = fb->edit_baton;
-
- if (fb->summarize)
- SVN_ERR(eb->summarize_func(fb->summarize, eb->summarize_func_baton,
- pool));
-
+cb_file_added(svn_wc_notify_state_t *contentstate,
+ svn_wc_notify_state_t *propstate,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ const char *tmpfile1,
+ const char *tmpfile2,
+ svn_revnum_t rev1,
+ svn_revnum_t rev2,
+ const char *mimetype1,
+ const char *mimetype2,
+ const char *copyfrom_path,
+ svn_revnum_t copyfrom_revision,
+ const apr_array_header_t *propchanges,
+ apr_hash_t *originalprops,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
+{
+ struct summarize_baton_t *b = diff_baton;
+
+ SVN_ERR(send_summary(b, path, svn_client_diff_summarize_kind_added,
+ props_changed(propchanges, scratch_pool),
+ svn_node_file, scratch_pool));
+
+ if (contentstate)
+ *contentstate = svn_wc_notify_state_inapplicable;
+ if (propstate)
+ *propstate = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+cb_file_opened(svn_boolean_t *tree_conflicted,
+ svn_boolean_t *skip,
+ const char *path,
+ svn_revnum_t rev,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
+{
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
+ if (skip)
+ *skip = FALSE;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+cb_file_changed(svn_wc_notify_state_t *contentstate,
+ svn_wc_notify_state_t *propstate,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ const char *tmpfile1,
+ const char *tmpfile2,
+ svn_revnum_t rev1,
+ svn_revnum_t rev2,
+ const char *mimetype1,
+ const char *mimetype2,
+ const apr_array_header_t *propchanges,
+ apr_hash_t *originalprops,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
+{
+ struct summarize_baton_t *b = diff_baton;
+ svn_boolean_t text_change = (tmpfile2 != NULL);
+
+ SVN_ERR(send_summary(b, path,
+ text_change ? svn_client_diff_summarize_kind_modified
+ : svn_client_diff_summarize_kind_normal,
+ props_changed(propchanges, scratch_pool),
+ svn_node_file, scratch_pool));
+
+ if (contentstate)
+ *contentstate = svn_wc_notify_state_inapplicable;
+ if (propstate)
+ *propstate = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+cb_dir_props_changed(svn_wc_notify_state_t *propstate,
+ svn_boolean_t *tree_conflicted,
+ const char *path,
+ svn_boolean_t dir_was_added,
+ const apr_array_header_t *propchanges,
+ apr_hash_t *original_props,
+ void *diff_baton,
+ apr_pool_t *scratch_pool)
+{
+ struct summarize_baton_t *b = diff_baton;
+
+ if (props_changed(propchanges, scratch_pool))
+ apr_hash_set(b->prop_changes, path, APR_HASH_KEY_STRING, path);
+
+ if (propstate)
+ *propstate = svn_wc_notify_state_inapplicable;
+ if (tree_conflicted)
+ *tree_conflicted = FALSE;
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_client__get_diff_summarize_callbacks(
+ svn_wc_diff_callbacks4_t **callbacks,
+ void **callback_baton,
+ const char *target,
+ svn_client_diff_summarize_func_t summarize_func,
+ void *summarize_baton,
+ apr_pool_t *pool)
+{
+ svn_wc_diff_callbacks4_t *cb = apr_palloc(pool, sizeof(*cb));
+ struct summarize_baton_t *b = apr_palloc(pool, sizeof(*b));
+
+ b->target = target;
+ b->summarize_func = summarize_func;
+ b->summarize_func_baton = summarize_baton;
+ b->prop_changes = apr_hash_make(pool);
+
+ cb->file_opened = cb_file_opened;
+ cb->file_changed = cb_file_changed;
+ cb->file_added = cb_file_added;
+ cb->file_deleted = cb_file_deleted;
+ cb->dir_deleted = cb_dir_deleted;
+ cb->dir_opened = cb_dir_opened;
+ cb->dir_added = cb_dir_added;
+ cb->dir_props_changed = cb_dir_props_changed;
+ cb->dir_closed = cb_dir_closed;
-/* An svn_delta_editor_t function, implementing both change_file_prop and
- * change_dir_prop. */
-static svn_error_t *
-change_prop(void *entry_baton,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool)
-{
- struct item_baton *ib = entry_baton;
-
- if (svn_property_kind(NULL, name) == svn_prop_regular_kind)
- {
- ensure_summarize(ib);
-
- if (ib->summarize->summarize_kind != svn_client_diff_summarize_kind_added)
- ib->summarize->prop_changed = TRUE;
- }
+ *callbacks = cb;
+ *callback_baton = b;
return SVN_NO_ERROR;
}
-
-/* Create a repository diff summarize editor and baton. */
-svn_error_t *
-svn_client__get_diff_summarize_editor(const char *target,
- svn_client_diff_summarize_func_t
- summarize_func,
- void *summarize_baton,
- svn_ra_session_t *ra_session,
- svn_revnum_t revision,
- svn_cancel_func_t cancel_func,
- void *cancel_baton,
- const svn_delta_editor_t **editor,
- void **edit_baton,
- apr_pool_t *pool)
-{
- svn_delta_editor_t *tree_editor = svn_delta_default_editor(pool);
- struct edit_baton *eb = apr_palloc(pool, sizeof(*eb));
-
- eb->target = target;
- eb->summarize_func = summarize_func;
- eb->summarize_func_baton = summarize_baton;
- eb->ra_session = ra_session;
- eb->revision = revision;
- eb->walk_deleted_repos_dirs = TRUE;
- eb->cancel_func = cancel_func;
- eb->cancel_baton = cancel_baton;
-
- tree_editor->open_root = open_root;
- tree_editor->delete_entry = delete_entry;
- tree_editor->add_directory = add_directory;
- tree_editor->open_directory = open_directory;
- tree_editor->change_dir_prop = change_prop;
- tree_editor->close_directory = close_directory;
-
- tree_editor->add_file = add_file;
- tree_editor->open_file = open_file;
- tree_editor->apply_textdelta = apply_textdelta;
- tree_editor->change_file_prop = change_prop;
- tree_editor->close_file = close_file;
-
- return svn_delta_get_cancellation_editor(cancel_func, cancel_baton,
- tree_editor, eb, editor, edit_baton,
- pool);
-}
Modified: subversion/branches/hold/subversion/libsvn_client/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_client/status.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_client/status.c (original)
+++ subversion/branches/hold/subversion/libsvn_client/status.c Sun Aug 21 00:59:18 2011
@@ -85,12 +85,22 @@ tweak_status(void *baton,
/* If the status item has an entry, but doesn't belong to one of the
changelists our caller is interested in, we filter out this status
transmission. */
- if (sb->changelist_hash
- && (! status->changelist
- || ! apr_hash_get(sb->changelist_hash, status->changelist,
- APR_HASH_KEY_STRING)))
+ if (sb->changelist_hash)
{
- return SVN_NO_ERROR;
+ if (status->changelist)
+ {
+ /* Skip unless the caller requested this changelist. */
+ if (! apr_hash_get(sb->changelist_hash, status->changelist,
+ APR_HASH_KEY_STRING))
+ return SVN_NO_ERROR;
+ }
+ else
+ {
+ /* Skip unless the caller requested changelist-lacking items. */
+ if (! apr_hash_get(sb->changelist_hash, "",
+ APR_HASH_KEY_STRING))
+ return SVN_NO_ERROR;
+ }
}
/* If we know that the target was deleted in HEAD of the repository,
Modified: subversion/branches/hold/subversion/libsvn_wc/adm_ops.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_wc/adm_ops.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_wc/adm_ops.c (original)
+++ subversion/branches/hold/subversion/libsvn_wc/adm_ops.c Sun Aug 21 00:59:18 2011
@@ -2500,9 +2500,11 @@ svn_wc__internal_changelist_match(svn_wc
return FALSE;
}
+ /* The empty changelist name is special-cased. */
return (changelist
- && apr_hash_get((apr_hash_t *)clhash, changelist,
- APR_HASH_KEY_STRING) != NULL);
+ ? apr_hash_get((apr_hash_t *)clhash, changelist, APR_HASH_KEY_STRING)
+ : apr_hash_get((apr_hash_t *)clhash, "", APR_HASH_KEY_STRING)
+ ) != NULL;
}
Modified: subversion/branches/hold/subversion/libsvn_wc/tree_conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_wc/tree_conflicts.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_wc/tree_conflicts.c (original)
+++ subversion/branches/hold/subversion/libsvn_wc/tree_conflicts.c Sun Aug 21 00:59:18 2011
@@ -76,6 +76,8 @@ const svn_token_map_t svn_wc__conflict_r
{ "added", svn_wc_conflict_reason_added },
{ "replaced", svn_wc_conflict_reason_replaced },
{ "unversioned", svn_wc_conflict_reason_unversioned },
+ { "moved-here", svn_wc_conflict_reason_moved_here },
+ { "moved-away", svn_wc_conflict_reason_moved_away },
{ NULL }
};
Modified: subversion/branches/hold/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_wc/update_editor.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/hold/subversion/libsvn_wc/update_editor.c Sun Aug 21 00:59:18 2011
@@ -1272,7 +1272,8 @@ create_tree_conflict(svn_wc_conflict_des
/* Get the source-left information, i.e. the local state of the node
* before any changes were made to the working copy, i.e. the state the
* node would have if it was reverted. */
- if (reason == svn_wc_conflict_reason_added)
+ if (reason == svn_wc_conflict_reason_added ||
+ reason == svn_wc_conflict_reason_moved_here)
{
svn_wc__db_status_t added_status;
@@ -1327,6 +1328,7 @@ create_tree_conflict(svn_wc_conflict_des
* and that other case should also be handled. */
SVN_ERR_ASSERT(reason == svn_wc_conflict_reason_edited
|| reason == svn_wc_conflict_reason_deleted
+ || reason == svn_wc_conflict_reason_moved_away
|| reason == svn_wc_conflict_reason_replaced
|| reason == svn_wc_conflict_reason_obstructed);
@@ -1364,7 +1366,8 @@ create_tree_conflict(svn_wc_conflict_des
/* This is an 'update', so REPOS_RELPATH would be the same as for
* source-left. However, we don't have a source-left for locally
* added files. */
- right_repos_relpath = (reason == svn_wc_conflict_reason_added ?
+ right_repos_relpath = ((reason == svn_wc_conflict_reason_added ||
+ reason == svn_wc_conflict_reason_moved_here) ?
added_repos_relpath : left_repos_relpath);
if (! right_repos_relpath)
right_repos_relpath = their_relpath;
@@ -1496,7 +1499,18 @@ check_tree_conflict(svn_wc_conflict_desc
* would not have been called in the first place. */
SVN_ERR_ASSERT(action == svn_wc_conflict_action_add);
- reason = svn_wc_conflict_reason_added;
+ /* Scan the addition in case our caller didn't. */
+ if (working_status == svn_wc__db_status_added)
+ SVN_ERR(svn_wc__db_scan_addition(&working_status, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ eb->db, local_abspath,
+ scratch_pool, scratch_pool));
+
+ if (working_status == svn_wc__db_status_moved_here)
+ reason = svn_wc_conflict_reason_moved_here;
+ else
+ reason = svn_wc_conflict_reason_added;
}
else
{
@@ -1507,8 +1521,20 @@ check_tree_conflict(svn_wc_conflict_desc
case svn_wc__db_status_deleted:
- /* The node is locally deleted. */
- reason = svn_wc_conflict_reason_deleted;
+ {
+ const char *moved_to_abspath;
+
+ /* The node is locally deleted. Check if it was moved away.
+ * ### should scan_deletion return status_moved_away, like
+ * ### scan_addition returns status_moved_here? */
+ SVN_ERR(svn_wc__db_scan_deletion(NULL, &moved_to_abspath, NULL,
+ NULL, eb->db, local_abspath,
+ scratch_pool, scratch_pool));
+ if (moved_to_abspath)
+ reason = svn_wc_conflict_reason_moved_away;
+ else
+ reason = svn_wc_conflict_reason_deleted;
+ }
break;
case svn_wc__db_status_incomplete:
@@ -1573,6 +1599,7 @@ check_tree_conflict(svn_wc_conflict_desc
* would not have been called in the first place.*/
if (reason == svn_wc_conflict_reason_edited
|| reason == svn_wc_conflict_reason_deleted
+ || reason == svn_wc_conflict_reason_moved_away
|| reason == svn_wc_conflict_reason_replaced)
/* When the node existed before (it was locally deleted, replaced or
* edited), then 'update' cannot add it "again". So it can only send
@@ -1580,7 +1607,8 @@ check_tree_conflict(svn_wc_conflict_desc
SVN_ERR_ASSERT(action == svn_wc_conflict_action_edit
|| action == svn_wc_conflict_action_delete
|| action == svn_wc_conflict_action_replace);
- else if (reason == svn_wc_conflict_reason_added)
+ else if (reason == svn_wc_conflict_reason_added ||
+ reason == svn_wc_conflict_reason_moved_here)
/* When the node did not exist before (it was locally added), then 'update'
* cannot want to modify it in any way. It can only send _action_add. */
SVN_ERR_ASSERT(action == svn_wc_conflict_action_add);
@@ -1835,6 +1863,7 @@ delete_entry(const char *path,
keeping a not-present marker */
}
else if (tree_conflict->reason == svn_wc_conflict_reason_deleted
+ || tree_conflict->reason == svn_wc_conflict_reason_moved_away
|| tree_conflict->reason == svn_wc_conflict_reason_replaced)
{
/* The item does not exist locally because it was already shadowed.
@@ -2355,6 +2384,7 @@ open_directory(const char *path,
/* Other modifications wouldn't be a tree conflict */
SVN_ERR_ASSERT(
tree_conflict->reason == svn_wc_conflict_reason_deleted ||
+ tree_conflict->reason == svn_wc_conflict_reason_moved_away ||
tree_conflict->reason == svn_wc_conflict_reason_replaced);
/* Continue updating BASE */
@@ -3349,6 +3379,7 @@ open_file(const char *path,
/* Other modifications wouldn't be a tree conflict */
SVN_ERR_ASSERT(
tree_conflict->reason == svn_wc_conflict_reason_deleted ||
+ tree_conflict->reason == svn_wc_conflict_reason_moved_away||
tree_conflict->reason == svn_wc_conflict_reason_replaced);
/* Continue updating BASE */
Modified: subversion/branches/hold/subversion/libsvn_wc/wc-queries.sql
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_wc/wc-queries.sql?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_wc/wc-queries.sql (original)
+++ subversion/branches/hold/subversion/libsvn_wc/wc-queries.sql Sun Aug 21 00:59:18 2011
@@ -51,7 +51,8 @@ ORDER BY op_depth DESC
-- STMT_SELECT_BASE_NODE
SELECT repos_id, repos_path, presence, kind, revision, checksum,
translated_size, changed_revision, changed_date, changed_author, depth,
- symlink_target, last_mod_time, properties, file_external IS NOT NULL
+ symlink_target, last_mod_time, properties, file_external IS NOT NULL,
+ moved_to
FROM nodes
WHERE wc_id = ?1 AND local_relpath = ?2 AND op_depth = 0
@@ -59,6 +60,7 @@ WHERE wc_id = ?1 AND local_relpath = ?2
SELECT nodes.repos_id, nodes.repos_path, presence, kind, revision,
checksum, translated_size, changed_revision, changed_date, changed_author,
depth, symlink_target, last_mod_time, properties, file_external IS NOT NULL,
+ moved_to,
/* All the columns until now must match those returned by
STMT_SELECT_BASE_NODE. The implementation of svn_wc__db_base_get_info()
assumes that these columns are followed by the lock information) */
@@ -164,9 +166,9 @@ INSERT OR REPLACE INTO nodes (
wc_id, local_relpath, op_depth, parent_relpath, repos_id, repos_path,
revision, presence, depth, kind, changed_revision, changed_date,
changed_author, checksum, properties, translated_size, last_mod_time,
- dav_cache, symlink_target, file_external)
+ dav_cache, symlink_target, file_external, moved_to)
VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, ?13, ?14,
- ?15, ?16, ?17, ?18, ?19, ?20)
+ ?15, ?16, ?17, ?18, ?19, ?20, ?21)
-- STMT_SELECT_OP_DEPTH_CHILDREN
SELECT local_relpath FROM nodes
Modified: subversion/branches/hold/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/libsvn_wc/wc_db.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/branches/hold/subversion/libsvn_wc/wc_db.c Sun Aug 21 00:59:18 2011
@@ -781,6 +781,8 @@ insert_base_node(void *baton,
svn_sqlite__stmt_t *stmt;
svn_filesize_t recorded_size = SVN_INVALID_FILESIZE;
apr_int64_t recorded_mod_time;
+ const char *moved_to_relpath = NULL;
+ svn_boolean_t have_row;
/* The directory at the WCROOT has a NULL parent_relpath. Otherwise,
bind the appropriate parent_relpath. */
@@ -798,24 +800,28 @@ insert_base_node(void *baton,
/* ### we can't handle this right now */
SVN_ERR_ASSERT(pibb->conflict == NULL);
- if (pibb->keep_recorded_info)
+ SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
+ STMT_SELECT_BASE_NODE));
+ SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
+ SVN_ERR(svn_sqlite__step(&have_row, stmt));
+ if (have_row)
{
- SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
- STMT_SELECT_BASE_NODE));
-
- SVN_ERR(svn_sqlite__bindf(stmt, "is", wcroot->wc_id, local_relpath));
- SVN_ERR(svn_sqlite__step_row(stmt));
-
- recorded_size = get_recorded_size(stmt, 6);
- recorded_mod_time = svn_sqlite__column_int64(stmt, 12);
-
- SVN_ERR(svn_sqlite__reset(stmt));
+ /* A BASE node already exists. */
+ if (pibb->keep_recorded_info)
+ {
+ /* Preserve size and modification time if caller asked us to. */
+ recorded_size = get_recorded_size(stmt, 6);
+ recorded_mod_time = svn_sqlite__column_int64(stmt, 12);
+ }
+ /* Always preserve moved-to info. */
+ moved_to_relpath = svn_sqlite__column_text(stmt, 15, scratch_pool);
}
+ SVN_ERR(svn_sqlite__reset(stmt));
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb, STMT_INSERT_NODE));
SVN_ERR(svn_sqlite__bindf(stmt, "isisisr"
"tstr" /* 8 - 11 */
- "isnnnnns", /* 12 - 19 */
+ "isnnnnnsss", /* 12 - 21 */
wcroot->wc_id, /* 1 */
local_relpath, /* 2 */
(apr_int64_t)0, /* op_depth is 0 for base */
@@ -831,8 +837,9 @@ insert_base_node(void *baton,
pibb->changed_date, /* 12 */
pibb->changed_author, /* 13 */
(pibb->kind == svn_wc__db_kind_symlink) ?
- pibb->target : NULL)); /* 19 */
-
+ pibb->target : NULL, /* 19 */
+ NULL /* 20 */,
+ moved_to_relpath /* 21 */));
if (pibb->kind == svn_wc__db_kind_file)
{
SVN_ERR(svn_sqlite__bind_checksum(stmt, 14, pibb->checksum,
@@ -2022,7 +2029,7 @@ base_get_info(svn_wc__db_status_t *statu
SVN_ERR_ASSERT(!repos_relpath || *repos_relpath);
if (lock)
{
- *lock = lock_from_columns(stmt, 15, 16, 17, 18, result_pool);
+ *lock = lock_from_columns(stmt, 16, 17, 18, 19, result_pool);
}
if (changed_rev)
{
Modified: subversion/branches/hold/subversion/mod_dav_svn/mod_dav_svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/mod_dav_svn/mod_dav_svn.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ subversion/branches/hold/subversion/mod_dav_svn/mod_dav_svn.c Sun Aug 21 00:59:18 2011
@@ -1000,7 +1000,7 @@ static const command_rec cmds[] =
/* per server */
AP_INIT_TAKE1("SVNInMemoryCacheSize", SVNInMemoryCacheSize_cmd, NULL,
RSRC_CONF,
- "specifies the maximum size im kB per process of Subversion's "
+ "specifies the maximum size in kB per process of Subversion's "
"in-memory object cache (default value is 16384; 0 deactivates "
"the cache)."),
/* per server */
Modified: subversion/branches/hold/subversion/svn/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/svn/main.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/svn/main.c (original)
+++ subversion/branches/hold/subversion/svn/main.c Sun Aug 21 00:59:18 2011
@@ -1011,6 +1011,13 @@ const svn_opt_subcommand_desc2_t svn_cl_
" for deletion. If the patch creates a new file, that file is scheduled\n"
" for addition. Use 'svn revert' to undo deletions and additions you\n"
" do not agree with.\n"
+ "\n"
+ " Hint: If the patch file was created with Subversion, it will contain\n"
+ " the number of a revision N the patch will cleanly apply to\n"
+ " (look for lines like \"--- foo/bar.txt (revision N)\").\n"
+ " To avoid rejects, first update to the revision N using \n"
+ " 'svn update -r N', apply the patch, and then update back to the\n"
+ " HEAD revision. This way, conflicts can be resolved interactively.\n"
),
{'q', opt_dry_run, opt_strip, opt_reverse_diff,
opt_ignore_whitespace} },
@@ -1941,12 +1948,6 @@ main(int argc, const char *argv[])
break;
case opt_changelist:
opt_state.changelist = apr_pstrdup(pool, opt_arg);
- if (opt_state.changelist[0] == '\0')
- {
- err = svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL,
- _("Changelist names must not be empty"));
- return svn_cmdline_handle_exit_error(err, pool, "svn: ");
- }
apr_hash_set(changelists, opt_state.changelist,
APR_HASH_KEY_STRING, (void *)1);
break;
Modified: subversion/branches/hold/subversion/svn/tree-conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/svn/tree-conflicts.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/svn/tree-conflicts.c (original)
+++ subversion/branches/hold/subversion/svn/tree-conflicts.c Sun Aug 21 00:59:18 2011
@@ -62,6 +62,8 @@ static const svn_token_map_t map_conflic
{ N_("add"), svn_wc_conflict_reason_added },
{ N_("replace"), svn_wc_conflict_reason_replaced },
{ N_("unversioned"), svn_wc_conflict_reason_unversioned },
+ { N_("moved away"), svn_wc_conflict_reason_moved_away },
+ { N_("moved here"), svn_wc_conflict_reason_moved_here },
{ NULL, 0 }
};
@@ -75,6 +77,8 @@ static const svn_token_map_t map_conflic
{ "add", svn_wc_conflict_reason_added },
{ "replace", svn_wc_conflict_reason_replaced },
{ "unversioned", svn_wc_conflict_reason_unversioned },
+ { "moved-away", svn_wc_conflict_reason_moved_away },
+ { "moved-here", svn_wc_conflict_reason_moved_here },
{ NULL, 0 }
};
Modified: subversion/branches/hold/subversion/svndumpfilter/main.c
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/svndumpfilter/main.c?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/svndumpfilter/main.c (original)
+++ subversion/branches/hold/subversion/svndumpfilter/main.c Sun Aug 21 00:59:18 2011
@@ -1105,26 +1105,26 @@ do_filter(apr_getopt_t *os,
SVN_ERR(svn_cmdline_fprintf(stderr, subpool,
do_exclude
? opt_state->drop_empty_revs
- ? _("Excluding (and dropping empty "
- "revisions for) prefixes:\n")
- : _("Excluding prefixes:\n")
+ ? _("Excluding (and dropping empty "
+ "revisions for) prefix patterns:\n")
+ : _("Excluding prefix patterns:\n")
: opt_state->drop_empty_revs
- ? _("Including (and dropping empty "
- "revisions for) prefixes:\n")
- : _("Including prefixes:\n")));
+ ? _("Including (and dropping empty "
+ "revisions for) prefix patterns:\n")
+ : _("Including prefix patterns:\n")));
}
else
{
SVN_ERR(svn_cmdline_fprintf(stderr, subpool,
do_exclude
? opt_state->drop_empty_revs
- ? _("Excluding (and dropping empty "
- "revisions for) prefix patterns:\n")
- : _("Excluding prefix patterns:\n")
+ ? _("Excluding (and dropping empty "
+ "revisions for) prefixes:\n")
+ : _("Excluding prefixes:\n")
: opt_state->drop_empty_revs
- ? _("Including (and dropping empty "
- "revisions for) prefix patterns:\n")
- : _("Including prefix patterns:\n")));
+ ? _("Including (and dropping empty "
+ "revisions for) prefixes:\n")
+ : _("Including prefixes:\n")));
}
for (i = 0; i < opt_state->prefixes->nelts; i++)
Modified: subversion/branches/hold/subversion/tests/cmdline/changelist_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/tests/cmdline/changelist_tests.py?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/tests/cmdline/changelist_tests.py (original)
+++ subversion/branches/hold/subversion/tests/cmdline/changelist_tests.py Sun Aug 21 00:59:18 2011
@@ -1190,6 +1190,57 @@ def readd_after_revert(sbox):
svntest.actions.run_and_verify_svn(None, None, [],
'add', dummy)
+def empty_pseudo_changelist(sbox):
+ "the empty pseudo-changelist"
+
+ # Boilerplate.
+ sbox.build(read_only = True)
+ wc_dir = sbox.wc_dir
+
+ # Helper functions.
+
+ def found_nodes(*args):
+ # Extract the Greek-tree-relative paths.
+ return set(map(lambda info: info['Path'][len(wc_dir)+1:],
+ svntest.actions.run_and_parse_info(*args)))
+
+ def find_nodes(nodeset, *args):
+ assert isinstance(nodeset, set)
+ foundset = found_nodes(*args)
+ nodeset = set(map(lambda path: path.replace('/', os.path.sep), nodeset))
+ if nodeset != foundset:
+ raise svntest.Failure("Expected nodeset %s but found %s"
+ % (nodeset, foundset))
+
+ # Convenience variables.
+ E_path = sbox.ospath('A/B/E')
+ alpha_path = sbox.ospath('A/B/E/alpha')
+ beta_path = sbox.ospath('A/B/E/beta')
+ iota_path = sbox.ospath('iota')
+
+ # Can't add an item to the empty changelist.
+ expected_err = 'svn: E125014: .*'
+ svntest.actions.run_and_verify_svn(None, [], expected_err,
+ 'changelist', '', iota_path)
+
+ # Modify alpha and beta
+ svntest.main.file_append(alpha_path, "More stuff in alpha\n")
+ svntest.main.file_append(beta_path, "More stuff in beta\n")
+
+ # Add beta to 'testlist'.
+ svntest.actions.run_and_verify_svn(None, None, [],
+ 'changelist', 'testlist', beta_path)
+
+ # Convenience variables.
+ changelist = {
+ 'testlist' : set(['A/B/E/beta']),
+ '' : set(['A/B/E', 'A/B/E/alpha']),
+ }
+
+ # Some basic validations.
+ find_nodes(changelist['testlist'] | changelist[''], '-R', E_path)
+ find_nodes(changelist['testlist'], '--cl', 'testlist', '-R', E_path)
+ find_nodes(changelist[''], '--cl', '', '-R', E_path)
########################################################################
# Run the tests
@@ -1213,6 +1264,7 @@ test_list = [ None,
add_remove_non_existent_target,
add_remove_unversioned_target,
readd_after_revert,
+ empty_pseudo_changelist,
]
if __name__ == '__main__':
Modified: subversion/branches/hold/subversion/tests/cmdline/merge_reintegrate_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/tests/cmdline/merge_reintegrate_tests.py?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/tests/cmdline/merge_reintegrate_tests.py (original)
+++ subversion/branches/hold/subversion/tests/cmdline/merge_reintegrate_tests.py Sun Aug 21 00:59:18 2011
@@ -1383,18 +1383,6 @@ def reintegrate_with_subtree_mergeinfo(s
'D/G/pi' : Item("This is the file 'pi'.\n"),
'D/G/rho' : Item("New content"),
'D/G/tau' : Item("This is the file 'tau'.\n"),
- # Why do we expect mergeinfo of '/A_COPY/D/G/tauprime:2-9' on
- # A/D/G/tauprime? Because this --reintegrate merge is effectively a
- # two URL merge of %URL%/A@9 %URL%/A_COPY@9 to 'A'. Since %URL%/A@9 and
- # %URL%/A_COPY@9 have a common ancestor in %URL%/A@1 we expect this 2-URL
- # merge to record mergeinfo and a component of that mergeinfo describes
- # the merge of %URL%/A_COPY@2 to %URL%/A_COPY@9. We see that above on
- # A. But we also get it on A's subtrees with explicit mergeinfo, namely
- # A/D/G/tauprime. Now I know what you are thinking, "'A_COPY/D/G/tauprime'
- # doesn't even exist until r9!", and you are quite right. But this
- # inheritance of bogus mergeinfo is a known problem, see
- # http://subversion.tigris.org/issues/show_bug.cgi?id=3157#desc8,
- # and is not what this test is about, so we won't fail because of it.
'D/gamma_moved' : Item(
"Even newer content", props={SVN_PROP_MERGEINFO :
'/A/D/gamma_moved:2-15\n'
Modified: subversion/branches/hold/subversion/tests/cmdline/svndumpfilter_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/hold/subversion/tests/cmdline/svndumpfilter_tests.py?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/subversion/tests/cmdline/svndumpfilter_tests.py (original)
+++ subversion/branches/hold/subversion/tests/cmdline/svndumpfilter_tests.py Sun Aug 21 00:59:18 2011
@@ -439,7 +439,7 @@ def filter_mergeinfo_revs_outside_of_dum
# Check that all the blather above really happens. First does
# svndumpfilter report what we expect to stderr?
expected_err = [
- "Excluding (and dropping empty revisions for) prefix patterns:\n",
+ "Excluding (and dropping empty revisions for) prefixes:\n",
" '/branches/B2'\n",
"\n",
"Revision 6 committed as 6.\n",
Modified: subversion/branches/hold/tools/dist/collect_sigs.py
URL: http://svn.apache.org/viewvc/subversion/branches/hold/tools/dist/collect_sigs.py?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/tools/dist/collect_sigs.py (original)
+++ subversion/branches/hold/tools/dist/collect_sigs.py Sun Aug 21 00:59:18 2011
@@ -75,7 +75,9 @@ def generate_asc_files(target_dir='.'):
db = sqlite3.connect(os.path.join(target_dir, 'sigs.db'))
curs = db.cursor()
- curs.execute('SELECT filename, signature FROM signatures;')
+ like_filename = 'subversion-%s%%' % config.version
+ curs.execute('''SELECT filename, signature FROM signatures
+ WHERE filename LIKE ?''', (like_filename, ) )
for filename, signature in curs:
fd = _open(filename)
fd.write(signature)
Modified: subversion/branches/hold/tools/dist/dist.sh
URL: http://svn.apache.org/viewvc/subversion/branches/hold/tools/dist/dist.sh?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/tools/dist/dist.sh (original)
+++ subversion/branches/hold/tools/dist/dist.sh Sun Aug 21 00:59:18 2011
@@ -268,19 +268,19 @@ vsn_file="$DISTPATH/subversion/include/s
if [ "$VERSION" != "trunk" ]; then
sed \
- -e "/#define *SVN_VER_MAJOR/s/[0-9]\+/$ver_major/" \
- -e "/#define *SVN_VER_MINOR/s/[0-9]\+/$ver_minor/" \
- -e "/#define *SVN_VER_PATCH/s/[0-9]\+/$ver_patch/" \
+ -e "/#define *SVN_VER_MAJOR/s/[0-9]\\+/$ver_major/" \
+ -e "/#define *SVN_VER_MINOR/s/[0-9]\\+/$ver_minor/" \
+ -e "/#define *SVN_VER_PATCH/s/[0-9]\\+/$ver_patch/" \
-e "/#define *SVN_VER_TAG/s/\".*\"/\" ($VER_TAG)\"/" \
-e "/#define *SVN_VER_NUMTAG/s/\".*\"/\"$VER_NUMTAG\"/" \
- -e "/#define *SVN_VER_REVISION/s/[0-9]\+/$REVISION/" \
+ -e "/#define *SVN_VER_REVISION/s/[0-9]\\+/$REVISION/" \
< "$vsn_file" > "$vsn_file.tmp"
else
# Don't munge the version number if we are creating a nightly trunk tarball
sed \
-e "/#define *SVN_VER_TAG/s/\".*\"/\" ($VER_TAG)\"/" \
-e "/#define *SVN_VER_NUMTAG/s/\".*\"/\"$VER_NUMTAG\"/" \
- -e "/#define *SVN_VER_REVISION/s/[0-9]\+/$REVISION/" \
+ -e "/#define *SVN_VER_REVISION/s/[0-9]\\+/$REVISION/" \
< "$vsn_file" > "$vsn_file.tmp"
fi
Modified: subversion/branches/hold/tools/dist/release.py
URL: http://svn.apache.org/viewvc/subversion/branches/hold/tools/dist/release.py?rev=1159930&r1=1159929&r2=1159930&view=diff
==============================================================================
--- subversion/branches/hold/tools/dist/release.py (original)
+++ subversion/branches/hold/tools/dist/release.py Sun Aug 21 00:59:18 2011
@@ -423,7 +423,7 @@ def roll_tarballs(args):
logging.info('Moving artifacts and calculating checksums')
for e in extns:
if args.version.pre == 'nightly':
- filename = 'subversion-trunk.%s' % e
+ filename = 'subversion-nightly.%s' % e
else:
filename = 'subversion-%s.%s' % (args.version, e)