native::ClientSection: User Contributed Perl Documentation (3)Updated: 2004-09-06 |
native::ClientSection: User Contributed Perl Documentation (3)Updated: 2004-09-06 |
use SVN::Client;
my $ctx = new SVN::Client(
auth => [SVN::Client::get_simple_provider(),
SVN::Client::get_simple_prompt_provider(\&simple_prompt,2),
SVN::Client::get_username_provider()]
);
$ctx->cat (\*STDOUT, 'http://svn.collab.net/repos/svn/trunk/README',
'HEAD');
sub simple_prompt {
my $cred = shift;
my $realm = shift;
my $default_username = shift;
my $may_save = shift;
my $pool = shift;
print "Enter authentication info for realm: $realm\n";
print "Username: ";
my $username = <>;
chomp($username);
$cred->username($username);
print "Password: ";
my $password = <>;
chomp($password);
$cred->password($password);
}
There are a few notable differences from the C API. Most C function calls take a svn_client_ctx_t pointer as the next to last parameter. The Perl method calls take a SVN::Client object as the first parameter. This allows method call invocation of the methods to be possible. For example, the following are equivalent:
SVN::Client::add($ctx,$path, $recursive, $pool); $ctx->add($path, $recursive, $pool);
Many of the C API calls also take a apr_pool_t pointer as their last argument. The Perl bindings generally deal with this for you and you do not need to pass a pool parameter. However, you may still pass a pool parameter as the last parameter to override the automatic handling of this for you.
Users of this interface should not directly manipulate the underlying hash values but should use the respective attribute methods. Many of these attribute methods do other things, especially when setting an attribute, besides simply manipulating the value in the hash.
Key/value pair arguments may be provided to set up the initial state of the user agent. The following methods correspond to attribute methods described below:
KEY DEFAULT
---------- ----------------------------------------
auth auth_baton initiated with providers that
read cached authentication options from
the subversion config only.
cancel undef
config Hash containing the config from the
default subversion config file location.
log_msg undef
notify undef
pool A new pool is created for the context.
$path's parent must be under revision control already, but $path is not. If $recursive is set, then assuming $path is a directory, all of its contents will be scheduled for addition as well.
Calls the notify callback for each added item.
Important: this is a scheduling operation. No changes will happen to the repository until a commit occurs. This scheduling can be removed with $ctx->revert().
No return.
An Error will be raised if either $start or $end is undef.
No return.
The blame receiver subroutine receives the following arguments: $line_no, $revision, $author, $date, $line, $pool
$line_no is the line number of the file (starting with 0). The line was last changed in revision number $revision by $author on $date and the contents were $line.
The blame receiver subroutine can return an svn_error_t object to return an error. All other returns will be ignored. You can create an svn_error_t object with SVN::Error::create().
If $target is not a local path and if $revision is 'PREV' (or some other kind that requires a local path), then an error will be raised, because the desired revision can not be determined.
$revision must be a number, 'HEAD', or a date. If $revision does not meet these requirements the $SVN::Error::CLIENT_BAD_REVISION is raised.
Returns the value of the revision actually checked out of the repository.
If $targets
Calls the notify callback as the commit progresses with any of the following actions: $SVN::Wc::Notify::Action::commit_modified, $SVN::Wc::Notify::Action::commit_added, $SVN::Wc::Notify::Action::commit_deleted, $SVN::Wc::Notify::Action::commit_replaced, $SVN::Wc::Notify::Action::commit_postfix_txdelta.
Use $nonrecursive to indicate that subdirectories of directory targets should be ignored.
Returns a svn_client_commit_info_t object. If the revision member of the commit information object is $SVN::Core::INVALID_REVNUM and no error was raised, then the commit was a no-op; nothing needed to be committed.
$src_target must be a file or directory under version control, or the URL of a versioned item in the repository. If $src_target is a URL, $src_revision is used to choose the revision from which to copy the $src_target. $dst_path must be a file or directory under version control, or a repository URL, existing or not.
If $dst_target is a URL, immediately attempt to commit the copy action to the repository. The log_msg callback will be called to query for a commit log message. If the commit succeeds, return a svn_client_commit_info_t object.
If $dst_target is not a URL, then this is just a variant of $ctx->add(), where the $dst_path items are scheduled for addition as copies. No changes will happen to the repository until a commit occurs. This scheduling can be removed with $ctx->revert(). undef will be returned in this case.
Calls the notify callback for each item added at the new location, passing the new, relative path of the added item.
If the paths in $targets
Else, schedule the working copy paths in $targets for removal from the repository. Each path's parent must be under revision control. This is just a scheduling operation. No changes will happen to the repository until a commit occurs. This scheduling can be removed with $ctx->revert(). If a path is a file it is immediately removed from the working copy. If the path is a directory it will remain in the working copy but all the files, and all unversioned items it contains will be removed. If $force is not set then this operation will fail if any path contains locally modified and/or unversioned items. If $force is set such items will be deleted.
The notify callback is called for each item deleted with the path of the deleted item.
Has no return.
Prints the output of the diff to the filename or filehandle passed as $outfile, and any errors to the filename or filehandle passed as $errfile.
Use $ignore_ancestry to control whether or not items being diffed will be checked for relatedness first. Unrelated items are typically transmitted to the editor as a deletion of one thing and the addition of another, but if this flag is true, unrelated items will be diffed as if they were related.
If $no_diff_deleted is true, then no diff output will be generated on deleted files.
$diff_options is a reference to an array of additional arguments to pass to diff process invoked to compare files. You'll usually just want to use [] to pass an empty array to return a unified context diff (like `diff -u`).
Has no return.
$from is either the path to the working copy on disk, or a
$to is the path to the directory where you wish to create the exported tree.
$revision is the revision that should be exported, which is only used when exporting from a repository. It may be undef otherwise.
The notify callback will be called for the items exported.
Returns the value of the revision actually exported or $SVN::Core::INVALID_REVNUM for local exports.
If some components of $url do not exist then create parent directories as necessary.
If $path is a directory, the contents of that directory are imported directly into the directory identified by $url. Note that the directory $path itself is not imported; that is, the basename of $path is not part of the import.
If $path is a file, then the dirname of $url is the directory receiving the import. The basename of $url is the filename in the repository. In this case if $url already exists, raise an error.
The notify callback (if defined) will be called as the import progresses, with any of the following actions: $SVN::Wc::Notify::Action::commit_added, $SVN::Wc::Notify::Action::commit_postfix_txdelta.
Use $nonrecursive to indicate that imported directories should not recurse into any subdirectories they may have.
Uses the log_msg callback to determine the log message for the commit when one is needed.
Returns a svn_client_commit_info_t object.
$targets is a reference to an array containing all the paths or URLs for which the log messages are desired. The log_receiver is only invoked on messages whose revisions involved a change to some path in $targets.
If $discover_changed_paths is set, then the changed_paths argument to the log_receiver routine will be passed on each invocation.
If $strict_node_history is set, copy history (if any exists) will not be traversed while harvesting revision logs for each target.
If $start or $end is undef the arp_err code will be set to: $SVN::Error::CLIENT_BAD_REVISION.
Special case for repositories at revision 0:
If $start is 'HEAD' and $end is 1, then handle an empty (no revisions) repository specially: instead of erroring because requested revision 1 when the highest revision is 0, just invoke $log_receiver on revision 0, passing undef to changed paths and empty strings for the author and date. This is because that particular combination of $start and $end usually indicates the common case of log invocation; the user wants to see all log messages from youngest to oldest, where the oldest commit is revision 1. That works fine, except there are no commits in the repository, hence this special case.
Calls the notify subroutine with a $SVN::Wc::Notify::Action::skip signal on any unversioned targets.
The log_receiver takes the following arguments: $changed_paths, $revision, $author, $date, $message, $pool
It is called once for each log $message from the $revision on $date by $author. $author, $date or $message may be undef.
If $changed_paths is defined it references a hash with the keys every path committed in $revision; the values are svn_log_changed_path_t objects.
If $target is a directory, returns entries for all of the directories' contents. If $recursive is true, it will recurse subdirectories in $target.
If $target is a file only return an entry for the file.
If $target is non-existent, raises the $SVN::Error::FS_NOT_FOUND error.
$src1 and $src2 are either URLs that refer to entries in the repository, or paths to entries in the working copy.
By 'merging', we mean: apply file differences and schedule additions & deletions when appropriate.
$src1 and $src2 must both represent the same node kind; that is, if $src1 is a directory, $src2 must also be, and if $src1 is a file, $src2 must also be.
If either $rev1 or $rev2 is undef raises the $SVN::Error::CLIENT_BAD_REVISION error.
If $recursive is true (and the URLs are directories), apply changes recursively; otherwise, only apply changes in the current directory.
Use $ignore_ancestry to control whether or not items being diffed will be checked for relatedness first. Unrelated items are typically transmitted to the editor as a deletion of one thing and the addition of another, but if this flag is true, unrelated items will be diffed as if they were related.
If $force is not set and the merge involves deleting locally modified or unversioned items the operation will raise an error. If $force is set such items will be deleted.
Calls the notify callback once for each merged target, passing the targets local path.
If $dry_run is true the merge is carried out, and the full notification feedback is provided, but the working copy is not modified.
Has no return.
If $targets contains URLs, immediately attempts to commit the creation of the directories in $targets in the repository. Returns a svn_client_commit_info_t object.
Else, create the directories on disk, and attempt to schedule them for addition. In this case returns undef.
Calls the notify callback when the directory has been created (successfully) in the working copy, with the path of the new directory. Note this is only called for items added to the working copy.
$src_path must be a file or directory under version control, or the URL of a versioned item in the repository.
If $src_path is a repository URL:
* $dst_path must also be a repository URL (existent or not).
* $src_revision is used to choose the revision from which to copy the $src_path.
* The log_msg callback will be called for the commit log message.
* The move operation will be immediately committed. If the commit succeeds, returns a svn_client_commit_info_t object.
If $src_path is a working copy path
* $dst_path must also be a working copy path (existent or not).
* $src_revision is ignored and may be undef. The log_msg callback will not be called.
* This is a scheduling operation. No changes will happen to the repository until a commit occurs. This scheduling can be removed with $ctx->revert(). If $src_path is a file it is removed from the working copy immediately. If $src_path is a directory it will remain in the working copy but all files, and unversioned items, it contains will be removed.
* If $src_path contains locally modified and/or unversioned items and $force is not set, the copy will raise an error. If $force is set such items will be removed.
The notify callback will be called twice for each item moved, once to indicate the deletion of the moved node, and once to indicate the addition of the new location of the node.
For each item the node_name member of the proplist_item object contains the name relative to the same base as $target
If $revision is undef, then get properties from the working copy, if $target is a working copy, or from the repository head if $target is a URL. Else get the properties as of $revision.
If $recursive is false, or $target is a file, the returned array will only contain a single element. Otherwise, it will contain one entry for each versioned entry below (and including) $target.
If $target is not found, raises the $SVN::Error::ENTRY_NOT_FOUND error.
If $recursive is true, then $propname will be set recursively on $target and all children. If $recursive is false, and $target is a directory, $propname will be set on only $target.
A $propval of undef will delete the property.
If $propname is an svn-controlled property (i.e. prefixed with svn:), then the caller is responsible for ensuring that $propval is UTF8-encoded and uses LF line-endings.
Has no return.
This will not semantically resolve conflicts; it just allows $path
If $path is not in a state of conflict to begin with, do nothing.
If $path's conflict state is removed, call the notify callback with the $path.
For each path in $paths, if it is a directory and $recursive is true, this will be a recursive operation.
Note that unlike its cousin $ctx->propget(), this routine doesn't affect working copy at all; it's a pure network operation that queries an unversioned property attached to a revision. This can be used to query log messages, dates, authors, and the like.
Note that unlike its cousin $ctx->proplist(), this routine doesn't read a working copy at all; it's a pure network operation that reads unversioned properties attached to a revision.
Returns the actual revision affected. A $propval of undef will delete the property.
If $force is true, allow newlines in the author property.
If $propname is an svn-controlled property (i.e. prefixed with svn:), then the caller is responsible for ensuring that the value is UTF8-encoded and uses LF line-endings.
Note that unlike its cousin $ctx->propset(), this routine doesn't affect the working copy at all; it's a pure network operation that changes an unversioned property attached to a revision. This can be used to tweak log messages, dates, authors, and the like. Be careful: it's a lossy operation, meaning that any existing value is replaced with the new value, with no way to retrieve the prior value.
Also note that unless the administrator creates a pre-revprop-change hook in the repository, this feature will fail.
If $recursive is true, recurse fully, else do only immediate children.
If $get_all is set, retrieve all entries; otherwise, retrieve only 'interesting' entries (local mods and/or out-of-date).
If $update is set, contact the repository and augment the status objects with information about out-of-dateness (with respect to $revision). Also, will return the value of the actual revision against with the working copy was compared. (The return will be undef if $update is not set).
The function recurses into externals definitions ('svn:externals') after handling the main target, if any exist. The function calls the notify callback with $SVN::Wc::Notify::Action::status_external action before handling each externals definition, and with $SVN::Wc::Notify::Action::status_completed after each.
The status_func subroutine takes the following parameters: $path, $status
$path is the pathname of the file or directory which status is being reported. $status is a svn_wc_status_t object.
The return of the status_func subroutine is ignored.
$revision must be a number, 'HEAD', or a date, otherwise it raises the $SVN::Error::CLIENT_BAD_REVISION error.
Calls the notify callback on paths affected by the switch. Also invokes the callback for files that may be restored from the text-base because they were removed from the working copy.
Summary of purpose: This is normally used to switch a working directory over to another line of development, such as a branch or a tag. Switching an existing working directory is more efficient than checking out $url from scratch.
Returns the value of the revision to which the working copy was actually switched.
$revision must be a revision number, 'HEAD', or a date or this method will raise the $SVN::Error::CLIENT_BAD_REVISION error.
Calls the notify callback for each item handled by the update, and also for files restored from the text-base.
Returns the revision to which the working copy was actually updated.
If $target is already a URL it returns $target.
If $target is a versioned item, it returns $target's entry URL.
If $target is unversioned (has no entry), returns undef.
Use $adm_access to retrieve the uuid from $path's entry; if not present in the entry, then call $ctx->uuid_from_url() to retrieve, using the entry's URL.
Note: The only reason this function falls back on $ctx->uuid_from_url is for compatibility purposes. Old working copies may not have uuids in the entries files.
Note: This method probably doesn't work right now without a lot of pain, because SVN::Wc is incomplete and it requires an adm_access object from it.
This method will accept an array or array ref of values returned from the authentication provider functions see ``AUTHENTICATION PROVIDERS'', which it will convert to an auth_baton for you. This is the preferred method of setting the auth_baton.
It will also accept a scalar that references a _p_svn_auth_baton_t such as those returned from SVN::Core::auth_open and SVN::Core::auth_open_helper.
The subroutine pointed to by this reference will be called when a change is made to the working copy. The return value of this function is ignored. It's only purpose is to notify you of the change.
The subroutine will receive 6 parameters. The first parameter will be the path of the changed file (absolute or relative to the cwd). The second is an integer specifying the type of action taken. See SVN::Wc for a list of the possible actions values and what they mean. The 3rd is an integer specifying the kind of node the path is, which can be: $SVN::Node::none, $SVN::Node::file, $SVN::Node::dir, $SVN::Node::unknown. The fourth parameter is the mime-type of the file or undef if the mime-type is unknown (it will always be undef for directories). The 5th parameter is the state of the file, again see SVN::Wc for a list of the possible states. The 6th and final parameter is the numeric revision number of the changed file. The revision number will be -1 except when the action is $SVN::Wc::Notify::Action::update_completed.
The subroutine pointed to by this coderef will be called to get the log message for any operation that will commit a revision to the repo.
It receives 4 parameters. The first parameter is a reference to a scalar value in which the callback should place the log_msg. If you wish to cancel the commit you can set this scalar to undef. The 2nd value is a path to a temporary file which might be holding that log message, or undef if no such field exists (though, if log_msg is undef, this value is undefined). The log message MUST be a UTF8 string with LF line separators. The 3rd parameter is a reference to an array of svn_client_commit_item_t objects, which may be fully or only partially filled-in, depending on the type of commit operation. The 4th and last parameter will be a pool.
If the function wishes to return an error it should return a svn_error_t object made with SVN::Error::create. Any other return value will be interpreted as SVN_NO_ERROR.
The subroutine pointed to by this value will be called to see if the operation should be canceled. If the operation should be canceled, the function may return one of the following values:
An svn_error_t object made with SVN::Error::create.
Any true value, in which case the bindings will generate an svn_error_t object for you with the error code of SVN_ERR_CANCELLED and the string set to ``By cancel callback''.
A string, in which case the bindings will generate an svn_error_t object for you with the error code of SVN_ERR_CANCELLED and the string set to the string you returned.
Any other value will be interpreted as wanting to continue the operation. Generally, it's best to return 0 to continue the operation.
See SVN::Core for more information about how pools are managed in this interface.
The functions that return the svn_auth_provider_object_t for prompt style providers take a reference to a Perl subroutine to use for the callback. The first parameter each of these subroutines receive is a credential object. The subroutines return the response by setting members of that object. Members may be set like so: $cred->username(``breser''); These functions and credential objects always have a may_save member which specifies if the authentication data will be cached.
The providers are as follows:
NAME WHAT IT HANDLES
---------------- ----------------------------------------
simple username and password pairs
username username only
ssl_server_trust server certificates and failures
authenticating them
ssl_client_cert client side certificate files
ssl_client_cert_pw password for a client side certificate file.
The masks used for determining the failures are in SVN::Auth::SSL and are named:
$SVN::Auth::SSL::NOTYETVALID $SVN::Auth::SSL::EXPIRED $SVN::Auth::SSL::CNMISMATCH $SVN::Auth::SSL::UNKNOWNCA $SVN::Auth::SSL::OTHER
You reply by setting the accepted_failures of the cred object with an integer of the values for what you want to accept bitwise AND'd together.
* Unit tests for cleanup, diff, export, merge, move, relocate, resolved and switch. This may reveal problems for using these methods as I haven't tested them yet that require deeper fixes.
Ben Reser <ben@reser.org>
This software is licensed as described in the file COPYING, which you should have received as part of this distribution. The terms are also available at http://subversion.tigris.org/license-1.html. If newer versions of this license are posted there, you may use a newer version instead, at your option.
This software consists of voluntary contributions made by many individuals. For exact contribution history, see the revision history and logs, available at http://subversion.tigris.org/.