I wrote:
> I brought that patch up-to-date for trunk tonight -- I'm still working
> on it (only 4 failing tests now, down from 16!), but I like to keep
> you informed of progress. The new patch is at http://pastebin.ca/420554.
Lieven, I have to head to bed now. Here's an even more recent version
of the patch (so ignore the above pastebin URL). It's still failing
the same four tests, but I fixed some other things. If you have a
chance to work on this while I'm asleep, great. If not, no worries,
I'll work on it some more.
Regarding our earlier conversation:
>> Second, the current behavior of status -N is to show the status of both
>> files and directories in the target. In 'depth' terms, this is the
>> equivalent of --depth=immediates.
>>
>> So should I map status -N to 'status --depth=immediates' to match the
>> current behavior? Or to 'status --depth=files' to make it consistent
>> over all commands?
>>
>> Given -N is now obsolete, I prefer to just match current behavior and
>> get rid of that flag asap. Anyone who disagrees?
>
> I think your proposal makes sense. The empty immediate subdir in a
> --depth=immediates checkout still has a .svn dir, and a this-dir entry
> in its entries file, so we can talk about its status.
Note that the behavior currently implemented in the patch is the
"dumb" -N behavior (that is, --depth=files). In fact, that's why two
stat_tests are failing (24 and 26). Once we get the patch to match
your proposed behavior, I expect those two to pass. (I haven't taken a
look at the two depth_tests failures yet.)
Here's the latest:
[[[
Upgrade svn_wc_get_status_editor() interface to use depth instead of recurse.
*** PATCH IN PROGRESS -- SEE NOTE ABOUT FAILING TESTS BELOW ***
* subversion/include/svn_wc.h
(svn_wc_get_status_editor3): New prototype.
(svn_wc_get_status_editor2): Deprecate.
(svn_wc_status_set_repos_locks): Doc tweak.
* subversion/libsvn_wc/status.c
(struct edit_baton): Replace 'descend' field with 'default_depth'.
(struct dir_baton): Add new 'depth' field.
(make_dir_baton): Set and use new 'depth' field in dir_baton.
(get_dir_status, handle_dir_entry, handle_statii): Take 'depth'
instead of 'descend'. All callers changed.
(close_directory): Don't handle statuses in svn_depth_exclude case.
(svn_wc_get_status_editor3): New function.
(svn_wc_get_status_editor2, svn_wc_get_status_editor): Implement via
svn_wc_get_status_editor3.
* subversion/libsvn_wc/revision_status.c
(svn_wc_revision_status): Update caller.
* subversion/libsvn_client/status.c
(svn_client_status3): Update caller.
* subversion/include/svn_types.h
(svn_depth_t): Note that order of depths is important, and take the
tentativity markers off svn_depth_unknown and svn_depth_exclude.
* notes/sparse-directories.txt: Remove this item from the API TODO list.
-*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*-
With this patch, trunk fails four tests right now:
FAIL: stat_tests.py 24: run 'status -u' variations w/ incoming propchanges
FAIL: stat_tests.py 26: run 'status -uN' with incoming changes
FAIL: depth_tests.py 5: update depth-immediates wc gets top file mod only
FAIL: depth_tests.py 8: bring a dir into a depth-empty working copy
-*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*- -*-
]]]
Index: notes/sparse-directories.txt
===================================================================
--- notes/sparse-directories.txt (revision 24316)
+++ notes/sparse-directories.txt (working copy)
@@ -393,7 +393,6 @@
svn_client_info() # I don't think this needs to take depth.
svn_client_add3() # I don't think this needs to take depth.
- svn_wc_get_status_editor2() # Yes, probably should take depth.
svn_wc_get_switch_editor3() # Yes, probably should take depth.
svn_wc_revert2() # Really not sure about this one.
svn_wc_resolved_conflict2() # Really not sure about this one.
Index: subversion/include/svn_types.h
===================================================================
--- subversion/include/svn_types.h (revision 24316)
+++ subversion/include/svn_types.h (working copy)
@@ -208,12 +208,14 @@
*/
typedef enum
{
- /* Depth undetermined or ignored.
- ### TODO(sd): This depth may turn out to be unnecessary. ### */
+ /* The order of these depths is important: the higher the number,
+ the deeper it descends. This allows us to compare two depths
+ numerically to decide which should govern. */
+
+ /* Depth undetermined or ignored. */
svn_depth_unknown = -2,
- /* Exclude (remove, whatever) directory D.
- ### TODO(sd): This depth may turn out to be unnecessary. ### */
+ /* Exclude (i.e., don't descend into) directory D. */
svn_depth_exclude = -1,
/* Just the named directory D, no entries. Updates will not pull in
Index: subversion/include/svn_wc.h
===================================================================
--- subversion/include/svn_wc.h (revision 24316)
+++ subversion/include/svn_wc.h (working copy)
@@ -2057,10 +2057,19 @@
* - If @a get_all is false, then only locally-modified entries will be
* returned. If true, then all entries will be returned.
*
- * - If @a recurse is false, status structures will be returned only
- * for the target and its immediate children. Otherwise, this
- * operation is fully recursive.
+ * - If @a depth is @c svn_depth_empty, a status structure will
+ * be returned for the target only; if @c svn_depth_files, for the
+ * target and its immediate file children; if
+ * @c svn_depth_immediates, for the target and its immediate
+ * children; if @c svn_depth_infinity, for the target and
+ * everything underneath it, fully recursively.
*
+ * If @a depth is @c svn_depth_unknown, take depths from the
+ * working copy and behave as above in each directory's case.
+ *
+ * If the given @a depth is incompatible with the depth found in a
+ * working copy directory, the found depth always governs.
+ *
* If @a no_ignore is set, statuses that would typically be ignored
* will instead be reported.
*
@@ -2074,7 +2083,32 @@
* Allocate the editor itself in @a pool, but the editor does temporary
* allocations in a subpool of @a pool.
*
+ * @since New in 1.5.
+ */
+svn_error_t *svn_wc_get_status_editor3(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ void **set_locks_baton,
+ svn_revnum_t *edit_revision,
+ svn_wc_adm_access_t *anchor,
+ const char *target,
+ apr_hash_t *config,
+ svn_depth_t depth,
+ svn_boolean_t get_all,
+ svn_boolean_t no_ignore,
+ svn_wc_status_func2_t status_func,
+ void *status_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_traversal_info_t *traversal_info,
+ apr_pool_t *pool);
+
+/*
+ * Like svn_wc_get_status_editor3(), but with @a recurse instead of @a depth.
+ * If @a recurse is true, behave as if for @c svn_depth_infinity; else
+ * if @a recurse is false, behave as if for @c svn_depth_files.
+ *
* @since New in 1.2.
+ * @deprecated Provided for backward compatibility with the 1.4 API.
*/
svn_error_t *svn_wc_get_status_editor2(const svn_delta_editor_t **editor,
void **edit_baton,
@@ -2093,7 +2127,6 @@
svn_wc_traversal_info_t *traversal_info,
apr_pool_t *pool);
-
/**
* Same as svn_wc_get_status_editor2(), but with @a set_locks_baton set
* to @c NULL, and taking a deprecated svn_wc_status_func_t argument.
@@ -2121,7 +2154,7 @@
* Associate @a locks, a hash table mapping <tt>const char*</tt>
* absolute repository paths to <tt>svn_lock_t</tt> objects, with a
* @a set_locks_baton returned by an earlier call to
- * svn_wc_get_status_editor2(). @a repos_root is the repository root URL.
+ * svn_wc_get_status_editor3(). @a repos_root is the repository root URL.
* Perform all allocations in @a pool.
*
* @note @a locks will not be copied, so it must be valid throughout the
Index: subversion/libsvn_wc/revision_status.c
===================================================================
--- subversion/libsvn_wc/revision_status.c (revision 24316)
+++ subversion/libsvn_wc/revision_status.c (working copy)
@@ -108,10 +108,10 @@
cancel_func, cancel_baton,
pool));
- SVN_ERR(svn_wc_get_status_editor2(&editor, &edit_baton, NULL,
+ SVN_ERR(svn_wc_get_status_editor3(&editor, &edit_baton, NULL,
&edit_revision, anchor_access, target,
NULL /* config */,
- TRUE /* recurse */,
+ svn_depth_infinity,
TRUE /* get_all */,
FALSE /* no_ignore */,
analyze_status, &sb,
Index: subversion/libsvn_wc/status.c
===================================================================
--- subversion/libsvn_wc/status.c (revision 24316)
+++ subversion/libsvn_wc/status.c (working copy)
@@ -46,13 +46,21 @@
struct edit_baton
{
- /* For status, the "destination" of the edit and whether to honor
- any paths that are 'below'. */
+ /* For status, the "destination" of the edit. */
const char *anchor;
const char *target;
svn_wc_adm_access_t *adm_access;
- svn_boolean_t descend;
+ /* The overall depth of this edit (a dir baton may override this).
+ *
+ * If this is svn_depth_unknown, the depths found in the working
+ * copy will govern the edit; or if the edit depth indicates a
+ * descent deeper than the found depths are capable of, the found
+ * depths also govern, of course (there's no point descending into
+ * something that's not there).
+ */
+ svn_depth_t default_depth;
+
/* Do we want all statuses (instead of just the interesting ones) ? */
svn_boolean_t get_all;
@@ -111,6 +119,14 @@
directory. */
struct dir_baton *parent_baton;
+ /* The ambient requested depth below this point in the edit. This
+ can differ from the parent baton's depth (with the edit baton
+ considered the ultimate parent baton). For example, if the
+ parent baton has svn_depth_immediates, then here we should have
+ svn_depth_empty, because there would be no further recursion, not
+ even to file children. */
+ svn_depth_t depth;
+
/* 'svn status' shouldn't print status lines for things that are
added; we're only interest in asking if objects that the user
*already* has are up-to-date or not. Thus if this flag is set,
@@ -674,7 +690,7 @@
svn_wc_adm_access_t *adm_access,
const char *entry,
apr_array_header_t *ignores,
- svn_boolean_t descend,
+ svn_depth_t depth,
svn_boolean_t get_all,
svn_boolean_t no_ignore,
svn_boolean_t skip_this_dir,
@@ -697,7 +713,7 @@
svn_node_kind_t kind,
svn_boolean_t special,
apr_array_header_t *ignores,
- svn_boolean_t descend,
+ svn_depth_t depth,
svn_boolean_t get_all,
svn_boolean_t no_ignore,
svn_wc_status_func2_t status_func,
@@ -726,13 +742,16 @@
pool));
/* Descend only if the subdirectory is a working copy directory
- (and DESCEND is non-zero ofcourse) */
- if (descend && (full_entry != entry))
+ (and DEPTH permits it, of course) */
+ if (full_entry != entry
+ && (depth == svn_depth_unknown
+ || depth == svn_depth_immediates
+ || depth == svn_depth_infinity))
{
svn_wc_adm_access_t *dir_access;
SVN_ERR(svn_wc_adm_retrieve(&dir_access, adm_access, path, pool));
SVN_ERR(get_dir_status(eb, dir_entry, dir_access, NULL, ignores,
- descend, get_all, no_ignore, FALSE,
+ depth, get_all, no_ignore, FALSE,
status_func, status_baton, cancel_func,
cancel_baton, pool));
}
@@ -769,14 +788,14 @@
*will* be reported, regardless of this parameter's value.
Other arguments are the same as those passed to
- svn_wc_get_status_editor2(). */
+ svn_wc_get_status_editor3(). */
static svn_error_t *
get_dir_status(struct edit_baton *eb,
const svn_wc_entry_t *parent_entry,
svn_wc_adm_access_t *adm_access,
const char *entry,
apr_array_header_t *ignores,
- svn_boolean_t descend,
+ svn_depth_t depth,
svn_boolean_t get_all,
svn_boolean_t no_ignore,
svn_boolean_t skip_this_dir,
@@ -867,7 +886,7 @@
entry_entry,
dirent_p ? dirent_p->kind : svn_node_none,
dirent_p ? dirent_p->special : FALSE,
- ignores, descend, get_all,
+ ignores, depth, get_all,
no_ignore, status_func, status_baton,
cancel_func, cancel_baton, subpool));
}
@@ -960,7 +979,7 @@
dirent_p ? dirent_p->kind : svn_node_none,
dirent_p ? dirent_p->special : FALSE,
ignores,
- descend, get_all, no_ignore,
+ depth, get_all, no_ignore,
status_func, status_baton, cancel_func,
cancel_baton, iterpool));
}
@@ -1185,6 +1204,7 @@
struct dir_baton *d = apr_pcalloc(pool, sizeof(*d));
const char *full_path;
svn_wc_status2_t *status_in_parent;
+ svn_depth_t parent_depth = pb ? pb->depth : eb->default_depth;
/* Don't do this. Just do NOT do this to me. */
if (pb && (! path))
@@ -1209,6 +1229,16 @@
d->ood_kind = svn_node_dir;
d->ood_last_cmt_author = NULL;
+ if (parent_depth == svn_depth_immediates)
+ d->depth = svn_depth_empty;
+ else if (parent_depth == svn_depth_files || parent_depth == svn_depth_empty)
+ d->depth = svn_depth_exclude;
+ else if (parent_depth == svn_depth_unknown)
+ /* This is only tentative, it can be overridden from d's entry later. */
+ d->depth = svn_depth_unknown;
+ else
+ d->depth = svn_depth_infinity;
+
/* Get the status for this path's children. Of course, we only want
to do this if the path is versioned as a directory. */
if (pb)
@@ -1226,15 +1256,29 @@
&& (status_in_parent->text_status != svn_wc_status_obstructed)
&& (status_in_parent->text_status != svn_wc_status_external)
&& (status_in_parent->text_status != svn_wc_status_ignored)
- && (status_in_parent->entry->kind == svn_node_dir))
+ && (status_in_parent->entry->kind == svn_node_dir)
+ && (d->depth == svn_depth_unknown
+ || d->depth == svn_depth_infinity
+ || d->depth == svn_depth_files
+ || d->depth == svn_depth_immediates))
{
svn_wc_adm_access_t *dir_access;
+ svn_wc_status2_t *this_dir_status;
apr_array_header_t *ignores = eb->ignores;
SVN_ERR(svn_wc_adm_retrieve(&dir_access, eb->adm_access,
d->path, pool));
SVN_ERR(get_dir_status(eb, status_in_parent->entry, dir_access, NULL,
ignores, FALSE, TRUE, TRUE, TRUE, hash_stash,
d->statii, NULL, NULL, pool));
+
+ /* If we found a depth here, it should govern. */
+ this_dir_status = apr_hash_get(d->statii, d->path, APR_HASH_KEY_STRING);
+ if (this_dir_status && this_dir_status->entry
+ && (d->depth == svn_depth_unknown
+ || d->depth > status_in_parent->entry->depth))
+ {
+ d->depth = this_dir_status->entry->depth;
+ }
}
*dir_baton = d;
@@ -1353,18 +1397,17 @@
/* Handle a directory's STATII hash. EB is the edit baton. DIR_PATH
and DIR_ENTRY are the on-disk path and entry, respectively, for the
- directory itself. If DESCEND is set, this function will recurse
- into subdirectories. Also, if DIR_WAS_DELETED is set, each status
- that is reported through this function will have its
- repos_text_status field showing a deletion. Use POOL for all
- allocations. */
+ directory itself. Descend into subdirectories according to DEPTH.
+ Also, if DIR_WAS_DELETED is set, each status that is reported
+ through this function will have its repos_text_status field showing
+ a deletion. Use POOL for all allocations. */
static svn_error_t *
handle_statii(struct edit_baton *eb,
svn_wc_entry_t *dir_entry,
const char *dir_path,
apr_hash_t *statii,
svn_boolean_t dir_was_deleted,
- svn_boolean_t descend,
+ svn_depth_t depth,
apr_pool_t *pool)
{
apr_array_header_t *ignores = eb->ignores;
@@ -1398,13 +1441,16 @@
/* Now, handle the status. */
if (svn_wc__adm_missing(eb->adm_access, key))
status->text_status = svn_wc_status_missing;
- else if (descend && status->entry && status->entry->kind == svn_node_dir)
+ else if (status->entry && status->entry->kind == svn_node_dir
+ && (depth == svn_depth_unknown
+ || depth == svn_depth_immediates
+ || depth == svn_depth_infinity))
{
svn_wc_adm_access_t *dir_access;
SVN_ERR(svn_wc_adm_retrieve(&dir_access, eb->adm_access,
key, subpool));
SVN_ERR(get_dir_status(eb, dir_entry, dir_access, NULL,
- ignores, TRUE, eb->get_all,
+ ignores, depth, eb->get_all,
eb->no_ignore, TRUE, status_func,
status_baton, eb->cancel_func,
eb->cancel_baton, subpool));
@@ -1667,7 +1713,7 @@
/* Handle this directory's statuses, and then note in the parent
that this has been done. */
- if (pb)
+ if (pb && db->depth != svn_depth_exclude)
{
svn_boolean_t was_deleted = FALSE;
@@ -1680,12 +1726,13 @@
/* Now do the status reporting. */
SVN_ERR(handle_statii(eb, dir_status ? dir_status->entry : NULL,
- db->path, db->statii, was_deleted, eb->descend, pool));
+ db->path, db->statii, was_deleted, db->depth,
+ pool));
if (dir_status && is_sendable_status(dir_status, eb))
(eb->status_func)(eb->status_baton, db->path, dir_status);
apr_hash_set(pb->statii, db->path, APR_HASH_KEY_STRING, NULL);
}
- else
+ else if (! pb)
{
/* If this is the top-most directory, and the operation had a
target, we should only report the target. */
@@ -1697,7 +1744,8 @@
tgt_status = apr_hash_get(db->statii, path, APR_HASH_KEY_STRING);
if (tgt_status)
{
- if ((eb->descend)
+ if (eb->default_depth != svn_depth_exclude
+ /* ### TODO(sd): above condition "can't happen", right? */
&& (tgt_status->entry)
&& (tgt_status->entry->kind == svn_node_dir))
{
@@ -1706,8 +1754,9 @@
path, pool));
SVN_ERR(get_dir_status
(eb, tgt_status->entry, dir_access, NULL,
- eb->ignores, TRUE, eb->get_all, eb->no_ignore,
- TRUE, eb->status_func, eb->status_baton,
+ eb->ignores, eb->default_depth, eb->get_all,
+ eb->no_ignore, TRUE,
+ eb->status_func, eb->status_baton,
eb->cancel_func, eb->cancel_baton, pool));
}
if (is_sendable_status(tgt_status, eb))
@@ -1720,7 +1769,7 @@
Note that our directory couldn't have been deleted,
because it is the root of the edit drive. */
SVN_ERR(handle_statii(eb, eb->anchor_status->entry, db->path,
- db->statii, FALSE, eb->descend, pool));
+ db->statii, FALSE, eb->default_depth, pool));
if (is_sendable_status(eb->anchor_status, eb))
(eb->status_func)(eb->status_baton, db->path, eb->anchor_status);
eb->anchor_status = NULL;
@@ -1908,8 +1957,9 @@
if (! tgt_entry)
{
err = get_dir_status(eb, NULL, eb->adm_access, eb->target,
- ignores, FALSE, eb->get_all, TRUE,
- TRUE, eb->status_func, eb->status_baton,
+ ignores, eb->default_depth, eb->get_all,
+ TRUE, TRUE,
+ eb->status_func, eb->status_baton,
eb->cancel_func, eb->cancel_baton,
pool);
if (err) goto cleanup;
@@ -1921,7 +1971,7 @@
if (err) goto cleanup;
err = get_dir_status(eb, NULL, tgt_access, NULL, ignores,
- eb->descend, eb->get_all,
+ eb->default_depth, eb->get_all,
eb->no_ignore, FALSE,
eb->status_func, eb->status_baton,
eb->cancel_func, eb->cancel_baton,
@@ -1932,8 +1982,8 @@
else
{
err = get_dir_status(eb, NULL, eb->adm_access, eb->target,
- ignores, FALSE, eb->get_all, TRUE,
- TRUE, eb->status_func, eb->status_baton,
+ ignores, eb->default_depth, eb->get_all,
+ TRUE, TRUE, eb->status_func, eb->status_baton,
eb->cancel_func, eb->cancel_baton, pool);
if (err) goto cleanup;
}
@@ -1941,7 +1991,7 @@
else
{
err = get_dir_status(eb, NULL, eb->adm_access, NULL, ignores,
- eb->descend, eb->get_all, eb->no_ignore,
+ eb->default_depth, eb->get_all, eb->no_ignore,
FALSE, eb->status_func, eb->status_baton,
eb->cancel_func, eb->cancel_baton, pool);
if (err) goto cleanup;
@@ -1966,14 +2016,14 @@
/*** Public API ***/
svn_error_t *
-svn_wc_get_status_editor2(const svn_delta_editor_t **editor,
+svn_wc_get_status_editor3(const svn_delta_editor_t **editor,
void **edit_baton,
void **set_locks_baton,
svn_revnum_t *edit_revision,
svn_wc_adm_access_t *anchor,
const char *target,
apr_hash_t *config,
- svn_boolean_t recurse,
+ svn_depth_t depth,
svn_boolean_t get_all,
svn_boolean_t no_ignore,
svn_wc_status_func2_t status_func,
@@ -1988,7 +2038,7 @@
/* Construct an edit baton. */
eb = apr_palloc(pool, sizeof(*eb));
- eb->descend = recurse;
+ eb->default_depth = depth;
eb->target_revision = edit_revision;
eb->adm_access = anchor;
eb->config = config;
@@ -2040,7 +2090,43 @@
}
+svn_error_t *
+svn_wc_get_status_editor2(const svn_delta_editor_t **editor,
+ void **edit_baton,
+ void **set_locks_baton,
+ svn_revnum_t *edit_revision,
+ svn_wc_adm_access_t *anchor,
+ const char *target,
+ apr_hash_t *config,
+ svn_boolean_t recurse,
+ svn_boolean_t get_all,
+ svn_boolean_t no_ignore,
+ svn_wc_status_func2_t status_func,
+ void *status_baton,
+ svn_cancel_func_t cancel_func,
+ void *cancel_baton,
+ svn_wc_traversal_info_t *traversal_info,
+ apr_pool_t *pool)
+{
+ return svn_wc_get_status_editor3(editor,
+ edit_baton,
+ set_locks_baton,
+ edit_revision,
+ anchor,
+ target,
+ config,
+ SVN_DEPTH_FROM_RECURSE(recurse),
+ get_all,
+ no_ignore,
+ status_func,
+ status_baton,
+ cancel_func,
+ cancel_baton,
+ traversal_info,
+ pool);
+}
+
/* Helpers for deprecated svn_wc_status_editor(), of type
svn_wc_status_func2_t. */
struct old_status_func_cb_baton
@@ -2080,8 +2166,9 @@
b->original_func = status_func;
b->original_baton = status_baton;
- return svn_wc_get_status_editor2(editor, edit_baton, NULL, edit_revision,
- anchor, target, config, recurse,
+ return svn_wc_get_status_editor3(editor, edit_baton, NULL, edit_revision,
+ anchor, target, config,
+ SVN_DEPTH_FROM_RECURSE(recurse),
get_all, no_ignore, old_status_func_cb,
b, cancel_func, cancel_baton,
traversal_info, pool);
Index: subversion/libsvn_client/status.c
===================================================================
--- subversion/libsvn_client/status.c (revision 24316)
+++ subversion/libsvn_client/status.c (working copy)
@@ -221,8 +221,6 @@
const svn_wc_entry_t *entry = NULL;
struct status_baton sb;
svn_revnum_t edit_revision = SVN_INVALID_REVNUM;
- /* ### TODO(sd): This is a shim, we should use depth for real. */
- svn_depth_t recurse = SVN_DEPTH_TO_RECURSE(depth);
sb.real_status_func = status_func;
sb.real_status_baton = status_baton;
@@ -244,10 +242,9 @@
/* Get the status edit, and use our wrapping status function/baton
as the callback pair. */
- /* ### TODO(sd): ...and this would take depth, not recurse... */
- SVN_ERR(svn_wc_get_status_editor2(&editor, &edit_baton, &set_locks_baton,
+ SVN_ERR(svn_wc_get_status_editor3(&editor, &edit_baton, &set_locks_baton,
&edit_revision, anchor_access, target,
- ctx->config, recurse, get_all, no_ignore,
+ ctx->config, depth, get_all, no_ignore,
tweak_status, &sb, ctx->cancel_func,
ctx->cancel_baton, traversal_info,
pool));
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Mon Apr 2 10:20:08 2007