149 lines
10 KiB
C++
149 lines
10 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;
|
||
}
|