On Wed, Mar 27, 2013 at 01:35:30PM +0100, Stefan Sperling wrote:
> Let's face it, the FS API promise people are upholding in this discussion
> has been broken for years.

FWIW, here's the patch I was trying to use:

Index: subversion/libsvn_repos/fs-wrap.c
===================================================================
--- subversion/libsvn_repos/fs-wrap.c   (revision 1461542)
+++ subversion/libsvn_repos/fs-wrap.c   (working copy)
@@ -42,6 +42,34 @@
 
 /*** Commit wrappers ***/
 
+/* Verify names of changed paths within the transaction TXN.
+ *
+ * This was added for issue 4340, "repos layer should reject filenames with
+ * trailing \n", but in addition to newlines it rejects any characters
+ * Subversion clients would reject when adding new files to version control. */
+static svn_error_t *
+verify_changed_path_names(svn_fs_txn_t *txn, apr_pool_t *pool)
+{
+  apr_pool_t *iterpool;
+  svn_fs_root_t *txn_root;
+  apr_hash_t *changed_paths;
+  apr_hash_index_t *hi;
+
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+  SVN_ERR(svn_fs_paths_changed2(&changed_paths, txn_root, pool));
+
+  iterpool = svn_pool_create(pool);
+  for (hi = apr_hash_first(pool, changed_paths); hi; hi = apr_hash_next(hi))
+    {
+        const char *path = svn__apr_hash_index_key(hi);
+
+        SVN_ERR(svn_path_check_valid(path, iterpool));
+    }
+  svn_pool_destroy(iterpool);
+
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_repos_fs_commit_txn(const char **conflict_p,
                         svn_repos_t *repos,
@@ -57,6 +85,9 @@ svn_repos_fs_commit_txn(const char **conflict_p,
 
   *new_rev = SVN_INVALID_REVNUM;
 
+  /* Verify names of changed paths. */
+  SVN_ERR(verify_changed_path_names(txn, pool));
+
   /* Run pre-commit hooks. */
   SVN_ERR(svn_fs_txn_name(&txn_name, txn, pool));
   SVN_ERR(svn_repos__hooks_pre_commit(repos, txn_name, pool));

Reply via email to