Use std::filesystem in argumentparser.cpp

This commit is contained in:
Martchus 2019-06-05 23:49:35 +02:00
parent 579199fa73
commit 1ad90eb770
2 changed files with 33 additions and 23 deletions

View File

@ -156,6 +156,10 @@ else ()
message(STATUS "Using std::fstream for NativeFileStream") message(STATUS "Using std::fstream for NativeFileStream")
endif () endif ()
# configure required libraries for std::filestream
message(STATUS "calling use_filesystem()")
use_standard_filesystem()
# configure forcing UTF-8 code page under Windows # configure forcing UTF-8 code page under Windows
option(FORCE_UTF8_CODEPAGE "forces use of UTF-8 code page under Windows via ApplicationUtilities::startConsole()" OFF) option(FORCE_UTF8_CODEPAGE "forces use of UTF-8 code page under Windows via ApplicationUtilities::startConsole()" OFF)
if (FORCE_UTF8_CODEPAGE) if (FORCE_UTF8_CODEPAGE)

View File

@ -12,6 +12,7 @@
#include <algorithm> #include <algorithm>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include <filesystem>
#include <iostream> #include <iostream>
#include <set> #include <set>
#include <sstream> #include <sstream>
@ -19,6 +20,7 @@
using namespace std; using namespace std;
using namespace std::placeholders; using namespace std::placeholders;
using namespace std::literals;
using namespace ConversionUtilities; using namespace ConversionUtilities;
using namespace EscapeCodes; using namespace EscapeCodes;
using namespace IoUtilities; using namespace IoUtilities;
@ -1515,36 +1517,40 @@ void ArgumentParser::printBashCompletion(int argc, const char *const *argv, unsi
} }
// -> completion for files and dirs // -> completion for files and dirs
DirectoryEntryType entryTypes = DirectoryEntryType::None; if (completionInfo.completeFiles || completionInfo.completeDirs) {
if (completionInfo.completeFiles) { using namespace std::filesystem;
entryTypes |= DirectoryEntryType::File; const auto replace = "'"s, with = "'\"'\"'"s;
} const auto useActualDir = argc && currentWordIndex <= completionInfo.lastSpecifiedArgIndex && opening;
if (completionInfo.completeDirs) { const auto dirEntries = [&] {
entryTypes |= DirectoryEntryType::Directory; directory_iterator i;
} if (useActualDir) {
if (entryTypes != DirectoryEntryType::None) { i = directory_iterator(actualDir);
const string replace("'"), with("'\"'\"'"); findAndReplace(actualDir, replace, with);
if (argc && currentWordIndex <= completionInfo.lastSpecifiedArgIndex && opening) { } else {
list<string> entries = directoryEntries(actualDir.c_str(), entryTypes); i = directory_iterator(".");
findAndReplace(actualDir, replace, with); }
for (string &dirEntry : entries) { return i;
if (!startsWith(dirEntry, actualFile)) { }();
for (const auto &dirEntry : dirEntries) {
if (!completionInfo.completeDirs && dirEntry.is_directory()) {
continue;
}
if (!completionInfo.completeFiles && !dirEntry.is_directory()) {
continue;
}
auto dirEntryName = dirEntry.path().filename().string();
if (useActualDir) {
if (!startsWith(dirEntryName, actualFile)) {
continue; continue;
} }
cout << '\''; cout << '\'';
if (actualDir != ".") { if (actualDir != ".") {
cout << actualDir; cout << actualDir;
} }
findAndReplace(dirEntry, replace, with);
cout << dirEntry << '\'' << ' ';
haveFileOrDirCompletions = true;
}
} else {
for (string &dirEntry : directoryEntries(".", entryTypes)) {
findAndReplace(dirEntry, replace, with);
cout << '\'' << dirEntry << '\'' << ' ';
haveFileOrDirCompletions = true;
} }
findAndReplace(dirEntryName, replace, with);
cout << dirEntryName << '\'' << ' ';
haveFileOrDirCompletions = true;
} }
} }
cout << ')'; cout << ')';