svn commit: r1921455 - in /subversion/trunk/subversion: include/private/svn_diff_tree.h libsvn_diff/diff_tree_debug.c

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: rinrab
Date: Mon Oct 21 14:09:38 2024
New Revision: 1921455

URL: http://svn.apache.org/viewvc?rev=1921455&view=rev
Log:
Add a debug diff tree processor, which only prints the actions to a stream.

This is partially copied from a simialar to this, debug delta editor,
but for the diff tree processor.

The output it produces, for example, for diff of a single file modification
in a tree, through svn_wc__diff7() will be as following bellow.

[[[
DBG: dir_opened('')
DBG: | copyfrom_source : (null)
DBG: | left_source : (null)@r7
DBG: | right_source : (null)@r-1
DBG:   file_opened('package-lock.json')
DBG:   | left_source : (null)@r7
DBG:   | right_source : (null)@r-1
DBG:   | copyfrom_source : (null)
DBG:   file_changed('package-lock.json')
DBG:   | left_source : (null)@r7
DBG:   | right_source : (null)@r-1
DBG: dir_closed('')
DBG: | left_source : (null)@r7
DBG: | right_source : (null)@r-1
]]]

* subversion/include/private/svn_diff_tree.h
  (includes): Add svn_io.h for svn_stream_t.
  (svn_diff__tree_processor_debug_create): Declare function.
* subversion/libsvn_diff/diff_tree_debug.c
  (svn_diff__tree_processor_debug_create): Implement the function using
   a number of static functions internally.

Added:
    subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c   (with props)
Modified:
    subversion/trunk/subversion/include/private/svn_diff_tree.h

Modified: subversion/trunk/subversion/include/private/svn_diff_tree.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/private/svn_diff_tree.h?rev=1921455&r1=1921454&r2=1921455&view=diff
==============================================================================
--- subversion/trunk/subversion/include/private/svn_diff_tree.h (original)
+++ subversion/trunk/subversion/include/private/svn_diff_tree.h Mon Oct 21 14:09:38 2024
@@ -29,6 +29,7 @@
 #define SVN_DIFF_TREE_H
 
 #include "svn_types.h"
