diff --git a/GeoModelTools/GMCAT/src/gmcat.cxx b/GeoModelTools/GMCAT/src/gmcat.cxx index 9634fdca90e2e030d74089536afe85ac8bcc194f..301a534ac7e9c6a910c8d381b79f05feb6f9fb80 100644 --- a/GeoModelTools/GMCAT/src/gmcat.cxx +++ b/GeoModelTools/GMCAT/src/gmcat.cxx @@ -35,6 +35,7 @@ const std::string shared_obj_extension=".so"; void publishMetaData( GMDBManager & db, + const std::string& repoPath, std::vector<std::string> &inputFiles, std::vector<std::string> &inputPlugins, std::string &outputFile); @@ -48,9 +49,12 @@ int main(int argc, char ** argv) { // std::string gmcat= argv[0]; - std::string usage= "usage: " + gmcat + " [plugin1"+shared_obj_extension + std::string usage= "usage: " + gmcat + " [OPTIONS] [plugin1"+shared_obj_extension + "] [plugin2" + shared_obj_extension - + "] ...[file1.db] [file2.db].. -o outputFile]"; + + "] ...[file1.db] [file2.db].. -o outputFile]\n" + + "Options:\n" + + "\t-v Print verbose output to the screen (default: direct verbose output to /tmp)\n" + + "\t-g Path to the local GeoModelATLAS repository (default: .)"; // // Print usage message if no args given: // @@ -64,6 +68,7 @@ int main(int argc, char ** argv) { std::vector<std::string> inputFiles; std::vector<std::string> inputPlugins; std::string outputFile; + std::string gmAtlasDir{"."}; bool outputFileSet = false; for (int argi=1;argi<argc;argi++) { std::string argument=argv[argi]; @@ -80,6 +85,9 @@ int main(int argc, char ** argv) { setenv("GEOMODEL_GEOMODELIO_VERBOSE", "1", 1); // does overwrite verbose=true; } + else if (argument.find("-g")!=std::string::npos) { + gmAtlasDir = std::string(argv[++argi]); + } else if (argument.find(shared_obj_extension)!=std::string::npos) { inputPlugins.push_back(argument); } @@ -125,16 +133,24 @@ int main(int argc, char ** argv) { // Loop over plugins, create the geometry and put it under the world: // std::ofstream file; + std::string verboseOutput{"/tmp/gmcat-"+std::to_string(getpid())}; std::streambuf *coutBuff=std::cout.rdbuf(); std::streambuf *fileBuff=file.rdbuf(); if (!verbose) { - file.open(("/tmp/gmcat-"+std::to_string(getpid())).c_str()); + file.open(verboseOutput.c_str()); std::cout.rdbuf(fileBuff); } std::vector<GeoPublisher*> vecPluginsPublishers; // caches the stores from all plugins for (const std::string & plugin : inputPlugins) { GeoGeometryPluginLoader loader; + + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "Building geometry using the plugin " << plugin << " ..." << std::endl; + std::cout.rdbuf(fileBuff); + } + GeoVGeometryPlugin *factory=loader.load(plugin); if (!factory) { std::cerr << "gmcat -- Could not load plugin " << plugin << std::endl; @@ -151,12 +167,23 @@ int main(int argc, char ** argv) { if( nullptr != factory->getPublisher() ) { vecPluginsPublishers.push_back( factory->getPublisher() ); // cache the publisher, if any, for later } + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "\t ... DONE!" << std::endl; + std::cout.rdbuf(fileBuff); + } } // // Loop over files, create the geometry and put it under the world: // for (const std::string & file : inputFiles) { + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "Reading geometry from the file " << file << " ..." << std::endl; + std::cout.rdbuf(fileBuff); + } + GMDBManager* db = new GMDBManager(file); if (!db->checkIsDBOpen()){ std::cerr << "gmcat -- Error opening the input file: " << file << std::endl; @@ -186,6 +213,12 @@ int main(int argc, char ** argv) { } delete db; + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "\t ... DONE!" << std::endl; + std::cout.rdbuf(fileBuff); + } + } // // Open a new database: @@ -205,18 +238,42 @@ int main(int argc, char ** argv) { GeoModelIO::WriteGeoModel dumpGeoModelGraph(db); resizedWorld->exec(&dumpGeoModelGraph); - - - - + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "Writing auxiliary tables to the output database ..." << std::endl; + std::cout.rdbuf(fileBuff); + } if (vecPluginsPublishers.size() > 0) { dumpGeoModelGraph.saveToDB(vecPluginsPublishers); } else { dumpGeoModelGraph.saveToDB(); } + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "\t ... DONE!" << std::endl; + std::cout.rdbuf(fileBuff); + } + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "Writing metadata to the output database ..." << std::endl; + std::cout.rdbuf(fileBuff); + } + try { + publishMetaData(db,gmAtlasDir,inputFiles,inputPlugins,outputFile); + } + catch(std::runtime_error& e) { + std::cerr << "ERROR: " << e.what() << std::endl; + return 1; + } + if(!verbose) { + std::cout.rdbuf(coutBuff); + std::cout << "\t ... DONE!" << std::endl; + std::cout.rdbuf(fileBuff); + } - publishMetaData(db,inputFiles,inputPlugins,outputFile); std::cout.rdbuf(coutBuff); + std::cout << "SUCCESS!" << std::endl; + std::cout << "(verbose output at " << verboseOutput << ")" << std::endl; return 0; } diff --git a/GeoModelTools/GMCAT/src/publishMetaData.cpp b/GeoModelTools/GMCAT/src/publishMetaData.cpp index cd29a8c6eaf97e7b12e7998a4ea66d0c267c7e92..a804261f96bb3afe4286603e826b975d6e71a386 100644 --- a/GeoModelTools/GMCAT/src/publishMetaData.cpp +++ b/GeoModelTools/GMCAT/src/publishMetaData.cpp @@ -33,6 +33,7 @@ std::string getCommandOutput(const std::string & cmd, bool firstLineOnly=false) } void publishMetaData( GMDBManager & db, + const std::string& repoPath, std::vector<std::string> &inputFiles, std::vector<std::string> &inputPlugins, std::string &outputFile) { @@ -98,26 +99,30 @@ void publishMetaData( GMDBManager & db, } } } - std::string isGitManaged=getCommandOutput("git rev-parse --is-inside-work-tree"); + std::string isGitManaged=getCommandOutput("git -C " + repoPath + " rev-parse --is-inside-work-tree"); if (isGitManaged=="true\n") { - xtraMetadata.repo=getCommandOutput("git remote get-url origin"); - xtraMetadata.branch=getCommandOutput("git rev-parse --abbrev-ref HEAD"); - std::string status=getCommandOutput("git status --porcelain"); + xtraMetadata.repo=getCommandOutput("git -C " + repoPath + " remote get-url origin"); + xtraMetadata.branch=getCommandOutput("git -C " + repoPath + " rev-parse --abbrev-ref HEAD"); + std::string status=getCommandOutput("git -C " + repoPath + " status --porcelain"); if (status.find(" M ")!=std::string::npos) { xtraMetadata.isClean="no"; } else { - std::string synchedToOrigin=getCommandOutput("git diff origin/"+xtraMetadata.branch,true); + std::string synchedToOrigin=getCommandOutput("git -C " + repoPath + " diff origin/"+xtraMetadata.branch,true); if (synchedToOrigin!="") { xtraMetadata.isClean="no"; } else { xtraMetadata.isClean="yes"; - xtraMetadata.commitHash=getCommandOutput("git log -1 --format=format:\"%H\""); - xtraMetadata.associatedTag=getCommandOutput("git describe --tag " + xtraMetadata.commitHash+ " 2> /dev/null"); + xtraMetadata.commitHash=getCommandOutput("git -C " + repoPath + " log -1 --format=format:\"%H\""); + xtraMetadata.associatedTag=getCommandOutput("git -C " + repoPath + " describe --tag " + xtraMetadata.commitHash+ " 2> /dev/null"); } } } + else { + std::cerr << std::endl << "ERROR: provided directory " << repoPath << " is NOT inside a local git reporistory!" << std::endl; + throw std::runtime_error("Metadata not written!"); + } // // Fill the header file with metadata