terminal/src/cascadia/TerminalApp
Dustin L. Howett a2a605050f
When launching wsl, promote the starting directory to --cd (#9223)
This commit introduces a hack to ConptyConnection for launching WSL.
When we detect that WSL is being launched (either "wsl" or "wsl.exe",
unqialified or _specifically_ from the current OS's System32 directory),
we will promote the startingDirectory specified at launch time into a
commandline argument.

Why do we want to switch to `--cd`?
With the current design of ConptyConnection and WSL, there are some
significant limitations:
* `startingDirectory` cannot be a WSL path, which forces users to
  use weird tricks such as setting the starting directory to
  `\\wsl$\Distro\home\user`.
* WSL occasionally fails to launch in time to handle a `\\wsl$` path,
  which makes us spawn in a strange location (or no location at all).

(This fix will only address the second one until a WSL update is
released that adds support for `--cd $LINUX_PATH`.)

We will not do the promotion if any of the following are true:
* the commandline contains `--cd` already
* the commandline contains a bare `~`
   * This was a commonly-used workaround that forced wsl to start in the
     user's home directory. It conflicts with --cd.
* wsl is not spelled properly (`WSL` and `WSL.EXE` are unacceptable)
* an absolute path to wsl outside the system32 directory is provided

We chose the do this trick in the connection layer, the latest possible
point, because it captures the most use cases.

We could have done it earlier, but the options were quite limiting.
They are:

* Generate WSL profiles with startingDirectory set to the home folder
   * We can't do this because we do not know the user's home folder
     path.
* Generate WSL profiles with `--cd` in them.
   * This only works for unmodified profiles.
   * This only works for generated profiles.
   * Users cannot override the commandline without breaking it.
   * Users cannot specify a startingDirectory (!) since the one on the
     commandline wins.
* Set a flag on generated WSL profiles to request this trick
   * This only works for generated profiles. Users who create their own
     WSL profiles couldn't set startingDirectory and have it work the
     same.

Patching the commandline, hacky though it may be, seemed to be the most
compatible option. Eventually, we can even support `wt -d ~ wsl`!

## Validation Steps Performed

Manual validation for the following cases:

```c++
// MUST MANGLE
auto a01 = _tryMangleStartingDirectoryForWSL(LR"(wsl)", L"SENTINEL");
auto a02 = _tryMangleStartingDirectoryForWSL(LR"(wsl -d X)", L"SENTINEL");
auto a03 = _tryMangleStartingDirectoryForWSL(LR"(wsl -d X ~/bin/sh)", L"SENTINEL");
auto a04 = _tryMangleStartingDirectoryForWSL(LR"(wsl.exe)", L"SENTINEL");
auto a05 = _tryMangleStartingDirectoryForWSL(LR"(wsl.exe -d X)", L"SENTINEL");
auto a06 = _tryMangleStartingDirectoryForWSL(LR"(wsl.exe -d X ~/bin/sh)", L"SENTINEL");
auto a07 = _tryMangleStartingDirectoryForWSL(LR"("wsl")", L"SENTINEL");
auto a08 = _tryMangleStartingDirectoryForWSL(LR"("wsl.exe")", L"SENTINEL");
auto a09 = _tryMangleStartingDirectoryForWSL(LR"("wsl" -d X)", L"SENTINEL");
auto a10 = _tryMangleStartingDirectoryForWSL(LR"("wsl.exe" -d X)", L"SENTINEL");
auto a11 = _tryMangleStartingDirectoryForWSL(LR"("C:\Windows\system32\wsl.exe" -d X)", L"SENTINEL");
auto a12 = _tryMangleStartingDirectoryForWSL(LR"("C:\windows\system32\wsl" -d X)", L"SENTINEL");
auto a13 = _tryMangleStartingDirectoryForWSL(LR"(wsl ~/bin)", L"SENTINEL");

// MUST NOT MANGLE
auto a14 = _tryMangleStartingDirectoryForWSL(LR"("C:\wsl.exe" -d X)", L"SENTINEL");
auto a15 = _tryMangleStartingDirectoryForWSL(LR"(C:\wsl.exe)", L"SENTINEL");
auto a16 = _tryMangleStartingDirectoryForWSL(LR"(wsl --cd C:\)", L"SENTINEL");
auto a17 = _tryMangleStartingDirectoryForWSL(LR"(wsl ~)", L"SENTINEL");
auto a18 = _tryMangleStartingDirectoryForWSL(LR"(wsl ~ -d Ubuntu)", L"SENTINEL");
```

We don't have anywhere to put TerminalConnection unit tests :|

Closes #592.
2021-08-02 20:39:11 +00:00
..
dll Update Xaml Toolkit App Host to 6.1.3 (#10640) 2021-07-12 22:58:02 +00:00
Resources/en-US Set drag and drop on '+' tooltip text based on keyboard modifiers (#10841) 2021-08-02 18:44:39 +00:00
ActionPaletteItem.cpp Add a simple page for keybindings (#9253) 2021-02-23 23:37:23 +00:00
ActionPaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
ActionPaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
ActionPreviewHandlers.cpp Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
App.base.h Fix some places where we weren't using winrt::make (#10335) 2021-06-04 22:22:06 +00:00
App.cpp Make Terminal look great in High Contrast (#6833) 2020-07-08 12:08:08 -07:00
App.h Break everything out of App except Xaml platform init (#3465) 2019-11-07 13:10:58 -08:00
App.idl Fix intellisense errors by moving TerminalApp projects around (#6897) 2020-08-20 22:44:37 +00:00
App.xaml Terminal color picker tweaks (#10219) 2021-06-10 15:49:52 +00:00
AppActionHandlers.cpp Passing through moveFocus keys when moving to another pane failed (#10806) 2021-07-28 22:05:32 +00:00
AppCommandlineArgs.cpp Preliminary work to add Swap Panes functionality (GH Issues 1000, 4922) (#10638) 2021-07-22 12:53:03 +00:00
AppCommandlineArgs.h Preliminary work to add Swap Panes functionality (GH Issues 1000, 4922) (#10638) 2021-07-22 12:53:03 +00:00
AppKeyBindings.cpp Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
AppKeyBindings.h Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
AppKeyBindings.idl Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
AppLogic.cpp Only access ControlInteractivity through the projection (#10051) 2021-07-19 11:59:30 -05:00
AppLogic.h Only access ControlInteractivity through the projection (#10051) 2021-07-19 11:59:30 -05:00
AppLogic.idl Summon this window when it receives an inbound connection (#10217) 2021-05-27 17:14:12 +00:00
ColorHelper.cpp Fix a few minor typos from #3789 (#5740) 2020-05-04 16:47:29 -05:00
ColorHelper.h Add support for setting a tab's color at runtime w/ context menu (#3789) 2020-05-04 20:57:12 +00:00
ColorPickupFlyout.cpp Fix color picker minimum width (#10663) 2021-07-15 14:39:25 +00:00
ColorPickupFlyout.h Terminal color picker tweaks (#10219) 2021-06-10 15:49:52 +00:00
ColorPickupFlyout.idl Add support for setting a tab's color at runtime w/ context menu (#3789) 2020-05-04 20:57:12 +00:00
ColorPickupFlyout.xaml Terminal color picker tweaks (#10219) 2021-06-10 15:49:52 +00:00
Commandline.cpp Add support for commandline args to wt.exe (#4023) 2020-01-27 15:34:12 +00:00
Commandline.h Add support for commandline args to wt.exe (#4023) 2020-01-27 15:34:12 +00:00
CommandLinePaletteItem.cpp Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
CommandLinePaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
CommandLinePaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
CommandPalette.cpp Introduce vk() and sc() key chord specifiers (#10666) 2021-07-20 22:34:51 +00:00
CommandPalette.h Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
CommandPalette.idl Introduce ActionMap to Terminal Settings Model (#9621) 2021-05-04 21:50:13 -07:00
CommandPalette.xaml Revert "Add the profile, page icons to the page headers (#10046)" (#10124) 2021-05-18 17:35:50 -05:00
DebugTapConnection.cpp Switch Connections to use ValueSets to initialize them (#10184) 2021-07-20 15:02:17 +00:00
DebugTapConnection.h Switch Connections to use ValueSets to initialize them (#10184) 2021-07-20 15:02:17 +00:00
EmptyStringVisibilityConverter.cpp Add some polish to nested commands in the command palette (#7299) 2020-08-18 19:32:17 +00:00
EmptyStringVisibilityConverter.h Change backslashes in include statements to forward slashes (#8205) 2020-11-25 21:02:10 +00:00
EmptyStringVisibilityConverter.idl Add some polish to nested commands in the command palette (#7299) 2020-08-18 19:32:17 +00:00
FilteredCommand.cpp Teach CmdPal search to use user locale (#9943) 2021-05-04 23:31:15 +00:00
FilteredCommand.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
FilteredCommand.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
HighlightedText.cpp Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedText.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
HighlightedText.idl Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.cpp Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.h Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.idl Bold matching text in the command palette (#7977) 2020-11-05 17:37:45 -08:00
HighlightedTextControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
IDirectKeyListener.idl Pass the scancode in our tunneled DirectKey event (#7298) 2020-08-14 23:44:39 +00:00
init.cpp Hook up the WIL fallback error tracer in Terminal (#7864) 2020-10-09 22:20:12 +00:00
Jumplist.cpp Fix crash when unpackaged due to PrimaryLanguageOverride (#10434) 2021-06-16 21:08:14 +00:00
Jumplist.h Move jumplist creation to background thread (#7978) 2020-10-22 17:17:26 -07:00
MinMaxCloseControl.cpp Move events out of TermControl.h ; Use TYPED_EVENT in more places (#9526) 2021-03-18 22:02:39 +00:00
MinMaxCloseControl.h Move events out of TermControl.h ; Use TYPED_EVENT in more places (#9526) 2021-03-18 22:02:39 +00:00
MinMaxCloseControl.idl Fix intellisense errors by moving TerminalApp projects around (#6897) 2020-08-20 22:44:37 +00:00
MinMaxCloseControl.xaml Smoothen close caption button animation (#9763) 2021-04-12 13:13:18 +00:00
packages.config Update Xaml Toolkit App Host to 6.1.3 (#10640) 2021-07-12 22:58:02 +00:00
PaletteItem.cpp Rename Microsoft.Terminal.TerminalControl to .Control; Split into dll & lib (#9472) 2021-03-17 20:47:24 +00:00
PaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
PaletteItem.idl Teach CommandPalette model to natively support tabs and command lines (#8420) 2020-12-10 00:36:28 +00:00
PaletteItemTemplateSelector.cpp Add help text to 'more options' in command palette (#9271) 2021-02-24 12:02:09 -08:00
PaletteItemTemplateSelector.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
PaletteItemTemplateSelector.idl Add help text to 'more options' in command palette (#9271) 2021-02-24 12:02:09 -08:00
Pane.cpp Update NavigateFocus function to use new visual-based navigation (#10756) 2021-07-23 00:09:47 +00:00
Pane.h Update NavigateFocus function to use new visual-based navigation (#10756) 2021-07-23 00:09:47 +00:00
Pane.LayoutSizeNode.cpp Snap to character grid when resizing window (#3181) 2020-01-08 13:19:23 -08:00
pch.cpp Initial release of the Windows Terminal source code 2019-05-02 15:29:04 -07:00
pch.h Add a language switcher using PrimaryLanguageOverride (#10309) 2021-06-10 23:24:21 +00:00
SettingsTab.cpp In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
SettingsTab.h In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
SettingsTab.idl Add a keybinding option to Terminal to open the Settings UI (#8048) 2020-12-11 13:47:10 -08:00
ShortcutActionDispatch.cpp Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
ShortcutActionDispatch.h Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
ShortcutActionDispatch.idl Add X Macro for fun and for profit (#9667) 2021-03-31 16:38:25 +00:00
TabBase.cpp In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
TabBase.h In specific scenarios, focus the active control (#10048) 2021-05-11 23:55:49 +00:00
TabBase.idl Introduce read-only panes (#8867) 2021-02-08 18:03:55 +00:00
TabHeaderControl.cpp Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.h Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.idl Don't yeet focus to the control when the tab renamer is opened (#10114) 2021-05-18 18:48:57 +00:00
TabHeaderControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
TabManagement.cpp [DefApp] Teach connection and tab to negotiate initial size (#10772) 2021-07-26 19:31:48 +00:00
TabPaletteItem.cpp Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TabPaletteItem.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
TabPaletteItem.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TabRowControl.cpp Set drag and drop on '+' tooltip text based on keyboard modifiers (#10841) 2021-08-02 18:44:39 +00:00
TabRowControl.h implement drag&drop path in '+' button (#10073) (#10160) 2021-07-20 14:26:35 +00:00
TabRowControl.idl Upgrade to Microsoft.UI.Xaml 2.2 (#3027) 2019-10-14 22:41:43 -07:00
TabRowControl.xaml implement drag&drop path in '+' button (#10073) (#10160) 2021-07-20 14:26:35 +00:00
TerminalAppLib.vcxproj Update Xaml Toolkit App Host to 6.1.3 (#10640) 2021-07-12 22:58:02 +00:00
TerminalAppLib.vcxproj.filters Move TerminalSettings from TermApp to TerminalSettingsModel (#9318) 2021-03-15 23:15:25 +00:00
TerminalPage.cpp When launching wsl, promote the starting directory to --cd (#9223) 2021-08-02 20:39:11 +00:00
TerminalPage.h Passing through moveFocus keys when moving to another pane failed (#10806) 2021-07-28 22:05:32 +00:00
TerminalPage.idl Summon this window when it receives an inbound connection (#10217) 2021-05-27 17:14:12 +00:00
TerminalPage.xaml Add support for LightDismissing the renamer (#9733) 2021-04-07 00:12:41 +00:00
TerminalTab.cpp Passing through moveFocus keys when moving to another pane failed (#10806) 2021-07-28 22:05:32 +00:00
TerminalTab.h Passing through moveFocus keys when moving to another pane failed (#10806) 2021-07-28 22:05:32 +00:00
TerminalTab.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TerminalTabStatus.cpp Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TerminalTabStatus.h Replace some of our macros to reduce confusion, increase success (#9376) 2021-03-04 11:27:03 -08:00
TerminalTabStatus.idl Fix ATS tab status indicators (#9076) 2021-02-10 11:27:29 +00:00
TitlebarControl.cpp Add support for setting a tab's color at runtime w/ context menu (#3789) 2020-05-04 20:57:12 +00:00
TitlebarControl.h Add support for setting a tab's color at runtime w/ context menu (#3789) 2020-05-04 20:57:12 +00:00
TitlebarControl.idl Upgrade to Microsoft.UI.Xaml 2.2 (#3027) 2019-10-14 22:41:43 -07:00
TitlebarControl.xaml Auto-format our XAML files and enforce in CI (#9589) 2021-03-29 17:09:38 -05:00
Toast.cpp Add an action for identifying windows (#9523) 2021-03-30 16:08:03 +00:00
Toast.h Add an action for identifying windows (#9523) 2021-03-30 16:08:03 +00:00