Compare commits

...

135 Commits

Author SHA1 Message Date
copilot-swe-agent[bot]
a1def7195e Restore posh-git support for all versions in Import-Git
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:24:18 +00:00
copilot-swe-agent[bot]
456ddcc59e Improve version comparison using dot-notation segment comparison
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:11:36 +00:00
copilot-swe-agent[bot]
f6adae5fb2 Fix version comparison to handle Git version strings correctly
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 21:00:30 +00:00
copilot-swe-agent[bot]
c039d977c2 Skip mingw64 check on 32-bit systems for better performance
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 20:52:58 +00:00
David Refoua
60045d8c4f simplification 2025-11-08 23:52:45 +03:30
David Refoua
9b64482f37 add the same message from lib_git.cmd in PS1 script 2025-11-08 23:50:52 +03:30
copilot-swe-agent[bot]
bc970e7f78 Add end-of-line anchor and explanatory comment to Get-GitStatusSetting regex
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 19:00:56 +00:00
copilot-swe-agent[bot]
7df73096d6 Fix regex to match whole lines only in Get-GitStatusSetting
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 18:38:59 +00:00
copilot-swe-agent[bot]
96842bf09e Refactor Cmder.ps1 with PowerShell naming conventions and optimizations
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 17:29:08 +00:00
copilot-swe-agent[bot]
ca068f5696 Initial plan 2025-11-08 17:22:50 +00:00
David Refoua
a0d085f93e fix line endings 2025-11-08 20:48:07 +03:30
David Refoua
538662ce56 improve documentation 2025-11-08 17:39:50 +03:30
David Refoua
f9d402d447 Add OSC 133 shell integration sequences for Windows Terminal PowerShell support 2025-11-08 17:25:43 +03:30
copilot-swe-agent[bot]
88ca59f82e Add OSC 133 shell integration sequences for Windows Terminal PowerShell support
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-08 13:42:07 +00:00
copilot-swe-agent[bot]
d7fd2244cf Initial plan 2025-11-08 13:35:59 +00:00
David Refoua
667820105e Merge pull request #3021 from chrisant996/fix_3020_hg_prompt_is_slow
Fix cmderdev/cmder#3020; hg prompt is slow.
2025-11-07 20:22:25 +03:30
David Refoua
6b26f5b9b4 Update vendored windows-terminal 2025-11-07 19:39:19 +03:30
David Refoua
d37d173702 Fix comment formatting in profile.ps1 2025-11-07 19:23:30 +03:30
David Refoua
1f70cfa508 Merge pull request #3026 from cmderdev/copilot/fix-3025
Add OSC 9;9 support for PowerShell prompt to enable Windows Terminal directory tracking
2025-11-07 18:38:43 +03:30
DRSDavidSoft
641a3b55fc ⬆️ Update dependencies (windows-terminal v1.23.12811.0) 2025-11-07 15:06:06 +00:00
David Refoua
89ec06b387 Merge pull request #3003 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2025-11-07 18:31:11 +03:30
DRSDavidSoft
b20f084fbc ⬆️ Update dependencies (git-for-windows v2.51.2.windows.1, clink v1.8.8, clink-completions v0.6.6) 2025-11-07 14:59:14 +00:00
David Refoua
8ab1f11fa4 Merge pull request #3039 from cmderdev/copilot/exclude-rc-versions-update-script
Add pre-release/RC version filtering to update.ps1
2025-11-07 18:25:54 +03:30
copilot-swe-agent[bot]
73739407b1 Simplify conditional logic for better readability
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-07 14:40:21 +00:00
copilot-swe-agent[bot]
aa6b28a2b0 Refactor: Extract pre-release check to helper function
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-07 14:38:56 +00:00
copilot-swe-agent[bot]
d01ab39181 Fix pre-release filtering for archive downloads
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-07 14:36:57 +00:00
copilot-swe-agent[bot]
a513d08ab8 Add pre-release/RC version filtering to update.ps1
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-11-07 14:35:44 +00:00
copilot-swe-agent[bot]
fb01ee7bb9 Initial plan 2025-11-07 14:23:28 +00:00
Mihai Botezatu
0cbe1e8d8c Wrap git_locale in quotes
Without quoting, the lookup would fail for some characters
2025-11-07 01:03:40 +01:00
David Refoua
614f314e41 Merge pull request #3033 from leo-liar (Update lib_path.cmd) 2025-11-06 18:49:40 +03:30
David Refoua
6f6c21dcae add missing prefix 2025-11-06 18:23:10 +03:30
leo-liar
9653adc5f9 Update lib_path.cmd
Fixed missing variable in temp file name
2025-11-06 15:50:52 +01:00
David Refoua
f6bc623284 fix line endings 2025-11-06 18:13:33 +03:30
David Refoua
006567cdbc fix inconsistencies 2025-11-06 18:07:13 +03:30
David Refoua
75d6973ccf Merge pull request #3029 from cmderdev/dependabot/github_actions/github/codeql-action-4
Bump github/codeql-action from 3 to 4
2025-11-06 17:35:10 +03:30
David Refoua
1bcba81bec Merge pull request #3032 from cmderdev/dependabot/github_actions/actions/upload-artifact-5
Bump actions/upload-artifact from 4 to 5
2025-11-06 17:34:32 +03:30
David Refoua
e7f102bdee avoid temp filename collisions 2025-11-06 17:09:40 +03:30
David Refoua
a7c0e0642d implement fix suggested in https://github.com/cmderdev/cmder/issues/2990#issuecomment-3496143288 2025-11-06 16:59:58 +03:30
dependabot[bot]
1940e97ddc Bump actions/upload-artifact from 4 to 5
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-27 15:37:27 +00:00
dependabot[bot]
066203dbdc Bump github/codeql-action from 3 to 4
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v3...v4)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-13 15:33:31 +00:00
copilot-swe-agent[bot]
545331a336 Update README with Windows Terminal directory tracking feature documentation
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-09-16 10:53:33 +00:00
copilot-swe-agent[bot]
08ce81609a Add OSC 9;9 support for PowerShell prompt to enable Windows Terminal directory tracking
Co-authored-by: DRSDavidSoft <4673812+DRSDavidSoft@users.noreply.github.com>
2025-09-16 10:52:13 +00:00
copilot-swe-agent[bot]
218400a4b8 Initial plan 2025-09-16 10:47:03 +00:00
Chris Antos
173b86fbc8 Fix another pre-existing bug in the hg prompt.
If the hg program is not found, then there used to be a Lua script
error.  I fixed that in the earlier commit in this PR.  But the fix
was incomplete, and the hg prompt still appended " ()" instead of
not appending anything (which is how the svn prompt behaves when
the svn program is not found).
2025-09-14 10:34:23 -07:00
Chris Antos
8ec4789e35 Fix cmderdev/cmder#3020; hg prompt is slow.
Cmder's hg prompt didn't use async prompt filtering yet.
Cmder's svn prompt only used async prompt filtering if a special config
variable was set (the commit which contributed it seems to have
misunderstood the git config settings for the git async prompt).

This commit makes the following changes:
1.  Adds async prompt filtering for hg.
2.  Makes async prompt filtering for svn the default.
3.  Removes the prompt_overrideSvnStatusOptIn variable.
4.  Fixes a bug where any errors during `svn status` in the svn prompt
    accidentally show up in the terminal.
5.  Fixes a bug where any errors during `hg branch` in the hg prompt
    turn into Lua errors.
6.  Simplifies the code for colors in the hg and svn prompts.
7.  Clean up the svn prompt code and make it consistent with the git
    and hg prompt code.
