svn commit: r1925664 - in /subversion/trunk/subversion: include/svn_io.h libsvn_client/blame.c libsvn_subr/stream.c libsvn_subr/subst.c

[email protected]
Newsgroups gmane.comp.version-control.subversion.svn
Message-ID <[email protected]>
Author: brane
Date: Sun May 18 11:36:06 2025
New Revision: 1925664

URL: http://svn.apache.org/viewvc?rev=1925664&view=rev
Log:
When wrapping streams, set only those handlers on the wrapper that are
supported by the source stream, otherwise the svn_stream_supports_*()
predicates do not work as expected. And for consistency, expose the "stream
supports seek" predicate explicitly in the streams API instead of hiding it
behind "supports reset".

* subversion/include/svn_io.h
  (svn_stream_supports_seek): New function.
* subversion/libsvn_subr/stream.c
  (svn_stream_supports_seek): Implemented here.
  (svn_stream_supports_reset): This is now just a wrapper for the above.
  (svn_stream_disown): Add the partial read, mark and seek handlers only
   if the original wrapped stream supports them.
  (svn_stream_checksummed2): Likewise.

* subversion/libsvn_subr/subst.c
  (stream_translated): Use separate checks to decide when to add the
   mark and seek stream handlers.

* subversion/libsvn_client/blame.c
  (file_rev_handler): Let's just agree to not disown NULL streams, shall we?
   We have a perfectly good empty stream that can be disowned without
   dereferencing a null pointer.

Modified:
    subversion/trunk/subversion/include/svn_io.h
    subversion/trunk/subversion/libsvn_client/blame.c
    subversion/trunk/subversion/libsvn_subr/stream.c
    subversion/trunk/subversion/libsvn_subr/subst.c

Modified: subversion/trunk/subversion/include/svn_io.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_io.h?rev=1925664&r1=1925663&r2=1925664&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_io.h (original)
+++ subversion/trunk/subversion/include/svn_io.h Sun May 18 11:36:06 2025
@@ -1385,6 +1385,14 @@ svn_stream_reset(svn_stream_t *stream);
 svn_boolean_t
 svn_stream_supports_mark(svn_stream_t *stream);
 
+/** Returns @c TRUE if the generic @a stream supports svn_stream_seek().
+ *
+ * @see svn_stream_seek()
+ * @since New in 1.15.
+ */
+svn_boolean_t
+svn_stream_supports_seek(svn_stream_t *stream);
+
 /** Returns @c TRUE if the generic @a stream supports svn_stream_reset().
  *
  * @see svn_stream_reset()

Modified: subversion/trunk/subversion/libsvn_client/blame.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/blame.c?rev=1925664&r1=1925663&r2=1925664&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/blame.c (original)
+++ subversion/trunk/subversion/libsvn_client/blame.c Sun May 18 11:36:06 2025
@@ -499,8 +499,7 @@ file_rev_handler(void *baton, const char
     SVN_ERR(svn_stream_open_readonly(&delta_baton->source_stream, frb->last_filename,
                                      frb->currpool, pool));
   else
-    /* Means empty stream below. */
-    delta_baton->source_stream = NULL;
+    delta_baton->source_stream = svn_stream_empty(pool);
   last_stream = svn_stream_disown(delta_baton->source_stream, pool);
 
   if (frb->include_merged_revisions && !merged_revision)

Modified: subversion/trunk/subversion/libsvn_subr/stream.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/stream.c?rev=1925664&r1=1925663&r2=1925664&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/stream.c (original)
+++ subversion/trunk/subversion/libsvn_subr/stream.c Sun May 18 11:36:06 2025
@@ -236,11 +236,17 @@ svn_stream_supports_mark(svn_stream_t *s
 }
 
 svn_boolean_t
-svn_stream_supports_reset(svn_stream_t *stream)
+svn_stream_supports_seek(svn_stream_t *stream)
 {
   return stream->seek_fn != NULL;
 }
 
+svn_boolean_t
+svn_stream_supports_reset(svn_stream_t *stream)
+{
+  return svn_stream_supports_seek(stream);
+}
+
 svn_error_t *
 svn_stream_mark(svn_stream_t *stream, svn_stream_mark_t **mark,
                 apr_pool_t *pool)
@@ -658,12 +664,16 @@ svn_stream_t *
 svn_stream_disown(svn_stream_t *stream, apr_pool_t *pool)
 {
   svn_stream_t *s = svn_stream_create(stream, pool);
+  const svn_read_fn_t read_handler =
+    svn_stream_supports_partial_read(stream) ? read_handler_disown : NULL;
 
-  svn_stream_set_read2(s, read_handler_disown, read_full_handler_disown);
+  svn_stream_set_read2(s, read_handler, read_full_handler_disown);
   svn_stream_set_skip(s, skip_handler_disown);
   svn_stream_set_write(s, write_handler_disown);
-  svn_stream_set_mark(s, mark_handler_disown);
-  svn_stream_set_seek(s, seek_handler_disown);
+  if (svn_stream_supports_mark(stream))
+    svn_stream_set_mark(s, mark_handler_disown);
+  if (svn_stream_supports_seek(stream))
+    svn_stream_set_seek(s, seek_handler_disown);
   svn_stream_set_data_available(s, data_available_disown);
   svn_stream_set_readline(s, readline_handler_disown);
 
@@ -1490,6 +1500,8 @@ svn_stream_checksummed2(svn_stream_t *st
 {
   svn_stream_t *s;
   struct checksum_stream_baton *baton;
+  const svn_read_fn_t read_handler =
+    svn_stream_supports_partial_read(stream) ? read_handler_checksum : NULL;
 
   if (read_checksum == NULL && write_checksum == NULL)
     return stream;
@@ -1512,7 +1524,7 @@ svn_stream_checksummed2(svn_stream_t *st
   baton->pool = pool;
 
   s = svn_stream_create(baton, pool);
-  svn_stream_set_read2(s, read_handler_checksum, read_full_handler_checksum);
+  svn_stream_set_read2(s, read_handler, read_full_handler_checksum);
   svn_stream_set_write(s, write_handler_checksum);
   svn_stream_set_data_available(s, data_available_handler_checksum);
   svn_stream_set_close(s, close_handler_checksum);

Modified: subversion/trunk/subversion/libsvn_subr/subst.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/subst.c?rev=1925664&r1=1925663&r2=1925664&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/subst.c (original)
+++ subversion/trunk/subversion/libsvn_subr/subst.c Sun May 18 11:36:06 2025
@@ -1542,10 +1542,9 @@ stream_translated(svn_stream_t *stream,
       svn_stream_set_write(s, translated_stream_write);
       svn_stream_set_close(s, translated_stream_close);
       if (svn_stream_supports_mark(stream))
-        {
-          svn_stream_set_mark(s, translated_stream_mark);
-          svn_stream_set_seek(s, translated_stream_seek);
-        }
+        svn_stream_set_mark(s, translated_stream_mark);
+      if (svn_stream_supports_seek(stream))
+        svn_stream_set_seek(s, translated_stream_seek);
 
       return s;
     }
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.