From f0e6000827e92191f6ec79a629bebe37befa5808 Mon Sep 17 00:00:00 2001 From: Brad King Date: Tue, 6 Jan 2009 14:58:30 -0500 Subject: BUG: Manage LC_MESSAGES with an object This moves management of the LC_MESSAGES environment variable into an automatic variable. Previously if an error occurred the original environment value was not restored. This makes the fix to issue #5936 more robust. --- Source/CTest/cmCTestUpdateHandler.cxx | 69 ++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/Source/CTest/cmCTestUpdateHandler.cxx b/Source/CTest/cmCTestUpdateHandler.cxx index 2684149..67ae202 100644 --- a/Source/CTest/cmCTestUpdateHandler.cxx +++ b/Source/CTest/cmCTestUpdateHandler.cxx @@ -180,6 +180,46 @@ private: //********************************************************************** //---------------------------------------------------------------------- +class cmCTestUpdateHandlerLocale +{ +public: + cmCTestUpdateHandlerLocale(); + ~cmCTestUpdateHandlerLocale(); +private: + std::string saveLCMessages; +}; + +cmCTestUpdateHandlerLocale::cmCTestUpdateHandlerLocale() +{ + const char* lcmess = cmSystemTools::GetEnv("LC_MESSAGES"); + if(lcmess) + { + saveLCMessages = lcmess; + } + // if LC_MESSAGES is not set to C, then + // set it, so that svn/cvs info will be in english ascii + if(! (lcmess && strcmp(lcmess, "C") == 0)) + { + cmSystemTools::PutEnv("LC_MESSAGES=C"); + } +} + +cmCTestUpdateHandlerLocale::~cmCTestUpdateHandlerLocale() +{ + // restore the value of LC_MESSAGES after running the version control + // commands + if(saveLCMessages.size()) + { + std::string put = "LC_MESSAGES="; + put += saveLCMessages; + cmSystemTools::PutEnv(put.c_str()); + } + else + { + cmSystemTools::UnsetEnv("LC_MESSAGES"); + } +} + //---------------------------------------------------------------------- cmCTestUpdateHandler::cmCTestUpdateHandler() { @@ -252,19 +292,10 @@ int cmCTestUpdateHandler::ProcessHandler() std::string goutput; std::string errors; - // make sure - std::string saveLCMessages; - const char* lcmess = cmSystemTools::GetEnv("LC_MESSAGES"); - if(lcmess) - { - saveLCMessages = lcmess; - } - // if LC_MESSAGES is not set to C, then - // set it, so that svn/cvs info will be in english ascii - if(! (lcmess && strcmp(lcmess, "C") == 0)) - { - cmSystemTools::PutEnv("LC_MESSAGES=C"); - } + // Make sure VCS tool messages are in English so we can parse them. + cmCTestUpdateHandlerLocale fixLocale; + static_cast(fixLocale); + std::string checkoutErrorMessages; int retVal = 0; @@ -1122,18 +1153,6 @@ int cmCTestUpdateHandler::ProcessHandler() } os << "" << std::endl; os << "" << std::endl; - // restore the value of LC_MESSAGES after running the version control - // commands - if(saveLCMessages.size()) - { - std::string put = "LC_MESSAGES="; - put += saveLCMessages; - cmSystemTools::PutEnv(put.c_str()); - } - else - { - cmSystemTools::UnsetEnv("LC_MESSAGES"); - } if (! res ) { cmCTestLog(this->CTest, ERROR_MESSAGE, -- cgit v0.12