From 2710564c7d3c3e95361a366441d3b96a6049ee05 Mon Sep 17 00:00:00 2001 From: fredb Date: Sun, 19 Oct 2008 16:08:29 +0000 Subject: [PATCH] Alex Perry : This patch changes terrasync so it links against the subversion library if you have it installed. It supports people who build binary releases for use by non-developers by removing the runtime external dependency on having command line svn or rsync available. Since the patch changes autoconf to detect libsvn, I'd appreciate it if people who release binaries could verify that the detection scripting works for their platform. Developer warning: If you do have libsvn developer libraries installed, terrasync changes its default option from "-R" to "-S" to remove the command line dependency. However, Martin has not yet uploaded world scenery into the subversion repository so it won't be useful to fly against and you may want to specify "-R" on the command line in the short term. Or run both. Me: Update MSVC 7.1 project file. Need svn-win32-1.x.y_dev.zip and svn-win32-1.x.y.zip located at http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=8100 --- configure.ac | 22 +- projects/VC7.1/terrasync.vcproj | 16 +- src/AIModel/AIAircraft.cxx | 8 +- src/AIModel/AIAircraft.hxx | 2 +- src/Model/modelmgr.cxx | 34 +-- utils/TerraSync/Makefile.am | 4 +- utils/TerraSync/terrasync.cxx | 365 ++++++++++++++++++++++++++++---- 7 files changed, 379 insertions(+), 72 deletions(-) diff --git a/configure.ac b/configure.ac index 59fa9a659..9add3a028 100644 --- a/configure.ac +++ b/configure.ac @@ -597,7 +597,27 @@ if test "x$ac_cv_header_zlib_h" != "xyes"; then echo fi - +dnl Check for Subversion library support +save_LIBS=$LIBS +save_CPPFLAGS=$CPPFLAGS +LIBS="" +CPPFLAGS="-I/usr/include/subversion-1 -I/usr/include/apr-1.0" +AC_CHECK_LIB(svn_client-1, svn_client_checkout3) +AC_CHECK_HEADERS([svn_client.h]) +if test "x$ac_cv_header_svn_client_h" != "xyes"; then + echo "TerraSync will shell out for command line subversion" + svn_LIBS="" + svn_CPPFLAGS="" +else + echo "TerraSync will use integrated subversion library" + AC_SEARCH_LIBS(svn_client_checkout, svn_client-1) + svn_LIBS=$LIBS + svn_CPPFLAGS=$CPPFLAGS + AC_SUBST(svn_LIBS) + AC_SUBST(svn_CPPFLAGS) +fi +LIBS=$save_LIBS +CPPFLAGS=$save_CPPFLAGS dnl Checks for header files. AC_HEADER_STDC diff --git a/projects/VC7.1/terrasync.vcproj b/projects/VC7.1/terrasync.vcproj index 4e02f0828..2f7e7e120 100755 --- a/projects/VC7.1/terrasync.vcproj +++ b/projects/VC7.1/terrasync.vcproj @@ -19,8 +19,8 @@ getStartTime(); if (! fp->isActive(now)) { - throw FP_Inactive(); + return false; } } else { // no flight plan, update target heading, speed, and altitude @@ -789,6 +790,7 @@ void FGAIAircraft::updatePrimaryTargetValues() { AccelTo( props->getDoubleValue("controls/flight/target-spd" ) ); } + return true; } void FGAIAircraft::updatePosition() { diff --git a/src/AIModel/AIAircraft.hxx b/src/AIModel/AIAircraft.hxx index 9722e3556..85fca1040 100644 --- a/src/AIModel/AIAircraft.hxx +++ b/src/AIModel/AIAircraft.hxx @@ -117,7 +117,7 @@ private: void controlHeading(FGAIFlightPlan::waypoint* curr); void controlSpeed(FGAIFlightPlan::waypoint* curr, FGAIFlightPlan::waypoint* next); - void updatePrimaryTargetValues(); + bool updatePrimaryTargetValues(); void updateSecondaryTargetValues(); void updatePosition(); void updateHeading(); diff --git a/src/Model/modelmgr.cxx b/src/Model/modelmgr.cxx index 2b547cf02..41eaa6cd2 100644 --- a/src/Model/modelmgr.cxx +++ b/src/Model/modelmgr.cxx @@ -156,23 +156,23 @@ struct UpdateFunctor : public std::unary_function SGModelPlacement* model = instance->model; double lon, lat, elev, roll, pitch, heading; - try { - // Optionally set position from properties - if (instance->lon_deg_node != 0) - lon = testNan(instance->lon_deg_node->getDoubleValue()); - if (instance->lat_deg_node != 0) - lat = testNan(instance->lat_deg_node->getDoubleValue()); - if (instance->elev_ft_node != 0) - elev = testNan(instance->elev_ft_node->getDoubleValue()); - - // Optionally set orientation from properties - if (instance->roll_deg_node != 0) - roll = testNan(instance->roll_deg_node->getDoubleValue()); - if (instance->pitch_deg_node != 0) - pitch = testNan(instance->pitch_deg_node->getDoubleValue()); - if (instance->heading_deg_node != 0) - heading = testNan(instance->heading_deg_node->getDoubleValue()); - } catch (const sg_range_exception& e) { + // Optionally set position from properties + if (instance->lon_deg_node != 0) + lon =instance->lon_deg_node->getDoubleValue(); + if (instance->lat_deg_node != 0) + lat = instance->lat_deg_node->getDoubleValue(); + if (instance->elev_ft_node != 0) + elev = instance->elev_ft_node->getDoubleValue(); + + // Optionally set orientation from properties + if (instance->roll_deg_node != 0) + roll = instance->roll_deg_node->getDoubleValue(); + if (instance->pitch_deg_node != 0) + pitch = instance->pitch_deg_node->getDoubleValue(); + if (instance->heading_deg_node != 0) + heading = instance->heading_deg_node->getDoubleValue(); + if ( osg::isNaN(lon) || osg::isNaN(lat) || osg::isNaN(elev) || + osg::isNaN(roll) || osg::isNaN(pitch) || osg::isNaN(heading) ) { const char *path = instance->node->getStringValue("path", "unknown"); SG_LOG(SG_GENERAL, SG_INFO, "Instance of model " << path diff --git a/utils/TerraSync/Makefile.am b/utils/TerraSync/Makefile.am index e4de6c3ab..aebd95960 100644 --- a/utils/TerraSync/Makefile.am +++ b/utils/TerraSync/Makefile.am @@ -4,4 +4,6 @@ bin_PROGRAMS = terrasync terrasync_SOURCES = terrasync.cxx -terrasync_LDADD = -lplibnet -lplibul -lsgmisc -lsgdebug $(network_LIBS) +AM_CPPFLAGS = $(svn_CPPFLAGS) + +terrasync_LDADD = -lplibnet -lplibul -lsgmisc -lsgdebug $(network_LIBS) $(svn_LIBS) diff --git a/utils/TerraSync/terrasync.cxx b/utils/TerraSync/terrasync.cxx index 1786be923..1545aa7b8 100644 --- a/utils/TerraSync/terrasync.cxx +++ b/utils/TerraSync/terrasync.cxx @@ -43,29 +43,338 @@ #include #include +#ifdef HAVE_SVN_CLIENT_H +# ifdef HAVE_LIBSVN_CLIENT_1 +# include +# include +# include +# include +# else +# undef HAVE_SVN_CLIENT_H +# endif +#endif + using std::string; using std::cout; using std::endl; +const char* source_base = NULL; const char* svn_base = "http://terrascenery.googlecode.com/svn/trunk/data/Scenery"; const char* rsync_base = "scenery.flightgear.org::Scenery"; -const char* source_base = NULL; const char* dest_base = "terrasyncdir"; -bool use_svn = false; - -const char* svn_cmd = "svn checkout"; const char* rsync_cmd = "rsync --verbose --archive --delete --perms --owner --group"; +#ifdef HAVE_SVN_CLIENT_H +bool use_svn = true; +#else +bool use_svn = false; +const char* svn_cmd = "svn checkout"; +#endif // display usage static void usage( const string& prog ) { cout << "Usage: " << endl << prog << " -p " - << "[ -R ] [ -s ] -d " << endl + << "-R [ -s ] -d " << endl << prog << " -p " - << " -S [ -s ] -d " << endl; +<<<<<<< terrasync.cxx + << "-S [ -s ] -d " << endl; +#ifdef HAVE_SVN_CLIENT_H + cout << " (defaults to the built in subversion)" << endl; +#else + cout << " (defaults to rsync, using external commands)" << endl; +#endif +} + +#ifdef HAVE_SVN_CLIENT_H + +// Things we need for doing subversion checkout - often +apr_pool_t *mysvn_pool = NULL; +svn_client_ctx_t *mysvn_ctx = NULL; +svn_opt_revision_t *mysvn_rev = NULL; + +static const svn_version_checklist_t mysvn_checklist[] = { + { "svn_subr", svn_subr_version }, + { "svn_client", svn_client_version }, + { "svn_wc", svn_wc_version }, + { "svn_ra", svn_ra_version }, + { "svn_delta", svn_delta_version }, + { "svn_diff", svn_diff_version }, + { NULL, NULL } +}; + +// Configure our subversion session +int mysvn_setup(void) { + // Are we already prepared? + if (mysvn_pool) return EXIT_SUCCESS; + // No, so initialize svn internals generally + if (svn_cmdline_init("terrasync", stderr) != EXIT_SUCCESS) + return EXIT_FAILURE; + apr_pool_t *pool; + apr_pool_create(&pool, NULL); + svn_error_t *err = NULL; + SVN_VERSION_DEFINE(mysvn_version); + err = svn_ver_check_list(&mysvn_version, mysvn_checklist); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_ra_initialize(pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + char *config_dir = NULL; + err = svn_config_ensure(config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_client_create_context(&mysvn_ctx, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_config_get_config(&(mysvn_ctx->config), + config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_config_t *cfg; + cfg = ( svn_config_t*) apr_hash_get( + mysvn_ctx->config, + SVN_CONFIG_CATEGORY_CONFIG, + APR_HASH_KEY_STRING); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_auth_baton_t *ab; + err = svn_cmdline_setup_auth_baton(&ab, + TRUE, NULL, NULL, config_dir, TRUE, cfg, + mysvn_ctx->cancel_func, mysvn_ctx->cancel_baton, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + mysvn_ctx->auth_baton = ab; + mysvn_ctx->conflict_func = NULL; + mysvn_ctx->conflict_baton = NULL; + mysvn_rev = (svn_opt_revision_t*) apr_palloc(pool, + sizeof(svn_opt_revision_t)); + if (!mysvn_rev) + return EXIT_FAILURE; + mysvn_rev->kind = svn_opt_revision_head; + // Success if we got this far + mysvn_pool = pool; + return EXIT_SUCCESS; +} + +#endif + +// sync one directory tree +void sync_tree(char* dir) { + int rc; + char command[512]; + SGPath path( dest_base ); + + path.append( dir ); + rc = path.create_dir( 0755 ); + if (rc) { + cout << "Return code = " << rc << endl; + exit(1); + } + + if (use_svn) { +#ifdef HAVE_SVN_CLIENT_H + cout << dir << " ... "; + cout.flush(); + char dest_base_dir[512]; + snprintf( command, 512, + "%s/%s", source_base, dir); + snprintf( dest_base_dir, 512, + "%s/%s", dest_base, dir); + svn_error_t *err = NULL; + if (mysvn_setup() != EXIT_SUCCESS) + exit(1); + apr_pool_t *subpool = svn_pool_create(mysvn_pool); + err = svn_client_checkout(NULL, + command, + dest_base_dir, + mysvn_rev, + 1, + mysvn_ctx, + subpool); + if (err) { + // Report errors from the checkout attempt + cout << "failed: " << endl + << err->message << endl; + svn_error_clear(err); + return; + } else { + cout << "done" << endl; + } + svn_pool_destroy(subpool); + return; +#else + + snprintf( command, 512, + "%s %s/%s %s/%s", svn_cmd, + source_base, dir, + dest_base, dir ); +#endif + } else { + snprintf( command, 512, + "%s %s/%s/ %s/%s/", rsync_cmd, + source_base, dir, + dest_base, dir ); + } + cout << command << endl; + rc = system( command ); + if (rc) { + cout << "Return code = " << rc << endl; + if (rc == 5120) exit(1); + } +======= + << "-S [ -s ] -d " << endl; +#ifdef HAVE_SVN_CLIENT_H + cout << " (defaults to the built in subversion)" << endl; +#else + cout << " (defaults to rsync, using external commands)" << endl; +#endif +} + +#ifdef HAVE_SVN_CLIENT_H + +// Things we need for doing subversion checkout - often +apr_pool_t *mysvn_pool = NULL; +svn_client_ctx_t *mysvn_ctx = NULL; +svn_opt_revision_t *mysvn_rev = NULL; + +static const svn_version_checklist_t mysvn_checklist[] = { + { "svn_subr", svn_subr_version }, + { "svn_client", svn_client_version }, + { "svn_wc", svn_wc_version }, + { "svn_ra", svn_ra_version }, + { "svn_delta", svn_delta_version }, + { "svn_diff", svn_diff_version }, + { NULL, NULL } +}; + +// Configure our subversion session +int mysvn_setup(void) { + // Are we already prepared? + if (mysvn_pool) return EXIT_SUCCESS; + // No, so initialize svn internals generally +#ifdef _MSC_VER + if (svn_cmdline_init("terrasync", 0) != EXIT_SUCCESS) + return EXIT_FAILURE; +#else + if (svn_cmdline_init("terrasync", stderr) != EXIT_SUCCESS) + return EXIT_FAILURE; +#endif + apr_pool_t *pool; + apr_pool_create(&pool, NULL); + svn_error_t *err = NULL; + SVN_VERSION_DEFINE(mysvn_version); + err = svn_ver_check_list(&mysvn_version, mysvn_checklist); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_ra_initialize(pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + char *config_dir = NULL; + err = svn_config_ensure(config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_client_create_context(&mysvn_ctx, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + err = svn_config_get_config(&(mysvn_ctx->config), + config_dir, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_config_t *cfg; + cfg = ( svn_config_t*) apr_hash_get( + mysvn_ctx->config, + SVN_CONFIG_CATEGORY_CONFIG, + APR_HASH_KEY_STRING); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + svn_auth_baton_t *ab; + err = svn_cmdline_setup_auth_baton(&ab, + TRUE, NULL, NULL, config_dir, TRUE, cfg, + mysvn_ctx->cancel_func, mysvn_ctx->cancel_baton, pool); + if (err) + return svn_cmdline_handle_exit_error(err, pool, "terrasync: "); + mysvn_ctx->auth_baton = ab; + mysvn_ctx->conflict_func = NULL; + mysvn_ctx->conflict_baton = NULL; + mysvn_rev = (svn_opt_revision_t*) apr_palloc(pool, + sizeof(svn_opt_revision_t)); + if (!mysvn_rev) + return EXIT_FAILURE; + mysvn_rev->kind = svn_opt_revision_head; + // Success if we got this far + mysvn_pool = pool; + return EXIT_SUCCESS; +} + +#endif + +// sync one directory tree +void sync_tree(char* dir) { + int rc; + char command[512]; + SGPath path( dest_base ); + + path.append( dir ); + rc = path.create_dir( 0755 ); + if (rc) { + cout << "Return code = " << rc << endl; + exit(1); + } + + if (use_svn) { +#ifdef HAVE_SVN_CLIENT_H + cout << dir << " ... "; + cout.flush(); + char dest_base_dir[512]; + snprintf( command, 512, + "%s/%s", source_base, dir); + snprintf( dest_base_dir, 512, + "%s/%s", dest_base, dir); + svn_error_t *err = NULL; + if (mysvn_setup() != EXIT_SUCCESS) + exit(1); + apr_pool_t *subpool = svn_pool_create(mysvn_pool); + err = svn_client_checkout(NULL, + command, + dest_base_dir, + mysvn_rev, + 1, + mysvn_ctx, + subpool); + if (err) { + // Report errors from the checkout attempt + cout << "failed: " << endl + << err->message << endl; + svn_error_clear(err); + return; + } else { + cout << "done" << endl; + } + svn_pool_destroy(subpool); + return; +#else + + snprintf( command, 512, + "%s %s/%s %s/%s", svn_cmd, + source_base, dir, + dest_base, dir ); +#endif + } else { + snprintf( command, 512, + "%s %s/%s/ %s/%s/", rsync_cmd, + source_base, dir, + dest_base, dir ); + } + cout << command << endl; + rc = system( command ); + if (rc) { + cout << "Return code = " << rc << endl; + if (rc == 5120) exit(1); + } +>>>>>>> 1.15 } @@ -123,39 +432,6 @@ static void parse_message( const string &msg, int *lat, int *lon ) { *lon = nowhere; *lat = nowhere; } - -} - -// sync one directory tree -void sync_tree(char* dir) { - int rc; - char command[512]; - SGPath path( dest_base ); - - path.append( dir ); - rc = path.create_dir( 0755 ); - if (rc) { - cout << "Return code = " << rc << endl; - exit(1); - } - - if (use_svn) { - snprintf( command, 512, - "%s %s/%s %s/%s", svn_cmd, - source_base, dir, - dest_base, dir ); - } else { - snprintf( command, 512, - "%s %s/%s/ %s/%s/", rsync_cmd, - source_base, dir, - dest_base, dir ); - } - cout << command << endl; - rc = system( command ); - if (rc) { - cout << "Return code = " << rc << endl; - if (rc == 5120) exit(1); - } } @@ -235,6 +511,7 @@ static void sync_areas( int lat, int lon, int lat_dir, int lon_dir ) { int main( int argc, char **argv ) { int port = 5501; char host[256] = ""; // accept messages from anyone + bool testing = false; // parse arguments int i = 1; @@ -253,8 +530,7 @@ int main( int argc, char **argv ) { } else if ( (string)argv[i] == "-S" ) { use_svn = true; } else if ( (string)argv[i] == "-T" ) { - sync_areas( 37, -123, 0, 0 ); - exit(0); + testing = true; } else { usage( argv[0] ); exit(-1); @@ -269,6 +545,12 @@ int main( int argc, char **argv ) { else source_base = rsync_base; } + + // We just want one grid square, no FGFS communications + if (testing) { + sync_areas( 37, -123, 0, 0 ); + exit(0); + } // Must call this before any other net stuff netInit( &argc,argv ); @@ -354,3 +636,4 @@ int main( int argc, char **argv ) { return 0; } + -- 2.39.5