DragonNest/Common/SVNLib/SVN.cpp
2024-12-19 09:48:26 +08:00

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;
}