You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2017/07/18 16:01:11 UTC
svn commit: r1802316 - in /subversion/trunk/subversion: include/svn_client.h
libsvn_client/export.c tests/cmdline/export_tests.py
Author: philip
Date: Tue Jul 18 16:01:11 2017
New Revision: 1802316
URL: http://svn.apache.org/viewvc?rev=1802316&view=rev
Log:
Make svn_client_export5 only deal with the repository URL in cases where
a revision is supplied. This resolves an assertion failure if a working
copy path was supplied and there are relative externals.
* subversion/include/svn_client.h
(svn_client_export5): Update documentation to indicate that revision is no
longer only used when exporting from a repository URL.
* subversion/libsvn_client/export.c
(export_file_ev2, export_file, export_directory): Change to only handle URLs
and assert that the supplied from_url parameter is actually a URL.
(svn_client_export5): If exporting a working copy requires a URL, convert
the working copy path to a URL prior to passing it to the export_* functions
mentioned above.
* subversion/tests/cmdline/export_tests.py
(export_revision_with_root_relative_external): Remove XFail tag, and update
the test to check for correct output and export results
Modified:
subversion/trunk/subversion/include/svn_client.h
subversion/trunk/subversion/libsvn_client/export.c
subversion/trunk/subversion/tests/cmdline/export_tests.py
Modified: subversion/trunk/subversion/include/svn_client.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_client.h?rev=1802316&r1=1802315&r2=1802316&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_client.h (original)
+++ subversion/trunk/subversion/include/svn_client.h Tue Jul 18 16:01:11 2017
@@ -6251,8 +6251,7 @@ svn_client_revprop_list(apr_hash_t **pro
* #svn_opt_revision_unspecified, then it defaults to #svn_opt_revision_head
* for URLs or #svn_opt_revision_working for WC targets.
*
- * @a revision is the revision that should be exported, which is only used
- * when exporting from a repository.
+ * @a revision is the revision that should be exported.
*
* @a peg_revision and @a revision must not be @c NULL.
*
Modified: subversion/trunk/subversion/libsvn_client/export.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/export.c?rev=1802316&r1=1802315&r2=1802316&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/export.c (original)
+++ subversion/trunk/subversion/libsvn_client/export.c Tue Jul 18 16:01:11 2017
@@ -1148,7 +1148,7 @@ get_editor_ev2(const svn_delta_editor_t
}
static svn_error_t *
-export_file_ev2(const char *from_path_or_url,
+export_file_ev2(const char *from_url,
const char *to_path,
struct edit_baton *eb,
svn_client__pathrev_t *loc,
@@ -1156,23 +1156,21 @@ export_file_ev2(const char *from_path_or
svn_boolean_t overwrite,
apr_pool_t *scratch_pool)
{
- svn_boolean_t from_is_url = svn_path_is_url(from_path_or_url);
apr_hash_t *props;
svn_stream_t *tmp_stream;
svn_node_kind_t to_kind;
+ SVN_ERR_ASSERT(svn_path_is_url(from_url));
+
if (svn_path_is_empty(to_path))
{
- if (from_is_url)
- to_path = svn_uri_basename(from_path_or_url, scratch_pool);
- else
- to_path = svn_dirent_basename(from_path_or_url, NULL);
+ to_path = svn_uri_basename(from_url, scratch_pool);
eb->root_path = to_path;
}
else
{
- SVN_ERR(append_basename_if_dir(&to_path, from_path_or_url,
- from_is_url, scratch_pool));
+ SVN_ERR(append_basename_if_dir(&to_path, from_url,
+ TRUE, scratch_pool));
eb->root_path = to_path;
}
@@ -1204,7 +1202,7 @@ export_file_ev2(const char *from_path_or
}
static svn_error_t *
-export_file(const char *from_path_or_url,
+export_file(const char *from_url,
const char *to_path,
struct edit_baton *eb,
svn_client__pathrev_t *loc,
@@ -1216,20 +1214,18 @@ export_file(const char *from_path_or_url
apr_hash_index_t *hi;
struct file_baton *fb = apr_pcalloc(scratch_pool, sizeof(*fb));
svn_node_kind_t to_kind;
- svn_boolean_t from_is_url = svn_path_is_url(from_path_or_url);
+
+ SVN_ERR_ASSERT(svn_path_is_url(from_url));
if (svn_path_is_empty(to_path))
{
- if (from_is_url)
- to_path = svn_uri_basename(from_path_or_url, scratch_pool);
- else
- to_path = svn_dirent_basename(from_path_or_url, NULL);
+ to_path = svn_uri_basename(from_url, scratch_pool);
eb->root_path = to_path;
}
else
{
- SVN_ERR(append_basename_if_dir(&to_path, from_path_or_url,
- from_is_url, scratch_pool));
+ SVN_ERR(append_basename_if_dir(&to_path, from_url,
+ TRUE, scratch_pool));
eb->root_path = to_path;
}
@@ -1288,7 +1284,7 @@ export_file(const char *from_path_or_url
}
static svn_error_t *
-export_directory(const char *from_path_or_url,
+export_directory(const char *from_url,
const char *to_path,
struct edit_baton *eb,
svn_client__pathrev_t *loc,
@@ -1307,6 +1303,8 @@ export_directory(const char *from_path_o
void *report_baton;
svn_node_kind_t kind;
+ SVN_ERR_ASSERT(svn_path_is_url(from_url));
+
if (!ENABLE_EV2_IMPL)
SVN_ERR(get_editor_ev1(&export_editor, &edit_baton, eb, ctx,
scratch_pool, scratch_pool));
@@ -1355,7 +1353,7 @@ export_directory(const char *from_path_o
SVN_ERR(svn_dirent_get_absolute(&to_abspath, to_path, scratch_pool));
SVN_ERR(svn_client__export_externals(eb->externals,
- from_path_or_url,
+ from_url,
to_abspath, eb->repos_root_url,
depth, native_eol,
ignore_keywords,
@@ -1402,8 +1400,12 @@ svn_client_export5(svn_revnum_t *result_
svn_client__pathrev_t *loc;
svn_ra_session_t *ra_session;
svn_node_kind_t kind;
+ const char *from_url;
struct edit_baton *eb = apr_pcalloc(pool, sizeof(*eb));
+ SVN_ERR(svn_client_url_from_path2(&from_url, from_path_or_url,
+ ctx, pool, pool));
+
/* Get the RA connection. */
SVN_ERR(svn_client__ra_session_from_path2(&ra_session, &loc,
from_path_or_url, NULL,
@@ -1428,15 +1430,15 @@ svn_client_export5(svn_revnum_t *result_
if (kind == svn_node_file)
{
if (!ENABLE_EV2_IMPL)
- SVN_ERR(export_file(from_path_or_url, to_path, eb, loc, ra_session,
+ SVN_ERR(export_file(from_url, to_path, eb, loc, ra_session,
overwrite, pool));
else
- SVN_ERR(export_file_ev2(from_path_or_url, to_path, eb, loc,
+ SVN_ERR(export_file_ev2(from_url, to_path, eb, loc,
ra_session, overwrite, pool));
}
else if (kind == svn_node_dir)
{
- SVN_ERR(export_directory(from_path_or_url, to_path,
+ SVN_ERR(export_directory(from_url, to_path,
eb, loc, ra_session, overwrite,
ignore_externals, ignore_keywords, depth,
native_eol, ctx, pool));
Modified: subversion/trunk/subversion/tests/cmdline/export_tests.py
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/export_tests.py?rev=1802316&r1=1802315&r2=1802316&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/cmdline/export_tests.py (original)
+++ subversion/trunk/subversion/tests/cmdline/export_tests.py Tue Jul 18 16:01:11 2017
@@ -1070,7 +1070,6 @@ def export_file_externals2(sbox):
expected_output,
expected_disk)
-@XFail()
def export_revision_with_root_relative_external(sbox):
"export a revision with root-relative external"
sbox.build()
@@ -1089,18 +1088,37 @@ def export_revision_with_root_relative_e
# Update the working copy to receive file external
svntest.main.run_svn(None, 'up', wc_dir)
+ # Update the expected disk tree to include the external.
+ expected_disk = svntest.main.greek_state.copy()
+ expected_disk.add({
+ 'A/C/exfile_alpha' : Item("This is the file 'alpha'.\n"),
+ })
+
+ # Update the expected output to include the external.
+ expected_output = svntest.main.greek_state.copy()
+ expected_output.add({
+ 'A/C/exfile_alpha' : Item("This is the file 'alpha'.\r"),
+ })
+ expected_output.desc[''] = Item()
+ expected_output.tweak(contents=None, status='A ')
+
# Export revision 2 from URL
export_target = sbox.add_wc_path('export_url')
- svntest.actions.run_and_verify_svn(None, [],
- 'export', sbox.repo_url, export_target,
- '-r', 2)
+ expected_output.wc_dir = export_target
+ svntest.actions.run_and_verify_export(sbox.repo_url,
+ export_target,
+ expected_output,
+ expected_disk,
+ '-r', 2)
# Export revision 2 from WC
- # Fails (canonicalize: Assertion `*src != '/'' failed)
export_target = sbox.add_wc_path('export_wc')
- svntest.actions.run_and_verify_svn(None, [],
- 'export', sbox.wc_dir, export_target,
- '-r', 2)
+ expected_output.wc_dir = export_target
+ svntest.actions.run_and_verify_export(sbox.wc_dir,
+ export_target,
+ expected_output,
+ expected_disk,
+ '-r', 2)
########################################################################