clean up on #109

pull/40/head
Nestal Wan 2012-07-30 15:24:47 +08:00
parent cb602052f1
commit 0b2a8c0a54
5 changed files with 86 additions and 74 deletions

7
README
View File

@ -50,8 +50,13 @@ Enjoy!
Version History: Version History:
Grive v0.3: Bug fix release Grive v0.3: Bug fix & minor feature release
Fixed bugs: Fixed bugs:
#93: missing reference count increment in one of the Json constructors #93: missing reference count increment in one of the Json constructors
#82: retry for HTTP error 500 & 503 #82: retry for HTTP error 500 & 503
#77: Fixed a bug where grive crashed on the first run. #77: Fixed a bug where grive crashed on the first run.
New features:
#87: support for revisions
#86: partial sync (contributed by justin at tierramedia.com)

View File

@ -51,6 +51,7 @@ const std::string defaultConfigFileName = ".grive";
const char *configFileEnvironmentVariable = "GR_CONFIG"; const char *configFileEnvironmentVariable = "GR_CONFIG";
using namespace gr ; using namespace gr ;
namespace po = boost::program_options;
// libgcrypt insist this to be done in application, not library // libgcrypt insist this to be done in application, not library
void InitGCrypt() void InitGCrypt()
@ -65,18 +66,46 @@ void InitGCrypt()
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
} }
void InitLog( const po::variables_map& vm )
{
std::auto_ptr<log::CompositeLog> comp_log(new log::CompositeLog) ;
LogBase* console_log = comp_log->Add( std::auto_ptr<LogBase>( new log::DefaultLog ) ) ;
if ( vm.count( "log" ) )
{
std::auto_ptr<LogBase> file_log(new log::DefaultLog( vm["log"].as<std::string>() )) ;
file_log->Enable( log::debug ) ;
file_log->Enable( log::verbose ) ;
file_log->Enable( log::info ) ;
file_log->Enable( log::warning ) ;
file_log->Enable( log::error ) ;
file_log->Enable( log::critical ) ;
// log grive version to log file
file_log->Log( log::Fmt("grive version " VERSION " " __DATE__ " " __TIME__), log::verbose ) ;
file_log->Log( log::Fmt("current time: %1%") % DateTime::Now(), log::verbose ) ;
comp_log->Add( file_log ) ;
}
if ( vm.count( "verbose" ) )
{
console_log->Enable( log::verbose ) ;
}
if ( vm.count( "debug" ) )
{
console_log->Enable( log::verbose ) ;
console_log->Enable( log::debug ) ;
}
LogBase::Inst( std::auto_ptr<LogBase>(comp_log.release()) ) ;
}
int Main( int argc, char **argv ) int Main( int argc, char **argv )
{ {
InitGCrypt() ; InitGCrypt() ;
std::string rootFolder = defaultRootFolder; std::string rootFolder = defaultRootFolder;
std::auto_ptr<log::CompositeLog> comp_log(new log::CompositeLog) ;
LogBase* console_log = comp_log->Add( std::auto_ptr<LogBase>( new log::DefaultLog ) ) ;
Json options ;
namespace po = boost::program_options;
// construct the program options // construct the program options
po::options_description desc( "Grive options" ); po::options_description desc( "Grive options" );
@ -105,56 +134,41 @@ int Main( int argc, char **argv )
std::cout << desc << std::endl ; std::cout << desc << std::endl ;
return 0 ; return 0 ;
} }
else if ( vm.count( "version" ) )
{
std::cout
<< "grive version " << VERSION << ' ' << __DATE__ << ' ' << __TIME__ << std::endl ;
return 0 ;
}
boost::shared_ptr<Config> config ; // initialize logging
InitLog(vm) ;
if ( vm.count( "log" ) ) boost::shared_ptr<Config> config ;
{
std::auto_ptr<LogBase> file_log(new log::DefaultLog( vm["log"].as<std::string>() )) ; // config file will be (in order of preference)
file_log->Enable( log::debug ) ; // value specified in environment string
file_log->Enable( log::verbose ) ; // value specified in defaultConfigFileName in path from commandline --path
file_log->Enable( log::info ) ; // value specified in defaultConfigFileName in current directory
file_log->Enable( log::warning ) ; const char *envConfigFileName = ::getenv( configFileEnvironmentVariable ) ;
file_log->Enable( log::error ) ; if (envConfigFileName) {
file_log->Enable( log::critical ) ; config.reset(new Config(envConfigFileName));
// log grive version to log file } else if ( vm.count( "path" ) ) {
file_log->Log( log::Fmt("grive version " VERSION " " __DATE__ " " __TIME__), log::verbose ) ; rootFolder = vm["path"].as<std::string>();
file_log->Log( log::Fmt("current time: %1%") % DateTime::Now(), log::verbose ) ; config.reset(new Config( fs::path(rootFolder) / fs::path(defaultConfigFileName) ));
comp_log->Add( file_log ) ; } else {
} config.reset(new Config( defaultConfigFileName) );
if ( vm.count( "verbose" ) )
{
console_log->Enable( log::verbose ) ;
} }
// misc options
Json options ;
options.Add( "log-xml", Json(vm.count("log-xml") > 0) ) ; options.Add( "log-xml", Json(vm.count("log-xml") > 0) ) ;
options.Add( "new-rev", Json(vm.count("new-rev") > 0) ) ; options.Add( "new-rev", Json(vm.count("new-rev") > 0) ) ;
options.Add( "force", Json(vm.count("force") > 0 ) ) ;
if ( vm.count( "debug" ) ) Log( "config file name %1%", config->ConfigFile().string(), log::verbose );
{
console_log->Enable( log::verbose ) ;
console_log->Enable( log::debug ) ;
}
// config file will be (in order of preference)
// value specified in environment string
// value specified in defaultConfigFileName in path from commandline --path
// value specified in defaultConfigFileName in current directory
const char *envConfigFileName = ::getenv( configFileEnvironmentVariable ) ;
if (envConfigFileName) {
config.reset(new Config(envConfigFileName));
} else if ( vm.count( "path" ) ) {
rootFolder = vm["path"].as<std::string>();
config.reset(new Config( fs::path(rootFolder) / fs::path(defaultConfigFileName) ));
} else {
config.reset(new Config( defaultConfigFileName) );
}
Log( "config file name %1%", config->ConfigFile().string(), log::verbose );
if ( vm.count( "auth" ) ) if ( vm.count( "auth" ) )
{ {
@ -177,18 +191,6 @@ int Main( int argc, char **argv )
config->Get().Add( "refresh_token", Json( token.RefreshToken() ) ) ; config->Get().Add( "refresh_token", Json( token.RefreshToken() ) ) ;
config->Save() ; config->Save() ;
} }
if ( vm.count( "version" ) )
{
std::cout
<< "grive version " << VERSION << ' ' << __DATE__ << ' ' << __TIME__ << std::endl ;
return 0 ;
}
if ( vm.count( "force" ) )
{
options.Add( "force", Json(true) ) ;
}
LogBase::Inst( std::auto_ptr<LogBase>(comp_log.release()) ) ;
std::string refresh_token ; std::string refresh_token ;
try try

