149 lines
4.9 KiB
C++
149 lines
4.9 KiB
C++
#include "StdAfx.h"
|
|
#include "SVN.h"
|
|
#include "svn_config.h"
|
|
|
|
CSVN::CSVN(void)
|
|
{
|
|
m_pCTX = NULL;
|
|
m_bPoolInit = false;
|
|
m_pBasePool = NULL;
|
|
m_pAuthBaton = NULL;
|
|
}
|
|
|
|
CSVN::~CSVN(void)
|
|
{
|
|
if( m_pBasePool )
|
|
{
|
|
svn_pool_destroy( m_pBasePool );
|
|
}
|
|
if( m_bPoolInit )
|
|
{
|
|
apr_pool_terminate();
|
|
}
|
|
}
|
|
|
|
void CSVN::Initialize( const char *pUserName, const char *pPassword )
|
|
{
|
|
apr_pool_initialize();
|
|
m_bPoolInit = true;
|
|
m_pBasePool = svn_pool_create( NULL );
|
|
svn_client_create_context( &m_pCTX, m_pBasePool );
|
|
AuthSVN( m_pBasePool, m_pCTX );
|
|
|
|
svn_auth_set_parameter( m_pAuthBaton, SVN_AUTH_PARAM_DEFAULT_USERNAME, pUserName );
|
|
svn_auth_set_parameter( m_pAuthBaton, SVN_AUTH_PARAM_DEFAULT_PASSWORD, pPassword );
|
|
}
|
|
|
|
void CSVN::AuthSVN( apr_pool_t *pool, svn_client_ctx_t* ctx )
|
|
{
|
|
// set up authentication
|
|
|
|
svn_auth_provider_object_t *provider;
|
|
|
|
/* The whole list of registered providers */
|
|
apr_array_header_t *providers = apr_array_make (pool, 11, sizeof (svn_auth_provider_object_t *));
|
|
|
|
/* The main disk-caching auth providers, for both
|
|
'username/password' creds and 'username' creds. */
|
|
svn_auth_get_windows_simple_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
svn_auth_get_simple_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
svn_auth_get_username_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
|
|
/* The server-cert, client-cert, and client-cert-password providers. */
|
|
svn_auth_get_ssl_server_trust_file_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
svn_auth_get_ssl_client_cert_file_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
svn_auth_get_ssl_client_cert_pw_file_provider (&provider, pool);
|
|
APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
|
|
|
|
/* Build an authentication baton to give to libsvn_client. */
|
|
svn_auth_open ( &m_pAuthBaton, providers, pool );
|
|
ctx->auth_baton = m_pAuthBaton;
|
|
}
|
|
|
|
void *CSVN::logMessage ( const char *message, char *baseDirectory )
|
|
{
|
|
log_msg_baton2 *baton = (log_msg_baton2 *) apr_palloc (m_pBasePool, sizeof (*baton));
|
|
baton->message = apr_pstrdup(m_pBasePool, message);
|
|
baton->base_dir = baseDirectory ? baseDirectory : "";
|
|
|
|
baton->message_encoding = NULL;
|
|
baton->tmpfile_left = NULL;
|
|
baton->pool = m_pBasePool;
|
|
|
|
return baton;
|
|
}
|
|
|
|
BOOL CSVN::Checkout( const char *moduleName, const char *destPath, BOOL recurse, BOOL bIgnoreExternals )
|
|
{
|
|
apr_pool_t *pPool = svn_pool_create( m_pBasePool );
|
|
svn_opt_revision_t Revision;
|
|
Revision.kind = svn_opt_revision_head;
|
|
svn_error_t *Err = svn_client_checkout2 ( NULL, moduleName, destPath, &Revision, &Revision, recurse, bIgnoreExternals, m_pCTX, pPool );
|
|
svn_pool_destroy( pPool );
|
|
if(Err != NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSVN::Lock( const char *pLockItem, BOOL bStealLock, const char *pComment )
|
|
{
|
|
apr_array_header_t *targets = apr_array_make( m_pBasePool, 1, sizeof( const char * ) );
|
|
const char * target = apr_pstrdup ( m_pBasePool, pLockItem );
|
|
( *( ( const char ** )apr_array_push(targets ) ) ) = target;
|
|
svn_error_t *Err = svn_client_lock( targets, pComment, bStealLock, m_pCTX, m_pBasePool );
|
|
return ( Err == NULL );
|
|
}
|
|
|
|
BOOL CSVN::Unlock( const char *pUnlockItem, BOOL bBreakLock )
|
|
{
|
|
apr_array_header_t *targets = apr_array_make( m_pBasePool, 1, sizeof( const char * ) );
|
|
const char * target = apr_pstrdup ( m_pBasePool, pUnlockItem );
|
|
( *( ( const char ** )apr_array_push(targets ) ) ) = target;
|
|
svn_error_t *Err = svn_client_unlock( targets, bBreakLock, m_pCTX, m_pBasePool );
|
|
return (Err == NULL);
|
|
}
|
|
|
|
int CSVN::Commit( const char *pCommitItem, const char *pMessage, BOOL recurse, BOOL keep_locks )
|
|
{
|
|
svn_commit_info_t *commit_info = svn_create_commit_info( m_pBasePool );
|
|
|
|
m_pCTX->log_msg_baton2 = logMessage( pMessage );
|
|
apr_array_header_t *targets = apr_array_make( m_pBasePool, 1, sizeof( const char * ) );
|
|
const char * target = apr_pstrdup ( m_pBasePool, pCommitItem );
|
|
( *( ( const char ** )apr_array_push(targets ) ) ) = target;
|
|
svn_error_t *Err = svn_client_commit3( &commit_info, targets, recurse, keep_locks, m_pCTX, m_pBasePool );
|
|
m_pCTX->log_msg_baton2 = logMessage("");
|
|
if(Err != NULL)
|
|
{
|
|
return 0;
|
|
}
|
|
if( commit_info && SVN_IS_VALID_REVNUM( commit_info->revision ) )
|
|
{
|
|
return commit_info->revision;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
BOOL CSVN::MakeDir( const char *pDir, const char *pComment )
|
|
{
|
|
svn_commit_info_t *commit_info = svn_create_commit_info( m_pBasePool );
|
|
m_pCTX->log_msg_baton2 = logMessage( pComment );
|
|
apr_array_header_t *targets = apr_array_make( m_pBasePool, 1, sizeof( const char * ) );
|
|
const char * target = apr_pstrdup ( m_pBasePool, pDir );
|
|
( *( ( const char ** )apr_array_push( targets ) ) ) = target;
|
|
svn_error_t *Err = svn_client_mkdir2 ( &commit_info, targets, m_pCTX, m_pBasePool );
|
|
if(Err != NULL)
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|