You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2015/09/12 11:07:10 UTC
svn commit: r1702603 [1/2] - in /subversion/branches/move-tracking-2: ./
build/ contrib/ contrib/hook-scripts/ subversion/
subversion/include/private/ subversion/libsvn_client/
subversion/libsvn_delta/ subversion/libsvn_diff/ subversion/libsvn_fs_fs/
s...
Author: julianfoad
Date: Sat Sep 12 09:07:09 2015
New Revision: 1702603
URL: http://svn.apache.org/r1702603
Log:
On the 'move-tracking-2' branch: catch up to trunk@1702602.
Added:
subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2
- copied unchanged from r1702602, subversion/trunk/subversion/tests/cmdline/upgrade_tests_data/upgrade_1_0_with_externals.tar.bz2
Modified:
subversion/branches/move-tracking-2/ (props changed)
subversion/branches/move-tracking-2/build/ (props changed)
subversion/branches/move-tracking-2/build/run_tests.py
subversion/branches/move-tracking-2/contrib/ (props changed)
subversion/branches/move-tracking-2/contrib/hook-scripts/check-mime-type.pl
subversion/branches/move-tracking-2/subversion/ (props changed)
subversion/branches/move-tracking-2/subversion/include/private/svn_utf_private.h
subversion/branches/move-tracking-2/subversion/libsvn_client/merge.c
subversion/branches/move-tracking-2/subversion/libsvn_client/mtcc.c
subversion/branches/move-tracking-2/subversion/libsvn_client/upgrade.c
subversion/branches/move-tracking-2/subversion/libsvn_delta/xdelta.c
subversion/branches/move-tracking-2/subversion/libsvn_diff/parse-diff.c
subversion/branches/move-tracking-2/subversion/libsvn_fs_fs/transaction.c
subversion/branches/move-tracking-2/subversion/libsvn_fs_x/ (props changed)
subversion/branches/move-tracking-2/subversion/libsvn_fs_x/transaction.c
subversion/branches/move-tracking-2/subversion/libsvn_ra_serf/update.c
subversion/branches/move-tracking-2/subversion/libsvn_ra_svn/marshal.c
subversion/branches/move-tracking-2/subversion/libsvn_repos/rev_hunt.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/cache-membuffer.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/io.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/stream.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/sysinfo.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc.c
subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc/utf8proc.h
subversion/branches/move-tracking-2/subversion/libsvn_wc/adm_crawler.c
subversion/branches/move-tracking-2/subversion/libsvn_wc/entries.c
subversion/branches/move-tracking-2/subversion/libsvn_wc/update_editor.c
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.h
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_pristine.c
subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_util.c
subversion/branches/move-tracking-2/subversion/po/it.po
subversion/branches/move-tracking-2/subversion/svn/lock-cmd.c
subversion/branches/move-tracking-2/subversion/svn/unlock-cmd.c
subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c
subversion/branches/move-tracking-2/subversion/tests/cmdline/authz_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/lock_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/merge_automatic_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/revert_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnfsfs_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/svnmucc_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/svntest/main.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/update_tests.py
subversion/branches/move-tracking-2/subversion/tests/cmdline/upgrade_tests.py
subversion/branches/move-tracking-2/subversion/tests/libsvn_fs/fs-test.c
subversion/branches/move-tracking-2/tools/ (props changed)
subversion/branches/move-tracking-2/tools/client-side/bash_completion
Propchange: subversion/branches/move-tracking-2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Sep 12 09:07:09 2015
@@ -93,4 +93,4 @@
/subversion/branches/verify-at-commit:1462039-1462408
/subversion/branches/verify-keep-going:1439280-1546110
/subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1606692-1701347
+/subversion/trunk:1606692-1702602
Propchange: subversion/branches/move-tracking-2/build/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Sep 12 09:07:09 2015
@@ -82,4 +82,4 @@
/subversion/branches/verify-at-commit/build:1462039-1462408
/subversion/branches/verify-keep-going/build:1439280-1546110
/subversion/branches/wc-collate-path/build:1402685-1480384
-/subversion/trunk/build:1606692-1701347
+/subversion/trunk/build:1606692-1702602
Modified: subversion/branches/move-tracking-2/build/run_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/build/run_tests.py?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/build/run_tests.py (original)
+++ subversion/branches/move-tracking-2/build/run_tests.py Sat Sep 12 09:07:09 2015
@@ -270,11 +270,7 @@ class TestHarness:
svntest.main = sys.modules['svntest.main']
svntest.testcase = sys.modules['svntest.testcase']
- if svntest.main.logger is None:
- import logging
- svntest.main.logger = logging.getLogger()
svntest.main.parse_options(cmdline, optparse.SUPPRESS_USAGE)
-
svntest.testcase.TextColors.disable()
finally:
os.chdir(old_cwd)
Propchange: subversion/branches/move-tracking-2/contrib/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Sep 12 09:07:09 2015
@@ -86,4 +86,4 @@
/subversion/branches/verify-at-commit/contrib:1462039-1462408
/subversion/branches/verify-keep-going/contrib:1439280-1546110
/subversion/branches/wc-collate-path/contrib:1402685-1480384
-/subversion/trunk/contrib:1606692-1660163
+/subversion/trunk/contrib:1606692-1702602
Modified: subversion/branches/move-tracking-2/contrib/hook-scripts/check-mime-type.pl
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/contrib/hook-scripts/check-mime-type.pl?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/contrib/hook-scripts/check-mime-type.pl (original)
+++ subversion/branches/move-tracking-2/contrib/hook-scripts/check-mime-type.pl Sat Sep 12 09:07:09 2015
@@ -119,17 +119,48 @@ foreach my $path ( @files_added )
# Parse the complete list of property values of the file $path to extract
# the mime-type and eol-style
- foreach my $prop (&read_from_process($svnlook, 'proplist', $repos, '-t',
- $txn, '--verbose', '--', $path))
+
+ my @output = &read_from_process($svnlook, 'proplist', $repos, '-t',
+ $txn, '--verbose', '--', $path);
+ my $output_line = 0;
+
+ foreach my $prop (@output)
{
- if ($prop =~ /^\s*svn:mime-type : (\S+)/)
+ if ($prop =~ /^\s*svn:mime-type( : (\S+))?/)
{
- $mime_type = $1;
+ $mime_type = $2;
+ # 1.7.8 (r1416637) onwards changed the format of svnloop proplist --verbose
+ # from propname : propvalue format, to values in an indent list on following lines
+ if (not $mime_type)
+ {
+ if ($output_line + 1 >= scalar(@output))
+ {
+ die "$0: Unexpected EOF reading proplist.\n";
+ }
+ my $next_line_pval_indented = $output[$output_line + 1];
+ if ($next_line_pval_indented =~ /^\s{4}(.*)/)
+ {
+ $mime_type = $1;
+ }
+ }
}
- elsif ($prop =~ /^\s*svn:eol-style : (\S+)/)
+ elsif ($prop =~ /^\s*svn:eol-style( : (\S+))?/)
{
- $eol_style = $1;
+ $eol_style = $2;
+ if (not $eol_style)
+ {
+ if ($output_line + 1 >= scalar(@output))
+ {
+ die "$0: Unexpected EOF reading proplist.\n";
+ }
+ my $next_line_pval_indented = $output[$output_line + 1];
+ if ($next_line_pval_indented =~ /^\s{4}(.*)/)
+ {
+ $eol_style = $1;
+ }
+ }
}
+ $output_line++;
}
# Detect error conditions and add them to @errors
Propchange: subversion/branches/move-tracking-2/subversion/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Sep 12 09:07:09 2015
@@ -82,4 +82,4 @@
/subversion/branches/verify-at-commit/subversion:1462039-1462408
/subversion/branches/verify-keep-going/subversion:1439280-1546110
/subversion/branches/wc-collate-path/subversion:1402685-1480384
-/subversion/trunk/subversion:1606692-1701347
+/subversion/trunk/subversion:1606692-1702602
Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_utf_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_utf_private.h?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_utf_private.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_utf_private.h Sat Sep 12 09:07:09 2015
@@ -206,7 +206,10 @@ svn_utf__glob(svn_boolean_t *match,
/* Return the version of the wrapped utf8proc library. */
const char *
-svn_utf__utf8proc_version(void);
+svn_utf__utf8proc_compiled_version(void);
+
+const char *
+svn_utf__utf8proc_runtime_version(void);
/* Convert an UTF-16 (or UCS-2) string to UTF-8, returning the pointer
* in RESULT. If BIG_ENDIAN is set, then UTF16STR is big-endian;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_client/merge.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_client/merge.c Sat Sep 12 09:07:09 2015
@@ -11636,9 +11636,6 @@ open_reintegrate_source_and_target(svn_r
SVN_ERR(open_target_wc(&target, target_abspath,
FALSE, FALSE, FALSE,
ctx, scratch_pool, scratch_pool));
- SVN_ERR(svn_client_open_ra_session2(target_ra_session_p,
- target->loc.url, target->abspath,
- ctx, result_pool, scratch_pool));
if (! target->loc.url)
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("Can't reintegrate into '%s' because it is "
@@ -11647,6 +11644,10 @@ open_reintegrate_source_and_target(svn_r
svn_dirent_local_style(target->abspath,
scratch_pool));
+ SVN_ERR(svn_client_open_ra_session2(target_ra_session_p,
+ target->loc.url, target->abspath,
+ ctx, result_pool, scratch_pool));
+
SVN_ERR(svn_client__ra_session_from_path2(
source_ra_session_p, &source_loc,
source_path_or_url, NULL, source_peg_revision, source_peg_revision,
@@ -11700,6 +11701,7 @@ merge_reintegrate_locked(conflict_report
if (! source)
{
+ *conflict_report = NULL;
return SVN_NO_ERROR;
}
@@ -12570,12 +12572,19 @@ client_find_automatic_merge(automatic_me
allow_switched_subtrees,
ctx, result_pool, scratch_pool));
+ if (!s_t->target->loc.url)
+ return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
+ _("Can't perform automatic merge into '%s' "
+ "because it is locally added and therefore "
+ "not related to the merge source"),
+ svn_dirent_local_style(target_abspath,
+ scratch_pool));
+
/* Open RA sessions to the source and target trees. */
SVN_ERR(svn_client_open_ra_session2(&s_t->target_ra_session,
s_t->target->loc.url,
s_t->target->abspath,
ctx, result_pool, scratch_pool));
- /* ### check for null URL (i.e. added path) here, like in reintegrate? */
SVN_ERR(svn_client__ra_session_from_path2(
&s_t->source_ra_session, &s_t->source,
source_path_or_url, NULL, source_revision, source_revision,
Modified: subversion/branches/move-tracking-2/subversion/libsvn_client/mtcc.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_client/mtcc.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_client/mtcc.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_client/mtcc.c Sat Sep 12 09:07:09 2015
@@ -976,19 +976,19 @@ svn_client__mtcc_check_path(svn_node_kin
if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
op->performed_stat = TRUE;
else if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
- return svn_error_createf(SVN_ERR_FS_NOT_DIRECTORY, NULL,
- _("Can't perform directory operation "
- "on '%s' as it is not a directory"),
+ return svn_error_createf(SVN_ERR_FS_NOT_FILE, NULL,
+ _("Can't perform file operation "
+ "on '%s' as it is not a file"),
relpath);
}
- else if (op && *kind == svn_node_dir)
+ else if (op && *kind == svn_node_file)
{
if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
op->performed_stat = TRUE;
else if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
- return svn_error_createf(SVN_ERR_FS_NOT_FILE, NULL,
- _("Can't perform file operation "
- "on '%s' as it is not a file"),
+ return svn_error_createf(SVN_ERR_FS_NOT_DIRECTORY, NULL,
+ _("Can't perform directory operation "
+ "on '%s' as it is not a directory"),
relpath);
}
else if (op && (op->kind == OP_OPEN_DIR || op->kind == OP_OPEN_FILE))
Modified: subversion/branches/move-tracking-2/subversion/libsvn_client/upgrade.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_client/upgrade.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_client/upgrade.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_client/upgrade.c Sat Sep 12 09:07:09 2015
@@ -83,11 +83,13 @@ fetch_repos_info(const char **repos_root
}
/* Forward definition. Upgrades svn:externals properties in the working copy
- LOCAL_ABSPATH to the WC-NG storage.
+ LOCAL_ABSPATH to the WC-NG storage. INFO_BATON will be used to fetch
+ repository info using fetch_repos_info() function if needed.
*/
static svn_error_t *
upgrade_externals_from_properties(svn_client_ctx_t *ctx,
const char *local_abspath,
+ struct repos_info_baton *info_baton,
apr_pool_t *scratch_pool);
svn_error_t *
@@ -172,7 +174,7 @@ svn_client_upgrade(const char *path,
(There is no way to detect the difference from libsvn_client :( ) */
SVN_ERR(upgrade_externals_from_properties(ctx, local_abspath,
- scratch_pool));
+ &info_baton, scratch_pool));
}
return SVN_NO_ERROR;
}
@@ -180,6 +182,7 @@ svn_client_upgrade(const char *path,
static svn_error_t *
upgrade_externals_from_properties(svn_client_ctx_t *ctx,
const char *local_abspath,
+ struct repos_info_baton *info_baton,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
@@ -187,7 +190,6 @@ upgrade_externals_from_properties(svn_cl
apr_pool_t *iterpool2;
apr_hash_t *externals;
svn_opt_revision_t rev = {svn_opt_revision_unspecified, {0}};
- struct repos_info_baton info_baton;
/* Now it's time to upgrade the externals too. We do it after the wc
upgrade to avoid that errors in the externals causes the wc upgrade to
@@ -345,7 +347,7 @@ upgrade_externals_from_properties(svn_cl
{
err = fetch_repos_info(&repos_root_url,
&repos_uuid,
- &info_baton,
+ info_baton,
resolved_url,
scratch_pool, scratch_pool);
if (err)
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/xdelta.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/xdelta.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/xdelta.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/xdelta.c Sat Sep 12 09:07:09 2015
@@ -111,7 +111,7 @@ struct block
apr_uint32_t adlersum;
/* Even in 64 bit systems, store only 32 bit offsets in our hash table
- (our delta window size much much smaller then 4GB).
+ (our delta window size much much smaller than 4GB).
That reduces the hash table size by 50% from 32to 16KB
and makes it easier to fit into the CPU's L1 cache. */
apr_uint32_t pos; /* NO_POSITION -> block is not used */
Modified: subversion/branches/move-tracking-2/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_diff/parse-diff.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_diff/parse-diff.c Sat Sep 12 09:07:09 2015
@@ -919,7 +919,7 @@ enum parse_state
{
state_start, /* initial */
state_git_diff_seen, /* diff --git */
- state_git_tree_seen, /* a tree operation, rather then content change */
+ state_git_tree_seen, /* a tree operation, rather than content change */
state_git_minus_seen, /* --- /dev/null; or --- a/ */
state_git_plus_seen, /* +++ /dev/null; or +++ a/ */
state_move_from_seen, /* rename from foo.c */
Modified: subversion/branches/move-tracking-2/subversion/libsvn_fs_fs/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_fs_fs/transaction.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_fs_fs/transaction.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_fs_fs/transaction.c Sat Sep 12 09:07:09 2015
@@ -2836,7 +2836,7 @@ validate_root_noderev(svn_fs_t *fs,
Normally (rev == root_noderev->predecessor_count), but here we
use a more roundabout check that should only trigger on new instances
- of the corruption, rather then trigger on each and every new commit
+ of the corruption, rather than trigger on each and every new commit
to a repository that has triggered the bug somewhere in its root
noderev's history.
*/
Propchange: subversion/branches/move-tracking-2/subversion/libsvn_fs_x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Sep 12 09:07:09 2015
@@ -93,4 +93,4 @@
/subversion/branches/verify-keep-going/subversion/libsvn_fs_x:1439280-1492639,1546002-1546110
/subversion/branches/wc-collate-path/subversion/libsvn_fs_x:1402685-1480384
/subversion/trunk/subversion/libsvn_fs_fs:1415133-1596500,1596567,1597414,1597989,1598273,1599140,1600872,1601633,1603485-1603487,1603499,1603605,1604128,1604188,1604413-1604414,1604416-1604417,1604421,1604442,1604700,1604717,1604720,1604726,1604755,1604794,1604802,1604824,1604836,1604844,1604902-1604903,1604911,1604925,1604933,1604947,1605059-1605060,1605064-1605065,1605068,1605071-1605073,1605075,1605123,1605188-1605189,1605191,1605197,1605444,1605633,1606132,1606142,1606144,1606514,1606526,1606528,1606551,1606554,1606564,1606598-1606599,1606656,1606658,1606662,1606744,1606840,1607085,1607572,1612407,1612810,1613339,1613872,1614611,1615348,1615351-1615352,1615356,1616338-1616339,1616613,1617586,1617688,1618138,1618151,1618153,1618226,1618641,1618653,1618662,1619068,1619358,1619413,1619769,1619774,1620602,1620909,1620912,1620928,1620930,1621275,1621635,1622931,1622937,1622942,1622946,1622959-1622960,1622963,1622987,1623007,1623368,1623373,1623377,1623379,1623381,1623398,1623402,162
4011,1624265,1624512,1626246,1626871,1626873,1626886,1627497-1627498,1627502,1627947-1627949,1627966,1628083,1628093,1628158-1628159,1628161,1628392-1628393,1628415,1628427,1628676,1628738,1628762,1628764,1629854-1629855,1629857,1629865,1629873,1629875,1629879,1630067,1630070,1631049-1631051,1631075,1631115,1631171,1631180,1631185-1631186,1631196-1631197,1631239-1631240,1631548,1631550,1631563,1631567,1631588,1631598,1632646,1632776,1632849,1632851-1632853,1632856-1632857,1632868,1632908,1632926,1633232,1633617-1633618,1634872,1634875,1634879-1634880,1634920,1636478,1636483,1636629,1636644,1637184,1637186,1637330,1637358,1637363,1637393,1639319,1639322,1639335,1639348,1639352,1639355,1639358,1639414,1639419,1639426,1639430,1639436,1639440,1639549,1640061-1640062,1640197,1640915,1640966,1641013,1643139,1643233,1645567,1646021,1646712,1646716,1647537,1647540-1647541,1647820,1647905,1648230,1648238,1648241-1648243,1648253,1648272,1648532,1648537-1648539,1648542,1648591,1648612,1653608,
1658482
-/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1606692-1701347
+/subversion/trunk/subversion/libsvn_fs_x:1414756-1509914,1606692-1702602
Modified: subversion/branches/move-tracking-2/subversion/libsvn_fs_x/transaction.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_fs_x/transaction.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_fs_x/transaction.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_fs_x/transaction.c Sat Sep 12 09:07:09 2015
@@ -2839,7 +2839,7 @@ validate_root_noderev(svn_fs_t *fs,
Normally (rev == root_noderev->predecessor_count), but here we
use a more roundabout check that should only trigger on new instances
- of the corruption, rather then trigger on each and every new commit
+ of the corruption, rather than trigger on each and every new commit
to a repository that has triggered the bug somewhere in its root
noderev's history.
*/
Modified: subversion/branches/move-tracking-2/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_ra_serf/update.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_ra_serf/update.c Sat Sep 12 09:07:09 2015
@@ -1129,7 +1129,15 @@ handle_fetch(serf_request_t *request,
/* Validate the delta base claimed by the server matches
what we asked for! */
val = serf_bucket_headers_get(hdrs, SVN_DAV_DELTA_BASE_HEADER);
- if (val && (strcmp(val, fetch_ctx->delta_base) != 0))
+ if (val && fetch_ctx->delta_base == NULL)
+ {
+ /* We recieved response with delta base header while we didn't
+ requested it -- report it as error. */
+ return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
+ _("GET request returned unexpected "
+ "delta base: %s"), val);
+ }
+ else if (val && (strcmp(val, fetch_ctx->delta_base) != 0))
{
return svn_error_createf(SVN_ERR_RA_DAV_REQUEST_FAILED, NULL,
_("GET request returned unexpected "
Modified: subversion/branches/move-tracking-2/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_ra_svn/marshal.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_ra_svn/marshal.c Sat Sep 12 09:07:09 2015
@@ -1294,8 +1294,18 @@ static svn_error_t *read_item(svn_ra_svn
}
else if (c == '(')
{
- /* Allow for up to 4 items in this list without re-allocation. */
- svn_ra_svn__item_t stack_items[4];
+ /* The largest struct that the protocol currently defines has 10
+ * elements (log-entry) and add some headroom for future extensions.
+ * At a maximum nesting level of 64 this use <= 18kB of stack.
+ *
+ * All system-defined data structures will fit into this and will be
+ * copied into ITEM after a single apr_palloc with no over-provision.
+ * Unbounded lists with more than 12 but less than 25 entries will
+ * also see only a single allocation from POOL. However, there will
+ * be some over-provision. Longer lists will see log N resizes and
+ * O(N) total cost.
+ */
+ svn_ra_svn__item_t stack_items[12];
svn_ra_svn__item_t *items = stack_items;
int capacity = sizeof(stack_items) / sizeof(stack_items[0]);
int count = 0;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_repos/rev_hunt.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_repos/rev_hunt.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_repos/rev_hunt.c Sat Sep 12 09:07:09 2015
@@ -44,7 +44,7 @@
/* Note: this binary search assumes that the datestamp properties on
each revision are in chronological order. That is if revision A >
- revision B, then A's datestamp is younger then B's datestamp.
+ revision B, then A's datestamp is younger than B's datestamp.
If someone comes along and sets a bogus datestamp, this routine
might not work right.
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/cache-membuffer.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/cache-membuffer.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/cache-membuffer.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/cache-membuffer.c Sat Sep 12 09:07:09 2015
@@ -1963,7 +1963,7 @@ svn_cache__membuffer_cache_create(svn_me
: data_size / 8;
/* to keep the entries small, we use 32 bit indexes only
- * -> we need to ensure that no more then 4G entries exist.
+ * -> we need to ensure that no more than 4G entries exist.
*
* Note, that this limit could only be exceeded in a very
* theoretical setup with about 1EB of cache.
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/io.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/io.c Sat Sep 12 09:07:09 2015
@@ -578,10 +578,8 @@ svn_io_open_uniquely_named(apr_file_t **
continue;
#ifdef WIN32
- apr_err_2 = APR_TO_OS_ERROR(apr_err);
-
- if (apr_err_2 == ERROR_ACCESS_DENIED ||
- apr_err_2 == ERROR_SHARING_VIOLATION)
+ if (apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED) ||
+ apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION))
{
/* The file is in use by another process or is hidden;
create a new name, but don't do this 99999 times in
@@ -2065,11 +2063,21 @@ svn_io__win_rename_open_file(apr_file_t
rename_size);
}
- WIN32_RETRY_LOOP(status,
- win32_set_file_information_by_handle(hFile,
- FileRenameInfo,
- rename_info,
- rename_size));
+ /* Windows returns Vista+ client accessing network share stored on Windows
+ Server 2003 returns ERROR_ACCESS_DENIED. The same happens when Vista+
+ client access Windows Server 2008 with disabled SMBv2 protocol.
+
+ So return SVN_ERR_UNSUPPORTED_FEATURE in this case like we do when
+ SetFileInformationByHandle() is not available and let caller to
+ handle it.
+
+ See "Access denied error on checkout-commit after updating to 1.9.X"
+ discussion on dev@s.a.o:
+ http://svn.haxx.se/dev/archive-2015-09/0054.shtml */
+ if (status == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED))
+ {
+ status = SVN_ERR_UNSUPPORTED_FEATURE;
+ }
if (status)
{
@@ -2264,7 +2272,6 @@ svn_io_is_file_executable(svn_boolean_t
/*** File locking. ***/
-#if !defined(WIN32) && !defined(__OS2__)
/* Clear all outstanding locks on ARG, an open apr_file_t *. */
static apr_status_t
file_clear_locks(void *arg)
@@ -2279,7 +2286,6 @@ file_clear_locks(void *arg)
return 0;
}
-#endif
svn_error_t *
svn_io_lock_open_file(apr_file_t *lockfile_handle,
@@ -2337,13 +2343,14 @@ svn_io_lock_open_file(apr_file_t *lockfi
}
}
-/* On Windows and OS/2 file locks are automatically released when
- the file handle closes */
-#if !defined(WIN32) && !defined(__OS2__)
+ /* On Windows, a process may not release file locks before closing the
+ handle, and in this case the outstanding locks are unlocked by the OS.
+ However, this is not recommended, because the actual unlocking may be
+ postponed depending on available system resources. We explicitly unlock
+ the file as a part of the pool cleanup handler. */
apr_pool_cleanup_register(pool, lockfile_handle,
file_clear_locks,
apr_pool_cleanup_null);
-#endif
return SVN_NO_ERROR;
}
@@ -2367,11 +2374,7 @@ svn_io_unlock_open_file(apr_file_t *lock
return svn_error_wrap_apr(apr_err, _("Can't unlock file '%s'"),
try_utf8_from_internal_style(fname, pool));
-/* On Windows and OS/2 file locks are automatically released when
- the file handle closes */
-#if !defined(WIN32) && !defined(__OS2__)
apr_pool_cleanup_kill(pool, lockfile_handle, file_clear_locks);
-#endif
return SVN_NO_ERROR;
}
@@ -4432,8 +4435,8 @@ svn_io_dir_remove_nonrecursive(const cha
{
svn_boolean_t retry = TRUE;
- if (APR_TO_OS_ERROR(status) == ERROR_DIR_NOT_EMPTY)
- {
+ if (status == APR_FROM_OS_ERROR(ERROR_DIR_NOT_EMPTY))
+ {
apr_status_t empty_status = dir_is_empty(dirname_apr, pool);
if (APR_STATUS_IS_ENOTEMPTY(empty_status))
@@ -5109,7 +5112,7 @@ temp_file_create(apr_file_t **new_file,
/* Generate a number that should be unique for this application and
usually for the entire computer to reduce the number of cycles
- through this loop. (A bit of calculation is much cheaper then
+ through this loop. (A bit of calculation is much cheaper than
disk io) */
unique_nr = baseNr + 3 * i;
@@ -5140,10 +5143,8 @@ temp_file_create(apr_file_t **new_file,
if (!apr_err_2 && finfo.filetype == APR_DIR)
continue;
- apr_err_2 = APR_TO_OS_ERROR(apr_err);
-
- if (apr_err_2 == ERROR_ACCESS_DENIED ||
- apr_err_2 == ERROR_SHARING_VIOLATION)
+ if (apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED) ||
+ apr_err == APR_FROM_OS_ERROR(ERROR_SHARING_VIOLATION))
{
/* The file is in use by another process or is hidden;
create a new name, but don't do this 99999 times in
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/stream.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/stream.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/stream.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/stream.c Sat Sep 12 09:07:09 2015
@@ -200,6 +200,9 @@ svn_stream_skip(svn_stream_t *stream, ap
{
svn_read_fn_t read_fn = stream->read_full_fn ? stream->read_full_fn
: stream->read_fn;
+ if (read_fn == NULL)
+ return svn_error_create(SVN_ERR_STREAM_NOT_SUPPORTED, NULL, NULL);
+
return svn_error_trace(skip_default_handler(stream->baton, len,
read_fn));
}
@@ -1055,10 +1058,12 @@ svn_stream_open_unique(svn_stream_t **st
}
-svn_stream_t *
-svn_stream_from_aprfile2(apr_file_t *file,
- svn_boolean_t disown,
- apr_pool_t *pool)
+/* Helper function that creates a stream from an APR file. */
+static svn_stream_t *
+make_stream_from_apr_file(apr_file_t *file,
+ svn_boolean_t disown,
+ svn_boolean_t supports_seek,
+ apr_pool_t *pool)
{
struct baton_apr *baton;
svn_stream_t *stream;
@@ -1072,9 +1077,14 @@ svn_stream_from_aprfile2(apr_file_t *fil
stream = svn_stream_create(baton, pool);
svn_stream_set_read2(stream, read_handler_apr, read_full_handler_apr);
svn_stream_set_write(stream, write_handler_apr);
- svn_stream_set_skip(stream, skip_handler_apr);
- svn_stream_set_mark(stream, mark_handler_apr);
- svn_stream_set_seek(stream, seek_handler_apr);
+
+ if (supports_seek)
+ {
+ svn_stream_set_skip(stream, skip_handler_apr);
+ svn_stream_set_mark(stream, mark_handler_apr);
+ svn_stream_set_seek(stream, seek_handler_apr);
+ }
+
svn_stream_set_data_available(stream, data_available_handler_apr);
svn_stream__set_is_buffered(stream, is_buffered_handler_apr);
stream->file = file;
@@ -1085,6 +1095,14 @@ svn_stream_from_aprfile2(apr_file_t *fil
return stream;
}
+svn_stream_t *
+svn_stream_from_aprfile2(apr_file_t *file,
+ svn_boolean_t disown,
+ apr_pool_t *pool)
+{
+ return make_stream_from_apr_file(file, disown, TRUE, pool);
+}
+
apr_file_t *
svn_stream__aprfile(svn_stream_t *stream)
{
@@ -1829,7 +1847,11 @@ svn_stream_for_stdin(svn_stream_t **in,
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stdin");
- *in = svn_stream_from_aprfile2(stdin_file, TRUE, pool);
+ /* STDIN may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *in = make_stream_from_apr_file(stdin_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -1845,7 +1867,11 @@ svn_stream_for_stdout(svn_stream_t **out
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stdout");
- *out = svn_stream_from_aprfile2(stdout_file, TRUE, pool);
+ /* STDOUT may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *out = make_stream_from_apr_file(stdout_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -1861,7 +1887,11 @@ svn_stream_for_stderr(svn_stream_t **err
if (apr_err)
return svn_error_wrap_apr(apr_err, "Can't open stderr");
- *err = svn_stream_from_aprfile2(stderr_file, TRUE, pool);
+ /* STDERR may or may not support positioning requests, but generally
+ it does not, or the behavior is implementation-specific. Hence,
+ we cannot safely advertise mark(), seek() and non-default skip()
+ support. */
+ *err = make_stream_from_apr_file(stderr_file, TRUE, FALSE, pool);
return SVN_NO_ERROR;
}
@@ -2181,6 +2211,8 @@ create_tempfile(HANDLE *hFile,
return SVN_NO_ERROR;
}
+#endif /* WIN32 */
+
/* Implements svn_close_fn_t */
static svn_error_t *
install_close(void *baton)
@@ -2193,8 +2225,6 @@ install_close(void *baton)
return SVN_NO_ERROR;
}
-#endif /* WIN32 */
-
svn_error_t *
svn_stream__create_for_install(svn_stream_t **install_stream,
const char *tmp_abspath,
@@ -2217,8 +2247,8 @@ svn_stream__create_for_install(svn_strea
/* Wrap as a standard APR file to allow sharing implementation.
But do note that some file functions (such as retrieving the name)
- don't work on this wrapper. */
- /* ### Buffered, or not? */
+ don't work on this wrapper.
+ Use buffered mode to match svn_io_open_unique_file3() behavior. */
status = apr_os_file_put(&file, &hInstall,
APR_WRITE | APR_BINARY | APR_BUFFERED,
result_pool);
@@ -2249,12 +2279,8 @@ svn_stream__create_for_install(svn_strea
ib->tmp_path = tmp_path;
-#ifdef WIN32
/* Don't close the file on stream close; flush instead */
svn_stream_set_close(*install_stream, install_close);
-#else
- /* ### Install pool cleanup handler for tempfile? */
-#endif
return SVN_NO_ERROR;
}
@@ -2299,8 +2325,6 @@ svn_stream__install_stream(svn_stream_t
svn_io_file_rename2(). */
svn_error_clear(err);
err = SVN_NO_ERROR;
-
- SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
}
else
{
@@ -2310,6 +2334,9 @@ svn_stream__install_stream(svn_stream_t
}
#endif
+ /* Close temporary file. */
+ SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+
err = svn_io_file_rename2(ib->tmp_path, final_abspath, FALSE, scratch_pool);
/* A missing directory is too common to not cover here. */
@@ -2343,19 +2370,12 @@ svn_stream__install_get_info(apr_finfo_t
apr_pool_t *scratch_pool)
{
struct install_baton_t *ib = install_stream->baton;
-
-#ifdef WIN32
- /* On WIN32 the file is still open, so we can obtain the information
- from the handle without race conditions */
apr_status_t status;
status = apr_file_info_get(finfo, wanted, ib->baton_apr.file);
if (status)
return svn_error_wrap_apr(status, NULL);
-#else
- SVN_ERR(svn_io_stat(finfo, ib->tmp_path, wanted, scratch_pool));
-#endif
return SVN_NO_ERROR;
}
@@ -2382,9 +2402,10 @@ svn_stream__install_delete(svn_stream_t
/* Deleting file on close may be unsupported, so ignore errors and
fallback to svn_io_remove_file2(). */
svn_error_clear(err);
- SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
#endif
+ SVN_ERR(svn_io_file_close(ib->baton_apr.file, scratch_pool));
+
return svn_error_trace(svn_io_remove_file2(ib->tmp_path, FALSE,
scratch_pool));
}
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/sysinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/sysinfo.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/sysinfo.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/sysinfo.c Sat Sep 12 09:07:09 2015
@@ -46,6 +46,7 @@
#include "private/svn_sqlite.h"
#include "private/svn_subr_private.h"
+#include "private/svn_utf_private.h"
#include "sysinfo.h"
#include "svn_private_config.h"
@@ -126,7 +127,7 @@ const apr_array_header_t *
svn_sysinfo__linked_libs(apr_pool_t *pool)
{
svn_version_ext_linked_lib_t *lib;
- apr_array_header_t *array = apr_array_make(pool, 5, sizeof(*lib));
+ apr_array_header_t *array = apr_array_make(pool, 6, sizeof(*lib));
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "APR";
@@ -157,6 +158,11 @@ svn_sysinfo__linked_libs(apr_pool_t *poo
#endif
lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
+ lib->name = "Utf8proc";
+ lib->compiled_version = apr_pstrdup(pool, svn_utf__utf8proc_compiled_version());
+ lib->runtime_version = apr_pstrdup(pool, svn_utf__utf8proc_runtime_version());
+
+ lib = &APR_ARRAY_PUSH(array, svn_version_ext_linked_lib_t);
lib->name = "ZLib";
lib->compiled_version = apr_pstrdup(pool, svn_zlib__compiled_version());
lib->runtime_version = apr_pstrdup(pool, svn_zlib__runtime_version());
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc.c Sat Sep 12 09:07:09 2015
@@ -37,7 +37,19 @@
#undef strlen
-const char *svn_utf__utf8proc_version(void)
+
+const char *
+svn_utf__utf8proc_compiled_version(void)
+{
+ static const char utf8proc_version[] =
+ APR_STRINGIFY(UTF8PROC_VERSION_MAJOR) "."
+ APR_STRINGIFY(UTF8PROC_VERSION_MINOR) "."
+ APR_STRINGIFY(UTF8PROC_VERSION_PATCH);
+ return utf8proc_version;
+}
+
+const char *
+svn_utf__utf8proc_runtime_version(void)
{
/* Unused static function warning removal hack. */
SVN_UNUSED(utf8proc_NFD);
Modified: subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc/utf8proc.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc/utf8proc.h?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc/utf8proc.h (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_subr/utf8proc/utf8proc.h Sat Sep 12 09:07:09 2015
@@ -51,6 +51,27 @@
#ifndef UTF8PROC_H
#define UTF8PROC_H
+/** @name API version
+ *
+ * The utf8proc API version MAJOR.MINOR.PATCH, following
+ * semantic-versioning rules (http://semver.org) based on API
+ * compatibility.
+ *
+ * This is also returned at runtime by @ref utf8proc_version; however, the
+ * runtime version may append a string like "-dev" to the version number
+ * for prerelease versions.
+ *
+ * @note The shared-library version number in the Makefile may be different,
+ * being based on ABI compatibility rather than API compatibility.
+ */
+/** @{ */
+/** The MAJOR version number (increased when backwards API compatibility is broken). */
+#define UTF8PROC_VERSION_MAJOR 1
+/** The MINOR version number (increased when new functionality is added in a backwards-compatible manner). */
+#define UTF8PROC_VERSION_MINOR 1
+/** The PATCH version (increased for fixes that do not change the API). */
+#define UTF8PROC_VERSION_PATCH 5
+/** @} */
/*
* Define UTF8PROC_INLINE and include utf8proc.c to embed a static
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/adm_crawler.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/adm_crawler.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/adm_crawler.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/adm_crawler.c Sat Sep 12 09:07:09 2015
@@ -1016,6 +1016,7 @@ svn_wc__internal_transmit_text_deltas(co
svn_checksum_t *local_sha1_checksum; /* calc'd SHA1 of LOCAL_STREAM */
svn_wc__db_install_data_t *install_data = NULL;
svn_error_t *err;
+ svn_error_t *err2;
svn_stream_t *base_stream; /* delta source */
svn_stream_t *local_stream; /* delta target: LOCAL_ABSPATH transl. to NF */
@@ -1112,7 +1113,15 @@ svn_wc__internal_transmit_text_deltas(co
scratch_pool, scratch_pool);
/* Close the two streams to force writing the digest */
- err = svn_error_compose_create(err, svn_stream_close(base_stream));
+ err2 = svn_stream_close(base_stream);
+ if (err2)
+ {
+ /* Set verify_checksum to NULL if svn_stream_close() returns error
+ because checksum will be uninitialized in this case. */
+ verify_checksum = NULL;
+ err = svn_error_compose_create(err, err2);
+ }
+
err = svn_error_compose_create(err, svn_stream_close(local_stream));
/* If we have an error, it may be caused by a corrupt text base,
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/entries.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/entries.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/entries.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/entries.c Sat Sep 12 09:07:09 2015
@@ -1800,7 +1800,7 @@ write_entry(struct write_baton **entry_n
normal replace+copied base base+work
add+copied replace+copied work work+work
- although obviously the node is a directory rather then a file.
+ although obviously the node is a directory rather than a file.
There are then more conversion states where the parent is
replaced.
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/update_editor.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/update_editor.c Sat Sep 12 09:07:09 2015
@@ -1863,13 +1863,14 @@ add_directory(const char *path,
SVN_ERR_ASSERT(! (copyfrom_path || SVN_IS_VALID_REVNUM(copyfrom_rev)));
SVN_ERR(make_dir_baton(&db, path, eb, pb, TRUE, pool));
- SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
- NULL, eb, pb, db->pool, scratch_pool));
*child_baton = db;
if (db->skip_this)
return SVN_NO_ERROR;
+ SVN_ERR(calculate_repos_relpath(&db->new_repos_relpath, db->local_abspath,
+ NULL, eb, pb, db->pool, scratch_pool));
+
SVN_ERR(mark_directory_edited(db, pool));
if (strcmp(eb->target_abspath, db->local_abspath) == 0)
@@ -3066,13 +3067,13 @@ add_file(const char *path,
SVN_ERR_ASSERT(! (copyfrom_path || SVN_IS_VALID_REVNUM(copyfrom_rev)));
SVN_ERR(make_file_baton(&fb, pb, path, TRUE, pool));
- SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
- NULL, eb, pb, fb->pool, pool));
*file_baton = fb;
if (fb->skip_this)
return SVN_NO_ERROR;
+ SVN_ERR(calculate_repos_relpath(&fb->new_repos_relpath, fb->local_abspath,
+ NULL, eb, pb, fb->pool, pool));
SVN_ERR(mark_file_edited(fb, pool));
/* The file_pool can stick around for a *long* time, so we want to
@@ -3551,15 +3552,23 @@ lazy_open_target(svn_stream_t **stream,
apr_pool_t *scratch_pool)
{
struct handler_baton *hb = baton;
+ svn_wc__db_install_data_t *install_data;
+ /* By convention return value is undefined on error, but we rely
+ on HB->INSTALL_DATA value in window_handler() and abort
+ INSTALL_STREAM if is not NULL on error.
+ So we store INSTALL_DATA to local variable first, to leave
+ HB->INSTALL_DATA unchanged on error. */
SVN_ERR(svn_wc__db_pristine_prepare_install(stream,
- &hb->install_data,
+ &install_data,
&hb->new_text_base_sha1_checksum,
NULL,
hb->fb->edit_baton->db,
hb->fb->dir_baton->local_abspath,
result_pool, scratch_pool));
+ hb->install_data = install_data;
+
return SVN_NO_ERROR;
}
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.c Sat Sep 12 09:07:09 2015
@@ -6698,8 +6698,14 @@ svn_wc__db_op_mark_resolved_internal(svn
conflict_data = svn_sqlite__column_blob(stmt, 2, &conflict_len,
scratch_pool);
- conflicts = svn_skel__parse(conflict_data, conflict_len, scratch_pool);
SVN_ERR(svn_sqlite__reset(stmt));
+ SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
+
+ if (!conflict_data)
+ return SVN_NO_ERROR;
+
+ conflicts = svn_skel__parse(conflict_data, conflict_len, scratch_pool);
+
SVN_ERR(svn_wc__conflict_skel_resolve(&resolved_all, conflicts,
db, wcroot->abspath,
@@ -6731,8 +6737,6 @@ svn_wc__db_op_mark_resolved_internal(svn
SVN_ERR(svn_sqlite__step_done(stmt));
}
- SVN_ERR(add_work_items(wcroot->sdb, work_items, scratch_pool));
-
return SVN_NO_ERROR;
}
@@ -6799,6 +6803,75 @@ clear_moved_to(svn_wc__db_wcroot_t *wcro
return SVN_NO_ERROR;
}
+/* Helper function for op_revert_txn. Raises move tree conflicts on
+ descendants to ensure database stability on a non recursive revert
+ of an ancestor that contains a possible move related tree conflict.
+ */
+static svn_error_t *
+revert_maybe_raise_moved_away(svn_wc__db_wcroot_t * wcroot,
+ svn_wc__db_t *db,
+ const char *local_relpath,
+ int op_depth_below,
+ apr_pool_t *scratch_pool)
+{
+ svn_skel_t *conflict;
+ svn_wc_operation_t operation;
+ svn_boolean_t tree_conflicted;
+ const apr_array_header_t *locations;
+ svn_wc_conflict_reason_t reason;
+ svn_wc_conflict_action_t action;
+
+ SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, NULL, NULL, wcroot,
+ local_relpath,
+ scratch_pool, scratch_pool));
+
+ if (!conflict)
+ return SVN_NO_ERROR;
+
+ SVN_ERR(svn_wc__conflict_read_info(&operation, &locations, NULL, NULL,
+ &tree_conflicted,
+ db, wcroot->abspath,
+ conflict,
+ scratch_pool, scratch_pool));
+
+ if (!tree_conflicted
+ || (operation != svn_wc_operation_update
+ && operation != svn_wc_operation_switch))
+ {
+ return SVN_NO_ERROR;
+ }
+
+ SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
+ NULL,
+ db, wcroot->abspath,
+ conflict,
+ scratch_pool,
+ scratch_pool));
+
+ if (reason == svn_wc_conflict_reason_deleted
+ || reason == svn_wc_conflict_reason_replaced)
+ {
+ SVN_ERR(svn_wc__db_op_raise_moved_away_internal(
+ wcroot, local_relpath, op_depth_below, db,
+ operation, action,
+ (locations && locations->nelts > 0)
+ ? APR_ARRAY_IDX(locations, 0,
+ const svn_wc_conflict_version_t *)
+ : NULL,
+ (locations && locations->nelts > 1)
+ ? APR_ARRAY_IDX(locations, 1,
+ const svn_wc_conflict_version_t *)
+ : NULL,
+ scratch_pool));
+
+ /* Transform the move information into revert information */
+ SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
+ STMT_MOVE_NOTIFY_TO_REVERT));
+ }
+
+ return SVN_NO_ERROR;
+}
+
/* Baton for op_revert_txn and op_revert_recursive_txn */
struct revert_baton_t
{
@@ -6823,9 +6896,7 @@ op_revert_txn(void *baton,
svn_boolean_t moved_here;
int affected_rows;
const char *moved_to;
- int op_depth_increased = 0;
int op_depth_below;
- svn_skel_t *conflict;
/* ### Similar structure to op_revert_recursive_txn, should they be
combined? */
@@ -6887,16 +6958,11 @@ op_revert_txn(void *baton,
local_relpath, op_depth,
moved_to, NULL, scratch_pool));
}
- else
- {
- SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, NULL, NULL, wcroot,
- local_relpath,
- scratch_pool, scratch_pool));
- }
-
if (op_depth > 0 && op_depth == relpath_depth(local_relpath))
{
+ int op_depth_increased;
+
/* Can't do non-recursive revert if children exist */
SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
STMT_SELECT_GE_OP_DEPTH_CHILDREN));
@@ -6935,54 +7001,12 @@ op_revert_txn(void *baton,
/* If this node was moved-here, clear moved-to at the move source. */
if (moved_here)
SVN_ERR(clear_moved_to(wcroot, local_relpath, scratch_pool));
- }
-
- if (op_depth_increased && conflict)
- {
- svn_wc_operation_t operation;
- svn_boolean_t tree_conflicted;
- const apr_array_header_t *locations;
-
- SVN_ERR(svn_wc__conflict_read_info(&operation, &locations, NULL, NULL,
- &tree_conflicted,
- db, wcroot->abspath,
- conflict,
- scratch_pool, scratch_pool));
- if (tree_conflicted
- && (operation == svn_wc_operation_update
- || operation == svn_wc_operation_switch))
- {
- svn_wc_conflict_reason_t reason;
- svn_wc_conflict_action_t action;
-
- SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason, &action,
- NULL,
- db, wcroot->abspath,
- conflict,
- scratch_pool,
- scratch_pool));
- if (reason == svn_wc_conflict_reason_deleted
- || reason == svn_wc_conflict_reason_replaced)
- {
- SVN_ERR(svn_wc__db_op_raise_moved_away_internal(
- wcroot, local_relpath, op_depth_below, db,
- operation, action,
- (locations && locations->nelts > 0)
- ? APR_ARRAY_IDX(locations, 0,
- const svn_wc_conflict_version_t *)
- : NULL,
- (locations && locations->nelts > 1)
- ? APR_ARRAY_IDX(locations, 1,
- const svn_wc_conflict_version_t *)
- : NULL,
- scratch_pool));
-
- /* Transform the move information into revert information */
- SVN_ERR(svn_sqlite__exec_statements(wcroot->sdb,
- STMT_MOVE_NOTIFY_TO_REVERT));
- }
- }
+ /* If the node was moved itself, we don't have interesting moved
+ children (and the move itself was already broken) */
+ if (op_depth_increased && !moved_to)
+ SVN_ERR(revert_maybe_raise_moved_away(wcroot, db, local_relpath,
+ op_depth_below, scratch_pool));
}
if (rvb->clear_changelists)
@@ -15117,7 +15141,7 @@ make_copy_txn(svn_wc__db_wcroot_t *wcroo
const char *name = svn_relpath_skip_ancestor(last_repos_relpath,
repos_relpath);
- if (strcmp(name, svn_relpath_basename(local_relpath, NULL)) == 0)
+ if (name && strcmp(name, svn_relpath_basename(local_relpath, NULL)) == 0)
op_depth = last_op_depth;
}
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.h?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.h (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db.h Sat Sep 12 09:07:09 2015
@@ -1644,7 +1644,12 @@ svn_wc__db_op_mark_conflict(svn_wc__db_t
apr_pool_t *scratch_pool);
-/* ### caller maintains ACTUAL, and how the resolution occurred. we're just
+/* Clear all or some of the conflicts stored on LOCAL_ABSPATH, if any.
+
+ Any work items that are necessary as part of resolving this node
+ can be passed in WORK_ITEMS.
+
+### caller maintains ACTUAL, and how the resolution occurred. we're just
### recording state.
###
### I'm not sure that these three values are the best way to do this,
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_pristine.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_pristine.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_pristine.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_pristine.c Sat Sep 12 09:07:09 2015
@@ -333,14 +333,12 @@ pristine_install_txn(svn_sqlite__db_t *s
* an orphan file and it doesn't matter if we overwrite it.) */
{
apr_finfo_t finfo;
- SVN_ERR(svn_stream__install_get_info(&finfo, install_stream, APR_FINFO_SIZE,
- scratch_pool));
- SVN_ERR(svn_io_set_file_read_write(pristine_abspath, TRUE, scratch_pool));
+ SVN_ERR(svn_stream__install_get_info(&finfo, install_stream,
+ APR_FINFO_SIZE, scratch_pool));
SVN_ERR(svn_stream__install_stream(install_stream, pristine_abspath,
- TRUE, scratch_pool));
+ TRUE, scratch_pool));
- SVN_ERR(svn_sqlite__get_statement(&stmt, sdb,
- STMT_INSERT_PRISTINE));
+ SVN_ERR(svn_sqlite__get_statement(&stmt, sdb, STMT_INSERT_PRISTINE));
SVN_ERR(svn_sqlite__bind_checksum(stmt, 1, sha1_checksum, scratch_pool));
SVN_ERR(svn_sqlite__bind_checksum(stmt, 2, md5_checksum, scratch_pool));
SVN_ERR(svn_sqlite__bind_int64(stmt, 3, finfo.size));
@@ -383,9 +381,10 @@ svn_wc__db_pristine_prepare_install(svn_
*install_data = apr_pcalloc(result_pool, sizeof(**install_data));
(*install_data)->wcroot = wcroot;
- SVN_ERR(svn_stream__create_for_install(stream,
- temp_dir_abspath,
- result_pool, scratch_pool));
+ SVN_ERR_W(svn_stream__create_for_install(stream,
+ temp_dir_abspath,
+ result_pool, scratch_pool),
+ _("Unable to create pristine install stream"));
(*install_data)->inner_stream = *stream;
@@ -688,42 +687,6 @@ svn_wc__db_pristine_transfer(svn_wc__db_
-/* Remove the file at FILE_ABSPATH in such a way that we could re-create a
- * new file of the same name at any time thereafter.
- *
- * On Windows, the file will not disappear immediately from the directory if
- * it is still being read so the best thing to do is first rename it to a
- * unique name. */
-static svn_error_t *
-remove_file(const char *file_abspath,
- svn_wc__db_wcroot_t *wcroot,
- svn_boolean_t ignore_enoent,
- apr_pool_t *scratch_pool)
-{
-#ifdef WIN32
- svn_error_t *err;
- const char *temp_abspath;
- const char *temp_dir_abspath
- = pristine_get_tempdir(wcroot, scratch_pool, scratch_pool);
-
- /* To rename the file to a unique name in the temp dir, first create a
- * uniquely named file in the temp dir and then overwrite it. */
- SVN_ERR(svn_io_open_unique_file3(NULL, &temp_abspath, temp_dir_abspath,
- svn_io_file_del_none,
- scratch_pool, scratch_pool));
- err = svn_io_file_rename2(file_abspath, temp_abspath, FALSE, scratch_pool);
- if (err && ignore_enoent && APR_STATUS_IS_ENOENT(err->apr_err))
- svn_error_clear(err);
- else
- SVN_ERR(err);
- file_abspath = temp_abspath;
-#endif
-
- SVN_ERR(svn_io_remove_file2(file_abspath, ignore_enoent, scratch_pool));
-
- return SVN_NO_ERROR;
-}
-
/* If the pristine text referenced by SHA1_CHECKSUM in WCROOT/SDB, whose path
* within the pristine store is PRISTINE_ABSPATH, has a reference count of
* zero, delete it (both the database row and the disk file).
@@ -759,8 +722,8 @@ pristine_remove_if_unreferenced_txn(svn_
svn_boolean_t ignore_enoent = TRUE;
#endif
- SVN_ERR(remove_file(pristine_abspath, wcroot, ignore_enoent,
- scratch_pool));
+ SVN_ERR(svn_io_remove_file2(pristine_abspath, ignore_enoent,
+ scratch_pool));
}
return SVN_NO_ERROR;
@@ -946,11 +909,28 @@ svn_wc__db_pristine_check(svn_boolean_t
{
const char *pristine_abspath;
svn_node_kind_t kind_on_disk;
+ svn_error_t *err;
SVN_ERR(get_pristine_fname(&pristine_abspath, wcroot->abspath,
sha1_checksum, scratch_pool, scratch_pool));
- SVN_ERR(svn_io_check_path(pristine_abspath, &kind_on_disk, scratch_pool));
- if (kind_on_disk != svn_node_file)
+ err = svn_io_check_path(pristine_abspath, &kind_on_disk, scratch_pool);
+#ifdef WIN32
+ if (err && err->apr_err == APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED))
+ {
+ svn_error_clear(err);
+ /* Possible race condition: The filename is locked, but there is no
+ file or dir with this name. Let's fall back on checking the DB.
+
+ This case is triggered by the pristine store tests on deleting
+ a file that is still open via another handle, where this other
+ handle has a FILE_SHARE_DELETE share mode.
+ */
+ }
+ else
+#endif
+ if (err)
+ return svn_error_trace(err);
+ else if (kind_on_disk != svn_node_file)
{
*present = FALSE;
return SVN_NO_ERROR;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_util.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_util.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_util.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_wc/wc_db_util.c Sat Sep 12 09:07:09 2015
@@ -127,7 +127,7 @@ svn_wc__db_util_open_db(svn_sqlite__db_t
{
svn_node_kind_t kind;
- /* A file stat is much cheaper then a failed database open handled
+ /* A file stat is much cheaper than a failed database open handled
by SQLite. */
SVN_ERR(svn_io_check_path(sdb_abspath, &kind, scratch_pool));
Modified: subversion/branches/move-tracking-2/subversion/po/it.po
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/po/it.po?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/po/it.po (original)
+++ subversion/branches/move-tracking-2/subversion/po/it.po Sat Sep 12 09:07:09 2015
@@ -10134,7 +10134,7 @@ msgstr ""
#: ../svn/propedit-cmd.c:158
#, c-format
msgid "Set new value for property '%s' on revision %ld\n"
-msgstr "Impostazione di un nuovo volore per la proprietà '%s' nella revisione %ld\n"
+msgstr "Impostazione di un nuovo valore per la proprietà '%s' nella revisione %ld\n"
#: ../svn/propedit-cmd.c:164
#, c-format
Modified: subversion/branches/move-tracking-2/subversion/svn/lock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/lock-cmd.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/lock-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/lock-cmd.c Sat Sep 12 09:07:09 2015
@@ -80,6 +80,29 @@ get_comment(const char **comment, svn_cl
return SVN_NO_ERROR;
}
+/* Baton for notify_lock_handler */
+struct notify_lock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__lock */
+static void
+notify_lock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_lock_baton_t *nlb = baton;
+
+ if (notify->action == svn_wc_notify_failed_lock)
+ nlb->had_failure = TRUE;
+
+ if (nlb->inner_notify)
+ nlb->inner_notify(nlb->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
svn_cl__lock(apr_getopt_t *os,
@@ -90,6 +113,7 @@ svn_cl__lock(apr_getopt_t *os,
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
const char *comment;
+ struct notify_lock_baton_t nlb;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -106,5 +130,18 @@ svn_cl__lock(apr_getopt_t *os,
SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
- return svn_client_lock(targets, comment, opt_state->force, ctx, pool);
+ nlb.inner_notify = ctx->notify_func2;
+ nlb.inner_baton = ctx->notify_baton2;
+ nlb.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_lock_handler;
+ ctx->notify_baton2 = &nlb;
+
+ SVN_ERR(svn_client_lock(targets, comment, opt_state->force, ctx, pool));
+
+ if (nlb.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be obtained"));
+
+ return SVN_NO_ERROR;
}
Modified: subversion/branches/move-tracking-2/subversion/svn/unlock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svn/unlock-cmd.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svn/unlock-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svn/unlock-cmd.c Sat Sep 12 09:07:09 2015
@@ -39,6 +39,29 @@
/*** Code. ***/
+/* Baton for notify_unlock_handler */
+struct notify_unlock_baton_t
+{
+ void *inner_baton;
+ svn_wc_notify_func2_t inner_notify;
+ svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__unlock */
+static void
+notify_unlock_handler(void *baton,
+ const svn_wc_notify_t *notify,
+ apr_pool_t *scratch_pool)
+{
+ struct notify_unlock_baton_t *nub = baton;
+
+ if (notify->action == svn_wc_notify_failed_unlock)
+ nub->had_failure = TRUE;
+
+ if (nub->inner_notify)
+ nub->inner_notify(nub->inner_baton, notify, scratch_pool);
+}
+
/* This implements the `svn_opt_subcommand_t' interface. */
svn_error_t *
@@ -49,6 +72,7 @@ svn_cl__unlock(apr_getopt_t *os,
svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
apr_array_header_t *targets;
+ struct notify_unlock_baton_t nub;
SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
opt_state->targets,
@@ -63,6 +87,18 @@ svn_cl__unlock(apr_getopt_t *os,
SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
- return svn_error_trace(
- svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+ nub.inner_notify = ctx->notify_func2;
+ nub.inner_baton = ctx->notify_baton2;
+ nub.had_failure = FALSE;
+
+ ctx->notify_func2 = notify_unlock_handler;
+ ctx->notify_baton2 = &nub;
+
+ SVN_ERR(svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+
+ if (nub.had_failure)
+ return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+ _("One or more locks could not be released"));
+
+ return SVN_NO_ERROR;
}
Modified: subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnfsfs/stats-cmd.c Sat Sep 12 09:07:09 2015
@@ -20,6 +20,8 @@
* ====================================================================
*/
+#include <assert.h>
+
#include "svn_fs.h"
#include "svn_pools.h"
#include "svn_sorts.h"
@@ -235,6 +237,10 @@ print_extensions_by_changes(svn_fs_fs__s
{
svn_fs_fs__extension_info_t *info
= APR_ARRAY_IDX(data, i, svn_fs_fs__extension_info_t *);
+
+ /* If there are elements, then their count cannot be 0. */
+ assert(stats->file_histogram.total.count);
+
sum += info->node_histogram.total.count;
printf(_("%11s %20s (%2d%%) representations\n"),
info->extension,
@@ -243,11 +249,28 @@ print_extensions_by_changes(svn_fs_fs__s
stats->file_histogram.total.count));
}
- printf(_("%11s %20s (%2d%%) representations\n"),
- "(others)",
- svn__ui64toa_sep(stats->file_histogram.total.count - sum, ',', pool),
- (int)((stats->file_histogram.total.count - sum) * 100 /
- stats->file_histogram.total.count));
+ if (stats->file_histogram.total.count)
+ {
+ printf(_("%11s %20s (%2d%%) representations\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->file_histogram.total.count - sum, ',',
+ pool),
+ (int)((stats->file_histogram.total.count - sum) * 100 /
+ stats->file_histogram.total.count));
+ }
+}
+
+/* Calculate a percentage, handling edge cases. */
+static int
+get_percentage(apr_uint64_t part,
+ apr_uint64_t total)
+{
+ /* This include total == 0. */
+ if (part >= total)
+ return 100;
+
+ /* Standard case. */
+ return (int)(part * 100.0 / total);
}
/* Print the (up to) 16 extensions in STATS with the largest total size of
@@ -269,15 +292,20 @@ print_extensions_by_nodes(svn_fs_fs__sta
printf(_("%11s %20s (%2d%%) bytes\n"),
info->extension,
svn__ui64toa_sep(info->node_histogram.total.sum, ',', pool),
- (int)(info->node_histogram.total.sum * 100 /
- stats->file_histogram.total.sum));
+ get_percentage(info->node_histogram.total.sum,
+ stats->file_histogram.total.sum));
}
- printf(_("%11s %20s (%2d%%) bytes\n"),
- "(others)",
- svn__ui64toa_sep(stats->file_histogram.total.sum - sum, ',', pool),
- (int)((stats->file_histogram.total.sum - sum) * 100 /
- stats->file_histogram.total.sum));
+ if (stats->file_histogram.total.sum > sum)
+ {
+ /* Total sum can't be zero here. */
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->file_histogram.total.sum - sum, ',',
+ pool),
+ get_percentage(stats->file_histogram.total.sum - sum,
+ stats->file_histogram.total.sum));
+ }
}
/* Print the (up to) 16 extensions in STATS with the largest total size of
@@ -299,16 +327,20 @@ print_extensions_by_reps(svn_fs_fs__stat
printf(_("%11s %20s (%2d%%) bytes\n"),
info->extension,
svn__ui64toa_sep(info->rep_histogram.total.sum, ',', pool),
- (int)(info->rep_histogram.total.sum * 100 /
- stats->rep_size_histogram.total.sum));
+ get_percentage(info->rep_histogram.total.sum,
+ stats->rep_size_histogram.total.sum));
}
- printf(_("%11s %20s (%2d%%) bytes\n"),
- "(others)",
- svn__ui64toa_sep(stats->rep_size_histogram.total.sum - sum, ',',
- pool),
- (int)((stats->rep_size_histogram.total.sum - sum) * 100 /
- stats->rep_size_histogram.total.sum));
+ if (stats->rep_size_histogram.total.sum > sum)
+ {
+ /* Total sum can't be zero here. */
+ printf(_("%11s %20s (%2d%%) bytes\n"),
+ "(others)",
+ svn__ui64toa_sep(stats->rep_size_histogram.total.sum - sum, ',',
+ pool),
+ get_percentage(stats->rep_size_histogram.total.sum - sum,
+ stats->rep_size_histogram.total.sum));
+ }
}
/* Print per-extension histograms for the most frequent extensions in STATS.
Modified: subversion/branches/move-tracking-2/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/tests/cmdline/authz_tests.py?rev=1702603&r1=1702602&r2=1702603&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/move-tracking-2/subversion/tests/cmdline/authz_tests.py Sat Sep 12 09:07:09 2015
@@ -728,10 +728,8 @@ def authz_locking(sbox):
if sbox.repo_url.startswith('http'):
expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
- expected_status = 1
else:
expected_err = ".*svn: warning: W170001: Authorization failed.*"
- expected_status = 0
root_url = sbox.repo_url
wc_dir = sbox.wc_dir
@@ -741,16 +739,16 @@ def authz_locking(sbox):
mu_path = os.path.join(wc_dir, 'A', 'mu')
# lock a file url, target is readonly: should fail
- svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
- 'lock',
- '-m', 'lock msg',
- iota_url)
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'lock',
+ '-m', 'lock msg',
+ iota_url)
# lock a file path, target is readonly: should fail
- svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
- 'lock',
- '-m', 'lock msg',
- iota_path)
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'lock',
+ '-m', 'lock msg',
+ iota_path)
# Test for issue 2700: we have write access in folder /A, but not in root.
# Get a lock on /A/mu and try to commit it.
@@ -783,16 +781,16 @@ def authz_locking(sbox):
svntest.actions.run_and_verify_info([{'Lock Token' : None}],
sbox.ospath('A/mu'))
- ### Crazy serf SVN_ERR_FS_LOCK_OWNER_MISMATCH warning! Issue 3801?
if sbox.repo_url.startswith('http'):
expected_err = ".*svn: warning: W160039: Unlock.*[Ff]orbidden.*"
- expected_status = 0
+ else:
+ expected_err = ".*svn: warning: W170001: Authorization failed.*"
- svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
- 'lock',
- '-m', 'lock msg',
- mu_path,
- iota_path)
+ svntest.actions.run_and_verify_svn(None, expected_err,
+ 'lock',
+ '-m', 'lock msg',
+ mu_path,
+ iota_path)
# One path locked, one still unlocked
svntest.actions.run_and_verify_info([{'Lock Token' : None}],