"C. Michael Pilato" <cmpilato@collab.net> writes:
> "Steven Brown" <swbrown@ucsd.edu> writes:
>
> > Hello, I recently moved to 0.32.1 from 0.27, and now 'svnversion .' in a
> > working copy that has a svn:externals directory pulled in reports the
> > version of the external and the version of the working copy like a mixed
> > copy, e.g., '106:429'. It used to ignore the external and report '429'.
> > This new behavior seems horribly wrong, and I assume is a bug.
>
> It's a bug. svnversion uses svn_client_status() under-the-hood, and
> in the newer Subversion, the status operation has learned about
> svn:externals. For svnversion to work correctly, svn_client_status()
> should take a boolean flag for including/ignoring svn:externals (which
> is set to "ignore" when called by svnversion).
Steven, would you mind testing the following patch to see if it fixes
this problem for you?
----------
Start ignoring statuses at the first sign of those pesky
svn:externals. They will taint our version range calculation.
* subversion/svnversion/main.c
(struct status_baton): add 'ignore' parameter.
(analyze_status): Return immediately if we're told to ignore
statuses.
(notify): New.
(main): Populate the baton's new 'ignore' parameter, and register
the new notification function and baton.
Index: subversion/svnversion/main.c
===================================================================
--- subversion/svnversion/main.c (revision 7634)
+++ subversion/svnversion/main.c (working copy)
@@ -30,6 +30,7 @@
svn_boolean_t modified; /* is anything modified? */
const char *wc_path; /* path whose URL we're looking for. */
const char *wc_url; /* URL for the path whose URL we're looking for. */
+ svn_boolean_t ignore; /* ignore status until further notice. */
apr_pool_t *pool; /* pool in which to store alloc-needy things. */
};
@@ -42,6 +43,9 @@
svn_wc_status_t *status)
{
struct status_baton *sb = baton;
+
+ if (sb->ignore)
+ return;
if (! status->entry)
return;
@@ -70,7 +74,26 @@
sb->wc_url = apr_pstrdup (sb->pool, status->entry->url);
}
+
+/* This implements `svn_wc_notify_func_t'. */
static void
+notify (void *baton,
+ const char *path,
+ svn_wc_notify_action_t action,
+ svn_node_kind_t kind,
+ const char *mime_type,
+ svn_wc_notify_state_t content_state,
+ svn_wc_notify_state_t prop_state,
+ svn_revnum_t revision)
+{
+ struct status_baton *sb = baton;
+ if ((action == svn_wc_notify_status_external)
+ || (action == svn_wc_notify_status_completed))
+ sb->ignore = TRUE;
+}
+
+
+static void
usage(void)
{
fprintf(stderr,
@@ -168,8 +191,15 @@
sb.max_rev = SVN_INVALID_REVNUM;
sb.wc_path = wc_path;
sb.wc_url = NULL;
+ sb.ignore = FALSE;
sb.pool = pool;
rev.kind = svn_opt_revision_unspecified;
+
+ /* Setup the notification callback, and its baton (which is shared
+ with the status function). */
+ ctx.notify_func = notify;
+ ctx.notify_baton = &sb;
+
SVN_INT_ERR (svn_client_status (&youngest, wc_path, &rev, analyze_status,
&sb, TRUE, TRUE, FALSE, FALSE, &ctx, pool));
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Wed Nov 5 07:42:12 2003