Author: rinrab
Date: Tue May 20 18:31:35 2025
New Revision: 1925722

URL: http://svn.apache.org/viewvc?rev=1925722&view=rev
Log:
On the 'utf8-cmdline-prototype' branch: add a new function that retrieves
target list from args, instead of converting the encoding, assumes that
args have already been converted.

* subversion/include/svn_client.h
  (svn_client_args_to_target_array_utf8): Declare symbol.
* subversion/libsvn_client/cmdline.c
  (args_to_target_array): Factor out an internal helper.
  (svn_client_args_to_target_array2): Implement through args_to_target_array().
  (svn_client_args_to_target_array_utf8): Implement function.

No functional changes in the cmdline.

Modified:
    subversion/branches/utf8-cmdline-prototype/subversion/include/svn_client.h
    
subversion/branches/utf8-cmdline-prototype/subversion/libsvn_client/cmdline.c

Modified: 
subversion/branches/utf8-cmdline-prototype/subversion/include/svn_client.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/utf8-cmdline-prototype/subversion/include/svn_client.h?rev=1925722&r1=1925721&r2=1925722&view=diff
==============================================================================
--- subversion/branches/utf8-cmdline-prototype/subversion/include/svn_client.h 
(original)
+++ subversion/branches/utf8-cmdline-prototype/subversion/include/svn_client.h 
Tue May 20 18:31:35 2025
@@ -1197,6 +1197,20 @@ svn_client_args_to_target_array(apr_arra
                                 svn_client_ctx_t *ctx,
                                 apr_pool_t *pool);
 
+/**
+ * Similar to svn_client_args_to_target_array2() but assuming that the targets
+ * in @a os are already UTF-8 encoded.
+ *
+ * @since New in 1.15.0
+ */
+svn_error_t *
+svn_client_args_to_target_array_utf8(apr_array_header_t **targets_p,
+                                     apr_getopt_t *os,
+                                     const apr_array_header_t *known_targets,
+                                     svn_client_ctx_t *ctx,
+                                     svn_boolean_t 
keep_last_origpath_on_truepath_collision,
+                                     apr_pool_t *pool);
+
 /** @} group end: Client command-line processing */
 
 /** @} */

Modified: 
subversion/branches/utf8-cmdline-prototype/subversion/libsvn_client/cmdline.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/utf8-cmdline-prototype/subversion/libsvn_client/cmdline.c?rev=1925722&r1=1925721&r2=1925722&view=diff
==============================================================================
--- 
subversion/branches/utf8-cmdline-prototype/subversion/libsvn_client/cmdline.c 
(original)
+++ 
subversion/branches/utf8-cmdline-prototype/subversion/libsvn_client/cmdline.c 
Tue May 20 18:31:35 2025
@@ -110,15 +110,16 @@ check_root_url_of_target(const char **ro
    return SVN_NO_ERROR;
 }
 
-/* Note: This is substantially copied from svn_opt__args_to_target_array() in
- * order to move to libsvn_client while maintaining backward compatibility. */
-svn_error_t *
-svn_client_args_to_target_array2(apr_array_header_t **targets_p,
-                                 apr_getopt_t *os,
-                                 const apr_array_header_t *known_targets,
-                                 svn_client_ctx_t *ctx,
-                                 svn_boolean_t 
keep_last_origpath_on_truepath_collision,
-                                 apr_pool_t *pool)
+/* Internal helper for public interfaces svn_client_args_to_target_array2
+ * and svn_client_args_to_target_array_utf8.
+ */
+static svn_error_t *
+args_to_target_array(apr_array_header_t **targets_p,
+                     apr_array_header_t *utf8_targets,
+                     const apr_array_header_t *known_targets,
+                     svn_client_ctx_t *ctx,
+                     svn_boolean_t keep_last_origpath_on_truepath_collision,
+                     apr_pool_t *pool)
 {
   int i;
   svn_boolean_t rel_url_found = FALSE;
@@ -135,14 +136,9 @@ svn_client_args_to_target_array2(apr_arr
      If any of the targets are relative urls, then set the rel_url_found
      flag.*/
 
-  for (; os->ind < os->argc; os->ind++)
+  for (i = 0; i < utf8_targets->nelts; i++)
     {
-      /* The apr_getopt targets are still in native encoding. */
-      const char *raw_target = os->argv[os->ind];
-      const char *utf8_target;
-
-      SVN_ERR(svn_utf_cstring_to_utf8(&utf8_target,
-                                      raw_target, pool));
+      const char *utf8_target = APR_ARRAY_IDX(utf8_targets, i, const char *);
 
       if (svn_path_is_repos_relative_url(utf8_target))
         rel_url_found = TRUE;
@@ -370,3 +366,54 @@ svn_client_args_to_target_array2(apr_arr
 
   return SVN_NO_ERROR;
 }
+
+/* Note: This is substantially copied from svn_opt__args_to_target_array() in
+ * order to move to libsvn_client while maintaining backward compatibility. */
+svn_error_t *
+svn_client_args_to_target_array2(apr_array_header_t **targets_p,
+                                 apr_getopt_t *os,
+                                 const apr_array_header_t *known_targets,
+                                 svn_client_ctx_t *ctx,
+                                 svn_boolean_t 
keep_last_origpath_on_truepath_collision,
+                                 apr_pool_t *pool)
+{
+  apr_array_header_t *utf8_input_targets =
+      apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
+
+  for (; os->ind < os->argc; os->ind++)
+    {
+      /* The apr_getopt targets are still in native encoding. */
+      const char *raw_target = os->argv[os->ind];
+      const char *utf8_target;
+
+      SVN_ERR(svn_utf_cstring_to_utf8(&utf8_target,
+                                      raw_target, pool));
+
+      APR_ARRAY_PUSH(utf8_input_targets, const char *) = utf8_target;
+    }
+
+  return svn_error_trace(
+      args_to_target_array(targets_p, utf8_input_targets, known_targets, ctx,
+                           keep_last_origpath_on_truepath_collision, pool));
+}
+
+svn_error_t *
+svn_client_args_to_target_array_utf8(apr_array_header_t **targets_p,
+                                     apr_getopt_t *os,
+                                     const apr_array_header_t *known_targets,
+                                     svn_client_ctx_t *ctx,
+                                     svn_boolean_t 
keep_last_origpath_on_truepath_collision,
+                                     apr_pool_t *pool)
+{
+  apr_array_header_t *utf8_input_targets =
+      apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
+
+  for (; os->ind < os->argc; os->ind++)
+    {
+      APR_ARRAY_PUSH(utf8_input_targets, const char *) = os->argv[os->ind];
+    }
+
+  return svn_error_trace(
+      args_to_target_array(targets_p, utf8_input_targets, known_targets, ctx,
+                           keep_last_origpath_on_truepath_collision, pool));
+}


Reply via email to