Ignore file system errors when printing bash completion

This commit is contained in:
Martchus 2020-01-29 19:26:49 +01:00
parent 0f56d25251
commit eadb261c56
1 changed files with 37 additions and 34 deletions

View File

@ -1508,16 +1508,16 @@ void ArgumentParser::printBashCompletion(int argc, const char *const *argv, unsi
// -> completion for files and dirs // -> completion for files and dirs
#ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM #ifdef CPP_UTILITIES_USE_STANDARD_FILESYSTEM
if (completionInfo.completeFiles || completionInfo.completeDirs) { if (completionInfo.completeFiles || completionInfo.completeDirs) {
using namespace std::filesystem; try {
const auto replace = "'"s, with = "'\"'\"'"s; const auto replace = "'"s, with = "'\"'\"'"s;
const auto useActualDir = argc && currentWordIndex <= completionInfo.lastSpecifiedArgIndex && opening; const auto useActualDir = argc && currentWordIndex <= completionInfo.lastSpecifiedArgIndex && opening;
const auto dirEntries = [&] { const auto dirEntries = [&] {
directory_iterator i; filesystem::directory_iterator i;
if (useActualDir) { if (useActualDir) {
i = directory_iterator(actualDir); i = filesystem::directory_iterator(actualDir);
findAndReplace(actualDir, replace, with); findAndReplace(actualDir, replace, with);
} else { } else {
i = directory_iterator("."); i = filesystem::directory_iterator(".");
} }
return i; return i;
}(); }();
@ -1547,6 +1547,9 @@ void ArgumentParser::printBashCompletion(int argc, const char *const *argv, unsi
cout << dirEntryName << '\'' << ' '; cout << dirEntryName << '\'' << ' ';
haveFileOrDirCompletions = true; haveFileOrDirCompletions = true;
} }
} catch (const filesystem::filesystem_error &) {
// ignore filesystem errors; there's no good way to report errors when printing bash completion
}
} }
#endif #endif
cout << ')'; cout << ')';