mirror of
https://github.com/cexll/myclaude.git
synced 2026-02-05 02:30:26 +08:00
fix: prevent duplicate PATH entries on reinstall (#95)
- install.sh: Auto-detect shell and add PATH with idempotency check - install.bat: Improve PATH detection with system PATH check - Fix PATH variable quoting in pattern matching Generated with SWE-Agent.ai Co-Authored-By: SWE-Agent.ai <noreply@swe-agent.ai>
This commit is contained in:
79
install.bat
79
install.bat
@@ -46,17 +46,23 @@ echo.
|
|||||||
echo codeagent-wrapper installed successfully at:
|
echo codeagent-wrapper installed successfully at:
|
||||||
echo %DEST%
|
echo %DEST%
|
||||||
|
|
||||||
rem Automatically ensure %USERPROFILE%\bin is in the USER (HKCU) PATH
|
rem Ensure %USERPROFILE%\bin is in PATH without duplicating entries
|
||||||
rem 1) Read current user PATH from registry (REG_SZ or REG_EXPAND_SZ)
|
rem 1) Read current user PATH from registry (REG_SZ or REG_EXPAND_SZ)
|
||||||
set "USER_PATH_RAW="
|
set "USER_PATH_RAW="
|
||||||
set "USER_PATH_TYPE="
|
|
||||||
for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr /I /R "^ *Path *REG_"') do (
|
for /f "tokens=1,2,*" %%A in ('reg query "HKCU\Environment" /v Path 2^>nul ^| findstr /I /R "^ *Path *REG_"') do (
|
||||||
set "USER_PATH_TYPE=%%B"
|
|
||||||
set "USER_PATH_RAW=%%C"
|
set "USER_PATH_RAW=%%C"
|
||||||
)
|
)
|
||||||
rem Trim leading spaces from USER_PATH_RAW
|
rem Trim leading spaces from USER_PATH_RAW
|
||||||
for /f "tokens=* delims= " %%D in ("!USER_PATH_RAW!") do set "USER_PATH_RAW=%%D"
|
for /f "tokens=* delims= " %%D in ("!USER_PATH_RAW!") do set "USER_PATH_RAW=%%D"
|
||||||
|
|
||||||
|
rem 2) Read current system PATH from registry (REG_SZ or REG_EXPAND_SZ)
|
||||||
|
set "SYS_PATH_RAW="
|
||||||
|
for /f "tokens=1,2,*" %%A in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v Path 2^>nul ^| findstr /I /R "^ *Path *REG_"') do (
|
||||||
|
set "SYS_PATH_RAW=%%C"
|
||||||
|
)
|
||||||
|
rem Trim leading spaces from SYS_PATH_RAW
|
||||||
|
for /f "tokens=* delims= " %%D in ("!SYS_PATH_RAW!") do set "SYS_PATH_RAW=%%D"
|
||||||
|
|
||||||
rem Normalize DEST_DIR by removing a trailing backslash if present
|
rem Normalize DEST_DIR by removing a trailing backslash if present
|
||||||
if "!DEST_DIR:~-1!"=="\" set "DEST_DIR=!DEST_DIR:~0,-1!"
|
if "!DEST_DIR:~-1!"=="\" set "DEST_DIR=!DEST_DIR:~0,-1!"
|
||||||
|
|
||||||
@@ -67,42 +73,63 @@ set "SEARCH_EXP2=;!DEST_DIR!\;"
|
|||||||
set "SEARCH_LIT=;!PCT!USERPROFILE!PCT!\bin;"
|
set "SEARCH_LIT=;!PCT!USERPROFILE!PCT!\bin;"
|
||||||
set "SEARCH_LIT2=;!PCT!USERPROFILE!PCT!\bin\;"
|
set "SEARCH_LIT2=;!PCT!USERPROFILE!PCT!\bin\;"
|
||||||
|
|
||||||
rem Prepare user PATH variants for containment tests
|
rem Prepare PATH variants for containment tests (strip quotes to avoid false negatives)
|
||||||
set "CHECK_RAW=;!USER_PATH_RAW!;"
|
set "USER_PATH_RAW_CLEAN=!USER_PATH_RAW:"=!"
|
||||||
set "USER_PATH_EXP=!USER_PATH_RAW!"
|
set "SYS_PATH_RAW_CLEAN=!SYS_PATH_RAW:"=!"
|
||||||
if defined USER_PATH_EXP call set "USER_PATH_EXP=%%USER_PATH_EXP%%"
|
|
||||||
set "CHECK_EXP=;!USER_PATH_EXP!;"
|
|
||||||
|
|
||||||
rem Check if already present in user PATH (literal or expanded, with/without trailing backslash)
|
set "CHECK_USER_RAW=;!USER_PATH_RAW_CLEAN!;"
|
||||||
|
set "USER_PATH_EXP=!USER_PATH_RAW_CLEAN!"
|
||||||
|
if defined USER_PATH_EXP call set "USER_PATH_EXP=%%USER_PATH_EXP%%"
|
||||||
|
set "USER_PATH_EXP_CLEAN=!USER_PATH_EXP:"=!"
|
||||||
|
set "CHECK_USER_EXP=;!USER_PATH_EXP_CLEAN!;"
|
||||||
|
|
||||||
|
set "CHECK_SYS_RAW=;!SYS_PATH_RAW_CLEAN!;"
|
||||||
|
set "SYS_PATH_EXP=!SYS_PATH_RAW_CLEAN!"
|
||||||
|
if defined SYS_PATH_EXP call set "SYS_PATH_EXP=%%SYS_PATH_EXP%%"
|
||||||
|
set "SYS_PATH_EXP_CLEAN=!SYS_PATH_EXP:"=!"
|
||||||
|
set "CHECK_SYS_EXP=;!SYS_PATH_EXP_CLEAN!;"
|
||||||
|
|
||||||
|
rem Check if already present (literal or expanded, with/without trailing backslash)
|
||||||
set "ALREADY_IN_USERPATH=0"
|
set "ALREADY_IN_USERPATH=0"
|
||||||
echo !CHECK_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_USERPATH=1"
|
echo(!CHECK_USER_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_USERPATH=1"
|
||||||
if "!ALREADY_IN_USERPATH!"=="0" (
|
if "!ALREADY_IN_USERPATH!"=="0" (
|
||||||
echo !CHECK_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_USERPATH=1"
|
echo(!CHECK_USER_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_USERPATH=1"
|
||||||
|
)
|
||||||
|
|
||||||
|
set "ALREADY_IN_SYSPATH=0"
|
||||||
|
echo(!CHECK_SYS_RAW! | findstr /I /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul && set "ALREADY_IN_SYSPATH=1"
|
||||||
|
if "!ALREADY_IN_SYSPATH!"=="0" (
|
||||||
|
echo(!CHECK_SYS_EXP! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" >nul && set "ALREADY_IN_SYSPATH=1"
|
||||||
)
|
)
|
||||||
|
|
||||||
if "!ALREADY_IN_USERPATH!"=="1" (
|
if "!ALREADY_IN_USERPATH!"=="1" (
|
||||||
echo User PATH already includes %%USERPROFILE%%\bin.
|
echo User PATH already includes %%USERPROFILE%%\bin.
|
||||||
) else (
|
) else (
|
||||||
rem Not present: append to user PATH using setx without duplicating system PATH
|
if "!ALREADY_IN_SYSPATH!"=="1" (
|
||||||
if defined USER_PATH_RAW (
|
echo System PATH already includes %%USERPROFILE%%\bin; skipping user PATH update.
|
||||||
set "USER_PATH_NEW=!USER_PATH_RAW!"
|
|
||||||
if not "!USER_PATH_NEW:~-1!"==";" set "USER_PATH_NEW=!USER_PATH_NEW!;"
|
|
||||||
set "USER_PATH_NEW=!USER_PATH_NEW!!PCT!USERPROFILE!PCT!\bin"
|
|
||||||
) else (
|
) else (
|
||||||
set "USER_PATH_NEW=!PCT!USERPROFILE!PCT!\bin"
|
rem Not present: append to user PATH
|
||||||
)
|
if defined USER_PATH_RAW (
|
||||||
rem Persist update to HKCU\Environment\Path (user scope)
|
set "USER_PATH_NEW=!USER_PATH_RAW!"
|
||||||
setx PATH "!USER_PATH_NEW!" >nul
|
if not "!USER_PATH_NEW:~-1!"==";" set "USER_PATH_NEW=!USER_PATH_NEW!;"
|
||||||
if errorlevel 1 (
|
set "USER_PATH_NEW=!USER_PATH_NEW!!PCT!USERPROFILE!PCT!\bin"
|
||||||
echo WARNING: Failed to append %%USERPROFILE%%\bin to your user PATH.
|
) else (
|
||||||
) else (
|
set "USER_PATH_NEW=!PCT!USERPROFILE!PCT!\bin"
|
||||||
echo Added %%USERPROFILE%%\bin to your user PATH.
|
)
|
||||||
|
rem Persist update to HKCU\Environment\Path (user scope)
|
||||||
|
setx Path "!USER_PATH_NEW!" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo WARNING: Failed to append %%USERPROFILE%%\bin to your user PATH.
|
||||||
|
) else (
|
||||||
|
echo Added %%USERPROFILE%%\bin to your user PATH.
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
rem Update current session PATH so codex-wrapper is immediately available
|
rem Update current session PATH so codeagent-wrapper is immediately available
|
||||||
set "CURPATH=;%PATH%;"
|
set "CURPATH=;%PATH%;"
|
||||||
echo !CURPATH! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul
|
set "CURPATH_CLEAN=!CURPATH:"=!"
|
||||||
|
echo(!CURPATH_CLEAN! | findstr /I /C:"!SEARCH_EXP!" /C:"!SEARCH_EXP2!" /C:"!SEARCH_LIT!" /C:"!SEARCH_LIT2!" >nul
|
||||||
if errorlevel 1 set "PATH=!DEST_DIR!;!PATH!"
|
if errorlevel 1 set "PATH=!DEST_DIR!;!PATH!"
|
||||||
|
|
||||||
goto :cleanup
|
goto :cleanup
|
||||||
|
|||||||
25
install.sh
25
install.sh
@@ -48,11 +48,28 @@ else
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ":$PATH:" != *":${BIN_DIR}:"* ]]; then
|
# Auto-add to shell config files with idempotency
|
||||||
|
if [[ ":${PATH}:" != *":${BIN_DIR}:"* ]]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "WARNING: ${BIN_DIR} is not in your PATH"
|
echo "WARNING: ${BIN_DIR} is not in your PATH"
|
||||||
echo "Add this line to your ~/.bashrc or ~/.zshrc (then restart your shell):"
|
|
||||||
echo ""
|
# Detect shell config file
|
||||||
echo " export PATH=\"${BIN_DIR}:\$PATH\""
|
if [ -n "$ZSH_VERSION" ]; then
|
||||||
|
RC_FILE="$HOME/.zshrc"
|
||||||
|
else
|
||||||
|
RC_FILE="$HOME/.bashrc"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Idempotent add: check if complete export statement already exists
|
||||||
|
EXPORT_LINE="export PATH=\"${BIN_DIR}:\$PATH\""
|
||||||
|
if [ -f "$RC_FILE" ] && grep -qF "${EXPORT_LINE}" "$RC_FILE" 2>/dev/null; then
|
||||||
|
echo " ${BIN_DIR} already in ${RC_FILE}, skipping."
|
||||||
|
else
|
||||||
|
echo " Adding to ${RC_FILE}..."
|
||||||
|
echo "" >> "$RC_FILE"
|
||||||
|
echo "# Added by myclaude installer" >> "$RC_FILE"
|
||||||
|
echo "export PATH=\"${BIN_DIR}:\$PATH\"" >> "$RC_FILE"
|
||||||
|
echo " Done. Run 'source ${RC_FILE}' or restart shell."
|
||||||
|
fi
|
||||||
echo ""
|
echo ""
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user