Optionally, use internal code for SVN syncs.

This commit is contained in:
James Turner 2013-06-09 19:18:32 +01:00
parent ecec803388
commit 6a2e2b704e
3 changed files with 69 additions and 14 deletions

View File

@ -108,6 +108,7 @@ endif()
option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF) option(SIMGEAR_HEADLESS "Set to ON to build SimGear without GUI/graphics support" OFF)
option(JPEG_FACTORY "Enable JPEG-factory support" OFF) option(JPEG_FACTORY "Enable JPEG-factory support" OFF)
option(SG_SVN_CLIENT "Set to ON to build SimGear with built-in SVN support" OFF)
option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON) option(ENABLE_LIBSVN "Set to ON to build SimGear with libsvnclient support" ON)
option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF) option(ENABLE_RTI "Set to ON to build SimGear with RTI support" OFF)
option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON) option(ENABLE_TESTS "Set to OFF to disable building SimGear's test applications" ON)
@ -193,7 +194,9 @@ else()
message(STATUS "JPEG-factory: DISABLED") message(STATUS "JPEG-factory: DISABLED")
endif(JPEG_FACTORY) endif(JPEG_FACTORY)
if(ENABLE_LIBSVN) if (SG_SVN_CLIENT)
message(STATUS "Using built-in subversion client code")
elseif(ENABLE_LIBSVN)
find_package(SvnClient) find_package(SvnClient)
if(LIBSVN_FOUND) if(LIBSVN_FOUND)
@ -208,7 +211,7 @@ if(ENABLE_LIBSVN)
endif(LIBSVN_FOUND) endif(LIBSVN_FOUND)
else() else()
message(STATUS "Subversion client support: DISABLED") message(STATUS "Subversion client support: DISABLED")
endif(ENABLE_LIBSVN) endif(SG_SVN_CLIENT)
find_package(ZLIB REQUIRED) find_package(ZLIB REQUIRED)
find_package(Threads REQUIRED) find_package(Threads REQUIRED)

View File

