From b8ad6553c42d445114af37dd9f668a63a878863a Mon Sep 17 00:00:00 2001 From: mintty Date: Thu, 2 Apr 2020 14:44:32 +0200 Subject: [PATCH] fix installer: invoke configuration (#232), shortcuts generation (#237, #162), usernames with spaces (#230) and other chars (#213), #162 generate shortcuts --- cmd2.bat | 1 + config-distros.sh | 127 +++++++++++++++++++++++++++++++--------------- dequote.bat | 3 ++ install.bat | 49 +++++++++++------- makewinx.cfg | 4 ++ uninstall.bat | 2 + 6 files changed, 127 insertions(+), 59 deletions(-) create mode 100755 cmd2.bat create mode 100755 dequote.bat diff --git a/cmd2.bat b/cmd2.bat new file mode 100755 index 0000000..9e1cf04 --- /dev/null +++ b/cmd2.bat @@ -0,0 +1 @@ +%1 "%from%" "%to%" diff --git a/config-distros.sh b/config-distros.sh index 4ca577f..c053d9b 100755 --- a/config-distros.sh +++ b/config-distros.sh @@ -1,12 +1,42 @@ #! /bin/sh +# dash built-in echo enforces interpretation of \t etc +echoc () { + #cmd /c echo $* + printf '%s\n' "$*" +} + +copy () { + from="$1" + to="$2" + export from to + cmd /c cmd2.bat copy +} + +delete () { + from=/F + to="$1" + export from to + cmd /c cmd2.bat del +} + +compare () { + from="$1" + to="$2" + export from to + cmd /c cmd2.bat comp/M +} + + case "$installdir" in ?*) custominst=true;; "") custominst=false;; esac INSTDIR="${installdir:-$LOCALAPPDATA/wsltty}" +echoc "Installing wsltty into $INSTDIR" INSTDIR=`cd "$INSTDIR"; pwd` +installcop=${installdir:-"$LOCALAPPDATA\\wsltty"} installdir=${installdir:-'%LOCALAPPDATA%\wsltty'} target="$installdir"'\bin\mintty.exe' @@ -39,6 +69,9 @@ case "$1" in -shortcuts-remove) remove=true shift;; +-default) + alldistros=false + shift;; -contextmenu) contextmenu=true shift;; @@ -76,20 +109,21 @@ case "$1" in shift;; esac + if $config && ! $contextmenu then # remove shortcut entries in Start menu and cmd-line bat shortcuts (cd "$INSTDIR" for lnk in *.lnk do - if cmd /C comp/M "$lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk" - then cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk" + if compare "$lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk" + then delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$lnk" fi done for bat in *.bat do - if cmd /C comp/M "$bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$bat" - then cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$bat" + if compare "$bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat" + then delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$bat" fi done ) @@ -121,10 +155,6 @@ regtool () { } fi -# dash built-in echo enforces interpretation of \t etc -echoc () { - cmd /c echo $* -} if $config then while read line; do echo "$line"; done < mkbat.bat @@ -158,10 +188,10 @@ then bridgeargs=-contextmenu-remove cscript /nologo mkshortcut.vbs "/name:remove from context menu" "/min:true" - cmd /C copy "add to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" - cmd /C copy "add default to context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" - cmd /C copy "remove from context menu.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" - cmd /C copy "configure WSL shortcuts.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + copy "add to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + copy "add default to context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + copy "remove from context menu.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + copy "configure WSL shortcuts.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" # restore target target="$installdir"'\bin\mintty.exe' @@ -212,12 +242,10 @@ config () { psh_cmd='([xml]$(Get-Content '"\"$manifest\""')).Package.Applications.Application.Executable' executable=`appex "$manifest"` if [ -r "$ProgramW6432/WindowsApps/$distrinst/$executable" ] - then #icon="%ProgramW6432%/WindowsApps/$distrinst/$executable" - icon="$ProgramW6432/WindowsApps/$distrinst/$executable" + then icon="$ProgramW6432/WindowsApps/$distrinst/$executable" elif [ -r "$ProgramW6432/WindowsApps/$distrinst/images/icon.ico" ] - then #icon="%ProgramW6432%/WindowsApps/$distrinst/images/icon.ico" - icon="$ProgramW6432/WindowsApps/$distrinst/images/icon.ico" - else icon="$installdir"'\wsl.ico' + then icon="$ProgramW6432/WindowsApps/$distrinst/images/icon.ico" + else icon="$installcop"'\wsl.ico' fi root="$basepath/rootfs" elif [ -f "$basepath/$distro.exe" ] @@ -227,11 +255,11 @@ config () { elif [ -d "$LOCALAPPDATA/lxss" ] then # legacy "Bash on Windows" - icon="%LOCALAPPDATA%/lxss/bash.ico" + icon="$LOCALAPPDATA/lxss/bash.ico" root="$basepath" else # imported distro? (#226, #236) - icon="$installdir"'\wsl.ico' + icon="$installcop"'\wsl.ico' root="$basepath/rootfs" fi @@ -246,7 +274,7 @@ config () { DefaultDistribution|"") # WSL default installation distro= name=WSL - icon="$installdir"'\wsl.ico' + icon="$installcop"'\wsl.ico' minttyargs='--WSL= --configdir="'"$configdir"'"' MINTARGS='--WSL= --configdir="'"$CONFDIR"'"' #bridgeargs='-t' @@ -286,43 +314,57 @@ config () { reg delete "$direckey\\shell\\$keyname" /f reg delete "$direckey\\Background\\shell\\$keyname" /f else - reg add "$direckey\\shell\\$keyname" /d "$name Terminal" /f - reg add "$direckey\\shell\\$keyname" /v Icon /d "$icon" /f - cmd /C reg add "$direckey\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" --dir \"%1\" $minttyargs $bridgeargs" /f - reg add "$direckey\\Background\\shell\\$keyname" /d "$name Terminal" /f - reg add "$direckey\\Background\\shell\\$keyname" /v Icon /d "$icon" /f - cmd /C reg add "$direckey\\Background\\shell\\$keyname\\command" /d "\"$target\" -i \"$icon\" $minttyargs $bridgeargs" /f + direckey='/HKEY_CURRENT_USER/Software/Classes/Directory' + echoc Registry setting "$direckey/[Background/]shell/$keyname" + target="$installcop"'\bin\mintty.exe' + + regtool add "$direckey/shell" + regtool add "$direckey/shell/$keyname" + regtool set "$direckey/shell/$keyname/" -s "$name Terminal" + regtool set "$direckey/shell/$keyname/Icon" -s "$icon" + regtool add "$direckey/shell/$keyname/command" + regtool set "$direckey/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" --dir \"%1\" $MINTARGS $bridgeargs" + + regtool add "$direckey/Background/shell" + regtool add "$direckey/Background/shell/$keyname" + regtool set "$direckey/Background/shell/$keyname/" -s "$name Terminal" + regtool set "$direckey/Background/shell/$keyname/Icon" -s "$icon" + regtool add "$direckey/Background/shell/$keyname/command" + regtool set "$direckey/Background/shell/$keyname/command/" -s "\"$target\" -i \"$icon\" $MINTARGS $bridgeargs" fi else # invocation shortcuts and scripts if $remove then - cmd /C del "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk" - cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name.bat" - cmd /C del "%LOCALAPPDATA%\\Microsoft\\WindowsApps\\$name~.bat" + delete "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\$name Terminal.lnk" + delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name.bat" + delete "$LOCALAPPDATA\\Microsoft\\WindowsApps\\$name~.bat" if [ "$name" = "WSL" ] then # determine actual Desktop folder desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop' desktop=`regtool get "$desktopkey"` - cmd /C del "$desktop\\$name Terminal.lnk" + case "$desktop" in + %USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";; + esac + delete "$desktop\\$name Terminal.lnk" fi else # desktop shortcut in %USERPROFILE% -> Start Menu - WSLtty cscript /nologo mkshortcut.vbs "/name:$name Terminal %" #mkshortcut.exe -n "$name Terminal %" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE% - cmd /C copy "$name Terminal %.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" + copy "$name Terminal %.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs\\WSLtty" # launch script in . -> WSLtty home, WindowsApps launch folder cmd /C mkbat.bat "$name" - cmd /C copy "$name.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps" + copy "$name.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps" # store backup copies in installation dir if [ "$PWD" != "$INSTDIR" ] then - cmd /C copy "$name Terminal %.lnk" "$installdir" - cmd /C copy "$name.bat" "$installdir" + copy "$name Terminal %.lnk" "$installcop" + copy "$name.bat" "$installcop" fi # prepare versions to target WSL home directory @@ -333,29 +375,32 @@ config () { # desktop shortcut in ~ -> Start Menu cscript /nologo mkshortcut.vbs "/name:$name Terminal" #mkshortcut.exe -n "$name Terminal" -i "$icon" "$TARGETPATH" -a "$MINTARGS" -d "" -w %USERPROFILE% - cmd /C copy "$name Terminal.lnk" "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs" + copy "$name Terminal.lnk" "$APPDATA\\Microsoft\\Windows\\Start Menu\\Programs" # default desktop shortcut in ~ -> Desktop if [ "$name" = "WSL" ] then - #cmd /C copy "$name Terminal.lnk" "%USERPROFILE%\\Desktop" - #cmd /C copy "$name Terminal.lnk" "%APPDATA%\\..\\Desktop\\" + #copy "$name Terminal.lnk" "$USERPROFILE\\Desktop" + #copy "$name Terminal.lnk" "$APPDATA\\..\\Desktop\\" # the above does not work reliably (see #166) # determine actual Desktop folder desktopkey='\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\Desktop' desktop=`regtool get "$desktopkey"` - cmd /C copy "$name Terminal.lnk" "$desktop\\" + case "$desktop" in + %USERPROFILE%*) desktop="$USERPROFILE${desktop#%USERPROFILE%}";; + esac + copy "$name Terminal.lnk" "$desktop\\" fi # launch script in ~ -> WSLtty home, WindowsApps launch folder cmd /C mkbat.bat "$name~" - cmd /C copy "$name~.bat" "%LOCALAPPDATA%\\Microsoft\\WindowsApps" + copy "$name~.bat" "$LOCALAPPDATA\\Microsoft\\WindowsApps" # store backup copies in installation dir if [ "$PWD" != "$INSTDIR" ] then - cmd /C copy "$name Terminal.lnk" "$installdir" - cmd /C copy "$name~.bat" "$installdir" + copy "$name Terminal.lnk" "$installcop" + copy "$name~.bat" "$installcop" fi fi diff --git a/dequote.bat b/dequote.bat new file mode 100755 index 0000000..3dd1116 --- /dev/null +++ b/dequote.bat @@ -0,0 +1,3 @@ +@echo off +rem https://ss64.com/nt/syntax-dequote.html +for /f "delims=" %%A in ('echo %%%1%%') do set %1=%%~A diff --git a/install.bat b/install.bat index 7b75c0c..21369b3 100755 --- a/install.bat +++ b/install.bat @@ -4,16 +4,21 @@ set refinstalldir=%%LOCALAPPDATA%%\wsltty set installdir="%LOCALAPPDATA%\wsltty" set refconfigdir=%%APPDATA%%\wsltty set configdir="%APPDATA%\wsltty" +call dequote installdir +call dequote configdir set oldroot="%installdir%" set oldhomedir="%installdir%\home\%USERNAME%" +call dequote oldroot +call dequote oldhomedir set oldconfigdir="%oldhomedir%\.config\mintty" +call dequote oldconfigdir if not "%1" == "" set refinstalldir=%1 && set installdir=%1 if not "%2" == "" set refconfigdir=%2 && set configdir=%2 :deploy -mkdir "%installdir%" +mkdir "%installdir%" 2> nul: rem clean up previous installation artefacts del /Q "%installdir%\*.bat" @@ -31,6 +36,8 @@ rem copy "WSL Terminal %%.lnk" "%installdir%" copy config-distros.sh "%installdir%" copy mkshortcut.vbs "%installdir%" +copy cmd2.bat "%installdir%" +copy dequote.bat "%installdir%" rem allow persistent customization of default icon: if not exist "%installdir%\wsl.ico" copy tux.ico "%installdir%\wsl.ico" @@ -39,16 +46,16 @@ copy uninstall.bat "%installdir%" if not exist "%installdir%\bin" goto instbin rem move previous programs possibly in use out of the way -del /Q "%installdir%\bin\*.old" +del /Q "%installdir%\bin\*.old" 2> nul: ren "%installdir%\bin\cygwin1.dll" cygwin1.dll.old ren "%installdir%\bin\cygwin-console-helper.exe" cygwin-console-helper.exe.old ren "%installdir%\bin\mintty.exe" mintty.exe.old ren "%installdir%\bin\wslbridge2.exe" wslbridge2.exe.old ren "%installdir%\bin\wslbridge2-backend" wslbridge2-backend.old -del /Q "%installdir%\bin\*.old" +del /Q "%installdir%\bin\*.old" 2> nul: :instbin -mkdir "%installdir%\bin" +mkdir "%installdir%\bin" 2> nul: copy cygwin1.dll "%installdir%\bin" copy cygwin-console-helper.exe "%installdir%\bin" copy mintty.exe "%installdir%\bin" @@ -65,22 +72,23 @@ rem copy cygiconv-2.dll "%installdir%"\bin rem copy cygintl-8.dll "%installdir%"\bin rem create system config directory and copy config archive -mkdir "%installdir%\usr\share\mintty\lang" +mkdir "%installdir%\usr\share\mintty\lang" 2> nul: copy lang.zoo "%installdir%\usr\share\mintty\lang" -mkdir "%installdir%\usr\share\mintty\themes" +mkdir "%installdir%\usr\share\mintty\themes" 2> nul: copy themes.zoo "%installdir%\usr\share\mintty\themes" -mkdir "%installdir%\usr\share\mintty\sounds" +mkdir "%installdir%\usr\share\mintty\sounds" 2> nul: copy sounds.zoo "%installdir%\usr\share\mintty\sounds" -mkdir "%installdir%\usr\share\mintty\info" +mkdir "%installdir%\usr\share\mintty\info" 2> nul: copy charnames.txt "%installdir%\usr\share\mintty\info" -mkdir "%installdir%\usr\share\mintty\icon" +mkdir "%installdir%\usr\share\mintty\icon" 2> nul: copy tux.ico "%installdir%\usr\share\mintty\icon" copy mintty.ico "%installdir%\usr\share\mintty\icon" rem create Start Menu Folder set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty" -mkdir "%smf%" +call dequote smf +mkdir "%smf%" 2> nul: rem clean up previous installation del /Q "%smf%\*.lnk" @@ -93,7 +101,7 @@ copy "configure WSL shortcuts.lnk" "%smf%" rem copy "WSL Terminal.lnk" "%smf%" rem copy "WSL Terminal %%.lnk" "%smf%" rem clean up previous installation -rmdir /S /Q "%smf%\context menu shortcuts" +rmdir /S /Q "%smf%\context menu shortcuts" 2> nul: rem unpack config files in system config directory cd /D "%installdir%\usr\share\mintty\lang" @@ -102,6 +110,7 @@ cd /D "%installdir%\usr\share\mintty\themes" "%installdir%\bin\zoo" xO themes cd /D "%installdir%\usr\share\mintty\sounds" "%installdir%\bin\zoo" xO sounds +cd /D "%installdir%" :migrate configuration @@ -116,24 +125,28 @@ rmdir "%oldhomedir%\.config" if exist "%configdir%\config" goto deloldhome if exist "%oldhomedir%\.minttyrc" copy "%oldhomedir%\.minttyrc" "%configdir%\config" && del "%oldhomedir%\.minttyrc" :deloldhome -rmdir "%oldhomedir%" -rmdir "%oldroot%\home" +rmdir "%oldhomedir%" 2> nul: +rmdir "%oldroot%\home" 2> nul: :userconfig rem create user config directory and subfolders -mkdir "%configdir%\lang" -mkdir "%configdir%\themes" -mkdir "%configdir%\sounds" +mkdir "%configdir%\lang" 2> nul: +mkdir "%configdir%\themes" 2> nul: +mkdir "%configdir%\sounds" 2> nul: rem create config file if it does not yet exist if not exist "%configdir%\config" echo # To use common configuration in %%APPDATA%%\mintty, simply remove this file>"%configdir%\config" + +:appconfig + rem distro-specific stuff: shortcuts and launch scripts cd /D "%installdir%" -bin\dash.exe "%installdir%\config-distros.sh" -rem bin\dash.exe "%installdir%\config-distros.sh" -contextmenu +echo Configuring for WSL distributions +bin\dash.exe "config-distros.sh" +rem rem bin\dash.exe "config-distros.sh" -contextmenu :end diff --git a/makewinx.cfg b/makewinx.cfg index ef7245f..b9cb934 100644 --- a/makewinx.cfg +++ b/makewinx.cfg @@ -58,6 +58,8 @@ FILE22="themes.zoo" FILE23="sounds.zoo" FILE24="mintty.ico" FILE25="mkshortcut.vbs" +FILE26="dequote.bat" +FILE27="cmd2.bat" [SourceFiles] SourceFiles0=. @@ -89,4 +91,6 @@ SourceFiles0=. %FILE23%= %FILE24%= %FILE25%= +%FILE26%= +%FILE27%= diff --git a/uninstall.bat b/uninstall.bat index 4e7932c..394c097 100755 --- a/uninstall.bat +++ b/uninstall.bat @@ -1,12 +1,14 @@ @echo off if "%installdir%" == "" set installdir="%LOCALAPPDATA%\wsltty" +call dequote installdir :shortcuts rem delete Start Menu Folder set smf="%APPDATA%\Microsoft\Windows\Start Menu\Programs\WSLtty" +call dequote smf rmdir /S /Q "%smf%"