svn commit: r1926021 - in /subversion/branches/cmdline-parse-targets: ./ subversion/include/private/svn_opt_private.h subversion/libsvn_subr/opt.c

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: rinrab
Date: Sat May 31 20:18:02 2025
New Revision: 1926021

URL: http://svn.apache.org/viewvc?rev=1926021&view=rev
Log:
On the 'cmdline-parse-targets' branch: move r1926013 from
'utf8-cmdline-prototype', introducing svn_opt__target_t api.

This seems pretty good to implement our target utils, because we could
parse everything once. I'll try to rewrite those utils and cmdline I guess...

* subversion/include/private/svn_opt_private.h
  (svn_opt__target_type_e,
   svn_opt__target_t,
   svn_opt__target_parse,
   svn_opt__target_to_string,
   svn_opt__target_resolve,
   svn_opt__target_array_parse,
   svn_opt__target_array_to_string): Declare.
* subversion/libsvn_subr/opt.c
  (svn_opt__target_parse,
   svn_opt__target_to_string,
   svn_opt__target_resolve,
   svn_opt__target_array_parse,
   svn_opt__target_array_to_string): Implement.

Modified:
    subversion/branches/cmdline-parse-targets/   (props changed)
    subversion/branches/cmdline-parse-targets/subversion/include/private/svn_opt_private.h
    subversion/branches/cmdline-parse-targets/subversion/libsvn_subr/opt.c

Propchange: subversion/branches/cmdline-parse-targets/
------------------------------------------------------------------------------
  Merged /subversion/branches/utf8-cmdline-prototype:r1926013

Modified: subversion/branches/cmdline-parse-targets/subversion/include/private/svn_opt_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/cmdline-parse-targets/subversion/include/private/svn_opt_private.h?rev=1926021&r1=1926020&r2=1926021&view=diff
==============================================================================
--- subversion/branches/cmdline-parse-targets/subversion/include/private/svn_opt_private.h (original)
+++ subversion/branches/cmdline-parse-targets/subversion/include/private/svn_opt_private.h Sat May 31 20:18:02 2025
@@ -145,6 +145,105 @@ svn_opt__revision_range_from_revnums(svn
                                      svn_revnum_t end_revnum,
                                      apr_pool_t *result_pool);
 