2025-09-04 10:41:08 -07:00
David Refoua
43ab19a74d Bump actions/checkout from 4 to 5 2025-08-12 05:55:35 +03:30
dependabot[bot]
c7116bd533 Bump actions/checkout from 4 to 5
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-08-11 19:56:14 +00:00
David Refoua
05552dc51c added a comment 2025-07-16 04:18:03 +03:30
David Refoua
c6bfd6f276 Minor refactors to Git status and branch functions in git-prompt.sh
- `getGitStatusSetting`: use local variables, improve regex pattern, use return status codes instead of echo strings
- `getSimpleGitBranch`: better error handling, use local variables
- Simplified conditional checks
2025-07-16 04:16:47 +03:30
David Refoua
1d51c4f402 make bash prompt more consistent;
* display λ in grey and bold
* fix a bug where an uneeded colon would be prepended to the tab title (when MSYSTEM is unset)
2025-07-15 21:02:12 +03:30
David Refoua
aff4ad259f fix color values and names mismatch in comments 2025-07-15 20:25:59 +03:30
David Refoua
cb76868411 Import from upstream git-prompt.sh: user-specific bash completion scripts
Source: 061dbfe92b
2025-07-15 19:29:16 +03:30
David Refoua
abcb1a1aa1 display MSYSTEM if set; fix indentation; add comment 2025-07-15 19:26:49 +03:30
David Refoua
93785426a6 Bump peter-evans/create-pull-request from 6 to 7
Hopefully, there won't be breaking changes
2025-04-08 13:34:23 +03:30
David Refoua
00763846a2 Updates to 3 vendored dependencies 2025-04-08 12:47:31 +03:30
DRSDavidSoft
1737bcdeb7 ⬆️ Update dependencies (git-for-windows v2.49.0.windows.1, clink v1.7.14, clink-completions v0.6.2) 2025-04-03 13:43:06 +00:00
David Refoua
126347025f cleanup 2024-11-14 00:01:29 +03:30
David Refoua
7ceacb63dd respect PATHEXT instead of hardcoding our own value
* support other path extensions as well (e.g. `.py` commonly used)
2024-11-14 00:00:53 +03:30
David Refoua
510178852d add missing qualified dir
https://github.com/cmderdev/cmder/pull/1961
2024-11-13 23:58:11 +03:30
David Refoua
4d15730d05 cleanup 2024-11-13 23:14:49 +03:30
David Refoua
25ccfeed77 prevent warnings if the dir does not exist
https://github.com/cmderdev/cmder/issues/121#issuecomment-654171568
2024-11-13 23:08:13 +03:30
David Refoua
42315d8cec enable /d flag in excd by default 2024-10-18 03:18:17 +03:30
David Refoua
c6dbb89129 Merge branch 'master' of https://github.com/cmderdev/cmder 2024-10-17 20:00:32 +03:30
David Refoua
1cfba25beb fix conflict 2024-10-17 20:00:21 +03:30
David Refoua
2007baef6e Updates to 3 vendored dependencies 2024-10-17 19:52:36 +03:30
David Refoua
e220d114b2 add notes on what shim actually is 2024-10-17 19:43:14 +03:30
DRSDavidSoft
4204faa063 ⬆️ Update dependencies (git-for-windows v2.47.0.windows.1, clink v1.7.3, clink-completions v0.6.0) 2024-10-16 13:42:04 +00:00
David Refoua
540532f126 make library comments consistent and clean up code 2024-10-14 14:40:21 +03:30
dependabot[bot]
41195ad8dd Bump peter-evans/create-pull-request from 6 to 7
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 7.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6...v7)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 15:58:11 +00:00
David Refoua
28f6098d48 Merge pull request #2959 from stanwest/cmd-double-quotes
In "lib_git.cmd", use single quotes inside double quotes
2024-07-27 21:04:15 +03:30
Stan West
b56a6d43cb Use single quotes inside double quotes 2024-07-26 20:24:12 -04:00
David Refoua
d2f7136ef8 modify the header to remove outdated mention 2024-06-06 13:34:55 +03:30
David Refoua
4daff054eb Fix #2944 2024-05-31 18:36:31 +03:30
DRSDavidSoft
45fd0c2666 ⬆️ Update dependencies (git-for-windows v2.45.1.windows.1, clink v1.6.14, clink-completions v0.5.2) 2024-05-29 13:40:37 +00:00
David Refoua
5145a15139 display git improper version string as debug 2024-05-28 17:19:47 +03:30
David Refoua
92419a48fc log the executable path for improper git 2024-05-23 21:59:16 +03:30
David Refoua
c9b77f618a enable match.expand_envvars
This is part of the "Enhanced default settings" by Clink and a very useful feature
2024-05-20 10:57:51 +03:30
David Refoua
a2e4884ea1 Merge pull request #2926 from cmderdev/dependabot/github_actions/softprops/action-gh-release-2
Bump softprops/action-gh-release from 1 to 2
2024-04-26 17:09:24 +03:30
Dax T Games
62a46140eb Merge pull request #2932 from loselarry/master
fix: fix some typos in comments
2024-04-10 08:01:16 -04:00
loselarry
ae518cded8 fix: fix some typos in comments
Signed-off-by: loselarry <bikangning@yeah.net>
2024-04-10 16:39:46 +08:00
dependabot[bot]
4ad76d8274 Bump softprops/action-gh-release from 1 to 2
Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 1 to 2.
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v1...v2)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-11 15:59:16 +00:00
dependabot[bot]
8a199bf47b Bump microsoft/setup-msbuild from 1 to 2 (#2917)
Bumps [microsoft/setup-msbuild](https://github.com/microsoft/setup-msbuild) from 1 to 2.
- [Release notes](https://github.com/microsoft/setup-msbuild/releases)
- [Changelog](https://github.com/microsoft/setup-msbuild/blob/main/building-release.md)
- [Commits](https://github.com/microsoft/setup-msbuild/compare/v1...v2)

---
updated-dependencies:
- dependency-name: microsoft/setup-msbuild
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 19:43:29 +00:00
dependabot[bot]
457d99da0b Bump peter-evans/create-pull-request from 5 to 6 (#2918)
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 5 to 6.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v5...v6)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-06 19:43:13 +00:00
dependabot[bot]
52762636dc Bump actions/upload-artifact from 3 to 4 (#2905) 2024-01-03 00:54:57 +00:00
Dax T Games
ed6c9b2bc9 Merge pull request #2907 from daxgames/development_ci
Do CI on development PRs
2024-01-02 14:14:15 -05:00
Dax T. Games
7753622897 Do CI on development PRs 2024-01-02 12:04:31 -05:00
dependabot[bot]
18950135ef Bump github/codeql-action from 2 to 3 (#2906)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 2 to 3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/v2...v3)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-20 10:31:41 +00:00
Dax T Games
b59647b570 Merge pull request #2892 from daxgames/revert_git_update
Revert Git update so not to include a release Candidate
2023-11-11 09:18:48 -08:00
Dax T. Games
2135fce19f revert git update to not include a release candidate 2023-11-11 09:12:30 -08:00
Dax T. Games
219c879582 Merge remote-tracking branch 'upstream/master' 2023-11-10 17:00:16 -08:00
Dax T. Games
289bcf03a5 Merge remote-tracking branch 'upstream/development' 2023-11-10 16:59:35 -08:00
David Refoua
50bc05fee7 Merge pull request #2891 from daxgames/rem_race
Remove Cmder.exe race condition
2023-11-09 17:11:42 +03:30
Dax T. Games
8d916a4446 remove env refresh race condition 2023-11-09 04:58:26 -08:00
daxgames
5e22496aca Merge branch 'master' into development 2023-11-05 18:55:47 +00:00
Dax T Games
8b6add75cf Merge pull request #2882 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-11-05 13:55:36 -05:00
DRSDavidSoft
8498447878 ⬆️ Update dependencies (git-for-windows v2.43.0-rc0.windows.1, clink v1.5.12) 2023-11-03 13:40:42 +00:00
DRSDavidSoft
0874f4be44 Merge branch 'master' into development 2023-10-25 09:02:45 +00:00
David Refoua
ffb93b1804 call init.bat with the same arguments 2023-10-25 12:32:31 +03:30
daxgames
092dc4d323 Merge branch 'master' into development 2023-10-14 18:20:25 +00:00
Dax T Games
39afad1743 Merge pull request #2879 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-10-14 11:20:13 -07:00
DRSDavidSoft
d0cb6b5c23 ⬆️ Update dependencies (clink v1.5.9, clink-completions v0.4.11) 2023-10-10 13:40:41 +00:00
daxgames
9ee2bef7cd Merge branch 'master' into development 2023-09-25 18:41:04 +00:00
Dax T Games
a409a1cce8 Merge pull request #2867 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-09-25 14:40:50 -04:00
Dax T. Games
3b8e87de84 Merge branch 'master' of https://github.com/cmderdev/cmder 2023-09-25 11:45:19 -04:00
DRSDavidSoft
faf66542b4 ⬆️ Update dependencies (git-for-windows v2.42.0.windows.2, clink v1.5.6) 2023-09-22 13:40:52 +00:00
DRSDavidSoft
d3497f5eb0 Merge branch 'master' into development 2023-09-21 17:28:35 +00:00
David Refoua
98a1e9621e Bump actions/checkout from 3 to 4 2023-09-21 20:58:21 +03:30
dependabot[bot]
4f32d23c30 Bump actions/checkout from 3 to 4
Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-09-04 15:47:52 +00:00
Dax T. Games
ad5c80bcd2 Merge remote-tracking branch 'upstream/master' 2023-08-11 09:31:24 -04:00
DRSDavidSoft
9a135947af Merge branch 'master' into development 2023-07-27 21:28:50 +00:00
David Refoua
1b9a1e5b6f improve markdown (SECURITY.md)
use bullet points to render the list correctly; improve sentences
2023-07-28 00:58:39 +03:30
MartiUK
1adaab963b Merge branch 'master' into development 2023-07-27 18:32:18 +00:00
Martin Kemp
29650960aa Create SECURITY.md (#2866) 2023-07-27 19:32:04 +01:00
DRSDavidSoft
41f0454b05 Merge branch 'master' into development 2023-07-25 13:48:37 +00:00
David Refoua
3ea9728ffd Merge pull request #2861 from chrisant996/chrisant_fix_2859
Fix #2859; script error when cwd name contains `%`
2023-07-25 17:18:22 +03:30
DRSDavidSoft
a01fb4c444 Merge branch 'master' into development 2023-07-25 10:17:37 +00:00
David Refoua
4b0344172a ignore github-related and markdown for tests and codeql 2023-07-25 13:47:22 +03:30
MartiUK
4104a5612f Merge branch 'master' into development 2023-07-24 14:04:30 +00:00
Martin Kemp
5e219fe34e Update build.yml 2023-07-24 15:04:16 +01:00
MartiUK
ff7621c1da Merge branch 'master' into development 2023-07-24 13:56:12 +00:00
github-actions[bot]
9be28807cb ⬆️ Update dependencies (conemu-maximus5 v23.07.24) (#2863)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2023-07-24 14:55:59 +01:00
MartiUK
5d4c45d099 Merge branch 'master' into development 2023-07-24 08:30:03 +00:00
MartiUK
f517494dc4 Merge branch 'master' into development 2023-07-20 12:57:05 +00:00
Chris Antos
84ee96c64f Fix #2859; script error when cwd name contains %
The `string.gsub()` function in Lua always uses Lua patterns (which are
similar to regular expressions).  Cmder's custom prompt wants to perform
simple plain text find/replace operations on strings.  `string.gsub()`
is the right Lua function for that, but since it always uses Lua
patterns it's necessary to apply escaping to the input strings otherwise
they can get misinterpreted and cause runtime errors.

For example, if the current working directory name contains a percent
sign, such as literally "My%20Home".

This change fixes that.  It introduces a helper function `gsub_plain()`
which behaves like `string.gsub()` but applies appropriate escaping to
convert the plain text input strings into the corresponding Lua
patterns so that it can achieve plain text find/replace operations.

It also introduces separate helper functions for escaping the `find` and
`replace` parameters for `string.gsub()`, since they have different
escaping rules.
2023-07-10 18:07:53 -07:00
Dax T. Games
ad804eda44 Merge remote-tracking branch 'upstream/master' 2023-07-04 13:01:27 -04:00
DRSDavidSoft
15addb87ee Merge branch 'master' into development 2023-07-04 08:40:45 +00:00
Dax T. Games
47258fbd2b Merge branch 'master' of https://github.com/cmderdev/cmder 2023-06-05 16:01:37 -04:00
DRSDavidSoft
37c41e80df Merge branch 'master' into development 2023-05-23 10:57:06 +00:00
DRSDavidSoft
5a90558714 Merge branch 'master' into development 2023-05-17 08:00:29 +00:00
DRSDavidSoft
c1f8dfdb27 Merge branch 'master' into development 2023-05-16 20:22:11 +00:00
DRSDavidSoft
50c3ea4ab3 Merge branch 'master' into development 2023-05-11 15:07:20 +00:00
DRSDavidSoft
3f53d1b927 Merge branch 'master' into development 2023-04-24 14:05:13 +00:00
DRSDavidSoft
6180aa53b3 Merge branch 'master' into development 2023-04-23 20:17:40 +00:00
Dax T Games
5e3b70338d Merge pull request #12 from daxgames/update-vendor
Updates to `3` vendored dependencies
2023-04-21 16:06:26 -04:00
daxgames
a4ea326a62 ⬆️ Update dependencies (git-for-windows v2.40.0.windows.1, clink v1.4.24, clink-completions v0.4.7) 2023-04-19 13:44:11 +00:00
26 changed files with 707 additions and 382 deletions

View File

@@ -19,7 +19,7 @@ jobs:
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out the repository under $GITHUB_WORKSPACE, so the job can access it
- uses: actions/checkout@v3
- uses: actions/checkout@v5
with:
fetch-depth: 0 # fetch all history for all branches and tags

View File

@@ -11,7 +11,7 @@ on:
tags:
- "v*"
pull_request:
branches: [ "master" ]
branches: [ "master", "development" ]
#---------------------------------#
# environment configuration #
@@ -30,15 +30,17 @@ jobs:
build:
name: Build Project
runs-on: windows-latest
permissions:
contents: write
discussions: write
steps:
- name: Check out repository code (Action from GitHub)
uses: actions/checkout@v3
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
@@ -51,32 +53,32 @@ jobs:
run: .\pack.ps1 -verbose
- name: Upload artifact (cmder.zip)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
path: build/cmder.zip
name: cmder.zip
if-no-files-found: error
- name: Upload artifact (cmder.7z)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
path: build/cmder.7z
name: cmder.7z
- name: Upload artifact (cmder_mini.zip)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
path: build/cmder_mini.zip
name: cmder_mini.zip
- name: Upload artifact (hashes.txt)
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v5
with:
path: build/hashes.txt
name: hashes.txt
- name: Create Release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
with:
files: |
build/cmder.zip

View File

@@ -3,20 +3,25 @@
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ "master" ]
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master" ]
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
schedule:
- cron: '30 19 * * 0'
@@ -40,11 +45,11 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v3
uses: actions/checkout@v5
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v4
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -55,7 +60,7 @@ jobs:
# queries: security-extended,security-and-quality
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v1
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
@@ -63,6 +68,6 @@ jobs:
run: .\build.ps1 -Compile -verbose
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v4
with:
category: "/language:${{matrix.language}}"

View File

@@ -4,9 +4,21 @@ on:
push:
branches:
- master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
branches:
- master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
defaults:
run:
@@ -26,7 +38,7 @@ jobs:
continue-on-error: false
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
- name: Initialize vendors
shell: pwsh
working-directory: scripts

View File

@@ -24,7 +24,7 @@ jobs:
pull-requests: write
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v5
with:
fetch-depth: 0
@@ -51,7 +51,7 @@ jobs:
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- uses: peter-evans/create-pull-request@v5
- uses: peter-evans/create-pull-request@v7
if: env.COUNT_UPDATED > 0
with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'

View File

@@ -352,6 +352,10 @@ Cmder by default comes with a vendored ConEmu installation as the underlying ter
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
⚠ *Note:* Cmder includes built-in support for Windows Terminal directory tracking via OSC 9;9 sequences. This enables "Duplicate Tab" and "Split Pane" features to preserve the current working directory for both `cmd.exe` and PowerShell sessions.
⚠ *Note:* Cmder also includes built-in support for [Windows Terminal shell integration](https://learn.microsoft.com/en-us/windows/terminal/tutorials/shell-integration) via OSC 133 sequences (A, B, C) for PowerShell sessions. This enables features like command navigation (jump between commands), command selection, visual command separators, and improved command history management in Windows Terminal.
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
## Upgrading

24
SECURITY.md Normal file
View File

@@ -0,0 +1,24 @@
# Security Policy
## Supported Versions
| Version | Supported |
| ------- | ------------------ |
| 1.3.x | :white_check_mark: |
| < 1.3 | |
## Reporting a Vulnerability
If you discover a security issue in our project, please report it to [MartiUK](https://github.com/MartiUK). We will acknowledge your email within 24 hours and provide a more detailed response within 48 hours. We will try to fix the issue as soon as possible and inform you when a new version is released.
Please include as much of the information listed below as you can to help us better understand and resolve the issue:
- The nature of the issue
- The affected source file(s) with full paths
- The location of the vulnerable code (tag/branch/commit or direct URL)
- Any special configuration needed to reproduce the issue
- Detailed steps to reproduce the issue
- Proof-of-concept or exploit code (if possible)
- The impact of the issue, including how an attacker could exploit it
Please do not disclose the vulnerability publicly until we have resolved it.

View File

@@ -469,9 +469,6 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK);
return;
}
LRESULT lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL);
lr = SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)L"Environment", SMTO_ABORTIFHUNG | SMTO_NOTIMEOUTIFNOTHUNG, 5000, NULL); // For Windows >= 8
}
bool IsUserOnly(std::wstring opt)

View File

@@ -1,9 +1,8 @@
/**
* WARNING: do NOT modify this file! the content of this file should be
* automatically genereted before AppVeyor builds using the
* respective .ps1 Powershell scripts.
*
* WARNING: This file should NOT be manually modified!
* The contents will be automatically generated using the `.ps1` PowerShell scripts,
* during builds by the CI.
*/
/////////////////////////////////////////////////////////////////////////////

View File

@@ -79,7 +79,7 @@ if ($Compile) {
Write-Verbose "Building the launcher..."
# Referene: https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
# Reference: https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release /m
if ($LastExitCode -ne 0) {

View File

@@ -32,7 +32,11 @@ Param(
# -whatif switch to not actually make changes
# Path to the vendor configuration source file
[string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json"
[string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json",
# Include pre-release versions (RC, beta, alpha, etc.)
# By default, only stable releases are considered
[switch]$IncludePrerelease = $false
)
# Get the root directory of the cmder project.
@@ -79,11 +83,39 @@ function Match-Filenames {
return $position
}
# Checks if a release is a pre-release based on GitHub API flag and version tag keywords
# Pre-release keywords include: -rc (release candidate), -beta, -alpha, -preview, -pre
function Test-IsPrerelease {
param (
[Parameter(Mandatory = $true)]
$release
)
# Check if marked as pre-release by GitHub
if ($release.prerelease -eq $true) {
return $true
}
# Check for common pre-release keywords in tag name
# This catches versions like v2.50.0-rc, v1.0.0-beta, v1.0.0-alpha, etc.
$prereleaseKeywords = @('-rc', '-beta', '-alpha', '-preview', '-pre')
foreach ($keyword in $prereleaseKeywords) {
if ($release.tag_name -ilike "*$keyword*") {
return $true
}
}
return $false
}
# Uses the GitHub api in order to fetch the current download links for the latest releases of the repo.
function Fetch-DownloadUrl {
param (
[Parameter(Mandatory = $true)]
$urlStr
$urlStr,
[Parameter(Mandatory = $false)]
[bool]$includePrerelease = $false
)
$url = [uri] $urlStr
@@ -127,6 +159,13 @@ function Fetch-DownloadUrl {
}
:loop foreach ($i in $info) {
# Skip pre-release versions unless explicitly included
# Pre-releases include RC (Release Candidate), beta, alpha, and other test versions
if (-not $includePrerelease -and (Test-IsPrerelease $i)) {
Write-Verbose "Skipping pre-release version: $($i.tag_name)"
continue
}
if (-not ($i.assets -is [array])) {
continue
}
@@ -164,12 +203,26 @@ function Fetch-DownloadUrl {
# Special case for archive downloads of repository
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive") -and $info[0].tag_name) {
for ($i = 0; $i -lt $p.Length; $i++) {
if ($p[$i].Trim('/') -eq "archive") {
$p[$i + 1] = $info[0].tag_name + ".zip"
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
return $downloadLinks
if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive")) {
# Find the first release that matches our pre-release filtering criteria
$selectedRelease = $null
foreach ($release in $info) {
# Apply the same filtering logic
if (-not $includePrerelease -and (Test-IsPrerelease $release)) {
continue
}
# Use the first release that passes the filter
$selectedRelease = $release
break
}
if ($selectedRelease -and $selectedRelease.tag_name) {
for ($i = 0; $i -lt $p.Length; $i++) {
if ($p[$i].Trim('/') -eq "archive") {
$p[$i + 1] = $selectedRelease.tag_name + ".zip"
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
return $downloadLinks
}
}
}
}
@@ -215,7 +268,7 @@ foreach ($s in $sources) {
Write-Verbose "Old Link: $($s.url)"
$downloadUrl = Fetch-DownloadUrl $s.url
$downloadUrl = Fetch-DownloadUrl $s.url -includePrerelease $IncludePrerelease
if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
Write-Verbose "No new links were found"

View File

@@ -9,5 +9,5 @@ if "%cmder_init%" == "1" (
)
pushd "%CMDER_ROOT%"
call "%CMDER_ROOT%\vendor\init.bat" /f
call "%CMDER_ROOT%\vendor\init.bat" /f %*
popd

14
vendor/bin/excd.cmd vendored
View File

@@ -1,6 +1,8 @@
@if "%~1"=="/?" (@cd %*)
@set excd=%*
@set excd=%excd:"=%
@if "%excd:~0,1%"=="~" (@set excd=%userprofile%\%excd:~1%)
@if not "%~1"=="/d" (@set excd_param="/d") else (@set excd_param=)
@cd %excd_param% "%excd%"
@echo off
set excd=%*
set excd=%excd:"=%
set excd_param=/d
if /i "%excd:~0,2%"=="/d" set "excd=%excd:~2%"
if "%excd:~0,1%"=="~" (set excd=%userprofile%\%excd:~1%)
if "%excd:~0,1%"=="/" (set excd_param=)
cd %excd_param% %excd%

208
vendor/clink.lua vendored
View File

@@ -7,7 +7,7 @@
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
-- luacheck: globals prompt_singleLine prompt_includeVersionControl
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn
-- luacheck: globals prompt_overrideGitStatusOptIn
-- luacheck: globals clink io.popenyield os.isdir settings.get
-- At first, load the original clink.lua file
@@ -51,11 +51,37 @@ local function get_unknown_color()
end
---
-- Makes a string safe to use as the replacement in string.gsub
-- Escapes special characters in a string.gsub `find` parameter, so that it
-- can be matched as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function verbatim(s)
s = string.gsub(s, "%%", "%%%%")
return s
local function escape_gsub_find_arg(text)
return text and text:gsub("([-+*?.%%()%[%]$^])", "%%%1") or ""
end
---
-- Escapes special characters in a string.gsub `replace` parameter, so that it
-- can be replaced as a literal plain text string, i.e. disable Lua pattern
-- matching. See "Patterns" (https://www.lua.org/manual/5.2/manual.html#6.4.1).
-- @param {string} text Text to escape
-- @returns {string} Escaped text
---
local function escape_gsub_replace_arg(text)
return text and text:gsub("%%", "%%%%") or ""
end
---
-- Perform string.sub, but disable Lua pattern matching and just treat both
-- the `find` and `replace` parameters as a literal plain text replacement.
-- @param {string} str Text in which to perform find and replace
-- @param {string} find Text to find (plain text; not a Lua pattern)
-- @param {string} replace Replacement text (plain text; not a Lua pattern)
-- @returns {string} Copy of the input `str` with `find` replaced by `replace`
---
local function gsub_plain(str, find, replace)
return string.gsub(str, escape_gsub_find_arg(find), escape_gsub_replace_arg(replace))
end
-- Extracts only the folder name from the input Path
@@ -153,7 +179,7 @@ local function set_prompt_filter()
end
if prompt_useHomeSymbol and string.find(cwd, clink.get_env("HOME")) then
cwd = string.gsub(cwd, clink.get_env("HOME"), prompt_homeSymbol)
cwd = gsub_plain(cwd, clink.get_env("HOME"), prompt_homeSymbol)
end
local uah = ''
@@ -176,14 +202,14 @@ local function set_prompt_filter()
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
prompt = string.gsub(prompt, "{uah}", uah)
prompt = string.gsub(prompt, "{cwd}", cwd)
prompt = string.gsub(prompt, "{env}", env)
clink.prompt.value = string.gsub(prompt, "{lamb}", prompt_lambSymbol)
prompt = gsub_plain(prompt, "{uah}", uah)
prompt = gsub_plain(prompt, "{cwd}", cwd)
prompt = gsub_plain(prompt, "{env}", env)
clink.prompt.value = gsub_plain(prompt, "{lamb}", prompt_lambSymbol)
end
local function percent_prompt_filter()
clink.prompt.value = string.gsub(clink.prompt.value, "{percent}", "%%")
clink.prompt.value = gsub_plain(clink.prompt.value, "{percent}", "%")
end
---
@@ -324,13 +350,8 @@ end
-- @return {false|mercurial branch information}
---
local function get_hg_branch()
-- Return the branch information. The default is to get just the
-- branch name, but you could e.g. use the "hg-prompt" extension to
-- get more information, such as any applied mq patches. Here's an
-- example of that:
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul"
local file = io.popen(cmd)
-- Return the branch information.
local file = io.popen("hg branch 2>nul")
if not file then
return false
end
@@ -398,12 +419,33 @@ local function get_git_status()
return { status = is_status, conflict = conflict_found }
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
-- The default is to just use the branch name, but you could e.g. use the
-- "hg-prompt" extension to get more information, such as any applied mq
-- patches. Here's an example of that:
-- "hg prompt \"{branch}{status}{|{patch}}{update}\""
local pipe = io_popenyield("hg status -amrd 2>&1")
if not pipe then
return { error = true }
end
local output = pipe:read('*all')
pipe:close()
local dirty = (output ~= nil and output ~= "")
return { clean = not dirty }
end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_svn_status()
local file = io_popenyield("svn status -q")
local file = io_popenyield("svn status -q 2>nul")
if not file then
return { error = true }
end
@@ -494,14 +536,6 @@ local function git_prompt_filter()
return false
end
-- Colors for git status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
conflict = get_conflict_color(),
nostatus = get_unknown_color()
}
local git_dir = get_git_dir()
local color
if git_dir then
@@ -521,27 +555,40 @@ local function git_prompt_filter()
local gitConflict = gitInfo.conflict
if gitStatus == nil then
color = colors.nostatus
color = get_unknown_color()
elseif gitStatus then
color = colors.clean
color = get_clean_color()
else
color = colors.dirty
color = get_dirty_color()
end
if gitConflict then
color = colors.conflict
color = get_conflict_color()
end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", " "..color.."("..verbatim(branch)..")")
local result = " "..color.."("..branch..")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", result)
return false
end
end
-- No git present or not in git file
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", "")
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", "")
return false
end
local function get_hg_info_table()
local info = clink_promptcoroutine(function ()
return get_hg_status() or {}
end)
if not info then
info = cached_info.hg_info or {}
else
cached_info.hg_info = info
end
return info
end
local function hg_prompt_filter()
-- Don't do any hg processing if the prompt doesn't want to show hg info.
@@ -551,39 +598,48 @@ local function hg_prompt_filter()
local hg_dir = get_hg_dir()
if hg_dir then
-- Colors for mercurial status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
nostatus = get_unknown_color()
}
local output = get_hg_branch()
-- strip the trailing newline from the branch name
local n = #output
while n > 0 and output:find("^%s", n) do n = n - 1 end
local branch = output:sub(1, n)
if branch ~= nil and
local branch = get_hg_branch()
if branch and
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
(not string.find(branch, "is not recognized")) then -- 'hg' not in path
local color = colors.clean
local pipe = io.popen("hg status -amrd 2>&1")
if pipe then
output = pipe:read('*all')
pipe:close()
if output ~= nil and output ~= "" then color = colors.dirty end
-- If in a different repo or branch than last time, discard cached info
if cached_info.hg_dir ~= hg_dir or cached_info.hg_branch ~= branch then
cached_info.hg_info = nil
cached_info.hg_dir = hg_dir
cached_info.hg_branch = branch
end
local result = color .. "(" .. branch .. ")"
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result))
local hgInfo = get_hg_info_table()
local color
if not hgInfo or hgInfo.error then
color = get_unknown_color()
elseif hgInfo.clean then
color = get_clean_color()
else
color = get_dirty_color()
end
local result = " "..color.."("..branch..")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", result)
return false
end
end
-- No hg present or not in hg repo
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", "")
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end
local function get_svn_info_table()
local info = clink_promptcoroutine(function ()
return get_svn_status() or {}
end)
if not info then
info = cached_info.svn_info or {}
else
cached_info.svn_info = info
end
return info
end
local function svn_prompt_filter()
@@ -593,13 +649,6 @@ local function svn_prompt_filter()
return false
end
-- Colors for svn status
local colors = {
clean = get_clean_color(),
dirty = get_dirty_color(),
nostatus = get_unknown_color()
}
local svn_dir = get_svn_dir()
if svn_dir then
-- if we're inside of svn repo then try to detect current branch
@@ -611,38 +660,25 @@ local function svn_prompt_filter()
cached_info.svn_dir = svn_dir
cached_info.svn_branch = branch
end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
svnStatus = clink_promptcoroutine(function ()
return get_svn_status()
end)
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
if svnStatus == nil then
svnStatus = cached_info.svn_info
else
cached_info.svn_info = svnStatus
end
else
svnStatus = get_svn_status()
end
local svnInfo = get_svn_info_table()
local color
if not svnStatus or svnStatus.error then
color = colors.nostatus
elseif svnStatus.clean then
color = colors.clean
if not svnInfo or svnInfo.error then
color = get_unknown_color()
elseif svnInfo.clean then
color = get_clean_color()
else
color = colors.dirty
color = get_dirty_color()
end
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", " "..color.."("..verbatim(branch)..")")
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")")
return false
end
end
-- No svn present or not in svn file
clink.prompt.value = string.gsub(clink.prompt.value, "{svn}", "")
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", "")
return false
end

View File

@@ -1,6 +1,10 @@
# For explanation of these and other settings see:
# https://chrisant996.github.io/clink/clink.html
# name: Expand envvars when completing
# type: boolean
match.expand_envvars = True
# name: Sets how command history expansion is applied
# type: enum
# options: off,on,not_squoted,not_dquoted,not_quoted

View File

@@ -38,25 +38,20 @@ prompt_includeVersionControl = true
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideGitStatusOptIn = false
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus svn config settings and run the svn prompt commands in the background.
-- default is false
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes
--
-- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors
-- Effects: https://github.com/cmderdev/cmder/wiki/Customization#list-of-effects
--
-- Green: "\x1b[1;33;49m"
-- Yellow: "\x1b[1;32;49m"
-- Green: "\x1b[1;32;49m"
-- Yellow: "\x1b[1;33;49m"
-- Light Grey: "\x1b[1;30;49m"
-- Prompt Element Colors
uah_color = "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
cwd_color = "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
uah_color = "\x1b[1;33;49m" -- Yellow uah = [user]@[hostname]
cwd_color = "\x1b[1;32;49m" -- Green cwd = Current Working Directory
lamb_color = "\x1b[1;30;49m" -- Light Grey = Lambda Color
clean_color = "\x1b[37;1m"
dirty_color = "\x1b[33;3m" -- Yellow, Italic
conflict_color = "\x1b[31;1m" -- Red, Bold
unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color
unknown_color = "\x1b[37;1m" -- White, Bold = No VCS Status Branch Color

70
vendor/git-prompt.sh vendored
View File

@@ -1,26 +1,35 @@
# Returns 1 if git status for Cmder is disabled, otherwise returns 0
function getGitStatusSetting() {
gitStatusSetting=$(git --no-pager config -l 2>/dev/null)
local gitConfig
if [[ -n ${gitStatusSetting} ]] && [[ ${gitStatusSetting} =~ cmder.status=false ]] || [[ ${gitStatusSetting} =~ cmder.shstatus=false ]]
# Get all git config entries for the current repository without pager
gitConfig=$(git --no-pager config -l 2>/dev/null) || return 0 # treat failure as enabled
# Check if git status for Cmder is disabled
if [[ $gitConfig =~ (^|$'\n')cmder\.status=false($|$'\n') ]] || \
[[ $gitConfig =~ (^|$'\n')cmder\.shstatus=false($|$'\n') ]]
then
echo false
else
echo true
return 1 # disabled
fi
return 0
}
# Prints current branch or detached HEAD short commit hash
function getSimpleGitBranch() {
gitDir=$(git rev-parse --git-dir 2>/dev/null)
if [ -z "$gitDir" ]; then
return 0
fi
local gitDir
gitDir=$(git rev-parse --git-dir 2>/dev/null) || return 0
headContent=$(< "$gitDir/HEAD")
if [[ "$headContent" == "ref: refs/heads/"* ]]
local headFile="$gitDir/HEAD"
[ -f "$headFile" ] || return 0
local headContent
headContent=$(< "$headFile")
if [[ "$headContent" =~ ^ref:\ refs/heads/(.+)$ ]]
then
echo " (${headContent:16})"
echo " (${BASH_REMATCH[1]})"
else
echo " (HEAD detached at ${headContent:0:7})"
echo " (HEAD detached at ${headContent:0:7})"
fi
}
@@ -33,18 +42,18 @@ fi
if test -f ~/.config/git/git-prompt.sh
then
if [[ $(getGitStatusSetting) == true ]]
if getGitStatusSetting
then
. ~/.config/git/git-prompt.sh
fi
else
PS1='\[\033]0;$MSYSTEM:${PWD//[^[:ascii:]]/?}\007\]' # set window title
# PS1="$PS1"'\n' # new line
PS1="$PS1"'\[\033[32m\]' # change to green
# Taken parts from https://github.com/git-for-windows/build-extra/blob/main/git-extra/git-prompt.sh
PS1='\[\033]0;${TITLEPREFIX:+$TITLEPREFIX:}${PWD//[^[:ascii:]]/?}\007\]' # set window title to TITLEPREFIX (if set) and current working directory
# PS1="$PS1"'\n' # new line (disabled)
PS1="$PS1"'\[\033[32m\]' # change to green and bold
PS1="$PS1"'\u@\h ' # user@host<space>
# PS1="$PS1"'\[\033[35m\]' # change to purple
# PS1="$PS1"'$MSYSTEM ' # show MSYSTEM
PS1="$PS1"'\[\033[33m\]' # change to brownish yellow
PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set)
PS1="$PS1"'\[\033[1;33m\]' # change to dark yellow in bold
PS1="$PS1"'\w' # current working directory
if test -z "$WINELOADERNOEXEC"
then
@@ -55,7 +64,7 @@ else
if test -f "$COMPLETION_PATH/git-prompt.sh"
then
. "$COMPLETION_PATH/git-completion.bash"
if [[ $(getGitStatusSetting) == true ]]
if getGitStatusSetting
then
. "$COMPLETION_PATH/git-prompt.sh"
PS1="$PS1"'\[\033[36m\]' # change color to cyan
@@ -66,9 +75,22 @@ else
fi
fi
fi
PS1="$PS1"'\[\033[0m\]' # change color
PS1="$PS1"'\[\033[0m\]' # reset color
PS1="$PS1"'\n' # new line
PS1="$PS1"'λ ' # prompt: always λ
PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold
PS1="$PS1"'λ ' # prompt: Cmder uses λ
PS1="$PS1"'\[\033[0m\]' # reset color
fi
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
# Evaluate all user-specific Bash completion scripts (if any)
if test -z "$WINELOADERNOEXEC"
then
for c in "$HOME"/bash_completion.d/*.bash
do
# Handle absence of any scripts (or the folder) gracefully
test ! -f "$c" ||
. "$c"
done
fi

4
vendor/init.bat vendored
View File

@@ -355,7 +355,7 @@ setlocal enabledelayedexpansion
if defined git_locale (
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
if not defined LANG (
for /F "delims=" %%F in ('!git_locale! -uU 2') do (
for /F "delims=" %%F in ('"!git_locale!" -uU 2') do (
set "LANG=%%F"
)
)
@@ -426,7 +426,7 @@ if "%CMDER_ALIASES%" == "1" (
)
:: Add aliases to the environment
type "%user_aliases%" | findstr /b /l /i "history=cat " >nul
type "%user_aliases%" | %WINDIR%\System32\findstr /b /l /i "history=cat " >nul
if "%ERRORLEVEL%" == "0" (
echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history

View File

@@ -4,15 +4,14 @@ set lib_base=call "%~dp0lib_base.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
) else if "%~1" neq "" (
call :%*
)
exit /b
:help
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::help - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
@@ -20,16 +19,15 @@ exit /b
:::.
:::usage:
:::.
::: %lib_base% show_subs "file"
::: %lib_base% help "file"
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
for /f "tokens=* delims=:" %%a in ('type "%~1" ^| %WINDIR%\System32\findstr /i /r "^:::"') do (
rem echo a="%%a"
:help
for /f "tokens=* delims=:" %%a in ('%WINDIR%\System32\findstr /i /r "^:::" "%~1"') do (
if "%%a"=="." (
echo.
) else if /i "%%a" == "usage" (
@@ -44,9 +42,13 @@ exit /b
pause
exit /b
:cmder_shell
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::cmder_shell - Initializes the Cmder shell environment variables
:::.
:::description:
:::.
::: This routine sets up the Cmder shell environment by detecting the
::: command shell and initializing related variables.
:::.
:::include:
:::.
@@ -55,15 +57,30 @@ exit /b
:::usage:
:::.
::: %lib_base% cmder_shell
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
:cmder_shell
call :detect_comspec %ComSpec%
exit /b
:::===============================================================================
:::detect_comspec - Detects the command shell being used:::
:::.
:::description:
:::.
::: This function sets the CMDER_SHELL variable to the name of the
::: detected command shell. It also initializes the CMDER_CLINK and
::: CMDER_ALIASES variables if they are not already defined.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% detect_comspec %ComSpec%
:::-------------------------------------------------------------------------------
:detect_comspec
set CMDER_SHELL=%~n1
if not defined CMDER_CLINK (
@@ -74,6 +91,27 @@ exit /b
)
exit /b
:::===============================================================================
:::update_legacy_aliases - Updates the legacy alias definitions in the user_aliases file
:::.
:::description:
:::.
::: This function checks if the user_aliases file contains the marker
::: ";= Add aliases below here". If the marker is not found, it creates
::: an initial user_aliases store by copying the default user_aliases file
::: from the CMDER_ROOT directory. If the CMDER_USER_CONFIG environment
::: variable is defined, it creates a backup of the existing user_aliases
::: file before copying the default file.
:::.
:::include:
:::.
::: call "lib_base.cmd"
:::.
:::usage:
:::.
::: %lib_base% update_legacy_aliases
:::-------------------------------------------------------------------------------
:update_legacy_aliases
type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul
if "%errorlevel%" == "1" (

View File

@@ -14,7 +14,7 @@ if %fast_init% gtr %verbose_output% if %fast_init% gtr %debug_output% exit /b
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
) else if "%~1" neq "" (
call :%*
)

View File

@@ -1,18 +1,17 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console.cmd"
call "%~dp0lib_console.cmd"
set lib_git=call "%~dp0lib_git.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
) else if "%~1" neq "" (
call :%*
)
exit /b
:read_version
:::===============================================================================
:::read_version - Get the git.exe version
:::.
@@ -34,6 +33,7 @@ exit /b
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::-------------------------------------------------------------------------------
:read_version
:: clear the variables
set GIT_VERSION_%~1=
@@ -55,6 +55,7 @@ exit /b
set "GIT_VERSION=%%C"
) else (
echo "'git --version' returned an improper version string!"
%print_debug% :read_version "returned string: '%%A %%B %%C' by executable path: %git_executable%"
pause
exit /b
)
@@ -63,7 +64,6 @@ exit /b
exit /b
:parse_version
:::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces
:::.
@@ -88,6 +88,7 @@ exit /b
::: [SCOPE]_BUILD <out> Scoped Build version.
:::-------------------------------------------------------------------------------
:parse_version
:: process a `x.x.x.xxxx.x` formatted string
%print_debug% :parse_version "ARGV[1]=%~1, ARGV[2]=%~2"
@@ -110,9 +111,8 @@ exit /b
:endlocal_set_git_version
:validate_version
:::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'.
:::validate_version - Validate semantic version string 'x.x.x.x'
:::.
:::include:
:::.
@@ -128,6 +128,7 @@ exit /b
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::-------------------------------------------------------------------------------
:validate_version
:: now parse the version information into the corresponding variables
%print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
@@ -142,9 +143,8 @@ exit /b
)
exit /b
:compare_versions
:::===============================================================================
:::compare_version - Compare semantic versions return latest version.
:::compare_version - Compare semantic versions and return latest version
:::.
:::include:
:::.
@@ -160,6 +160,7 @@ exit /b
::: [SCOPE2] <in> Example: VENDOR
:::-------------------------------------------------------------------------------
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code.
@@ -184,7 +185,12 @@ exit /b
endlocal & exit /b 0
:::===============================================================================
:::is_git_shim
:::is_git_shim - Check if the directory has a git.shim file
:::.
:::description:
:::.
::: Shim is a small helper program for Scoop that calls the executable configured in git.shim file
::: See: github.com/ScoopInstaller/Shim and github.com/cmderdev/cmder/pull/1905
:::.
:::include:
:::.
@@ -201,7 +207,7 @@ exit /b
:is_git_shim
pushd "%~1"
:: check if there's shim - and if yes follow the path
:: check if there is a shim file - if yes, read the actual executable path
setlocal enabledelayedexpansion
if exist git.shim (
for /F "tokens=2 delims== " %%I in (git.shim) do (
@@ -218,7 +224,7 @@ exit /b
exit /b
:::===============================================================================
:::compare_git_versions
:::compare_git_versions - Compare the user git version against the vendored version
:::.
:::include:
:::.
@@ -252,7 +258,7 @@ exit /b
:: if the user provided git executable is not found
IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 (
:: if not exist "%git_executable%" (
%print_debug% ":compare_git_versions" "No git at "%git_executable%" found."
%print_debug% ":compare_git_versions" "No git at '%git_executable%' found."
set test_dir=
)
)
@@ -261,7 +267,7 @@ exit /b
exit /b
:::===============================================================================
:::get_user_git_version - get the version information for the user provided git binary
:::get_user_git_version - Get the version information for the user provided git binary
:::.
:::include:
:::.
@@ -277,5 +283,4 @@ exit /b
%lib_git% read_version USER "%test_dir%" 2>nul
%print_debug% ":get_user_git_version" "get_user_git_version GIT_VERSION_USER: %GIT_VERSION_USER%"
%lib_git% validate_version USER %GIT_VERSION_USER%
exit /b
exit /b

View File

@@ -1,16 +1,22 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
call "%~dp0lib_console.cmd"
set lib_path=call "%~dp0lib_path.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
) else if "%~1" neq "" (
call :%*
)
setlocal enabledelayedexpansion
if not defined find_pathext (
set "find_pathext=!PATHEXT:;= !"
set "find_pathext=!find_pathext:.=\.!"
)
endlocal & set "find_pathext=%find_pathext%"
exit /b
:enhance_path
@@ -32,18 +38,17 @@ exit /b
:::options:
:::
::: append <in> Append to the path env variable rather than pre-pend.
::B
:::
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if "%~1" neq "" (
set "add_path=%~1"
) else (
%print_error% "You must specify a directory to add to the path!"
exit 1
exit /b 1
)
if "%~2" neq "" if /i "%~2" == "append" (
@@ -52,7 +57,8 @@ exit /b
set "position="
)
dir "%add_path%" | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
) else (
@@ -66,7 +72,7 @@ exit /b
set "PATH=%add_to_path%;%PATH%"
)
goto :end_enhance_path
) else if "add_to_path" equ "" (
) else if "%add_to_path%" equ "" (
goto :end_enhance_path
)
@@ -78,23 +84,23 @@ exit /b
setlocal enabledelayedexpansion
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
if /i "!position!" == "append" (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
call :set_found
)
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
) else (
if "!found!" == "0" (
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
call :set_found
)
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
)
endlocal & set found=%found%
@@ -113,7 +119,8 @@ exit /b
:end_enhance_path
set "PATH=%PATH:;;=;%"
REM echo %path%|"C:\Users\dgames\cmder - dev\vendor\git-for-windows\usr\bin\wc" -c
REM echo %path%|wc -c
if "%fast_init%" == "1" exit /b
if not "%OLD_PATH:~0,3000%" == "%OLD_PATH:~0,3001%" goto :toolong
@@ -121,21 +128,27 @@ exit /b
exit /b
:toolong
echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
echo "%PATH%">"%temp%\cmder_lib_pathB"
fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
set "_rand=%RANDOM%"
if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" 2>nul 1>nul
if exist "%temp%\%_rand%_cmder_lib_pathB" del "%temp%\%_rand%_cmder_lib_pathB" 2>nul 1>nul
if exist "%temp%\%_rand%_cmder_lib_pathA" goto :toolong
if exist "%temp%\%_rand%_cmder_lib_pathB" goto :toolong
echo "%OLD_PATH%">"%temp%\%_rand%_cmder_lib_pathA"
if errorlevel 1 ( if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" & goto :toolong )
echo "%PATH%">"%temp%\%_rand%_cmder_lib_pathB"
if errorlevel 1 ( if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" & if exist "%temp%\%_rand%_cmder_lib_pathB" del "%temp%\%_rand%_cmder_lib_pathB" & goto :toolong )
fc /b "%temp%\%_rand%_cmder_lib_pathA" "%temp%\%_rand%_cmder_lib_pathB" 2>nul 1>nul
if errorlevel 1 ( del "%temp%\%_rand%_cmder_lib_pathA" & del "%temp%\%_rand%_cmder_lib_pathB" & set "_rand=" & goto :changed )
del "%temp%\%_rand%_cmder_lib_pathA" & del "%temp%\%_rand%_cmder_lib_pathB" & set "_rand="
exit /b
:changed
%print_debug% :enhance_path "END Env Var - PATH=%path%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
%print_debug% :enhance_path "END Env Var - PATH=%PATH%"
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
exit /b
exit /b
:set_found
if "%ERRORLEVEL%" == "0" (
set found=1
@@ -174,7 +187,7 @@ exit /b
set "add_path=%~1"
) else (
%print_error% "You must specify a directory to add to the path!"
exit 1
exit /b 1
)
set "depth=%~2"
@@ -186,7 +199,7 @@ exit /b
set "position="
)
dir "%add_path%" 2>NUL | findstr -i "\.COM \.EXE \.BAT \.CMD \.PS1 \.VBS" >NUL
dir "%add_path%" 2>NUL | findstr -i -e "%find_pathext%" >NUL
if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%"
@@ -205,10 +218,10 @@ exit /b
exit /b
)
%print_debug% :enhance_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :enhance_path_recursive "Env Var - position=%position%"
%print_debug% :enhance_path_recursive "Env Var - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var - max_depth=%max_depth%"
%print_debug% :enhance_path_recursive "Env Var - add_path=%add_to_path%"
%print_debug% :enhance_path_recursive "Env Var - position=%position%"
%print_debug% :enhance_path_recursive "Env Var - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr %depth% (
if "%add_to_path%" neq "" (
@@ -223,7 +236,7 @@ exit /b
exit /b
: set_depth
:set_depth
set /a "depth=%depth%+1"
exit /b
@@ -233,10 +246,9 @@ exit /b
)
for /d %%i in ("%add_path%\*") do (
%print_debug% :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var BEFORE - depth=%depth%"
%print_debug% :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %depth% %max_depth% %position%
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%"
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%"
)
exit /b

View File

@@ -1,37 +1,37 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
call "%~dp0lib_console.cmd"
set lib_profile=call "%~dp0lib_profile.cmd"
if "%~1" == "/h" (
%lib_base% help "%~0"
) else if "%1" neq "" (
) else if "%~1" neq "" (
call :%*
)
exit /b
:run_profile_d
:::===============================================================================
:::run_profile_d - Run all scripts in the passed dir path
:::
:::run_profile_d - Run all scripts in the passed directory path
:::.
:::include:
:::
:::.
::: call "lib_profile.cmd"
:::
:::.
:::usage:
:::
:::.
::: %lib_profile% "[dir_path]"
:::
:::.
:::required:
:::
:::.
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin"
:::
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
:run_profile_d
if not exist "%~1" (
mkdir "%~1"
)
@@ -43,4 +43,3 @@ exit /b
)
popd
exit /b

72
vendor/profile.ps1 vendored
View File

@@ -28,31 +28,34 @@ if (!$ENV:CMDER_ROOT) {
# Remove trailing '\'
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
# -> recent PowerShell versions include PowerShellGet out of the box
# Recent PowerShell versions include PowerShellGet out of the box
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
# Add Cmder modules directory to the autoload path.
$CmderModulePath = Join-path $PSScriptRoot "psmodules/"
# Import Cmder functions
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
. $CmderFunctions
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
# Configure PSModulePath to include Cmder modules if not already present
if (-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
}
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd")
# Read vendored Git Version
$gitVersionVendor = Get-GitVersion -GitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd"
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
# Get user installed Git Version[s] and Compare with vendored if found.
# Get user installed Git version(s) if found, and compare them with vendored version.
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
Write-Debug "GIT PATH: {$git.Path}"
$gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir)
$gitDir = Get-GitShimPath -GitPath $gitDir
$gitVersionUser = Get-GitVersion -GitPath $gitDir
Write-Debug "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor
$useGitVersion = Compare-GitVersion -UserVersion $gitVersionUser -VendorVersion $gitVersionVendor
Write-Debug "Using Git Version: ${useGitVersion}"
# Use user installed Git
@@ -72,7 +75,7 @@ foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
}
}
# User vendored Git.
# Use vendored Git if no user Git found or user Git is older than vendored Git
if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
$ENV:GIT_INSTALL_TYPE = 'VENDOR'
@@ -82,23 +85,44 @@ Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if ($null -ne $ENV:GIT_INSTALL_ROOT) {
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
$env:Path = Set-GitPath -GitRoot "$ENV:GIT_INSTALL_ROOT" -GitType $ENV:GIT_INSTALL_TYPE -GitPathUser $gitPathUser
}
# Create 'vi' alias for 'vim' if vim is available
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
New-Alias -name "vi" -value vim
}
# PSReadline configuration
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
# Display an extra prompt line between the prompt and the command input
Set-PSReadlineOption -ExtraPromptLineCount 1
# Add OSC 133;C support for Windows Terminal shell integration
# This marks the start of command output (emitted when Enter is pressed)
if ($env:WT_SESSION) {
Set-PSReadLineKeyHandler -Key Enter -ScriptBlock {
# Get the current command line
$line = $null
$cursor = $null
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
# Accept the line first
[Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
# Emit OSC 133;C sequence to mark start of command output
# This is written directly to the console after the command is accepted
[Console]::Write("$([char]0x1B)]133;C$([char]7)")
}
}
}
# Pre-assign default prompt hooks so the first run of cmder gets a working prompt.
# Pre-assign default prompt hooks so the first run of Cmder gets a working prompt
$env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = {
# Check if we're currently running under Admin privileges.
# Check if we're currently running under Admin privileges
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
@@ -107,7 +131,7 @@ $env:gitLoaded = $null
$Host.UI.RawUI.ForegroundColor = "White"
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
checkGit($pwd.ProviderPath)
Show-GitStatus -Path $pwd.ProviderPath
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
}
@@ -196,6 +220,23 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
[ScriptBlock]$Prompt = {
$lastSUCCESS = $?
$realLastExitCode = $LastExitCode
# Emit OSC 9;9 sequence for Windows Terminal directory tracking
# This enables "Duplicate Tab" and "Split Pane" to preserve the working directory
# Only active in Windows Terminal ($env:WT_SESSION) or ConEmu ($env:ConEmuPID)
$loc = $executionContext.SessionState.Path.CurrentLocation
if (($env:WT_SESSION -or $env:ConEmuPID) -and $loc.Provider.Name -eq "FileSystem") {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]9;9;`"$($loc.ProviderPath)`"$([char]0x1B)\"
}
# Emit OSC 133;A sequence for Windows Terminal shell integration
# This marks the start of the prompt
# Enables features like command navigation, selection, and visual separators
# Only active in Windows Terminal ($env:WT_SESSION)
if ($env:WT_SESSION) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;A$([char]7)"
}
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
@@ -204,6 +245,13 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
# Emit OSC 133;B sequence for Windows Terminal shell integration
# This marks the start of command input (after prompt, before user types)
if ($env:WT_SESSION) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;B$([char]7)"
}
$global:LastExitCode = $realLastExitCode
return " "
}

View File

@@ -1,177 +1,240 @@
function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe"
function Get-GitVersion {
param(
[Parameter(Mandatory = $true)]
[string]$GitPath
)
if (-not (Test-Path "$gitExecutable")) {
$gitExecutable = Join-Path $GitPath "git.exe"
if (-not (Test-Path $gitExecutable)) {
return $null
}
$gitVersion = (cmd /c "${gitExecutable}" --version)
$gitVersion = & $gitExecutable --version 2>$null
if ($gitVersion -match 'git version') {
($trash1, $trash2, $gitVersion) = $gitVersion.split(' ', 3)
} else {
pause
return $null
if ($gitVersion -match 'git version\s+(\S+)') {
return $Matches[1]
}
return $gitVersion.toString()
Write-Debug "Git executable path: $gitExecutable"
Write-Error "'git --version' returned an improper version string!"
Write-Error "Unable to determine Git version from output: $gitVersion"
return $null
}
function isGitShim($gitPath) {
# check if there's shim - and if yes follow the path
function Get-GitShimPath {
param(
[Parameter(Mandatory = $true)]
[string]$GitPath
)
if (Test-Path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ', '').split('=')
$gitPath = $gitPath.replace('\git.exe', '')
$shimFile = Join-Path $GitPath "git.shim"
if (Test-Path $shimFile) {
$shimContent = Get-Content $shimFile -Raw
if ($shimContent -match 'path\s*=\s*(.+)') {
$GitPath = $Matches[1].Trim().Replace('\git.exe', '')
}
}
return $gitPath.toString()
return $GitPath
}
function compareVersions($userVersion, $vendorVersion) {
if ($null -ne $userVersion) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else {
return -1
function Compare-Version {
param(
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$UserVersion,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$VendorVersion
)
if ([string]::IsNullOrEmpty($UserVersion)) { return -1 }
if ([string]::IsNullOrEmpty($VendorVersion)) { return 1 }
# Split version strings by dots to compare segment by segment
# For "2.49.0.windows.1", we get: ["2", "49", "0", "windows", "1"]
$userParts = $UserVersion -split '\.'
$vendorParts = $VendorVersion -split '\.'
$maxLength = [Math]::Max($userParts.Count, $vendorParts.Count)
for ($i = 0; $i -lt $maxLength; $i++) {
$userPart = if ($i -lt $userParts.Count) { $userParts[$i] } else { '' }
$vendorPart = if ($i -lt $vendorParts.Count) { $vendorParts[$i] } else { '' }
# Check if both parts are purely numeric
$userIsNumeric = $userPart -match '^\d+$'
$vendorIsNumeric = $vendorPart -match '^\d+$'
if ($userIsNumeric -and $vendorIsNumeric) {
# Both numeric: compare as integers (so 49 > 5, not lexicographic)
$userNum = [int]$userPart
$vendorNum = [int]$vendorPart
if ($userNum -gt $vendorNum) { return 1 }
if ($userNum -lt $vendorNum) { return -1 }
}
elseif ($userIsNumeric -and -not $vendorIsNumeric) {
# Numeric segment comes before text segment (e.g., "2.0" < "2.0.rc1")
return -1
}
elseif (-not $userIsNumeric -and $vendorIsNumeric) {
# Text segment comes after numeric segment
return 1
}
else {
# Both are text: use case-insensitive lexicographic comparison
$cmp = [string]::Compare($userPart, $vendorPart, $true)
if ($cmp -ne 0) { return [Math]::Sign($cmp) }
}
}
if ($null -ne $vendorVersion) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else {
return 1
}
if (($userMajor -eq $vendorMajor) -and ($userMinor -eq $vendorMinor) -and ($userPatch -eq $vendorPatch) -and ($userBuild -eq $vendorBuild)) {
return 1
}
if ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) { return 1 }
if ($userMinor -lt $vendorMinor) { return -1 }
if ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) { return -1 }
return 0
}
function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
function Compare-GitVersion {
param(
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$UserVersion,
[Parameter(Mandatory = $false)]
[AllowNull()]
[string]$VendorVersion
)
Write-Debug "Compare Versions Result: ${result}"
$result = Compare-Version -UserVersion $UserVersion -VendorVersion $VendorVersion
Write-Debug "Compare Versions Result: $result"
if ($result -ge 0) {
return $userVersion
}
else {
return $vendorVersion
return $UserVersion
}
return $VendorVersion
}
function Configure-Git($gitRoot, $gitType, $gitPathUser) {
# Proposed Behavior
function Set-GitPath {
param(
[Parameter(Mandatory = $true)]
[string]$GitRoot,
[Parameter(Mandatory = $true)]
[string]$GitType,
[Parameter(Mandatory = $false)]
[string]$GitPathUser
)
# Modify the path if we are using VENDORED Git, do nothing if using USER Git.
# If User Git is installed but is older, match its path config adding paths
# in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path
if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
if ($GitType -ne 'VENDOR') {
return $env:Path
}
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
$newPath = $env:Path
# Replace user Git path with vendored Git if user path exists
if ($GitPathUser) {
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$GitPathUser' with newer vendored Git path '$GitRoot' in the system path..."
$newPath = $newPath -ireplace [regex]::Escape($GitPathUser), $GitRoot
} else {
# Add Git cmd directory
$gitCmd = Join-Path $GitRoot "cmd"
if (-not ($newPath -match [regex]::Escape($gitCmd))) {
Write-Debug "Adding $gitCmd to the path"
$newPath = "$gitCmd;$newPath"
}
else {
if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
Write-Debug "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
}
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
Write-Debug "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin"
}
elseif ((Test-Path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) {
Write-Debug "Adding $gitRoot\mingw64\bin to the path"
$newPath = "$newPath;$gitRoot\mingw64\bin"
}
# Add mingw bin directory
# Prefer mingw64 on 64-bit systems, mingw32 on 32-bit systems
$is64Bit = [Environment]::Is64BitOperatingSystem
$mingwDirs = if ($is64Bit) { @('mingw64', 'mingw32') } else { @('mingw32') }
# Add "$gitRoot\usr\bin" to the path if exists and not done already
if ((Test-Path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
Write-Debug "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin"
foreach ($mingw in $mingwDirs) {
$mingwBin = Join-Path $GitRoot "$mingw\bin"
if ((Test-Path $mingwBin) -and -not ($newPath -match [regex]::Escape($mingwBin))) {
Write-Debug "Adding $mingwBin to the path"
$newPath = "$newPath;$mingwBin"
break
}
}
return $newPath
# Add usr bin directory
$usrBin = Join-Path $GitRoot "usr\bin"
if ((Test-Path $usrBin) -and -not ($newPath -match [regex]::Escape($usrBin))) {
Write-Debug "Adding $usrBin to the path"
$newPath = "$newPath;$usrBin"
}
}
return $env:path
return $newPath
}
function Import-Git() {
$GitModule = Get-Module -Name Posh-Git -ListAvailable
if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
Import-Module Posh-Git > $null
}
if ($GitModule | Select-Object version | Where-Object version -ge ([version]"1.0.0")) {
Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false
}
if (-not $GitModule) {
Write-Host -NoNewline "`r`n"
function Import-Git {
$gitModule = Get-Module -Name Posh-Git -ListAvailable
if (-not $gitModule) {
Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r`n"
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder."
Write-Host -NoNewline "`r$([char]0x1B)[A"
Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r$([char]0x1B)[A"
return $false
}
# Make sure we only run once by always returning true
# Import posh-git module (works for all versions)
Import-Module Posh-Git -ErrorAction SilentlyContinue | Out-Null
# Apply version-specific settings for posh-git 1.0.0+
if (($gitModule.Version -ge [version]"1.0.0") -and (Get-Variable -Name GitPromptSettings -ErrorAction SilentlyContinue)) {
$GitPromptSettings.AnsiConsole = $false
}
return $true
}
function checkGit($Path) {
function Show-GitStatus {
param(
[Parameter(Mandatory = $true)]
[string]$Path
)
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
return
}
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path
if ($SplitPath) { checkGit($SplitPath) }
$gitDir = Join-Path $Path '.git'
if (-not (Test-Path $gitDir)) {
$parentPath = Split-Path $Path
if ($parentPath) {
Show-GitStatus -Path $parentPath
}
return
}
if (getGitStatusSetting -eq $true) {
if (Get-GitStatusSetting) {
if ($null -eq $env:gitLoaded) {
$env:gitLoaded = Import-Git
}
if ($env:gitLoaded -eq $true) {
Write-VcsStatus
}
}
else {
$headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16)
} else {
$headFile = Join-Path $gitDir 'HEAD'
if (Test-Path $headFile) {
$headContent = Get-Content $headFile -Raw
if ($headContent -match 'ref: refs/heads/(.+)') {
$branchName = $Matches[1].Trim()
} else {
$shortHash = $headContent.Substring(0, [Math]::Min(7, $headContent.Length))
$branchName = "HEAD detached at $shortHash"
}
Microsoft.PowerShell.Utility\Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
}
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
}
}
function getGitStatusSetting() {
$gitStatus = (git --no-pager config -l) | Out-String
function Get-GitStatusSetting {
$gitConfig = git --no-pager config -l 2>$null | Out-String
foreach ($line in $($gitStatus -split "`r`n")) {
if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) {
return $false
}
# Check if git status display is disabled via config
# Matches: cmder.status=false or cmder.psstatus=false (PowerShell-specific)
if ($gitConfig -match '(?m)^cmder\.(ps)?status=false$') {
return $false
}
return $true

21
vendor/sources.json vendored
View File

@@ -1,22 +1,27 @@
[
{
"name": "git-for-windows",
"version": "2.41.0.windows.3",
"url": "https://github.com/git-for-windows/git/releases/download/v2.41.0.windows.3/PortableGit-2.41.0.3-64-bit.7z.exe"
"version": "2.51.2.windows.1",
"url": "https://github.com/git-for-windows/git/releases/download/v2.51.2.windows.1/PortableGit-2.51.2-64-bit.7z.exe"
},
{
"name": "clink",
"version": "1.5.1",
"url": "https://github.com/chrisant996/clink/releases/download/v1.5.1/clink.1.5.1.1e9e51.zip"
"version": "1.8.8",
"url": "https://github.com/chrisant996/clink/releases/download/v1.8.8/clink.1.8.8.a63364.zip"
},
{
"name": "conemu-maximus5",
"version": "23.07.23",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.23/ConEmuPack.230723.7z"
"version": "23.07.24",
"url": "https://github.com/ConEmu/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
},
{
"name": "windows-terminal",
"version": "1.23.12811.0",
"url": "https://github.com/microsoft/terminal/releases/download/v1.23.12811.0/Microsoft.WindowsTerminal_1.23.12811.0_x64.zip"
},
{
"name": "clink-completions",
"version": "0.4.10",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.4.10.zip"
"version": "0.6.6",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.6.zip"
}
]