View File

@ -6,7 +6,7 @@ find_package(LibGcrypt REQUIRED)
find_package(JSONC REQUIRED) find_package(JSONC REQUIRED)
find_package(CURL REQUIRED) find_package(CURL REQUIRED)
find_package(EXPAT REQUIRED) find_package(EXPAT REQUIRED)
find_package(Boost 1.40.0 COMPONENTS filesystem system REQUIRED) find_package(Boost 1.40.0 COMPONENTS program_options filesystem system REQUIRED)
find_package(BFD) find_package(BFD)
find_package(CppUnit) find_package(CppUnit)
find_package(Iberty) find_package(Iberty)
@ -126,6 +126,7 @@ IF ( CPPUNIT_FOUND )
target_link_libraries( unittest target_link_libraries( unittest
grive grive
${CPPUNIT_LIBRARY} ${CPPUNIT_LIBRARY}
${Boost_LIBRARIES}
) )
ENDIF ( CPPUNIT_FOUND ) ENDIF ( CPPUNIT_FOUND )

View File

@ -21,18 +21,21 @@
#include "util/StdioFile.hh" #include "util/StdioFile.hh"
#include <boost/program_options.hpp>
#include <iostream> #include <iostream>
#include <iterator> #include <iterator>
using namespace gr; namespace gr {
Config::Config(const fs::path& configFile) Config::Config(const fs::path& configFile) :
: m_configFile(configFile) m_configFile(configFile),
, m_cfg( Read() ) m_cfg( Read() )
{ {
if (configFile.empty()) { if (configFile.empty())
throw Error() << expt::ErrMsg("Config cannot be initalised with an empty string."); {
} throw Error() << expt::ErrMsg("Config cannot be initalised with an empty string.");
}
} }
const fs::path& Config::ConfigFile() const const fs::path& Config::ConfigFile() const
@ -63,3 +66,4 @@ Json Config::Read()
} }
} }
} // end of namespace

View File

@ -35,14 +35,14 @@ public :
Json& Get() ; Json& Get() ;
void Save() ; void Save() ;
const fs::path &ConfigFile() const; const fs::path &ConfigFile() const;
private : private :
Json Read() ; Json Read() ;
private : private :
const fs::path m_configFile; const fs::path m_configFile;
Json m_cfg ; Json m_cfg ;
} ; } ;
} // end of namespace } // end of namespace