@ -62,6 +62,11 @@
#include <simgear/misc/sg_dir.hxx> #include <simgear/misc/sg_dir.hxx>
#include <simgear/debug/BufferedLogCallback.hxx> #include <simgear/debug/BufferedLogCallback.hxx>
#ifdef SG_SVN_CLIENT
# include <simgear/io/HTTPClient.hxx>
# include <simgear/io/SVNRepository.hxx>
#endif
#ifdef HAVE_SVN_CLIENT_H #ifdef HAVE_SVN_CLIENT_H
# ifdef HAVE_LIBSVN_CLIENT_1 # ifdef HAVE_LIBSVN_CLIENT_1
# include <svn_version.h> # include <svn_version.h>
@ -80,6 +85,9 @@
{ "svn_client", svn_client_version }, { "svn_client", svn_client_version },
{ NULL, NULL } { NULL, NULL }
}; };
#endif
#if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
static const bool svn_built_in_available = true; static const bool svn_built_in_available = true;
#else #else
static const bool svn_built_in_available = false; static const bool svn_built_in_available = false;
@ -163,7 +171,7 @@ public:
void setUseSvn(bool use_svn) { _use_svn = use_svn;} void setUseSvn(bool use_svn) { _use_svn = use_svn;}
void setAllowedErrorCount(int errors) {_allowed_errors = errors;} void setAllowedErrorCount(int errors) {_allowed_errors = errors;}
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
void setUseBuiltin(bool built_in) { _use_built_in = built_in;} void setUseBuiltin(bool built_in) { _use_built_in = built_in;}
#endif #endif
@ -182,7 +190,13 @@ private:
bool syncTree(const char* dir, bool& isNewDirectory); bool syncTree(const char* dir, bool& isNewDirectory);
bool syncTreeExternal(const char* dir); bool syncTreeExternal(const char* dir);
#ifdef HAVE_SVN_CLIENT_H
#if defined(SG_SVN_CLIENT)
bool syncTreeInternal(const char* dir);
bool _use_built_in;
HTTP::Client _http;
std::auto_ptr<SVNRepository> _repository;
#elif defined(HAVE_SVN_CLIENT_H)
static int svnClientSetup(void); static int svnClientSetup(void);
bool syncTreeInternal(const char* dir); bool syncTreeInternal(const char* dir);
@ -224,7 +238,7 @@ SGTerraSync::SvnThread::SvnThread() :
_success_count(0), _success_count(0),
_consecutive_errors(0), _consecutive_errors(0),
_allowed_errors(6), _allowed_errors(6),
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
_use_built_in(true), _use_built_in(true),
#endif #endif
_is_dirty(false), _is_dirty(false),
@ -293,7 +307,7 @@ bool SGTerraSync::SvnThread::start()
return false; return false;
} }
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
_use_svn |= _use_built_in; _use_svn |= _use_built_in;
#endif #endif
@ -323,7 +337,7 @@ bool SGTerraSync::SvnThread::start()
_running = true; _running = true;
string status; string status;
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
if (_use_svn && _use_built_in) if (_use_svn && _use_built_in)
status = "Using built-in SVN support. "; status = "Using built-in SVN support. ";
else else
@ -369,7 +383,7 @@ bool SGTerraSync::SvnThread::syncTree(const char* dir, bool& isNewDirectory)
} }
} }
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
if (_use_built_in) if (_use_built_in)
return syncTreeInternal(dir); return syncTreeInternal(dir);
else else
@ -379,8 +393,44 @@ bool SGTerraSync::SvnThread::syncTree(const char* dir, bool& isNewDirectory)
} }
} }
#if defined(SG_SVN_CLIENT)
bool SGTerraSync::SvnThread::syncTreeInternal(const char* dir)
{
ostringstream command;
command << _svn_server << "/" << dir;
SGPath path(_local_dir);
path.append(dir);
_repository.reset(new SVNRepository(path, &_http));
_repository->setBaseUrl(command.str());
SGTimeStamp st;
st.stamp();
SG_LOG(SG_IO, SG_DEBUG, "terrasync: will sync " << command.str());
_repository->update();
bool result = true;
while (!_stop && _repository->isDoingSync()) {
_http.update(100);
}
if (_repository->failure() == SVNRepository::ERROR_NOT_FOUND) {
// this is fine, but maybe we should use a different return code
// in the future to higher layers can distuinguish this case
} else if (_repository->failure() != SVNRepository::NO_ERROR) {
result = false;
} else {
SG_LOG(SG_IO, SG_DEBUG, "sync of " << command.str() << " finished ("
<< st.elapsedMSec() << " msec");
}
_repository.reset();
return result;
}
#elif defined(HAVE_SVN_CLIENT_H)
#ifdef HAVE_SVN_CLIENT_H
bool SGTerraSync::SvnThread::syncTreeInternal(const char* dir) bool SGTerraSync::SvnThread::syncTreeInternal(const char* dir)
{ {
SG_LOG(SG_TERRAIN,SG_DEBUG, "Synchronizing scenery directory " << dir); SG_LOG(SG_TERRAIN,SG_DEBUG, "Synchronizing scenery directory " << dir);
@ -455,7 +505,7 @@ bool SGTerraSync::SvnThread::syncTreeInternal(const char* dir)
svn_pool_destroy(subpool); svn_pool_destroy(subpool);
return ReturnValue; return ReturnValue;
} }
#endif #endif // of HAVE_SVN_CLIENT_H
bool SGTerraSync::SvnThread::syncTreeExternal(const char* dir) bool SGTerraSync::SvnThread::syncTreeExternal(const char* dir)
{ {
@ -571,7 +621,7 @@ void SGTerraSync::SvnThread::run()
_is_dirty = true; _is_dirty = true;
} }
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H)
// Configure our subversion session // Configure our subversion session
int SGTerraSync::SvnThread::svnClientSetup(void) int SGTerraSync::SvnThread::svnClientSetup(void)
{ {
@ -670,7 +720,7 @@ int SGTerraSync::SvnThread::svnClientSetup(void)
_svn_pool = pool; _svn_pool = pool;
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
#endif #endif // of defined(HAVE_SVN_CLIENT_H)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// SGTerraSync //////////////////////////////////////////////////////////////// // SGTerraSync ////////////////////////////////////////////////////////////////
@ -722,7 +772,7 @@ void SGTerraSync::reinit()
_svnThread->setLocalDir(_terraRoot->getStringValue("scenery-dir","")); _svnThread->setLocalDir(_terraRoot->getStringValue("scenery-dir",""));
_svnThread->setAllowedErrorCount(_terraRoot->getIntValue("max-errors",5)); _svnThread->setAllowedErrorCount(_terraRoot->getIntValue("max-errors",5));
#ifdef HAVE_SVN_CLIENT_H #if defined(HAVE_SVN_CLIENT_H) or defined(SG_SVN_CLIENT)
_svnThread->setUseBuiltin(_terraRoot->getBoolValue("use-built-in-svn",true)); _svnThread->setUseBuiltin(_terraRoot->getBoolValue("use-built-in-svn",true));
#else #else
_terraRoot->setBoolValue("use-built-in-svn",false); _terraRoot->setBoolValue("use-built-in-svn",false);

View File

@ -21,3 +21,5 @@
#cmakedefine SYSTEM_EXPAT #cmakedefine SYSTEM_EXPAT
#cmakedefine ENABLE_SOUND #cmakedefine ENABLE_SOUND
#cmakedefine SG_SVN_CLIENT