nushell/crates
Reilly Wood a562f492e3
Windows: handle illegal filenames a little better (#7999)
This PR is an incremental improvement to `ls` when it encounters
'illegal' file paths on Windows. Related:
https://github.com/nushell/nushell/issues/7869

## Context

We have trouble with filenames that Windows doesn't like, for example
[files with a `.` at the end of their
name](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions).
To make a long story short, the Rust stdlib and several Win32 APIs will
choke if asked to do something with an illegal filepath. This is a
problem because files with illegal names can be created via other means
(like `touch foo.` in MINGW bash).

Previously `ls` would fail completely in a directory with a bad file,
which isn't great. After this PR, bad files get included in `ls` results
but without any metadata columns. This is not quite where we want to be
— eventually we want to be able to display file metadata for _all_ files
(even naughty ones) — but it's an improvement on the status quo.

### Before


![image](https://user-images.githubusercontent.com/26268125/217340906-26afd6d3-0ec3-454f-bed4-2bfcc9cf3a2f.png)

### After


![image](https://user-images.githubusercontent.com/26268125/217344373-6b81cc39-50b8-4390-8061-3e570502a784.png)

## Future work

Try the workarounds @ChrisDenton suggested:
https://github.com/nushell/nushell/issues/7869#issuecomment-1405977221

Some info on verbatim paths:
https://users.rust-lang.org/t/understanding-windows-paths/58583

## Testing

I tried to write a test for this, but it looks like our testing sandbox
can't create files with illegal filenames.😔 Here's the code in case it
proves useful someday:

```rust
/// Windows doesn't like certain file names, like file names ending with a period:
/// https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions
/// However, those files can still be created with tools like MINGW bash.
/// We may not be able to get full metadata for those files, but we should test that we can at least include them in ls results
#[test]
#[cfg(windows)]
fn can_list_illegal_files() {
    Playground::setup("ls_test_all_columns", |dirs, sandbox| {
        sandbox.with_files(vec![
            EmptyFile("foo"),
            EmptyFile("bar."),
            EmptyFile("baz"),
        ]);

        let actual = nu!(
            cwd: dirs.test(),
            "ls | length"
        );
        assert_eq!(actual.out, "3");

        let actual = nu!(
            cwd: dirs.test(),
            "ls"
        );
        assert_eq!(actual.out, "1");

        let actual = nu!(
            cwd: dirs.test(),
            "ls | where {|f| $f.name | str ends-with 'bar.'} | length"
        );
        assert_eq!(actual.out, "1");
    })
}
```
2023-02-07 12:30:37 -08:00
..
nu_plugin_custom_values Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu_plugin_example Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu_plugin_gstat Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu_plugin_inc Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu_plugin_python Fix typos by codespell (#7600) 2022-12-26 02:31:26 -05:00
nu_plugin_query Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-cli respect use_ansi_coloring configuration (#7912) 2023-02-02 00:03:05 +01:00
nu-color-config Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-command Windows: handle illegal filenames a little better (#7999) 2023-02-07 12:30:37 -08:00
nu-engine Fix $nu path separators on Windows (#7996) 2023-02-07 11:50:39 -08:00
nu-explore Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-glob Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-json Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-parser Use imported names in Command::run signatures (#7967) 2023-02-05 22:17:46 +01:00
nu-path Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-plugin Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-pretty-hex Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-protocol report which datetime couldn't be converted (#7980) 2023-02-06 14:17:07 -06:00
nu-system Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-table Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-term-grid Bump to 0.75.1 development version (#7930) 2023-01-31 23:55:29 +01:00
nu-test-support Fix: dst error on cp command (#7895) 2023-02-01 21:48:21 +01:00
nu-utils Clarify two config fields (#7969) 2023-02-06 00:01:23 +01:00
README.md Remove old nushell/merge engine-q 2022-02-07 14:54:06 -05:00

Nushell core libraries and plugins

These sub-crates form both the foundation for Nu and a set of plugins which extend Nu with additional functionality.

Foundational libraries are split into two kinds of crates:

  • Core crates - those crates that work together to build the Nushell language engine
  • Support crates - a set of crates that support the engine with additional features like JSON support, ANSI support, and more.

Plugins are likewise also split into two types:

  • Core plugins - plugins that provide part of the default experience of Nu, including access to the system properties, processes, and web-connectivity features.
  • Extra plugins - these plugins run a wide range of different capabilities like working with different file types, charting, viewing binary data, and more.