447
512
return Py::String( stringbuf->data, (int)stringbuf->len );
515
Py::Object pysvn_client::cmd_checkin( const Py::Tuple &a_args, const Py::Dict &a_kws )
517
static argument_description args_desc[] =
520
{ true, name_log_message },
521
{ false, name_recurse },
522
#if defined( PYSVN_HAS_CLIENT_COMMIT2 )
523
{ false, name_keep_locks },
527
FunctionArguments args( "checkin", args_desc, a_args, a_kws );
530
SvnPool pool( m_context );
531
pysvn_commit_info_t *commit_info = NULL;
533
apr_array_header_t *targets = targetsFromStringOrList( args.getArg( name_path ), pool );
535
std::string type_error_message;
538
type_error_message = "expecting string for message (arg 2)";
540
std::string message( args.getUtf8String( name_log_message ) );
542
type_error_message = "expecting boolean for recurse keyword arg";
543
bool recurse = args.getBoolean( name_recurse, true );
545
#ifdef PYSVN_HAS_CLIENT_COMMIT2
546
type_error_message = "expecting boolean for keep_locks keyword arg";
547
bool keep_locks = args.getBoolean( name_keep_locks, true );
552
checkThreadPermission();
554
PythonAllowThreads permission( m_context );
556
m_context.setLogMessage( message );
558
#if defined( PYSVN_HAS_CLIENT_COMMIT3 )
559
svn_error_t *error = svn_client_commit3
561
&commit_info, // commit info type changed
568
#elif defined( PYSVN_HAS_CLIENT_COMMIT2 )
569
svn_error_t *error = svn_client_commit2
579
svn_error_t *error = svn_client_commit
583
!recurse, // non recursive
589
throw SvnException( error );
591
catch( SvnException &e )
593
// use callback error over ClientException
594
m_context.checkForError( m_module.client_error );
596
throw_client_error( e );
599
catch( Py::TypeError & )
601
throw Py::TypeError( type_error_message );
604
return toObject( commit_info );
450
607
Py::Object pysvn_client::cmd_checkout( const Py::Tuple &a_args, const Py::Dict &a_kws )
452
609
static argument_description args_desc[] =
862
992
return Py::String( stringbuf->data, (int)stringbuf->len );
995
#ifdef PYSVN_HAS_CLIENT_DIFF_PEG
996
Py::Object pysvn_client::cmd_diff_peg( const Py::Tuple &a_args, const Py::Dict &a_kws )
998
static argument_description args_desc[] =
1000
{ true, name_tmp_path },
1001
{ true, name_url_or_path },
1002
{ false, name_peg_revision },
1003
{ false, name_revision_start },
1004
{ false, name_revision_end },
1005
{ false, name_recurse },
1006
{ false, name_ignore_ancestry },
1007
{ false, name_diff_deleted },
1008
#ifdef PYSVN_HAS_CLIENT_DIFF_PEG2
1009
{ false, name_ignore_content_type },
1011
#if defined( PYSVN_HAS_CLIENT_DIFF_PEG3 )
1012
{ false, name_header_encoding },
1016
FunctionArguments args( "diff", args_desc, a_args, a_kws );
1019
std::string tmp_path( args.getUtf8String( name_tmp_path ) );
1020
std::string path( args.getUtf8String( name_url_or_path ) );
1021
svn_opt_revision_t revision_start = args.getRevision( name_revision1, svn_opt_revision_base );
1022
svn_opt_revision_t revision_end = args.getRevision( name_revision2, svn_opt_revision_working );
1023
svn_opt_revision_t peg_revision = args.getRevision( name_peg_revision, revision_end );
1024
bool recurse = args.getBoolean( name_recurse, true );
1025
bool ignore_ancestry = args.getBoolean( name_ignore_ancestry, true );
1026
bool diff_deleted = args.getBoolean( name_diff_deleted, true );
1027
#ifdef PYSVN_HAS_CLIENT_DIFF_PEG2
1028
bool ignore_content_type = args.getBoolean( name_ignore_content_type, false );
1030
#if defined( PYSVN_HAS_CLIENT_DIFF_PEG3 )
1031
std::string header_encoding( args.getUtf8String( name_header_encoding, empty_string ) );
1032
const char *header_encoding_ptr = APR_LOCALE_CHARSET;
1033
if( !header_encoding.empty() )
1034
header_encoding_ptr = header_encoding.c_str();
1037
SvnPool pool( m_context );
1039
svn_stringbuf_t *stringbuf = NULL;
1043
std::string norm_tmp_path( svnNormalisedIfPath( tmp_path, pool ) );
1044
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1046
checkThreadPermission();
1048
PythonAllowThreads permission( m_context );
1049
pysvn_apr_file output_file( pool );
1050
pysvn_apr_file error_file( pool );
1052
output_file.open_unique_file( norm_tmp_path );
1053
error_file.open_unique_file( norm_tmp_path );
1055
apr_array_header_t *options = apr_array_make( pool, 0, 0 );
1057
#if defined( PYSVN_HAS_CLIENT_DIFF_PEG3 )
1058
svn_error_t *error = svn_client_diff_peg3
1068
ignore_content_type,
1069
header_encoding_ptr,
1075
#elif defined( PYSVN_HAS_CLIENT_DIFF_PEG2 )
1076
svn_error_t *error = svn_client_diff_peg2
1086
ignore_content_type,
1093
svn_error_t *error = svn_client_diff_peg
1110
throw SvnException( error );
1112
output_file.close();
1114
output_file.open_tmp_file();
1115
error = svn_stringbuf_from_aprfile( &stringbuf, output_file.file(), pool );
1117
throw SvnException( error );
1119
catch( SvnException &e )
1121
// use callback error over ClientException
1122
m_context.checkForError( m_module.client_error );
1124
throw_client_error( e );
1127
// cannot convert to Unicode as we have no idea of the encoding of the bytes
1128
return Py::String( stringbuf->data, (int)stringbuf->len );
865
1132
Py::Object pysvn_client::cmd_export( const Py::Tuple &a_args, const Py::Dict &a_kws )
867
1134
static argument_description args_desc[] =
1259
Py::Object pysvn_client::cmd_import( const Py::Tuple &a_args, const Py::Dict &a_kws )
1261
static argument_description args_desc[] =
1263
{ true, name_path },
1265
{ true, name_log_message },
1266
{ false, name_recurse },
1267
#ifdef PYSVN_HAS_CLIENT_IMPORT2
1268
{ false, name_ignore },
1272
FunctionArguments args( "import_", args_desc, a_args, a_kws );
1275
std::string path( args.getUtf8String( name_path ) );
1276
std::string url( args.getUtf8String( name_url ) );
1277
std::string message( args.getUtf8String( name_log_message ) );
1279
bool recurse = args.getBoolean( name_recurse, true );
1280
#ifdef PYSVN_HAS_CLIENT_IMPORT2
1281
bool ignore = args.getBoolean( name_ignore, false );
1284
SvnPool pool( m_context );
1285
pysvn_commit_info_t *commit_info = NULL;
1289
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1291
checkThreadPermission();
1293
PythonAllowThreads permission( m_context );
1295
m_context.setLogMessage( message.c_str() );
1297
#if defined( PYSVN_HAS_CLIENT_IMPORT2 )
1298
svn_error_t *error = svn_client_import2
1300
&commit_info, // changed type
1303
!recurse, // non_recursive
1309
svn_error_t *error = svn_client_import
1314
!recurse, // non_recursive
1320
throw SvnException( error );
1322
catch( SvnException &e )
1324
// use callback error over ClientException
1325
m_context.checkForError( m_module.client_error );
1327
throw_client_error( e );
1330
return toObject( commit_info );
1333
Py::Object pysvn_client::cmd_info( const Py::Tuple &a_args, const Py::Dict &a_kws )
1335
static argument_description args_desc[] =
1337
{ true, name_path },
1340
FunctionArguments args( "info", args_desc, a_args, a_kws );
1343
std::string path( args.getUtf8String( name_path ) );
1345
SvnPool pool( m_context );
1348
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1350
checkThreadPermission();
1352
PythonAllowThreads permission( m_context );
1354
svn_wc_adm_access_t *adm_access = NULL;
1356
svn_error_t *error = svn_wc_adm_probe_open( &adm_access, NULL, norm_path.c_str(), false, false, pool );
1358
throw SvnException( error );
1360
const svn_wc_entry_t *entry = NULL;
1361
error = svn_wc_entry( &entry, norm_path.c_str(), adm_access, false, pool );
1363
throw SvnException( error );
1366
return Py::Nothing();
1368
return Py::asObject( new pysvn_entry( entry, m_context ) );
1370
catch( SvnException &e )
1372
// use callback error over ClientException
1373
m_context.checkForError( m_module.client_error );
1375
throw_client_error( e );
1376
return Py::Nothing(); // needed to remove warning about return value missing
965
1380
#ifdef PYSVN_HAS_CLIENT_INFO
966
1381
class InfoReceiveBaton
1061
Py::Object pysvn_client::cmd_info( const Py::Tuple &a_args, const Py::Dict &a_kws )
1063
static argument_description args_desc[] =
1065
{ true, name_path },
1068
FunctionArguments args( "info", args_desc, a_args, a_kws );
1071
std::string path( args.getUtf8String( name_path ) );
1073
SvnPool pool( m_context );
1076
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1078
checkThreadPermission();
1080
PythonAllowThreads permission( m_context );
1082
svn_wc_adm_access_t *adm_access = NULL;
1084
svn_error_t *error = svn_wc_adm_probe_open( &adm_access, NULL, norm_path.c_str(), false, false, pool );
1086
throw SvnException( error );
1088
const svn_wc_entry_t *entry = NULL;
1089
error = svn_wc_entry( &entry, norm_path.c_str(), adm_access, false, pool );
1091
throw SvnException( error );
1094
return Py::Nothing();
1096
return Py::asObject( new pysvn_entry( entry, m_context ) );
1098
catch( SvnException &e )
1100
// use callback error over ClientException
1101
m_context.checkForError( m_module.client_error );
1103
throw_client_error( e );
1104
return Py::Nothing(); // needed to remove warning about return value missing
1108
Py::Object pysvn_client::cmd_import( const Py::Tuple &a_args, const Py::Dict &a_kws )
1110
static argument_description args_desc[] =
1112
{ true, name_path },
1114
{ true, name_log_message },
1115
{ false, name_recurse },
1118
FunctionArguments args( "import_", args_desc, a_args, a_kws );
1121
std::string path( args.getUtf8String( name_path ) );
1122
std::string url( args.getUtf8String( name_url ) );
1123
std::string message( args.getUtf8String( name_log_message ) );
1125
bool recurse = args.getBoolean( name_recurse, true );
1127
SvnPool pool( m_context );
1128
svn_client_commit_info_t *commit_info = NULL;
1132
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1134
checkThreadPermission();
1136
PythonAllowThreads permission( m_context );
1138
m_context.setLogMessage( message.c_str() );
1140
svn_error_t *error = svn_client_import
1145
!recurse, // non_recursive
1151
throw SvnException( error );
1153
catch( SvnException &e )
1155
// use callback error over ClientException
1156
m_context.checkForError( m_module.client_error );
1158
throw_client_error( e );
1161
return toObject( commit_info );
1165
1480
class LogChangePathInfo
1563
1915
svn_error_t *error = svn_client_merge
1565
norm_path1.c_str (),
1567
norm_path2.c_str (),
1569
norm_local_path.c_str (),
1578
throw SvnException( error );
1580
catch( SvnException &e )
1582
// use callback error over ClientException
1583
m_context.checkForError( m_module.client_error );
1585
throw_client_error( e );
1588
return Py::Nothing();
1921
norm_local_path.c_str(),
1930
throw SvnException( error );
1932
catch( SvnException &e )
1934
// use callback error over ClientException
1935
m_context.checkForError( m_module.client_error );
1937
throw_client_error( e );
1940
return Py::Nothing();
1943
#ifdef PYSVN_HAS_CLIENT_MERGE_PEG
1944
Py::Object pysvn_client::cmd_merge_peg( const Py::Tuple &a_args, const Py::Dict &a_kws )
1946
static argument_description args_desc[] =
1948
{ true, name_url_or_path },
1949
{ true, name_revision1 },
1950
{ true, name_revision2 },
1951
{ true, name_peg_revision },
1952
{ true, name_local_path },
1953
{ false, name_recurse },
1954
{ false, name_notice_ancestry },
1955
{ false, name_force },
1956
{ false, name_dry_run },
1959
FunctionArguments args( "merge", args_desc, a_args, a_kws );
1962
std::string path( args.getUtf8String( name_url_or_path ) );
1963
svn_opt_revision_t revision1 = args.getRevision( name_revision1, svn_opt_revision_head );
1964
svn_opt_revision_t revision2 = args.getRevision( name_revision2, svn_opt_revision_head );
1965
svn_opt_revision_t peg_revision = args.getRevision( name_revision2, revision2 );
1966
std::string local_path( args.getUtf8String( name_local_path ) );
1968
bool force = args.getBoolean( name_force, false );
1969
bool recurse = args.getBoolean( name_recurse, true );
1970
bool notice_ancestry = args.getBoolean( name_notice_ancestry, false );
1971
bool dry_run = args.getBoolean( name_dry_run, false );
1973
SvnPool pool( m_context );
1977
std::string norm_path( svnNormalisedIfPath( path, pool ) );
1978
std::string norm_local_path( svnNormalisedIfPath( local_path, pool ) );
1980
checkThreadPermission();
1982
PythonAllowThreads permission( m_context );
1984
svn_error_t *error = svn_client_merge_peg
1990
norm_local_path.c_str(),
1999
throw SvnException( error );
2001
catch( SvnException &e )
2003
// use callback error over ClientException
2004
m_context.checkForError( m_module.client_error );
2006
throw_client_error( e );
2009
return Py::Nothing();
1591
2013
Py::Object pysvn_client::cmd_mkdir( const Py::Tuple &a_args, const Py::Dict &a_kws )
3225
#ifdef PYSVN_HAS_CLIENT_UPDATE2
3226
Py::Object pysvn_client::cmd_update( const Py::Tuple &a_args, const Py::Dict &a_kws )
3228
static argument_description args_desc[] =
3230
{ true, name_path },
3231
{ false, name_recurse },
3232
{ false, name_revision },
3233
#ifdef PYSVN_HAS_CLIENT_UPDATE2
3234
{ false, name_ignore_externals },
3238
FunctionArguments args( "update", args_desc, a_args, a_kws );
3241
SvnPool pool( m_context );
3243
apr_array_header_t *targets = targetsFromStringOrList( args.getArg( name_path ), pool );
3245
svn_opt_revision_t revision = args.getRevision( name_revision, svn_opt_revision_head );
3246
bool recurse = args.getBoolean( name_recurse, true );
3247
#ifdef PYSVN_HAS_CLIENT_UPDATE2
3248
bool ignore_externals = args.getBoolean( name_recurse, false );
3250
apr_array_header_t *result_revs = NULL;
3254
checkThreadPermission();
3256
PythonAllowThreads permission( m_context );
3258
#ifdef PYSVN_HAS_CLIENT_UPDATE2
3259
svn_error_t *error = svn_client_update2
3270
svn_error_t *error = svn_client_update
3281
throw SvnException( error );
3283
catch( SvnException &e )
3285
// use callback error over ClientException
3286
m_context.checkForError( m_module.client_error );
3288
throw_client_error( e );
3291
return revnumListToObject( result_revs, pool );
2667
3295
Py::Object pysvn_client::cmd_update( const Py::Tuple &a_args, const Py::Dict &a_kws )
2669
3297
static argument_description args_desc[] =
2896
3526
void pysvn_client::init_type()
2898
3528
behaviors().name("Client");
2899
behaviors().doc( class_client_doc );
3529
behaviors().doc( pysvn_client_doc );
2900
3530
behaviors().supportGetattr();
2901
3531
behaviors().supportSetattr();
2903
add_keyword_method("add", &pysvn_client::cmd_add, PYSVN_ADD_DOC );
2904
add_keyword_method("annotate", &pysvn_client::cmd_annotate, PYSVN_ANNOTATE_DOC );
2905
add_keyword_method("cat", &pysvn_client::cmd_cat, PYSVN_CAT_DOC );
2906
add_keyword_method("checkin", &pysvn_client::cmd_checkin, PYSVN_CHECKIN_DOC );
2907
add_keyword_method("checkout", &pysvn_client::cmd_checkout, PYSVN_CHECKOUT_DOC );
2908
add_keyword_method("cleanup", &pysvn_client::cmd_cleanup, PYSVN_CLEANUP_DOC );
2909
add_keyword_method("copy", &pysvn_client::cmd_copy, PYSVN_COPY_DOC );
2910
add_keyword_method("diff", &pysvn_client::cmd_diff, PYSVN_DIFF_DOC );
2911
add_keyword_method("export", &pysvn_client::cmd_export, PYSVN_EXPORT_DOC );
2912
add_keyword_method("import_", &pysvn_client::cmd_import, PYSVN_IMPORT_DOC );
2913
add_keyword_method("info", &pysvn_client::cmd_info, PYSVN_INFO_DOC );
3533
add_keyword_method("add", &pysvn_client::cmd_add, pysvn_client_add_doc );
3534
add_keyword_method("annotate", &pysvn_client::cmd_annotate, pysvn_client_annotate_doc );
3535
add_keyword_method("cat", &pysvn_client::cmd_cat, pysvn_client_cat_doc );
3536
add_keyword_method("checkin", &pysvn_client::cmd_checkin, pysvn_client_checkin_doc );
3537
add_keyword_method("checkout", &pysvn_client::cmd_checkout, pysvn_client_checkout_doc );
3538
add_keyword_method("cleanup", &pysvn_client::cmd_cleanup, pysvn_client_cleanup_doc );
3539
add_keyword_method("copy", &pysvn_client::cmd_copy, pysvn_client_copy_doc );
3540
add_keyword_method("diff", &pysvn_client::cmd_diff, pysvn_client_diff_doc );
3541
add_keyword_method("export", &pysvn_client::cmd_export, pysvn_client_export_doc );
3542
add_keyword_method("import_", &pysvn_client::cmd_import, pysvn_client_import__doc );
3543
add_keyword_method("info", &pysvn_client::cmd_info, pysvn_client_info_doc );
2915
3545
#ifdef PYSVN_HAS_CLIENT_INFO
2916
add_keyword_method("info2", &pysvn_client::cmd_info2, PYSVN_INFO2_DOC );
2918
add_keyword_method("is_url", &pysvn_client::is_url, IS_URL_DOC );
2919
#ifdef PYSVN_HAS_CLIENT_LOCK
2920
add_keyword_method("lock", &pysvn_client::cmd_lock, PYSVN_LOCK_DOC );
2922
add_keyword_method("log", &pysvn_client::cmd_log, PYSVN_LOG_DOC );
2923
add_keyword_method("ls", &pysvn_client::cmd_ls, PYSVN_LS_DOC );
2924
add_keyword_method("merge", &pysvn_client::cmd_merge, PYSVN_MERGE_DOC );
2925
add_keyword_method("mkdir", &pysvn_client::cmd_mkdir, PYSVN_MKDIR_DOC );
2926
add_keyword_method("move", &pysvn_client::cmd_move, PYSVN_MOVE_DOC );
2927
add_keyword_method("propdel", &pysvn_client::cmd_propdel, PYSVN_PROPDEL_DOC );
2928
add_keyword_method("propget", &pysvn_client::cmd_propget, PYSVN_PROPGET_DOC );
2929
add_keyword_method("proplist", &pysvn_client::cmd_proplist, PYSVN_PROPLIST_DOC );
2930
add_keyword_method("propset", &pysvn_client::cmd_propset, PYSVN_PROPSET_DOC );
2931
add_keyword_method("relocate", &pysvn_client::cmd_relocate, PYSVN_RELOCATE_DOC );
2932
add_keyword_method("remove", &pysvn_client::cmd_remove, PYSVN_REMOVE_DOC );
2933
add_keyword_method("resolved", &pysvn_client::cmd_resolved, PYSVN_RESOLVED_DOC );
2934
add_keyword_method("revert", &pysvn_client::cmd_revert, PYSVN_REVERT_DOC );
2935
add_keyword_method("revpropdel", &pysvn_client::cmd_revpropdel, PYSVN_REVPROPDEL_DOC );
2936
add_keyword_method("revpropget", &pysvn_client::cmd_revpropget, PYSVN_REVPROPGET_DOC );
2937
add_keyword_method("revproplist", &pysvn_client::cmd_revproplist, PYSVN_REVPROPLIST_DOC );
2938
add_keyword_method("revpropset", &pysvn_client::cmd_revpropset, PYSVN_REVPROPSET_DOC );
2939
add_keyword_method("get_auth_cache", &pysvn_client::get_auth_cache, GET_AUTH_CACHE_DOC );
2940
add_keyword_method("set_auth_cache", &pysvn_client::set_auth_cache, SET_AUTH_CACHE_DOC );
2941
add_keyword_method("get_auto_props", &pysvn_client::get_auto_props, GET_AUTO_PROPS_DOC );
2942
add_keyword_method("set_auto_props", &pysvn_client::set_auto_props, SET_AUTO_PROPS_DOC );
2943
add_keyword_method("status", &pysvn_client::cmd_status, PYSVN_STATUS_DOC );
2944
add_keyword_method("switch", &pysvn_client::cmd_switch, PYSVN_SWITCH_DOC );
2945
#ifdef PYSVN_HAS_CLIENT_LOCK
2946
add_keyword_method("unlock", &pysvn_client::cmd_unlock, PYSVN_UNLOCK_DOC );
2948
add_keyword_method("update", &pysvn_client::cmd_update, PYSVN_UPDATE_DOC );
3546
add_keyword_method("info2", &pysvn_client::cmd_info2, pysvn_client_info2_doc );
3548
add_keyword_method("is_url", &pysvn_client::is_url, pysvn_client_is_url_doc );
3549
#ifdef PYSVN_HAS_CLIENT_LOCK
3550
add_keyword_method("lock", &pysvn_client::cmd_lock, pysvn_client_lock_doc );
3552
add_keyword_method("log", &pysvn_client::cmd_log, pysvn_client_log_doc );
3553
add_keyword_method("ls", &pysvn_client::cmd_ls, pysvn_client_ls_doc );
3554
add_keyword_method("merge", &pysvn_client::cmd_merge, pysvn_client_merge_doc );
3555
add_keyword_method("mkdir", &pysvn_client::cmd_mkdir, pysvn_client_mkdir_doc );
3556
add_keyword_method("move", &pysvn_client::cmd_move, pysvn_client_move_doc );
3557
add_keyword_method("propdel", &pysvn_client::cmd_propdel, pysvn_client_propdel_doc );
3558
add_keyword_method("propget", &pysvn_client::cmd_propget, pysvn_client_propget_doc );
3559
add_keyword_method("proplist", &pysvn_client::cmd_proplist, pysvn_client_proplist_doc );
3560
add_keyword_method("propset", &pysvn_client::cmd_propset, pysvn_client_propset_doc );
3561
add_keyword_method("relocate", &pysvn_client::cmd_relocate, pysvn_client_relocate_doc );
3562
add_keyword_method("remove", &pysvn_client::cmd_remove, pysvn_client_remove_doc );
3563
add_keyword_method("resolved", &pysvn_client::cmd_resolved, pysvn_client_resolved_doc );
3564
add_keyword_method("revert", &pysvn_client::cmd_revert, pysvn_client_revert_doc );
3565
add_keyword_method("revpropdel", &pysvn_client::cmd_revpropdel, pysvn_client_revpropdel_doc );
3566
add_keyword_method("revpropget", &pysvn_client::cmd_revpropget, pysvn_client_revpropget_doc );
3567
add_keyword_method("revproplist", &pysvn_client::cmd_revproplist, pysvn_client_revproplist_doc );
3568
add_keyword_method("revpropset", &pysvn_client::cmd_revpropset, pysvn_client_revpropset_doc );
3569
add_keyword_method("get_auth_cache", &pysvn_client::get_auth_cache, pysvn_client_get_auth_cache_doc );
3570
add_keyword_method("set_auth_cache", &pysvn_client::set_auth_cache, pysvn_client_set_auth_cache_doc );
3571
add_keyword_method("get_auto_props", &pysvn_client::get_auto_props, pysvn_client_get_auto_props_doc );
3572
add_keyword_method("set_auto_props", &pysvn_client::set_auto_props, pysvn_client_set_auto_props_doc );
3573
add_keyword_method("status", &pysvn_client::cmd_status, pysvn_client_status_doc );
3574
add_keyword_method("switch", &pysvn_client::cmd_switch, pysvn_client_switch_doc );
3575
#ifdef PYSVN_HAS_CLIENT_LOCK
3576
add_keyword_method("unlock", &pysvn_client::cmd_unlock, pysvn_client_unlock_doc );
3578
add_keyword_method("update", &pysvn_client::cmd_update, pysvn_client_update_doc );
2951
3581
//--------------------------------------------------------------------------------