File Coverage

blib/lib/SVN/Friendly/Client.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1 1     1   47802 use strict;
  1         2  
  1         37  
2 1     1   5 use warnings;
  1         2  
  1         96  
3             package SVN::Friendly::Client;
4             my $CLASS = __PACKAGE__;
5              
6             #--------------------------------------------------------------------
7             # Note: this method apparently must return 0 to indicate "no error".
8             # Returning undef results in a "Use of uninitialized value in
9             # subroutine entry" warning.
10              
11             our $SYSTEM_DIR_REGEX= qr((?:^|\/)\.svn$);
12              
13             #--------------------------------------------------------------------
14 1     1   6 use Scalar::Util; # looks_like_a_number
  1         7  
  1         92  
15 1     1   6 use File::Spec; # curdir, see also addParents
  1         1  
  1         20  
16 1     1   440 use SVN::Wc; # needed for fs type/notify constants
  0            
  0            
17             use SVN::Client; # needed for SVN::_Client::svn_client_xxx
18              
19             use SVN::Friendly::Utils qw(_shiftBoolean _shiftVisitor);
20             use SVN::Friendly::Dates;
21              
22             use SVN::Friendly::Config;
23             my $CONFIG_CLASS='SVN::Friendly::Config';
24              
25             #--------------------------------------------------------------------
26             use SVN::Friendly::Exceptions qw(makeErrorHandler);
27             my $EXCEPTIONS = 'SVN::Friendly::Exceptions';
28              
29             #--------------------------------------------------------------------
30             # Fill in missing constants
31             #--------------------------------------------------------------------
32              
33             {
34             # this 2 line wierdness is needed to keep Module::Build from adding
35             # this package to the META.yaml provides list
36             package
37             SVN::Friendly::List::Fields;
38             use SVN::Base qw(Core SVN_DIRENT_);
39             #for some reason this didn't make it into the SWIG bindings,
40             #not at least, the version packaged for Debian-Etch.
41             our $ALL=0xFFFFF;
42             }
43              
44             {
45             # this 2 line wierdness is needed to keep Module::Build from adding
46             # this package to the META.yaml provides list
47             package
48             SVN::Wc::Notify::Action;
49             our $locked = $SVN::Wc::notify_locked;
50             our $unlocked = $SVN::Wc::notify_unlocked;
51             our $failed_lock = $SVN::Wc::notify_failed_lock;
52             our $failed_unlock = $SVN::Wc::notify_failed_unlock;
53              
54             # these constants seem not be be defined in the 1.5 bindings
55             # changeliset_set doesn't get defined even in wc
56              
57             our $exists = $SVN::Wc::notify_exists;
58             #print STDERR "exists=$exists\n";
59             #our $changelist_set = $SVN::_Core::svn_notify_changelist_set;
60             our $changelist_set = 26;
61             our $changelist_clear = $SVN::Wc::notify_changelist_clear;
62             our $changelist_moved = $SVN::Wc::notify_changelist_moved;
63             our $merge_begin = $SVN::Wc::notify_merge_begin;
64             our $foreign_merge_begin = $SVN::Wc::notify_foreign_merge_begin;
65             our $update_replace = $SVN::Wc::notify_update_replace;
66             }
67              
68             {
69             # this 2 line wierdness is needed to keep Module::Build from adding
70             # this package to the META.yaml provides list
71             package
72             SVN::_Core;
73             # svn_cmdline.h says that encoding (at least for the command line)
74             # defaults to APR_LOCALE_CHARSET, which Apache Portable Runtime
75             # Library documentation says is 1, to indicate that the current
76             # locale should be used. The apr.i file in the SWIG bindings do
77             # not have a mappig for this and 1 causes exceptions. We're setting
78             # this to 'UTF-8' in lieu of the proper value.
79              
80             #our $svn_locale_charset = 1;
81             our $svn_locale_charset = 'UTF-8';
82             }
83              
84             # These are needed to set defaults, but aren't in the 1.4.6 SWIG
85             # bindings. We define them here because Perl won't compile without
86             # definitions. The values are taken from the C-API header files.
87              
88             # taken from svn_types.h
89             {
90             # this 2 line wierdness is needed to keep Module::Build from adding
91             # this package to the META.yaml provides list
92             package
93             SVN::Depth;
94              
95             our $infinity = 3;
96             our $empty = 0;
97             }
98              
99             #----------------------------------------------------------------
100             # Log messages
101             #----------------------------------------------------------------
102              
103             # this variable is localized with the value of the log message
104             # it should never be set outside of that context
105             # see: configureLogMessage(), commit(), copy(), delete(), import()
106             # mkdir(), propdel(), propset()
107              
108             our $LOG_MESSAGE;
109              
110             #----------------------------------------------------------------
111             # Authentication
112             #----------------------------------------------------------------
113              
114             # Providers that don't need any user interaction, placed in order
115             # of complexity of information needed
116             #
117             # - username_provider = user name only
118             # - simple_provider = name + password
119             # - ssl_server_trust = ssl certificate, server side
120             # - ssl_client_cert = ssl certificate, client side
121             # - ssl_client_cert_pw = ssl certificate, client side + password
122             #
123             # These are all initialized with the global pool
124              
125             our $SILENT_AUTH_BATON
126             = SVN::Core::auth_open(
127             [ SVN::Client::get_username_provider()
128             , SVN::Client::get_simple_provider()
129             , SVN::Client::get_ssl_server_trust_file_provider()
130             , SVN::Client::get_ssl_client_cert_file_provider()
131             , SVN::Client::get_ssl_client_cert_pw_file_provider()
132             ]);
133              
134             use constant {
135             ALL => 0
136             , USERNAME => 0
137             , USERNAME_PW => 1
138             , SIMPLE => 1 # svn api name for USERNAME_PW
139             , SSL_SERVER => 2
140             , SSL_CLIENT => 3
141             , SSL_CLIENT_PW => 4
142             , LAST => 4
143             };
144              
145             my $PROVIDER_FACTS
146             = [[ 'username'
147             ,\&SVN::Client::get_username_provider
148             ,\&SVN::Client::get_username_prompt_provider ]
149             ,['username_pw'
150             ,\&SVN::Client::get_simple_provider
151             ,\&SVN::Client::get_simple_prompt_provider ]
152             ,['ssl_server'
153             ,\&SVN::Client::get_ssl_server_trust_file_provider
154             , \&SVN::Client::get_ssl_server_trust_prompt_provider]
155             ,['ssl_client'
156             ,\&SVN::Client::get_ssl_client_cert_file_provider
157             , \&SVN::Client::get_ssl_client_cert_prompt_provider]
158             ,['ssl_client_pw'
159             ,\&SVN::Client::get_ssl_client_cert_pw_file_provider
160             , \&SVN::Client::get_ssl_client_cert_pw_prompt_provider]
161             ];
162              
163             #----------------------------------------------------------------
164             # Notification
165             #----------------------------------------------------------------
166              
167             our %ACTIONS
168             = ( $SVN::Wc::Notify::Action::add
169             => 'schedule: add'
170             , $SVN::Wc::Notify::Action::copy
171             => 'schedule: copy'
172             , $SVN::Wc::Notify::Action::delete
173             => 'schedule: delete'
174              
175             , $SVN::Wc::Notify::Action::restore
176             => 'revert: deleted file restored'
177             , $SVN::Wc::Notify::Action::revert
178             => 'revert: addition/modification undone'
179             , $SVN::Wc::Notify::Action::failed_revert
180             => 'revert: failed'
181              
182             , $SVN::Wc::Notify::Action::resolved
183             => 'resolved'
184              
185             , $SVN::Wc::Notify::Action::skip
186             => 'log: skip'
187             , $SVN::Wc::Notify::Action::update_add
188             => 'update: add'
189             , $SVN::Wc::Notify::Action::update_update
190             => 'update: update'
191             , $SVN::Wc::Notify::Action::update_delete
192             => 'update: delete'
193             , $SVN::Wc::Notify::Action::update_external
194             => 'update: external'
195             , $SVN::Wc::Notify::Action::update_completed
196             => 'update: completed'
197              
198             , $SVN::Wc::Notify::Action::status_external
199             => 'status: external'
200             , $SVN::Wc::Notify::Action::status_completed
201             => 'status: completed'
202              
203             , $SVN::Wc::Notify::Action::commit_added
204             => 'commit: added'
205             , $SVN::Wc::Notify::Action::commit_modified
206             => 'commit: modified'
207             , $SVN::Wc::Notify::Action::commit_deleted
208             => 'commit: deleted'
209             , $SVN::Wc::Notify::Action::commit_replaced
210             => 'commit: replaced'
211             , $SVN::Wc::Notify::Action::commit_postfix_txdelta
212             => 'commit: transmitting delta'
213              
214             , $SVN::Wc::Notify::Action::blame_revision
215             => 'blame: revision'
216              
217             , $SVN::Wc::Notify::Action::locked
218             => 'locked: suceeded'
219             , $SVN::Wc::Notify::Action::unlocked
220             => 'unlocked: suceeded'
221             , $SVN::Wc::Notify::Action::failed_lock
222             => 'lock: failed'
223             , $SVN::Wc::Notify::Action::failed_unlock
224             => 'unlock: failed'
225             );
226              
227              
228             #print STDERR $SVN::Core::VER_MINOR . "\n";
229             if (1 <= $SVN::Core::VER_MAJOR) {
230             if (5 <= $SVN::Core::VER_MINOR) {
231             $ACTIONS{$SVN::Wc::Notify::Action::exists}
232             = 'schedule: tried to add existing path';
233             $ACTIONS{$SVN::Wc::Notify::Action::changelist_set}
234             = 'schedule: set changelist';
235             $ACTIONS{$SVN::Wc::Notify::Action::changelist_clear}
236             = 'schedule: clear changelist';
237             $ACTIONS{$SVN::Wc::Notify::Action::changelist_moved}
238             = 'schedule: path has moved to new changelist';
239              
240             $ACTIONS{$SVN::Wc::Notify::Action::merge_begin}
241             = 'merge: begin';
242             $ACTIONS{$SVN::Wc::Notify::Action::foreign_merge_begin}
243             = 'merge: begin external';
244              
245             $ACTIONS{$SVN::Wc::Notify::Action::update_replace}
246             = 'update: replace';
247             }
248              
249             if (6 <= $SVN::Core::VER_MINOR) {
250             $ACTIONS{$SVN::Wc::Notify::Action::property_added}
251             = 'schedule: add property';
252             $ACTIONS{$SVN::Wc::Notify::Action::property_modified}
253             = 'schedule: modify property';
254             $ACTIONS{$SVN::Wc::Notify::Action::property_deleted}
255             = 'schedule: delete property';
256             $ACTIONS{$SVN::Wc::Notify::Action::property_deleted_nonexistant}
257             = 'schedule: delete property';
258             $ACTIONS{$SVN::Wc::Notify::Action::merge_completed}
259             = 'merge: completed';
260             }
261             }
262              
263             sub getActionAsString { $ACTIONS{$_[1]}; }
264              
265             #--------------------------------------------------------------------
266             # Additional text equivalents to constants, for testng purposes
267             #--------------------------------------------------------------------
268              
269             my %STATUS =
270             ( $SVN::Wc::Status::none => 'none'
271             , $SVN::Wc::Status::unversioned => 'unversioned'
272             , $SVN::Wc::Status::normal => 'exists'
273             , $SVN::Wc::Status::added => 'added'
274             , $SVN::Wc::Status::missing => 'missing'
275             , $SVN::Wc::Status::deleted => 'deleted'
276             , $SVN::Wc::Status::replaced => 'replaced'
277             , $SVN::Wc::Status::modified => 'modified'
278             , $SVN::Wc::Status::merged => 'merged'
279             , $SVN::Wc::Status::conflicted => 'conflicted'
280             , $SVN::Wc::Status::ignored => 'ignored'
281             , $SVN::Wc::Status::obstructed => 'obstructed'
282             , $SVN::Wc::Status::external => 'external'
283             , $SVN::Wc::Status::incomplete => 'incomplete'
284             );
285             sub getStatusAsString { $STATUS{$_[1]}; }
286              
287             my %STATE =
288             ( $SVN::Wc::notify_state_inapplicable => 'na'
289             , $SVN::Wc::Notify::State::unknown => 'unknown'
290             , $SVN::Wc::Notify::State::unchanged => 'unchanged'
291             , $SVN::Wc::Notify::State::missing => 'missing'
292             , $SVN::Wc::Notify::State::obstructed => 'obstructed'
293             , $SVN::Wc::Notify::State::changed => 'changed'
294             , $SVN::Wc::Notify::State::merged => 'merged'
295             , $SVN::Wc::Notify::State::conflicted => 'conflicted'
296             );
297             sub getStateAsString { $STATE{$_[1]} }
298              
299             my %SCHEDULE =
300             ( $SVN::Wc::Schedule::normal => 'normal'
301             , $SVN::Wc::Schedule::add => 'add'
302             , $SVN::Wc::Schedule::delete => 'delete'
303             , $SVN::Wc::Schedule::replace => 'replace'
304             );
305             sub getScheduledOpAsString { $SCHEDULE{$_[1]} }
306              
307             my %KIND =
308             ( $SVN::Node::none => 'none'
309             , $SVN::Node::file => 'file'
310             , $SVN::Node::dir => 'dir'
311             , $SVN::Node::unknown => 'unknown'
312             );
313             sub getKindAsString { $KIND{$_[1]} }
314              
315             #--------------------------------------------------------------------
316             # Text equivalents to objects
317             #--------------------------------------------------------------------
318              
319             sub getDirEntryString($;$$) {
320             my (undef, $sPath, $oDirEntry, $iPrecision) = @_;
321             return $sPath unless defined($oDirEntry);
322              
323             #long listing
324             my $iKind = $oDirEntry->kind();
325             my $sKind = $iKind == $SVN::Node::file
326             ? 'f' : ($iKind == $SVN::Node::dir ? 'd' : '-');
327             my $sProps = ($oDirEntry->has_props() ? 'p' : '-');
328             my $sTime = SVN::Friendly::Dates::getISO8601Time
329             ($oDirEntry->time(), $iPrecision);
330              
331             return sprintf("%5s %s %8s %8s %s %s\n"
332             , $oDirEntry->created_rev()
333             , $sKind . $sProps
334             , $oDirEntry->last_author()
335             , $oDirEntry->size()
336             , $sTime, $sPath);
337             }
338              
339             #==================================================================
340             # CLASS METHODS
341             #==================================================================
342              
343             sub new {
344             my ($sClass, $xAuth, $xConfig, $xNotify, $crLogMsg, $crCancel
345             , $oPool) = @_;
346             $oPool = new SVN::Pool() unless defined($oPool);
347              
348             my $self = bless({}, $sClass);
349             $self->{ctx} = SVN::_Client::svn_client_create_context ();
350              
351             $self->configureAuthentication($xAuth);
352             $self->setConfig($xConfig);
353             $self->configureNotification($xNotify);
354             $self->configureLogMessage($crLogMsg);
355             $self->configureCancellation($crCancel);
356             $self->setPool($oPool);
357             return $self;
358             }
359              
360             #==================================================================
361             # OBJECT METHODS - non-overridable
362             #==================================================================
363              
364             #----------------------------------------------------------------
365              
366             sub getWorkingCopyRevision {
367             my ($self, $sWc) = @_;
368              
369             my ($iCurrentRev, $iLastChangedRev);
370             my $crInfo = sub {
371             my ($sWc, $oInfo, $oPool) = @_;
372             $iCurrentRev = $oInfo->rev();
373             $iLastChangedRev = $oInfo->last_changed_rev();
374             };
375             $self->info($sWc, $crInfo);
376             return [$iCurrentRev, $iLastChangedRev];
377             }
378              
379             #----------------------------------------------------------------
380              
381             sub getWorkingCopyDirStatus {
382             my ($self, $sWc) = @_;
383             my $iStatus = $SVN::Wc::Status::unversioned;
384             #print STDERR "getWorkingCopyDir: <$sWc>\n";
385              
386             local $SVN::Error::handler = makeErrorHandler
387             (sub {
388             my $iErr = $_[0]->apr_err();
389             #print STDERR "error no: $iErr\n";
390             if ($iErr eq $SVN::Error::RA_ILLEGAL_URL) {
391             #$SVN::Error::RA_ILLEGAL_URL appears to be thrown when
392             #$sWc is added but not committed
393             $iStatus = $SVN::Wc::Status::added;
394             return 1; #don't croak - we know added
395              
396             } elsif ($iErr eq $SVN::Error::ENTRY_MISSING_URL) {
397             #$SVN::Error::ENTRY_MISSING_URL appears to be thrown when
398             #$sWc is not added, but parent of $sWc is added and
399             #committed
400             return 1; #don't croak - we know unversioned
401              
402             } elsif ($iErr eq $SVN::Error::WC_NOT_DIRECTORY) {
403             #$SVN::Error::WC_NOT_DIRECTORY appears to be thrown when
404             #$sWc is not added, and immediate parent of $sWc is not
405             #a working directory
406             return 1; #don't croak - we know unversioned
407              
408             } else {
409             return 0; #croak - don't know what went wrong
410             }
411             });
412              
413             my $crInfo = sub {
414             my ($sWc, $oInfo, $oPool) = @_;
415             $iStatus = $SVN::Wc::Status::normal
416             unless ($oInfo->kind() eq $SVN::Node::unknown);
417             };
418              
419             $self->info($sWc, $crInfo);
420             #print STDERR "getWorkingCopyDir: <$sWc> <$iStatus>\n";
421             return $iStatus;
422             }
423              
424             #----------------------------------------------------------------
425             sub isWorkingCopyPath {
426             #print STDERR "isWorkingCopyPath:<$SVN::Wc::Status::unversioned>\n";
427             return getWorkingCopyDirStatus(@_) eq $SVN::Wc::Status::unversioned
428             ? 0 : 1;
429             }
430              
431             #----------------------------------------------------------------
432              
433             sub printStatus {
434             my ($self, $sWc, $fh) = @_;
435             my $crStatus = sub {
436             my ($sWc, $oStatus) = @_;
437              
438             #Note: only 1.2+ API (status2) supports flag to indicate whether
439             #file is locked in the repository. The locked flag returned by
440             #locked() really should be frozen or interrupted. It refers to
441             #file that are "locked" because their modifications have only
442             #been partially stored in the repository.
443              
444             my $iTextStatus = $oStatus->text_status();
445             my $iPropStatus = $oStatus->prop_status();
446             my $sStatus = sprintf("%-11s %-11s %s\n"
447             , $SVN::Friendly::Client::STATUS{$iTextStatus}
448             , $SVN::Friendly::Client::STATUS{$iPropStatus}
449             , $sWc);
450             print $fh $sStatus;
451             };
452             $self->status($sWc, $crStatus);
453             }
454              
455             #----------------------------------------------------------------
456              
457             sub add1_1 {
458             my $self = shift @_;
459             my $sWc = _shiftWcPath(\@_);
460             my $bRecurse = _shiftRecurse(\@_);
461             my $oPool = $self->_shiftPool(\@_);
462              
463             return SVN::_Client::svn_client_add
464             ($sWc, $bRecurse, $self->{ctx}, $oPool);
465             }
466              
467             sub add1_4 {
468             my $self = shift @_;
469             my $sWc = _shiftWcPath(\@_);
470             my $bRecurse = _shiftRecurse(\@_);
471             my $bForceAdd = _shiftBoolean(\@_);
472             my $bNoIgnore = _shiftBoolean(\@_);
473             my $oPool = $self->_shiftPool(\@_);
474              
475             #bForceAdd - descend into versioned dirs
476             # skip versioned files silently
477              
478             return SVN::_Client::svn_client_add3
479             ($sWc, $bRecurse, $bForceAdd, $bNoIgnore
480             , $self->{ctx}, $oPool);
481             }
482              
483             sub add1_5 {
484             my $self = shift @_;
485             my $sWc = _shiftWcPath(\@_);
486             my $iDepth = _shiftDepth(\@_);
487             my $bForceAdd = _shiftBoolean(\@_);
488             my $bNoIgnore = _shiftBoolean(\@_);
489             my $bAddParents = _shiftBoolean(\@_);
490             my $oPool = $self->_shiftPool(\@_);
491              
492             #bForceAdd - descend into versioned dirs
493             # skip versioned files silently
494              
495             return SVN::_Client::svn_client_add4
496             ($sWc, $iDepth, $bForceAdd, $bNoIgnore, $bAddParents
497             , $self->{ctx}, $oPool);
498             }
499              
500             *add1_6 = *add1_5;
501             *add1_7 = *add1_7;
502             *add = *add1_1;
503              
504             #----------------------------------------------------------------
505              
506             sub blame1_1 {
507             my $self = shift @_;
508             my $xRepos = _shiftTarget(\@_);
509             my ($xStart, $xEnd) = _shiftRange(\@_);
510             my $crVisit = _shiftVisitor(\@_);
511             my $oPool = $self->_shiftPool(\@_);
512              
513             #Despite the fact that the usage string includes a baton,
514             #the actual method expects it to be omitted from the parameter
515             #list
516              
517             return SVN::_Client::svn_client_blame
518             ($xRepos, $xStart, $xEnd, $crVisit, $self->{ctx}, $oPool);
519             }
520              
521             sub blame1_4 {
522             my $self = shift @_;
523             my $xRepos = _shiftTarget(\@_);
524             my $xPeg = _shiftPeg(\@_);
525             my ($xStart, $xEnd) = _shiftRange(\@_, $xPeg);
526             my $oDiffOptions = shift @_;
527             my $bBlameBinary = _shiftBoolean(\@_);
528             my $crVisit = _shiftVisitor(\@_);
529             my $oPool = $self->_shiftPool(\@_);
530              
531             #Despite the fact that the usage string includes a baton,
532             #the actual method expects it to be omitted from the parameter
533             #list
534              
535             $oDiffOptions = SVN::_Core::svn_diff_file_options_create($oPool)
536             unless defined($oDiffOptions);
537              
538             return SVN::_Client::svn_client_blame3
539             ($xRepos, $xPeg, $xStart, $xEnd
540             , $oDiffOptions, $bBlameBinary, $crVisit
541             , $self->{ctx}, $oPool);
542             }
543              
544             sub blame1_5 {
545             my $self = shift @_;
546             my $xRepos = _shiftTarget(\@_);
547             my $xPeg = _shiftPeg(\@_);
548             my ($xStart, $xEnd) = _shiftRange(\@_);
549             my $oDiffOptions = shift @_;
550             my $bBlameBinary = _shiftBoolean(\@_);
551             my $bIncludeMergedRevisions = _shiftBoolean(\@_);
552             my $crVisit = _shiftVisitor(\@_);
553             my $oPool = $self->_shiftPool(\@_);
554              
555             #Despite the fact that the usage string includes a baton,
556             #the actual method expects it to be omitted from the parameter
557             #list
558              
559             $oDiffOptions = SVN::_Core::svn_diff_file_options_create($oPool)
560             unless defined($oDiffOptions);
561              
562             return SVN::_Client::svn_client_blame4
563             ($xRepos, $xPeg, $xStart, $xEnd, $bBlameBinary
564             , $bIncludeMergedRevisions, $crVisit, $self->{ctx}, $oPool);
565             }
566              
567             sub blame1_6 {
568             my $self = shift @_;
569             my $xRepos = _shiftTarget(\@_);
570             my $xPeg = _shiftPeg(\@_);
571             my ($xStart, $xEnd) = _shiftRange(\@_);
572             my $oDiffOptions = shift @_;
573             my $bBlameBinary = _shiftBoolean(\@_);
574             my $bIncludeMergedRevisions = _shiftBoolean(\@_);
575             my $crVisit = _shiftVisitor(\@_);
576             my $oPool = $self->_shiftPool(\@_);
577              
578             #Despite the fact that the usage string includes a baton,
579             #the actual method expects it to be omitted from the parameter
580             #list
581              
582             $oDiffOptions = SVN::_Core::svn_diff_file_options_create($oPool)
583             unless defined($oDiffOptions);
584              
585             return SVN::_Client::svn_client_blame5
586             ($xRepos, $xPeg, $xStart, $xEnd, $bBlameBinary
587             , $bIncludeMergedRevisions, $crVisit, $self->{ctx}, $oPool);
588             }
589              
590             *blame1_7 = *blame1_6;
591             *blame = *blame1_1;
592              
593             #----------------------------------------------------------------
594              
595             sub cat1_1 {
596             my $self = shift @_;
597             my $fh = _shiftOutFile(\@_);
598             my $xRepos = _shiftTarget(\@_);
599             my $xPeg = _shiftPeg(\@_);
600             my $oPool = $self->_shiftPool(\@_);
601              
602             return SVN::_Client::svn_client_cat
603             ($fh, $xRepos, $xPeg, $self->{ctx}, $oPool);
604             }
605              
606             sub cat1_4($;$$$) {
607             my $self = shift @_;
608             my $fh = _shiftOutFile(\@_);
609             my $xRepos = _shiftTarget(\@_);
610             my ($xPeg, $xRev) = _shiftPegRev(\@_);
611             my $oPool = $self->_shiftPool(\@_);
612              
613             return SVN::_Client::svn_client_cat2
614             ($fh, $xRepos, $xPeg, $xRev, $self->{ctx}, $oPool);
615             }
616              
617             *cat1_5 = *cat1_4;
618             *cat1_6 = *cat1_4;
619             *cat1_7 = *cat1_4;
620              
621             sub cat {
622             my $self = shift @_;
623             my $xRepos = _shiftTarget(\@_);
624             my $xPeg = _shiftPeg(\@_);
625             my $fh = _shiftOutFile(\@_);
626             my $oPool = $self->_shiftPool(\@_);
627              
628             return SVN::_Client::svn_client_cat
629             ($fh, $xRepos, $xPeg, $self->{ctx}, $oPool);
630             }
631              
632             #----------------------------------------------------------------
633              
634             sub checkout1_1 {
635             my $self = shift @_;
636             my $xRepos = _shiftTarget(\@_);
637             my $sWc = _shiftWcPath(\@_);
638             my $xPeg = _shiftPeg(\@_);
639             my $bRecurse = _shiftRecurse(\@_);
640             my $oPool = $self->_shiftPool(\@_);
641              
642             return SVN::_Client::svn_client_checkout
643             ($xRepos, $sWc, $xPeg, $bRecurse, $self->{ctx}, $oPool);
644             }
645              
646             sub checkout1_4 {
647             my $self = shift @_;
648             my $xRepos = _shiftTarget(\@_);
649             my $sWc = _shiftWcPath(\@_);
650             my ($xPeg, $xTargetRev) = _shiftPegRev(\@_);
651             my $bRecurse = _shiftRecurse(\@_);
652             my $bSkipExternals = _shiftBoolean(\@_);
653             my $oPool = $self->_shiftPool(\@_);
654              
655             return SVN::_Client::svn_client_checkout2
656             ($xRepos, $sWc, $xPeg, $xTargetRev, $bRecurse, $bSkipExternals
657             , $self->{ctx}, $oPool);
658             }
659              
660             sub checkout1_5 {
661             my $self = shift @_;
662             my $xRepos = _shiftTarget(\@_);
663             my $sWc = _shiftWcPath(\@_);
664             my ($xPeg, $xTargetRev) = _shiftPegRev(\@_);
665             my $iDepth = _shiftDepth(\@_);
666             my $bSkipExternals = _shiftBoolean(\@_);
667             my $bAllowUnversionedObstructions = _shiftBoolean(\@_);
668             my $oPool = $self->_shiftPool(\@_);
669              
670             return SVN::_Client::svn_client_checkout3
671             ($xRepos, $sWc, $xPeg, $xTargetRev, $iDepth, $bSkipExternals
672             , $bAllowUnversionedObstructions, $self->{ctx}, $oPool);
673             }
674              
675             *checkout1_6 = *checkout1_5;
676             *checkout1_7 = *checkout1_5;
677              
678             sub checkout {
679             my $self = shift @_;
680             my $xRepos = _shiftTarget(\@_);
681             my $xPeg = _shiftPeg(\@_);
682             my $sWc = _shiftWcPath(\@_);
683             my $bRecurse = _shiftRecurse(\@_);
684             my $oPool = $self->_shiftPool(\@_);
685              
686             return SVN::_Client::svn_client_checkout
687             ($xRepos, $sWc, $xPeg, $bRecurse, $self->{ctx}, $oPool);
688             }
689              
690             #----------------------------------------------------------------
691              
692             sub cleanup1_1 {
693             my $self = shift @_;
694             my $sWc = _shiftWcPath(\@_);
695             my $oPool = $self->_shiftPool(\@_);
696              
697             return SVN::_Client::svn_client_cleanup
698             ($sWc, $self->{ctx}, $oPool);
699             }
700              
701             *cleanup1_4 = *cleanup1_1;
702             *cleanup1_5 = *cleanup1_1;
703             *cleanup1_6 = *cleanup1_1;
704             *cleanup1_7 = *cleanup1_1;
705             *cleanup = *cleanup1_1;
706              
707             #----------------------------------------------------------------
708              
709             sub commit1_1 {
710             my $self = shift @_;
711             my $aWcs = _shiftWcPaths(\@_);
712             local $LOG_MESSAGE = _shiftString(\@_);
713             my $bNonRecursive = _shiftBoolean(\@_);
714             my $oPool = $self->_shiftPool(\@_);
715              
716             # in the subversion bindings for 1.5, this method returns a
717             # svn_client_commit_info_t object with revision set to -1. In earlier
718             # releases of the subversion bindins it returned undef. To make the
719             # behavior consistent between releases we check the return value.
720              
721             my $xResult = SVN::_Client::svn_client_commit
722             ($aWcs, $bNonRecursive, $self->{ctx}, $oPool);
723             return ref($xResult) && ($xResult->revision >= 0) ? $xResult : undef;
724             }
725              
726             sub commit1_4 {
727             my $self = shift @_;
728             my $aWcs = _shiftWcPaths(\@_);
729             local $LOG_MESSAGE = _shiftString(\@_);
730             my $bRecurse = _shiftRecurse(\@_);
731             my $bKeepLocks = _shiftBoolean(\@_);
732             my $oPool = $self->_shiftPool(\@_);
733              
734             return SVN::_Client::svn_client_commit3
735             ($aWcs, $bRecurse, $bKeepLocks, $self->{ctx}, $oPool);
736             }
737              
738             sub commit1_5 {
739             my $self = shift @_;
740             my $aWcs = _shiftWcPaths(\@_);
741             local $LOG_MESSAGE = _shiftString(\@_);
742             my $iDepth = _shiftDepth(\@_);
743             my $bKeepLocks = _shiftBoolean(\@_);
744             my $bKeepChangelists = _shiftBoolean(\@_);
745             my $aChangeLists = _shiftArray(\@_);
746             my $hRevProps = _shiftHash(\@_);
747             my $oPool = $self->_shiftPool(\@_);
748              
749             return SVN::_Client::svn_client_commit4
750             ($aWcs, $iDepth, $bKeepLocks, $bKeepChangelists, $aChangeLists
751             , $hRevProps, $self->{ctx}, $oPool);
752             }
753              
754             *commit1_6 = *commit1_5;
755              
756             sub commit1_7 {
757             my $self = shift @_;
758             my $aWcs = _shiftWcPaths(\@_);
759             local $LOG_MESSAGE = _shiftString(\@_);
760             my $iDepth = _shiftDepth(\@_);
761             my $bKeepLocks = _shiftBoolean(\@_);
762             my $bKeepChangelists = _shiftBoolean(\@_);
763             my $aChangeLists = _shiftArray(\@_);
764             my $hRevProps = _shiftHash(\@_);
765             my $crCommit = _shiftVisitor(\@_);
766             my $oPool = $self->_shiftPool(\@_);
767              
768             return SVN::_Client::svn_client_commit4
769             ($aWcs, $iDepth, $bKeepLocks, $bKeepChangelists, $aChangeLists
770             , $hRevProps, $crCommit, $self->{ctx}, $oPool);
771             }
772              
773             sub commit {
774             my $self = shift @_;
775             my $aWcs = _shiftWcPaths(\@_);
776             local $LOG_MESSAGE = _shiftString(\@_);
777             my $bRecurse = _shiftRecurse(\@_);
778             my $oPool = $self->_shiftPool(\@_);
779              
780             # in the subversion bindings for 1.5, this method returns a
781             # svn_client_commit_info_t object with revision set to -1. In earlier
782             # releases of the subversion bindins it returned undef. To make the
783             # behavior consistent between releases we check the return value.
784              
785             my $xResult = SVN::_Client::svn_client_commit
786             ($aWcs, $bRecurse?0:1, $self->{ctx}, $oPool);
787             return ref($xResult) && ($xResult->revision >= 0) ? $xResult : undef;
788             }
789              
790             #--------------------------------------------------------------------
791              
792             sub configureAuthentication {
793             my ($self, $oAuthBaton) = @_;
794             my $sRef=ref($oAuthBaton);
795             my $acrPrompters;
796              
797             if (!defined($oAuthBaton)) {
798             $oAuthBaton = $SILENT_AUTH_BATON;
799             $acrPrompters = [];
800             } elsif ($sRef eq '_p_svn_auth_baton_t') {
801             $acrPrompters = [];
802             } elsif ($sRef eq 'ARRAY') {
803             ($oAuthBaton, $acrPrompters)
804             = SVN::Core::auth_open_helper($oAuthBaton);
805              
806             } elsif ($sRef eq 'HASH') {
807             my $hProps = $oAuthBaton;
808             my $oPool = $hProps->{pool};
809             my $iRetries = $hProps->{retries};
810             $iRetries = 3 unless defined($iRetries);
811              
812             my $xProviders = $hProps->{providers};
813             my $aProviders = !defined($xProviders)
814             ? $PROVIDER_FACTS
815             : ref($xProviders)
816             ? [ @$PROVIDER_FACTS[@$xProviders] ]
817             : [ @$PROVIDER_FACTS[$xProviders..LAST]];
818              
819             my $aAuth = [];
820             foreach (@$aProviders) {
821             my ($k, $crSilent, $crPrompt) = @$_;
822              
823             my $aData = exists($hProps->{$k}) ? $hProps->{$k} : undef;
824             if (!defined($aData) && ($k eq 'username_pw')) {
825             # simple is an alias for username_pw
826             $k='simple';
827             $aData = exists($hProps->{$k}) ? $hProps->{$k} : undef;
828             }
829             $aData = [ $aData, undef ] if (ref($aData) eq 'CODE');
830              
831             my ($crCallback, $bNoSilent) = defined($aData) ? @$aData : ();
832              
833             #printf STDERR "k=$k, prompt=%s silent=%s\n"
834             # , (defined($crCallback)?$crCallback:'undef')
835             # , ($bNoSilent ? 0 : 1);
836              
837             push @$aAuth, $crSilent->($oPool) unless $bNoSilent;
838              
839             if (defined($crCallback)) {
840             my $oProvider = $k eq 'ssl_server'
841             ? $crPrompt->($crCallback, $oPool)
842             : $crPrompt->($crCallback, $iRetries, $oPool);
843             push @$aAuth, $oProvider;
844             }
845              
846             }
847             ($oAuthBaton, $acrPrompters)= SVN::Core::auth_open_helper($aAuth);
848             } else {
849             die $EXCEPTIONS->ERR_BAD_ARG
850             ->new(arg => $oAuthBaton, reason=>"Configuration object must "
851             . "be a hash reference, array of providers, "
852             . "authentication baton, or undefined");
853             }
854              
855             # Not sure why the callbacks need to be held onto, perhaps to keep
856             # the reference from being garbage cleaned? In any case,
857             # SVN::Client does this, so we shall too.
858              
859             $self->{ctx}->auth_baton($oAuthBaton);
860             $self->{auth_callbacks} = $acrPrompters;
861             return ($self->{ctx}->auth_baton(), $self->{auth_callbacks});
862             }
863              
864             #--------------------------------------------------------------------
865              
866             sub configureCancellation {
867             my ($self, $crCancel) = @_;
868             if (defined($crCancel) && (ref($crCancel) ne 'CODE')) {
869             die $EXCEPTIONS->ERR_BAD_ARG->new(arg => $crCancel, reason => "Cancel "
870             ."callback must be undefined a code reference");
871             }
872             $self->{cancel} =$self->{ctx}->cancel_baton($crCancel);
873             return $crCancel;
874             }
875              
876             #--------------------------------------------------------------------
877              
878             sub configureLogMessage {
879             my ($self, $crLogMsg) = @_;
880             my $crWrapper;
881              
882             if (defined($crLogMsg)) {
883             if (ref($crLogMsg) eq 'CODE') {
884             $crWrapper = sub {
885             my ($rMsg, $sTmpFile, $aCommit, $oPool) = @_;
886             $$rMsg = $LOG_MESSAGE;
887             return defined($crLogMsg)
888             ? $crLogMsg->($rMsg, $sTmpFile, $aCommit, $oPool) : 0;
889             };
890             } else {
891             die $EXCEPTIONS->ERR_BAD_ARG->new(arg => $crLogMsg, reason => "Log message "
892             . "callback must be undefined, a hash, or a code reference");
893             }
894             } else {
895             $crWrapper = sub {
896             die $EXCEPTIONS->ERR_NO_LOG_MSG->new()
897             unless defined($LOG_MESSAGE);
898             ${$_[0]} = $LOG_MESSAGE;
899             }
900             }
901              
902             # in subversion bindings for 1.4, the method availble is log_msg_baton
903             # subversion bindings for 1.5 appear to have changed the signature so
904             # that the second parameter is *void and it fails. We have to use
905             # log_msg_baton3 instead
906              
907             $self->{log_msg_wrapper}
908             = (($SVN::Core::VER_MAJOR==1) && ($SVN::Core::VER_MINOR < 5))
909             ? $self->{ctx}->log_msg_baton($crWrapper)
910             : $self->{ctx}->log_msg_baton3($crWrapper);
911              
912             $self->{log_msg} = $crLogMsg;
913             return $crLogMsg;
914             }
915              
916             #--------------------------------------------------------------------
917              
918             sub configureNotification {
919             my ($self,$crNotify) = @_;
920             if (defined($crNotify)) {
921             my $sRef = ref($crNotify);
922             if ($sRef eq 'HASH') {
923             my $hActions = $crNotify;
924             $crNotify = sub {
925             #my ($sPath, $iAction, $iKind, $sMime,$iState,$iRevision)=@_;
926             return _notifyFromHash($hActions, @_);
927             };
928             } elsif ($sRef ne 'CODE') {
929             die $EXCEPTIONS->ERR_BAD_ARG->new(arg => $crNotify, reason => "Notification "
930             . "callback must be undefined, a hash, or a code reference");
931             }
932             }
933             $self->{notify} =$self->{ctx}->notify_baton($crNotify);
934             return $crNotify;
935             }
936              
937             #--------------------------------------------------------------------
938             # command line:
939             # - can't copy to an uncommited directory
940             # * not smart enough to add the directory
941             # - can't copy an uncommited file
942             # * not smart enough to convert copy X to Y to add Y
943             # - can't copy over an existing file
944             # * no parameter to force overwrite
945             #
946             # - copying a file to X and deleting X and replacing it with a
947             # dir of the same name before commit will result
948             # in an inconsistent working copy state that can only be fixed
949             # by running "svn update X". even deleting the dir and running
950             # just plain "svn update" will not work
951             #
952             # ==> copy only: file (w/ or w/o mod) to non-existing file
953             # file (w/ or w/o mod) to committed dir
954             #
955             # to copy X to Y and then schedule copy
956             # method A:
957             # - in repository: copy from-HEAD to-HEAD
958             # - rename Y to tmpfile (to avoid can't update complaints)
959             # - update Y (bring copy down from server
960             # - copy tmpfile to Y (restore changes, now viewed as "mod")
961             # - commit change
962             # Notes:
963             # - adding before update doesn't help, still won't update
964             # - committing before update doesn't help, won't commit
965             # - there is no force flag
966             # - why doesn't this just merge or treat as conflict?
967             #
968              
969             sub copy1_1 {
970             my $self = shift @_;
971             my $sTarget = _shiftTarget(\@_);
972             my $xPeg = _shiftPeg(\@_, 1);
973             my $sTo = _shiftTarget(\@_);
974             local $LOG_MESSAGE = _shiftString(\@_);
975             my $oPool = $self->_shiftPool(\@_);
976              
977             #print STDERR "copy: <$sTarget> <$sTo>\n";
978              
979             return SVN::_Client::svn_client_copy
980             ($sTarget, $xPeg, $sTo, $self->{ctx}, $oPool);
981             }
982              
983             sub copy1_4 {
984             my $self = shift @_;
985             my $sTarget = _shiftTarget(\@_);
986             my $xPeg = _shiftPeg(\@_, 1);
987             my $sTo = _shiftTarget(\@_);
988             local $LOG_MESSAGE = _shiftString(\@_);
989             my $oPool = $self->_shiftPool(\@_);
990              
991             return SVN::_Client::svn_client_copy3
992             ($sTarget, $xPeg, $sTo, $self->{ctx}, $oPool);
993             }
994              
995              
996             sub copy1_5 {
997             my $self = shift @_;
998             my $aTargets = _shiftTargets(\@_);
999             my $xPeg = _shiftPeg(\@_, 1);
1000             my $sTo = _shiftTarget(\@_);
1001             local $LOG_MESSAGE = _shiftString(\@_);
1002             my $bCopyAsChild = _shiftBoolean(\@_);
1003             my $bMakeParents = _shiftBoolean(\@_);
1004             my $hRevProps = _shiftHash(\@_);
1005             my $oPool = $self->_shiftPool(\@_);
1006              
1007             return SVN::_Client::svn_client_copy4
1008             ($aTargets, $xPeg, $sTo, $bCopyAsChild, $bMakeParents
1009             , $hRevProps, $self->{ctx}, $oPool);
1010             }
1011              
1012             sub copy1_6 {
1013             my $self = shift @_;
1014             my $aTargets = _shiftTargets(\@_);
1015             my $xPeg = _shiftPeg(\@_, 1);
1016             my $sTo = _shiftTarget(\@_);
1017             local $LOG_MESSAGE = _shiftString(\@_);
1018             my $bCopyAsChild = _shiftBoolean(\@_);
1019             my $bMakeParents = _shiftBoolean(\@_);
1020             my $hRevProps = _shiftHash(\@_);
1021             my $oPool = $self->_shiftPool(\@_);
1022              
1023             return SVN::_Client::svn_client_copy5
1024             ($aTargets, $xPeg, $sTo, $bCopyAsChild, $bMakeParents
1025             , $hRevProps, $self->{ctx}, $oPool);
1026             }
1027              
1028             sub copy1_7 {
1029             my $self = shift @_;
1030             my $aTargets = _shiftTargets(\@_);
1031             my $xPeg = _shiftPeg(\@_, 1);
1032             my $sTo = _shiftTarget(\@_);
1033             local $LOG_MESSAGE = _shiftString(\@_);
1034             my $bCopyAsChild = _shiftBoolean(\@_);
1035             my $bMakeParents = _shiftBoolean(\@_);
1036             my $hRevProps = _shiftHash(\@_);
1037             my $crCommit = _shiftVisitor(\@_);
1038             my $oPool = $self->_shiftPool(\@_);
1039              
1040             return SVN::_Client::svn_client_copy6
1041             ($aTargets, $xPeg, $sTo, $bCopyAsChild, $bMakeParents
1042             , $hRevProps, $crCommit, $self->{ctx}, $oPool);
1043             }
1044              
1045             *copy = *copy1_1;
1046              
1047             #----------------------------------------------------------------
1048             # delete after add - only allowed with force=true
1049             # delete after mod - only allowed with force=true
1050             # delete, then add - fails, won't restore
1051             # delete, then update - fails, won't restore
1052             # delete, then copy from repository to current
1053             # - only way to restore failed delete, marked as replacement
1054              
1055             sub delete1_1 {
1056             my $self = shift @_;
1057             my $xTargets = _shiftTargets(\@_);
1058             local $LOG_MESSAGE = _shiftString(\@_);
1059             my $bForce = _shiftBoolean(\@_);
1060             my $oPool = $self->_shiftPool(\@_);
1061              
1062             return SVN::_Client::svn_client_delete
1063             ($xTargets, $bForce, $self->{ctx}, $oPool);
1064             }
1065              
1066             sub delete1_4 {
1067             my $self = shift @_;
1068             my $xTargets = _shiftTargets(\@_);
1069             local $LOG_MESSAGE = _shiftString(\@_);
1070             my $bForce = _shiftBoolean(\@_);
1071             my $oPool = $self->_shiftPool(\@_);
1072              
1073             return SVN::_Client::svn_client_delete2
1074             ($xTargets, $bForce, $self->{ctx}, $oPool);
1075             }
1076              
1077             sub delete1_5 {
1078             my $self = shift @_;
1079             my $xTargets = _shiftTargets(\@_);
1080             local $LOG_MESSAGE = _shiftString(\@_);
1081             my $bForce = _shiftBoolean(\@_);
1082             my $bKeepLocal = _shiftBoolean(\@_);
1083             my $hRevProps = _shiftHash(\@_);
1084             my $oPool = $self->_shiftPool(\@_);
1085              
1086             return SVN::_Client::svn_client_delete3
1087             ($xTargets, $bForce, $bKeepLocal, $hRevProps, $self->{ctx}
1088             , $oPool);
1089             }
1090              
1091             *delete1_6 = *delete1_5;
1092              
1093             sub delete1_7 {
1094             my $self = shift @_;
1095             my $xTargets = _shiftTargets(\@_);
1096             local $LOG_MESSAGE = _shiftString(\@_);
1097             my $bForce = _shiftBoolean(\@_);
1098             my $bKeepLocal = _shiftBoolean(\@_);
1099             my $hRevProps = _shiftHash(\@_);
1100             my $crCommit = _shiftVisitor(\@_);
1101             my $oPool = $self->_shiftPool(\@_);
1102              
1103             return SVN::_Client::svn_client_delete4
1104             ($xTargets, $bForce, $bKeepLocal, $hRevProps, $crCommit
1105             , $self->{ctx}, $oPool);
1106             }
1107              
1108             *delete = *delete1_1;
1109              
1110             #----------------------------------------------------------------
1111              
1112             sub diff1_1 {
1113             my $self = shift @_;
1114             my $aCmdLineOptions = _shiftArray(\@_);
1115             my ($xTarget1, $xPeg1
1116             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_);
1117             my $bRecurse = _shiftRecurse(\@_);
1118             my $bIgnoreAncestry = _shiftBoolean(\@_);
1119             my $bIgnoreDeleted = _shiftBoolean(\@_);
1120             my $xOutFile = _shiftOutFile(\@_);
1121             my $xErrFile = _shiftErrFile(\@_);
1122             my $oPool = $self->_shiftPool(\@_);
1123              
1124             return SVN::_Client::svn_client_diff
1125             ($aCmdLineOptions, $xTarget1, $xPeg1, $xTarget2, $xPeg2
1126             , $bRecurse, $bIgnoreAncestry, $bIgnoreDeleted
1127             , $xOutFile, $xErrFile, $self->{ctx}, $oPool);
1128             }
1129              
1130             sub diff1_4 {
1131             my $self = shift @_;
1132             my $aCmdLineOptions = _shiftArray(\@_);
1133             my ($xTarget1, $xPeg1
1134             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_);
1135             my $bRecurse = _shiftRecurse(\@_);
1136             my $bIgnoreAncestry = _shiftBoolean(\@_);
1137             my $bIgnoreDeleted = _shiftBoolean(\@_);
1138             my $bDiffBinary = _shiftBoolean(\@_);
1139             my $sHeaderEncoding = _shiftOutputEncoding(\@_);
1140             my $xOutFile = _shiftOutFile(\@_);
1141             my $xErrFile = _shiftErrFile(\@_);
1142             my $oPool = $self->_shiftPool(\@_);
1143              
1144             return SVN::_Client::svn_client_diff3
1145             ($aCmdLineOptions, $xTarget1, $xPeg1, $xTarget2, $xPeg2
1146             , $bRecurse, $bIgnoreAncestry, $bIgnoreDeleted
1147             , $bDiffBinary, $sHeaderEncoding
1148             , $xOutFile, $xErrFile, $self->{ctx}, $oPool);
1149             }
1150              
1151             sub diff1_5 {
1152             my $self = shift @_;
1153             my $aCmdLineOptions = _shiftArray(\@_);
1154             my ($xTarget1, $xPeg1
1155             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_);
1156             my $bRelativeToDir = _shiftBoolean(\@_);
1157             my $iDepth = _shiftDepth(\@_);
1158             my $bIgnoreAncestry = _shiftBoolean(\@_);
1159             my $bIgnoreDeleted = _shiftBoolean(\@_);
1160             my $bDiffBinary = _shiftBoolean(\@_);
1161             my $sHeaderEncoding = _shiftOutputEncoding(\@_);
1162             my $xOutFile = _shiftOutFile(\@_);
1163             my $xErrFile = _shiftErrFile(\@_);
1164             my $aChangeLists = _shiftArray(\@_);
1165             my $oPool = $self->_shiftPool(\@_);
1166              
1167              
1168             return SVN::_Client::svn_client_diff4
1169             ($aCmdLineOptions, $xTarget1, $xPeg1, $xTarget2, $xPeg2
1170             , $bRelativeToDir, $iDepth, $bIgnoreAncestry, $bIgnoreDeleted
1171             , $bDiffBinary, $sHeaderEncoding, $xOutFile, $xErrFile
1172             , $aChangeLists, $self->{ctx}, $oPool);
1173             }
1174              
1175             *diff1_6 = *diff1_5;
1176              
1177             sub diff1_7 {
1178             my $self = shift @_;
1179             my $aCmdLineOptions = _shiftArray(\@_);
1180             my ($xTarget1, $xPeg1
1181             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_);
1182             my $bRelativeToDir = _shiftBoolean(\@_);
1183             my $iDepth = _shiftDepth(\@_);
1184             my $bIgnoreAncestry = _shiftBoolean(\@_);
1185             my $bIgnoreDeleted = _shiftBoolean(\@_);
1186             my $bShowCopiesAsAdds = _shiftBoolean(\@_);
1187             my $bDiffBinary = _shiftBoolean(\@_);
1188             my $bUseGitDiffFormat = _shiftBoolean(\@_);
1189             my $sHeaderEncoding = _shiftOutputEncoding(\@_);
1190             my $xOutFile = _shiftOutFile(\@_);
1191             my $xErrFile = _shiftErrFile(\@_);
1192             my $aChangeLists = _shiftArray(\@_);
1193             my $oPool = $self->_shiftPool(\@_);
1194              
1195              
1196             return SVN::_Client::svn_client_diff5
1197             ($aCmdLineOptions, $xTarget1, $xPeg1, $xTarget2, $xPeg2
1198             , $bRelativeToDir, $iDepth, $bIgnoreAncestry, $bIgnoreDeleted
1199             , $bShowCopiesAsAdds, $bDiffBinary, $bUseGitDiffFormat
1200             , $sHeaderEncoding, $xOutFile, $xErrFile
1201             , $aChangeLists, $self->{ctx}, $oPool);
1202             }
1203              
1204             sub diff {
1205             my $self = shift @_;
1206             my ($xTarget1, $xPeg1
1207             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_);
1208             my $bRecurse = _shiftRecurse(\@_);
1209             my $aCmdLineOptions = _shiftArray(\@_);
1210             my $bIgnoreAncestry = _shiftBoolean(\@_);
1211             my $bIgnoreDeleted = _shiftBoolean(\@_);
1212             my $xOutFile = _shiftOutFile(\@_);
1213             my $xErrFile = _shiftErrFile(\@_);
1214             my $oPool = $self->_shiftPool(\@_);
1215              
1216             return SVN::_Client::svn_client_diff
1217             ($aCmdLineOptions, $xTarget1, $xPeg1, $xTarget2, $xPeg2
1218             , $bRecurse, $bIgnoreAncestry, $bIgnoreDeleted
1219             , $xOutFile, $xErrFile, $self->{ctx}, $oPool);
1220             }
1221              
1222             #----------------------------------------------------------------
1223              
1224             sub export1_1 {
1225             my $self = shift @_;
1226             my $xTarget = _shiftTarget(\@_);
1227             my $xToPath = _shiftWcPath(\@_);
1228             my $xPeg = _shiftPeg(\@_, 1);
1229             my $bOverwrite = _shiftBoolean(\@_);
1230             my $sNativeEol = _shiftOutputEol(\@_);
1231             my $oPool = $self->_shiftPool(\@_);
1232              
1233             return SVN::_Client::svn_client_export2
1234             ($xTarget, $xToPath, $xPeg, $bOverwrite, $sNativeEol
1235             , $self->{ctx}, $oPool);
1236             }
1237              
1238             sub export1_4 {
1239             my $self = shift @_;
1240             my $xTarget = _shiftTarget(\@_);
1241             my $xToPath = _shiftWcPath(\@_);
1242             my ($xPeg, $xRev) = _shiftPegRev(\@_, 1);
1243             my $bOverwrite = _shiftBoolean(\@_);
1244             my $bSkipExternals = _shiftBoolean(\@_);
1245             my $bRecurse = _shiftRecurse(\@_);
1246             my $sNativeEol = _shiftOutputEol(\@_);
1247             my $oPool = $self->_shiftPool(\@_);
1248              
1249             return SVN::_Client::svn_client_export3
1250             ($xTarget, $xToPath, $xPeg, $xRev, $bOverwrite, $bSkipExternals
1251             , $bRecurse, $sNativeEol, $self->{ctx}, $oPool);
1252             }
1253              
1254              
1255             sub export1_5 {
1256             my $self = shift @_;
1257             my $xTarget = _shiftTarget(\@_);
1258             my $xToPath = _shiftWcPath(\@_);
1259             my ($xPeg, $xRev) = _shiftPegRev(\@_, 1);
1260             my $bOverwrite = _shiftBoolean(\@_);
1261             my $bSkipExternals = _shiftBoolean(\@_);
1262             my $iDepth = _shiftDepth(\@_);
1263             my $sNativeEol = _shiftOutputEol(\@_);
1264             my $oPool = $self->_shiftPool(\@_);
1265              
1266             return SVN::_Client::svn_client_export4
1267             ($xTarget, $xToPath, $xPeg, $xRev, $bOverwrite, $bSkipExternals
1268             , $iDepth, $sNativeEol, $self->{ctx}, $oPool);
1269             }
1270              
1271             *export1_6=*export1_5;
1272              
1273             sub export1_7 {
1274             my $self = shift @_;
1275             my $xTarget = _shiftTarget(\@_);
1276             my $xToPath = _shiftWcPath(\@_);
1277             my ($xPeg, $xRev) = _shiftPegRev(\@_, 1);
1278             my $bOverwrite = _shiftBoolean(\@_);
1279             my $bSkipExternals = _shiftBoolean(\@_);
1280             my $bIgnoreKeywords = _shiftBoolean(\@_);
1281             my $iDepth = _shiftDepth(\@_);
1282             my $sNativeEol = _shiftOutputEol(\@_);
1283             my $oPool = $self->_shiftPool(\@_);
1284              
1285             return SVN::_Client::svn_client_export5
1286             ($xTarget, $xToPath, $xPeg, $xRev, $bOverwrite, $bSkipExternals
1287             , $bIgnoreKeywords, $iDepth, $sNativeEol, $self->{ctx}, $oPool);
1288             }
1289              
1290             sub export {
1291             my $self = shift @_;
1292             my $xTarget = _shiftTarget(\@_);
1293             my $xPeg = _shiftPeg(\@_, 1);
1294             my $xToPath = _shiftWcPath(\@_);
1295             my $bOverwrite = _shiftBoolean(\@_);
1296             my $sNativeEol = _shiftOutputEol(\@_);
1297             my $oPool = $self->_shiftPool(\@_);
1298              
1299             return SVN::_Client::svn_client_export2
1300             ($xTarget, $xToPath, $xPeg, $bOverwrite, $sNativeEol
1301             , $self->{ctx}, $oPool);
1302             }
1303             #---------------------------------------------------------------------
1304              
1305             sub getAuthentication {
1306             my $self = $_[0];
1307             return ($self->{ctx}->auth_baton(), $self->{auth_callbacks});
1308             }
1309             #---------------------------------------------------------------------
1310              
1311             sub getCancellationCallback {
1312             my $crCancel = $_[0]->{cancel};
1313             return defined($crCancel) ? $$crCancel : undef;
1314             }
1315              
1316             #---------------------------------------------------------------------
1317              
1318             sub getConfig { return $CONFIG_CLASS->new($_[0]->{ctx}->config()); }
1319              
1320             #---------------------------------------------------------------------
1321              
1322             sub getInfo {
1323             my ($self, $sWc, $xPeg, $oPool) = @_;
1324             my $oInfo;
1325             my $crVisit = sub { $oInfo=$_[1] };
1326             $self->info($sWc, $xPeg, $crVisit, 0, $oPool);
1327             return $oInfo;
1328             }
1329              
1330             #---------------------------------------------------------------------
1331              
1332             sub getLogMessageCallback {
1333             return $_[0]->{log_msg};
1334             }
1335              
1336             #---------------------------------------------------------------------
1337              
1338             sub getNotificationCallback {
1339             my $crNotify = $_[0]->{notify};
1340             return defined($crNotify) ? $$crNotify : undef;
1341             }
1342              
1343             #----------------------------------------------------------------
1344              
1345             sub getPathList {
1346             my ($self, $xPath, $xPeg, $bRecurse, $oPool) = @_;
1347             my $hEntries = $self->ls1_1($xPath, $xPeg, $bRecurse, $oPool);
1348             return defined($hEntries) ? [ keys %$hEntries ] : [];
1349             }
1350              
1351             #----------------------------------------------------------------
1352              
1353             sub getPathProperty {
1354             my ($self, $sPath, $sProp, $xPeg) = @_;
1355             my $hProp = $self->propget($sPath, $sProp, $xPeg, 0);
1356             return (values %$hProp)[0];
1357             }
1358              
1359             #----------------------------------------------------------------
1360              
1361             sub getPathProperties {
1362             my ($self, $sPath, $xPeg) = @_;
1363              
1364             my $aNodes = $self->proplist($sPath, $xPeg, 0);
1365             my $oNode = defined($aNodes) && exists($aNodes->[0])
1366             ? $aNodes->[0] : undef;
1367             return defined($oNode) ? $oNode->prop_hash() : {};
1368             }
1369              
1370             #---------------------------------------------------------------------
1371              
1372             sub getPool { $_[0]->{pool} }
1373              
1374             #----------------------------------------------------------------
1375              
1376             sub getRepositoryRootURL {
1377             my ($self, $sWc, $oPool) = @_;
1378             my $sRoot;
1379             my $crVisit = sub { $sRoot = $_[1]->repos_root_URL() };
1380             $self->info($sWc, $crVisit, 0, $oPool);
1381             return $sRoot;
1382             }
1383              
1384             #----------------------------------------------------------------
1385             # returns the equivalent path in the repository
1386              
1387             sub getRepositoryURL {
1388             my ($self, $sWc, $oPool) = @_;
1389              
1390             $oPool = $self->{pool} unless defined($oPool);
1391             return SVN::_Client::svn_client_url_from_path($sWc, $oPool);
1392             }
1393              
1394             #----------------------------------------------------------------
1395              
1396             sub getRepositoryUUID {
1397             my ($self, $sWc, $oPool) = @_;
1398              
1399             $oPool = $self->{pool} unless defined($oPool);
1400              
1401             #try first to get this information locally
1402             #on older versions it may not be available
1403             my $oAdminBaton = SVN::_Wc::svn_wc_adm_probe_open3
1404             (undef, $sWc, 0, 0, undef, undef, $oPool);
1405             if ($oAdminBaton) {
1406             return SVN::_Client::svn_client_uuid_from_path
1407             ($sWc, $oAdminBaton, $self->{ctx}, $oPool);
1408             }
1409              
1410             my $xRepos
1411             = SVN::_Client::svn_client_url_from_path($sWc, $oPool);
1412             return SVN::_Client::svn_client_uuid_from_url
1413             ($xRepos, $self->{ctx}, $oPool);
1414             }
1415              
1416             #----------------------------------------------------------------
1417              
1418             sub getRevisionProperty {
1419             my ($self, $xRepos, $sProp, $xPeg) = @_;
1420             my @aGot = $self->revprop_get($xRepos, $sProp, $xPeg);
1421             return exists($aGot[0]) ? $aGot[0] : undef;
1422             }
1423              
1424             #----------------------------------------------------------------
1425              
1426             sub getRevisionProperties {
1427             my ($self, $xRepos, $xPeg, $sProp) = @_;
1428             my @aGot = $self->revprop_list($xRepos, $xPeg);
1429             return exists($aGot[0])? $aGot[0] : {};
1430             }
1431              
1432             #----------------------------------------------------------------
1433              
1434             sub getStatus {
1435             my ($self, $sWc, $oPool) = @_;
1436             $oPool = $self->{pool} unless defined($oPool);
1437              
1438             my $iErr;
1439             local $SVN::Error::handler = makeErrorHandler
1440             (sub {
1441             $iErr = $_[0]->apr_err();
1442             if ($iErr eq $SVN::Error::WC_NOT_DIRECTORY) {
1443             return 1;
1444             }
1445             return 0;
1446             });
1447              
1448             my $oAdminBaton = SVN::_Wc::svn_wc_adm_probe_open3
1449             (undef, $sWc, 0, 0, undef, undef, $oPool);
1450             return $iErr
1451             ? undef : SVN::_Wc::svn_wc_status($sWc, $oAdminBaton, $oPool);
1452             }
1453              
1454             #----------------------------------------------------------------
1455              
1456             sub import1_1 {
1457             my $self = shift @_;
1458             my $sWc = _shiftWcPath(\@_);
1459             my $xRepos = _shiftTarget(\@_);
1460             local $LOG_MESSAGE = _shiftString(\@_);
1461             my $bNonRecursive = _shiftBoolean(\@_);
1462             my $oPool = $self->_shiftPool(\@_);
1463              
1464             return SVN::_Client::svn_client_import
1465             ($sWc, $xRepos, $bNonRecursive, $self->{ctx}, $oPool);
1466             }
1467              
1468              
1469             sub import1_4 {
1470             my $self = shift @_;
1471             my $sWc = _shiftWcPath(\@_);
1472             my $xRepos = _shiftTarget(\@_);
1473             local $LOG_MESSAGE = _shiftString(\@_);
1474             my $bNonRecursive = _shiftBoolean(\@_);
1475             my $bNoIgnore = _shiftBoolean(\@_);
1476             my $oPool = $self->_shiftPool(\@_);
1477              
1478             return SVN::_Client::svn_client_import2
1479             ($sWc, $xRepos, $bNonRecursive, $bNoIgnore, $self->{ctx}, $oPool);
1480             }
1481              
1482             sub import1_5 {
1483             my $self = shift @_;
1484             my $sWc = _shiftWcPath(\@_);
1485             my $xRepos = _shiftTarget(\@_);
1486             local $LOG_MESSAGE = _shiftString(\@_);
1487             my $iDepth = _shiftDepth(\@_);
1488             my $bNoIgnore = _shiftBoolean(\@_);
1489             my $bIgnoreUnknownNodeTypes = _shiftBoolean(\@_);
1490             my $hRevProps = _shiftHash(\@_);
1491             my $oPool = $self->_shiftPool(\@_);
1492              
1493             return SVN::_Client::svn_client_import3
1494             ($sWc, $xRepos, $iDepth, $bNoIgnore, $bIgnoreUnknownNodeTypes
1495             , $hRevProps, $self->{ctx}, $oPool);
1496             }
1497              
1498             *import1_6 = *import1_5;
1499              
1500              
1501             sub import1_7 {
1502             my $self = shift @_;
1503             my $sWc = _shiftWcPath(\@_);
1504             my $xRepos = _shiftTarget(\@_);
1505             local $LOG_MESSAGE = _shiftString(\@_);
1506             my $iDepth = _shiftDepth(\@_);
1507             my $bNoIgnore = _shiftBoolean(\@_);
1508             my $bIgnoreUnknownNodeTypes = _shiftBoolean(\@_);
1509             my $hRevProps = _shiftHash(\@_);
1510             my $crCommit = _shiftVisitor(@_);
1511             my $oPool = $self->_shiftPool(\@_);
1512              
1513             return SVN::_Client::svn_client_import4
1514             ($sWc, $xRepos, $iDepth, $bNoIgnore, $bIgnoreUnknownNodeTypes
1515             , $hRevProps, $crCommit, $self->{ctx}, $oPool);
1516             }
1517              
1518             sub import {
1519             my $self = shift @_;
1520             return unless ref($self); #play nicely when called by use...
1521              
1522             my $sWc = _shiftWcPath(\@_);
1523             my $xRepos = _shiftTarget(\@_);
1524             local $LOG_MESSAGE = _shiftString(\@_);
1525             my $bRecurse = _shiftRecurse(\@_);
1526             my $oPool = $self->_shiftPool(\@_);
1527              
1528             return SVN::_Client::svn_client_import
1529             ($sWc, $xRepos, $bRecurse?0:1, $self->{ctx}, $oPool);
1530             }
1531              
1532             #----------------------------------------------------------------
1533              
1534             sub info1_1 {
1535             my $self = shift @_;
1536             my $xTarget = _shiftTarget(\@_);
1537             my ($xPeg,$xTargetRev) = _shiftPegRev(\@_,1);
1538             my $crVisit = _shiftVisitor(\@_);
1539             my $bRecurse = _shiftRecurse(\@_);
1540             my $oPool = $self->_shiftPool(\@_);
1541              
1542             #omit the baton - despite it being included in the usage
1543             #statement, svn_client_log expects the $_[5] to be the context
1544             return SVN::_Client::svn_client_info
1545             ($xTarget, $xPeg, $xTargetRev, $crVisit, $bRecurse
1546             , $self->{ctx}, $oPool);
1547             }
1548              
1549             *info1_4=*info1_1;
1550              
1551             sub info1_5 {
1552             my $self = shift @_;
1553             my $xTarget = _shiftTarget(\@_);
1554             my ($xPeg,$xTargetRev) = _shiftPegRev(\@_,1);
1555             my $crVisit = _shiftVisitor(\@_);
1556             my $iDepth = _shiftDepth(\@_);
1557             my $aChangeLists = _shiftArray(\@_);
1558             my $oPool = $self->_shiftPool(\@_);
1559              
1560             #omit the baton - despite it being included in the usage
1561             #statement, svn_client_log expects the $_[5] to be the context
1562             return SVN::_Client::svn_client_info2
1563             ($xTarget, $xPeg, $xTargetRev, $crVisit, $iDepth, $aChangeLists
1564             , $self->{ctx}, $oPool);
1565             }
1566              
1567             *info1_6=*info1_5;
1568              
1569             sub info1_7 {
1570             my $self = shift @_;
1571             my $xTarget = _shiftTarget(\@_);
1572             my ($xPeg,$xTargetRev) = _shiftPegRev(\@_,1);
1573             my $crVisit = _shiftVisitor(\@_);
1574             my $iDepth = _shiftDepth(\@_);
1575             my $aChangeLists = _shiftArray(\@_);
1576             my $oPool = $self->_shiftPool(\@_);
1577              
1578             #omit the baton - despite it being included in the usage
1579             #statement, svn_client_log expects the $_[5] to be the context
1580             return SVN::_Client::svn_client_info3
1581             ($xTarget, $xPeg, $xTargetRev, $crVisit, $iDepth, $aChangeLists
1582             , $self->{ctx}, $oPool);
1583             }
1584              
1585             *info=*info1_1;
1586              
1587             #----------------------------------------------------------------
1588              
1589             sub isLocked {
1590             my ($self, $sWc, $xPeg, $oPool) = @_;
1591             return $self->getInfo($sWc, $xPeg, $oPool)->lock() ? 1 : 0;
1592             }
1593              
1594             #----------------------------------------------------------------
1595              
1596             sub lock1_1 {
1597             my $self = shift @_;
1598             my $xTargets = _shiftTargets(\@_);
1599             my $sComment = _shiftString(\@_);
1600             my $bStealLock = _shiftBoolean(\@_);
1601             my $oPool = $self->_shiftPool(\@_);
1602              
1603             return SVN::_Client::svn_client_lock
1604             ($xTargets, $sComment, $bStealLock, $self->{ctx}, $oPool);
1605             }
1606              
1607             *lock1_4 = *lock1_1;
1608             *lock1_5 = *lock1_1;
1609             *lock1_6 = *lock1_1;
1610             *lock1_7 = *lock1_1;
1611             *lock = *lock1_1;
1612              
1613             #----------------------------------------------------------------
1614              
1615             sub log1_1 {
1616             my $self = shift @_;
1617             my $xTargets = _shiftTargets(\@_);
1618             my ($xStart, $xEnd) = _shiftRange(\@_);
1619             my $bChangedPaths = _shiftBoolean(\@_);
1620             my $bStrictNodeHistory = _shiftBoolean(\@_);
1621             my $crVisit = _shiftVisitor(\@_);
1622             my $oPool = $self->_shiftPool(\@_);
1623              
1624             #omit the baton - despite it being included in the usage
1625             #statement, svn_client_log expects the $_[6] to be the context
1626             return SVN::_Client::svn_client_log
1627             ($xTargets, $xStart, $xEnd, $bChangedPaths
1628             , $bStrictNodeHistory, $crVisit, $self->{ctx}, $oPool);
1629             }
1630              
1631             sub log1_4 {
1632             my $self = shift @_;
1633             my $xTargets = _shiftTargets(\@_);
1634             my $xPeg = _shiftPeg(\@_);
1635             my ($xStart, $xEnd) = _shiftRange(\@_, $xPeg);
1636             my $iVisitLimit = _shiftInt(\@_);
1637             my $bChangedPaths = _shiftBoolean(\@_);
1638             my $bStrictNodeHistory = _shiftBoolean(\@_);
1639             my $crVisit = _shiftVisitor(\@_);
1640             my $oPool = $self->_shiftPool(\@_);
1641              
1642             #omit the baton - despite it being included in the usage
1643             #statement, svn_client_log expects the $_[8] to be the context
1644             return SVN::_Client::svn_client_log3
1645             ($xTargets, $xPeg, $xStart, $xEnd, $iVisitLimit
1646             , $bChangedPaths, $bStrictNodeHistory, $crVisit
1647             , $self->{ctx}, $oPool);
1648             }
1649              
1650             sub log1_5 {
1651             my $self = shift @_;
1652             my $xTargets = _shiftTargets(\@_);
1653             my $xPeg = _shiftPeg(\@_);
1654             my ($xStart, $xEnd) = _shiftRange(\@_, $xPeg);
1655             my $iVisitLimit = _shiftInt(\@_);
1656             my $bChangedPaths = _shiftBoolean(\@_);
1657             my $bStrictNodeHistory = _shiftBoolean(\@_);
1658             my $bIncludeMergedRevisions = _shiftBoolean(\@_);
1659             my $aRevProps = _shiftArray(\@_);
1660             my $crVisit = _shiftVisitor(\@_);
1661             my $oPool = $self->_shiftPool(\@_);
1662              
1663             #omit the baton - despite it being included in the usage
1664             #statement, svn_client_log expects the $_[8] to be the context
1665             return SVN::_Client::svn_client_log4
1666             ($xTargets, $xPeg, $xStart, $xEnd, $iVisitLimit
1667             , $bChangedPaths, $bStrictNodeHistory
1668             , $bIncludeMergedRevisions, $aRevProps, $crVisit
1669             , $self->{ctx}, $oPool);
1670             }
1671              
1672              
1673             sub log1_6 {
1674             my $self = shift @_;
1675             my $xTargets = _shiftTargets(\@_);
1676             my $xPeg = _shiftPeg(\@_);
1677             my $aRevRanges = _shiftArray(\@_);
1678             my $iVisitLimit = _shiftInt(\@_);
1679             my $bChangedPaths = _shiftBoolean(\@_);
1680             my $bStrictNodeHistory = _shiftBoolean(\@_);
1681             my $bIncludeMergedRevisions = _shiftBoolean(\@_);
1682             my $aRevProps = _shiftArray(\@_);
1683             my $crVisit = _shiftVisitor(\@_);
1684             my $oPool = $self->_shiftPool(\@_);
1685              
1686             #omit the baton - despite it being included in the usage
1687             #statement, svn_client_log expects the $_[8] to be the context
1688             return SVN::_Client::svn_client_log5
1689             ($xTargets, $xPeg, $aRevRanges, $iVisitLimit
1690             , $bChangedPaths, $bStrictNodeHistory
1691             , $bIncludeMergedRevisions, $aRevProps
1692             , $crVisit, $self->{ctx}, $oPool);
1693             }
1694              
1695             *log1_7 = *log1_6;
1696              
1697             sub log {
1698             my $self = shift @_;
1699             my $xTargets = _shiftTargets(\@_);
1700             my ($xStart, $xEnd) = _shiftRange(\@_);
1701             my $crVisit = _shiftVisitor(\@_);
1702             my $bChangedPaths = _shiftBoolean(\@_);
1703             my $bStrictNodeHistory = _shiftBoolean(\@_);
1704             my $oPool = $self->_shiftPool(\@_);
1705              
1706             #omit the baton - despite it being included in the usage
1707             #statement, svn_client_log expects the $_[6] to be the context
1708             return SVN::_Client::svn_client_log
1709             ($xTargets, $xStart, $xEnd, $bChangedPaths
1710             , $bStrictNodeHistory, $crVisit, $self->{ctx}, $oPool);
1711             }
1712              
1713             #----------------------------------------------------------------
1714              
1715             sub ls1_1 {
1716             my $self = shift @_;
1717             my $xTarget = _shiftTarget(\@_);
1718             my $xPeg = _shiftPeg(\@_);
1719             my $bRecurse = _shiftRecurse(\@_);
1720             my $oPool = $self->_shiftPool(\@_);
1721              
1722             SVN::_Client::svn_client_ls
1723             ($xTarget, $xPeg, $bRecurse, $self->{ctx}, $oPool);
1724             }
1725              
1726             sub list1_1 {
1727             my $self = shift @_;
1728             my $xTarget = _shiftTarget(\@_);
1729             my $xPeg = _shiftPeg(\@_);
1730             my $bRecurse = _shiftRecurse(\@_);
1731             my $crVisit = _shiftVisitor(\@_);
1732             my $oPool = $self->_shiftPool(\@_);
1733              
1734             # Note: there is no equivalent to list in the 1.1 API so fake it
1735              
1736             my $hList = SVN::_Client::svn_client_ls
1737             ($xTarget, $xPeg, $bRecurse, $self->{ctx}, $oPool);
1738             return unless ref($hList);
1739              
1740             while (my ($k,$v) = each (%$hList)) {
1741             my $sFullPath = File::Spec->rel2abs($k,$xTarget);
1742             $crVisit->($k, $v, $sFullPath, $oPool);
1743             }
1744             }
1745              
1746             sub list1_4 {
1747             my $self = shift @_;
1748             my $xTarget = _shiftTarget(\@_);
1749             my ($xPeg,$xRev) = _shiftPegRev(\@_);
1750             my $bRecurse = _shiftRecurse(\@_);
1751             my $iFields = _shiftListFieldMask(\@_);
1752             my $bFetchLocks = _shiftBoolean(\@_);
1753             my $crVisit = _shiftVisitor(\@_);
1754             my $oPool = $self->_shiftPool(\@_);
1755              
1756             # Note: the 2007 release complains about "TypeError in method
1757             # 'svn_client_list', argument 7 of type 'svn_client_list_func_t'
1758             # Is this an error in the SWIG bindings?
1759             # Adding a baton parameter doesn't help.
1760              
1761             return SVN::_Client::svn_client_list
1762             ($xTarget, $xPeg, $xRev, $bRecurse, $iFields
1763             , $bFetchLocks, $crVisit, $self->{ctx}, $oPool);
1764             }
1765              
1766             sub list1_5 {
1767             my $self = shift @_;
1768             my $xTarget = _shiftTarget(\@_);
1769             my ($xPeg,$xRev) = _shiftPegRev(\@_);
1770             my $iDepth = _shiftDepth(\@_);
1771             my $iFields = _shiftListFieldMask(\@_);
1772             my $bFetchLocks = _shiftBoolean(\@_);
1773             my $crVisit = _shiftVisitor(\@_);
1774             my $oPool = $self->_shiftPool(\@_);
1775              
1776             # Note: the 2007 release complains about "TypeError in method
1777             # 'svn_client_list', argument 7 of type 'svn_client_list_func_t'
1778             # Is this an error in the SWIG bindings?
1779             # Adding a baton parameter doesn't help.
1780              
1781             return SVN::_Client::svn_client_list2
1782             ($xTarget, $xPeg, $xRev, $iDepth, $iFields
1783             , $bFetchLocks, $crVisit, $self->{ctx}, $oPool);
1784             }
1785              
1786             *list1_6 = *list1_5;
1787             *list1_7 = *list1_5;
1788              
1789             sub list {
1790             my ($self, $xTarget, $xPeg, $crVisit, $bRecurse) = @_;
1791             return $self->list1_1($xTarget, $xPeg, $bRecurse, $crVisit);
1792             }
1793              
1794             #----------------------------------------------------------------
1795              
1796             sub merge1_1 {
1797             my $self = shift @_;
1798             my ($xTarget1, $xPeg1
1799             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_, 1);
1800             my $sWc = _shiftWcPath(\@_);
1801             my $bRecurse = _shiftRecurse(\@_);
1802             my $bIgnoreAncestry = _shiftBoolean(\@_);
1803             my $bForce = _shiftBoolean(\@_);
1804             my $bDryRun = _shiftBoolean(\@_);
1805             my $oPool = $self->_shiftPool(\@_);
1806              
1807             #print STDERR "t1=<", $xTarget1, "> peg=<$xPeg1> status="
1808             # , $self->getStatusAsString($self->getStatus($xTarget1)->text_status())
1809             # , "\n";
1810             #print STDERR "t2=<", $xTarget2, "> peg=<$xPeg2> status="
1811             # , $self->getStatusAsString($self->getStatus($xTarget2)->text_status())
1812             # , "\n";
1813             #print STDERR "wc=<", $sWc, "> status="
1814             # , $self->getStatusAsString($self->getStatus($sWc)->text_status())
1815             # , "\n";
1816              
1817             return SVN::_Client::svn_client_merge
1818             ($xTarget1, $xPeg1, $xTarget2, $xPeg2, $sWc
1819             , $bRecurse, $bIgnoreAncestry, $bForce, $bDryRun
1820             , $self->{ctx}, $oPool);
1821             }
1822              
1823             sub merge1_4 {
1824             my $self = shift @_;
1825             my ($xTarget1, $xPeg1
1826             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_,1);
1827             my $sWc = _shiftWcPath(\@_);
1828             my $bRecurse = _shiftRecurse(\@_);
1829             my $bIgnoreAncestry = _shiftBoolean(\@_);
1830             my $bForce = _shiftBoolean(\@_);
1831             my $bDryRun = _shiftBoolean(\@_);
1832             my $aMergeOptions = _shiftArray(\@_);
1833             my $oPool = $self->_shiftPool(\@_);
1834              
1835             # 1.4.6 release complains about illegal parameter if
1836             # an array is passed in. We can work around this by
1837             # passing undef in place of an empty array, but other
1838             # parameters will fail.
1839              
1840             $aMergeOptions=undef if ! scalar(@$aMergeOptions);
1841              
1842             return SVN::_Client::svn_client_merge2
1843             ($xTarget1, $xPeg1, $xTarget2, $xPeg2, $sWc
1844             , $bRecurse, $bIgnoreAncestry, $bForce, $bDryRun
1845             , $aMergeOptions, $self->{ctx}, $oPool);
1846             }
1847              
1848              
1849             sub merge1_5 {
1850             my $self = shift @_;
1851             my ($xTarget1, $xPeg1
1852             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_,1);
1853             my $sWc = _shiftWcPath(\@_);
1854             my $iDepth = _shiftDepth(\@_);
1855             my $bIgnoreAncestry = _shiftBoolean(\@_);
1856             my $bForce = _shiftBoolean(\@_);
1857             my $bRecordOnly = _shiftBoolean(\@_);
1858             my $bDryRun = _shiftBoolean(\@_);
1859             my $aMergeOptions = _shiftArray(\@_);
1860             my $oPool = $self->_shiftPool(\@_);
1861              
1862             return SVN::_Client::svn_client_merge3
1863             ($xTarget1, $xPeg1, $xTarget2, $xPeg2, $sWc
1864             , $iDepth, $bIgnoreAncestry, $bForce, $bRecordOnly, $bDryRun
1865             , $aMergeOptions, $self->{ctx}, $oPool);
1866             }
1867              
1868             *merge1_6 = *merge1_5;
1869              
1870             sub merge1_7 {
1871             my $self = shift @_;
1872             my ($xTarget1, $xPeg1
1873             , $xTarget2, $xPeg2) = _shiftDiffTargets(\@_,1);
1874             my $sWc = _shiftWcPath(\@_);
1875             my $iDepth = _shiftDepth(\@_);
1876             my $bIgnoreAncestry = _shiftBoolean(\@_);
1877             my $bForce = _shiftBoolean(\@_);
1878             my $bRecordOnly = _shiftBoolean(\@_);
1879             my $bDryRun = _shiftBoolean(\@_);
1880             my $bAllowMixedRev = _shiftBoolean(\@_);
1881             my $aMergeOptions = _shiftArray(\@_);
1882             my $oPool = $self->_shiftPool(\@_);
1883              
1884             return SVN::_Client::svn_client_merge3
1885             ($xTarget1, $xPeg1, $xTarget2, $xPeg2, $sWc
1886             , $iDepth, $bIgnoreAncestry, $bForce, $bRecordOnly, $bDryRun
1887             , $bAllowMixedRev, $aMergeOptions, $self->{ctx}, $oPool);
1888             }
1889              
1890             *merge = *merge1_1;
1891              
1892             #----------------------------------------------------------------
1893              
1894             sub mkdir1_1 {
1895             my $self = shift @_;
1896             my $xTargets = _shiftTargets(\@_);
1897             local $LOG_MESSAGE = _shiftString(\@_);
1898             my $oPool = $self->_shiftPool(\@_);
1899              
1900             return SVN::_Client::svn_client_mkdir
1901             ($xTargets, $self->{ctx}, $oPool);
1902             }
1903              
1904             sub mkdir1_4 {
1905             my $self = shift @_;
1906             my $xTargets = _shiftTargets(\@_);
1907             local $LOG_MESSAGE = _shiftString(\@_);
1908             my $oPool = $self->_shiftPool(\@_);
1909              
1910             return SVN::_Client::svn_client_mkdir2
1911             ($xTargets, $self->{ctx}, $oPool);
1912             }
1913              
1914             sub mkdir1_5 {
1915             my $self = shift @_;
1916             my $xTargets = _shiftTargets(\@_);
1917             local $LOG_MESSAGE = _shiftString(\@_);
1918             my $bMakeParents = _shiftBoolean(\@_);
1919             my $hRevProps = _shiftHash(\@_);
1920             my $oPool = $self->_shiftPool(\@_);
1921              
1922             return SVN::_Client::svn_client_mkdir3
1923             ($xTargets, $bMakeParents, $hRevProps, $self->{ctx}, $oPool);
1924             }
1925              
1926             *mkdir1_6 = *mkdir1_5;
1927              
1928             sub mkdir1_7 {
1929             my $self = shift @_;
1930             my $xTargets = _shiftTargets(\@_);
1931             local $LOG_MESSAGE = _shiftString(\@_);
1932             my $bMakeParents = _shiftBoolean(\@_);
1933             my $hRevProps = _shiftHash(\@_);
1934             my $crCommit = _shiftVisitor(\@_);
1935             my $oPool = $self->_shiftPool(\@_);
1936              
1937             return SVN::_Client::svn_client_mkdir4
1938             ($xTargets, $bMakeParents, $hRevProps, $crCommit, $self->{ctx}
1939             , $oPool);
1940             }
1941              
1942             *mkdir=*mkdir1_1;
1943              
1944             #----------------------------------------------------------------
1945             # mod then move - requires force flag in 1.4 but not 1.5
1946             # -see http://svn.haxx.se/users/archive-2008-07/0893.shtml
1947              
1948             sub move1_1 {
1949             #note: the $xPeg parameter is ignored according to the SVN C/C++
1950             #API documentation
1951              
1952             my $self = shift @_;
1953             my $xTarget = _shiftTarget(\@_);
1954             my $xPeg = shift @_;
1955             my $xTo = _shiftTarget(\@_);
1956             my $bForce = _shiftBoolean(\@_);
1957             my $oPool = $self->_shiftPool(\@_);
1958              
1959             return SVN::_Client::svn_client_move
1960             ($xTarget, $xPeg, $xTo, $bForce, $self->{ctx}, $oPool);
1961             }
1962              
1963             sub move1_4 {
1964             my $self = shift @_;
1965             my $xTarget = _shiftTarget(\@_);
1966             my $sTo = _shiftTarget(\@_);
1967             my $bForce = _shiftBoolean(\@_);
1968             my $oPool = $self->_shiftPool(\@_);
1969              
1970             return SVN::_Client::svn_client_move4
1971             ($xTarget, $sTo, $bForce, $self->{ctx}, $oPool);
1972             }
1973              
1974             sub move1_5 {
1975             my $self = shift @_;
1976             my $aTargets = _shiftTargets(\@_);
1977             my $sTo = _shiftTarget(\@_);
1978             my $bForce = _shiftBoolean(\@_);
1979             my $bMoveAsChild = _shiftBoolean(\@_);
1980             my $bMakeParents = _shiftBoolean(\@_);
1981             my $hRevProps = _shiftHash(\@_);
1982             my $oPool = $self->_shiftPool(\@_);
1983              
1984             return SVN::_Client::svn_client_move5
1985             ($aTargets, $sTo, $bForce, $bMoveAsChild, $bMakeParents,
1986             $hRevProps, $self->{ctx}, $oPool);
1987             }
1988              
1989             *move1_6 = *move1_5;
1990              
1991             sub move1_7 {
1992             my $self = shift @_;
1993             my $aTargets = _shiftTargets(\@_);
1994             my $sTo = _shiftTarget(\@_);
1995             my $bMoveAsChild = _shiftBoolean(\@_);
1996             my $bMakeParents = _shiftBoolean(\@_);
1997             my $hRevProps = _shiftHash(\@_);
1998             my $crCommit = _shiftVisitor(\@_);
1999             my $oPool = $self->_shiftPool(\@_);
2000              
2001             return SVN::_Client::svn_client_move6
2002             ($aTargets, $sTo, $bMoveAsChild, $bMakeParents,
2003             $hRevProps, $crCommit, $self->{ctx}, $oPool);
2004             }
2005              
2006             sub move {
2007             my $self = shift @_;
2008             my $sFrom = _shiftTarget(\@_);
2009             my $sTo = _shiftTarget(\@_);
2010             my $bForce = _shiftBoolean(\@_);
2011             my $oPool = $self->_shiftPool(\@_);
2012              
2013             #note: the $xPeg parameter is ignored according to the SVN C/C++
2014             #API documentation
2015              
2016             return SVN::_Client::svn_client_move
2017             ($sFrom, undef, $sTo, $bForce, $self->{ctx}, $oPool);
2018             }
2019              
2020             #----------------------------------------------------------------
2021              
2022             sub propdel1_1 {
2023             my $self = shift @_;
2024             my $sProp = shift @_;
2025             my $xTarget = _shiftTarget(\@_);
2026             my $bRecurse = _shiftRecurse(\@_);
2027             my $oPool = $self->_shiftPool(\@_);
2028              
2029             return SVN::_Client::svn_client_propset
2030             ($sProp, undef, $xTarget, $bRecurse, $oPool);
2031             }
2032              
2033             sub propdel1_4 {
2034             my $self = shift @_;
2035             my $sProp = shift @_;
2036             my $xTarget = _shiftTarget(\@_);
2037             my $bRecurse = _shiftRecurse(\@_);
2038             my $bSkipChecks = _shiftBoolean(\@_);
2039             my $oPool = $self->_shiftPool(\@_);
2040              
2041             return SVN::_Client::svn_client_propset2
2042             ($sProp, undef, $xTarget, $bRecurse, $bSkipChecks
2043             , $self->{ctx}, $oPool);
2044             }
2045              
2046             sub propde1_5 {
2047             my $self = shift @_;
2048             my $sProp = shift @_;
2049             my $xTarget = _shiftTarget(\@_);
2050             my $iDepth = _shiftDepth(\@_);
2051             my $bSkipChecks = _shiftBoolean(\@_);
2052             my $xBaseRev = _shiftPeg(\@_,1);
2053             my $aChangeLists = _shiftArray(\@_);
2054             my $hRevProps = _shiftHash(\@_);
2055             my $oPool = $self->_shiftPool(\@_);
2056              
2057             return SVN::_Client::svn_client_propset3
2058             ($sProp, undef, $xTarget, $iDepth, $bSkipChecks, $xBaseRev
2059             , $aChangeLists, $hRevProps, $self->{ctx}, $oPool);
2060             }
2061              
2062             *propdel1_6 = *propdel1_1;
2063              
2064             sub propdel1_7 {
2065             my $self = shift @_;
2066             my $sProp = shift @_;
2067             my $xTarget = _shiftTarget(\@_);
2068             my $iDepth = _shiftDepth(\@_);
2069             my $bSkipChecks = _shiftBoolean(\@_);
2070             my $xBaseRev = _shiftPeg(\@_,1);
2071             my $aChangeLists = _shiftArray(\@_);
2072             my $hRevProps = _shiftHash(\@_);
2073             my $crCommit = _shiftVisitor(\@_);
2074             my $oPool = $self->_shiftPool(\@_);
2075              
2076             return SVN::_Client::svn_client_propset3
2077             ($sProp, undef, $xTarget, $iDepth, $bSkipChecks, $xBaseRev
2078             , $aChangeLists, $hRevProps, $crCommit, $self->{ctx}, $oPool);
2079             }
2080              
2081             sub propdel {
2082             my $self = shift @_;
2083             my $xTarget = _shiftTarget(\@_);
2084             my $sProp = shift @_;
2085             my $bRecurse = _shiftRecurse(\@_);
2086             my $oPool = $self->_shiftPool(\@_);
2087              
2088             return SVN::_Client::svn_client_propset
2089             ($sProp, undef, $xTarget, $bRecurse, $oPool);
2090             }
2091              
2092             #----------------------------------------------------------------
2093              
2094             sub propget1_1 {
2095             my $self = shift @_;
2096             my $sProp = shift @_;
2097             my $xTarget = _shiftTarget(\@_);
2098             my $xPeg = _shiftPeg(\@_, 1);
2099             my $bRecurse = _shiftRecurse(\@_);
2100             my $oPool = $self->_shiftPool(\@_);
2101              
2102             return SVN::_Client::svn_client_propget
2103             ($sProp, $xTarget, $xPeg, $bRecurse, $self->{ctx}, $oPool);
2104             }
2105              
2106             sub propget1_4 {
2107             my $self = shift @_;
2108             my $sProp = shift @_;
2109             my $xTarget = _shiftTarget(\@_);
2110             my ($xPeg,$xRev) = _shiftPegRev(\@_, 1);
2111             my $bRecurse = _shiftRecurse(\@_);
2112             my $oPool = $self->_shiftPool(\@_);
2113              
2114             return SVN::_Client::svn_client_propget2
2115             ($sProp, $xTarget, $xPeg, $xRev, $bRecurse
2116             , $self->{ctx}, $oPool);
2117             }
2118              
2119             sub propget1_5 {
2120             my $self = shift @_;
2121             my $sProp = shift @_;
2122             my $xTarget = _shiftTarget(\@_);
2123             my ($xPeg,$xRev) = _shiftPegRev(\@_, 1);
2124             my $iDepth = _shiftDepth(\@_);
2125             my $aChangeLists = _shiftArray(\@_);
2126             my $oPool = $self->_shiftPool(\@_);
2127              
2128             return SVN::_Client::svn_client_propget2
2129             ($sProp, $xTarget, $xPeg, $xRev, $iDepth, $aChangeLists
2130             , $self->{ctx}, $oPool);
2131             }
2132              
2133             *propget1_6 = *propget1_5;
2134             *propget1_7 = *propget1_5;
2135              
2136             sub propget {
2137             my $self = shift @_;
2138             my $xTarget = _shiftTarget(\@_);
2139             my $sProp = shift @_;
2140             my $xPeg = _shiftPeg(\@_, 1);
2141             my $bRecurse = _shiftRecurse(\@_);
2142             my $oPool = $self->_shiftPool(\@_);
2143              
2144             return SVN::_Client::svn_client_propget
2145             ($sProp, $xTarget, $xPeg, $bRecurse, $self->{ctx}, $oPool);
2146             }
2147              
2148             #----------------------------------------------------------------
2149              
2150             sub proplist1_1 {
2151             my $self = shift @_;
2152             my $xTarget = _shiftTarget(\@_);
2153             my $xPeg = _shiftPeg(\@_, 1);
2154             my $bRecurse = _shiftRecurse(\@_);
2155             my $oPool = $self->_shiftPool(\@_);
2156              
2157             return SVN::_Client::svn_client_proplist
2158             ($xTarget, $xPeg, $bRecurse, $self->{ctx}, $oPool);
2159             }
2160              
2161             sub proplist1_4 {
2162             my $self = shift @_;
2163             my $xTarget = _shiftTarget(\@_);
2164             my ($xPeg,$xRev) = _shiftPegRev(\@_, 1);
2165             my $bRecurse = _shiftRecurse(\@_);
2166             my $oPool = $self->_shiftPool(\@_);
2167              
2168             return SVN::_Client::svn_client_proplist2
2169             ($xTarget, $xPeg, $xRev, $bRecurse, $self->{ctx}, $oPool);
2170             }
2171              
2172             sub proplist1_5 {
2173             my $self = shift @_;
2174             my $xTarget = _shiftTarget(\@_);
2175             my ($xPeg,$xRev) = _shiftPegRev(\@_, 1);
2176             my $iDepth = _shiftDepth(\@_);
2177             my $aChangeLists = _shiftArray(\@_);
2178             my $crVisit = _shiftVisitor(\@_);
2179             my $oPool = $self->_shiftPool(\@_);
2180              
2181             return SVN::_Client::svn_client_proplist2
2182             ($xTarget, $xPeg, $xRev, $iDepth, $aChangeLists, $crVisit
2183             , $self->{ctx}, $oPool);
2184             }
2185              
2186             *proplist1_6 = *proplist1_5;
2187             *proplist1_7 = *proplist1_5;
2188             *proplist = *proplist1_1;
2189              
2190             #----------------------------------------------------------------
2191              
2192             sub propset1_1 {
2193             my $self = shift @_;
2194             my $sProp = shift @_;
2195             my $sValue = _shiftString(\@_);
2196             my $xTarget = _shiftTarget(\@_);
2197             my $bRecurse = _shiftRecurse(\@_);
2198             my $oPool = $self->_shiftPool(\@_);
2199              
2200             return SVN::_Client::svn_client_propset
2201             ($sProp, $sValue, $xTarget, $bRecurse, $oPool);
2202             }
2203              
2204             sub propset1_4 {
2205             my $self = shift @_;
2206             my $sProp = shift @_;
2207             my $sValue = _shiftString(\@_);
2208             my $xTarget = _shiftTarget(\@_);
2209             my $bRecurse = _shiftRecurse(\@_);
2210             my $bSkipChecks = _shiftBoolean(\@_);
2211             my $oPool = $self->_shiftPool(\@_);
2212              
2213             return SVN::_Client::svn_client_propset2
2214             ($sProp, $sValue, $xTarget, $bRecurse, $bSkipChecks
2215             , $self->{ctx}, $oPool);
2216             }
2217              
2218             sub propset1_5 {
2219             my $self = shift @_;
2220             my $sProp = shift @_;
2221             my $sValue = _shiftString(\@_);
2222             my $xTarget = _shiftTarget(\@_);
2223             my $iDepth = _shiftDepth(\@_);
2224             my $bSkipChecks = _shiftBoolean(\@_);
2225             my $xBaseRev = _shiftPeg(\@_,1);
2226             my $aChangeLists = _shiftArray(\@_);
2227             my $hRevProps = _shiftHash(\@_);
2228             my $oPool = $self->_shiftPool(\@_);
2229              
2230             return SVN::_Client::svn_client_propset3
2231             ($sProp, $sValue, $xTarget, $iDepth, $bSkipChecks, $xBaseRev
2232             , $aChangeLists, $hRevProps, $self->{ctx}, $oPool);
2233             }
2234              
2235             *propset1_6 = *propset1_5;
2236              
2237             sub propset1_7 {
2238             my $self = shift @_;
2239             my $sProp = shift @_;
2240             my $sValue = _shiftString(\@_);
2241             my $xTarget = _shiftTarget(\@_);
2242             my $iDepth = _shiftDepth(\@_);
2243             my $bSkipChecks = _shiftBoolean(\@_);
2244             my $xBaseRev = _shiftPeg(\@_,1);
2245             my $aChangeLists = _shiftArray(\@_);
2246             my $hRevProps = _shiftHash(\@_);
2247             my $crCommit = _shiftVisitor(\@_);
2248             my $oPool = $self->_shiftPool(\@_);
2249              
2250             return SVN::_Client::svn_client_propset3
2251             ($sProp, $sValue, $xTarget, $iDepth, $bSkipChecks, $xBaseRev
2252             , $aChangeLists, $hRevProps, $crCommit, $self->{ctx}, $oPool);
2253             }
2254              
2255             sub propset {
2256             my $self = shift @_;
2257             my $xTarget = _shiftTarget(\@_);
2258             my $sProp = shift @_;
2259             my $sValue = _shiftString(\@_);
2260             my $bRecurse = _shiftRecurse(\@_);
2261             my $oPool = $self->_shiftPool(\@_);
2262              
2263             return SVN::_Client::svn_client_propset
2264             ($sProp, $sValue, $xTarget, $bRecurse, $oPool);
2265             }
2266              
2267             #----------------------------------------------------------------
2268              
2269             sub relocate1_1 {
2270             my $self = shift @_;
2271             my $sWc = _shiftWcPath(\@_);
2272             my $xFromRepos = _shiftTarget(\@_);
2273             my $xToRepos = _shiftTarget(\@_);
2274             my $bRecurse = _shiftRecurse(\@_);
2275             my $oPool = $self->_shiftPool(\@_);
2276              
2277             return SVN::_Client::svn_client_relocate
2278             ($sWc, $xFromRepos, $xToRepos, $bRecurse, $self->{ctx}, $oPool);
2279             }
2280              
2281             *relocate1_4 = *relocate1_1;
2282             *relocate1_5 = *relocate1_1;
2283             *relocate1_6 = *relocate1_1;
2284              
2285             sub relocate1_7 {
2286             my $self = shift @_;
2287             my $sWc = _shiftWcPath(\@_);
2288             my $xFromRepos = _shiftTarget(\@_);
2289             my $xToRepos = _shiftTarget(\@_);
2290             my $bIgnoreExternals = _shiftBoolean(\@_);
2291             my $oPool = $self->_shiftPool(\@_);
2292              
2293             return SVN::_Client::svn_client_relocate2
2294             ($sWc, $xFromRepos, $xToRepos, $bIgnoreExternals
2295             , $self->{ctx}, $oPool);
2296             }
2297              
2298             *relocate = *relocate1_1;
2299              
2300             #----------------------------------------------------------------
2301              
2302             sub resolved1_1 {
2303             my $self = shift @_;
2304             my $sWc = _shiftWcPath(\@_);
2305             my $bRecurse = _shiftRecurse(\@_);
2306             my $oPool = $self->_shiftPool(\@_);
2307              
2308             return SVN::_Client::svn_client_resolved
2309             ($sWc, $bRecurse, $self->{ctx}, $oPool);
2310             }
2311              
2312             *resolved1_4 = *resolved1_1;
2313             *resolved1_5 = *resolved1_1;
2314             *resolved1_6 = *resolved1_1;
2315             *resolved1_7 = *resolved1_1;
2316             *resolved = *resolved1_1;
2317              
2318             #----------------------------------------------------------------
2319              
2320             sub revert1_1 {
2321             my $self = shift @_;
2322             my $aWcs = _shiftWcPaths(\@_);
2323             my $bRecurse = _shiftRecurse(\@_);
2324             my $oPool = $self->_shiftPool(\@_);
2325              
2326             return SVN::_Client::svn_client_revert
2327             ($aWcs, $bRecurse, $self->{ctx}, $oPool);
2328             }
2329              
2330             *revert1_4 = *revert1_1;
2331              
2332             sub revert1_5 {
2333             my $self = shift @_;
2334             my $aWcs = _shiftWcPaths(\@_);
2335             my $iDepth = _shiftDepth(\@_);
2336             my $aChangeLists = _shiftArray(\@_);
2337             my $oPool = $self->_shiftPool(\@_);
2338              
2339             return SVN::_Client::svn_client_revert2
2340             ($aWcs, $iDepth, $aChangeLists, $self->{ctx}, $oPool);
2341             }
2342              
2343             *revert1_6 = *revert1_5;
2344             *revert1_7 = *revert1_5;
2345             *revert = *revert1_1;
2346              
2347             #----------------------------------------------------------------
2348              
2349             sub revprop_delete1_1 {
2350             my $self = shift @_;
2351             my $sProp = shift @_;
2352             my $xRepos = _shiftTarget(\@_);
2353             my $xPeg = _shiftPeg(\@_);
2354             my $bSkipChecks = _shiftBoolean(\@_);
2355             my $oPool = $self->_shiftPool(\@_);
2356              
2357             return SVN::_Client::svn_client_revprop_set
2358             ($sProp, undef, $xRepos, $xPeg, $bSkipChecks
2359             , $self->{ctx}, $oPool);
2360             }
2361              
2362             *revprop_delete1_4 = *revprop_delete1_1;
2363             *revprop_delete1_5 = *revprop_delete1_1;
2364              
2365             sub revprop_delete1_6 {
2366             my $self = shift @_;
2367             my $sProp = shift @_;
2368             my $sOldValue = shift @_;
2369             my $xRepos = _shiftTarget(\@_);
2370             my $xPeg = _shiftPeg(\@_);
2371             my $bSkipChecks = _shiftBoolean(\@_);
2372             my $oPool = $self->_shiftPool(\@_);
2373              
2374             return SVN::_Client::svn_client_revprop_set2
2375             ($sProp, undef, $sOldValue, $xRepos, $xPeg, $bSkipChecks
2376             , $self->{ctx}, $oPool);
2377             }
2378              
2379             *revprop_delete1_7 = *revprop_delete1_6;
2380              
2381              
2382             sub revprop_delete {
2383             my $self = shift @_;
2384             my $xRepos = _shiftTarget(\@_);
2385             my $sProp = shift @_;
2386             my $xPeg = _shiftPeg(\@_);
2387             my $bSkipChecks = _shiftBoolean(\@_);
2388             my $oPool = $self->_shiftPool(\@_);
2389              
2390             return SVN::_Client::svn_client_revprop_set
2391             ($sProp, undef, $xRepos, $xPeg, $bSkipChecks
2392             , $self->{ctx}, $oPool);
2393             }
2394              
2395             #----------------------------------------------------------------
2396              
2397             sub revprop_get1_1 {
2398             my $self = shift @_;
2399             my $sProp = shift @_;
2400             my $xRepos = _shiftTarget(\@_);
2401             my $xPeg = _shiftPeg(\@_);
2402             my $oPool = $self->_shiftPool(\@_);
2403              
2404             #the swig wrapper handles returning the value
2405             return SVN::_Client::svn_client_revprop_get
2406             ($sProp, $xRepos, $xPeg, $self->{ctx}, $oPool);
2407             }
2408              
2409             *revprop_get1_4 = *revprop_get1_1;
2410             *revprop_get1_5 = *revprop_get1_1;
2411             *revprop_get1_6 = *revprop_get1_1;
2412             *revprop_get1_7 = *revprop_get1_1;
2413              
2414             sub revprop_get {
2415             my $self = shift @_;
2416             my $xRepos = _shiftTarget(\@_);
2417             my $sProp = shift @_;
2418             my $xPeg = _shiftPeg(\@_);
2419             my $oPool = $self->_shiftPool(\@_);
2420              
2421             #the swig wrapper handles returning the value
2422             return SVN::_Client::svn_client_revprop_get
2423             ($sProp, $xRepos, $xPeg, $self->{ctx}, $oPool);
2424              
2425             }
2426              
2427             #----------------------------------------------------------------
2428              
2429             sub revprop_list1_1 {
2430             my $self = shift @_;
2431             my $xRepos = _shiftTarget(\@_);
2432             my $xPeg = _shiftPeg(\@_);
2433             my $oPool = $self->_shiftPool(\@_);
2434              
2435             #the swig wrapper handles returning the value
2436             return SVN::_Client::svn_client_revprop_list
2437             ($xRepos, $xPeg, $self->{ctx}, $oPool);
2438             }
2439              
2440             *revprop_list1_4 = *revprop_list1_1;
2441             *revprop_list1_5 = *revprop_list1_1;
2442             *revprop_list1_6 = *revprop_list1_1;
2443             *revprop_list1_7 = *revprop_list1_1;
2444             *revprop_list = *revprop_list1_1;
2445              
2446              
2447             #----------------------------------------------------------------
2448              
2449             sub revprop_set1_1 {
2450             my $self = shift @_;
2451             my $sProp = shift @_;
2452             my $sValue = shift @_;
2453             my $xRepos = _shiftTarget(\@_);
2454             my $xPeg = _shiftPeg(\@_);
2455             my $bSkipChecks = _shiftBoolean(\@_);
2456             my $oPool = $self->_shiftPool(\@_);
2457              
2458             return SVN::_Client::svn_client_revprop_set
2459             ($sProp, $sValue, $xRepos, $xPeg, $bSkipChecks
2460             , $self->{ctx}, $oPool);
2461             }
2462              
2463             *revprop_set1_4 = *revprop_set1_1;
2464             *revprop_set1_5 = *revprop_set1_1;
2465              
2466             sub revprop_set1_6 {
2467             my $self = shift @_;
2468             my $sProp = shift @_;
2469             my $sValue = shift @_;
2470             my $sOldValue = shift @_;
2471             my $xRepos = _shiftTarget(\@_);
2472             my $xPeg = _shiftPeg(\@_);
2473             my $bSkipChecks = _shiftBoolean(\@_);
2474             my $oPool = $self->_shiftPool(\@_);
2475              
2476             return SVN::_Client::svn_client_revprop_set2
2477             ($sProp, $sValue, $sOldValue, $xRepos, $xPeg, $bSkipChecks
2478             , $self->{ctx}, $oPool);
2479             }
2480              
2481             *revprop_set1_7 = *revprop_set1_6;
2482              
2483              
2484             sub revprop_set {
2485             my $self = shift @_;
2486             my $xRepos = _shiftTarget(\@_);
2487             my $sProp = shift @_;
2488             my $xPeg = _shiftPeg(\@_);
2489             my $sValue = shift @_;
2490             my $bSkipChecks = _shiftBoolean(\@_);
2491             my $oPool = $self->_shiftPool(\@_);
2492              
2493             return SVN::_Client::svn_client_revprop_set
2494             ($sProp, $sValue, $xRepos, $xPeg, $bSkipChecks
2495             , $self->{ctx}, $oPool);
2496             }
2497              
2498             #--------------------------------------------------------------------
2499              
2500             sub setConfig {
2501             my ($self, $xConfig) = @_;
2502             $xConfig = $CONFIG_CLASS->new($xConfig);
2503             return $self->{ctx}->config($xConfig->getCategoryHash());
2504             }
2505              
2506             #----------------------------------------------------------------
2507              
2508             sub setPool {
2509             my ($self, $oPool) = @_;
2510             if (ref($oPool) !~ m{^_p_apr_pool_t|SVN::Pool$}) {
2511             die $EXCEPTIONS->ERR_BAD_ARG
2512             ->new(arg => $oPool, reason => "Pool must be undefined or "
2513             . "an SVN::Pool or _p_apr_pool_t object");
2514             }
2515             return $self->{pool} = $oPool;
2516             }
2517              
2518              
2519             #----------------------------------------------------------------
2520              
2521             sub status1_1 {
2522             my $self = shift @_;
2523             my $sWc = _shiftWcPath(\@_);
2524             my $xPeg = _shiftPeg(\@_);
2525             my $crVisit = _shiftVisitor(\@_);
2526             my $bRecurse = _shiftRecurse(\@_);
2527             my $bAll = _shiftBoolean(\@_);
2528             my $bUpdate = _shiftBoolean(\@_);
2529             my $bNoIgnore = _shiftBoolean(\@_);
2530             my $oPool = $self->_shiftPool(\@_);
2531              
2532             #Despite the fact that the usage string includes a status
2533             #baton, the actual method expects it to be omitted from the
2534             #parameter list
2535              
2536             return SVN::_Client::svn_client_status
2537             ($sWc, $xPeg, $crVisit, $bRecurse, $bAll
2538             , $bUpdate, $bNoIgnore, $self->{ctx}, $oPool);
2539             }
2540              
2541             sub status1_4 {
2542             my $self = shift @_;
2543             my $sWc = _shiftWcPath(\@_);
2544             my $xPeg = _shiftPeg(\@_);
2545             my $crVisit = _shiftVisitor(\@_);
2546             my $bRecurse = _shiftRecurse(\@_);
2547             my $bAll = _shiftBoolean(\@_);
2548             my $bUpdate = _shiftBoolean(\@_);
2549             my $bNoIgnore = _shiftBoolean(\@_);
2550             my $bSkipExternals = _shiftBoolean(\@_);
2551             my $oPool = $self->_shiftPool(\@_);
2552              
2553             return SVN::_Client::svn_client_status2
2554             ($sWc, $xPeg, $crVisit, $bRecurse, $bAll, $bUpdate
2555             , $bNoIgnore, $bSkipExternals, $self->{ctx}, $oPool);
2556             }
2557              
2558             sub status1_5 {
2559             my $self = shift @_;
2560             my $sWc = _shiftWcPath(\@_);
2561             my $xPeg = _shiftPeg(\@_);
2562             my $crVisit = _shiftVisitor(\@_);
2563             my $iDepth = _shiftDepth(\@_);
2564             my $bAll = _shiftBoolean(\@_);
2565             my $bUpdate = _shiftBoolean(\@_);
2566             my $bNoIgnore = _shiftBoolean(\@_);
2567             my $bSkipExternals = _shiftBoolean(\@_);
2568             my $aChangeLists = _shiftArray(\@_);
2569             my $oPool = $self->_shiftPool(\@_);
2570              
2571             return SVN::_Client::svn_client_status3
2572             ($sWc, $xPeg, $crVisit, $iDepth, $bAll, $bUpdate
2573             , $bNoIgnore, $bSkipExternals, $aChangeLists
2574             , $self->{ctx}, $oPool);
2575             }
2576              
2577             sub status1_6 {
2578             my $self = shift @_;
2579             my $sWc = _shiftWcPath(\@_);
2580             my $xPeg = _shiftPeg(\@_);
2581             my $crVisit = _shiftVisitor(\@_);
2582             my $iDepth = _shiftDepth(\@_);
2583             my $bAll = _shiftBoolean(\@_);
2584             my $bUpdate = _shiftBoolean(\@_);
2585             my $bNoIgnore = _shiftBoolean(\@_);
2586             my $bSkipExternals = _shiftBoolean(\@_);
2587             my $aChangeLists = _shiftArray(\@_);
2588             my $oPool = $self->_shiftPool(\@_);
2589              
2590             return SVN::_Client::svn_client_status4
2591             ($sWc, $xPeg, $crVisit, $iDepth, $bAll, $bUpdate
2592             , $bNoIgnore, $bSkipExternals, $aChangeLists
2593             , $self->{ctx}, $oPool);
2594             }
2595              
2596             sub status1_7 {
2597             my $self = shift @_;
2598             my $sWc = _shiftWcPath(\@_);
2599             my $xPeg = _shiftPeg(\@_);
2600             my $iDepth = _shiftDepth(\@_);
2601             my $bAll = _shiftBoolean(\@_);
2602             my $bUpdate = _shiftBoolean(\@_);
2603             my $bNoIgnore = _shiftBoolean(\@_);
2604             my $bSkipExternals = _shiftBoolean(\@_);
2605             my $aChangeLists = _shiftArray(\@_);
2606             my $crVisit = _shiftVisitor(\@_);
2607             my $oPool = $self->_shiftPool(\@_);
2608              
2609             return SVN::_Client::svn_client_status5
2610             ($sWc, $xPeg, $iDepth, $bAll, $bUpdate
2611             , $bNoIgnore, $bSkipExternals, $aChangeLists
2612             , $crVisit, $self->{ctx}, $oPool);
2613             }
2614              
2615             sub status {
2616             my $self = shift @_;
2617             my $sWc = _shiftWcPath(\@_);
2618             my $crVisit = _shiftVisitor(\@_);
2619             my $bRecurse = _shiftRecurse(\@_);
2620             my $bUpdate = _shiftBoolean(\@_);
2621             my $xPeg = _shiftPeg(\@_);
2622             my $bAll = _shiftBoolean(\@_);
2623             my $bNoIgnore = _shiftBoolean(\@_);
2624             my $oPool = $self->_shiftPool(\@_);
2625              
2626             return SVN::_Client::svn_client_status
2627             ($sWc, $xPeg, $crVisit, $bRecurse, $bAll
2628             , $bUpdate, $bNoIgnore, $self->{ctx}, $oPool);
2629             }
2630              
2631             #----------------------------------------------------------------
2632              
2633             sub switch1_1 {
2634             my $self = shift @_;
2635             my $sWc = _shiftWcPath(\@_);
2636             my $xRepos = _shiftTarget(\@_);
2637             my $xPeg = _shiftPeg(\@_);
2638             my $bRecurse = _shiftRecurse(\@_);
2639             my $oPool = $self->_shiftPool(\@_);
2640              
2641             return SVN::_Client::svn_client_switch
2642             ($sWc, $xRepos, $xPeg, $bRecurse, $self->{ctx}, $oPool);
2643             }
2644              
2645             *switch1_4 = *switch1_1;
2646              
2647             sub switch1_5 {
2648             my $self = shift @_;
2649             my $sWc = _shiftWcPath(\@_);
2650             my $xRepos = _shiftTarget(\@_);
2651             my ($xPeg, $xRev) = _shiftPegRev(\@_);
2652             my $iDepth = _shiftDepth(\@_);
2653             my $bDepthIsSticky = _shiftBoolean(\@_);
2654             my $bSkipExternals = _shiftBoolean(\@_);
2655             my $bAllowUnversionedObstructions = _shiftBoolean(\@_);
2656             my $oPool = $self->_shiftPool(\@_);
2657              
2658             return SVN::_Client::svn_client_switch
2659             ($sWc, $xRepos, $xPeg, $iDepth, $bDepthIsSticky, $bSkipExternals
2660             , $bAllowUnversionedObstructions, $self->{ctx}, $oPool);
2661             }
2662              
2663             *switch1_6 = *switch1_5;
2664             *switch1_7 = *switch1_5;
2665             *switch = *switch1_1;
2666              
2667             #----------------------------------------------------------------
2668              
2669             sub unlock1_1 {
2670             my $self = shift @_;
2671             my $xTargets = _shiftTargets(\@_);
2672             my $bBreakLock = _shiftBoolean(\@_);
2673             my $oPool = $self->_shiftPool(\@_);
2674              
2675             return SVN::_Client::svn_client_unlock
2676             ($xTargets, $bBreakLock, $self->{ctx}, $oPool);
2677             }
2678              
2679             *unlock1_4 = *unlock1_1;
2680             *unlock1_5 = *unlock1_1;
2681             *unlock1_6 = *unlock1_1;
2682             *unlock1_7 = *unlock1_1;
2683             *unlock = *unlock1_1;
2684              
2685             #----------------------------------------------------------------
2686              
2687             sub update1_1 {
2688             my $self = shift @_;
2689             my $sWc = _shiftWcPath(\@_);
2690             my $xPeg = _shiftPeg(\@_);
2691             my $bRecurse = _shiftRecurse(\@_);
2692             my $oPool = $self->_shiftPool(\@_);
2693              
2694             return SVN::_Client::svn_client_update
2695             ($sWc, $xPeg, $bRecurse, $self->{ctx}, $oPool);
2696             }
2697              
2698             sub update1_4 {
2699             my $self = shift @_;
2700             my $aWcs = _shiftWcPaths(\@_);
2701             my $xPeg = _shiftPeg(\@_);
2702             my $bRecurse = _shiftRecurse(\@_);
2703             my $bSkipExternals = _shiftBoolean(\@_);
2704             my $oPool = $self->_shiftPool(\@_);
2705              
2706             return SVN::_Client::svn_client_update2
2707             ($aWcs, $xPeg, $bRecurse, $bSkipExternals
2708             , $self->{ctx}, $oPool);
2709             }
2710              
2711             sub update1_5 {
2712             my $self = shift @_;
2713             my $aWcs = _shiftWcPaths(\@_);
2714             my $xPeg = _shiftPeg(\@_);
2715             my $iDepth = _shiftDepth(\@_);
2716             my $bDepthIsSticky = _shiftBoolean(\@_);
2717             my $bSkipExternals = _shiftBoolean(\@_);
2718             my $bAllowUnversionedObstructions = _shiftBoolean(\@_);
2719             my $oPool = $self->_shiftPool(\@_);
2720              
2721             return SVN::_Client::svn_client_update3
2722             ($aWcs, $xPeg, $iDepth, $bDepthIsSticky
2723             , $bSkipExternals, $bAllowUnversionedObstructions
2724             , $self->{ctx}, $oPool);
2725             }
2726              
2727             *update1_6 = *update1_5;
2728              
2729             sub update1_7 {
2730             my $self = shift @_;
2731             my $aWcs = _shiftWcPaths(\@_);
2732             my $xPeg = _shiftPeg(\@_);
2733             my $iDepth = _shiftDepth(\@_);
2734             my $bDepthIsSticky = _shiftBoolean(\@_);
2735             my $bSkipExternals = _shiftBoolean(\@_);
2736             my $bAllowUnversionedObstructions = _shiftBoolean(\@_);
2737             my $bMakeParents = _shiftBoolean(\@_);
2738             my $oPool = $self->_shiftPool(\@_);
2739              
2740             return SVN::_Client::svn_client_update4
2741             ($aWcs, $xPeg, $iDepth, $bDepthIsSticky
2742             , $bSkipExternals, $bAllowUnversionedObstructions
2743             , $bMakeParents, $self->{ctx}, $oPool);
2744             }
2745              
2746             *update = *update1_1;
2747              
2748             #----------------------------------------------------------------
2749              
2750             #redefined here to make sure context is passed correctly:
2751             #SVN::Client uses ref not isa when trying to decide whether it is
2752             #being called as a function or as a method.
2753              
2754             sub url_from_path {
2755             my ($self, $sWc, $oPool) = @_;
2756              
2757             $oPool = $self->{pool} unless defined($oPool);
2758             return SVN::_Client::svn_client_url_from_path($sWc, $oPool);
2759             }
2760              
2761             #----------------------------------------------------------------
2762              
2763             #redefined here to make sure context is passed correctly:
2764             #SVN::Client uses ref not isa when trying to decide whether it is
2765             #being called as a function or as a method.
2766              
2767             sub uuid_from_path {
2768             my ($self, $sWc, $oAdminAccess, $oPool) = @_;
2769              
2770             $oPool = $self->{pool} unless defined($oPool);
2771             unless ($oAdminAccess) {
2772             $oAdminAccess = SVN::_Wc::svn_wc_adm_probe_open3
2773             (undef, $sWc, 0, 0, undef, undef, $oPool);
2774             }
2775              
2776             return SVN::_Client::svn_client_uuid_from_path
2777             ($sWc, $oAdminAccess, $self->{ctx}, $oPool);
2778             }
2779              
2780             #----------------------------------------------------------------
2781              
2782             #redefined here to make sure context is passed correctly:
2783             #SVN::Client uses ref+eq not isa when trying to decide whether it is
2784             #being called as a function or as a method.
2785              
2786             sub uuid_from_url {
2787             my ($self, $xRepos, $oPool) = @_;
2788              
2789             $oPool = $self->{pool} unless defined($oPool);
2790              
2791             # quote repos name to force any "" override to convert an object
2792             # to a string
2793             return SVN::_Client::svn_client_uuid_from_url
2794             ("$xRepos", $self->{ctx}, $oPool);
2795             }
2796              
2797             #==================================================================
2798             # PRIVATE OBJECT METHODS
2799             #==================================================================
2800              
2801             sub _shiftPool {
2802             my $self = shift @_;
2803             die "Not a $CLASS" unless $self->isa($CLASS);
2804              
2805             my $oPool = shift @{shift @_};
2806             return defined($oPool) ? $oPool : $self->{pool};
2807             }
2808              
2809             #==================================================================
2810             # PRIVATE FUNCTIONS
2811             #==================================================================
2812              
2813             #sub _makeConfigActions($) {
2814             # my $hActions = shift @_;
2815             # my ($crNotify, $crLogMsg, $bLogMsgChange);
2816              
2817             # my $xCommit = $hActions->{commit};
2818             # if (ref($xCommit) eq 'HASH') {
2819             # if (exists($xCommit->{log_msg})) {
2820             # $bLogMsgChange = 1;
2821             # $crLogMsg = $xCommit->{log_msg};
2822             # }
2823             # $hActions->{commit} = $xCommit->{notify};
2824             # }
2825             # $crNotify = sub {
2826             # #my ($sPath, $iAction, $iKind, $sMime, $iState, $iRevision) = @_;
2827             # return _notifyFromHash($hActions, @_);
2828             # };
2829             # return ($crNotify, $crLogMsg, $bLogMsgChange);
2830             #}
2831              
2832             #----------------------------------------------------------------
2833              
2834             sub _notifyAction($$@) {
2835             my $hNotify = shift @_;
2836             my $sKey = shift @_;
2837             my $sPath = shift @_;
2838             my $iAction = shift @_;
2839             my $crDefault = shift @_;
2840              
2841             my $xAction = exists($hNotify->{$sKey})
2842             ? $hNotify->{$sKey} : undef;
2843              
2844             my $sRef = ref($xAction);
2845             if ($sRef eq 'HASH') {
2846             my $crAction = exists($xAction->{$iAction})
2847             ? $xAction->{$iAction} : undef;
2848              
2849             return defined($crAction)
2850             ? $crAction->($sPath, $iAction, @_)
2851             : defined($crDefault)
2852             ? $crDefault->($sKey, $sPath, $iAction, @_)
2853             : undef;
2854              
2855             } elsif ($sRef eq 'CODE') {
2856             return $xAction->($sPath, $iAction, @_);
2857             } elsif (defined($crDefault)) {
2858             $crDefault->($sKey, $sPath, $iAction, @_);
2859             } else {
2860             return undef;
2861             }
2862             }
2863              
2864             #----------------------------------------------------------------
2865              
2866             sub _notifyFromHash($@) {
2867             my $hNotify = shift @_;
2868             my $sPath = shift @_;
2869             my $iAction = shift @_;
2870             my $crDefault;
2871              
2872             if (exists($hNotify->{default})) {
2873             $crDefault = $hNotify->{default};
2874             unshift @_, $crDefault;
2875             } else {
2876             unshift @_, undef;
2877             }
2878              
2879             #scheduled actions
2880             if ($iAction eq $SVN::Wc::Notify::Action::add) {
2881             return _notifyAction($hNotify, 'schedule', $sPath, $iAction, @_);
2882             } elsif ($iAction eq $SVN::Wc::Notify::Action::copy) {
2883             return _notifyAction($hNotify, 'schedule', $sPath, $iAction, @_);
2884             } elsif ($iAction eq $SVN::Wc::Notify::Action::delete) {
2885             return _notifyAction($hNotify, 'schedule', $sPath, $iAction, @_);
2886             }
2887              
2888             #revert actions
2889             if ($iAction eq $SVN::Wc::Notify::Action::restore) {
2890             return _notifyAction($hNotify, 'revert', $sPath, $iAction, @_);
2891             } elsif ($iAction eq $SVN::Wc::Notify::Action::revert) {
2892             return _notifyAction($hNotify, 'revert', $sPath, $iAction, @_);
2893             } elsif ($iAction eq $SVN::Wc::Notify::Action::failed_revert) {
2894             return _notifyAction($hNotify, 'revert', $sPath, $iAction, @_);
2895             }
2896              
2897             #resolved action
2898             if ($iAction eq $SVN::Wc::Notify::Action::resolved) {
2899             return _notifyAction($hNotify, 'resolved', $sPath, $iAction, @_);
2900             }
2901              
2902             #update actions
2903             if ($iAction eq $SVN::Wc::Notify::Action::skip) {
2904             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2905             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_add) {
2906             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2907             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_delete) {
2908             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2909             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_update) {
2910             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2911             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_external) {
2912             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2913             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_completed) {
2914             return _notifyAction($hNotify, 'update', $sPath, $iAction, @_);
2915             }
2916              
2917             #follow
2918             if ($iAction eq $SVN::Wc::Notify::Action::status_external) {
2919             return _notifyAction($hNotify, 'follow', $sPath, $iAction, @_);
2920             } elsif ($iAction eq $SVN::Wc::Notify::Action::status_completed) {
2921             return _notifyAction($hNotify, 'follow', $sPath, $iAction, @_);
2922             }
2923              
2924             #commit actions
2925             if ($iAction eq $SVN::Wc::Notify::Action::commit_added) {
2926             return _notifyAction($hNotify, 'commit', $sPath, $iAction, @_);
2927             } elsif ($iAction eq $SVN::Wc::Notify::Action::commit_modified) {
2928             return _notifyAction($hNotify, 'commit', $sPath, $iAction, @_);
2929             } elsif ($iAction eq $SVN::Wc::Notify::Action::commit_deleted) {
2930             return _notifyAction($hNotify, 'commit', $sPath, $iAction, @_);
2931             } elsif ($iAction eq $SVN::Wc::Notify::Action::commit_replaced) {
2932             return _notifyAction($hNotify, 'commit', $sPath, $iAction, @_);
2933             } elsif ($iAction
2934             eq $SVN::Wc::Notify::Action::commit_postfix_txdelta) {
2935             return _notifyAction($hNotify, 'commit', $sPath, $iAction, @_);
2936             }
2937              
2938             #locking
2939             if ($iAction eq $SVN::Wc::Notify::Action::locked) {
2940             return _notifyAction($hNotify, 'lock', $sPath, $iAction, @_);
2941             } elsif ($iAction eq $SVN::Wc::Notify::Action::unlocked) {
2942             return _notifyAction($hNotify, 'lock', $sPath, $iAction, @_);
2943             } elsif ($iAction eq $SVN::Wc::Notify::Action::failed_lock) {
2944             return _notifyAction($hNotify, 'lock', $sPath, $iAction, @_);
2945             } elsif ($iAction eq $SVN::Wc::Notify::Action::failed_unlock) {
2946             return _notifyAction($hNotify, 'lock', $sPath, $iAction, @_);
2947             }
2948              
2949             #blame
2950             if ($iAction eq $SVN::Wc::Notify::Action::blame_revision) {
2951             return _notifyAction($hNotify, 'blame', $sPath, $iAction, @_);
2952             }
2953              
2954              
2955             if (1 <= $SVN::Core::VER_MAJOR) {
2956             if (5 <= $SVN::Core::VER_MINOR) {
2957             if ($iAction eq $SVN::Wc::Notify::Action::exists) {
2958             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2959             } elsif ($iAction
2960             eq $SVN::Wc::Notify::Action::changelist_set) {
2961             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2962             } elsif ($iAction
2963             eq $SVN::Wc::Notify::Action::changelist_clear) {
2964             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2965             } elsif ($iAction
2966             eq $SVN::Wc::Notify::Action::changelist_moved) {
2967             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2968             } elsif ($iAction eq $SVN::Wc::Notify::Action::merge_begin) {
2969             return _notifyAction($hNotify, 'merge', $sPath, $iAction, @_);
2970             } elsif ($iAction
2971             eq $SVN::Wc::Notify::Action::foreign_merge_begin) {
2972             return _notifyAction($hNotify, 'merge', $sPath, $iAction, @_);
2973             } elsif ($iAction eq $SVN::Wc::Notify::Action::update_replace) {
2974             return _notifyAction($hNotify, 'update', $sPath, $iAction,@_);
2975             }
2976             }
2977              
2978             if (6 <= $SVN::Core::VER_MINOR) {
2979             if ($iAction eq $SVN::Wc::Notify::Action::property_added) {
2980             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2981             } elsif ($iAction
2982             eq $SVN::Wc::Notify::Action::property_modified) {
2983             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2984             } elsif ($iAction
2985             eq $SVN::Wc::Notify::Action::property_deleted) {
2986             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2987             } elsif ($iAction
2988             eq $SVN::Wc::Notify::Action::property_deleted_nonexistant) {
2989             return _notifyAction($hNotify, 'schedule',$sPath,$iAction,@_);
2990             } elsif ($iAction eq $SVN::Wc::Notify::Action::revprop_set) {
2991             return _notifyAction($hNotify, 'revprop',$sPath,$iAction,@_);
2992             } elsif ($iAction
2993             eq $SVN::Wc::Notify::Action::revprop_deleted) {
2994             return _notifyAction($hNotify, 'revprop',$sPath,$iAction,@_);
2995             } elsif ($iAction eq $SVN::Wc::Notify::Action::tree_conflict) {
2996             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
2997             } elsif ($iAction eq $SVN::Wc::Notify::Action::merge_completed){
2998             return _notifyAction($hNotify, 'merge',$sPath,$iAction,@_);
2999             } elsif ($iAction eq $SVN::Wc::Notify::Action::failed_external){
3000             return _notifyAction($hNotify, 'follow',$sPath,$iAction,@_);
3001             }
3002             }
3003              
3004             if (7 <= $SVN::Core::VER_MINOR) {
3005             if ($iAction eq $SVN::Wc::Notify::Action::update_started) {
3006             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3007             } elsif ($iAction
3008             eq $SVN::Wc::Notify::Action::update_obstruction) {
3009             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3010             } elsif ($iAction
3011             eq $SVN::Wc::Notify::Action::update_external_removed) {
3012             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3013             } elsif ($iAction
3014             eq $SVN::Wc::Notify::Action::update_add_deleted) {
3015             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3016             } elsif ($iAction
3017             eq $SVN::Wc::Notify::Action::update_update_deleted) {
3018             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3019             } elsif ($iAction
3020             eq $SVN::Wc::Notify::Action::upgraded_path) {
3021             return _notifyAction($hNotify, 'update',$sPath,$iAction,@_);
3022             } elsif ($iAction
3023             eq $SVN::Wc::Notify::Action::merge_record_info) {
3024             return _notifyAction($hNotify, 'merge',$sPath,$iAction,@_);
3025             } elsif ($iAction
3026             eq $SVN::Wc::Notify::Action::merge_record_info_begin) {
3027             return _notifyAction($hNotify, 'merge',$sPath,$iAction,@_);
3028             } elsif ($iAction
3029             eq $SVN::Wc::Notify::Action::merge_elide_info) {
3030             return _notifyAction($hNotify, 'merge',$sPath,$iAction,@_);
3031             } elsif ($iAction
3032             eq $SVN::Wc::Notify::Action::patch) {
3033             return _notifyAction($hNotify, 'patch',$sPath,$iAction,@_);
3034             } elsif ($iAction
3035             eq $SVN::Wc::Notify::Action::patch_applied_hunk) {
3036             return _notifyAction($hNotify, 'patch',$sPath,$iAction,@_);
3037             } elsif ($iAction
3038             eq $SVN::Wc::Notify::Action::patch_rejected_hunk) {
3039             return _notifyAction($hNotify, 'patch',$sPath,$iAction,@_);
3040             } elsif ($iAction
3041             eq $SVN::Wc::Notify::Action::patch_hunk_already_applied) {
3042             return _notifyAction($hNotify, 'patch',$sPath,$iAction,@_);
3043             } elsif ($iAction eq $SVN::Wc::Notify::Action::url_redirect) {
3044             return _notifyAction($hNotify, 'follow',$sPath,$iAction,@_);
3045             }
3046             }
3047             }
3048              
3049             if (defined($crDefault)) {
3050             shift @_; #get rid of $crDefault at the front
3051             return $crDefault->(undef, $sPath, $iAction, @_);
3052             } else {
3053             return undef;
3054             }
3055             }
3056              
3057             #----------------------------------------------------------------
3058              
3059             sub _shiftArray {
3060             my $xArg = shift @{shift @_};
3061             return defined($xArg) ? $xArg : [];
3062             }
3063              
3064             #----------------------------------------------------------------
3065              
3066             sub _shiftDiffTargets($) {
3067             my ($aArgs, $bRepository) = @_;
3068             my $xTarget1 = shift @$aArgs;
3069             my $xPeg1 = shift @$aArgs;
3070             my $xTarget2 = shift @$aArgs;
3071             my $xPeg2 = shift @$aArgs;
3072              
3073             if (defined($xTarget1)) {
3074             $xTarget1 = "$xTarget1"; #force use of "" override
3075             } else {
3076             $xTarget1 = File::Spec->curdir();
3077             }
3078             $xTarget2 = defined($xTarget2) ? "$xTarget2" : $xTarget1;
3079              
3080             if ($xTarget1 ne $xTarget2) {
3081             if (defined($xPeg1)) {
3082             $xPeg2 = $xPeg1 unless defined($xPeg2);
3083             } elsif (defined($xPeg2)) {
3084             $xPeg1 = $xPeg2 unless defined($xPeg1);
3085             } else {
3086             $xPeg1 = $xPeg2 = ($bRepository ? 'HEAD' : 'BASE');
3087             }
3088             } elsif (defined($xPeg1)) {
3089             if (Scalar::Util::looks_like_number($xPeg1)) {
3090             $xPeg2 = $xPeg1 + 1;
3091             } elsif ($xPeg1 eq 'PREV') {
3092             $xPeg2 = 'COMMITTED';
3093             } elsif ($xPeg1 =~ qr{BASE|HEAD|COMMITTED}) {
3094             $xPeg2 = ($bRepository ? 'HEAD' : 'WORKING');
3095             } else {
3096             $xPeg2 = $xPeg1;
3097             }
3098             } elsif (defined($xPeg2)) {
3099             if (Scalar::Util::looks_like_number($xPeg2)) {
3100             $xPeg1 = $xPeg2 - 1;
3101             } elsif ($xPeg2 eq 'COMMITTED') {
3102             $xPeg1 = 'PREV';
3103             } elsif ($xPeg2 eq 'WORKING') {
3104             $xPeg1 = 'BASE';
3105             } else {
3106             $xPeg1 = $xPeg2;
3107             }
3108             } elsif ($bRepository) {
3109             $xPeg1 = 'PREV';
3110             $xPeg2 = 'COMMITTED';
3111             } else {
3112             $xPeg1 = 'BASE';
3113             $xPeg2 = 'WORKING';
3114             }
3115              
3116             # WORKING isn't listed in SVN documentation nor in the C code for
3117             # converting strings to svn_opt_revision_t instances. It seems to
3118             # be SWIG's way of representing svn_opt_revision_t without having
3119             # to create a whole struct for it. SWIG auto-translates this to
3120             # the right sort of object instance - see line 1172 in
3121             # http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/swig/include/svn_types.swg
3122              
3123             #print STDERR "<$xTarget1> <$xPeg1> <$xTarget2> <$xPeg2>\n";
3124              
3125             return ($xTarget1, $xPeg1, $xTarget2, $xPeg2);
3126             }
3127              
3128             #----------------------------------------------------------------
3129              
3130             sub _shiftErrFile($) {
3131             my $xArg = shift @{shift @_};
3132             return defined($xArg) ? $xArg : \*STDERR;
3133             }
3134              
3135             #----------------------------------------------------------------
3136              
3137             sub _shiftDepth {
3138             my $xArg = shift @{shift @_};
3139             return defined($xArg) ? $xArg : $SVN::Depth::infinity;
3140             }
3141              
3142             #----------------------------------------------------------------
3143              
3144             sub _shiftHash {
3145             my $xArg = shift @{shift @_};
3146             return defined($xArg) ? $xArg : {};
3147             }
3148              
3149             #----------------------------------------------------------------
3150              
3151             sub _shiftInt {
3152             my $xArg = shift @{shift @_};
3153             return defined($xArg) ? $xArg : 0;
3154             }
3155              
3156             #----------------------------------------------------------------
3157              
3158             sub _shiftListFieldMask($) {
3159             my $xArg = shift @{shift @_};
3160             return defined($xArg) ? $xArg : $SVN::Friendly::List::Fields::ALL;
3161             }
3162              
3163             #----------------------------------------------------------------
3164              
3165             sub _shiftOutFile {
3166             my $xArg = shift @{shift @_};
3167             return defined($xArg) ? $xArg : \*STDOUT;
3168             }
3169              
3170             #----------------------------------------------------------------
3171              
3172             sub _shiftOutputEncoding {
3173             my $xArg = shift @{shift @_};
3174             if (defined($xArg)) {
3175             return $xArg;
3176             } else {
3177             return defined($xArg) ? $xArg : $SVN::_Core::svn_locale_charset;
3178             }
3179             }
3180              
3181             #----------------------------------------------------------------
3182              
3183             sub _shiftOutputEol($) {
3184             # $sNativeEol may be 'CR', 'LF', 'CRLF', undef
3185             # undef is platform EOL
3186              
3187             my $xArg = shift @{shift @_};
3188             return $xArg;
3189             }
3190              
3191             #----------------------------------------------------------------
3192              
3193             sub _shiftPegRev {
3194             my ($aArgs, $bUndefIsWorking) = @_;
3195             my ($xPeg, $xRev);
3196             unless (ref($aArgs->[0])) {
3197             $xPeg = shift @$aArgs;
3198             $xRev = shift(@$aArgs) unless (ref($aArgs->[0]));
3199             }
3200              
3201             if (!defined($xPeg)) {
3202             $xPeg = $bUndefIsWorking ? 'WORKING' : 'HEAD';
3203             }
3204             $xRev = $xPeg unless defined($xRev);
3205             return ($xPeg, $xRev);
3206             }
3207              
3208             #----------------------------------------------------------------
3209              
3210             sub _shiftPeg {
3211             my ($aArgs, $bUndefIsWorking) = @_;
3212             my $xPeg = shift(@$aArgs) unless (ref($aArgs->[0]));
3213             if (!defined($xPeg) || ($xPeg eq '')) {
3214             $xPeg = $bUndefIsWorking ? 'WORKING' : 'HEAD';
3215             }
3216             return $xPeg;
3217             }
3218              
3219             #----------------------------------------------------------------
3220              
3221             sub _shiftRecurse {
3222             my $xArg = shift @{shift @_};
3223             return defined($xArg) ? $xArg : 1;
3224             }
3225              
3226             #----------------------------------------------------------------
3227              
3228             sub _shiftRange {
3229             my ($aArgs, $xMax) = @_;
3230             $xMax = 'HEAD' unless defined($xMax);
3231              
3232             my ($xStart, $xEnd);
3233             unless (ref($aArgs->[0])) {
3234             $xStart = shift @$aArgs;
3235             $xEnd = shift(@$aArgs) unless (ref($aArgs->[0]));
3236             }
3237             $xStart = 0 unless defined($xStart);
3238             $xEnd = $xMax unless defined($xEnd);
3239             return ($xStart, $xEnd);
3240             }
3241              
3242             #----------------------------------------------------------------
3243              
3244             sub _shiftTarget {
3245             my $xArg = shift @{shift @_};
3246              
3247             # quote the value to force any overridden "" operator to
3248             # convert this into a string
3249             return defined($xArg) ? "$xArg" : undef;
3250             }
3251              
3252             #----------------------------------------------------------------
3253              
3254             sub _shiftTargets {
3255             my $xTargets = shift @{shift @_};
3256              
3257             my $sRef = ref($xTargets);
3258             #print STDERR "_shiftTargets: <$xTargets> <$sRef>\n";
3259              
3260             if ($sRef eq 'ARRAY') {
3261             foreach (@$xTargets) { $_ = "$_"; }
3262             } elsif (defined($xTargets)) {
3263             $xTargets = [ "$xTargets" ]; #force overridden ""
3264             } else {
3265             return [];
3266             }
3267             return $xTargets;
3268             }
3269              
3270             #----------------------------------------------------------------
3271              
3272             sub _shiftString {
3273             my $xArg = shift @{shift @_};
3274             return defined($xArg) ? $xArg : '';
3275             }
3276              
3277             #----------------------------------------------------------------
3278              
3279             sub _shiftTrue {
3280             my $xArg = shift @{shift @_};
3281             return defined($xArg) ? $xArg : 1;
3282             }
3283              
3284             ##----------------------------------------------------------------
3285             ## Most likely not needed - if thunk is defined, no need for baton,
3286             ## if thunk is not defined, there is nothing we can do to make it
3287             ## work without changing the source code and recompiling the
3288             ## C-Bindings.
3289              
3290             #sub _shiftVisitorBaton {
3291             # my ($aArgs) = @_;
3292              
3293             # my $crVisit = _shiftVisitor($aArgs);
3294             # my $xBaton = shift @$aArgs;
3295             # return ($crVisit, $xBaton);
3296             #}
3297              
3298             #----------------------------------------------------------------
3299              
3300             sub _shiftWcPath {
3301             my $xArg = shift @{shift @_};
3302             #return defined($xArg) ? $xArg : $SYSTEM->cwd();
3303             return defined($xArg) ? $xArg : File::Spec->curdir();
3304             }
3305              
3306             #----------------------------------------------------------------
3307              
3308             sub _shiftWcPaths($) {
3309             my $aWcs = shift @{shift @_};
3310             return [] unless defined($aWcs);
3311             return ref($aWcs) ? $aWcs : [ $aWcs ];
3312             }
3313              
3314             #==================================================================
3315             # MODULE INITIALIZATION
3316             #==================================================================
3317              
3318             1;