diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0de6bfcd81f02792a9521b220cd7a30a5695ac2..290f211737b44a302e5f2a2c703c7c26da2375ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -24,7 +24,7 @@ before_script: # Provision efficiently the local LFS cache before checkout - git lfs fetch origin $CI_COMMIT_SHA # Checkout the expected branch - - git checkout $CI_COMMIT_REF_NAME + - git checkout -f -q $CI_COMMIT_SHA after_script: - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_CDASH diff --git a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py index 8cd9ab8ed70e204d915e32c25ebb4944f52b4a9b..77d197f07a7f759cdd194eedd8713a9e884e1c67 100755 --- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py +++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py @@ -356,10 +356,17 @@ def make_links(text, allapps): rep = {appname: ":ref:`{}`".format(appname) for appname in allapps} return multireplace(text, rep) +def render_deprecation_string(app): + if app.IsDeprecated(): + return "This application is deprecated and will be removed in a future release." + else: + return "" + def render_application(appname, allapps): "Render app to rst" - app = otbApplication.Registry.CreateApplication(appname) + # Create the application without logger to avoid the deprecation warning log + app = otbApplication.Registry.CreateApplicationWithoutLogger(appname) # TODO: remove this when bug 440 is fixed app.Init() @@ -368,6 +375,7 @@ def render_application(appname, allapps): output = template_application.format( label=appname, + deprecation_string=render_deprecation_string(app), heading=rst_section(app.GetName(), '='), description=app.GetDescription(), longdescription=make_links(app.GetDocLongDescription(), allapps), @@ -381,8 +389,9 @@ def render_application(appname, allapps): return output def GetApplicationTags(appname): - app = otbApplication.Registry.CreateApplication(appname) - return app.GetDocTags() + # Create the application without logger to avoid the deprecation warning log + app = otbApplication.Registry.CreateApplicationWithoutLogger(appname) + return app.GetDocTags() def GenerateRstForApplications(rst_dir): "Generate .rst files for all applications" @@ -404,9 +413,12 @@ def GenerateRstForApplications(rst_dir): for appName in appNames: # Get application first tag - tags = GetApplicationTags(appName) + tags = list(GetApplicationTags(appName)) + if "Deprecated" in tags: + tags.remove("Deprecated") if not tags or len(tags) == 0: raise RuntimeError("No tags for application: " + appName) + tag = tags[0] tag_ = tag.replace(" ", "_") diff --git a/Documentation/Cookbook/rst/templates/application.rst b/Documentation/Cookbook/rst/templates/application.rst index 68db4a8b3cc9c224fcdc107d8c4e3f9f21f97329..bbe15bceff737e5f165a2bdea7d4ea17771fcaab 100644 --- a/Documentation/Cookbook/rst/templates/application.rst +++ b/Documentation/Cookbook/rst/templates/application.rst @@ -1,6 +1,9 @@ .. _{label}: {heading} + +{deprecation_string} + {description} Description diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx index 703215872f1ad4ba111438a819108497b338fba3..0a50d18e46ceffab913d0e97a0930c0d3a1ed6b4 100644 --- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx +++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx @@ -59,7 +59,7 @@ private: "Input minimum and maximum values is automatically computed for all image bands."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); - SetDocSeeAlso(" "); + SetDocSeeAlso("DynamicConvert"); AddDocTag(Tags::Deprecated); AddDocTag(Tags::Manip); diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx index 29c8d8c6aed5d2d92c36a44344da5f4b3a970dd0..6f8f839953e039d408f676a8f7c70231db5ec3ba 100644 --- a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx @@ -96,12 +96,14 @@ private: " application is not compatible with in-memory connection since it does" " its own internal streaming."); SetDocAuthors("David Youssefi"); - SetDocSeeAlso( "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable" - " mean-shift algorithm and its application to the segmentation of" - " arbitrarily large remote sensing images. IEEE Transactions on" - " Geoscience and Remote Sensing, 53(2), 952-964.\n" - "[2] LSMSegmentation\n" - "[3] LSMSVectorization"); + SetDocSeeAlso( + "Alternative: SmallRegionsMerging\n" + "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable" + " mean-shift algorithm and its application to the segmentation of" + " arbitrarily large remote sensing images. IEEE Transactions on" + " Geoscience and Remote Sensing, 53(2), 952-964.\n" + "[2] LSMSSegmentation\n" + "[3] LSMSVectorization"); AddDocTag(Tags::Segmentation); AddDocTag(Tags::Deprecated); AddDocTag("LSMS"); diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h index 3e087664964ec72fda368b33c054875825afd4c8..4da58cf694656ef7fa65856fc0af418f8da2ff3d 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h @@ -669,6 +669,9 @@ public: void AddDocTag(const std::string&); + /** return wether the application has the "deprecated tag or not */ + bool IsDeprecated(); + DocExampleStructure::Pointer GetDocExample(); unsigned int GetNumberOfExamples(); std::string GetExampleComment(unsigned int id); diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx index 3657c6a54a6d9fb0450623ab54b432ccbc597fc2..085ae8c098cdb74b0130e5659091c75960921b42 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx @@ -256,6 +256,11 @@ void Application::AddDocTag(const std::string & tag) } } +bool Application::IsDeprecated() +{ + return std::find(m_DocTags.begin(), m_DocTags.end(), Tags::Deprecated) != m_DocTags.end(); +} + DocExampleStructure::Pointer Application::GetDocExample() { if (!IsInitialized()) diff --git a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h index 9e097a67cfafd11f96efc38867ea37e4b643d62b..e6a26418b2af0f7664a3eb338cd1fa45744c1da9 100644 --- a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h +++ b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h @@ -112,9 +112,6 @@ public: /** Create and display the help of the application */ void DisplayHelp(bool longHelp=false); - /** Create and display the long help of the application */ - void DisplayLongHelp(); - /** Performs specific action for testing environment */ void LoadTestEnv(); diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx index 4cdb8ee984d82b12abc715c8beadfa4e22d9f3bb..2e31ce8356f15ab9db6a59cd87038f937165cbe9 100644 --- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx +++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx @@ -282,7 +282,12 @@ bool CommandLineLauncher::BeforeExecute() return false; } - return true; + if (m_Application->IsDeprecated()) + { + m_Application->GetLogger()->Warning("This application is deprecated and will be removed in a future OTB release.\n"); + } + + return true; } bool CommandLineLauncher::LoadPath() @@ -584,6 +589,12 @@ void CommandLineLauncher::DisplayHelp(bool longHelp) std::cerr<<std::endl; std::cerr << "This is the " << m_Application->GetName() << " application, version " << OTB_VERSION_STRING << std::endl << std::endl; + if (m_Application->IsDeprecated()) + { + std::cerr << "WARNING: This application is deprecated, it will be removed in a future OTB release." << std::endl; + std::cerr << std::endl; + } + std::cerr << m_Application->GetDescription() << std::endl; if(longHelp) diff --git a/Modules/Wrappers/QtWidget/src/appmainwindow.ui b/Modules/Wrappers/QtWidget/src/appmainwindow.ui index c376f1984f3cec0518739bf1dd22fe3b6fb4f4be..88eb9a25bdf45af1a55696859d6a5f87c1177356 100644 --- a/Modules/Wrappers/QtWidget/src/appmainwindow.ui +++ b/Modules/Wrappers/QtWidget/src/appmainwindow.ui @@ -117,6 +117,13 @@ </widget> </widget> </item> + <item alignment="Qt::AlignHCenter|Qt::AlignVCenter"> + <widget class="QLabel" name="deprecation"> + <property name="text"> + <string>Deprecation status</string> + </property> + </widget> + </item> <item> <widget class="QLabel" name="message"> <property name="text"> diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx index 93c3f459e2e43b49d43e879a84e3f83ccfa30345..282c710ec25cc52408d97e2808a0726f5cb9c14d 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx @@ -70,6 +70,18 @@ QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* // Setup the progress bar to observe the model ui->progressBar->SetModel(gui->GetModel()); + // Fill and display the deprecation status label if needed, or hide it. + if (app->IsDeprecated()) + { + ui->deprecation->setVisible(true); + ui->deprecation->setText("<font color='#E65100'>This application is deprecated and will be removed in a future release.</font>"); + } + else + { + ui->deprecation->setVisible(false); + ui->deprecation->setText(""); + } + // Connect application progress text to the QLabel connect(ui->progressBar, &QtWidgetSimpleProgressReport::SetText, ui->message, &QLabel::setText); diff --git a/Modules/Wrappers/SWIG/src/otbApplication.i b/Modules/Wrappers/SWIG/src/otbApplication.i index a3b9590f34b84880213124c43438a4728612bed0..d03ad7b1e9551e17289aaa586f797fa5f51917ea 100644 --- a/Modules/Wrappers/SWIG/src/otbApplication.i +++ b/Modules/Wrappers/SWIG/src/otbApplication.i @@ -225,6 +225,7 @@ public: unsigned long itk::Object::AddObserver(const EventObject & event, Command * command); + bool IsDeprecated(); #if SWIGPYTHON %extend @@ -901,6 +902,8 @@ public: application = _otbApplication.Registry_CreateApplicationWithoutLogger(name) if application is not None: application.SetupLogger() + if application.IsDeprecated(): + application.GetLogger().Warning("This application is deprecated and will be removed in a future OTB release") return application } #else diff --git a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i index 4bd7852b2ee7540e8cacb172ecbca7ba2d376ffa..748c8bfef4820b6bd9a04c6d19d8c57f61ca7a84 100644 --- a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i +++ b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i @@ -72,6 +72,15 @@ public: virtual void AddLogOutput(itkLogOutput *output); static Logger * Instance(); void ResetOutputs(); + + // Wrap message methods so we can print stuff from Python + void Debug(std::string const & message); + void Info(std::string const & message); + void Warning(std::string const & message); + void Critical(std::string const & message); + void Error(std::string const & message); + void Fatal(std::string const & message); + protected: Logger(); virtual ~Logger();