Author: brane
Date: Fri May 16 22:50:22 2025
New Revision: 1925598
URL: http://svn.apache.org/viewvc?rev=1925598&view=rev
Log:
Convert public functions for handling patches to use streams
instead of APR files.
* subversion/include/svn_client.h: Include svn_io.h for svn_stream_t.
(svn_client_patch_stream): Read the patch from a stream instead of a file.
* subversion/include/svn_diff.h
(svn_diff_patch_parser_create): Likewise, read the patch from a stream.
* subversion/libsvn_client/patch.c: Do not include svn_io.h.
(svn_client_patch): Forward to svn_client_patch_stream() and remove
the parameter checks that are repeated there.
(svn_client_patch_stream): Read the patch from a stream instead of a file.
* subversion/libsvn_diff/parse-diff.c: Include svn_io_private.h (temporary).
(svn_diff_patch_parser_create): Read the patch from a stream, etc.
For now, just unwrap the underlying APR file from the stream.
(svn_patch_file_t): Replace the apr_file member with a stream.
(svn_diff_open_patch_file): Read the patch from a stream, yet again.
(svn_diff_close_patch_file): Close the stream.
* subversion/tests/libsvn_client/client-test.c
(test_patch): Open a stream for svn_client_patch_stream.
Modified:
subversion/branches/patch-from-stream/subversion/include/svn_client.h
subversion/branches/patch-from-stream/subversion/include/svn_diff.h
subversion/branches/patch-from-stream/subversion/libsvn_client/patch.c
subversion/branches/patch-from-stream/subversion/libsvn_diff/parse-diff.c
subversion/branches/patch-from-stream/subversion/tests/libsvn_client/client-test.c
Modified: subversion/branches/patch-from-stream/subversion/include/svn_client.h
URL: http://svn.apache.org/viewvc/subversion/branches/patch-from-stream/subversion/include/svn_client.h?rev=1925598&r1=1925597&r2=1925598&view=diff
==============================================================================
--- subversion/branches/patch-from-stream/subversion/include/svn_client.h (original)
+++ subversion/branches/patch-from-stream/subversion/include/svn_client.h Fri May 16 22:50:22 2025
@@ -39,6 +39,7 @@
#include <apr_file_io.h>
#include <apr_time.h>
+#include "svn_io.h"
#include "svn_types.h"
#include "svn_string.h"
#include "svn_wc.h"
@@ -7773,7 +7774,7 @@ svn_client_patch(const char *patch_abspa
/**
* Similar to svn_client_patch(), but the patch is read from a file handle,
- * described in @a patch_file.
+ * described in @a patch_stream.
*
* In future versions, this function may be used to apply a patch directly
* from an svn_stream_t.
@@ -7781,7 +7782,7 @@ svn_client_patch(const char *patch_abspa
* @since New in 1.15.
*/
svn_error_t *
-svn_client_patch_stream(apr_file_t *patch_file,
+svn_client_patch_stream(svn_stream_t *patch_stream,
const char *wc_dir_abspath,
svn_boolean_t dry_run,
int strip_count,
Modified: subversion/branches/patch-from-stream/subversion/include/svn_diff.h
URL: http://svn.apache.org/viewvc/subversion/branches/patch-from-stream/subversion/include/svn_diff.h?rev=1925598&r1=1925597&r2=1925598&view=diff
==============================================================================
--- subversion/branches/patch-from-stream/subversion/include/svn_diff.h (original)
+++ subversion/branches/patch-from-stream/subversion/include/svn_diff.h Fri May 16 22:50:22 2025
@@ -1385,7 +1385,7 @@ typedef struct svn_diff_patch_parser_t s
* @since New in 1.15
*/
svn_diff_patch_parser_t *
-svn_diff_patch_parser_create(apr_file_t *patch_file,
+svn_diff_patch_parser_create(svn_stream_t *patch_file,
apr_pool_t *result_pool);
/**
Modified: subversion/branches/patch-from-stream/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/branches/patch-from-stream/subversion/libsvn_client/patch.c?rev=1925598&r1=1925597&r2=1925598&view=diff
==============================================================================
--- subversion/branches/patch-from-stream/subversion/libsvn_client/patch.c (original)
+++ subversion/branches/patch-from-stream/subversion/libsvn_client/patch.c Fri May 16 22:50:22 2025
@@ -33,7 +33,6 @@
#include "svn_dirent_uri.h"
#include "svn_diff.h"
#include "svn_hash.h"
-#include "svn_io.h"
#include "svn_path.h"
#include "svn_pools.h"
#include "svn_props.h"
@@ -3735,18 +3734,10 @@ svn_client_patch(const char *patch_abspa
apr_pool_t *scratch_pool)
{
svn_node_kind_t kind;
- apr_file_t *patch_file;
- svn_diff_patch_parser_t *patch_parser;
+ svn_stream_t *patch_stream;
- if (strip_count < 0)
- return svn_error_create(SVN_ERR_INCORRECT_PARAMS, NULL,
- _("strip count must be positive"));
-
- if (svn_path_is_url(wc_dir_abspath))
- return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
- _("'%s' is not a local path"),
- svn_dirent_local_style(wc_dir_abspath,
- scratch_pool));
+ /* NOTE: There are some parameter checks we could do here before opening
+ the file, but they're duplicated in svn_client_patch_stream. */
SVN_ERR(svn_io_check_path(patch_abspath, &kind, scratch_pool));
if (kind == svn_node_none)
@@ -3760,35 +3751,21 @@ svn_client_patch(const char *patch_abspa
svn_dirent_local_style(patch_abspath,
scratch_pool));
- SVN_ERR(svn_io_check_path(wc_dir_abspath, &kind, scratch_pool));
- if (kind == svn_node_none)
- return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
- _("'%s' does not exist"),
- svn_dirent_local_style(wc_dir_abspath,
- scratch_pool));
- if (kind != svn_node_dir)
- return svn_error_createf(SVN_ERR_ILLEGAL_TARGET, NULL,
- _("'%s' is not a directory"),
- svn_dirent_local_style(wc_dir_abspath,
- scratch_pool));
-
- SVN_ERR(svn_io_file_open(&patch_file, patch_abspath, APR_READ | APR_BUFFERED,
- APR_OS_DEFAULT, scratch_pool));
- patch_parser = svn_diff_patch_parser_create(patch_file, scratch_pool);
-
- SVN_WC__CALL_WITH_WRITE_LOCK(
- apply_patches(patch_parser, wc_dir_abspath, dry_run, strip_count,
- reverse, ignore_whitespace, remove_tempfiles,
- patch_func, patch_baton, ctx, scratch_pool),
- ctx->wc_ctx, wc_dir_abspath, FALSE /* lock_anchor */, scratch_pool);
+ SVN_ERR(svn_stream_open_readonly(&patch_stream, patch_abspath,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_client_patch_stream(patch_stream, wc_dir_abspath,
+ dry_run, strip_count, reverse,
+ ignore_whitespace, remove_tempfiles,
+ patch_func, patch_baton, ctx,
+ scratch_pool));
- SVN_ERR(svn_io_file_close(patch_file, scratch_pool));
+ SVN_ERR(svn_stream_close(patch_stream));
return SVN_NO_ERROR;
}
svn_error_t *
-svn_client_patch_stream(apr_file_t *patch_file,
+svn_client_patch_stream(svn_stream_t *patch_stream,
const char *wc_dir_abspath,
svn_boolean_t dry_run,
int strip_count,
@@ -3825,7 +3802,7 @@ svn_client_patch_stream(apr_file_t *patc
svn_dirent_local_style(wc_dir_abspath,
scratch_pool));
- patch_parser = svn_diff_patch_parser_create(patch_file, scratch_pool);
+ patch_parser = svn_diff_patch_parser_create(patch_stream, scratch_pool);
SVN_WC__CALL_WITH_WRITE_LOCK(
apply_patches(patch_parser, wc_dir_abspath, dry_run, strip_count,
Modified: subversion/branches/patch-from-stream/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/patch-from-stream/subversion/libsvn_diff/parse-diff.c?rev=1925598&r1=1925597&r2=1925598&view=diff
==============================================================================
--- subversion/branches/patch-from-stream/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/branches/patch-from-stream/subversion/libsvn_diff/parse-diff.c Fri May 16 22:50:22 2025
@@ -43,6 +43,8 @@
#include "private/svn_diff_private.h"
#include "private/svn_sorts_private.h"
+#include "private/svn_io_private.h" /* FIXME: svn_stream__aprfile */
+
#include "diff.h"
#include "svn_private_config.h"
@@ -2179,13 +2181,19 @@ struct svn_diff_patch_parser_t
};
svn_diff_patch_parser_t *
-svn_diff_patch_parser_create(apr_file_t *patch_file,
+svn_diff_patch_parser_create(svn_stream_t *patch_stream,
apr_pool_t *result_pool)
{
svn_diff_patch_parser_t *result;
+ /* FIXME: Temporary hack on the patch-from-stream branch: Assume that
+ patch_stream was created by svn_stream_open_readonly and it
+ therefore has an underlying apr_file_t, which we'll unwrap.
+ here This is just to make it easier to convert the actual patch
+ parsing code in smaller chunks. */
+
result = apr_palloc(result_pool, sizeof(*result));
- result->apr_file = patch_file;
+ result->apr_file = svn_stream__aprfile(patch_stream); /* FIXME: <-remove */
result->next_patch_offset = 0;
return result;
@@ -2375,26 +2383,26 @@ svn_diff_patch_parser_next(svn_patch_t *
struct svn_patch_file_t
{
/* The APR file handle to the patch file. */
- apr_file_t *apr_file;
+ svn_stream_t *stream;
/* Inner parser for svn_diff_patch_parser_next() */
svn_diff_patch_parser_t *parser;
};
+/* TODO: Revise this function to also take a scratch_pool. */
svn_error_t *
svn_diff_open_patch_file(svn_patch_file_t **patch_file,
const char *local_abspath,
apr_pool_t *result_pool)
{
- svn_patch_file_t *p;
+ svn_patch_file_t *p = apr_palloc(result_pool, sizeof(*p));
+ apr_pool_t *scratch_pool = svn_pool_create(result_pool);
- p = apr_palloc(result_pool, sizeof(*p));
- SVN_ERR(svn_io_file_open(&p->apr_file, local_abspath,
- APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
- result_pool));
-
- p->parser = svn_diff_patch_parser_create(p->apr_file, result_pool);
+ SVN_ERR(svn_stream_open_readonly(&p->stream, local_abspath,
+ result_pool, scratch_pool));
+ p->parser = svn_diff_patch_parser_create(p->stream, result_pool);
+ svn_pool_destroy(scratch_pool);
*patch_file = p;
return SVN_NO_ERROR;
@@ -2417,6 +2425,6 @@ svn_error_t *
svn_diff_close_patch_file(svn_patch_file_t *patch_file,
apr_pool_t *scratch_pool)
{
- return svn_error_trace(svn_io_file_close(patch_file->apr_file,
- scratch_pool));
+ SVN_UNUSED(scratch_pool);
+ return svn_error_trace(svn_stream_close(patch_file->stream));
}
Modified: subversion/branches/patch-from-stream/subversion/tests/libsvn_client/client-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/patch-from-stream/subversion/tests/libsvn_client/client-test.c?rev=1925598&r1=1925597&r2=1925598&view=diff
==============================================================================
--- subversion/branches/patch-from-stream/subversion/tests/libsvn_client/client-test.c (original)
+++ subversion/branches/patch-from-stream/subversion/tests/libsvn_client/client-test.c Fri May 16 22:50:22 2025
@@ -342,6 +342,7 @@ test_patch(const svn_test_opts_t *opts,
svn_opt_revision_t peg_rev;
svn_client_ctx_t *ctx;
apr_file_t *patch_file;
+ svn_stream_t *patch_stream;
struct patch_collection_baton pcb;
const char *patch_file_path;
const char *patched_tempfile_path;
@@ -436,7 +437,9 @@ test_patch(const svn_test_opts_t *opts,
apr_hash_clear(pcb.patched_tempfiles);
apr_hash_clear(pcb.reject_tempfiles);
- SVN_ERR(svn_client_patch_stream(patch_file, wc_path, FALSE, 0, FALSE,
+ patch_stream = svn_stream_from_aprfile2(patch_file, FALSE, pool);
+ SVN_ERR(svn_stream_reset(patch_stream));
+ SVN_ERR(svn_client_patch_stream(patch_stream, wc_path, FALSE, 0, FALSE,
FALSE, FALSE, patch_collection_func, &pcb,
ctx, pool));
@@ -451,7 +454,7 @@ test_patch(const svn_test_opts_t *opts,
SVN_ERR(check_patch_result(reject_tempfile_path, expected_gamma_reject,
APR_EOL_STR, EXPECTED_GAMMA_REJECT_LINES, pool));
- SVN_ERR(svn_io_file_close(patch_file, pool));
+ SVN_ERR(svn_stream_close(patch_stream));
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.