219 lines
5.7 KiB
Batchfile
219 lines
5.7 KiB
Batchfile
@echo off
|
|
|
|
rem *** Usage ***
|
|
rem call 'GitShowBranch /i' for prompt initialization
|
|
rem you may change ConEmuGitPath variable, if git.exe/git.cmd is not in your %PATH%
|
|
|
|
rem Predefined dir where git binaries are stored
|
|
|
|
rem ConEmuGitPath must contain quoted path, if it has spaces for instance
|
|
|
|
if NOT DEFINED ConEmuGitPath (
|
|
rem set ConEmuGitPath=git
|
|
set ConEmuGitPath="%~d0\GitSDK\cmd\git.exe"
|
|
)
|
|
if NOT exist "%ConEmuGitPath%" (
|
|
set ConEmuGitPath=git
|
|
)
|
|
|
|
if /I "%~1" == "/i" (
|
|
if exist "%~dp0ConEmuC.exe" (
|
|
call "%~dp0ConEmuC.exe" /IsConEmu
|
|
if errorlevel 2 goto no_conemu
|
|
) else if exist "%~dp0ConEmuC64.exe" (
|
|
call "%~dp0ConEmuC64.exe" /IsConEmu
|
|
if errorlevel 2 goto no_conemu
|
|
)
|
|
call "%ConEmuGitPath%" --version
|
|
if errorlevel 1 (
|
|
call cecho "GIT not found, change your ConEmuGitPath environment variable"
|
|
goto :EOF
|
|
)
|
|
if defined ConEmuPrompt1 (
|
|
PROMPT %ConEmuPrompt1%$E]9;7;"cmd -cur_console:R /c%~nx0"$e\$E]9;8;"gitbranch"$e\%ConEmuPrompt2%%ConEmuPrompt3%
|
|
) else (
|
|
PROMPT $P$E]9;7;"cmd -cur_console:R /c%~nx0"$e\$E]9;8;"gitbranch"$e\$g
|
|
)
|
|
goto :EOF
|
|
) else if /I "%~1" == "/u" (
|
|
if defined ConEmuPrompt1 (
|
|
PROMPT %ConEmuPrompt1%%ConEmuPrompt2%%ConEmuPrompt3%
|
|
) else (
|
|
PROMPT $P$G
|
|
)
|
|
goto :EOF
|
|
)
|
|
|
|
if /I "%~1" == "/?" goto help
|
|
if /I "%~1" == "-?" goto help
|
|
if /I "%~1" == "-h" goto help
|
|
if /I "%~1" == "--help" goto help
|
|
|
|
|
|
goto run
|
|
|
|
|
|
:help
|
|
setlocal
|
|
call "%~dp0SetEscChar.cmd"
|
|
if "%ConEmuANSI%"=="ON" (
|
|
set white=%ESC%[1;37;40m
|
|
set red=%ESC%[1;31;40m
|
|
set normal=%ESC%[0m
|
|
) else (
|
|
set white=
|
|
set red=
|
|
set normal=
|
|
)
|
|
echo %white%%~nx0 description%normal%
|
|
echo You may see your current git branch in %white%cmd prompt%normal%
|
|
echo Just run `%red%%~nx0 /i%normal%` to setup it in the current cmd instance
|
|
echo And you will see smth like `%white%T:\ConEmu [daily +0 ~7 -0]^>%normal%`
|
|
echo If you see double `%red%^>^>%normal%` unset your `%white%FARHOME%normal%` env.variable
|
|
echo You may use it in %white%Far Manager%normal%,
|
|
echo set your Far %white%prompt%normal% to `%red%$p%%gitbranch%%%normal%` and call `%red%%~nx0%normal%`
|
|
echo after each command which can change your working directory state
|
|
echo Example: "%~dp0Addons\git.cmd"
|
|
goto :EOF
|
|
|
|
|
|
|
|
:inc_add
|
|
set /A gitbranch_add=%gitbranch_add%+1
|
|
goto :EOF
|
|
:inc_chg
|
|
set /A gitbranch_chg=%gitbranch_chg%+1
|
|
goto :EOF
|
|
:inc_del
|
|
set /A gitbranch_del=%gitbranch_del%+1
|
|
goto :EOF
|
|
|
|
:eval
|
|
rem Calculate changes count
|
|
if "%gitbranch_ln%" == "##" (
|
|
rem save first line, this must be branch
|
|
) else if "%gitbranch_ln:~0,2%" == "??" (
|
|
call :inc_add
|
|
) else if "%gitbranch_ln:~0,1%" == "A" (
|
|
call :inc_add
|
|
) else if "%gitbranch_ln:~0,1%" == "D" (
|
|
call :inc_del
|
|
) else if "%gitbranch_ln:~0,1%" == "M" (
|
|
call :inc_chg
|
|
)
|
|
goto :EOF
|
|
|
|
:calc
|
|
rem Ensure that gitbranch_ln has no line returns
|
|
set "gitbranch_ln=%~1"
|
|
call :eval
|
|
goto :EOF
|
|
|
|
:drop_ext
|
|
for /F "delims=." %%l in ("%gitbranch%") do set "gitbranch=%%l"
|
|
goto :EOF
|
|
|
|
:no_conemu
|
|
rem GitShowBranch works in ConEmu only
|
|
rem Also gitbranch can't be modified
|
|
rem because export will not be working
|
|
exit /b 0
|
|
goto :EOF
|
|
|
|
:run
|
|
|
|
if exist "%~dp0ConEmuC.exe" (
|
|
call "%~dp0ConEmuC.exe" /IsConEmu
|
|
if errorlevel 2 goto no_conemu
|
|
) else if exist "%~dp0ConEmuC64.exe" (
|
|
call "%~dp0ConEmuC64.exe" /IsConEmu
|
|
if errorlevel 2 goto no_conemu
|
|
)
|
|
|
|
|
|
rem let gitlogpath be folder to store git output
|
|
if "%TEMP:~-1%" == "\" (set "gitlogpath=%TEMP:~0,-1%") else (set "gitlogpath=%TEMP%")
|
|
set git_out=%gitlogpath%\conemu_git_%ConEmuServerPID%_1.log
|
|
set git_err=%gitlogpath%\conemu_git_%ConEmuServerPID%_2.log
|
|
|
|
|
|
rem Just to ensure that non-oem characters will not litter the prompt
|
|
set "ConEmu_SaveLang=%LANG%"
|
|
set LANG=en_US
|
|
|
|
rem Due to a bug(?) of cmd.exe we can't quote ConEmuGitPath variable
|
|
rem otherwise if it contains only unquoted "git" and matches "git.cmd" for example
|
|
rem the "%~dp0" macros in that cmd will return a crap.
|
|
|
|
call %ConEmuGitPath% -c color.status=false status --short --branch --porcelain 1>"%git_out%" 2>"%git_err%"
|
|
if errorlevel 1 (
|
|
set "LANG=%ConEmu_SaveLang%"
|
|
set ConEmu_SaveLang=
|
|
del "%git_out%">nul
|
|
del "%git_err%">nul
|
|
set gitbranch=
|
|
goto prepare
|
|
)
|
|
set "LANG=%ConEmu_SaveLang%"
|
|
set ConEmu_SaveLang=
|
|
|
|
rem Firstly check if it is not a git repository
|
|
rem Set "gitbranch" to full contents of %git_err% file
|
|
set /P gitbranch=<"%git_err%"
|
|
rem But we need only first line of it
|
|
set "gitbranch=%gitbranch%"
|
|
if NOT DEFINED gitbranch goto skip_not_a_git
|
|
if /I "%gitbranch:~0,16%" == "fatal: not a git" (
|
|
rem echo Not a .git repository
|
|
del "%git_out%">nul
|
|
del "%git_err%">nul
|
|
set gitbranch=
|
|
goto prepare
|
|
)
|
|
:skip_not_a_git
|
|
|
|
set gitbranch_add=0
|
|
set gitbranch_chg=0
|
|
set gitbranch_del=0
|
|
|
|
rem Set "gitbranch" to full contents of %git_out% file
|
|
set /P gitbranch=<"%git_out%"
|
|
rem But we need only first line of it
|
|
set "gitbranch=%gitbranch%"
|
|
rem To ensure that %git_out% does not contain brackets
|
|
pushd %gitlogpath%
|
|
for /F %%l in (conemu_git_%ConEmuServerPID%_1.log) do call :calc "%%l"
|
|
popd
|
|
rem echo done ':calc', br='%gitbranch%', ad='%gitbranch_add%', ch='%gitbranch_chg%', dl='%gitbranch_del%'
|
|
|
|
call %ConEmuGitPath% rev-parse --abbrev-ref HEAD 1>"%git_out%" 2>"%git_err%"
|
|
if errorlevel 1 (
|
|
set gitbranch=
|
|
) else (
|
|
set /P gitbranch=<"%git_out%"
|
|
)
|
|
|
|
del "%git_out%">nul
|
|
del "%git_err%">nul
|
|
|
|
if NOT DEFINED gitbranch (
|
|
set "gitbranch=-unknown-"
|
|
) else if "%gitbranch%" == "" (
|
|
set "gitbranch=-unknown-"
|
|
)
|
|
|
|
rem Are there changes? Or we need to display branch name only?
|
|
if "%gitbranch_add% %gitbranch_chg% %gitbranch_del%" == "0 0 0" (
|
|
set "gitbranch= [%gitbranch%]"
|
|
) else (
|
|
set "gitbranch= [%gitbranch% +%gitbranch_add% ~%gitbranch_chg% -%gitbranch_del%]"
|
|
)
|
|
rem echo "%gitbranch%"
|
|
|
|
:prepare
|
|
if NOT "%FARHOME%" == "" set gitbranch=%gitbranch%^>
|
|
|
|
:export
|
|
rem Export to parent Far Manager or cmd.exe processes
|
|
"%ConEmuBaseDir%\ConEmuC.exe" /silent /export=CON gitbranch
|