You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2015/01/24 20:34:05 UTC
svn commit: r1654573 - in /subversion/branches/pin-externals/subversion:
libsvn_client/copy.c tests/cmdline/externals_tests.py
Author: stsp
Date: Sat Jan 24 19:34:05 2015
New Revision: 1654573
URL: http://svn.apache.org/r1654573
Log:
On the pin-externals branch, fix pinning of already pinned externals
which were removed in HEAD.
* subversion/libsvn_client/copy.c
(pin_externals_prop): Don't blindly search externals in the HEAD revision.
If the external definition specifies a peg revision, look there instead
of HEAD.
* subversion/tests/cmdline/externals_tests.py
(copy_pin_externals): Verify the above behaviour by removing 'A/D/H'
from HEAD, which is pointed at by an already pinned external.
Modified:
subversion/branches/pin-externals/subversion/libsvn_client/copy.c
subversion/branches/pin-externals/subversion/tests/cmdline/externals_tests.py
Modified: subversion/branches/pin-externals/subversion/libsvn_client/copy.c
URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/libsvn_client/copy.c?rev=1654573&r1=1654572&r2=1654573&view=diff
==============================================================================
--- subversion/branches/pin-externals/subversion/libsvn_client/copy.c (original)
+++ subversion/branches/pin-externals/subversion/libsvn_client/copy.c Sat Jan 24 19:34:05 2015
@@ -264,10 +264,28 @@ pin_externals_prop(svn_string_t **pinned
iterpool));
SVN_ERR(svn_ra_get_session_url(external_ra_session, &session_url, scratch_pool));
SVN_DBG(("external ra session url: %s", session_url));
- SVN_ERR(svn_ra_get_latest_revnum(external_ra_session,
- &external_youngest_rev,
- iterpool));
+ if (item->peg_revision.kind == svn_opt_revision_unspecified ||
+ item->peg_revision.kind == svn_opt_revision_head)
+ {
+ SVN_ERR(svn_ra_get_latest_revnum(external_ra_session,
+ &external_youngest_rev,
+ iterpool));
+ }
+ else
+ {
+ if (item->peg_revision.kind == svn_opt_revision_date)
+ {
+ item->peg_revision.kind = svn_opt_revision_number;
+ SVN_ERR(svn_ra_get_dated_revision(external_ra_session,
+ &item->peg_revision.value.number,
+ item->peg_revision.value.date,
+ iterpool));
+ }
+ SVN_ERR_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
+ external_youngest_rev = item->peg_revision.value.number;
+ }
+
SVN_ERR(svn_ra_stat(external_ra_session, "",
external_youngest_rev,
&dirent,
@@ -331,15 +349,6 @@ pin_externals_prop(svn_string_t **pinned
iterpool));
}
- if (item->peg_revision.kind == svn_opt_revision_date)
- {
- item->peg_revision.kind = svn_opt_revision_number;
- SVN_ERR(svn_ra_get_dated_revision(external_ra_session,
- &item->peg_revision.value.number,
- item->peg_revision.value.date,
- iterpool));
- }
-
if (item->revision.kind != svn_opt_revision_number)
{
item->revision.kind = svn_opt_revision_number;
@@ -351,6 +360,9 @@ pin_externals_prop(svn_string_t **pinned
item->peg_revision.kind = svn_opt_revision_number;
item->peg_revision.value.number = dirent->created_rev;
}
+
+ SVN_ERR_ASSERT(item->revision.kind == svn_opt_revision_number);
+ SVN_ERR_ASSERT(item->peg_revision.kind == svn_opt_revision_number);
pinned_desc = apr_psprintf(iterpool, "-r%lu %s@%lu %s%s",
item->revision.value.number,
Modified: subversion/branches/pin-externals/subversion/tests/cmdline/externals_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/pin-externals/subversion/tests/cmdline/externals_tests.py?rev=1654573&r1=1654572&r2=1654573&view=diff
==============================================================================
--- subversion/branches/pin-externals/subversion/tests/cmdline/externals_tests.py (original)
+++ subversion/branches/pin-externals/subversion/tests/cmdline/externals_tests.py Sat Jan 24 19:34:05 2015
@@ -3554,6 +3554,7 @@ def copy_pin_externals(sbox):
wc_dir = sbox.wc_dir
repo_url = sbox.repo_url
+ other_repo_url = repo_url + ".other"
# Perform a repos->repos copy, pinning externals
svntest.actions.run_and_verify_svn(None, None, [],
@@ -3565,6 +3566,7 @@ def copy_pin_externals(sbox):
# Verify that externals have been pinned.
last_changed_rev_gamma = 1
+ last_changed_rev_A = 5
A_copy_D_path = 'A_copy/D'
def verify_pinned_externals(base_path_or_url):
expected_output = [
@@ -3595,7 +3597,9 @@ def copy_pin_externals(sbox):
'propget', 'svn:externals',
target)
expected_output = [
- '-r5 %s@5 exdir_A\n' % external_url_for["A/D/exdir_A"],
+ '-r%d %s@%d exdir_A\n' % (last_changed_rev_A,
+ external_url_for["A/D/exdir_A"],
+ last_changed_rev_A),
'-r3 %s@3 exdir_A/G\n' % external_url_for["A/D/exdir_A/G/"],
'-r1 %s@1 exdir_A/H\n' % external_url_for["A/D/exdir_A/H"],
'-r4 %s@4 x/y/z/blah\n' % external_url_for["A/D/x/y/z/blah"],
@@ -3703,6 +3707,25 @@ def copy_pin_externals(sbox):
A_copy_D_path = 'A_copy/D-moved'
verify_pinned_externals(wc_dir)
+ # Clean up.
+ svntest.actions.run_and_verify_svn(None, None, [],
+ 'revert', '-R', wc_dir)
+ svntest.main.safe_rmtree(os.path.join(wc_dir, 'A_copy'))
+
+ # Test an already pinned external which was removed in HEAD.
+ svntest.actions.run_and_verify_svn(None, None, [],
+ 'rm',
+ other_repo_url + '/A/D/H',
+ '-m', 'remove A/D/H')
+ sbox.simple_update()
+ svntest.actions.run_and_verify_svn(None, None, [],
+ 'copy',
+ wc_dir + '/A',
+ wc_dir + '/A_copy',
+ '--pin-externals')
+ last_changed_rev_A = 6
+ verify_pinned_externals(wc_dir)
+
########################################################################
# Run the tests