diff --git a/applications/test/argList/Test-argList.C b/applications/test/argList/Test-argList.C index 3556fa7592..9db0906c6a 100644 --- a/applications/test/argList/Test-argList.C +++ b/applications/test/argList/Test-argList.C @@ -57,6 +57,15 @@ int main(int argc, char *argv[]) // Fake a future option... argList::addOptionCompat("label", {"parse-label", 2112}); + // Ignore an old bool option + argList::ignoreOptionCompat({"xml", 1700}, false); + + // Ignore an old option with arg. Specified version=0 to suppress warnings + argList::ignoreOptionCompat({"format", 0}, true); + + // Ignore a future option? Fairly pointless + argList::ignoreOptionCompat({"ascii", 2112}, false); + argList::addArgument("label"); argList::addArgument("..."); argList::addArgument("label"); @@ -64,6 +73,7 @@ int main(int argc, char *argv[]) argList args(argc, argv, false, true); + Info<<"have: " < @@ -55,6 +56,7 @@ Foam::HashTable Foam::argList::validOptions; Foam::HashTable Foam::argList::validParOptions; Foam::HashTable Foam::argList::optionUsage; Foam::HashTable> Foam::argList::validOptionsCompat; +Foam::HashTable> Foam::argList::ignoreOptionsCompat; Foam::SLList Foam::argList::notes; Foam::string::size_type Foam::argList::usageMin = 20; Foam::string::size_type Foam::argList::usageMax = 80; @@ -216,6 +218,20 @@ void Foam::argList::addOptionCompat } +void Foam::argList::ignoreOptionCompat +( + std::pair compat, + const bool expectArg +) +{ + ignoreOptionsCompat.insert + ( + compat.first, + std::pair(expectArg, compat.second) + ); +} + + void Foam::argList::addUsage ( const word& optName, @@ -466,9 +482,59 @@ Foam::word Foam::argList::optionCompat(const word& optName) } +int Foam::argList::optionIgnore(const word& optName) +{ + // NB: optName is without the leading '-' + + if (!ignoreOptionsCompat.empty()) + { + const auto fnd = ignoreOptionsCompat.cfind(optName); + + if (fnd.found()) + { + const auto& iter = *fnd; + + // Number to skip (including the option itself) + // '-option ARG' or '-option' + const int nskip = (iter.first ? 2 : 1); + + // Emit warning if there is versioning (non-zero) and it is not + // tagged as future change (ie, ThisVersion > version). + + if + ( + iter.second + && + ( + (OPENFOAM_PLUS > 1700) // Guard against bad #define value + ? (OPENFOAM_PLUS > iter.second) + : true + ) + ) + { + std::cerr + << "--> FOAM IOWarning :" << nl + << " Ignoring [v" << iter.second << "] '-" + << optName << (nskip > 1 ? " ARG" : "") + << "' option" + << nl + << std::endl; + + error::warnAboutAge("option", iter.second); + } + + return nskip; + } + } + + return 0; // Do not skip +} + + bool Foam::argList::regroupArgv(int& argc, char**& argv) { int nArgs = 1; + int ignore = 0; unsigned depth = 0; string group; // For grouping ( ... ) arguments @@ -517,6 +583,14 @@ bool Foam::argList::regroupArgv(int& argc, char**& argv) // Known option name args_[nArgs++] = argv[argi]; } + else if ((ignore = optionIgnore(optName)) > 0) + { + // Option to be ignored (with/without an argument) + if (ignore > 1) + { + ++argi; + } + } else { // Try alias for the option name @@ -754,9 +828,11 @@ void Foam::argList::parse // -help-full print the full usage // -doc display application documentation in browser // -doc-source display source code in browser + // -list-compat print compatibility information { bool quickExit = false; + // Only display one or the other if (options_.found("help-full")) { printUsage(true); @@ -784,6 +860,12 @@ void Foam::argList::parse quickExit = true; } + if (options_.found("list-compat")) + { + printCompat(); + quickExit = true; + } + if (quickExit) { ::exit(0); @@ -1452,6 +1534,75 @@ void Foam::argList::printUsage(bool full) const } +void Foam::argList::printCompat() const +{ + const label nopt + ( + argList::validOptionsCompat.size() + + argList::ignoreOptionsCompat.size() + ); + + Info<< nopt << " compatibility options for " << executable_ << nl; + if (nopt) + { + Info<< setf(ios_base::left) << setw(34) << "old option" + << setf(ios_base::left) << setw(32) << "new option" + << "version" << nl + << setf(ios_base::left) << setw(34) << "~~~~~~~~~~" + << setf(ios_base::left) << setw(32) << "~~~~~~~~~~" + << "~~~~~~~" << nl; + + for (const word& k : argList::validOptionsCompat.sortedToc()) + { + const auto& iter = *argList::validOptionsCompat.cfind(k); + + Info<< " -" + << setf(ios_base::left) << setw(32) << k + << " -" + << setf(ios_base::left) << setw(30) << iter.first; + + if (iter.second) + { + Info<< " " << iter.second; + } + else + { + Info<< " -"; + } + Info<< nl; + } + + for (const word& k : argList::ignoreOptionsCompat.sortedToc()) + { + const auto& iter = *argList::ignoreOptionsCompat.cfind(k); + + if (iter.first) + { + Info<< " -" + << setf(ios_base::left) << setw(32) + << (k + " ").c_str(); + } + else + { + Info<< " -" + << setf(ios_base::left) << setw(32) << k; + } + + Info<< setf(ios_base::left) << setw(32) << " removed"; + if (iter.second) + { + Info<< " " << iter.second; + } + else + { + Info<< " -"; + } + Info<< nl; + } + } +} + + void Foam::argList::displayDoc(bool source) const { const dictionary& docDict = debug::controlDict().subDict("Documentation"); diff --git a/src/OpenFOAM/global/argList/argList.H b/src/OpenFOAM/global/argList/argList.H index d47e2149bc..d8ac46bc29 100644 --- a/src/OpenFOAM/global/argList/argList.H +++ b/src/OpenFOAM/global/argList/argList.H @@ -150,6 +150,9 @@ class argList //- Helper for resolving aliases for -options within validOptionsCompat static word optionCompat(const word& optName); + //- Helper for resolving ignored options + static int optionIgnore(const word& optName); + //- Helper function for printUsage static void printOptionUsage ( @@ -189,6 +192,10 @@ public: // Stored as (alias = canonical, version) static HashTable> validOptionsCompat; + //- A list of options to ignore. + // Stored as (option = bool, version) + static HashTable> ignoreOptionsCompat; + //- Short usage information for validOptions static HashTable optionUsage; @@ -431,8 +438,8 @@ public: //- Specify an alias for the option name. // // \param optName the currently used option name - // \param compat alias name and the last OpenFOAM version - // (YYMM) for when the alias was not needed. + // \param compat alias name and the last OpenFOAM version (YYMM) + // when the alias was not needed. // Setting a version of 0 suppresses warnings about the alias. static void addOptionCompat ( @@ -440,6 +447,18 @@ public: std::pair compat ); + //- Specify an option to be ignored. + // + // \param compat optName and the last OpenFOAM version (YYMM) + // when the option was directly supported. + // Setting a version of 0 suppresses warnings about the alias. + // \param expectArg the option is non-bool + static void ignoreOptionCompat + ( + std::pair compat, + const bool expectArg + ); + //- Add option usage information to optionUsage static void addUsage ( @@ -494,6 +513,9 @@ public: // Print + //- Print option compatibility + void printCompat() const; + //- Print notes (if any) void printNotes() const;