10 unstable releases (3 breaking)
|0.10.0||Sep 8, 2023|
|0.9.0||Aug 22, 2023|
|0.8.4||Jul 22, 2023|
|0.8.3||Jun 29, 2023|
|0.7.2||Feb 20, 2023|
#825 in Configuration
507,330 downloads per month
Used in 169 crates (21 directly)
This crate contains an assortment of utilities to deal with paths and their conversions.
git treats paths as bytes, but inherently assumes non-illformed UTF-8 as encoding on windows. Internally, it expects
slashes to be used as path separators and paths in files must have slashes, with conversions being performed on windows accordingly.
dirent.ccontains all implementation (seemingly) of opening directories and reading their entries, along with all path conversions (UTF-16 for windows). This is done on the fly so git can work with in UTF-8.
- mingw is used for the conversion and it appears they handle surrogates during the conversion, maybe some sort of non-strict UTF-8 converter? Actually it uses WideCharToMultiByte under the hood which by now does fail if the UTF-8 would be invalid unicode, i.e. unicode pairs.
OsStringon windows already stores strings as WTF-8, which supports surrogate pairs, something that UTF-8 isn't allowed do it for security reasons, after all it's UTF-16 specific and exists only to extend the encodable code-points.
- informative reading on WTF-8 which is the encoding used by Rust internally that deals with surrogates and non-wellformed surrogates (those that aren't in pairs).
- It uses opendir and readdir respectively. There is no encoding specified, except that these paths are null-terminated.
This is the reason we have to deal with
to_string_lossy(), it's just for that quirk.
This also means the only platform ever eligible to see conversion errors is windows, and there it's only older pre-vista windows versions which incorrectly allow ill-formed UTF-16 strings. Newer versions don't perform such conversions anymore, for example when going from UTF-16 to UTF-8, they will trigger an error.
We will, though, which means from now on we can just convert to UTF-8 on windows and bubble up errors where necessary, preventing potential mismatched surrogate pairs to ever be saved on disk by gitoxide.
Even though the error only exists on older windows versions, we will represent it in the type system through fallible function calls.
.expect() on the result to indicate they don't wish to handle this special and rare case. Note that servers should not
ever get into a code-path which does panic though.