Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix and enhance enhance_path_recursive #2311

Merged
merged 8 commits into from
Jun 26, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

bin/*
!bin/Readme.md
opt/*
!opt/Readme.md

vendor/*/*
!vendor/bin/*
Expand Down
22 changes: 16 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,29 @@ The Cmder's user interface is also designed to be more eye pleasing, and you can
### Shared Cmder install with Non-Portable Individual User Config
1. Download the [latest release](https://github.com/cmderdev/cmder/releases/)
2. Extract the archive to a shared location.
3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH.
4. (optional) Create `%userprofile%\cmder_config\bin` folder to be injected into individual users PATH. Default is to auto create this on first run.
5. (optional) Place your own executable files into the `%userprofile%\cmder_config\bin` folder to be injected into your PATH.
6. Run `Cmder.exe` with `/C` command line argument. Example: `cmder.exe /C %userprofile%\cmder_config`
3. (optional) Place your own executable files and custom app folders into the `%cmder_root%\bin`. See: [opt/README.md](./bin/README)
- This folder to be injected into your PATH by default.
- See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively.
4. (optional) Place your own custom app folders into the `%cmder_root%\opt`. See: [opt/README.md](./opt/README)
- This folder will NOT be injected into your PATH so you have total control of what gets added.
5. Run `Cmder.exe` with `/C` command line argument. Example: `cmder.exe /C %userprofile%\cmder_config`
* This will create the following directory structure if it is missing.

```
c:\users\[username]\cmder_config
├───bin
└───config
└───profile.d
├───config
│ └───profile.d
└───opt
```

- (optional) Place your own executable files and custom app folders into `%userprofile%\cmder_config\bin`.
- This folder to be injected into your PATH by default.
- See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively.
- (optional) Place your own custom app folders into the `%user_profile%\cmder_config\opt`.
- This folder will NOT be injected into your PATH so you have total control of what gets added.


* Both the shared install and the individual user config locations can contain a full set of init and profile.d scripts enabling shared config with user overrides. See below.

## Cmder.exe Command Line Arguments
Expand Down
5 changes: 5 additions & 0 deletions opt/Readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
## Bin

This folder is for optional user packages and will not be automatically injected into the PATH.

Use `%lib_path% enhance_path "%cmder_root%\[path to folder]"` in `%cmder_root%\config\user_profile.cmd` or `%cmder_root%\config\profile.d\*.cmd` to add to the path.
4 changes: 2 additions & 2 deletions vendor/bin/cexec.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ set "currenArgu=%~1"
if /i "%currenArgu%" equ "/setPath" (
:: set %flag_exists% shortcut
endlocal
set "ccall=call %~dp0cexec.cmd"
set "cexec=%~dp0cexec.cmd"
set "ccall=call ^"%~dp0cexec.cmd^""
set "cexec=^"%~dp0cexec.cmd^""
) else if /i "%currenArgu%" == "/?" (
goto :help
) else if /i "%currenArgu%" equ "/help" (
Expand Down
40 changes: 31 additions & 9 deletions vendor/init.bat
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,23 @@ set CMDER_INIT_START=%time%
:: !!! Use "%CMDER_ROOT%\config\user_profile.cmd" to add your own startup commands

:: Use /v command line arg or set to > 0 for verbose output to aid in debugging.
set verbose_output=0
set debug_output=0
set time_init=0
set fast_init=0
set max_depth=1
:: Add *nix tools to end of path. 0 turns off *nix tools.
set nix_tools=1
if not defined verbose_output set verbose_output=0

:: Use /d command line arg or set to 1 for debug output to aid in debugging.
if not defined debug_output set debug_output=0

:: Use /t command line arg or set to 1 to display init time.
if not defined time_init set time_init=0

:: Use /f command line arg to speed up init at the expense of some functionality.
if not defined fast_init set fast_init=0

:: Use /max_depth 1-5 to set max recurse depth for calls to `enhance_path_recursive`
if not defined max_depth set max_depth=1

:: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of thr path.
if not defined nix_tools set nix_tools=1

set "CMDER_USER_FLAGS= "

:: Find root dir
Expand Down Expand Up @@ -120,6 +130,8 @@ goto var_loop

if defined CMDER_USER_CONFIG (
%lib_console% debug_output init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"

if not exist "%CMDER_USER_CONFIG%\opt" md "%CMDER_USER_CONFIG%\opt"
)

:: Pick right version of clink
Expand Down Expand Up @@ -154,6 +166,12 @@ if "%CMDER_CLINK%" == "1" (
%lib_console% verbose_output "WARNING: Incompatible 'ComSpec/Shell' Detetected Skipping Clink Injection!"
)

if "%CMDER_CONFIGURED%" == "1" (
echo Cmder is already configured, skipping Cmder Init!

goto CMDER_CONFIGURED
)

:: Prepare for git-for-windows

:: I do not even know, copypasted from their .bat
Expand Down Expand Up @@ -261,9 +279,11 @@ endlocal

:PATH_ENHANCE
%lib_path% enhance_path "%CMDER_ROOT%\vendor\bin"
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth%

:USER_CONFIG_START
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" 0 %max_depth%
if defined CMDER_USER_BIN (
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" %max_depth%
%lib_path% enhance_path_recursive "%CMDER_USER_BIN%" 0 %max_depth%
)
%lib_path% enhance_path "%CMDER_ROOT%" append

Expand Down Expand Up @@ -367,6 +387,8 @@ if "%CMDER_ALIASES%" == "1" if exist "%CMDER_ROOT%\bin\alias.bat" if exist "%CMD
)

set initialConfig=

:CMDER_CONFIGURED
set CMDER_CONFIGURED=1

set CMDER_INIT_END=%time%
Expand Down
61 changes: 41 additions & 20 deletions vendor/lib/lib_path.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -51,17 +51,26 @@ exit /b
set "position="
)

dir "%add_path%" | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
set "add_to_path="
)

if "%fast_init%" == "1" (
if "%position%" == "append" (
set "PATH=%PATH%;%add_path%"
set "PATH=%PATH%;%add_to_path%"
) else (
set "PATH=%add_path%;%PATH%"
set "PATH=%add_to_path%;%PATH%"
)
goto :end_enhance_path
) else if "add_to_path" equ "" (
goto :end_enhance_path
)

set found=0
set "find_query=%add_path%"
set "find_query=%add_to_path%"
set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %"
set OLD_PATH=%PATH%
Expand Down Expand Up @@ -90,11 +99,11 @@ exit /b

if "%found%" == "0" (
if /i "%position%" == "append" (
%lib_console% debug_output :enhance_path "Appending '%add_path%'"
set "PATH=%PATH%;%add_path%"
%lib_console% debug_output :enhance_path "Appending '%add_to_path%'"
set "PATH=%PATH%;%add_to_path%"
) else (
%lib_console% debug_output :enhance_path "Prepending '%add_path%'"
set "PATH=%add_path%;%PATH%"
%lib_console% debug_output :enhance_path "Prepending '%add_to_path%'"
set "PATH=%add_to_path%;%PATH%"
)

set found=1
Expand Down Expand Up @@ -150,52 +159,64 @@ exit /b
exit 1
)

if "%~2" gtr "1" (
set "max_depth=%~2"
set "depth=%~2"
set "max_depth=%~3"

if "%~4" neq "" if /i "%~4" == "append" (
set "position=%~4"
) else (
set "max_depth=1"
set "position="
)

if "%~3" neq "" if /i "%~3" == "append" (
set "position=%~3"
dir "%add_path%" | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
set "position="
set "add_to_path="
)

if "%fast_init%" == "1" (
call :enhance_path "%add_path%" %position%
if "%add_to_path%" neq "" (
call :enhance_path "%add_to_path%" %position%
)
)

set "PATH=%PATH:;;=;%"
if "%fast_init%" == "1" (
exit /b
)

if "%depth%" == "" set depth=0

%lib_console% debug_output :enhance_path_recursive "Env Var - add_path=%add_path%"
%lib_console% debug_output :enhance_path_recursive "Env Var - add_path=%add_to_path%"
%lib_console% debug_output :enhance_path_recursive "Env Var - position=%position%"
%lib_console% debug_output :enhance_path_recursive "Env Var - depth=%depth%"
%lib_console% debug_output :enhance_path_recursive "Env Var - max_depth=%max_depth%"

if %max_depth% gtr %depth% (
%lib_console% debug_output :enhance_path_recursive "Adding parent directory - '%add_path%'"
call :enhance_path "%add_path%" %position%
if "%add_to_path%" neq "" (
%lib_console% debug_output :enhance_path_recursive "Adding parent directory - '%add_to_path%'"
call :enhance_path "%add_to_path%" %position%
)
call :set_depth
call :loop_depth
)

set "PATH=%PATH%"

exit /b

: set_depth
set /a "depth=%depth%+1"
exit /b

:loop_depth
if %depth% == %max_depth% (
exit /b
)

for /d %%i in ("%add_path%\*") do (
%lib_console% debug_output :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%lib_console% debug_output :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %max_depth% %position%
call :enhance_path_recursive "%%~fi" %depth% %max_depth% %position%
%lib_console% debug_output :enhance_path_recursive "Env Var AFTER- depth=%depth%"
)
exit /b
Expand Down