+#include "svn_io.h" // for svn_stream_t
 
 #ifdef __cplusplus
 extern "C" {
@@ -360,6 +361,17 @@ svn_diff__tree_processor_tee_create(cons
                                     const svn_diff_tree_processor_t *processor2,
                                     apr_pool_t *result_pool);
 
+/* Return a debug processor that writes the actions to @a out_stream.
+ *
+ * The debug diff tree processor simply prints an indication of what callbacks
+ * are being called and the arguments given to @a out_stream, and is only
+ * intended for use in debugging Subversion diff processors.
+ *
+ * Note: Our test suite generally ignores stdout lines starting with "DBG:".
+ */
+const svn_diff_tree_processor_t *
+svn_diff__tree_processor_debug_create(svn_stream_t *out_stream,
+                                      apr_pool_t *result_pool);
 
 svn_diff_source_t *
 svn_diff__source_create(svn_revnum_t revision,

Added: subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c?rev=1921455&view=auto
==============================================================================
--- subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c (added)
+++ subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c Mon Oct 21 14:09:38 2024
@@ -0,0 +1,372 @@
+/*
+ * diff_tree_debug.c :  a diff tree processor implementation, that writes
+ *                      the operations it does to a given stream.
+ *
+ * ====================================================================
+ *    Licensed to the Apache Software Foundation (ASF) under one
+ *    or more contributor license agreements.  See the NOTICE file
+ *    distributed with this work for additional information
+ *    regarding copyright ownership.  The ASF licenses this file
+ *    to you under the Apache License, Version 2.0 (the
+ *    "License"); you may not use this file except in compliance
+ *    with the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing,
+ *    software distributed under the License is distributed on an
+ *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *    KIND, either express or implied.  See the License for the
+ *    specific language governing permissions and limitations
+ *    under the License.
+ * ====================================================================
+ */
+
+#include <apr.h>
+#include <apr_pools.h>
+#include <apr_general.h>
+
+#include "svn_error.h"
+#include "svn_io.h"
+#include "svn_types.h"
+
+#include "private/svn_diff_tree.h"
+#include "svn_private_config.h"
+
+#define INDENT_SIZE 2
+
+typedef struct debug_diff_tree_baton_t
+{
+  int indent_level;
+
+  svn_stream_t *out;
+  const char *prefix;
+} debug_diff_tree_baton_t;
+
+static const char *
+diff_source_to_string(const svn_diff_source_t *source,
+                      apr_pool_t *result_pool)
+{
+  if (source)
+    {
+      return apr_psprintf(result_pool, "%s@r" "%" SVN_REVNUM_T_FMT,
+                          source->repos_relpath, source->revision);
+    }
+  else
+    {
+      return apr_pstrdup(result_pool, "(null)");
+    }
+}
+
+static svn_error_t *
+write_indent(debug_diff_tree_baton_t *baton,
+             apr_pool_t *scratch_pool)
+{
+  int i;
+
+  SVN_ERR(svn_stream_puts(baton->out, baton->prefix));
+  for (i = 0; i < baton->indent_level * INDENT_SIZE; ++i)
+    SVN_ERR(svn_stream_puts(baton->out, " "));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+write_action(debug_diff_tree_baton_t *b,
+             const char *action_name,
+             const char *relpath,
+             apr_pool_t *scratch_pool)
+{
+  SVN_ERR(write_indent(b, scratch_pool));
+  SVN_ERR(svn_stream_printf(b->out, scratch_pool,
+                            "%s('%s')\n",
+                            action_name, relpath));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+write_action_property(debug_diff_tree_baton_t *b,
+                      const char *name,
+                      const char *value,
+                      apr_pool_t *scratch_pool)
+{
+  SVN_ERR(write_indent(b, scratch_pool));
+  SVN_ERR(svn_stream_printf(b->out, scratch_pool,
+                            "| %s : %s\n",
+                            name, value));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+write_action_property_source(debug_diff_tree_baton_t *b,
+                             const char *name,
+                             const svn_diff_source_t *value,
+                             apr_pool_t *scratch_pool)
+{
+  return svn_error_trace(write_action_property(
+    b, name, diff_source_to_string(value, scratch_pool), scratch_pool));
+}
+
+static svn_error_t *
+debug_dir_opened(void **new_dir_baton,
+                 svn_boolean_t *skip,
+                 svn_boolean_t *skip_children,
+                 const char *relpath,
+                 const svn_diff_source_t *left_source,
+                 const svn_diff_source_t *right_source,
+                 const svn_diff_source_t *copyfrom_source,
+                 void *parent_dir_baton,
+                 const svn_diff_tree_processor_t *processor,
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "dir_opened", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "copyfrom_source",
+                                       copyfrom_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source", 
+                                       right_source, scratch_pool));
+
+  b->indent_level++;
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_dir_added(const char *relpath,
+                const svn_diff_source_t *copyfrom_source,
+                const svn_diff_source_t *right_source,
+                /*const*/ apr_hash_t *copyfrom_props,
+                /*const*/ apr_hash_t *right_props,
+                void *dir_baton,
+                const svn_diff_tree_processor_t *processor,
+                apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "dir_added", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "copyfrom_source",
+                                       copyfrom_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_dir_deleted(const char *relpath,
+                  const svn_diff_source_t *left_source,
+                  /*const*/ apr_hash_t *left_props,
+                  void *dir_baton,
+                  const svn_diff_tree_processor_t *processor,
+                  apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "dir_deleted", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_dir_changed(const char *relpath,
+                  const svn_diff_source_t *left_source,
+                  const svn_diff_source_t *right_source,
+                  /*const*/ apr_hash_t *left_props,
+                  /*const*/ apr_hash_t *right_props,
+                  const apr_array_header_t *prop_changes,
+                  void *dir_baton,
+                  const struct svn_diff_tree_processor_t *processor,
+                  apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "dir_changed", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_dir_closed(const char *relpath,
+                 const svn_diff_source_t *left_source,
+                 const svn_diff_source_t *right_source,
+                 void *dir_baton,
+                 const svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  b->indent_level--;
+
+  SVN_ERR(write_action(b, "dir_closed", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_file_opened(void **new_file_baton,
+                  svn_boolean_t *skip,
+                  const char *relpath,
+                  const svn_diff_source_t *left_source,
+                  const svn_diff_source_t *right_source,
+                  const svn_diff_source_t *copyfrom_source,
+                  void *dir_baton,
+                  const svn_diff_tree_processor_t *processor,
+                  apr_pool_t *result_pool,
+                  apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "file_opened", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "copyfrom_source",
+                                       copyfrom_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_file_added(const char *relpath,
+                 const svn_diff_source_t *copyfrom_source,
+                 const svn_diff_source_t *right_source,
+                 const char *copyfrom_file,
+                 const char *right_file,
+                 /*const*/ apr_hash_t *copyfrom_props,
+                 /*const*/ apr_hash_t *right_props,
+                 void *file_baton,
+                 const svn_diff_tree_processor_t *processor,
+                 apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "file_added", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "copyfrom_source",
+                                       copyfrom_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source", 
+right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_file_deleted(const char *relpath,
+                   const svn_diff_source_t *left_source,
+                   const char *left_file,
+                   /*const*/ apr_hash_t *left_props,
+                   void *file_baton,
+                   const svn_diff_tree_processor_t *processor,
+                   apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "file_deleted", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_file_changed(const char *relpath,
+                   const svn_diff_source_t *left_source,
+                   const svn_diff_source_t *right_source,
+                   const char *left_file,
+                   const char *right_file,
+                   /*const*/ apr_hash_t *left_props,
+                   /*const*/ apr_hash_t *right_props,
+                   svn_boolean_t file_modified,
+                   const apr_array_header_t *prop_changes,
+                   void *file_baton,
+                   const svn_diff_tree_processor_t *processor,
+                   apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "file_changed", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_file_closed(const char *relpath,
+                  const svn_diff_source_t *left_source,
+                  const svn_diff_source_t *right_source,
+                  void *file_baton,
+                  const svn_diff_tree_processor_t *processor,
+                  apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "file_closed", relpath, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "left_source",
+                                       left_source, scratch_pool));
+  SVN_ERR(write_action_property_source(b, "right_source",
+                                       right_source, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+debug_node_absent(const char *relpath,
+                  void *dir_baton,
+                  const svn_diff_tree_processor_t *processor,
+                  apr_pool_t *scratch_pool)
+{
+  debug_diff_tree_baton_t *b = processor->baton;
+
+  SVN_ERR(write_action(b, "node_absent", relpath, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+const svn_diff_tree_processor_t *
+svn_diff__tree_processor_debug_create(svn_stream_t *out_stream,
+                                      apr_pool_t *result_pool)
+{
+  debug_diff_tree_baton_t *b = apr_pcalloc(result_pool, sizeof(*b));
+
+  b->indent_level = 0;
+  b->out = out_stream;
+  b->prefix = "DBG: ";
+
+  svn_diff_tree_processor_t *debug =
+    svn_diff__tree_processor_create(b, result_pool);
+
+  debug->dir_opened   = debug_dir_opened;
+  debug->dir_added    = debug_dir_added;
+  debug->dir_deleted  = debug_dir_deleted;
+  debug->dir_changed  = debug_dir_changed;
+  debug->dir_closed   = debug_dir_closed;
+
+  debug->file_opened  = debug_file_opened;
+  debug->file_added   = debug_file_added;
+  debug->file_deleted = debug_file_deleted;
+  debug->file_changed = debug_file_changed;
+  debug->file_closed  = debug_file_closed;
+
+  debug->node_absent  = debug_node_absent;
+
+  return debug;
+}

Propchange: subversion/trunk/subversion/libsvn_diff/diff_tree_debug.c
------------------------------------------------------------------------------
    svn:eol-style = native
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.