improvements to cellar translate
This commit is contained in:
		| @@ -1,4 +1,5 @@ | ||||
| #include <exception> | ||||
| #include <filesystem> | ||||
| #include <iostream> | ||||
| #include <string> | ||||
| #include <vector> | ||||
| @@ -7,6 +8,7 @@ | ||||
| #include <boost/algorithm/string.hpp> | ||||
| #include "tclap/CmdLine.h" | ||||
|  | ||||
| #include "bottles.hpp" | ||||
| #include "output.hpp" | ||||
| #include "paths.hpp" | ||||
| #include "version.hpp" | ||||
| @@ -22,10 +24,6 @@ string cellar::paths::translate(std::string in_path, bool lazy) { | ||||
|  | ||||
|     windows_input = regex_match(in_path.substr(0, 3), drive_letter_rgx); | ||||
|  | ||||
|     if (!lazy) { | ||||
|         output::warning("non-lazy path translation is not implemented yet"); | ||||
|     } | ||||
|  | ||||
|     if (windows_input) { | ||||
|         if (lazy) { | ||||
|             if (boost::algorithm::to_lower_copy(in_path.substr(0,1)) != "z") { | ||||
| @@ -44,14 +42,51 @@ string cellar::paths::translate(std::string in_path, bool lazy) { | ||||
|             return paths::resolve_drive_letter(in_path); | ||||
|         } | ||||
|     } else { | ||||
|         // lazy | ||||
|         string out_path = "Z:"; | ||||
|         out_path.append(in_path); | ||||
|         string out_path; | ||||
|         string str_absolutepath = filesystem::canonical(in_path); | ||||
|  | ||||
|         size_t slashpos = out_path.find("/"); | ||||
|         while (slashpos != std::string::npos) { | ||||
|             out_path.replace(slashpos, 1, "\\"); | ||||
|             slashpos = out_path.find("/"); | ||||
|         if (lazy) { | ||||
|             out_path = "Z:"; | ||||
|             out_path.append(str_absolutepath); | ||||
|  | ||||
|             size_t slashpos = out_path.find("/"); | ||||
|             while (slashpos != std::string::npos) { | ||||
|                 out_path.replace(slashpos, 1, "\\"); | ||||
|                 slashpos = out_path.find("/"); | ||||
|             } | ||||
|         } else { | ||||
|             map<string, string> dct_drives; | ||||
|             for (auto hnd_curitem : filesystem::directory_iterator(filesystem::path(bottles::active_bottle.canonical_path) / "dosdevices"))  { | ||||
|                 auto pth_curitem = hnd_curitem.path(); | ||||
|                 dct_drives.insert_or_assign(pth_curitem.filename().string(), filesystem::canonical(pth_curitem)); | ||||
|             } | ||||
|  | ||||
|             for (auto hnd_curdrive : dct_drives) { | ||||
|                 size_t sz_drivelen = hnd_curdrive.second.length(); | ||||
|                 size_t sz_findpos = in_path.rfind(hnd_curdrive.second, 0); | ||||
|                 if (sz_findpos == 0) { | ||||
|                     out_path.append(hnd_curdrive.first); | ||||
|                     out_path.append(in_path.substr(sz_drivelen)); | ||||
|  | ||||
|                     size_t slashpos = out_path.find("/"); | ||||
|                     while (slashpos != std::string::npos) { | ||||
|                         out_path.replace(slashpos, 1, "\\"); | ||||
|                         slashpos = out_path.find("/"); | ||||
|                     } | ||||
|  | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             // if we're here, it's not on a drive letter. use Z: | ||||
|             out_path = "Z:"; | ||||
|             out_path.append(str_absolutepath); | ||||
|  | ||||
|             size_t slashpos = out_path.find("/"); | ||||
|             while (slashpos != std::string::npos) { | ||||
|                 out_path.replace(slashpos, 1, "\\"); | ||||
|                 slashpos = out_path.find("/"); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return out_path; | ||||
|   | ||||
| @@ -1,4 +1,5 @@ | ||||
| #include <exception> | ||||
| #include <filesystem> | ||||
| #include <regex> | ||||
| #include <string> | ||||
| #include <unistd.h> | ||||
| @@ -12,6 +13,7 @@ | ||||
| using namespace std; | ||||
|  | ||||
| string cellar::paths::resolve_drive_letter(string in_path) { | ||||
|     filesystem::path lastwd = filesystem::current_path(); | ||||
|     bool windows_input; | ||||
|     static regex drive_letter_rgx(R"([a-zA-Z]:\\)"); | ||||
|  | ||||
| @@ -25,6 +27,7 @@ string cellar::paths::resolve_drive_letter(string in_path) { | ||||
|         string link_path = ""; | ||||
|         link_path.append(bottles::active_bottle.canonical_path); | ||||
|         link_path.append("/dosdevices/"); | ||||
|         filesystem::current_path(filesystem::path(link_path)); | ||||
|         link_path.append(drive_letter); | ||||
|          | ||||
|         char stringbuffer[512]; | ||||
| @@ -32,7 +35,9 @@ string cellar::paths::resolve_drive_letter(string in_path) { | ||||
|  | ||||
|         if (bufflen != -1) { | ||||
|             stringbuffer[bufflen] = '\0'; | ||||
|             out_path.append(stringbuffer); | ||||
|             string str_absolutepath = filesystem::canonical(stringbuffer); | ||||
|             out_path.append(str_absolutepath); | ||||
|             out_path.append("/"); | ||||
|         } else { | ||||
|             throw runtime_error("readlink isn't having it"); | ||||
|         } | ||||
| @@ -47,5 +52,6 @@ string cellar::paths::resolve_drive_letter(string in_path) { | ||||
|         out_path.append(rest_of_path); | ||||
|     } | ||||
|  | ||||
|     filesystem::current_path(lastwd); | ||||
|     return out_path; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user