Johan Corveleyn wrote:
> Just thinking out loud here, but could we perhaps log the
> non-canonical value as part of the assertion output?
> [...]
> something like
> 
>  line 10238: assertion failed
> (svn_dirent_is_absolute(local_abspath='C:ImNotCanonical'))

Yes, Johan, we could do that.

The attached patch demonstrates it working.

Test output:
[[[
$ subversion/tests/libsvn_wc/wc-test 1
...
svn_tests: E235000: In file '.../subversion/libsvn_wc/wc_db.c' line 10238: 
assertion failed (svn_dirent_is_absolute(local_abspath='C:ImNotAbsolute'))
...
]]]

-- 
- Julian
Proof of concept: let 'dirent is absolute' assertion display the offending
path.

Test output:
[[[
$ subversion/tests/libsvn_wc/wc-test 1
...
svn_tests: E235000: In file '.../subversion/libsvn_wc/wc_db.c' line 10238: assertion failed (svn_dirent_is_absolute(local_abspath='C:ImNotAbsolute'))
...
]]]

* subversion/include/svn_error.h,
  subversion/libsvn_subr/error.c
  (svn_error__malfunction_f): New, varargs version of svn_error__malfunction.
  (SVN_ASSERT_DIRENT_IS_ABSOLUTE): New.

* subversion/libsvn_wc/wc_db.c
  (svn_wc__db_read_repos_info): Use it.

* subversion/libsvn_wc/node.c
  (svn_wc__node_get_repos_info): (destructively) test it.
--This line, and those below, will be ignored--

Index: subversion/include/svn_error.h
===================================================================
--- subversion/include/svn_error.h	(revision 1848560)
+++ subversion/include/svn_error.h	(working copy)
@@ -620,12 +620,29 @@ svn_error_t *svn_error_purge_tracing(svn
  */
 svn_error_t *
 svn_error__malfunction(svn_boolean_t can_return,
                        const char *file,
                        int line,
                        const char *expr);
+svn_error_t *
+svn_error__malfunction_f(svn_boolean_t can_return,
+                         const char *file, int line,
+                         const char *fmt, ...);
+
+/** Assert a given dirent is absolute.
+ *
+ * Shows the offending path in the error message, unlike
+ * assert(svn_dirent_is_absolute(abspath)).
+ */
+#define SVN_ASSERT_DIRENT_IS_ABSOLUTE(abspath)                          \
+  do {                                                                  \
+    if (!svn_dirent_is_absolute(abspath))                               \
+      SVN_ERR(svn_error__malfunction_f(TRUE, __FILE__, __LINE__,        \
+                "svn_dirent_is_absolute(%s='%s')",                      \
+                #abspath, abspath));                                    \
+  } while (0)
 
 /** A type of function that handles an assertion failure or other internal
  * malfunction detected within the Subversion libraries.
  *
  * The error occurred in the source file @a file at line @a line, and was an
  * assertion failure of the expression @a expr, or, if @a expr is null, an
Index: subversion/libsvn_subr/error.c
===================================================================
--- subversion/libsvn_subr/error.c	(revision 1848560)
+++ subversion/libsvn_subr/error.c	(working copy)
@@ -880,6 +880,21 @@
   return malfunction_handler(can_return, file, line, expr);
 }
 
+svn_error_t *
+svn_error__malfunction_f(svn_boolean_t can_return,
+                         const char *file, int line,
+                         const char *fmt, ...)
+{
+  apr_pool_t *pool = svn_pool_create(NULL);
+  va_list ap;
+  const char *expr;
+
+  va_start(ap, fmt);
+  expr = apr_pvsprintf(pool, fmt, ap);
+  va_end(ap);
+  return malfunction_handler(can_return, file, line, expr);
+}
+
 
 /* Misc. */
 
Index: subversion/libsvn_wc/wc_db.c
===================================================================
--- subversion/libsvn_wc/wc_db.c	(revision 1848560)
+++ subversion/libsvn_wc/wc_db.c	(working copy)
@@ -10235,7 +10235,7 @@
   const char *local_relpath;
   apr_int64_t repos_id = INVALID_REPOS_ID;
 
-  SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
+  SVN_ASSERT_DIRENT_IS_ABSOLUTE(local_abspath);
 
   SVN_ERR(svn_wc__db_wcroot_parse_local_abspath(&wcroot, &local_relpath, db,
                                                 local_abspath,
Index: subversion/libsvn_wc/node.c
===================================================================
--- subversion/libsvn_wc/node.c	(revision 1848560)
+++ subversion/libsvn_wc/node.c	(working copy)
@@ -124,6 +124,7 @@
                             apr_pool_t *result_pool,
                             apr_pool_t *scratch_pool)
 {
+  local_abspath = "C:ImNotAbsolute";
   return svn_error_trace(
             svn_wc__db_read_repos_info(revision,
                                        repos_relpath,

Reply via email to