+/**
+ *
+ */
+typedef enum svn_opt__target_type_e
+{
+  svn_opt__target_type_local_abspath,
+  svn_opt__target_type_absolute_url,
+  svn_opt__target_type_relative_url
+
+} svn_opt__target_type_e;
+
+/**
+ * Stores info about a parsed target.
+ *
+ * FIXME: peg_revision wouldn yet be an empty string instead of NULL if
+ * one wasn't found.
+ *
+ * TODO: potentially also parse peg_revision to svn_opt_revision_t so we
+ * won't need to do it later in the cmdline.
+ *
+ * TODO: add an option to reject all peg revisions which might be useful,
+ * for example, in svnadmin, which doesn't support it by design.
+ *
+ * TODO: pass this directly into the cmdline so we won't need to parse
+ * targets twice and could operate with pretty parsed ones.
+ */
+typedef struct svn_opt__target_t
+{
+  /* Type of the target */
+  svn_opt__target_type_e type;
+
+  /* Path component of the target */
+  const char *true_target;
+
+  /* Peg revision of the target or @c NULL if it wasn't found */
+  const char *peg_revision;
+
+} svn_opt__target_t;
+
+/**
+ * Parses a target described in @a str into @a target_p, allocated in @a pool.
+ *
+ * If the target represents a relative URL and @a rel_url_found_p is not
+ * @c NULL, sets it to @c TRUE.
+ */
+svn_error_t *
+svn_opt__target_parse(svn_opt__target_t **target_p,
+                      svn_boolean_t *rel_url_found_p,
+                      const char *str,
+                      apr_pool_t *pool);
+
+/**
+ * Converts @a target back into its canonical string representation,
+ * including svn_opt__target_t::peg_revision, and sets @a path_p with
+ * the result.
+ */
+svn_error_t *
+svn_opt__target_to_string(const char **path_p,
+                          svn_opt__target_t *target,
+                          apr_pool_t *pool);
+
+/**
+ * Resolves @a target of type @c svn_opt__target_type_relative_url, by
+ * adding @a root path before and changing type to @c
+ * svn_opt__target_type_absolute_url.
+ */
+svn_error_t *
+svn_opt__target_resolve(svn_opt__target_t *target,
+                        const char *root,
+                        apr_pool_t *pool);
+
+/**
+ * Parses targets described in @a paths (an array of const char *)
+ * into @a targets_p (an array of svn_opt__target_t *).
+ *
+ * If any of the targets represents a relative URL and @a rel_url_found_p
+ * is not @c NULL, sets it to @c TRUE.
+ *
+ * @see svn_opt__target_parse()
+ */
+svn_error_t *
+svn_opt__target_array_parse(apr_array_header_t **targets_p,
+                            svn_boolean_t *rel_url_found_p,
+                            apr_array_header_t *paths,
+                            apr_pool_t *pool);
+
+/**
+ * Converts all targets in @a targets (an array of svn_opt__target_t *)
+ * back into its canonical string representation, including
+ * svn_opt__target_t::peg_revision, and sets @a path_p (an array of
+ * const char *) with the result.
+ *
+ * @see svn_opt__target_to_string()
+ */
+svn_error_t *
+svn_opt__target_array_to_string(apr_array_header_t **paths_p,
+                                apr_array_header_t *targets,
+                                apr_pool_t *pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/cmdline-parse-targets/subversion/libsvn_subr/opt.c
URL: http://svn.apache.org/viewvc/subversion/branches/cmdline-parse-targets/subversion/libsvn_subr/opt.c?rev=1926021&r1=1926020&r2=1926021&view=diff
==============================================================================
--- subversion/branches/cmdline-parse-targets/subversion/libsvn_subr/opt.c (original)
+++ subversion/branches/cmdline-parse-targets/subversion/libsvn_subr/opt.c Sat May 31 20:18:02 2025
@@ -478,3 +478,120 @@ svn_opt__arg_canonicalize_path(const cha
 
   return SVN_NO_ERROR;
 }
+
+svn_error_t *
+svn_opt__target_parse(svn_opt__target_t **target_p,
+                      svn_boolean_t *rel_url_found_p,
+                      const char *path,
+                      apr_pool_t *pool)
+{
+  svn_opt__target_t *new_target = apr_pcalloc(pool,
+                                              sizeof(*new_target));
+
+  SVN_ERR(svn_opt__split_arg_at_peg_revision(&new_target->true_target,
+                                             &new_target->peg_revision,
+                                             path, pool));
+
+  if (svn_path_is_repos_relative_url(path))
+    {
+      new_target->type = svn_opt__target_type_relative_url;
+
+      if (rel_url_found_p != NULL)
+        *rel_url_found_p = TRUE;
+    }
+  if (svn_path_is_url(path))
+    new_target->type = svn_opt__target_type_absolute_url;
+  else
+    new_target->type = svn_opt__target_type_local_abspath;
+
+  *target_p = new_target;
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_opt__target_to_string(const char **path_p,
+                          svn_opt__target_t *target,
+                          apr_pool_t *pool)
+{
+  const char *canonical_target;
+
+  if (target->type == svn_opt__target_type_absolute_url
+      || target->type == svn_opt__target_type_relative_url)
+    {
+      SVN_ERR(svn_opt__arg_canonicalize_url(&canonical_target,
+                                            target->true_target, pool));
+    }
+  else
+    {
+      canonical_target = target->true_target;
+    }
+
+  *path_p = apr_pstrcat(pool, canonical_target,
+                        target->peg_revision, SVN_VA_NULL);
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_opt__target_resolve(svn_opt__target_t *target,
+                        const char *root,
+                        apr_pool_t *pool)
+{
+  const char *abs_target;
+
+  assert(target->type == svn_opt__target_type_relative_url);
+
+  SVN_ERR(svn_path_resolve_repos_relative_url(&abs_target, target->true_target,
+                                              root, pool));
+
+  target->true_target = abs_target;
+  target->type = svn_opt__target_type_absolute_url;
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_opt__target_array_parse(apr_array_header_t **targets_p,
+                            svn_boolean_t *rel_url_found_p,
+                            apr_array_header_t *paths,
+                            apr_pool_t *pool)
+{
+  int i;
+
+  if (*targets_p != NULL)
+    *targets_p = apr_array_make(pool, DEFAULT_ARRAY_SIZE,
+                                sizeof(svn_opt__target_t *));
+
+  for (i = 0; i < paths->nelts; i++)
+    {
+      const char *path = APR_ARRAY_IDX(paths, i, const char *);
+      svn_opt__target_t *target;
+
+      SVN_ERR(svn_opt__target_parse(&target, rel_url_found_p, path, pool));
+      APR_ARRAY_PUSH(*targets_p, svn_opt__target_t *) = target;
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_opt__target_array_to_string(apr_array_header_t **paths_p,
+                                apr_array_header_t *targets,
+                                apr_pool_t *pool)
+{
+  int i;
+
+  if (*paths_p != NULL)
+    *paths_p = apr_array_make(pool, DEFAULT_ARRAY_SIZE, sizeof(const char *));
+
+  for (i = 0; i < targets->nelts; i++)
+    {
+      const char *path;
+      svn_opt__target_t *target = APR_ARRAY_IDX(targets, i,
+                                                svn_opt__target_t *);
+
+      SVN_ERR(svn_opt__target_to_string(&path, target, pool));
+      APR_ARRAY_PUSH(*paths_p, const char *) = path;
+    }
+
+  return SVN_NO_ERROR;
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.