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 2013/06/05 14:40:28 UTC
svn commit: r1489839 - in /subversion/branches/fsfs-format7/subversion:
bindings/swig/perl/libsvn_swig_perl/ bindings/swig/perl/native/
bindings/swig/ruby/test/ include/private/ libsvn_client/ libsvn_diff/
libsvn_fs_fs/ libsvn_ra_serf/ libsvn_ra_svn/ l...
Author: stefan2
Date: Wed Jun 5 12:40:27 2013
New Revision: 1489839
URL: http://svn.apache.org/r1489839
Log:
On the fsfs-format7 branch: sync with trunk up to and inclduing r1489831.
Modified:
subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Client.pm
subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Core.pm
subversion/branches/fsfs-format7/subversion/bindings/swig/ruby/test/windows_util.rb
subversion/branches/fsfs-format7/subversion/include/private/svn_string_private.h
subversion/branches/fsfs-format7/subversion/libsvn_client/merge.c
subversion/branches/fsfs-format7/subversion/libsvn_diff/parse-diff.c
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/revprops.c
subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/util.c
subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/commit.c
subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/locks.c
subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/ra_serf.h
subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/util.c
subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c
subversion/branches/fsfs-format7/subversion/libsvn_repos/reporter.c
subversion/branches/fsfs-format7/subversion/libsvn_subr/config_file.c
subversion/branches/fsfs-format7/subversion/libsvn_subr/dirent_uri.c
subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c
subversion/branches/fsfs-format7/subversion/libsvn_subr/string.c
subversion/branches/fsfs-format7/subversion/libsvn_subr/types.c
subversion/branches/fsfs-format7/subversion/libsvn_wc/tree_conflicts.c
subversion/branches/fsfs-format7/subversion/libsvn_wc/update_editor.c
subversion/branches/fsfs-format7/subversion/mod_dav_svn/activity.c
subversion/branches/fsfs-format7/subversion/mod_dav_svn/lock.c
subversion/branches/fsfs-format7/subversion/svn/file-merge.c
subversion/branches/fsfs-format7/subversion/svnserve/serve.c
subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py
subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/sandbox.py
Modified: subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c (original)
+++ subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c Wed Jun 5 12:40:27 2013
@@ -29,6 +29,10 @@
#include <perl.h>
#include <XSUB.h>
+/* Perl defines a _ macro, but SVN uses it for translations.
+ * So undefine _ after including the Perl headers. */
+#undef _
+
#include <stdarg.h>
#ifdef WIN32
#include <io.h>
Modified: subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h (original)
+++ subversion/branches/fsfs-format7/subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h Wed Jun 5 12:40:27 2013
@@ -29,6 +29,10 @@
#include <perl.h>
#include <XSUB.h>
+/* Perl defines a _ macro, but SVN uses it for translations.
+ * So undefine _ after including the Perl headers. */
+#undef _
+
#include <apr.h>
#include <apr_pools.h>
#include <apr_strings.h>
Modified: subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Client.pm
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Client.pm?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Client.pm (original)
+++ subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Client.pm Wed Jun 5 12:40:27 2013
@@ -8,25 +8,26 @@ package SVN::Client;
my @_all_fns;
BEGIN {
@_all_fns =
- qw( version diff_summarize_dup create_context checkout3
- checkout2 checkout update4 update3 update2 update switch2 switch
- add4 add3 add2 add mkdir4 mkdir3 mkdir2 mkdir delete3 delete2
- delete import3 import2 import commit4 commit3 commit2
- commit status4 status3 status2 status log5 log4 log3 log2 log
- blame4 blame3 blame2 blame diff4 diff3 diff2 diff diff_peg4
- diff_peg3 diff_peg2 diff_peg diff_summarize2
- diff_summarize diff_summarize_peg2 diff_summarize_peg
- merge3 merge2 merge merge_peg3 merge_peg2 merge_peg
- cleanup relocate revert2 revert resolve resolved copy4
- copy3 copy2 copy move5 move4 move3 move2 move propset3
- propset2 propset revprop_set propget3 propget2
- propget revprop_get proplist3 proplist2 proplist
- revprop_list export4 export3 export2 export list2 list
- ls3 ls2 ls cat2 cat add_to_changelist
- remove_from_changelist lock unlock info2 info
- url_from_path uuid_from_url uuid_from_path open_ra_session
- invoke_blame_receiver2 invoke_blame_receiver
- invoke_diff_summarize_func
+ qw( add add2 add3 add4 add_to_changelist blame blame2 blame3 blame4
+ cat cat2 checkout checkout2 checkout3 cleanup
+ commit commit2 commit3 commit4 copy copy2 copy3 copy4
+ create_context delete delete2 delete3 diff diff2 diff3 diff4
+ diff_peg diff_peg2 diff_peg3 diff_peg4
+ diff_summarize diff_summarize2 diff_summarize_dup
+ diff_summarize_peg diff_summarize_peg2
+ export export2 export3 export4 import import2 import3
+ info info2 invoke_blame_receiver invoke_blame_receiver2
+ invoke_diff_summarize_func list list2 lock
+ log log2 log3 log4 log5 ls ls2 ls3
+ merge merge2 merge3 merge_peg merge_peg2 merge_peg3
+ mkdir mkdir2 mkdir3 mkdir4 move move2 move3 move4 move5
+ open_ra_session propget propget2 propget3
+ proplist proplist2 proplist3 propset propset2 propset3
+ relocate remove_from_changelist resolve resolved
+ revert revert2 revprop_get revprop_list revprop_set
+ status status2 status3 status4 switch switch2
+ unlock update update2 update3 update4
+ url_from_path uuid_from_path uuid_from_url version
);
require SVN::Base;
@@ -40,21 +41,18 @@ SVN::Client - Subversion client function
=head1 SYNOPSIS
use SVN::Client;
- my $ctx = new SVN::Client(
- auth => [SVN::Client::get_simple_provider(),
- SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),
- SVN::Client::get_username_provider()]
- );
+ my $client = new SVN::Client(
+ auth => [
+ SVN::Client::get_simple_provider(),
+ SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),
+ SVN::Client::get_username_provider()
+ ]);
- $ctx->cat(\*STDOUT, 'http://svn.apache.org/repos/asf/subversion/trunk/README',
- 'HEAD');
+ $client->cat(\*STDOUT,
+ 'http://svn.apache.org/repos/asf/subversion/trunk/README', 'HEAD');
sub simple_prompt {
- my $cred = shift;
- my $realm = shift;
- my $default_username = shift;
- my $may_save = shift;
- my $pool = shift;
+ my ($cred, $realm, $default_username, $may_save, $pool) = @_;
print "Enter authentication info for realm: $realm\n";
print "Username: ";
@@ -81,8 +79,8 @@ The Perl method calls take a SVN::Client
This allows method call invocation of the methods to be possible. For
example, the following are equivalent:
- SVN::Client::add($ctx,$path, $recursive, $pool);
- $ctx->add($path, $recursive, $pool);
+ SVN::Client::add($client,$path, $recursive, $pool);
+ $client->add($path, $recursive, $pool);
Many of the C API calls also take a apr_pool_t pointer as their last
argument. The Perl bindings generally deal with this for you and
@@ -103,7 +101,7 @@ the rules below or will be noted otherwi
=over 4
-=item $ctx
+=item $client
An SVN::Client object that you get from the constructor.
@@ -163,7 +161,7 @@ The following methods are available:
=over 4
-=item $ctx = SVN::Client-E<gt>new( %options );
+=item $client = SVN::Client-E<gt>new( %options );
This class method constructs a new C<SVN::Client> object and returns
a reference to it.
@@ -252,21 +250,21 @@ sub new
return $self;
}
-=item $ctx-E<gt>add($path, $recursive, $pool);
+=item $client-E<gt>add($path, $recursive, $pool);
-Similar to $ctx-E<gt>add2(), but with $force always set to FALSE.
+Similar to $client-E<gt>add2(), but with $force always set to FALSE.
-=item $ctx-E<gt>add2($path, $recursive, $force, $ctx, $pool);
+=item $client-E<gt>add2($path, $recursive, $force, $pool);
-Similar to $ctx-E<gt>add3(), but with $no_ignore always set to FALSE.
+Similar to $client-E<gt>add3(), but with $no_ignore always set to FALSE.
-=item $ctx-E<gt>add3($path, $recursive, $force, $no_ignore, $pool);
+=item $client-E<gt>add3($path, $recursive, $force, $no_ignore, $pool);
-Similar to $ctx-E<gt>add4(), but with $add_parents always set to FALSE and
+Similar to $client-E<gt>add4(), but with $add_parents always set to FALSE and
$depth set according to $recursive; if TRUE, then depth is
$SVN::Depth::infinity, if FALSE, then $SVN::Depth::empty.
-=item $ctx-E<gt>add4($path, $depth, $force, $no_ignore, $add_parents, $pool);
+=item $client-E<gt>add4($path, $depth, $force, $no_ignore, $add_parents, $pool);
Schedule a working copy $path for addition to the repository.
@@ -289,7 +287,7 @@ Calls the notify callback for each added
If $no_ignore is FALSE, don't add any file or directory (or recurse into any
directory) that is unversioned and found by recursion (as opposed to being the
explicit target $path) and whose name matches the svn:ignore property on its
-parent directory or the global-ignores list in $ctx->config. If $no_ignore is
+parent directory or the global-ignores list in $client->config. If $no_ignore is
TRUE, do include such files and directories. (Note that an svn:ignore property
can influence this behaviour only when recursing into an already versioned
directory with $force).
@@ -300,11 +298,11 @@ found return $SVN::Error::NO_VERSIONED_P
Important: this is a B<scheduling> operation. No changes will happen
to the repository until a commit occurs. This scheduling can be
-removed with $ctx-E<gt>revert().
+removed with $client-E<gt>revert().
No return.
-=item $ctx-E<gt>blame($target, $start, $end, \&receiver, $pool);
+=item $client-E<gt>blame($target, $start, $end, \&receiver, $pool);
Invoke \&receiver subroutine on each line-blame item associated with revision
$end of $target, using $start as the default source of all blame.
@@ -324,7 +322,7 @@ The blame receiver subroutine can return
to return an error. All other returns will be ignored.
You can create an svn_error_t object with SVN::Error::create().
-=item $ctx-E<gt>cat(\*FILEHANDLE, $target, $revision, $pool);
+=item $client-E<gt>cat(\*FILEHANDLE, $target, $revision, $pool);
Outputs the content of the file identified by $target and $revision to the
FILEHANDLE. FILEHANDLE is a reference to a filehandle.
@@ -333,17 +331,17 @@ If $target is not a local path and if $r
other kind that requires a local path), then an error will be raised,
because the desired revision can not be determined.
-=item $ctx-E<gt>checkout($url, $path, $revision, $recursive, $pool);
+=item $client-E<gt>checkout($url, $path, $revision, $recursive, $pool);
-Similar to $ctx-E<gt>checkout2(), but with $peg_revision always set to undef (unspecified) and $ignore_externals always set to FALSE.
+Similar to $client-E<gt>checkout2(), but with $peg_revision always set to undef (unspecified) and $ignore_externals always set to FALSE.
-=item $ctx-E<gt>checkout2($url, $path, $peg_revision, $revision, $recursive, $ignore_externals, $pool);
+=item $client-E<gt>checkout2($url, $path, $peg_revision, $revision, $recursive, $ignore_externals, $pool);
-Similar to $ctx-E<gt>checkout3(), but with $allow_unver_obstructions always set
+Similar to $client-E<gt>checkout3(), but with $allow_unver_obstructions always set
to FALSE, and $depth set according to $recurse: if $recurse is TRUE, $depth is
$SVN::Depth::infinity, if $recurse is FALSE, set $depth to $SVN::Depth::files.
-=item $ctx-E<gt>checkout3($url, $path, $preg_revision, $revision, $depth, $ignore_externals, $allow_unver_obstructions, $pool);
+=item $client-E<gt>checkout3($url, $path, $preg_revision, $revision, $depth, $ignore_externals, $allow_unver_obstructions, $pool);
Checkout a working copy of $url at $revision using $path as the root directory
of the newly checked out working copy.
@@ -370,12 +368,12 @@ obstructing items.
Returns the value of the revision actually checked out of the repository.
-=item $ctx-E<gt>cleanup($dir, $pool);
+=item $client-E<gt>cleanup($dir, $pool);
Recursively cleanup a working copy directory, $dir, finishing any incomplete
operations, removing lockfiles, etc.
-=item $ctx-E<gt>commit($targets, $nonrecursive, $pool);
+=item $client-E<gt>commit($targets, $nonrecursive, $pool);
Commit files or directories referenced by target. Will use the log_msg
callback to obtain the log message for the commit.
@@ -397,7 +395,7 @@ Returns a svn_client_commit_info_t objec
commit information object is $SVN::Core::INVALID_REVNUM and no error was
raised, then the commit was a no-op; nothing needed to be committed.
-=item $ctx-E<gt>copy($src_target, $src_revision, $dst_target, $pool);
+=item $client-E<gt>copy($src_target, $src_revision, $dst_target, $pool);
Copies $src_target to $dst_target.
@@ -412,15 +410,15 @@ to the repository. The log_msg callback
log message. If the commit succeeds, return a svn_client_commit_info_t
object.
-If $dst_target is not a URL, then this is just a variant of $ctx-E<gt>add(),
+If $dst_target is not a URL, then this is just a variant of $client-E<gt>add(),
where the $dst_path items are scheduled for addition as copies. No changes
will happen to the repository until a commit occurs. This scheduling can be
-removed with $ctx-E<gt>revert(). undef will be returned in this case.
+removed with $client-E<gt>revert(). undef will be returned in this case.
Calls the notify callback for each item added at the new location, passing
the new, relative path of the added item.
-=item $ctx-E<gt>delete($targets, $force, $pool);
+=item $client-E<gt>delete($targets, $force, $pool);
Delete items from a repository or working copy.
@@ -433,7 +431,7 @@ repository.
Else, schedule the working copy paths in $targets for removal from the
repository. Each path's parent must be under revision control. This is
just a B<scheduling> operation. No changes will happen to the repository
-until a commit occurs. This scheduling can be removed with $ctx-E<gt>revert().
+until a commit occurs. This scheduling can be removed with $client-E<gt>revert().
If a path is a file it is immediately removed from the working copy. If
the path is a directory it will remain in the working copy but all the files,
and all unversioned items it contains will be removed. If $force is not set
@@ -445,7 +443,7 @@ the deleted item.
Has no return.
-=item $ctx-E<gt>diff($diff_options, $target1, $revision1, $target2, $revision2, $recursive, $ignore_ancestry, $no_diff_deleted, $outfile, $errfile, $pool);
+=item $client-E<gt>diff($diff_options, $target1, $revision1, $target2, $revision2, $recursive, $ignore_ancestry, $no_diff_deleted, $outfile, $errfile, $pool);
Produces diff output which describes the delta between $target1 at
$revision1 and $target2 at $revision2. They both must represent the same
@@ -469,7 +467,7 @@ pass an empty array to return a unified
Has no return.
-=item $ctx-E<gt>diff_summarize($target1, $revision1, $target2, $revision2, $recursive, $ignore_ancestry, \&summarize_func, $pool);
+=item $client-E<gt>diff_summarize($target1, $revision1, $target2, $revision2, $recursive, $ignore_ancestry, \&summarize_func, $pool);
Produce a diff summary which lists the changed items between $target1
at $revision1 and $target2 at $revision2 without creating text deltas.
@@ -486,7 +484,7 @@ See diff() for a description of the othe
Has no return.
-=item $ctx-E<gt>export($from, $to, $revision, $force, $pool);
+=item $client-E<gt>export($from, $to, $revision, $force, $pool);
Export the contents of either a subversion repository or a subversion
working copy into a 'clean' directory (meaning a directory with no
@@ -506,7 +504,7 @@ The notify callback will be called for t
Returns the value of the revision actually exported or
$SVN::Core::INVALID_REVNUM for local exports.
-=item $ctx-E<gt>import($path, $url, $nonrecursive, $pool);
+=item $client-E<gt>import($path, $url, $nonrecursive, $pool);
Import file or directory $path into repository directory $url at head.
@@ -534,7 +532,39 @@ one is needed.
Returns a svn_client_commit_info_t object.
-=item $ctx-E<gt>log($targets, $start, $end, $discover_changed_paths, $strict_node_history, \&log_receiver, $pool);
+=item $client-E<gt>info($path_or_url, $peg_revision, $revision, \&receiver, $recurse);
+
+Invokes \&receiver passing it information about $path_or_url for $revision.
+The information returned is system-generated metadata, not the sort of
+"property" metadata created by users. For methods available on the object
+passed to \&receiver, B<see svn_info_t>.
+
+If both revision arguments are either svn_opt_revision_unspecified or NULL,
+then information will be pulled solely from the working copy; no network
+connections will be made.
+
+Otherwise, information will be pulled from a repository. The actual node
+revision selected is determined by the $path_or_url as it exists in
+$peg_revision. If $peg_revision is undef, then it defaults to HEAD for URLs
+or WORKING for WC targets.
+
+If $path_or_url is not a local path, then if $revision is PREV (or some other
+kind that requires a local path), an error will be returned, because the
+desired revision cannot be determined.
+
+Uses the authentication baton cached in ctx to authenticate against the
+repository.
+
+If $recurse is true (and $path_or_url is a directory) this will be a recursive
+operation, invoking $receiver on each child.
+
+ my $receiver = sub {
+ my( $path, $info, $pool ) = @_;
+ print "Current revision of $path is ", $info->rev, "\n";
+ };
+ $client->info( 'foo/bar.c', undef, 'WORKING', $receiver, 0 );
+
+=item $client-E<gt>log($targets, $start, $end, $discover_changed_paths, $strict_node_history, \&log_receiver, $pool);
Invoke the log_receiver subroutine on each log_message from $start to $end in
turn, inclusive (but will never invoke receiver on a given log message more
@@ -577,7 +607,7 @@ If $changed_paths is defined it referenc
every path committed in $revision; the values are svn_log_changed_path_t
objects.
-=item $ctx-E<gt>ls($target, $revision, $recursive, $pool);
+=item $client-E<gt>ls($target, $revision, $recursive, $pool);
Returns a hash of svn_dirent_t objects for $target at $revision.
@@ -589,7 +619,7 @@ If $target is a file only return an entr
If $target is non-existent, raises the $SVN::Error::FS_NOT_FOUND
error.
-=item $ctx-E<gt>merge($src1, $rev1, $src2, $rev2, $target_wcpath, $recursive, $ignore_ancestry, $force, $dry_run, $pool);
+=item $client-E<gt>merge($src1, $rev1, $src2, $rev2, $target_wcpath, $recursive, $ignore_ancestry, $force, $dry_run, $pool);
Merge changes from $src1/$rev1 to $src2/$rev2 into the working-copy path
$target_wcpath.
@@ -626,22 +656,22 @@ feedback is provided, but the working co
Has no return.
-=item $ctx-E<gt>mkdir($targets, $pool);
+=item $client-E<gt>mkdir($targets, $pool);
-Similar to $ctx-E<gt>mkdir2() except it returns an svn_client_commit_info_t
+Similar to $client-E<gt>mkdir2() except it returns an svn_client_commit_info_t
object instead of a svn_commit_info_t object.
-=item $ctx-E<gt>mkdir2($targets, $pool);
+=item $client-E<gt>mkdir2($targets, $pool);
-Similar to $ctx-E<gt>mkdir3(), but with $make_parents always FALSE, and
+Similar to $client-E<gt>mkdir3(), but with $make_parents always FALSE, and
$revprop_hash always undef.
-=item $ctx-E<gt>mkdir3($targets, $make_parents, $revprop_hash, $pool);
+=item $client-E<gt>mkdir3($targets, $make_parents, $revprop_hash, $pool);
-Similar to $ctx-E<gt>mkdir4(), but returns a svn_commit_info_t object rather
+Similar to $client-E<gt>mkdir4(), but returns a svn_commit_info_t object rather
than through a callback function.
-=item $ctx-E<gt>mkdir4($targets, $make_parents, $revprop_hash, \&commit_callback, $pool);
+=item $client-E<gt>mkdir4($targets, $make_parents, $revprop_hash, \&commit_callback, $pool);
Create a directory, either in a repository or a working copy.
@@ -669,7 +699,7 @@ called for items added to the working co
If \&commit_callback is not undef, then for each successful commit, call
\&commit_callback with the svn_commit_info_t object for the commit.
-=item $ctx-E<gt>move($src_path, $src_revision, $dst_path, $force, $pool);
+=item $client-E<gt>move($src_path, $src_revision, $dst_path, $force, $pool);
Move $src_path to $dst_path.
@@ -696,7 +726,7 @@ If $src_path is a working copy path
not be called.
* This is a scheduling operation. No changes will happen to the repository
-until a commit occurs. This scheduling can be removed with $ctx-E<gt>revert().
+until a commit occurs. This scheduling can be removed with $client-E<gt>revert().
If $src_path is a file it is removed from the working copy immediately.
If $src_path is a directory it will remain in the working copy but all
files, and unversioned items, it contains will be removed.
@@ -709,13 +739,13 @@ The notify callback will be called twice
indicate the deletion of the moved node, and once to indicate the addition
of the new location of the node.
-=item $ctx-E<gt>propget($propname, $target, $revision, $recursive, $pool);
+=item $client-E<gt>propget($propname, $target, $revision, $recursive, $pool);
Returns a reference to a hash containing paths or URLs, prefixed by $target (a
working copy or URL), of items for which the property $propname is set, and
whose values represent the property value for $propname at that path.
-=item $ctx-E<gt>proplist($target, $revision, $recursive, $pool);
+=item $client-E<gt>proplist($target, $revision, $recursive, $pool);
Returns a reference to an array of svn_client_proplist_item_t objects.
@@ -732,7 +762,7 @@ versioned entry below (and including) $t
If $target is not found, raises the $SVN::Error::ENTRY_NOT_FOUND error.
-=item $ctx-E<gt>propset($propname, $propval, $target, $recursive, $pool);
+=item $client-E<gt>propset($propname, $propval, $target, $recursive, $pool);
Set $propname to $propval on $target (a working copy or URL path).
@@ -746,7 +776,7 @@ If $propname is an svn-controlled proper
then the caller is responsible for ensuring that $propval is UTF8-encoded
and uses LF line-endings.
-=item $ctx-E<gt>relocate($dir, $from, $to, $recursive, $pool);
+=item $client-E<gt>relocate($dir, $from, $to, $recursive, $pool);
Modify a working copy directory $dir, changing any repository URLs that
begin with $from to begin with $to instead, recursing into subdirectories if
@@ -754,7 +784,7 @@ $recursive is true.
Has no return.
-=item $ctx-E<gt>resolved($path, $recursive, $pool);
+=item $client-E<gt>resolved($path, $recursive, $pool);
Removed the 'conflicted' state on a working copy path.
@@ -768,7 +798,7 @@ If $path is not in a state of conflict t
If $path's conflict state is removed, call the notify callback with the
$path.
-=item $ctx-E<gt>revert($paths, $recursive, $pool);
+=item $client-E<gt>revert($paths, $recursive, $pool);
Restore the pristine version of a working copy $paths, effectively undoing
any local mods.
@@ -776,28 +806,28 @@ any local mods.
For each path in $paths, if it is a directory and $recursive
is true, this will be a recursive operation.
-=item $ctx-E<gt>revprop_get($propname, $url, $revision, $pool);
+=item $client-E<gt>revprop_get($propname, $url, $revision, $pool);
Returns two values, the first of which is the value of $propname on revision
$revision in the repository represented by $url. The second value is the
actual revision queried.
-Note that unlike its cousin $ctx-E<gt>propget(), this routine doesn't affect
+Note that unlike its cousin $client-E<gt>propget(), this routine doesn't affect
working copy at all; it's a pure network operation that queries an
B<unversioned> property attached to a revision. This can be used to query
log messages, dates, authors, and the like.
-=item $ctx-E<gt>revprop_list($url, $revision, $pool);
+=item $client-E<gt>revprop_list($url, $revision, $pool);
Returns two values, the first of which is a reference to a hash containing
the properties attached to $revision in the repository represented by $url.
The second value is the actual revision queried.
-Note that unlike its cousin $ctx-E<gt>proplist(), this routine doesn't read a
+Note that unlike its cousin $client-E<gt>proplist(), this routine doesn't read a
working copy at all; it's a pure network operation that reads B<unversioned>
properties attached to a revision.
-=item $ctx-E<gt>revprop_set($propname, $propval, $url, $revision, $force, $pool);
+=item $client-E<gt>revprop_set($propname, $propval, $url, $revision, $force, $pool);
Set $propname to $propval on revision $revision in the repository represented
by $url.
@@ -811,7 +841,7 @@ If $propname is an svn-controlled proper
the caller is responsible for ensuring that the value is UTF8-encoded and
uses LF line-endings.
-Note that unlike its cousin $ctx-E<gt>propset(), this routine doesn't affect
+Note that unlike its cousin $client-E<gt>propset(), this routine doesn't affect
the working copy at all; it's a pure network operation that changes an
B<unversioned> property attached to a revision. This can be used to tweak
log messages, dates, authors, and the like. Be careful: it's a lossy
@@ -821,19 +851,19 @@ with no way to retrieve the prior value.
Also note that unless the administrator creates a pre-revprop-change hook
in the repository, this feature will fail.
-=item $ctx-E<gt>status($path, $revision, \&status_func, $recursive, $get_all, $update, $no_ignore, $pool);
+=item $client-E<gt>status($path, $revision, \&status_func, $recursive, $get_all, $update, $no_ignore, $pool);
-Similar to $ctx-E<gt>status2(), but with ignore_externals always set to FALSE, and with the status_func receiving a svn_wc_status2_t instead of a svn_wc_status_t object.
+Similar to $client-E<gt>status2(), but with ignore_externals always set to FALSE, and with the status_func receiving a svn_wc_status2_t instead of a svn_wc_status_t object.
-=item $ctx-E<gt>status2($path, $revision, \&status_func, $recursive, $get_all, $update, $no_ignore, $ignore_externals, $pool);
+=item $client-E<gt>status2($path, $revision, \&status_func, $recursive, $get_all, $update, $no_ignore, $ignore_externals, $pool);
-Similar to $ctx-E<gt>status3(), but with the changelists passed as undef, and with recursive instead of depth.
+Similar to $client-E<gt>status3(), but with the changelists passed as undef, and with recursive instead of depth.
-=item $ctx-E<gt>status3($path, $revision, \&status_func, $depth, $get_all, $update, $no_ignore, $ignore_externals, $changelists, $pool);
+=item $client-E<gt>status3($path, $revision, \&status_func, $depth, $get_all, $update, $no_ignore, $ignore_externals, $changelists, $pool);
-Similar to $ctx-E<gt>status4(), without the pool parameter to the callback and the return of the callback is ignored.
+Similar to $client-E<gt>status4(), without the pool parameter to the callback and the return of the callback is ignored.
-=item $ctx-E<gt>status4($path, $revision, \&status_func, $depth, $get_all, $update, $no_ignore, $ignore_externals, $changelists, $pool);
+=item $client-E<gt>status4($path, $revision, \&status_func, $depth, $get_all, $update, $no_ignore, $ignore_externals, $changelists, $pool);
Given $path to a working copy directory (or single file), call status_func()
with a set of svn_wc_status2_t objects which describe the status of $path and
@@ -867,39 +897,7 @@ object which is cleaned beteween invocat
The return of the status_func subroutine can be a svn_error_t object created by
SVN::Error::create in order to propogate an error up.
-=item $ctx-E<gt>info($path_or_url, $peg_revision, $revision, \&receiver, $recurse);
-
-Invokes \&receiver passing it information about $path_or_url for $revision.
-The information returned is system-generated metadata, not the sort of
-"property" metadata created by users. For methods available on the object
-passed to \&receiver, B<see svn_info_t>.
-
-If both revision arguments are either svn_opt_revision_unspecified or NULL,
-then information will be pulled solely from the working copy; no network
-connections will be made.
-
-Otherwise, information will be pulled from a repository. The actual node
-revision selected is determined by the $path_or_url as it exists in
-$peg_revision. If $peg_revision is undef, then it defaults to HEAD for URLs
-or WORKING for WC targets.
-
-If $path_or_url is not a local path, then if $revision is PREV (or some other
-kind that requires a local path), an error will be returned, because the
-desired revision cannot be determined.
-
-Uses the authentication baton cached in ctx to authenticate against the
-repository.
-
-If $recurse is true (and $path_or_url is a directory) this will be a recursive
-operation, invoking $receiver on each child.
-
- my $receiver = sub {
- my( $path, $info, $pool ) = @_;
- print "Current revision of $path is ", $info->rev, "\n";
- };
- $ctx->info( 'foo/bar.c', undef, 'WORKING', $receiver, 0 );
-
-=item $ctx-E<gt>switch($path, $url, $revision, $recursive, $pool);
+=item $client-E<gt>switch($path, $url, $revision, $recursive, $pool);
Switch working tree $path to $url at $revision.
@@ -918,24 +916,24 @@ scratch.
Returns the value of the revision to which the working copy was actually
switched.
-=item $ctx-E<gt>update($path, $revision, $recursive, $pool)
+=item $client-E<gt>update($path, $revision, $recursive, $pool)
-Similar to $ctx-E<gt>update2() except that it accepts only a single target in
+Similar to $client-E<gt>update2() except that it accepts only a single target in
$path, returns a single revision, and $ignore_externals is always set to FALSE.
-=item $ctx-E<gt>update2($paths, $revision, $recursive, $ignore_externals, $pool)
+=item $client-E<gt>update2($paths, $revision, $recursive, $ignore_externals, $pool)
-Similar to $ctx-E<gt>update3() but with $allow_unver_obstructions always set to
+Similar to $client-E<gt>update3() but with $allow_unver_obstructions always set to
FALSE, $depth_is_sticky to FALSE, and $depth set according to $recursive: if
$recursive is TRUE, set $depth to $SVN::Depth::infinity, if $recursive is
FALSE, set $depth to $SVN::Depth::files.
-=item $ctx-E<gt>update3($paths, $revision, $depth, $depth_is_sticky, $ignore_externals, $allow_unver_obstructions, $pool)
+=item $client-E<gt>update3($paths, $revision, $depth, $depth_is_sticky, $ignore_externals, $allow_unver_obstructions, $pool)
-Similar to $ctx-E<gt>update4() but with $make_parents always set to FALSE and
+Similar to $client-E<gt>update4() but with $make_parents always set to FALSE and
$adds_as_modification set to TRUE.
-=item $ctx-E<gt>update4($paths, $revision, $depth, $depth_is_sticky, $ignore_externals, $allow_unver_obstructions, $adds_as_modification, $make_parents)
+=item $client-E<gt>update4($paths, $revision, $depth, $depth_is_sticky, $ignore_externals, $allow_unver_obstructions, $adds_as_modification, $make_parents)
Update working trees $paths to $revision.
@@ -989,7 +987,7 @@ set to the revision to which $revision w
element of $paths.
-=item $ctx-E<gt>url_from_path($target, $pool); or SVN::Client::url_from_path($target, $pool);
+=item $client-E<gt>url_from_path($target, $pool); or SVN::Client::url_from_path($target, $pool);
Returns the URL for $target.
@@ -999,21 +997,21 @@ If $target is a versioned item, it retur
If $target is unversioned (has no entry), returns undef.
-=item $ctx-E<gt>uuid_from_path($path, $adm_access, $pool);
+=item $client-E<gt>uuid_from_path($path, $adm_access, $pool);
Return the repository uuid for working-copy $path, allocated in $pool.
Use $adm_access to retrieve the uuid from $path's entry; if not present in the
-entry, then call $ctx-E<gt>uuid_from_url() to retrieve, using the entry's URL.
+entry, then call $client-E<gt>uuid_from_url() to retrieve, using the entry's URL.
-Note: The only reason this function falls back on $ctx-E<gt>uuid_from_url is for
+Note: The only reason this function falls back on $client-E<gt>uuid_from_url is for
compatibility purposes. Old working copies may not have uuids in the entries
files.
Note: This method probably doesn't work right now without a lot of pain,
because SVN::Wc is incomplete and it requires an adm_access object from it.
-=item $ctx-E<gt>uuid_from_url($url, $pool);
+=item $client-E<gt>uuid_from_url($url, $pool);
Return repository uuid for url.
@@ -1022,7 +1020,7 @@ Return repository uuid for url.
=cut
# import methods into our name space and wrap them in a closure
-# to support method calling style $ctx->log()
+# to support method calling style $client->log()
foreach my $function (@_all_fns)
{
no strict 'refs';
@@ -1102,7 +1100,7 @@ current value.
=over 4
-=item $ctx-E<gt>auth(SVN::Client::get_username_provider());
+=item $client-E<gt>auth(SVN::Client::get_username_provider());
Provides access to the auth_baton in the svn_client_ctx_t attached to the
SVN::Client object.
@@ -1143,7 +1141,7 @@ sub auth
return $self->{'ctx'}->auth_baton();
}
-=item $ctx-E<gt>notify(\¬ify);
+=item $client-E<gt>notify(\¬ify);
Sets the notify callback for the client context to a code reference that
you pass. It always returns the current codereference set.
@@ -1174,7 +1172,7 @@ sub notify {
return ${$self->{'notify_callback'}};
}
-=item $ctx-E<gt>log_msg(\&log_msg)
+=item $client-E<gt>log_msg(\&log_msg)
Sets the log_msg callback for the client context to a code reference that you
pass. It always returns the current codereference set.
@@ -1207,7 +1205,7 @@ sub log_msg {
return ${$self->{'log_msg_callback'}};
}
-=item $ctx-E<gt>cancel(\&cancel)
+=item $client-E<gt>cancel(\&cancel)
Sets the cancellation callback for the client context to a code reference that you
pass. It always returns the current codereference set.
@@ -1240,7 +1238,7 @@ sub cancel {
return ${$self->{'cancel_callback'}};
}
-=item $ctx-E<gt>pool(new SVN::Pool);
+=item $client-E<gt>pool(new SVN::Pool);
Method that sets or gets the default pool that is passed to method calls
requiring a pool, but which were not explicitly passed one.
@@ -1261,7 +1259,7 @@ sub pool
return $self->{'pool'} = shift;
}
}
-=item $ctx-E<gt>config(SVN::Core::config_get_config(undef));
+=item $client-E<gt>config(SVN::Core::config_get_config(undef));
Method that allows access to the config member of the svn_client_ctx_t.
Accepts a Perl hash to set, which is what functions like
@@ -1509,11 +1507,11 @@ use SVN::Base qw(Client svn_client_commi
=over 8
-=item $citem-E<gt>path()
+=item $commit_item-E<gt>path()
Absolute working-copy path of item.
-=item $citem-E<gt>kind()
+=item $commit_item-E<gt>kind()
An integer representing the type of node it is (file/dir).
Can be one of the following constants:
@@ -1522,19 +1520,19 @@ $SVN::Node::file
$SVN::Node::dir
$SVN::Node::unknown
-=item $citem-E<gt>url()
+=item $commit_item-E<gt>url()
Commit URL for this item.
-=item $citem-E<gt>revision()
+=item $commit_item-E<gt>revision()
Revision (copyfrom_rev if state_flags has IS_COPY set).
-=item $citem-E<gt>copyform_url();
+=item $commit_item-E<gt>copyform_url();
CopyFrom URL
-=item $citem-E<gt>state_flags();
+=item $commit_item-E<gt>state_flags();
One of several state flags:
$SVN::Client::COMMIT_ITEM_ADD
@@ -1543,12 +1541,12 @@ $SVN::Client::COMMIT_ITEM_TEXT_MODS
$SVN::Client::COMMIT_ITEM_PROP_MODS
$SVN::Client::COMMIT_ITEM_IS_COPY
-=item $citem-E<gt>incoming_prop_changes()
+=item $commit_item-E<gt>incoming_prop_changes()
A reference to an array of svn_prop_t objects representing changes to
WC properties.
-=item $citem-E<gt>outgoing_prop_changes()
+=item $commit_item-E<gt>outgoing_prop_changes()
A reference to an array of svn_prop_t objects representing extra
changes to properties in the repository (which are not necessarily
@@ -1565,15 +1563,15 @@ use SVN::Base qw(Client svn_client_commi
=over 4
-=item $cinfo-E<gt>revision()
+=item $commit_info-E<gt>revision()
Just committed revision.
-=item $cinfo-E<gt>date()
+=item $commit_info-E<gt>date()
Server-Side date of the commit as a string.
-=item $cinfo-E<gt>author()
+=item $commit_info-E<gt>author()
Author of the commit.
@@ -1641,6 +1639,144 @@ File or dir?
=back
+=head2 ADDITIONAL METHODS
+
+The following methods work, but are not currently documented in this
+file. Please consult the svn_client.h section in the Subversion API
+for more details.
+
+=over 4
+
+=item $client-E<gt>add_to_changelist(...)
+
+=item $client-E<gt>blame2(...)
+
+=item $client-E<gt>blame3(...)
+
+=item $client-E<gt>blame4(...)
+
+=item $client-E<gt>cat2(...)
+
+=item $client-E<gt>commit2(...)
+
+=item $client-E<gt>commit3(...)
+
+=item $client-E<gt>commit4(...)
+
+=item $client-E<gt>copy2(...)
+
+=item $client-E<gt>copy3(...)
+
+=item $client-E<gt>copy4(...)
+
+=item $client-E<gt>create_context(...)
+
+=item $client-E<gt>delete2(...)
+
+=item $client-E<gt>delete3(...)
+
+=item $client-E<gt>diff2(...)
+
+=item $client-E<gt>diff3(...)
+
+=item $client-E<gt>diff4(...)
+
+=item $client-E<gt>diff_peg(...)
+
+=item $client-E<gt>diff_peg2(...)
+
+=item $client-E<gt>diff_peg3(...)
+
+=item $client-E<gt>diff_peg4(...)
+
+=item $client-E<gt>diff_summarize2(...)
+
+=item $client-E<gt>diff_summarize_dup(...)
+
+=item $client-E<gt>diff_summarize_peg(...)
+
+=item $client-E<gt>diff_summarize_peg2(...)
+
+=item $client-E<gt>export2(...)
+
+=item $client-E<gt>export3(...)
+
+=item $client-E<gt>export4(...)
+
+=item $client-E<gt>import2(...)
+
+=item $client-E<gt>import3(...)
+
+=item $client-E<gt>info2(...)
+
+=item $client-E<gt>invoke_blame_receiver(...)
+
+=item $client-E<gt>invoke_blame_receiver2(...)
+
+=item $client-E<gt>invoke_diff_summarize_func(...)
+
+=item $client-E<gt>list(...)
+
+=item $client-E<gt>list2(...)
+
+=item $client-E<gt>log2(...)
+
+=item $client-E<gt>log3(...)
+
+=item $client-E<gt>log4(...)
+
+=item $client-E<gt>log5(...)
+
+=item $client-E<gt>ls2(...)
+
+=item $client-E<gt>ls3(...)
+
+=item $client-E<gt>merge2(...)
+
+=item $client-E<gt>merge3(...)
+
+=item $client-E<gt>merge_peg(...)
+
+=item $client-E<gt>merge_peg2(...)
+
+=item $client-E<gt>merge_peg3(...)
+
+=item $client-E<gt>move2(...)
+
+=item $client-E<gt>move3(...)
+
+=item $client-E<gt>move4(...)
+
+=item $client-E<gt>move5(...)
+
+=item $client-E<gt>open_ra_session(...)
+
+=item $client-E<gt>propget2(...)
+
+=item $client-E<gt>propget3(...)
+
+=item $client-E<gt>proplist2(...)
+
+=item $client-E<gt>proplist3(...)
+
+=item $client-E<gt>propset2(...)
+
+=item $client-E<gt>propset3(...)
+
+=item $client-E<gt>remove_from_changelist(...)
+
+=item $client-E<gt>resolve(...)
+
+=item $client-E<gt>revert2(...)
+
+=item $client-E<gt>switch2(...)
+
+=item $client-E<gt>unlock(...)
+
+=item $client-E<gt>version(...)
+
+=back
+
=head1 TODO
* Better support for the config.
Modified: subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Core.pm
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Core.pm?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Core.pm (original)
+++ subversion/branches/fsfs-format7/subversion/bindings/swig/perl/native/Core.pm Wed Jun 5 12:40:27 2013
@@ -834,20 +834,20 @@ A revision, specified in one of C<SVN::C
=item $rev-E<gt>kind()
An enum denoting how the revision C<$rev> was specified. One of
-C<$VN::Core::opt_revision_unspecified>,
-C<$VN::Core::opt_revision_number>,
-C<$VN::Core::opt_revision_date>,
-C<$VN::Core::opt_revision_committed>,
-C<$VN::Core::opt_revision_previous>,
-C<$VN::Core::opt_revision_base>,
-C<$VN::Core::opt_revision_working>
+C<$SVN::Core::opt_revision_unspecified>,
+C<$SVN::Core::opt_revision_number>,
+C<$SVN::Core::opt_revision_date>,
+C<$SVN::Core::opt_revision_committed>,
+C<$SVN::Core::opt_revision_previous>,
+C<$SVN::Core::opt_revision_base>,
+C<$SVN::Core::opt_revision_working>
or C<$SVN::Core::opt_revision_head>.
=item $rev-E<gt>value()
Extra data about the revision. Only relevant if C<$rev-E<gt>kind> is
-C<$VN::Core::opt_revision_number> (where it contains the revision number)
-or C<$VN::Core::opt_revision_date> (where it contains a date).
+C<$SVN::Core::opt_revision_number> (where it contains the revision number)
+or C<$SVN::Core::opt_revision_date> (where it contains a date).
=back
Modified: subversion/branches/fsfs-format7/subversion/bindings/swig/ruby/test/windows_util.rb
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/bindings/swig/ruby/test/windows_util.rb?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/bindings/swig/ruby/test/windows_util.rb (original)
+++ subversion/branches/fsfs-format7/subversion/bindings/swig/ruby/test/windows_util.rb Wed Jun 5 12:40:27 2013
@@ -106,6 +106,7 @@ module SvnTestUtil
begin
Dir.chdir(path)
rescue Errno::ENOENT
+ next
end
found_targets = []
Modified: subversion/branches/fsfs-format7/subversion/include/private/svn_string_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/include/private/svn_string_private.h?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/include/private/svn_string_private.h (original)
+++ subversion/branches/fsfs-format7/subversion/include/private/svn_string_private.h Wed Jun 5 12:40:27 2013
@@ -142,7 +142,7 @@ svn__strtoff(apr_off_t *offset, const ch
* want to test for a more specific value range anyway.
*/
unsigned long
-svn__strtoul(const char *buffer, char **end);
+svn__strtoul(const char *buffer, const char **end);
/** Number of chars needed to represent signed (19 places + sign + NUL) or
* unsigned (20 places + NUL) integers as strings.
Modified: subversion/branches/fsfs-format7/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_client/merge.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_client/merge.c Wed Jun 5 12:40:27 2013
@@ -12307,6 +12307,12 @@ find_automatic_merge(svn_client__pathrev
SVN_ERR(svn_client__get_youngest_common_ancestor(
&s_t->yca, s_t->source, &s_t->target->loc, s_t->source_ra_session,
ctx, result_pool, result_pool));
+ if (! s_t->yca)
+ return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
+ _("'%s@%ld' must be ancestrally related to "
+ "'%s@%ld'"),
+ s_t->source->url, s_t->source->rev,
+ s_t->target->loc.url, s_t->target->loc.rev);
/* Find the latest revision of A synced to B and the latest
* revision of B synced to A.
@@ -12415,14 +12421,15 @@ client_find_automatic_merge(automatic_me
source_and_target_t *s_t = apr_palloc(result_pool, sizeof(*s_t));
automatic_merge_t *merge = apr_palloc(result_pool, sizeof(*merge));
- /* "Open" the target WC. We're not going to check the target WC for
- * mixed-rev, local mods or switched subtrees yet. After we find out
- * what kind of merge is required, then if a reintegrate-like merge is
- * required we'll do the stricter checks, in do_automatic_merge_locked(). */
+ /* "Open" the target WC. Check the target WC for mixed-rev, local mods and
+ * switched subtrees yet to faster exit and notify user before contacting
+ * with server. After we find out what kind of merge is required, then if a
+ * reintegrate-like merge is required we'll do the stricter checks, in
+ * do_automatic_merge_locked(). */
SVN_ERR(open_target_wc(&s_t->target, target_abspath,
- TRUE /*allow_mixed_rev*/,
- TRUE /*allow_local_mods*/,
- TRUE /*allow_switched_subtrees*/,
+ allow_mixed_rev,
+ allow_local_mods,
+ allow_switched_subtrees,
ctx, result_pool, scratch_pool));
/* Open RA sessions to the source and target trees. */
Modified: subversion/branches/fsfs-format7/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_diff/parse-diff.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_diff/parse-diff.c Wed Jun 5 12:40:27 2013
@@ -1146,8 +1146,9 @@ svn_diff_open_patch_file(svn_patch_file_
svn_patch_file_t *p;
p = apr_palloc(result_pool, sizeof(*p));
- SVN_ERR(svn_io_file_open(&p->apr_file, local_abspath, APR_READ,
- APR_OS_DEFAULT, result_pool));
+ SVN_ERR(svn_io_file_open(&p->apr_file, local_abspath,
+ APR_READ | APR_BUFFERED, APR_OS_DEFAULT,
+ result_pool));
p->next_patch_offset = 0;
*patch_file = p;
Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/revprops.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/revprops.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/revprops.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/revprops.c Wed Jun 5 12:40:27 2013
@@ -203,20 +203,15 @@ write_revprop_generation_file(svn_fs_t *
apr_int64_t current,
apr_pool_t *pool)
{
- apr_file_t *file;
- const char *tmp_path;
-
char buf[SVN_INT64_BUFFER_SIZE];
apr_size_t len = svn__i64toa(buf, current);
buf[len] = '\n';
- SVN_ERR(svn_io_open_unique_file3(&file, &tmp_path, fs->path,
- svn_io_file_del_none, pool, pool));
- SVN_ERR(svn_io_file_write_full(file, buf, len + 1, NULL, pool));
- SVN_ERR(svn_io_file_close(file, pool));
+ SVN_ERR(svn_io_write_atomic(path_revprop_generation(fs, pool),
+ buf, len + 1,
+ NULL /* copy_perms */, pool));
- return move_into_place(tmp_path, path_revprop_generation(fs, pool),
- tmp_path, pool);
+ return SVN_NO_ERROR;
}
/* Make sure the revprop_namespace member in FS is set. */
Modified: subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/util.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/util.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_fs_fs/util.c Wed Jun 5 12:40:27 2013
@@ -486,16 +486,16 @@ write_revnum_file(svn_fs_t *fs,
svn_revnum_t revnum,
apr_pool_t *scratch_pool)
{
- const char *final_path, *tmp_path;
- svn_stream_t *tmp_stream;
+ const char *final_path;
+ char buf[SVN_INT64_BUFFER_SIZE];
+ apr_size_t len = svn__i64toa(buf, revnum);
+ buf[len] = '\n';
final_path = path_min_unpacked_rev(fs, scratch_pool);
- SVN_ERR(svn_stream_open_unique(&tmp_stream, &tmp_path, fs->path,
- svn_io_file_del_none,
- scratch_pool, scratch_pool));
- SVN_ERR(svn_stream_printf(tmp_stream, scratch_pool, "%ld\n", revnum));
- SVN_ERR(svn_stream_close(tmp_stream));
- SVN_ERR(move_into_place(tmp_path, final_path, final_path, scratch_pool));
+
+ SVN_ERR(svn_io_write_atomic(final_path, buf, len + 1,
+ final_path /* copy_perms */, scratch_pool));
+
return SVN_NO_ERROR;
}
Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/commit.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/commit.c Wed Jun 5 12:40:27 2013
@@ -804,8 +804,18 @@ maybe_set_lock_token_header(serf_bucket_
if (token)
{
const char *token_header;
+ const char *token_uri;
+ apr_uri_t uri = commit_ctx->session->session_url;
- token_header = apr_pstrcat(pool, "(<", token, ">)", (char *)NULL);
+ /* Supplying the optional URI affects apache response when
+ the lock is broken, see issue 4369. When present any URI
+ must be absolute (RFC 2518 9.4). */
+ uri.path = (char *)svn_path_url_add_component2(uri.path, relpath,
+ pool);
+ token_uri = apr_uri_unparse(pool, &uri, 0);
+
+ token_header = apr_pstrcat(pool, "<", token_uri, "> (<", token, ">)",
+ (char *)NULL);
serf_bucket_headers_set(headers, "If", token_header);
}
}
Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/locks.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/locks.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/locks.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/locks.c Wed Jun 5 12:40:27 2013
@@ -214,29 +214,26 @@ static svn_error_t *
determine_error(svn_ra_serf__handler_t *handler,
svn_error_t *err)
{
- {
- apr_status_t errcode;
+ apr_status_t errcode;
- if (handler->sline.code == 423)
- errcode = SVN_ERR_FS_PATH_ALREADY_LOCKED;
- else if (handler->sline.code == 403)
- errcode = SVN_ERR_RA_DAV_FORBIDDEN;
- else
- return err;
-
- /* Client-side or server-side error already. Return it. */
- if (err != NULL)
- return err;
-
- /* The server did not send us a detailed human-readable error.
- Provide a generic error. */
- err = svn_error_createf(errcode, NULL,
- _("Lock request failed: %d %s"),
- handler->sline.code,
- handler->sline.reason);
- }
+ if (err)
+ return err;
- return err;
+ if (handler->sline.code == 200 || handler->sline.code == 207)
+ return SVN_NO_ERROR;
+ else if (handler->sline.code == 423)
+ errcode = SVN_ERR_FS_PATH_ALREADY_LOCKED;
+ else if (handler->sline.code == 403)
+ errcode = SVN_ERR_RA_DAV_FORBIDDEN;
+ else
+ errcode = SVN_ERR_RA_DAV_REQUEST_FAILED;
+
+ /* The server did not send us a detailed human-readable error.
+ Provide a generic error. */
+ return svn_error_createf(errcode, NULL,
+ _("Lock request failed: %d %s"),
+ handler->sline.code,
+ handler->sline.reason ? handler->sline.reason : "");
}
@@ -406,7 +403,7 @@ svn_ra_serf__get_lock(svn_ra_session_t *
lock_ctx->handler = handler;
err = svn_ra_serf__context_run_one(handler, pool);
- err = determine_error(handler, err);
+ err = svn_error_trace(determine_error(handler, err));
if (handler->sline.code == 404)
{
@@ -497,7 +494,7 @@ svn_ra_serf__lock(svn_ra_session_t *ra_s
lock_ctx->handler = handler;
err = svn_ra_serf__context_run_one(handler, iterpool);
- err = determine_error(handler, err);
+ err = svn_error_trace(determine_error(handler, err));
if (lock_func)
new_err = lock_func(lock_baton, lock_ctx->path, TRUE, lock_ctx->lock,
Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/ra_serf.h?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/ra_serf.h Wed Jun 5 12:40:27 2013
@@ -50,8 +50,8 @@ extern "C" {
/* Enforce the minimum version of serf. */
-#if !SERF_VERSION_AT_LEAST(0, 7, 1)
-#error Please update your version of serf to at least 0.7.1.
+#if !SERF_VERSION_AT_LEAST(1, 2, 1)
+#error Please update your version of serf to at least 1.2.1.
#endif
/** Use this to silence compiler warnings about unused parameters. */
Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/util.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_serf/util.c Wed Jun 5 12:40:27 2013
@@ -373,10 +373,8 @@ conn_setup(apr_socket_t *sock,
{
conn->ssl_context = serf_bucket_ssl_encrypt_context_get(*read_bkt);
-#if SERF_VERSION_AT_LEAST(1,0,0)
serf_ssl_set_hostname(conn->ssl_context,
conn->session->session_url.hostname);
-#endif
serf_ssl_client_cert_provider_set(conn->ssl_context,
svn_ra_serf__handle_client_cert,
@@ -642,7 +640,6 @@ setup_serf_req(serf_request_t *request,
{
serf_bucket_alloc_t *allocator = serf_request_get_alloc(request);
-#if SERF_VERSION_AT_LEAST(1, 1, 0)
svn_spillbuf_t *buf;
if (session->http10 && body_bkt != NULL)
@@ -665,7 +662,6 @@ setup_serf_req(serf_request_t *request,
request_pool,
scratch_pool);
}
-#endif
/* Create a request bucket. Note that this sucker is kind enough to
add a "Host" header for us. */
@@ -674,7 +670,6 @@ setup_serf_req(serf_request_t *request,
/* Set the Content-Length value. This will also trigger an HTTP/1.0
request (rather than the default chunked request). */
-#if SERF_VERSION_AT_LEAST(1, 1, 0)
if (session->http10)
{
if (body_bkt == NULL)
@@ -682,7 +677,6 @@ setup_serf_req(serf_request_t *request,
else
serf_bucket_request_set_CL(*req_bkt, svn_spillbuf__get_size(buf));
}
-#endif
*hdrs_bkt = serf_bucket_request_get_headers(*req_bkt);
@@ -696,10 +690,10 @@ setup_serf_req(serf_request_t *request,
serf_bucket_headers_setn(*hdrs_bkt, "Content-Type", content_type);
}
-#if SERF_VERSION_AT_LEAST(1, 1, 0)
if (session->http10)
+ {
serf_bucket_headers_setn(*hdrs_bkt, "Connection", "keep-alive");
-#endif
+ }
if (accept_encoding)
{
@@ -776,6 +770,8 @@ svn_ra_serf__context_run_wait(svn_boolea
SVN_ERR(err);
if (status)
{
+ /* ### This omits SVN_WARNING, and possibly relies on the fact that
+ ### MAX(SERF_ERROR_*) < SVN_ERR_BAD_CATEGORY_START? */
if (status >= SVN_ERR_BAD_CATEGORY_START && status < SVN_ERR_LAST)
{
/* apr can't translate subversion errors to text */
Modified: subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_ra_svn/marshal.c Wed Jun 5 12:40:27 2013
@@ -1025,7 +1025,6 @@ static svn_error_t *read_item(svn_ra_svn
{
char c = first_char;
apr_uint64_t val;
- svn_stringbuf_t *str;
svn_ra_svn_item_t *listitem;
if (++level >= ITEM_NESTING_LIMIT)
Modified: subversion/branches/fsfs-format7/subversion/libsvn_repos/reporter.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_repos/reporter.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_repos/reporter.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_repos/reporter.c Wed Jun 5 12:40:27 2013
@@ -1140,12 +1140,9 @@ delta_dirs(report_baton_t *b, svn_revnum
svn_boolean_t start_empty, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
- svn_fs_root_t *s_root;
apr_hash_t *s_entries = NULL, *t_entries;
apr_hash_index_t *hi;
apr_pool_t *subpool;
- const char *name, *s_fullpath, *t_fullpath, *e_fullpath;
- path_info_t *info;
apr_array_header_t *t_ordered_entries = NULL;
int i;
@@ -1162,6 +1159,8 @@ delta_dirs(report_baton_t *b, svn_revnum
/* Get the list of entries in each of source and target. */
if (s_path && !start_empty)
{
+ svn_fs_root_t *s_root;
+
SVN_ERR(get_source_root(b, &s_root, s_rev));
SVN_ERR(svn_fs_dir_entries(&s_entries, s_root, s_path, pool));
}
@@ -1172,6 +1171,8 @@ delta_dirs(report_baton_t *b, svn_revnum
while (1)
{
+ path_info_t *info;
+ const char *name, *s_fullpath, *t_fullpath, *e_fullpath;
const svn_fs_dirent_t *s_entry, *t_entry;
svn_pool_clear(subpool);
@@ -1199,10 +1200,9 @@ delta_dirs(report_baton_t *b, svn_revnum
t_fullpath = svn_fspath__join(t_path, name, subpool);
t_entry = svn_hash_gets(t_entries, name);
s_fullpath = s_path ? svn_fspath__join(s_path, name, subpool) : NULL;
- s_entry = s_entries ?
- svn_hash_gets(s_entries, name) : NULL;
+ s_entry = s_entries ? svn_hash_gets(s_entries, name) : NULL;
- /* The only special cases here are
+ /* The only special cases where we don't process the entry are
- When requested_depth is files but the reported path is
a directory. This is technically a client error, but we
@@ -1210,10 +1210,10 @@ delta_dirs(report_baton_t *b, svn_revnum
- When the reported depth is svn_depth_exclude.
*/
- if ((! info || info->depth != svn_depth_exclude)
- && (requested_depth != svn_depth_files
- || ((! t_entry || t_entry->kind != svn_node_dir)
- && (! s_entry || s_entry->kind != svn_node_dir))))
+ if (! ((requested_depth == svn_depth_files
+ && ((t_entry && t_entry->kind == svn_node_dir)
+ || (s_entry && s_entry->kind == svn_node_dir)))
+ || (info && info->depth == svn_depth_exclude)))
SVN_ERR(update_entry(b, s_rev, s_fullpath, s_entry, t_fullpath,
t_entry, dir_baton, e_fullpath, info,
info ? info->depth
@@ -1242,13 +1242,13 @@ delta_dirs(report_baton_t *b, svn_revnum
hi;
hi = apr_hash_next(hi))
{
- const svn_fs_dirent_t *s_entry;
+ const svn_fs_dirent_t *s_entry = svn__apr_hash_index_val(hi);
svn_pool_clear(subpool);
- s_entry = svn__apr_hash_index_val(hi);
if (svn_hash_gets(t_entries, s_entry->name) == NULL)
{
+ const char *e_fullpath;
svn_revnum_t deleted_rev;
if (s_entry->kind == svn_node_file
@@ -1281,10 +1281,12 @@ delta_dirs(report_baton_t *b, svn_revnum
t_entries, pool));
for (i = 0; i < t_ordered_entries->nelts; ++i)
{
- const svn_fs_dirent_t *s_entry, *t_entry;
+ const svn_fs_dirent_t *t_entry
+ = APR_ARRAY_IDX(t_ordered_entries, i, svn_fs_dirent_t *);
+ const svn_fs_dirent_t *s_entry;
+ const char *s_fullpath, *t_fullpath, *e_fullpath;
svn_pool_clear(subpool);
- t_entry = APR_ARRAY_IDX(t_ordered_entries, i, svn_fs_dirent_t *);
if (is_depth_upgrade(wc_depth, requested_depth, t_entry->kind))
{
@@ -1305,11 +1307,9 @@ delta_dirs(report_baton_t *b, svn_revnum
|| requested_depth == svn_depth_files))
continue;
- /* Look for an entry with the same name
- in the source dirents. */
+ /* Look for an entry with the same name in the source dirents. */
s_entry = s_entries ?
- svn_hash_gets(s_entries, t_entry->name)
- : NULL;
+ svn_hash_gets(s_entries, t_entry->name) : NULL;
s_fullpath = s_entry ?
svn_fspath__join(s_path, t_entry->name, subpool) : NULL;
}
@@ -1325,8 +1325,6 @@ delta_dirs(report_baton_t *b, svn_revnum
subpool));
}
-
- /* Destroy iteration subpool. */
svn_pool_destroy(subpool);
}
return SVN_NO_ERROR;
Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/config_file.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/config_file.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/config_file.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/config_file.c Wed Jun 5 12:40:27 2013
@@ -401,10 +401,13 @@ svn_config__parse_file(svn_config_t *cfg
svn_boolean_t must_exist, apr_pool_t *result_pool)
{
svn_error_t *err = SVN_NO_ERROR;
+ apr_file_t *apr_file;
svn_stream_t *stream;
apr_pool_t *scratch_pool = svn_pool_create(result_pool);
- err = svn_stream_open_readonly(&stream, file, scratch_pool, scratch_pool);
+ /* Use unbuffered IO since we use our own buffering. */
+ err = svn_io_file_open(&apr_file, file, APR_READ, APR_OS_DEFAULT,
+ scratch_pool);
if (! must_exist && err && APR_STATUS_IS_ENOENT(err->apr_err))
{
@@ -415,6 +418,7 @@ svn_config__parse_file(svn_config_t *cfg
else
SVN_ERR(err);
+ stream = svn_stream_from_aprfile2(apr_file, FALSE, scratch_pool);
err = svn_config__parse_stream(cfg, stream, result_pool, scratch_pool);
if (err != SVN_NO_ERROR)
Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/dirent_uri.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/dirent_uri.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/dirent_uri.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/dirent_uri.c Wed Jun 5 12:40:27 2013
@@ -1688,8 +1688,9 @@ svn_dirent_is_canonical(const char *dire
static svn_boolean_t
relpath_is_canonical(const char *relpath)
{
- const char *ptr = relpath;
+ const char *dot_pos, *ptr = relpath;
apr_size_t i, len;
+ unsigned pattern = 0;
/* RELPATH is canonical if it has:
* - no '.' segments
@@ -1713,16 +1714,23 @@ relpath_is_canonical(const char *relpath
if (ptr[len-1] == '/' || (ptr[len-1] == '.' && ptr[len-2] == '/'))
return FALSE;
+ /* '.' are rare. So, search for them globally. There will often be no
+ * more than one hit. Also note that we already checked for invalid
+ * starts and endings, i.e. we only need to check for "/./"
+ */
+ for (dot_pos = memchr(ptr, '.', len);
+ dot_pos;
+ dot_pos = strchr(dot_pos+1, '.'))
+ if (dot_pos > ptr && dot_pos[-1] == '/' && dot_pos[1] == '/')
+ return FALSE;
+
/* Now validate the rest of the path. */
for (i = 0; i < len - 1; ++i)
- if (ptr[i] == '/' && ptr[i+1] <= '/') /* '.' and '/' have smaller UTF-8
- codes than most other chars */
- {
- if (ptr[i+1] == '/')
- return FALSE; /* // */
- if (ptr[i+1] == '.' && ptr[i+2] == '/')
- return FALSE; /* /./ */
- }
+ {
+ pattern = ((pattern & 0xff) << 8) + (unsigned char)ptr[i];
+ if (pattern == 0x101 * (unsigned char)('/'))
+ return FALSE;
+ }
return TRUE;
}
Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/io.c Wed Jun 5 12:40:27 2013
@@ -2829,10 +2829,23 @@ svn_io_wait_for_cmd(apr_proc_t *cmd_proc
if (exitwhy)
*exitwhy = exitwhy_val;
+ else if (APR_PROC_CHECK_SIGNALED(exitwhy_val)
+ && APR_PROC_CHECK_CORE_DUMP(exitwhy_val))
+ return svn_error_createf
+ (SVN_ERR_EXTERNAL_PROGRAM, NULL,
+ _("Process '%s' failed (exitwhy %d, signal %d, core dumped)"),
+ cmd, exitwhy_val, exitcode_val);
+ else if (APR_PROC_CHECK_SIGNALED(exitwhy_val))
+ return svn_error_createf
+ (SVN_ERR_EXTERNAL_PROGRAM, NULL,
+ _("Process '%s' failed (exitwhy %d, signal %d)"),
+ cmd, exitwhy_val, exitcode_val);
else if (! APR_PROC_CHECK_EXIT(exitwhy_val))
+ /* Don't really know what happened here. */
return svn_error_createf
(SVN_ERR_EXTERNAL_PROGRAM, NULL,
- _("Process '%s' failed (exitwhy %d)"), cmd, exitwhy_val);
+ _("Process '%s' failed (exitwhy %d, exitcode %d)"),
+ cmd, exitwhy_val, exitcode_val);
if (exitcode)
*exitcode = exitcode_val;
Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/string.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/string.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/string.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/string.c Wed Jun 5 12:40:27 2013
@@ -1039,7 +1039,7 @@ svn__strtoff(apr_off_t *offset, const ch
}
unsigned long
-svn__strtoul(const char *buffer, char **end)
+svn__strtoul(const char* buffer, const char** end)
{
unsigned long result = 0;
@@ -1063,7 +1063,7 @@ svn__strtoul(const char *buffer, char **
++buffer;
}
- *end = (char *)buffer;
+ *end = buffer;
return result;
}
Modified: subversion/branches/fsfs-format7/subversion/libsvn_subr/types.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_subr/types.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_subr/types.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_subr/types.c Wed Jun 5 12:40:27 2013
@@ -39,7 +39,7 @@ svn_revnum_parse(svn_revnum_t *rev,
const char *str,
const char **endptr)
{
- char *end;
+ const char *end;
svn_revnum_t result = (svn_revnum_t)svn__strtoul(str, &end);
@@ -67,7 +67,7 @@ svn_revnum_parse(svn_revnum_t *rev,
if (*str > '2' || (apr_uint32_t)result > APR_INT32_MAX)
return svn_error_createf
(SVN_ERR_REVNUM_PARSE_FAILURE, NULL,
- _("Revision number too large or not normalized '%s'"), str);
+ _("Revision number too large '%s'"), str);
}
if (endptr)
Modified: subversion/branches/fsfs-format7/subversion/libsvn_wc/tree_conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_wc/tree_conflicts.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_wc/tree_conflicts.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_wc/tree_conflicts.c Wed Jun 5 12:40:27 2013
@@ -506,6 +506,8 @@ svn_wc__get_tree_conflict(const svn_wc_c
return SVN_NO_ERROR;
}
}
+
+ *tree_conflict = NULL;
return SVN_NO_ERROR;
}
Modified: subversion/branches/fsfs-format7/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/libsvn_wc/update_editor.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/fsfs-format7/subversion/libsvn_wc/update_editor.c Wed Jun 5 12:40:27 2013
@@ -1706,7 +1706,7 @@ delete_entry(const char *path,
const char *base = svn_relpath_basename(path, NULL);
const char *local_abspath;
const char *repos_relpath;
- svn_node_kind_t kind, base_kind;
+ svn_node_kind_t kind;
svn_revnum_t old_revision;
svn_boolean_t conflicted;
svn_boolean_t have_work;
@@ -1735,6 +1735,7 @@ delete_entry(const char *path,
{
svn_boolean_t is_root;
+
SVN_ERR(svn_wc__db_is_wcroot(&is_root, eb->db, local_abspath,
scratch_pool));
@@ -1762,10 +1763,9 @@ delete_entry(const char *path,
if (!have_work)
{
base_status = status;
- base_kind = kind;
}
else
- SVN_ERR(svn_wc__db_base_get_info(&base_status, &base_kind, &old_revision,
+ SVN_ERR(svn_wc__db_base_get_info(&base_status, NULL, &old_revision,
&repos_relpath,
NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL,
@@ -1836,9 +1836,7 @@ delete_entry(const char *path,
{
SVN_ERR(check_tree_conflict(&tree_conflict, eb, local_abspath,
status, TRUE,
- (kind == svn_node_dir)
- ? svn_node_dir
- : svn_node_file,
+ kind,
svn_wc_conflict_action_delete,
pb->pool, scratch_pool));
}
Modified: subversion/branches/fsfs-format7/subversion/mod_dav_svn/activity.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/mod_dav_svn/activity.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/mod_dav_svn/activity.c (original)
+++ subversion/branches/fsfs-format7/subversion/mod_dav_svn/activity.c Wed Jun 5 12:40:27 2013
@@ -193,7 +193,6 @@ dav_svn__store_activity(const dav_svn_re
const char *txn_name)
{
const char *final_path;
- const char *tmp_path;
const char *activity_contents;
svn_error_t *err;
Modified: subversion/branches/fsfs-format7/subversion/mod_dav_svn/lock.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/mod_dav_svn/lock.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/mod_dav_svn/lock.c (original)
+++ subversion/branches/fsfs-format7/subversion/mod_dav_svn/lock.c Wed Jun 5 12:40:27 2013
@@ -647,7 +647,7 @@ append_locks(dav_lockdb *lockdb,
/* We don't allow anonymous locks */
if (! repos->username)
- return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED,
+ return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock creation is not allowed.");
@@ -776,7 +776,7 @@ append_locks(dav_lockdb *lockdb,
if (serr && serr->apr_err == SVN_ERR_FS_NO_USER)
{
svn_error_clear(serr);
- return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED,
+ return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock creation is not allowed.");
}
@@ -886,7 +886,7 @@ remove_lock(dav_lockdb *lockdb,
if (serr && serr->apr_err == SVN_ERR_FS_NO_USER)
{
svn_error_clear(serr);
- return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED,
+ return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock removal is not allowed.");
}
@@ -953,7 +953,7 @@ refresh_locks(dav_lockdb *lockdb,
current lock on the incoming resource? */
if ((! slock)
|| (strcmp(token->uuid_str, slock->token) != 0))
- return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED,
+ return dav_svn__new_error(resource->pool, HTTP_PRECONDITION_FAILED,
DAV_ERR_LOCK_SAVE_LOCK,
"Lock refresh request doesn't match existing "
"lock.");
@@ -974,7 +974,7 @@ refresh_locks(dav_lockdb *lockdb,
if (serr && serr->apr_err == SVN_ERR_FS_NO_USER)
{
svn_error_clear(serr);
- return dav_svn__new_error(resource->pool, HTTP_UNAUTHORIZED,
+ return dav_svn__new_error(resource->pool, HTTP_NOT_IMPLEMENTED,
DAV_ERR_LOCK_SAVE_LOCK,
"Anonymous lock refreshing is not allowed.");
}
Modified: subversion/branches/fsfs-format7/subversion/svn/file-merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svn/file-merge.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svn/file-merge.c (original)
+++ subversion/branches/fsfs-format7/subversion/svn/file-merge.c Wed Jun 5 12:40:27 2013
@@ -853,13 +853,20 @@ svn_cl__merge_file(const char *base_path
const char *merged_file_name;
struct file_merge_baton fmb;
svn_boolean_t executable;
+ const char *merged_path_local_style;
+ const char *merged_rel_path;
+ const char *wc_path_local_style;
+ const char *wc_rel_path = svn_dirent_skip_ancestor(path_prefix, wc_path);
+
+ /* PATH_PREFIX may not be an ancestor of WC_PATH, just use the
+ full WC_PATH in that case. */
+ if (wc_rel_path)
+ wc_path_local_style = svn_dirent_local_style(wc_rel_path, scratch_pool);
+ else
+ wc_path_local_style = svn_dirent_local_style(wc_path, scratch_pool);
-
- SVN_ERR(svn_cmdline_printf(
- scratch_pool, _("Merging '%s'.\n"),
- svn_dirent_local_style(svn_dirent_skip_ancestor(path_prefix,
- wc_path),
- scratch_pool)));
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Merging '%s'.\n"),
+ wc_path_local_style));
SVN_ERR(svn_io_file_open(&original_file, base_path,
APR_READ | APR_BUFFERED,
@@ -905,29 +912,30 @@ svn_cl__merge_file(const char *base_path
if (fmb.abort_merge)
{
SVN_ERR(svn_io_remove_file2(merged_file_name, TRUE, scratch_pool));
- SVN_ERR(svn_cmdline_printf(
- scratch_pool, _("Merge of '%s' aborted.\n"),
- svn_dirent_local_style(svn_dirent_skip_ancestor(path_prefix,
- wc_path),
- scratch_pool)));
-
+ SVN_ERR(svn_cmdline_printf(scratch_pool, _("Merge of '%s' aborted.\n"),
+ wc_path_local_style));
return SVN_NO_ERROR;
}
SVN_ERR(svn_io_is_file_executable(&executable, merged_path, scratch_pool));
+
+ merged_rel_path = svn_dirent_skip_ancestor(path_prefix, merged_path);
+ if (merged_rel_path)
+ merged_path_local_style = svn_dirent_local_style(merged_rel_path,
+ scratch_pool);
+ else
+ merged_path_local_style = svn_dirent_local_style(merged_path,
+ scratch_pool);
+
SVN_ERR_W(svn_io_copy_file(merged_file_name, merged_path, FALSE,
scratch_pool),
apr_psprintf(scratch_pool,
_("Could not write merged result to '%s', saved "
"instead at '%s'.\n'%s' remains in conflict.\n"),
- svn_dirent_local_style(
- svn_dirent_skip_ancestor(path_prefix, merged_path),
- scratch_pool),
+ merged_path_local_style,
svn_dirent_local_style(merged_file_name,
scratch_pool),
- svn_dirent_local_style(
- svn_dirent_skip_ancestor(path_prefix, wc_path),
- scratch_pool)));
+ wc_path_local_style));
SVN_ERR(svn_io_set_file_executable(merged_path, executable, FALSE,
scratch_pool));
SVN_ERR(svn_io_remove_file2(merged_file_name, TRUE, scratch_pool));
@@ -941,15 +949,11 @@ svn_cl__merge_file(const char *base_path
SVN_ERR(svn_cmdline_printf(
scratch_pool,
_("Merge of '%s' completed (remains in conflict).\n"),
- svn_dirent_local_style(svn_dirent_skip_ancestor(path_prefix,
- wc_path),
- scratch_pool)));
+ wc_path_local_style));
else
SVN_ERR(svn_cmdline_printf(
scratch_pool, _("Merge of '%s' completed.\n"),
- svn_dirent_local_style(svn_dirent_skip_ancestor(path_prefix,
- wc_path),
- scratch_pool)));
+ wc_path_local_style));
return SVN_NO_ERROR;
}
Modified: subversion/branches/fsfs-format7/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/svnserve/serve.c?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/svnserve/serve.c (original)
+++ subversion/branches/fsfs-format7/subversion/svnserve/serve.c Wed Jun 5 12:40:27 2013
@@ -2090,7 +2090,6 @@ static svn_error_t *log_receiver(void *b
svn_ra_svn_conn_t *conn = b->conn;
apr_hash_index_t *h;
svn_boolean_t invalid_revnum = FALSE;
- char action[2];
const svn_string_t *author, *date, *message;
apr_uint64_t revprop_count;
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/lock_tests.py Wed Jun 5 12:40:27 2013
@@ -1815,6 +1815,31 @@ def lock_unlock_deleted(sbox):
expected_status.tweak('A/mu', writelocked=None)
svntest.actions.run_and_verify_status(wc_dir, expected_status)
+@Issue(4369)
+def commit_stolen_lock(sbox):
+ "commit with a stolen lock"
+
+ sbox.build()
+ wc_dir = sbox.wc_dir
+
+ sbox.simple_append('A/mu', 'zig-zag')
+ sbox.simple_lock('A/mu')
+
+ expected_output = '\'mu\' locked by user \'jrandom\'.'
+ svntest.actions.run_and_verify_svn(None, expected_output, [],
+ 'lock', '--force',
+ sbox.repo_url + '/A/mu')
+
+ expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
+ expected_status.tweak('A/mu', status='M ', writelocked='T')
+ err_re = "(.*E160037: Cannot verify lock on path '/A/mu')|" + \
+ "(.*E160038: '/.*/A/mu': no lock token available)"
+ svntest.actions.run_and_verify_commit(wc_dir,
+ [],
+ expected_status,
+ err_re,
+ wc_dir)
+
########################################################################
# Run the tests
@@ -1866,6 +1891,7 @@ test_list = [ None,
lock_multi_wc,
locks_stick_over_switch,
lock_unlock_deleted,
+ commit_stolen_lock,
]
if __name__ == '__main__':
Modified: subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/sandbox.py
URL: http://svn.apache.org/viewvc/subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/sandbox.py?rev=1489839&r1=1489838&r2=1489839&view=diff
==============================================================================
--- subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/sandbox.py (original)
+++ subversion/branches/fsfs-format7/subversion/tests/cmdline/svntest/sandbox.py Wed Jun 5 12:40:27 2013
@@ -362,6 +362,13 @@ class Sandbox:
DEST is a relpath relative to the WC."""
open(self.ospath(dest), truncate and 'w' or 'a').write(contents)
+ def simple_lock(self, *targets):
+ """Lock TARGETS in the WC.
+ TARGETS are relpaths relative to the WC."""
+ assert len(targets) > 0
+ targets = self.ospaths(targets)
+ svntest.main.run_svn(False, 'lock', *targets)
+
def is_url(target):
return (target.startswith('^/')