Compare commits

...

210 Commits

Author SHA1 Message Date
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
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
github-actions[bot]
e2168a361c
⬆️ Update dependencies (git-for-windows v2.41.0.windows.3, clink v1.5.1, conemu-maximus5 v23.07.23, clink-completions v0.4.10) (#2850)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2023-07-24 09:29:50 +01:00
MartiUK
f517494dc4 Merge branch 'master' into development 2023-07-20 12:57:05 +00:00
Martin Kemp
7542376213
Remove appveyor config (#2805)
This should be merged after #2804

Signed-off-by: Martin Kemp <me@martinke.mp>
2023-07-20 13:56:52 +01: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
David Refoua
e9750ab73d
avoid erroneous messages, skip clink if injection fails fatally 2023-07-04 12:10:32 +03:30
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
David Refoua
59e14a1783
Remove deprecated PsGet module in favor of Install-Module 2023-05-23 14:26:50 +03:30
Martin Kemp
34f2aabb8e
Remove PSGet Entirely
Fixes #2841

Signed-off-by: Martin Kemp <me@martinke.mp>
2023-05-23 11:11:39 +01:00
DRSDavidSoft
5a90558714 Merge branch 'master' into development 2023-05-17 08:00:29 +00:00
David Refoua
845720e25a
Merge pull request #2847 from chrisant996/fix_2846
Fix 2846
2023-05-17 11:30:13 +03:30
DRSDavidSoft
c1f8dfdb27 Merge branch 'master' into development 2023-05-16 20:22:11 +00:00
David Refoua
55676399d5
Merge pull request #2849 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-05-16 23:51:54 +03:30
DRSDavidSoft
48e4dff882 ⬆️ Update dependencies (clink-completions v0.4.8) 2023-05-16 13:40:42 +00:00
Chris Antos
a605ec520d Clean luacheck warnings. 2023-05-15 09:18:59 -07:00
Chris Antos
5fab87f4d6 Remove unused function.
The `get_hg_status()` function has been unused since commit
35eab7a51a1ac4294df9861ff2fe5f40e94e0218 in 2018.
2023-05-15 09:18:47 -07:00
Chris Antos
c9153c96bf Fix global Lua namespace pollution.
Some variables were global when the intent was to be local variables.
2023-05-15 09:17:01 -07:00
Chris Antos
74381ecd19 Fix #2846; errors when git/svn/hg not installed.
Also fixes error when HEAD is not available in a git repo, e.g. due to a
corrupt repo.
2023-05-15 09:15:36 -07:00
DRSDavidSoft
50c3ea4ab3 Merge branch 'master' into development 2023-05-11 15:07:20 +00:00
David Refoua
8d39f79a90
Merge pull request #2844 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-05-11 18:37:01 +03:30
DRSDavidSoft
7b880efda4 ⬆️ Update dependencies (git-for-windows v2.40.1.windows.1) 2023-04-26 13:40:36 +00:00
DRSDavidSoft
3f53d1b927 Merge branch 'master' into development 2023-04-24 14:05:13 +00:00
David Refoua
4aefd0bb71
Merge pull request #2843 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2023-04-24 17:34:59 +03:30
DRSDavidSoft
7daeb465e8 ⬆️ Update dependencies (clink v1.4.24) 2023-04-24 13:41:39 +00:00
DRSDavidSoft
6180aa53b3 Merge branch 'master' into development 2023-04-23 20:17:40 +00:00
David Refoua
23488fcbb2
fetch all history for all branches and tags 2023-04-23 23:47:28 +03:30
David Refoua
d838f861af
checkout development 2023-04-23 23:43:26 +03:30
David Refoua
d80202c791
add task to auto push to development 2023-04-23 23:39:35 +03:30
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
David Refoua
73034f9e31
Merge pull request #2833 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2023-04-11 02:15:18 +03:30
David Refoua
8875f77573
Merge pull request #2840 from cmderdev/dependabot/github_actions/peter-evans/create-pull-request-5
Bump peter-evans/create-pull-request from 4 to 5
2023-04-11 02:14:22 +03:30
dependabot[bot]
1d1e815c91
Bump peter-evans/create-pull-request from 4 to 5
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 4 to 5.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v4...v5)

---
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>
2023-04-10 16:02:00 +00:00
DRSDavidSoft
36ad85c7b7 ⬆️ Update dependencies (git-for-windows v2.40.0.windows.1, clink v1.4.23) 2023-03-16 13:43:09 +00:00
Dax T Games
bbb50f99f8
Merge pull request #2815 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2023-03-12 08:39:05 -04:00
DRSDavidSoft
4efbe0bd62 ⬆️ Update dependencies (git-for-windows v2.40.0-rc2.windows.1, clink v1.4.22, clink-completions v0.4.7) 2023-03-10 13:42:19 +00:00
Dax T Games
476fd2d324
Merge pull request #2806 from pulsovi/fix-title-at-end
fix: /task "<taskName>" no longer works since version 1.3.20
2023-03-05 14:48:55 -08:00
David Refoua
b3af7c3983
Merge pull request #2819 from daxgames/more_speed
Remove unnecessary git actions in fast init
2023-02-05 17:39:23 +03:30
Dax T. Games
d82fece61e Remove unnecessary git actions in fiast init 2023-01-23 19:16:44 -08:00
Dax T. Games
6bd2e260f0 Add time to debug output 2023-01-22 12:30:30 -08:00
David Refoua
c9d2b33792
Update Clink to v1.4.10 2023-01-16 19:16:20 +03:30
DRSDavidSoft
9e87f375f1 ⬆️ Update dependencies (clink v1.4.10) 2023-01-16 13:41:30 +00:00
David Refoua
84262c4476
Major updates to Cmder 2023-01-15 19:17:51 +03:30
DRSDavidSoft
0b01ea6f63 ⬆️ Update dependencies (clink v1.4.9, clink-completions v0.4.4) 2023-01-15 13:41:12 +00:00
David Refoua
af6472cb57 remove duplicate variable settings 2022-12-25 17:55:56 +00:00
David Refoua
fd12ece9af test github token 2022-12-25 17:49:14 +00:00
David Refoua
b5ae5eb711 display all env vars 2022-12-25 17:33:10 +00:00
David Refoua
c9e872e826 don't display the headers variable 2022-12-25 17:30:01 +00:00
David Refoua
f99480fd49 update vendor scripts 2022-12-25 17:13:44 +00:00
David Refoua
834940cddb
Merge pull request #2807 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2022-12-22 17:42:15 +03:30
DRSDavidSoft
5135370ec1 ⬆️ Update dependencies (git-for-windows v2.39.0.windows.2, clink v1.4.6) 2022-12-22 13:40:52 +00:00
David GABISON
92a3c9c215 fix: /task "<taskName>" no longer works since version 1.3.20 2022-12-22 12:16:51 +01:00
David Refoua
f22943212b
Return error level 2 in Clink when fatal error, related to #2800 2022-12-22 10:25:17 +03:30
Martin Kemp
dc2bc9bda7
Draft a release on a tag being pushed (#2804)
Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-21 18:08:49 +00:00
DRSDavidSoft
a03ad615f1 ⬆️ Update dependencies (clink v1.4.5) 2022-12-21 13:40:56 +00:00
David Refoua
8b3f38ad21 fix misspellings 2022-12-21 02:35:11 +03:30
David Refoua
9e55c48200 fix checking for clink injection 2022-12-21 02:29:31 +03:30
David Refoua
3b6e1cbf5f
Fix error from profile.d PowerShell scripts 2022-12-21 01:56:28 +03:30
Brian Dukes
e1bf703f50
Fix error from profile.d PowerShell scripts
When there are `ps1` files in `profile.d`, the following error is logged:

>A positional parameter cannot be found that accepts argument 'Sourcing'.
2022-12-20 10:50:44 -06:00
David Refoua
2e9b512102
adjust history settings to more suitable default values 2022-12-20 10:45:09 +03:30
David Refoua
9bbc97c981
Use New-TimeSpan to calculate total elapsed time 2022-12-20 10:19:00 +03:30
Martin Kemp
4766425ad3
Create dependabot.yml 2022-12-19 10:20:34 +00:00
Martin Kemp
470808838f
TotalSecond -> TotalSeconds
Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 10:15:02 +00:00
Martin Kemp
328f4b3073
Use New-TimeSpan to calculate total elapsed time
Fixes #2797

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 10:13:34 +00:00
Martin Kemp
691addb95c
Use CodeQL Scanning (#2795)
* Use CodeQL Scanning

* run on windows

Signed-off-by: Martin Kemp <me@martinke.mp>

* Use our build scripts

Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 09:16:06 +00:00
Martin Kemp
efa2e576d0
Update conemu to mitigate CVE-2022-46387 (#2794)
Signed-off-by: Martin Kemp <me@martinke.mp>

Signed-off-by: Martin Kemp <me@martinke.mp>
2022-12-19 08:33:35 +00:00
David Refoua
5eaf0d0396 use github token when available 2022-12-15 21:05:13 +00:00
David Refoua
0e34d925ce
⬆️ Update dependencies (clink v1.4.4) 2022-12-14 17:50:30 +03:30
DRSDavidSoft
9d2ac373c5 ⬆️ Update dependencies (clink v1.4.4) 2022-12-14 13:41:25 +00:00
David Refoua
835343f9d6
Merge pull request #2786 from cmderdev/update-vendor
Updates to `3` vendored dependencies
2022-12-13 17:46:38 +03:30
DRSDavidSoft
271fe4c822 ⬆️ Update dependencies (git-for-windows v2.39.0.windows.1, clink v1.4.3, clink-completions v0.4.2) 2022-12-13 13:41:54 +00:00
David Refoua
24ba9c3fa5
Merge pull request #2791 from chrisant996/fix_2789
Fix https://github.com/cmderdev/cmder/issues/2789
2022-12-06 01:38:22 +03:30
Chris Antos
0fdcda98cf Fix https://github.com/cmderdev/cmder/issues/2789
Holding ^C made git.exe hang while cmd.exe (Clink) updated the prompt.

The prompt script had three problems:

1.  It invoked `git config` every time a prompt was displayed, to
    figure out where to skip invoking `git status`.  But it even did
    that if the current directory wasn't part of a git repo.
2.  It invoked `git config` two times for every single prompt, to
    attempt to improve performance if the user disables `git status`
    coloring.  But two times for every single prompt is expensive, so
    it has the opposite effect in the general case, and noticeably
    degrades performance.
3.  It invoked `git config` using a blocking call, instead of using the
    async prompt support in Clink.  That significantly reduced the
    benefit of having used async prompt filtering for `git status`.

Now the `git config` invocations use async prompt filtering, which lets
the prompt display instantaneously.  It also now uses a timer to avoid
invoking `git config` repeatedly when new prompts show up in rapid
succession.

Also, the `cmderGitStatusOptIn` variable is no longer leaked into the
Lua global namespace.

These changes resolve the issue: holding ^C is very fast and no longer
causes git.exe to hang.
2022-12-05 13:52:14 -08:00
Dax T. Games
42df6cd05b fix git bash GIT_INSTALL_ROOT 2022-11-19 02:32:02 +00:00
David Refoua
a4fa8d5333
Merge pull request #2780 from cmderdev/update-vendor
Updates to `1` vendored dependencies
2022-11-07 18:16:27 +03:30
David Refoua
1ba542e915 added links to labels 2022-11-07 17:38:30 +03:30
David Refoua
2c656a9c34 added a word 2022-11-07 17:33:59 +03:30
DRSDavidSoft
0adbc47c7e ⬆️ Update dependencies (clink v1.4.0) 2022-11-07 13:54:22 +00:00
David Refoua
e0ade8f3f1
Merge pull request #2779 from cmderdev/development
Improvements to shells and general fixes
2022-11-07 00:19:57 +03:30
David Refoua
ba97011bbc changes to letter casing in variable 2022-11-06 23:19:01 +03:30
David Refoua
cfcfe6f282 fix packignore issues 2022-11-06 23:17:55 +03:30
David Refoua
048692b5b5 describe color codes in order 2022-11-06 11:50:22 +03:30
David Refoua
7c74931af8 revert a letter case 2022-11-06 11:47:23 +03:30
David Refoua
e3d9f81e25 add prompt for vanilla cmd.exe when clink not present 2022-11-06 11:37:58 +03:30
David Refoua
7c309c6a7b add link to documentation in comment 2022-11-06 11:36:03 +03:30
David Refoua
0c1ab3fbb1 powershell: fixes for first time launch 2022-11-06 11:34:27 +03:30
David Refoua
fc44def0ad make powershell scripts consistent 2022-11-06 11:32:22 +03:30
David Refoua
fbe3e17eea add check for config dir 2022-11-06 11:30:56 +03:30
David Refoua
47caafb800 update launcher manifest comments 2022-11-04 18:55:25 +03:30
David Refoua
efb3338f5c powershell formatting 2022-11-04 18:47:16 +03:30
David Refoua
3859f6ffc0 consistent indentation 2022-11-04 13:29:18 +03:30
David Refoua
4e1918dcf7 formatting 2022-11-04 12:58:24 +03:30
David Refoua
dcc06a9d70 add excd (#1051) 2022-11-02 19:15:58 +03:30
David Refoua
d3026aef5d fix links to clink completions 2022-11-02 18:52:43 +03:30
David Refoua
159937b2df
added a link to the wiki 2022-11-02 11:38:47 +03:30
github-actions[bot]
3214a6d5ea
⬆️ Update dependencies (clink v1.3.51) (#2776)
Co-authored-by: DRSDavidSoft <DRSDavidSoft@users.noreply.github.com>
2022-11-01 10:31:34 +00:00
David Refoua
02970841c3
optimize compression flags (reduce passes for more speed) 2022-10-27 13:15:44 +03:30
David Refoua
04bbea7d24
Update dependencies (clink v1.3.50) 2022-10-27 12:54:38 +03:30
DRSDavidSoft
c8d48b7f3e ⬆️ Update dependencies (clink v1.3.50) 2022-10-26 13:56:46 +00:00
David Refoua
0f6ed93d0d merge into development branch 2022-10-25 21:15:01 +03:30
David Refoua
2be652707b ignore thumbnails in all directories 2022-10-25 20:39:26 +03:30
David Refoua
96ce96c53d ignore log files and clink history 2022-10-25 20:38:10 +03:30
David Refoua
ce23189427 do not stop when using fallback method 2022-10-25 19:46:56 +03:30
David Refoua
a2a996147e adjust root path 2022-10-25 18:42:30 +03:30
David Refoua
6d46df634e added a new line 2022-10-25 11:27:11 +03:30
David Refoua
fe08df3fdc update links and some minor formatting improvements 2022-10-25 11:24:37 +03:30
David Refoua
39ac92d61c add editors to ignore files 2022-10-25 00:48:28 +03:30
David Refoua
bdbd3aab2b
fix docs for user-aliases.cmd #2397 2022-10-25 00:44:47 +03:30
David Refoua
18aea2b258 Merge branch 'master' of https://github.com/cmderdev/cmder 2022-10-25 00:22:47 +03:30
David Refoua
5cd05b056b
Improvements to Cmder prompt 2022-10-25 00:22:15 +03:30
David Refoua
c0fc10009a use colons for batch labels 2022-10-25 00:13:21 +03:30
David Refoua
cc5e4a0e60 fix a misspelling 2022-10-24 21:20:52 +03:30
David Refoua
6e0e1729d8 use a variable to keep DRY 2022-10-24 21:01:55 +03:30
David Refoua
cbb10de06d consistent spaces 2022-10-24 20:54:24 +03:30
David Refoua
0b7e47cdc2 add new alias for file listing 2022-10-24 20:38:09 +03:30
David Refoua
96ca7cea4a enhance cmder prompt 2022-10-24 19:58:46 +03:30
David Refoua
0ba0dea6a2
Update Clink to v1.3.49 2022-10-23 18:38:45 +03:30
DRSDavidSoft
e320ba8aae ⬆️ Update dependencies (clink v1.3.49) 2022-10-23 15:06:50 +00:00
David Refoua
23b80264b0 use shorter commit message 2022-10-23 18:34:36 +03:30
David Refoua
90cd1130ac add link to repo url 2022-10-23 18:09:35 +03:30
David Refoua
7f71456a41
Merge pull request #2767 from cmderdev/update-vendor
Updates to `2` vendored dependencies
2022-10-21 11:07:33 +03:30
DRSDavidSoft
c606e5c8ee Update vendored dependencies (git-for-windows v2.38.1.windows.1, clink v1.3.48) 2022-10-20 13:58:38 +00:00
David Refoua
98d28846b3
Git-bash use conemu-msys2-64 connector (#2765) 2022-10-19 22:41:19 +03:30
David Refoua
27f28e6ed7 fix double escaped percent 2022-10-19 10:21:56 +03:30
David Refoua
8b6d1d8a6f alternative where filter instead of relying on find.exe 2022-10-19 00:33:10 +03:30
eval Nya
211fbd6428
Sync Git-bash start argument from ConEmu to use conemu-msys2-64 connector
use conemu-msys2-64 connector would help to solve some display problems under Git Bash like character/cursor drifting, `tmux` display wrong, and so on. As the default profile is hardcoded and ConEmu upstream has solved it by using msys-connector, please add it.
2022-10-19 02:32:17 +08:00
David Refoua
2acb6808ed use pwsh as shell value 2022-10-18 16:54:26 +03:30
David Refoua
ee913e09ee use relative path 2022-10-18 16:51:59 +03:30
David Refoua
ede79c2199 use correct sources path 2022-10-18 16:41:38 +03:30
David Refoua
665df2a8c8 add step to initialize vendors 2022-10-18 16:26:47 +03:30
David Refoua
a0f234b9d0 check for clink existence 2022-10-18 16:22:05 +03:30
David Refoua
5cdb98abb7 add escape code color 2022-10-18 16:20:30 +03:30
David Refoua
9399cbdcd7 detect if clink initialization failed 2022-10-18 16:11:54 +03:30
David Refoua
c992215f94 Merge branch 'master' of https://github.com/cmderdev/cmder 2022-10-18 15:21:31 +03:30
David Refoua
55b90cc958 fix minor typo 2022-10-18 15:21:28 +03:30
David Refoua
971483b2b7 use consistent indentation in init.bat 2022-10-18 15:20:35 +03:30
Martin Kemp
c8d554220a
Update README.md 2022-10-18 12:37:10 +01:00
Martin Kemp
8feae5d81d
Update README.md 2022-10-18 12:36:44 +01:00
David Refoua
6d77c988db
changes to zip compression parameters 2022-10-18 14:58:16 +03:30
David Refoua
04b6ec2ac8
Update issue template labels
* update question template
* update bug-report label
* update feature-request label
2022-10-18 14:49:03 +03:30
David Refoua
b5bddc929e
Updated changelog to released 2022-10-18 14:38:53 +03:30
Alex Kostyukov
5d05034810 fix docs for user-aliases.cmd #2397 2020-09-28 15:20:13 +03:00
Alpha
4243c5c222 Added pagent ssh auth support (#1391)
(and some comments on the user-profile.cmd file)

Inspired by the comments from https://github.com/cmderdev/cmder/issues/193 and my personal need to use pageant instead of OpenSSH authentication agents (which is more Window user-friendly), I have used this approach which works as expected.

Keeping the spirit of the current scripts, I left it disabled, and with some comments explaining what they all do.
2017-07-24 23:15:17 +02:00
42 changed files with 1062 additions and 2849 deletions

View File

@ -1,7 +1,7 @@
name: "🐞 Bug report (encountered problems/errors)" name: "🐞 Bug report (encountered problems/errors)"
description: Something is not working as it should description: Something is not working as it should
title: "[Bug] " title: "[Bug] "
labels: [🐞 Bug report] labels: "🐛 Type: Bug"
body: body:
- type: markdown - type: markdown
@ -20,6 +20,7 @@ body:
label: Version Information label: Version Information
description: | description: |
Please write your Cmder and ConEmu version below. If applicable, write down your Windows edition too. Please write your Cmder and ConEmu version below. If applicable, write down your Windows edition too.
**👉 See:** [How to find out which Cmder version I'm using](https://github.com/cmderdev/cmder/wiki/Cmder-troubleshooting)
placeholder: | placeholder: |
Cmder version: Cmder version:
Operating system: Operating system:
@ -77,7 +78,7 @@ body:
- **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder - **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder
- **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator - **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator
- **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc) - **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc)
- **[clink-completions](https://github.com/repos/vladimir-kotikov/clink-completions)**, which provide autocompletion for clink - **[clink-completions](https://github.com/vladimir-kotikov/clink-completions)**, which provides autocompletion for clink
We'll try our best to help you -- but we recommend creating an issue specifically at each of the corresponding repositories for the best result. We'll try our best to help you -- but we recommend creating an issue specifically at each of the corresponding repositories for the best result.
@ -90,7 +91,7 @@ body:
#### Prerequisites before submitting an issue #### Prerequisites before submitting an issue
- We do not support any versions older than the current release series, if you are using an older Cmder please update to the latest version first. - We do not support any versions older than the current release series, if you are using an older Cmder please update to the latest version first.
- Verify that the issue is not fixed and is reproducible in the **[latest official Cmder version](https://github.com/cmderdev/cmder/releases).** - Verify that the issue is not already fixed and is reproducible in the **[latest official Cmder version](https://github.com/cmderdev/cmder/releases).**
- Check the **[current issues list](https://github.com/cmderdev/cmder/issues?q=is%3Aissue)** and perform a **search of the issue tracker (including closed ones)** to avoid posting a duplicate bug report. - Check the **[current issues list](https://github.com/cmderdev/cmder/issues?q=is%3Aissue)** and perform a **search of the issue tracker (including closed ones)** to avoid posting a duplicate bug report.
- Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/cmderdev/cmder/discussions)**, or the **[questions section](https://github.com/cmderdev/cmder/issues/new?template=question.yml)**. - Make sure this is not a support request or question, both of which are better suited for either the **[discussions section](https://github.com/cmderdev/cmder/discussions)**, or the **[questions section](https://github.com/cmderdev/cmder/issues/new?template=question.yml)**.
- Verify that the **[wiki](https://github.com/cmderdev/cmder/wiki)** did not contain a suitable solution either. - Verify that the **[wiki](https://github.com/cmderdev/cmder/wiki)** did not contain a suitable solution either.

View File

@ -1,7 +1,7 @@
name: "⭐ Feature request (request for new functionality)" name: "⭐ Feature request (request for new functionality)"
description: Help make Cmder even better description: Help make Cmder even better
title: "[Feature request] " title: "[Feature request] "
labels: [⭐ Feature request] labels: "🛠 Type: Feature Request"
body: body:
- type: markdown - type: markdown
@ -22,7 +22,7 @@ body:
- **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder - **[Clink](https://github.com/chrisant996/clink)**, the default shell in Cmder
- **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator - **[ConEmu](https://github.com/Maximus5/ConEmu)**, the terminal emulator
- **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc) - **[Git/MinGW](https://github.com/git-for-windows/git)**, which also provide *NIX tools (such as `ls`, `mv`, `cp`, etc)
- **[clink-completions](https://github.com/repos/vladimir-kotikov/clink-completions)**, which provide autocompletion for clink - **[clink-completions](https://github.com/vladimir-kotikov/clink-completions)**, which provides autocompletion for clink
- If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first. - If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first.

View File

@ -1,6 +1,7 @@
name: "❓ Question" name: "❓ Question"
description: Something is unclear or needs to be discussed description: Something is unclear or needs to be discussed
labels: [❓ Question] title: "Question: "
labels: "❔ Type: Question"
body: body:
- type: markdown - type: markdown
@ -18,7 +19,7 @@ body:
- If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first. - If you would like to ask for guides on how to integrate Cmder with your favorite IDE of choice, or how to perform a specific task with Cmder, make sure you visit our label section first.
You may already have an answer under the Guides or Questions section. You may already have an answer under the [💬 Guides](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%92%AC+Type%3A+Guide%22), [📖 Documentation](https://github.com/cmderdev/cmder/issues?q=label%3A%22%F0%9F%93%96+Documentation%22) or [❔ Questions](https://github.com/cmderdev/cmder/issues?q=is%3Aissue+label%3A%22%E2%9D%94+Type%3A+Question%22) section.
For a list of labels, visit **[Labels](https://github.com/cmderdev/cmder/labels)**. For a list of labels, visit **[Labels](https://github.com/cmderdev/cmder/labels)**.

11
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,11 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "github-actions" # See documentation for possible values
directory: "/" # Location of package manifests
schedule:
interval: "weekly"

33
.github/workflows/branches.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: Update branches
# Controls when the action will run.
on:
# Triggers the workflow on push events for the development branch
push:
branches: [ master ]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This job updates the development branch with the master branch
update-development:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# 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@v4
with:
fetch-depth: 0 # fetch all history for all branches and tags
# Runs a single command using the runners shell
- name: Merge master into development
run: |
git config user.name "${{ github.actor }}"
git config user.email "${{ github.actor }}@users.noreply.github.com"
git checkout development
git merge --no-ff master
git push origin development

View File

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

73
.github/workflows/codeql.yml vendored Normal file
View File

@ -0,0 +1,73 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL"
on:
push:
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request:
# The branches below must be a subset of the branches above
branches: [ "master", "development" ]
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
schedule:
- cron: '30 19 * * 0'
jobs:
analyze:
name: Analyze
runs-on: windows-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Use only 'java' to analyze code written in Java, Kotlin or both
# Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# queries: security-extended,security-and-quality
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: Build Cmder Launcher
shell: pwsh
working-directory: scripts
run: .\build.ps1 -Compile -verbose
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"

View File

@ -4,9 +4,21 @@ on:
push: push:
branches: branches:
- master - master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
pull_request: pull_request:
branches: branches:
- master - master
- development
paths-ignore:
- '**/*.md'
- '**/*.txt'
- '.github/**'
- '**/.gitignore'
defaults: defaults:
run: run:
@ -26,10 +38,14 @@ jobs:
continue-on-error: false continue-on-error: false
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
- name: Initialize vendors
shell: pwsh
working-directory: scripts
run: .\build.ps1 -verbose
- name: Testing Clink Shell - name: Testing Clink Shell
run: | run: |
cmd /c vendor\init.bat cmd /c vendor\init.bat /v /d /t
- name: Testing PowerShell - name: Testing PowerShell
run: | run: |
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''" PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''"

View File

@ -24,12 +24,14 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- id: make-changes - id: make-changes
name: Checking for updates name: Checking for updates
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | run: |
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json) $currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
. .\scripts\update.ps1 -verbose . .\scripts\update.ps1 -verbose
@ -40,15 +42,16 @@ jobs:
foreach ($s in $newVersion) { foreach ($s in $newVersion) {
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version $oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
if ($s.version -ne $oldVersion) { if ($s.version -ne $oldVersion) {
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
$listUpdated += "$($s.name) v$($s.version), " $listUpdated += "$($s.name) v$($s.version), "
$updateMessage += "| **$($s.name)** | $oldVersion | **$($s.version)** |`n" $updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
} }
} }
if ($count -eq 0) { return } if ($count -eq 0) { return }
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ') 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 echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- uses: peter-evans/create-pull-request@v4 - uses: peter-evans/create-pull-request@v6
if: env.COUNT_UPDATED > 0 if: env.COUNT_UPDATED > 0
with: with:
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies' title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
@ -57,6 +60,6 @@ jobs:
${{ env.UPDATE_MESSAGE }} ${{ env.UPDATE_MESSAGE }}
--- ---
Please verify and then **Merge** the pull request to update. Please verify and then **Merge** the pull request to update.
commit-message: 'Update vendored dependencies (${{ env.LIST_UPDATED }})' commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
branch: update-vendor branch: update-vendor
base: master base: master

2
.gitignore vendored
View File

@ -29,3 +29,5 @@ build/
launcher/.vs launcher/.vs
launcher/src/version.rc2 launcher/src/version.rc2
.vs/* .vs/*
.vscode
.idea

View File

@ -1,11 +1,12 @@
# Change Log # Change Log
## [1.3.20-unreleased](https://ci.appveyor.com/project/MartiUK/cmder/build/artifacts) (2022-03-17) ## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
### Changes ### Changes
- Update Git for Windows to 2.37.1 - Update Git for Windows to 2.38.0.windows.1
- Update to Clink 1.3.36 - Update Clink to 1.3.47
- Update ConEmu to 22.08.07
### Fixes ### Fixes
@ -14,7 +15,18 @@
- Fix using Git from vendored Git and other Git for Windows tools from other Git in path. - Fix using Git from vendored Git and other Git for Windows tools from other Git in path.
- Remove setting `term=cygwin` in `init.bat` to fix random `ABCD` characters when using arrow keys in `vim`. - Remove setting `term=cygwin` in `init.bat` to fix random `ABCD` characters when using arrow keys in `vim`.
- See: [Sometimes pressing on arrow keys prints symbols #1691](https://github.com/Maximus5/ConEmu/issues/169) - See: [Sometimes pressing on arrow keys prints symbols #1691](https://github.com/Maximus5/ConEmu/issues/169)
- Fix Git prompt branch when using Git worktree. - Fix #2654: blank space added between {cwd} and version_control variable by @geekrumper in https://github.com/cmderdev/cmder/pull/2661
- Fix #2659: Use get_hg_branch() to get Mercurial branch information. by @vsajip in https://github.com/cmderdev/cmder/pull/2660
- Fix Git prompt branch when using Git worktree by @daxgames in https://github.com/cmderdev/cmder/pull/2680
- Add optional clink async prompt update for svn status by @Mikaz-fr in https://github.com/cmderdev/cmder/pull/2703
- Better bat by @daxgames in https://github.com/cmderdev/cmder/pull/2742
- Related to #2654: Move space from "{git}{hg}{svn}" to individual parts by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2738
- Use TaskDialog instead of MessageBox (Fixes Builds) by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2746
- Add bin\cmder_shell.cmd by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2747
- Fix build system scripts (closes #2723) by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2748
- Custom option for launcher title by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2752
- Use Github Actions to build and release by @MartiUK in https://github.com/cmderdev/cmder/pull/2725
- Re-factor the build script to distinguish each step by @DRSDavidSoft in https://github.com/cmderdev/cmder/pull/2758
## [1.3.19](https://github.com/cmderdev/cmder/tree/v1.3.19) (2022-01-15) ## [1.3.19](https://github.com/cmderdev/cmder/tree/v1.3.19) (2022-01-15)
@ -666,7 +678,7 @@ We now use a forked version of clink since its original author is missing and we
* 'ls' is no longer recognized command [\#757](https://github.com/cmderdev/cmder/issues/757) * 'ls' is no longer recognized command [\#757](https://github.com/cmderdev/cmder/issues/757)
* I can't run de Cmder.exe [\#755](https://github.com/cmderdev/cmder/issues/755) * I can't run de Cmder.exe [\#755](https://github.com/cmderdev/cmder/issues/755)
* Multiple location references when maximizing [\#753](https://github.com/cmderdev/cmder/issues/753) * Multiple location references when maximizing [\#753](https://github.com/cmderdev/cmder/issues/753)
* CLink completions for npm increase cmder startup time for one second [\#750](https://github.com/cmderdev/cmder/issues/750) * Clink completions for npm increase cmder startup time for one second [\#750](https://github.com/cmderdev/cmder/issues/750)
* Prevent other apps from overwriting the prompt? [\#749](https://github.com/cmderdev/cmder/issues/749) * Prevent other apps from overwriting the prompt? [\#749](https://github.com/cmderdev/cmder/issues/749)
* cmder.exe infected with Variant.Kazy.767238 [\#748](https://github.com/cmderdev/cmder/issues/748) * cmder.exe infected with Variant.Kazy.767238 [\#748](https://github.com/cmderdev/cmder/issues/748)
* cmder.exe considered harmful by Bitdefender [\#744](https://github.com/cmderdev/cmder/issues/744) * cmder.exe considered harmful by Bitdefender [\#744](https://github.com/cmderdev/cmder/issues/744)

View File

@ -1,6 +1,6 @@
# How to contribute # How to contribute
Unfortunately we all can't work on cmder every day of the year, so I have decided to write some guidelines for contributing. Unfortunately we all can't work on Cmder every day of the year, so I have decided to write some guidelines for contributing.
If you follow them your contribution will likely be pulled in quicker. If you follow them your contribution will likely be pulled in quicker.

View File

@ -5,7 +5,12 @@ SET CMDER_ROOT=%~dp0
@if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1% @if "%CMDER_ROOT:~-1%" == "\" SET CMDER_ROOT=%CMDER_ROOT:~0,-1%
if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" ( if not exist "%CMDER_ROOT%\config\user_ConEmu.xml" (
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" if not exist "%CMDER_ROOT%\config" mkdir "%CMDER_ROOT%\config" 2>nul
copy "%CMDER_ROOT%\vendor\ConEmu.xml.default" "%CMDER_ROOT%\config\user_ConEmu.xml" 1>nul
if %errorlevel% neq 0 (
echo ERROR: CMDER Initialization has Failed
exit /b 1
)
) )
if exist "%~1" ( if exist "%~1" (

View File

@ -1,6 +1,6 @@
# Cmder # Cmder
[![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/MartiUK/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml) [![Join the chat at https://gitter.im/cmderdev/cmder](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?branch=master&svg=true)](https://ci.appveyor.com/project/cmderdev/cmder) [![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout. Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.
@ -8,7 +8,7 @@ Cmder is a **software package** created out of pure frustration over absence of
## Why use it ## Why use it
The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like wget, curl and git) with you anywhere. The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like `wget`, `curl` and `git`) with you anywhere.
The Cmder's user interface is also designed to be more eye pleasing, and you can compare the main differences between Cmder and ConEmu [here](https://conemu.github.io/en/cmder.html). The Cmder's user interface is also designed to be more eye pleasing, and you can compare the main differences between Cmder and ConEmu [here](https://conemu.github.io/en/cmder.html).
@ -71,7 +71,7 @@ So you've experimented with Cmder a little and want to give it a shot in a more
1. Open a terminal as an Administrator 1. Open a terminal as an Administrator
2. Navigate to the directory you have placed Cmder 2. Navigate to the directory you have placed Cmder
3. Execute `.\cmder.exe /REGISTER ALL` 3. Execute `.\cmder.exe /REGISTER ALL`
_If you get a message "Access Denied" ensure you are executing the command in an **Administrator** prompt._ _If you get an "Access Denied" message, make sure you are executing the command in an **Administrator** prompt._
In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu. In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu.
@ -115,11 +115,11 @@ You can open multiple tabs each containing one of the following shells:
Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog. Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog.
*NOTE:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration. *Note:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration.
You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows. You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows.
*NOTE:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it. *Note:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it.
As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty). As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty).
@ -188,7 +188,7 @@ Documentation is in the file for each setting.
| (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more usage. | not set | | (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more usage. | not set |
### Cmder Shell User Config ### Cmder Shell User Config
Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration: Single user portable configuration is possible using the Cmder specific shell config files. Edit the below files to add your own configuration:
| Shell | Cmder Portable User Config | | Shell | Cmder Portable User Config |
| ------------- | ----------------------------------------- | | ------------- | ----------------------------------------- |
@ -196,7 +196,7 @@ Single user portable configuration is possible using the cmder specific shell co
| PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` | | PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` |
| Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` | | Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` |
Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`. **Note:** Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`.
You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder. You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder.
@ -230,7 +230,7 @@ Aliases defined using the `alias.bat` command will automatically be saved in the
To make an alias and/or any other profile settings permanent add it to one of the following: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow cmder to another machine. Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow Cmder to another machine.
* `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat` * `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat`
* `%CMDER_ROOT%\config\user_aliases.cmd` * `%CMDER_ROOT%\config\user_aliases.cmd`
@ -241,7 +241,7 @@ Bash shells support simple and complex aliases with optional parameters natively
To make an alias and/or any other profile settings permanent add it to one of the following: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow cmder to another machine. Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow Cmder to another machine.
* `$CMDER_ROOT/config/profile.d/*.sh` * `$CMDER_ROOT/config/profile.d/*.sh`
* `$CMDER_ROOT/config/user_profile.sh` * `$CMDER_ROOT/config/user_profile.sh`
@ -254,7 +254,7 @@ PowerShell has native simple alias support, for example `[new-alias | set-alias]
To make an alias and/or any other profile settings permanent add it to one of the following: To make an alias and/or any other profile settings permanent add it to one of the following:
Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow cmder to another machine. Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow Cmder to another machine.
* `$ENV:CMDER_ROOT\config\profile.d\*.ps1` * `$ENV:CMDER_ROOT\config\profile.d\*.ps1`
* `$ENV:CMDER_ROOT\config\user_profile.ps1` * `$ENV:CMDER_ROOT\config\user_profile.ps1`
@ -292,7 +292,7 @@ The destination file extension depends on the shell you use in that environment.
* bash - Copy to `/etc/profile.d/cmder_exinit.sh` * bash - Copy to `/etc/profile.d/cmder_exinit.sh`
* zsh - Copy to `/etc/profile.d/cmder_exinit.zsh` * zsh - Copy to `/etc/profile.d/cmder_exinit.zsh`
Uncomment and edit the below line in the script to use Cmder config even when launched from outside Cmder. Uncomment and edit the line below in the script to use Cmder config even when launched from outside Cmder.
``` ```
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder. # CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
@ -344,9 +344,9 @@ To conditionally start `notepad.exe` when you start a specific `cmder` task:
``` ```
To see detailed usage of `cexec`, type `cexec /?` in cmder. To see detailed usage of `cexec`, type `cexec /?` in Cmder.
### Integrating Cmder with [Hyper](https://github.com/zeit/hyper), [Microsoft VS Code](https://code.visualstudio.com/), and your favorite IDEs ### Integrating Cmder with [Windows Terminal](https://github.com/cmderdev/cmder/wiki/Seamless-Windows-Terminal-Integration), [VS Code](https://github.com/cmderdev/cmder/wiki/Seamless-VS-Code-Integration), and your favorite IDEs
Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html). Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html).
@ -386,7 +386,11 @@ If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running
You can download builds of the current development branch by going to AppVeyor via the following link: You can download builds of the current development branch by going to AppVeyor via the following link:
[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/MartiUK/cmder/branch/master/artifacts) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/cmderdev/cmder?svg=True)](https://ci.appveyor.com/project/cmderdev/cmder/branch/master/artifacts)
The latest download builds by GitHub Actions can be downloaded from the link below:
[![Build Status](https://github.com/cmderdev/cmder/actions/workflows/build.yml/badge.svg)](https://github.com/cmderdev/cmder/actions/workflows/build.yml)
## License ## License

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

@ -1,60 +0,0 @@
#---------------------------------#
# general configuration #
#---------------------------------#
version: 1.0.{build}-{branch}
# branches to build
branches:
# blacklist
except:
- gh-pages
#---------------------------------#
# environment configuration #
#---------------------------------#
# Operating system (build VM template)
os: Visual Studio 2022
#---------------------------------#
# build configuration #
#---------------------------------#
build_script:
- ps: cd scripts; .\build.ps1 -Compile -verbose
after_build:
- ps: .\pack.ps1 -verbose
# Disable test search, since we don't have any.
test: off
#---------------------------------#
# artifacts #
#---------------------------------#
artifacts:
- path: build\cmder.zip
name: cmderzip
- path: build\cmder.7z
name: cmder7z
- path: build\cmder_mini.zip
name: cmdermini
- path: build\hashes.txt
name: hashes
#---------------------------------#
# notifications #
#---------------------------------#
notifications:
# Webhook
- provider: Webhook
url: https://webhooks.gitter.im/e/d673abb1b2e659dcd625
on_build_success: true
on_build_failure: true
on_build_status_changed: true

View File

@ -425,11 +425,6 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
swprintf_s(args, L"%s /single", args); swprintf_s(args, L"%s /single", args);
} }
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
if (!streqi(cmderTitle.c_str(), L"")) if (!streqi(cmderTitle.c_str(), L""))
{ {
swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str()); swprintf_s(args, L"%s /title \"%s\"", args, cmderTitle.c_str());
@ -445,6 +440,14 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str()); swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str());
} }
// The `/run` arg and its value MUST be the last arg of ConEmu
// see : https://conemu.github.io/en/ConEmuArgs.html
// > This must be the last used switch (excepting -new_console and -cur_console)
if (!streqi(cmderTask.c_str(), L""))
{
swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str());
}
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
if (wcscmp(userConfigDirPath, configDirPath) != 0) if (wcscmp(userConfigDirPath, configDirPath) != 0)
{ {
@ -466,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); MessageBox(NULL, _T("Unable to create the ConEmu process!"), _T("Error"), MB_OK);
return; 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) bool IsUserOnly(std::wstring opt)

View File

@ -39,12 +39,12 @@
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 --> <!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 --> <!-- Windows 10 and Windows 11 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application> </application>
</compatibility> </compatibility>
<!-- Add dpi awareness --> <!-- Add DPI awareness -->
<asmv3:application> <asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/pm</dpiAware> <dpiAware>true/pm</dpiAware>

View File

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

View File

@ -3,12 +3,15 @@ launcher
.gitattributes .gitattributes
.git .git
.github .github
.vs
.vscode
.idea
*.md *.md
build build
scripts scripts
config\.history config\.history
packignore packignore
icons\Thumbs.db Thumbs.db
icons\cmder_icon.psd icons\cmder_icon.psd
icons\icon_16*.png icons\icon_16*.png
icons\icon_32*.png icons\icon_32*.png
@ -20,3 +23,5 @@ appveyor.yml
vendor\cmder.sh vendor\cmder.sh
vendor\git-prompt.sh vendor\git-prompt.sh
config\user-* config\user-*
clink_history*
*.log

View File

@ -35,7 +35,7 @@
.LINK .LINK
http://cmder.app/ - Project Home http://cmder.app/ - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess = $true)]
Param( Param(
# CmdletBinding will give us; # CmdletBinding will give us;
# -verbose switch to turn on logging and # -verbose switch to turn on logging and
@ -79,7 +79,7 @@ if ($Compile) {
Write-Verbose "Building the launcher..." 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 msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release /m
if ($LastExitCode -ne 0) { if ($LastExitCode -ne 0) {
@ -88,7 +88,7 @@ if ($Compile) {
Pop-Location Pop-Location
} }
if (-Not $noVendor) { if (-not $noVendor) {
# Check for requirements # Check for requirements
Ensure-Exists $sourcesPath Ensure-Exists $sourcesPath
Ensure-Executable "7z" Ensure-Executable "7z"
@ -108,12 +108,14 @@ if (-Not $noVendor) {
$ConEmuXmlSave = Join-Path $config "ConEmu.xml" $ConEmuXmlSave = Join-Path $config "ConEmu.xml"
Write-Verbose "Backup '$ConEmuXml' to '$ConEmuXmlSave'" Write-Verbose "Backup '$ConEmuXml' to '$ConEmuXmlSave'"
Copy-Item $ConEmuXml $ConEmuXmlSave Copy-Item $ConEmuXml $ConEmuXmlSave
} else { $ConEmuXml = "" } }
} else { $ConEmuXml = "" } else { $ConEmuXml = "" }
}
else { $ConEmuXml = "" }
# Kill ssh-agent.exe if it is running from the $env:cmder_root we are building # Kill ssh-agent.exe if it is running from the $env:cmder_root we are building
foreach ($ssh_agent in $(Get-Process ssh-agent -ErrorAction SilentlyContinue)) { foreach ($ssh_agent in $(Get-Process ssh-agent -ErrorAction SilentlyContinue)) {
if ([string]$($ssh_agent.path) -Match [string]$cmder_root.replace('\','\\')) { if ([string]$($ssh_agent.path) -Match [string]$cmder_root.replace('\', '\\')) {
Write-Verbose $("Stopping " + $ssh_agent.path + "!") Write-Verbose $("Stopping " + $ssh_agent.path + "!")
Stop-Process $ssh_agent.id Stop-Process $ssh_agent.id
} }
@ -160,7 +162,7 @@ if (-Not $noVendor) {
Pop-Location Pop-Location
} }
if (-Not $Compile -Or $noVendor) { if (-not $Compile -or $noVendor) {
Write-Warning "You are not building the full project, Use -Compile without -noVendor" Write-Warning "You are not building the full project, Use -Compile without -noVendor"
Write-Warning "This cannot be a release. Test build only!" Write-Warning "This cannot be a release. Test build only!"
return return

View File

@ -22,7 +22,7 @@
https://github.com/cmderdev/cmder - Project Home https://github.com/cmderdev/cmder - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess = $true)]
Param( Param(
# CmdletBinding will give us; # CmdletBinding will give us;
# -verbose switch to turn on logging and # -verbose switch to turn on logging and
@ -42,9 +42,9 @@ $ErrorActionPreference = "Stop"
Ensure-Executable "7z" Ensure-Executable "7z"
$targets = @{ $targets = @{
"cmder.zip" = $null; "cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on -myx=7 -mqs=on";
"cmder.7z" = "-t7z -m0=lzma2 -mx=9 -mfb=64 -md=32m -ms=on"; "cmder.zip" = "-mm=Deflate -mfb=128 -mpass=3";
"cmder_mini.zip" = "-mm=Deflate -mfb=258 -mpass=15 -xr!`"vendor\git-for-windows`""; "cmder_mini.zip" = "-xr!`"vendor\git-for-windows`"";
} }
Push-Location -Path $cmderRoot Push-Location -Path $cmderRoot
@ -63,7 +63,7 @@ $version = Get-VersionStr
if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) { if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
Write-Verbose "Packing Cmder $version in $saveTo..." Write-Verbose "Packing Cmder $version in $saveTo..."
$excluded = (Get-Content -Path "$cmderRoot\packignore") -Split [System.Environment]::NewLine | Where-Object {$_} $excluded = (Get-Content -Path "$cmderRoot\packignore") -Split [System.Environment]::NewLine | Where-Object { $_ }
Get-ChildItem $cmderRoot -Force -Exclude $excluded Get-ChildItem $cmderRoot -Force -Exclude $excluded
} }

View File

@ -25,7 +25,7 @@
.LINK .LINK
http://cmder.app/ - Project Home http://cmder.app/ - Project Home
#> #>
[CmdletBinding(SupportsShouldProcess=$true)] [CmdletBinding(SupportsShouldProcess = $true)]
Param( Param(
# CmdletBinding will give us; # CmdletBinding will give us;
# -verbose switch to turn on logging and # -verbose switch to turn on logging and
@ -55,7 +55,7 @@ function Match-Filenames {
$position = 0 $position = 0
if ([String]::IsNullOrEmpty($filename) -Or [String]::IsNullOrEmpty($filenameDownload)) { if ([String]::IsNullOrEmpty($filename) -or [String]::IsNullOrEmpty($filenameDownload)) {
throw "Either one or both filenames are empty!" throw "Either one or both filenames are empty!"
} }
@ -88,20 +88,26 @@ function Fetch-DownloadUrl {
$url = [uri] $urlStr $url = [uri] $urlStr
if ((-Not $url) -Or ($null -eq $url) -Or ($url -eq '')) { if ((-not $url) -or ($null -eq $url) -or ($url -eq '')) {
throw "Failed to parse url: $urlStr" throw "Failed to parse url: $urlStr"
} }
if (-Not ("http", "https" -Contains $url.Scheme)) { if (-not ("http", "https" -contains $url.Scheme)) {
throw "unknown source scheme: $($url.Scheme)" throw "unknown source scheme: $($url.Scheme)"
} }
if (-Not ($url.Host -ilike "*github.com")) { if (-not ($url.Host -ilike "*github.com")) {
throw "unknown source domain: $($url.Host)" throw "unknown source domain: $($url.Host)"
} }
$p = $url.Segments.Split([Environment]::NewLine) $p = $url.Segments.Split([Environment]::NewLine)
$headers = @{}
if ($env:GITHUB_TOKEN) {
$headers["Authorization"] = "token $($env:GITHUB_TOKEN)"
}
# Api server for GitHub # Api server for GitHub
$urlHost = "api.github.com" $urlHost = "api.github.com"
@ -110,18 +116,18 @@ function Fetch-DownloadUrl {
$apiUrl = [uri] (New-Object System.UriBuilder -ArgumentList $url.Scheme, $urlHost, -1, $urlPath).Uri $apiUrl = [uri] (New-Object System.UriBuilder -ArgumentList $url.Scheme, $urlHost, -1, $urlPath).Uri
$info = Invoke-RestMethod -Uri $apiUrl $info = Invoke-RestMethod -Uri $apiUrl -Headers $headers
$downloadLinks = (New-Object System.Collections.Generic.List[System.Object]) $downloadLinks = (New-Object System.Collections.Generic.List[System.Object])
$charCount = 0 $charCount = 0
if (-Not ($info -Is [array])) { if (-not ($info -is [array])) {
throw "The response received from API server is invalid" throw "The response received from API server is invalid"
} }
:loop foreach ($i in $info) { :loop foreach ($i in $info) {
if (-Not ($i.assets -Is [array])) { if (-not ($i.assets -is [array])) {
continue continue
} }
@ -157,12 +163,12 @@ function Fetch-DownloadUrl {
} }
# Special case for archive downloads of repository # Special case for archive downloads of repository
if (($null -eq $downloadLinks) -Or (-Not $downloadLinks)) { if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
if ((($p | % {$_.Trim('/')}) -Contains "archive") -And $info[0].tag_name) { if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive") -and $info[0].tag_name) {
for ($i = 0; $i -lt $p.Length; $i++) { for ($i = 0; $i -lt $p.Length; $i++) {
if ($p[$i].Trim('/') -eq "archive") { if ($p[$i].Trim('/') -eq "archive") {
$p[$i+1] = $info[0].tag_name + ".zip" $p[$i + 1] = $info[0].tag_name + ".zip"
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -Join '') $downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
return $downloadLinks return $downloadLinks
} }
} }
@ -188,11 +194,11 @@ function Fetch-DownloadUrl {
$downloadLinks = $temp | Where-Object { (Match-Filenames $url $_ true) -eq $charCount } $downloadLinks = $temp | Where-Object { (Match-Filenames $url $_ true) -eq $charCount }
if (($null -eq $downloadLinks) -Or (-Not $downloadLinks)) { if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
throw "No suitable download links matched for the url!" throw "No suitable download links matched for the url!"
} }
if (-Not($downloadLinks -is [String])) { if (-not($downloadLinks -is [String])) {
throw "Found multiple matches for the same url:`n" + $downloadLinks throw "Found multiple matches for the same url:`n" + $downloadLinks
} }
@ -211,7 +217,7 @@ foreach ($s in $sources) {
$downloadUrl = Fetch-DownloadUrl $s.url $downloadUrl = Fetch-DownloadUrl $s.url
if (($null -eq $downloadUrl) -Or ($downloadUrl -eq '')) { if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
Write-Verbose "No new links were found" Write-Verbose "No new links were found"
continue continue
} }
@ -222,15 +228,15 @@ foreach ($s in $sources) {
$version = '' $version = ''
if ( ($url.Segments[-3] -eq "download/") -And ($url.Segments[-2].StartsWith("v")) ) { if (($url.Segments[-3] -eq "download/") -and ($url.Segments[-2].StartsWith("v"))) {
$version = $url.Segments[-2].TrimStart('v').TrimEnd('/') $version = $url.Segments[-2].TrimStart('v').TrimEnd('/')
} }
if ( ($url.Segments[-2] -eq "archive/") ) { if (($url.Segments[-2] -eq "archive/")) {
$version = [System.IO.Path]::GetFileNameWithoutExtension($url.Segments[-1].TrimStart('v').TrimEnd('/')) $version = [System.IO.Path]::GetFileNameWithoutExtension($url.Segments[-1].TrimStart('v').TrimEnd('/'))
} }
if ( $version -eq '' ) { if ($version -eq '') {
throw "Unable to extract version from url string" throw "Unable to extract version from url string"
} }
@ -255,11 +261,11 @@ if ($count -eq 0) {
return return
} }
if ( $Env:APPVEYOR -eq 'True' ) { if ($Env:APPVEYOR -eq 'True') {
Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information Add-AppveyorMessage -Message "Successfully updated $count dependencies." -Category Information
} }
if ( $Env:GITHUB_ACTIONS -eq 'true' ) { if ($Env:GITHUB_ACTIONS -eq 'true') {
Write-Output "::notice title=Task Complete::Successfully updated $count dependencies." Write-Output "::notice title=Task Complete::Successfully updated $count dependencies."
} }

View File

@ -32,17 +32,19 @@ function Delete-Existing($path) {
function Extract-Archive($source, $target) { function Extract-Archive($source, $target) {
Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'") Write-Verbose $("Extracting Archive '$cmder_root\vendor\" + $source.replace('/','\') + " to '$cmder_root\vendor\$target'")
Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null" Invoke-Expression "7z x -y -o`"$($target)`" `"$source`" > `$null"
if ($lastexitcode -ne 0) { if ($LastExitCode -ne 0) {
Write-Error "Extracting of $source failed" Write-Error "Extracting of $source failed"
} }
Remove-Item $source Remove-Item $source
} }
function Create-Archive($source, $target, $params) { function Create-Archive($source, $target, $params) {
$command = "7z a -xr@`"$source\packignore`" $params `"$target`" `"$source\*`" > `$null" $command = "7z a -x@`"$source\packignore`" $params `"$target`" `"*`" > `$null"
Write-Verbose "Creating Archive from '$source' in '$target' with parameters '$params'" Write-Verbose "Creating Archive from '$source' in '$target' with parameters '$params'"
Push-Location $source
Invoke-Expression $command Invoke-Expression $command
if ($lastexitcode -ne 0) { Pop-Location
if ($LastExitCode -ne 0) {
Write-Error "Compressing $source failed" Write-Error "Compressing $source failed"
} }
} }
@ -54,7 +56,7 @@ function Flatten-Directory($name) {
$moving = "$($name)_moving" $moving = "$($name)_moving"
Rename-Item $name -NewName $moving Rename-Item $name -NewName $moving
Write-Verbose "Flattening the '$name' directory..." Write-Verbose "Flattening the '$name' directory..."
$child = (Get-Childitem $moving)[0] | Resolve-Path $child = (Get-ChildItem $moving)[0] | Resolve-Path
Move-Item -Path $child -Destination $name Move-Item -Path $child -Destination $name
Remove-Item -Recurse $moving Remove-Item -Recurse $moving
} }
@ -78,7 +80,7 @@ function Set-GHVariable {
Write-Verbose "Setting CI variable $Name to $Value" -Verbose Write-Verbose "Setting CI variable $Name to $Value" -Verbose
if ($env:GITHUB_ENV) { if ($env:GITHUB_ENV) {
echo "$Name=$Value" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 Write-Output "$Name=$Value" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
} }
} }
@ -98,8 +100,8 @@ function Get-VersionStr {
# Determine if git is available # Determine if git is available
if (Get-Command "git.exe" -ErrorAction SilentlyContinue) { if (Get-Command "git.exe" -ErrorAction SilentlyContinue) {
# Determine if the current diesctory is a git repository # Determine if the current directory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue $GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -ErrorAction SilentlyContinue
if ( $GitPresent -eq 'true' ) { if ( $GitPresent -eq 'true' ) {
$string = Invoke-Expression "git describe --abbrev=0 --tags" $string = Invoke-Expression "git describe --abbrev=0 --tags"
@ -130,7 +132,7 @@ function Parse-Changelog($file) {
[regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$'; [regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$';
# Find the first match of the version string which means the latest version # Find the first match of the version string which means the latest version
$version = Select-String -Path $file -Pattern $regex | Select-Object -First 1 | % { $_.Matches.Groups[1].Value } $version = Select-String -Path $file -Pattern $regex | Select-Object -First 1 | ForEach-Object { $_.Matches.Groups[1].Value }
return $version return $version
} }
@ -226,16 +228,16 @@ function Download-File {
$useBitTransfer = $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and ($PSVersionTable.PSVersion.Major -le 5) $useBitTransfer = $null -ne (Get-Module -Name BitsTransfer -ListAvailable) -and ($PSVersionTable.PSVersion.Major -le 5)
$File = $File -Replace "/", "\" $File = $File -replace "/", "\"
try { try {
if ($useBitTransfer) { if ($useBitTransfer) {
Start-BitsTransfer -Source $Url -Destination $File -DisplayName "Downloading $Url to $File" Start-BitsTransfer -Source $Url -Destination $File -DisplayName "Downloading '$Url' to $File"
Return return
} }
} }
catch { catch {
Write-Error "Failed to download file using BITS, reason: $_`nUsing fallback method instead...`n" Write-Error "Failed to download file using BITS, reason: $_`nUsing fallback method instead...`n" -ErrorAction:Continue
} }
Write-Verbose "Downloading from $Url to $File`n" Write-Verbose "Downloading from $Url to $File`n"

View File

@ -549,14 +549,14 @@
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
<value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/> <value name="Cmd1" type="string" data="*set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
</key> </key>
<key name="Task8" modified="2018-02-22 06:05:13" build="171109"> <key name="Task8" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::bash}"/> <value name="Name" type="string" data="{bash::bash}"/>
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/> <value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/> <value name="GuiArgs" type="string" data=" /icon &quot;%CMDER_ROOT%\icons\cmder.ico&quot;"/>
<value name="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/> <value name="Cmd1" type="string" data="set &quot;PATH=%ConEmuDir%\..\git-for-windows\usr\bin;%PATH%&quot; &amp; %ConEmuDir%\..\git-for-windows\git-cmd.exe --no-cd --command=%ConEmuBaseDirShort%\conemu-msys2-64.exe &quot;%ConEmuDir%\..\git-for-windows\usr\bin\bash.exe&quot; --login -i"/>
<value name="Active" type="long" data="0"/> <value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/> <value name="Count" type="long" data="1"/>
</key> </key>

View File

@ -1,6 +1,6 @@
@echo off @echo off
set CMDER_ROOT=%~dp0..\ set CMDER_ROOT=%~dp0..\..\
if "%cmder_init%" == "1" ( if "%cmder_init%" == "1" (
"%CMDER_ROOT%\vendor\clink\clink.bat" inject -q --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor" "%CMDER_ROOT%\vendor\clink\clink.bat" inject -q --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor"
@ -8,6 +8,6 @@ if "%cmder_init%" == "1" (
set cmder_init=1 set cmder_init=1
) )
pushd %CMDER_ROOT% pushd "%CMDER_ROOT%"
call "%CMDER_ROOT%\vendor\init.bat" /f call "%CMDER_ROOT%\vendor\init.bat" /f %*
popd popd

8
vendor/bin/excd.cmd vendored Normal file
View File

@ -0,0 +1,8 @@
@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%

259
vendor/clink.lua vendored
View File

@ -3,7 +3,12 @@
-- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED -- !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
-- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts -- !!! Use "%CMDER_ROOT%\config\<whatever>.lua" to add your lua startup scripts
-- luacheck: globals clink -- luacheck: globals CMDER_SESSION
-- 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 clink io.popenyield os.isdir settings.get
-- At first, load the original clink.lua file -- At first, load the original clink.lua file
-- this is needed as we set the script path to this dir and therefore the original -- this is needed as we set the script path to this dir and therefore the original
@ -28,29 +33,55 @@ end
local function get_clean_color() local function get_clean_color()
return clean_color or "\x1b[1;37;49m" return clean_color or "\x1b[37;1m" -- White, Bold
end end
local function get_dirty_color() local function get_dirty_color()
return dirty_color or "\x1b[33;3m" return dirty_color or "\x1b[33;3m" -- Yellow, Italic
end end
local function get_conflict_color() local function get_conflict_color()
return conflict_color or "\x1b[31;1m" return conflict_color or "\x1b[31;1m" -- Red, Bold
end end
local function get_unknown_color() local function get_unknown_color()
return unknown_color or "\x1b[37;1m" return unknown_color or "\x1b[37;1m" -- White, Bold
end 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) local function escape_gsub_find_arg(text)
s = string.gsub(s, "%%", "%%%%") return text and text:gsub("([-+*?.%%()%[%]$^])", "%%%1") or ""
return s 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 end
-- Extracts only the folder name from the input Path -- Extracts only the folder name from the input Path
@ -148,19 +179,21 @@ local function set_prompt_filter()
end end
if prompt_useHomeSymbol and string.find(cwd, clink.get_env("HOME")) then 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 end
uah = '' local uah = ''
if prompt_useUserAtHost then if prompt_useUserAtHost then
uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' ' uah = clink.get_env("USERNAME") .. "@" .. clink.get_env("COMPUTERNAME") .. ' '
end end
cr = "\n" local cr = "\n"
if prompt_singleLine then if prompt_singleLine then
cr = ' ' cr = ' '
end end
cr = "\x1b[0m" .. cr
if env ~= nil then env = "("..env..") " else env = "" end if env ~= nil then env = "("..env..") " else env = "" end
if uah ~= '' then uah = get_uah_color() .. uah end if uah ~= '' then uah = get_uah_color() .. uah end
@ -168,15 +201,15 @@ local function set_prompt_filter()
local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or "" local version_control = prompt_includeVersionControl and "{git}{hg}{svn}" or ""
prompt = "{uah}{cwd}" .. version_control .. get_lamb_color() .. cr .. "{env}{lamb} \x1b[0m" local prompt = "{uah}{cwd}" .. version_control .. cr .. get_lamb_color() .. "{env}{lamb}\x1b[0m "
prompt = string.gsub(prompt, "{uah}", uah) prompt = gsub_plain(prompt, "{uah}", uah)
prompt = string.gsub(prompt, "{cwd}", cwd) prompt = gsub_plain(prompt, "{cwd}", cwd)
prompt = string.gsub(prompt, "{env}", env) prompt = gsub_plain(prompt, "{env}", env)
clink.prompt.value = string.gsub(prompt, "{lamb}", prompt_lambSymbol) clink.prompt.value = gsub_plain(prompt, "{lamb}", prompt_lambSymbol)
end end
local function percent_prompt_filter() local function percent_prompt_filter()
clink.prompt.value = string.gsub(clink.prompt.value, "{percent}", "%%") clink.prompt.value = gsub_plain(clink.prompt.value, "{percent}", "%")
end end
--- ---
@ -189,7 +222,7 @@ end
local function get_dir_contains(path, dirname) local function get_dir_contains(path, dirname)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) local function pathname(path) -- luacheck: ignore 432
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -199,14 +232,14 @@ local function get_dir_contains(path, dirname)
end end
-- Navigates up one level -- Navigates up one level
local function up_one_level(path) local function up_one_level(path) -- luacheck: ignore 432
if path == nil then path = '.' end if path == nil then path = '.' end
if path == '.' then path = clink.get_cwd() end if path == '.' then path = clink.get_cwd() end
return pathname(path) return pathname(path)
end end
-- Checks if provided directory contains git directory -- Checks if provided directory contains git directory
local function has_specified_dir(path, specified_dir) local function has_specified_dir(path, specified_dir) -- luacheck: ignore 432
if path == nil then path = '.' end if path == nil then path = '.' end
local found_dirs = clink.find_dirs(path..'/'..specified_dir) local found_dirs = clink.find_dirs(path..'/'..specified_dir)
if #found_dirs > 0 then return true end if #found_dirs > 0 then return true end
@ -234,7 +267,7 @@ end
local function get_git_dir(path) local function get_git_dir(path)
-- return parent path for specified entry (either file or directory) -- return parent path for specified entry (either file or directory)
local function pathname(path) local function pathname(path) -- luacheck: ignore 432
local prefix = "" local prefix = ""
local i = path:find("[\\/:][^\\/:]*$") local i = path:find("[\\/:][^\\/:]*$")
if i then if i then
@ -253,7 +286,8 @@ local function get_git_dir(path)
local gitfile = io.open(dir..'/.git') local gitfile = io.open(dir..'/.git')
if not gitfile then return false end if not gitfile then return false end
local git_dir = gitfile:read():match('gitdir: (.*)') local line = gitfile:read() or ''
local git_dir = line:match('gitdir: (.*)')
gitfile:close() gitfile:close()
if os.isdir then -- only available in Clink v1.0.0 and higher if os.isdir then -- only available in Clink v1.0.0 and higher
@ -301,6 +335,9 @@ local function get_git_branch(git_dir)
local HEAD = head_file:read() local HEAD = head_file:read()
head_file:close() head_file:close()
-- If HEAD is missing, something is wrong.
if not HEAD then return end
-- if HEAD matches branch expression, then we're on named branch -- if HEAD matches branch expression, then we're on named branch
-- otherwise it is a detached commit -- otherwise it is a detached commit
local branch_name = HEAD:match('ref: refs/heads/(.+)') local branch_name = HEAD:match('ref: refs/heads/(.+)')
@ -320,6 +357,9 @@ local function get_hg_branch()
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\"" -- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
local cmd = "hg branch 2>nul" local cmd = "hg branch 2>nul"
local file = io.popen(cmd) local file = io.popen(cmd)
if not file then
return false
end
for line in file:lines() do for line in file:lines() do
local m = line:match("(.+)$") local m = line:match("(.+)$")
@ -337,8 +377,12 @@ end
-- Find out current branch -- Find out current branch
-- @return {false|svn branch name} -- @return {false|svn branch name}
--- ---
local function get_svn_branch(svn_dir) local function get_svn_branch()
local file = io_popenyield("svn info 2>nul") local file = io_popenyield("svn info 2>nul")
if not file then
return false
end
for line in file:lines() do for line in file:lines() do
local m = line:match("^Relative URL:") local m = line:match("^Relative URL:")
if m then if m then
@ -357,12 +401,16 @@ end
--- ---
local function get_git_status() local function get_git_status()
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul") local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
if not file then
return {}
end
local conflict_found = false local conflict_found = false
local is_status = true local is_status = true
for line in file:lines() do for line in file:lines() do
local code = line:sub(1, 2) local code = line:sub(1, 2)
-- print (string.format("code: %s, line: %s", code, line)) -- print (string.format("code: %s, line: %s", code, line))
if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then if code == "DD" or code == "AU" or code == "UD" or code == "UA" or code == "DU" or code == "AA" or code == "UU" then -- luacheck: no max line length
is_status = false is_status = false
conflict_found = true conflict_found = true
break break
@ -372,37 +420,78 @@ local function get_git_status()
end end
end end
file:close() file:close()
return { status = is_status, conflict = conflict_found } return { status = is_status, conflict = conflict_found }
end end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_hg_status()
local file = io.popen("hg status -0")
for line in file:lines() do
file:close()
return false
end
file:close()
return true
end
--- ---
-- Get the status of working dir -- Get the status of working dir
-- @return {bool} -- @return {bool}
--- ---
local function get_svn_status() local function get_svn_status()
local file = io_popenyield("svn status -q") local file = io_popenyield("svn status -q")
for line in file:lines() do if not file then
return { error = true }
end
for line in file:lines() do -- luacheck: ignore 512, no unused
file:close() file:close()
return false return { clean = false }
end end
file:close() file:close()
return { clean = true }
end
---
-- Get the status of working dir
-- @return {bool}
---
local last_git_status_time = nil
local last_git_status_setting = true
local function get_git_status_setting()
local time = os.clock()
local last_time = last_git_status_time
last_git_status_time = time
if last_time and time >= 0 and time - last_time < 10 then
return last_git_status_setting
end
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
last_git_status_setting = true
return true
end
end
local gitStatusConfig = io_popenyield("git --no-pager config cmder.status 2>nul")
if gitStatusConfig then
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitStatusConfig:close()
end
local gitCmdStatusConfig = io_popenyield("git --no-pager config cmder.cmdstatus 2>nul")
if gitCmdStatusConfig then
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
last_git_status_setting = false
return false
end
end
gitCmdStatusConfig:close()
end
last_git_status_setting = true
return true return true
end end
@ -412,7 +501,9 @@ end
--- ---
local function get_git_info_table() local function get_git_info_table()
local info = clink_promptcoroutine(function () local info = clink_promptcoroutine(function ()
return get_git_status() -- Use git status if allowed.
local cmderGitStatusOptIn = get_git_status_setting()
return cmderGitStatusOptIn and get_git_status() or {}
end) end)
if not info then if not info then
info = cached_info.git_info or {} info = cached_info.git_info or {}
@ -422,42 +513,6 @@ local function get_git_info_table()
return info return info
end end
---
-- Get the status of working dir
-- @return {bool}
---
local function get_git_status_setting()
-- When async prompt filtering is available, check the
-- prompt_overrideGitStatusOptIn config setting for whether to ignore the
-- cmder.status and cmder.cmdstatus git config opt-in settings.
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") then
if prompt_overrideGitStatusOptIn then
return true
end
end
local gitStatusConfig = io.popen("git --no-pager config cmder.status 2>nul")
for line in gitStatusConfig:lines() do
if string.match(line, 'false') then
gitStatusConfig:close()
return false
end
end
local gitCmdStatusConfig = io.popen("git --no-pager config cmder.cmdstatus 2>nul")
for line in gitCmdStatusConfig:lines() do
if string.match(line, 'false') then
gitCmdStatusConfig:close()
return false
end
end
gitStatusConfig:close()
gitCmdStatusConfig:close()
return true
end
local function git_prompt_filter() local function git_prompt_filter()
-- Don't do any git processing if the prompt doesn't want to show git info. -- Don't do any git processing if the prompt doesn't want to show git info.
@ -475,7 +530,6 @@ local function git_prompt_filter()
local git_dir = get_git_dir() local git_dir = get_git_dir()
local color local color
cmderGitStatusOptIn = get_git_status_setting()
if git_dir then if git_dir then
local branch = get_git_branch(git_dir) local branch = get_git_branch(git_dir)
if branch then if branch then
@ -485,9 +539,8 @@ local function git_prompt_filter()
cached_info.git_dir = git_dir cached_info.git_dir = git_dir
cached_info.git_branch = branch cached_info.git_branch = branch
end end
-- Use git status if allowed.
if cmderGitStatusOptIn then -- If we're inside of git repo then try to detect current branch
-- if we're inside of git repo then try to detect current branch
-- Has branch => therefore it is a git folder, now figure out status -- Has branch => therefore it is a git folder, now figure out status
local gitInfo = get_git_info_table() local gitInfo = get_git_info_table()
local gitStatus = gitInfo.status local gitStatus = gitInfo.status
@ -504,16 +557,14 @@ local function git_prompt_filter()
if gitConflict then if gitConflict then
color = colors.conflict color = colors.conflict
end end
else
color = colors.nostatus clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", " "..color.."("..branch..")")
end
clink.prompt.value = string.gsub(clink.prompt.value, "{git}", " "..color.."("..verbatim(branch)..")")
return false return false
end end
end end
-- No git present or not in git file -- 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 return false
end end
@ -524,8 +575,6 @@ local function hg_prompt_filter()
return false return false
end end
local result = ""
local hg_dir = get_hg_dir() local hg_dir = get_hg_dir()
if hg_dir then if hg_dir then
-- Colors for mercurial status -- Colors for mercurial status
@ -547,16 +596,20 @@ local function hg_prompt_filter()
local color = colors.clean local color = colors.clean
local pipe = io.popen("hg status -amrd 2>&1") local pipe = io.popen("hg status -amrd 2>&1")
local output = pipe:read('*all') if pipe then
local rc = { pipe:close() } output = pipe:read('*all')
pipe:close()
if output ~= nil and output ~= "" then color = colors.dirty end if output ~= nil and output ~= "" then color = colors.dirty end
result = color .. "(" .. branch .. ")" end
local result = color .. "(" .. branch .. ")"
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
return false
end end
end end
clink.prompt.value = string.gsub(clink.prompt.value, "{hg}", " "..verbatim(result)) -- No hg present or not in hg repo
return false clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
end end
local function svn_prompt_filter() local function svn_prompt_filter()
@ -577,7 +630,6 @@ local function svn_prompt_filter()
if svn_dir then if svn_dir then
-- if we're inside of svn repo then try to detect current branch -- if we're inside of svn repo then try to detect current branch
local branch = get_svn_branch() local branch = get_svn_branch()
local color
if branch then if branch then
-- If in a different repo or branch than last time, discard cached info -- If in a different repo or branch than last time, discard cached info
if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then if cached_info.svn_dir ~= svn_dir or cached_info.svn_branch ~= branch then
@ -587,7 +639,7 @@ local function svn_prompt_filter()
end end
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call -- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
local svnStatus local svnStatus
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
svnStatus = clink_promptcoroutine(function () svnStatus = clink_promptcoroutine(function ()
return get_svn_status() return get_svn_status()
end) end)
@ -601,21 +653,22 @@ local function svn_prompt_filter()
svnStatus = get_svn_status() svnStatus = get_svn_status()
end end
if svnStatus == nil then local color
if not svnStatus or svnStatus.error then
color = colors.nostatus color = colors.nostatus
elseif svnStatus then elseif svnStatus.clean then
color = colors.clean color = colors.clean
else else
color = colors.dirty color = colors.dirty
end 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 return false
end end
end end
-- No svn present or not in svn file -- 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 return false
end end

View File

@ -1,6 +1,10 @@
# For explanation of these and other settings see: # For explanation of these and other settings see:
# https://chrisant996.github.io/clink/clink.html # 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 # name: Sets how command history expansion is applied
# type: enum # type: enum
# options: off,on,not_squoted,not_dquoted,not_quoted # options: off,on,not_squoted,not_dquoted,not_quoted
@ -8,12 +12,21 @@ history.expand_mode = not_dquoted
# name: Skip adding lines prefixed with whitespace # name: Skip adding lines prefixed with whitespace
# type: boolean # type: boolean
history.ignore_space = False history.ignore_space = True
# name: The number of history lines to save # name: The number of history lines to save
# type: integer # type: integer
history.max_lines = 10000 history.max_lines = 25000
# name: Share history between instances # name: Share history between instances
# type: boolean # type: boolean
history.shared = True history.shared = False
# name: Auto-answer terminate prompt
# type: enum
# options: off,answer_yes,answer_no
cmd.auto_answer = answer_yes
# name: Doskey completions
# type: color
color.doskey = yellow

6
vendor/cmder.sh vendored
View File

@ -33,11 +33,11 @@ CMDER_ROOT=$(echo $CMDER_ROOT | sed 's:/*$::')
export CMDER_ROOT export CMDER_ROOT
if [ -d "/c/Program Files/Git" ] ; then if [ -f "/c/Program Files/Git/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT="/c/Program Files/Git" GIT_INSTALL_ROOT="/c/Program Files/Git"
elif [ -d "/c/Program Files(x86)/Git" ] ; then elif [ -f "/c/Program Files(x86)/Git/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT="/c/Program Files(x86)/Git" GIT_INSTALL_ROOT="/c/Program Files(x86)/Git"
elif [ -d "${CMDER_ROOT}/vendor/git-for-windows" ] ; then elif [ -f "${CMDER_ROOT}/vendor/git-for-windows/cmd/git.exe" ] ; then
GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows GIT_INSTALL_ROOT=${CMDER_ROOT}/vendor/git-for-windows
fi fi

View File

@ -45,7 +45,9 @@ prompt_overrideSvnStatusOptIn = false
-- Prompt Attributes -- Prompt Attributes
-- --
-- Colors -- 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" -- Green: "\x1b[1;33;49m"
-- Yellow: "\x1b[1;32;49m" -- Yellow: "\x1b[1;32;49m"
-- Light Grey: "\x1b[1;30;49m" -- Light Grey: "\x1b[1;30;49m"
@ -54,7 +56,7 @@ prompt_overrideSvnStatusOptIn = false
uah_color = "\x1b[1;33;49m" -- Green = uah = [user]@[hostname] uah_color = "\x1b[1;33;49m" -- Green = uah = [user]@[hostname]
cwd_color = "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory cwd_color = "\x1b[1;32;49m" -- Yellow cwd = Current Working Directory
lamb_color = "\x1b[1;30;49m" -- Light Grey = Lambda Color lamb_color = "\x1b[1;30;49m" -- Light Grey = Lambda Color
clean_color = "\x1b[1;37;49m" clean_color = "\x1b[37;1m"
dirty_color = "\x1b[33;3m" dirty_color = "\x1b[33;3m" -- Yellow, Italic
conflict_color = "\x1b[31;1m" conflict_color = "\x1b[31;1m" -- Red, Bold
unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color unknown_color = "\x1b[37;1m" -- White = No VCS Status Branch Color

204
vendor/init.bat vendored
View File

@ -2,7 +2,7 @@
set CMDER_INIT_START=%time% set CMDER_INIT_START=%time%
:: Init Script for cmd.exe :: Init Script for cmd.exe shell
:: Created as part of cmder project :: Created as part of cmder project
:: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED :: !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
@ -23,7 +23,7 @@ if not defined fast_init set fast_init=0
:: Use /max_depth 1-5 to set max recurse depth for calls to `enhance_path_recursive` :: Use /max_depth 1-5 to set max recurse depth for calls to `enhance_path_recursive`
if not defined max_depth set max_depth=1 if not defined max_depth set max_depth=1
:: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of thr path. :: Add *nix tools to end of path. 0 turns off *nix tools, 2 adds *nix tools to the front of the path.
if not defined nix_tools set nix_tools=1 if not defined nix_tools set nix_tools=1
set "CMDER_USER_FLAGS= " set "CMDER_USER_FLAGS= "
@ -44,10 +44,11 @@ if not defined CMDER_ROOT (
:: Remove trailing '\' from %CMDER_ROOT% :: Remove trailing '\' from %CMDER_ROOT%
if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%" if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
:: Include Cmder libraries
call "%cmder_root%\vendor\bin\cexec.cmd" /setpath call "%cmder_root%\vendor\bin\cexec.cmd" /setpath
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_base" call "%cmder_root%\vendor\lib\lib_base"
call "%cmder_root%\vendor\lib\lib_path" call "%cmder_root%\vendor\lib\lib_path"
call "%cmder_root%\vendor\lib\lib_console"
call "%cmder_root%\vendor\lib\lib_git" call "%cmder_root%\vendor\lib\lib_git"
call "%cmder_root%\vendor\lib\lib_profile" call "%cmder_root%\vendor\lib\lib_profile"
@ -58,9 +59,9 @@ call "%cmder_root%\vendor\lib\lib_profile"
set fast_init=1 set fast_init=1
) else if /i "%1" == "/t" ( ) else if /i "%1" == "/t" (
set time_init=1 set time_init=1
) else if /i "%1"=="/v" ( ) else if /i "%1" == "/v" (
set verbose_output=1 set verbose_output=1
) else if /i "%1"=="/d" ( ) else if /i "%1" == "/d" (
set debug_output=1 set debug_output=1
) else if /i "%1" == "/max_depth" ( ) else if /i "%1" == "/max_depth" (
if "%~2" geq "1" if "%~2" leq "5" ( if "%~2" geq "1" if "%~2" leq "5" (
@ -88,10 +89,10 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "GIT_INSTALL_ROOT=%~2" set "GIT_INSTALL_ROOT=%~2"
shift shift
) else ( ) else (
%print_error% "The Git install root folder "%~2", you specified does not exist!" %print_error% "The Git install root folder "%~2" that you specified does not exist!"
exit /b exit /b
) )
) else if /i "%1"=="/nix_tools" ( ) else if /i "%1" == "/nix_tools" (
if "%2" equ "0" ( if "%2" equ "0" (
REM Do not add *nix tools to path REM Do not add *nix tools to path
set nix_tools=0 set nix_tools=0
@ -110,7 +111,7 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "HOME=%~2" set "HOME=%~2"
shift shift
) else ( ) else (
%print_error% The home folder "%2", you specified does not exist! %print_error% The home folder "%2" that you specified does not exist!
exit /b exit /b
) )
) else if /i "%1" == "/svn_ssh" ( ) else if /i "%1" == "/svn_ssh" (
@ -120,131 +121,174 @@ call "%cmder_root%\vendor\lib\lib_profile"
set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%" set "CMDER_USER_FLAGS=%1 %CMDER_USER_FLAGS%"
) )
shift shift
goto var_loop goto :var_loop
:start :start
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES :: Enable console related methods if verbose/debug is turned on
if %debug_output% gtr 0 (set print_debug=%lib_console% debug_output)
if %verbose_output% gtr 0 (
set print_verbose=%lib_console% verbose_output
set print_warning=%lib_console% show_warning
)
:: Sets CMDER_SHELL, CMDER_CLINK, CMDER_ALIASES variables
%lib_base% cmder_shell %lib_base% cmder_shell
%print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%" %print_debug% init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
%print_debug% init.bat "Env Var - debug_output=%debug_output%" %print_debug% init.bat "Env Var - debug_output=%debug_output%"
:: Set the Cmder directory paths
set CMDER_CONFIG_DIR=%CMDER_ROOT%\config
:: Check if we're using Cmder individual user profile
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
%print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!" %print_debug% init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"
if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt" if not exist "%CMDER_USER_CONFIG%\..\opt" md "%CMDER_USER_CONFIG%\..\opt"
set CMDER_CONFIG_DIR=%CMDER_USER_CONFIG%
) )
:: Pick right version of clink if not "%CMDER_SHELL%" == "cmd" (
%print_warning% "Incompatible 'ComSpec/Shell' Detected: %CMDER_SHELL%"
set CMDER_CLINK=0
set CMDER_ALIASES=0
)
:: Pick the right version of Clink
:: TODO: Support for ARM
if "%PROCESSOR_ARCHITECTURE%"=="x86" ( if "%PROCESSOR_ARCHITECTURE%"=="x86" (
set clink_architecture=x86 set clink_architecture=x86
set architecture_bits=32 set architecture_bits=32
) else ( ) else if "%PROCESSOR_ARCHITECTURE%"=="AMD64" (
set clink_architecture=x64 set clink_architecture=x64
set architecture_bits=64 set architecture_bits=64
) else (
%print_warning% "Incompatible Processor Detected: %PROCESSOR_ARCHITECTURE%"
set CMDER_CLINK=0
) )
if "%CMDER_CLINK%" == "1" ( if "%CMDER_CLINK%" == "1" (
REM TODO: Detect if clink is already injected, if so goto :CLINK_FINISH
goto :INJECT_CLINK
)
goto :SKIP_CLINK
:INJECT_CLINK
%print_verbose% "Injecting Clink!" %print_verbose% "Injecting Clink!"
:: Run clink :: Check if Clink is not present
if defined CMDER_USER_CONFIG ( if not exist "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" (
if not exist "%CMDER_USER_CONFIG%\settings" if not exist "%CMDER_USER_CONFIG%\clink_settings" ( %print_error% "Clink executable is not present in 'vendor\clink\clink_%clink_architecture%.exe'"
echo Generating clink initial settings in "%CMDER_USER_CONFIG%\clink_settings" goto :SKIP_CLINK
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_USER_CONFIG%\clink_settings"
echo Additional *.lua files in "%CMDER_USER_CONFIG%" are loaded on startup.
) )
if not exist "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" ( :: Run Clink
echo Creating Cmder prompt config file: "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" if not exist "%CMDER_CONFIG_DIR%\settings" if not exist "%CMDER_CONFIG_DIR%\clink_settings" (
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_USER_CONFIG%\cmder_prompt_config.lua" echo Generating Clink initial settings in "%CMDER_CONFIG_DIR%\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_CONFIG_DIR%\clink_settings"
echo Additional *.lua files in "%CMDER_CONFIG_DIR%" are loaded on startup.
) )
REM Cleanup lagacy Clink Settings file if not exist "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua" (
if exist "%CMDER_USER_CONFIG%\settings" if exist "%CMDER_USER_CONFIG%\clink_settings" ( echo Creating Cmder prompt config file: "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
del "%CMDER_USER_CONFIG%\settings" copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_CONFIG_DIR%\cmder_prompt_config.lua"
) )
REM Cleanup legacy CLink history file :: Cleanup legacy Clink Settings file
if exist "%CMDER_USER_CONFIG%\.history" if exist "%CMDER_USER_CONFIG%\clink_history" ( if exist "%CMDER_CONFIG_DIR%\settings" if exist "%CMDER_CONFIG_DIR%\clink_settings" (
del "%CMDER_USER_CONFIG%\.history" del "%CMDER_CONFIG_DIR%\settings"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_USER_CONFIG%" --scripts "%CMDER_ROOT%\vendor"
) else (
if not exist "%CMDER_ROOT%\config\settings" if not exist "%CMDER_ROOT%\config\clink_settings" (
echo Generating clink initial settings in "%CMDER_ROOT%\config\clink_settings"
copy "%CMDER_ROOT%\vendor\clink_settings.default" "%CMDER_ROOT%\config\clink_settings"
echo Additional *.lua files in "%CMDER_ROOT%\config" are loaded on startup.
) )
if not exist "%CMDER_ROOT%\config\cmder_prompt_config.lua" ( :: Cleanup legacy Clink history file
echo Creating Cmder prompt config file: "%CMDER_ROOT%\config\cmder_prompt_config.lua" if exist "%CMDER_CONFIG_DIR%\.history" if exist "%CMDER_CONFIG_DIR%\clink_history" (
copy "%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default" "%CMDER_ROOT%\config\cmder_prompt_config.lua" del "%CMDER_CONFIG_DIR%\.history"
) )
REM Cleanup lagacy Clink Settings file "%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_CONFIG_DIR%" --scripts "%CMDER_ROOT%\vendor"
if exist "%CMDER_ROOT%\config\settings" if exist "%CMDER_ROOT%\config\clink_settings" (
del "%CMDER_ROOT%\config\settings" :: Check if a fatal error occurred when trying to inject Clink
if errorlevel 2 (
REM %print_error% "Clink injection has failed with error code: %errorlevel%"
goto :SKIP_CLINK
) )
REM Cleanup legacy Clink history file goto :CLINK_FINISH
if exist "%CMDER_ROOT%\config\.history" if exist "%CMDER_ROOT%\config\clink_history" (
del "%CMDER_ROOT%\config\.history"
)
"%CMDER_ROOT%\vendor\clink\clink_%clink_architecture%.exe" inject --quiet --profile "%CMDER_ROOT%\config" --scripts "%CMDER_ROOT%\vendor" :SKIP_CLINK
) %print_warning% "Skipping Clink Injection!"
) else (
%print_verbose% "WARNING: Incompatible 'ComSpec/Shell' Detetected Skipping Clink Injection!" for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
) chcp 65001>nul
:: Revert back to plain cmd.exe prompt without clink
prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m
chcp %cp%>nul
:CLINK_FINISH
if "%CMDER_CONFIGURED%" GTR "1" ( if "%CMDER_CONFIGURED%" GTR "1" (
%print_verbose% "Cmder is already configured, skipping Cmder Init!" %print_verbose% "Cmder is already configured, skipping Cmder Init!"
goto USER_ALIASES goto :USER_ALIASES
) else if "%CMDER_CONFIGURED%" == "1" ( ) else if "%CMDER_CONFIGURED%" == "1" (
%print_verbose% "Cmder is already configured, skipping to Cmder User Init!" %print_verbose% "Cmder is already configured, skipping to Cmder User Init!"
goto USER_CONFIG_START goto :USER_CONFIG_START
) )
:: Prepare for git-for-windows :: Prepare for git-for-windows
:: I do not even know, copypasted from their .bat :: Detect which git.exe version to use
set PLINK_PROTOCOL=ssh :: * if the user points to a specific git, use that
:: * test if git is in path and if yes, use that
:: The idea:
:: * if the users points as to a specific git, use that
:: * test if a git is in path and if yes, use that
:: * last, use our vendored git :: * last, use our vendored git
:: also check that we have a recent enough version of git by examining the version string :: also check that we have a recent enough version of git by examining the version string
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :SPECIFIED_GIT
set GIT_INSTALL_ROOT=
) else if "%fast_init%" == "1" ( ) else if "%fast_init%" == "1" (
if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" ( if exist "%CMDER_ROOT%\vendor\git-for-windows\cmd\git.exe" (
%print_debug% init.bat "Skipping Git Auto-Detect!" %print_debug% init.bat "Skipping Git Auto-Detect!"
goto :VENDORED_GIT goto :VENDORED_GIT
) )
%print_debug% init.bat "Fast init is enabled, vendored Git does not exist"
for /F "delims=" %%F in ('where git.exe 2^>nul') do (
set "EXT_GIT_EXE=%%~fF"
%print_debug% init.bat "Found User installed Git at '%%~fF'. Skipping Git Auto-Detect!"
goto :SET_ENV
)
) )
%print_debug% init.bat "Looking for Git install root..." %print_debug% init.bat "Looking for Git install root..."
:: get the version information for vendored git binary :: Get the version information for vendored git binary
%lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul %lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" 2>nul
%lib_git% validate_version VENDORED %GIT_VERSION_VENDORED% %lib_git% validate_version VENDORED %GIT_VERSION_VENDORED%
:: check if git is in path... :: Check if git is in path
for /F "delims=" %%F in ('where git.exe 2^>nul ^| find "\cmd\git.exe"') do ( for /F "delims=" %%F in ('where git.exe 2^>nul') do call :check_git "%%~fF"
:: get the absolute path to the user provided git binary
%lib_git% is_git_shim "%%~dpF"
%lib_git% get_user_git_version
%lib_git% compare_git_versions
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
goto :FOUND_GIT goto :FOUND_GIT
) ) else (
goto :VENDORED_GIT
) )
:: our last hope: our own git... :check_git
set full_path="%~f1"
if not defined GIT_INSTALL_ROOT (
if not [\%full_path:\cmd\git.exe=:%]==[\%full_path%] (
:: Get the absolute path to the user provided git binary
%lib_git% is_git_shim "%~dp1"
%lib_git% get_user_git_version
%lib_git% compare_git_versions
)
)
exit /b
:: Our last hope: use vendored git
:VENDORED_GIT :VENDORED_GIT
if exist "%CMDER_ROOT%\vendor\git-for-windows" ( if exist "%CMDER_ROOT%\vendor\git-for-windows" (
set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows" set "GIT_INSTALL_ROOT=%CMDER_ROOT%\vendor\git-for-windows"
@ -267,7 +311,7 @@ goto :CONFIGURE_GIT
:: Add git to the path :: Add git to the path
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" "" if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" %lib_path% enhance_path "%GIT_INSTALL_ROOT%\cmd" ""
:: Add the unix commands at the end to not shadow windows commands like more :: Add the unix commands at the end to not shadow windows commands like `more` and `find`
if %nix_tools% equ 1 ( if %nix_tools% equ 1 (
%print_verbose% "Preferring Windows commands" %print_verbose% "Preferring Windows commands"
set "path_position=append" set "path_position=append"
@ -287,10 +331,21 @@ if %nix_tools% geq 1 (
) )
) )
:: define SVN_SSH so we can use git svn with ssh svn repositories :SET_ENV
:: Plink (PuTTY Link) is a command-line connection tool similar to ssh, setting its protocol to ssh
set PLINK_PROTOCOL=ssh
:: Define SVN_SSH so we can use git svn with ssh svn repositories
if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe" if not defined SVN_SSH set "SVN_SSH=%GIT_INSTALL_ROOT:\=\\%\\bin\\ssh.exe"
:: Find locale.exe: From the git install root, from the path, using the git installed env, or fallback using the env from the path. :: Find locale.exe: From the git install root, from the path, using the git installed env, or fallback using the env from the path.
setlocal enabledelayedexpansion
if not defined git_locale if defined EXT_GIT_EXE (
set "GIT_INSTALL_ROOT=!EXT_GIT_EXE:\cmd\git.exe=!"
)
endlocal && set GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%
if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\locale.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\locale.exe" if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\locale.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\locale.exe"
if not defined git_locale for /F "tokens=* delims=" %%F in ('where locale.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" ) if not defined git_locale for /F "tokens=* delims=" %%F in ('where locale.exe 2^>nul') do ( if not defined git_locale set git_locale="%%F" )
if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\env.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\env.exe" /usr/bin/locale if not defined git_locale if exist "%GIT_INSTALL_ROOT%\usr\bin\env.exe" set git_locale="%GIT_INSTALL_ROOT%\usr\bin\env.exe" /usr/bin/locale
@ -298,7 +353,6 @@ if not defined git_locale for /F "tokens=* delims=" %%F in ('where env.exe 2^>nu
setlocal enabledelayedexpansion setlocal enabledelayedexpansion
if defined git_locale ( if defined git_locale (
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!" REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
if not defined LANG ( if not defined LANG (
for /F "delims=" %%F in ('!git_locale! -uU 2') do ( for /F "delims=" %%F in ('!git_locale! -uU 2') do (
@ -341,11 +395,7 @@ if defined CMDER_USER_CONFIG (
:: must also be self executing, see '.\user_aliases.cmd.default', :: must also be self executing, see '.\user_aliases.cmd.default',
:: and be in profile.d folder. :: and be in profile.d folder.
if not defined user_aliases ( if not defined user_aliases (
if defined CMDER_USER_CONFIG ( set "user_aliases=%CMDER_CONFIG_DIR%\user_aliases.cmd"
set "user_aliases=%CMDER_USER_CONFIG%\user_aliases.cmd"
) else (
set "user_aliases=%CMDER_ROOT%\config\user_aliases.cmd"
)
) )
if "%CMDER_ALIASES%" == "1" ( if "%CMDER_ALIASES%" == "1" (
@ -376,7 +426,7 @@ if "%CMDER_ALIASES%" == "1" (
) )
:: Add aliases to the environment :: 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" ( if "%ERRORLEVEL%" == "0" (
echo Migrating alias 'history' to new Clink 1.x.x... echo Migrating alias 'history' to new Clink 1.x.x...
call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history call "%CMDER_ROOT%\vendor\bin\alias.cmd" /d history
@ -385,7 +435,7 @@ if "%ERRORLEVEL%" == "0" (
call "%user_aliases%" call "%user_aliases%"
if "%CMDER_CONFIGURED%" gtr "1" goto CMDER_CONFIGURED if "%CMDER_CONFIGURED%" gtr "1" goto :CMDER_CONFIGURED
:: See vendor\git-for-windows\README.portable for why we do this :: See vendor\git-for-windows\README.portable for why we do this
:: Basically we need to execute this post-install.bat because we are :: Basically we need to execute this post-install.bat because we are

View File

@ -10,9 +10,8 @@ if "%~1" == "/h" (
exit /b 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: :::include:
:::. :::.
@ -20,16 +19,15 @@ exit /b
:::. :::.
:::usage: :::usage:
:::. :::.
::: %lib_base% show_subs "file" ::: %lib_base% help "file"
:::. :::.
:::options: :::options:
:::. :::.
::: file <in> full path to file containing lib_routines to display ::: 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"=="." ( if "%%a"=="." (
echo. echo.
) else if /i "%%a" == "usage" ( ) else if /i "%%a" == "usage" (
@ -44,9 +42,13 @@ exit /b
pause pause
exit /b 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: :::include:
:::. :::.
@ -55,29 +57,61 @@ exit /b
:::usage: :::usage:
:::. :::.
::: %lib_base% cmder_shell ::: %lib_base% cmder_shell
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:cmder_shell
call :detect_comspec %ComSpec% call :detect_comspec %ComSpec%
exit /b 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 :detect_comspec
set CMDER_SHELL=%~n1 set CMDER_SHELL=%~n1
if not defined CMDER_CLINK ( if not defined CMDER_CLINK (
set CMDER_CLINK=1 set CMDER_CLINK=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_CLINK=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_CLINK=0
) )
if not defined CMDER_ALIASES ( if not defined CMDER_ALIASES (
set CMDER_ALIASES=1 set CMDER_ALIASES=1
if "%CMDER_SHELL%" equ "tcc" set CMDER_ALIASES=0
if "%CMDER_SHELL%" equ "tccle" set CMDER_ALIASES=0
) )
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 :update_legacy_aliases
type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul type "%user_aliases%" | %WINDIR%\System32\findstr /i ";= Add aliases below here" >nul
if "%errorlevel%" == "1" ( if "%errorlevel%" == "1" (

View File

@ -2,13 +2,15 @@
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd" set lib_console=call "%~dp0lib_console.cmd"
set ESC=
:: Much faster than using "%lib_console% debug_output ..." etc. :: Much faster than using "%lib_console% debug_output ..." etc.
set print_debug=if %debug_output% gtr 0 %lib_console% debug_output set print_debug=if %debug_output% gtr 0 %lib_console% debug_output
set print_verbose=if %verbose_output% gtr 0 %lib_console% verbose_output set print_verbose=if %verbose_output% gtr 0 %lib_console% verbose_output
set print_warning=if %verbose_output% gtr 0 %lib_console% show_warning
set print_error=%lib_console% show_error set print_error=%lib_console% show_error
if "%fast_init%" == "1" exit /b if %fast_init% gtr %verbose_output% if %fast_init% gtr %debug_output% exit /b
if "%~1" == "/h" ( if "%~1" == "/h" (
%lib_base% help "%~0" %lib_base% help "%~0"
@ -38,7 +40,7 @@ exit /b
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
if %debug_output% gtr 0 echo DEBUG(%~1): %~2 & echo. if %debug_output% gtr 0 echo %time% DEBUG(%~1): %~2 & echo.
exit /b exit /b
:verbose_output :verbose_output
@ -80,5 +82,26 @@ exit /b
:::. :::.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
echo ERROR: %~1 echo %ESC%[91;1mERROR:%ESC%[0m %~1
exit /b
:show_warning
:::===============================================================================
:::show_warning - Output a warning message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_warning "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo %ESC%[93;1mWARNING:%ESC%[0m %~1
exit /b exit /b

View File

@ -12,7 +12,6 @@ if "%~1" == "/h" (
exit /b exit /b
:read_version
:::=============================================================================== :::===============================================================================
:::read_version - Get the git.exe 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 ::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:read_version
:: clear the variables :: clear the variables
set GIT_VERSION_%~1= set GIT_VERSION_%~1=
@ -55,6 +55,7 @@ exit /b
set "GIT_VERSION=%%C" set "GIT_VERSION=%%C"
) else ( ) else (
echo "'git --version' returned an improper version string!" echo "'git --version' returned an improper version string!"
%print_debug% :read_version "returned string: '%%A %%B %%C' by executable path: %git_executable%"
pause pause
exit /b exit /b
) )
@ -63,7 +64,6 @@ exit /b
exit /b exit /b
:parse_version
:::=============================================================================== :::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces :::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. ::: [SCOPE]_BUILD <out> Scoped Build version.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:parse_version
:: process a `x.x.x.xxxx.x` formatted string :: process a `x.x.x.xxxx.x` formatted string
%print_debug% :parse_version "ARGV[1]=%~1, ARGV[2]=%~2" %print_debug% :parse_version "ARGV[1]=%~1, ARGV[2]=%~2"
@ -110,9 +111,8 @@ exit /b
:endlocal_set_git_version :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: :::include:
:::. :::.
@ -128,6 +128,7 @@ exit /b
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4 ::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:validate_version
:: now parse the version information into the corresponding variables :: now parse the version information into the corresponding variables
%print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2" %print_debug% :validate_version "ARGV[1]=%~1, ARGV[2]=%~2"
@ -142,9 +143,8 @@ exit /b
) )
exit /b exit /b
:compare_versions
:::=============================================================================== :::===============================================================================
:::compare_version - Compare semantic versions return latest version. :::compare_version - Compare semantic versions and return latest version
:::. :::.
:::include: :::include:
:::. :::.
@ -160,6 +160,7 @@ exit /b
::: [SCOPE2] <in> Example: VENDOR ::: [SCOPE2] <in> Example: VENDOR
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments. :: 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. :: 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 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: :::include:
:::. :::.
@ -201,7 +207,7 @@ exit /b
:is_git_shim :is_git_shim
pushd "%~1" 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 setlocal enabledelayedexpansion
if exist git.shim ( if exist git.shim (
for /F "tokens=2 delims== " %%I in (git.shim) do ( for /F "tokens=2 delims== " %%I in (git.shim) do (
@ -218,7 +224,7 @@ exit /b
exit /b exit /b
:::=============================================================================== :::===============================================================================
:::compare_git_versions :::compare_git_versions - Compare the user git version against the vendored version
:::. :::.
:::include: :::include:
:::. :::.
@ -252,7 +258,7 @@ exit /b
:: if the user provided git executable is not found :: if the user provided git executable is not found
IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 ( IF ERRORLEVEL -255 IF NOT ERRORLEVEL -254 (
:: if not exist "%git_executable%" ( :: 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= set test_dir=
) )
) )
@ -261,7 +267,7 @@ exit /b
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: :::include:
:::. :::.
@ -278,4 +284,3 @@ exit /b
%print_debug% ":get_user_git_version" "get_user_git_version GIT_VERSION_USER: %GIT_VERSION_USER%" %print_debug% ":get_user_git_version" "get_user_git_version GIT_VERSION_USER: %GIT_VERSION_USER%"
%lib_git% validate_version USER %GIT_VERSION_USER% %lib_git% validate_version USER %GIT_VERSION_USER%
exit /b exit /b

View File

@ -1,6 +1,5 @@
@echo off @echo off
call "%~dp0lib_base.cmd" call "%~dp0lib_base.cmd"
call "%%~dp0lib_console" call "%%~dp0lib_console"
set lib_path=call "%~dp0lib_path.cmd" set lib_path=call "%~dp0lib_path.cmd"
@ -11,6 +10,13 @@ if "%~1" == "/h" (
call :%* 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 exit /b
:enhance_path :enhance_path
@ -32,13 +38,12 @@ exit /b
:::options: :::options:
::: :::
::: append <in> Append to the path env variable rather than pre-pend. ::: append <in> Append to the path env variable rather than pre-pend.
::B :::
::: :::
:::output: :::output:
::: :::
::: path <out> Sets the path env variable if required. ::: path <out> Sets the path env variable if required.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
if "%~1" neq "" ( if "%~1" neq "" (
set "add_path=%~1" set "add_path=%~1"
) else ( ) else (
@ -52,7 +57,8 @@ exit /b
set "position=" 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" ( if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%" set "add_to_path=%add_path%"
) else ( ) else (
@ -135,7 +141,6 @@ exit /b
exit /b exit /b
:set_found :set_found
if "%ERRORLEVEL%" == "0" ( if "%ERRORLEVEL%" == "0" (
set found=1 set found=1
@ -186,7 +191,7 @@ exit /b
set "position=" 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" ( if "%ERRORLEVEL%" == "0" (
set "add_to_path=%add_path%" set "add_to_path=%add_path%"
@ -223,7 +228,7 @@ exit /b
exit /b exit /b
: set_depth :set_depth
set /a "depth=%depth%+1" set /a "depth=%depth%+1"
exit /b exit /b
@ -239,4 +244,3 @@ exit /b
%print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%" %print_debug% :enhance_path_recursive "Env Var AFTER- depth=%depth%"
) )
exit /b exit /b

View File

@ -12,26 +12,26 @@ if "%~1" == "/h" (
exit /b 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: :::include:
::: :::.
::: call "lib_profile.cmd" ::: call "lib_profile.cmd"
::: :::.
:::usage: :::usage:
::: :::.
::: %lib_profile% "[dir_path]" ::: %lib_profile% "[dir_path]"
::: :::.
:::required: :::required:
::: :::.
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat. ::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin" ::: Example: "c:\bin"
::: :::.
::: path <out> Sets the path env variable if required. ::: path <out> Sets the path env variable if required.
:::------------------------------------------------------------------------------- :::-------------------------------------------------------------------------------
:run_profile_d
if not exist "%~1" ( if not exist "%~1" (
mkdir "%~1" mkdir "%~1"
) )
@ -43,4 +43,3 @@ exit /b
) )
popd popd
exit /b exit /b

83
vendor/profile.ps1 vendored
View File

@ -1,10 +1,11 @@
# Init Script for PowerShell # Init Script for PowerShell
# Created as part of cmder project # Created as part of Cmder project
# NOTE: This file must be saved using UTF-8 with BOM encoding for prompt symbol to work correctly.
# !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED # !!! THIS FILE IS OVERWRITTEN WHEN CMDER IS UPDATED
# !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands # !!! Use "%CMDER_ROOT%\config\user_profile.ps1" to add your own startup commands
$CMDER_INIT_START = $(Get-Date -UFormat %s) $CMDER_INIT_START = Get-Date
# Compatibility with PS major versions <= 2 # Compatibility with PS major versions <= 2
if (!$PSScriptRoot) { if (!$PSScriptRoot) {
@ -12,12 +13,12 @@ if (!$PSScriptRoot) {
} }
if ($ENV:CMDER_USER_CONFIG) { if ($ENV:CMDER_USER_CONFIG) {
# Write-Host "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!" Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
} }
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set. # We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
if ($null -eq $ENV:CMDER_ROOT) { if (!$ENV:CMDER_ROOT) {
if (-Not($null -eq $ENV:ConEmuDir)) { if ($ENV:ConEmuDir) {
$ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..") $ENV:CMDER_ROOT = Resolve-Path($ENV:ConEmuDir + "\..\..")
} else { } else {
$ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..") $ENV:CMDER_ROOT = Resolve-Path($PSScriptRoot + "\..")
@ -25,9 +26,8 @@ if ($null -eq $ENV:CMDER_ROOT) {
} }
# Remove trailing '\' # Remove trailing '\'
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).trimend("\") $ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
# Do not load bundled PsGet if a module installer is already available
# -> 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) $moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
@ -42,18 +42,18 @@ if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderMod
} }
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd") $gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd")
# Write-Host "GIT VENDOR: ${gitVersionVendor}" Write-Debug "GIT VENDOR: ${gitVersionVendor}"
# Get user installed Git Version[s] and Compare with vendored if found. # Get user installed Git Version[s] and Compare with vendored if found.
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) { foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
# Write-Host "GIT PATH: " + $git.Path Write-Debug "GIT PATH: {$git.Path}"
$gitDir = Split-Path -Path $git.Path $gitDir = Split-Path -Path $git.Path
$gitDir = isGitShim -gitPath $gitDir $gitDir = isGitShim -gitPath $gitDir
$gitVersionUser = (readVersion -gitPath $gitDir) $gitVersionUser = (readVersion -gitPath $gitDir)
# Write-Host "GIT USER: ${gitVersionUser}" Write-Debug "GIT USER: ${gitVersionUser}"
$useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor $useGitVersion = compare_git_versions -userVersion $gitVersionUser -vendorVersion $gitVersionVendor
# Write-Host "Using GIT Version: ${useGitVersion}" Write-Debug "Using Git Version: ${useGitVersion}"
# Use user installed Git # Use user installed Git
if ($null -eq $gitPathUser) { if ($null -eq $gitPathUser) {
@ -65,7 +65,7 @@ foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
} }
if ($useGitVersion -eq $gitVersionUser) { if ($useGitVersion -eq $gitVersionUser) {
# Write-Host "Using GIT Dir: ${gitDir}" Write-Debug "Using Git Dir: ${gitDir}"
$ENV:GIT_INSTALL_ROOT = $gitPathUser $ENV:GIT_INSTALL_ROOT = $gitPathUser
$ENV:GIT_INSTALL_TYPE = 'USER' $ENV:GIT_INSTALL_TYPE = 'USER'
break break
@ -78,14 +78,14 @@ if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
$ENV:GIT_INSTALL_TYPE = 'VENDOR' $ENV:GIT_INSTALL_TYPE = 'VENDOR'
} }
# Write-Host "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}" Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
# Write-Host "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}" Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
if (-Not ($null -eq $ENV:GIT_INSTALL_ROOT)) { 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 = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
} }
if (Get-Command -Name "vim" -ErrorAction silentlycontinue) { if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
New-Alias -name "vi" -value vim New-Alias -name "vi" -value vim
} }
@ -94,16 +94,20 @@ if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
} }
# 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 = $false $env:gitLoaded = $null
[ScriptBlock]$PrePrompt = {} [ScriptBlock]$PrePrompt = {}
[ScriptBlock]$PostPrompt = {} [ScriptBlock]$PostPrompt = {}
[ScriptBlock]$CmderPrompt = { [ScriptBlock]$CmderPrompt = {
# Check if we're currently running under Admin privileges.
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal] $identity
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
$color = "White"
if ($principal.IsInRole($adminRole)) { $color = "Red" }
$Host.UI.RawUI.ForegroundColor = "White" $Host.UI.RawUI.ForegroundColor = "White"
Write-Host -NoNewline "PS " Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
if (Get-Command git -erroraction silentlycontinue) {
checkGit($pwd.ProviderPath) checkGit($pwd.ProviderPath)
}
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray" Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
} }
@ -112,33 +116,31 @@ $env:Path = "$Env:CMDER_ROOT\bin;$Env:CMDER_ROOT\vendor\bin;$env:Path;$Env:CMDER
# Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d" # Drop *.ps1 files into "$ENV:CMDER_ROOT\config\profile.d"
# to source them at startup. # to source them at startup.
if (-Not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) { if (-not (Test-Path -PathType container "$ENV:CMDER_ROOT\config\profile.d")) {
New-Item -ItemType Directory -Path "$ENV:CMDER_ROOT\config\profile.d" New-Item -ItemType Directory -Path "$ENV:CMDER_ROOT\config\profile.d"
} }
Push-Location $ENV:CMDER_ROOT\config\profile.d Push-Location $ENV:CMDER_ROOT\config\profile.d
foreach ($x in Get-ChildItem *.psm1) { foreach ($x in Get-ChildItem *.psm1) {
# Write-Host Write-Host Sourcing $x Write-Verbose "Sourcing $x"
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.ps1) {
# Write-Host Write-Host Sourcing $x Write-Verbose "Sourcing $x"
. $x . $x
} }
Pop-Location Pop-Location
# Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d" # Drop *.ps1 files into "$ENV:CMDER_USER_CONFIG\config\profile.d"
# to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument # to source them at startup. Requires using cmder.exe /C [cmder_user_root_path] argument
if ($ENV:CMDER_USER_CONFIG -ne "" -And (Test-Path "$ENV:CMDER_USER_CONFIG\profile.d")) { if ($ENV:CMDER_USER_CONFIG -ne "" -and (Test-Path "$ENV:CMDER_USER_CONFIG\profile.d")) {
Push-Location $ENV:CMDER_USER_CONFIG\profile.d Push-Location $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.psm1) { foreach ($x in Get-ChildItem *.psm1) {
# Write-Host Write-Host Sourcing $x Write-Verbose "Sourcing $x"
Import-Module $x Import-Module $x
} }
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.ps1) {
# Write-Host Write-Host Sourcing $x Write-Verbose "Sourcing $x"
. $x . $x
} }
Pop-Location Pop-Location
@ -169,8 +171,10 @@ if ($ENV:CMDER_USER_CONFIG) {
} }
} }
if (-Not (Test-Path $CmderUserProfilePath)) { if (-not (Test-Path $CmderUserProfilePath)) {
Write-Host -BackgroundColor Darkgreen -ForegroundColor White "First Run: Creating user startup file: $CmderUserProfilePath" $CmderUserProfilePath = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($CmderUserProfilePath)
Write-Host -NoNewline "`r"
Write-Host -BackgroundColor Green -ForegroundColor Black "First Run: Creating user startup file: $CmderUserProfilePath"
Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath Copy-Item "$env:CMDER_ROOT\vendor\user_profile.ps1.default" -Destination $CmderUserProfilePath
} }
@ -190,16 +194,20 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
Custom prompt functions are loaded in as constants to get the same behaviour Custom prompt functions are loaded in as constants to get the same behaviour
#> #>
[ScriptBlock]$Prompt = { [ScriptBlock]$Prompt = {
$realLASTEXITCODE = $LASTEXITCODE $lastSUCCESS = $?
$realLastExitCode = $LastExitCode
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf $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)) {
Microsoft.PowerShell.Utility\Write-Host
}
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
CmderPrompt CmderPrompt
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
$global:LASTEXITCODE = $realLASTEXITCODE $global:LastExitCode = $realLastExitCode
return " " return " "
} }
# Once Created these code blocks cannot be overwritten # Once Created these code blocks cannot be overwritten
# if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant} # if (-not $(Get-Command PrePrompt).Options -match 'Constant') {Set-Item -Path function:\PrePrompt -Value $PrePrompt -Options Constant}
# if (-not $(Get-Command CmderPrompt).Options -match 'Constant') {Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant} # if (-not $(Get-Command CmderPrompt).Options -match 'Constant') {Set-Item -Path function:\CmderPrompt -Value $CmderPrompt -Options Constant}
@ -215,5 +223,8 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly Set-Item -Path function:\prompt -Value $Prompt -Options ReadOnly
} }
$CMDER_INIT_END = $(Get-Date -UFormat %s) $CMDER_INIT_END = Get-Date
# Write-Host "Elapsed Time: $(get-Date) `($($CMDER_INIT_END - $CMDER_INIT_START) total`)"
$ElapsedTime = New-TimeSpan -Start $CMDER_INIT_START -End $CMDER_INIT_END
Write-Verbose "Elapsed Time: $($ElapsedTime.TotalSeconds) seconds total"

View File

@ -1,7 +1,7 @@
function readVersion($gitPath) { function readVersion($gitPath) {
$gitExecutable = "${gitPath}\git.exe" $gitExecutable = "${gitPath}\git.exe"
if (!(test-path "$gitExecutable")) { if (-not (Test-Path "$gitExecutable")) {
return $null return $null
} }
@ -18,26 +18,27 @@ function readVersion($gitPath) {
} }
function isGitShim($gitPath) { function isGitShim($gitPath) {
# 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
# See: github.com/ScoopInstaller/Shim
if (test-path "${gitPath}\git.shim") { if (Test-Path "${gitPath}\git.shim") {
$shim = (get-content "${gitPath}\git.shim") $shim = (get-content "${gitPath}\git.shim")
($trash, $gitPath) = $shim.replace(' ','').split('=') ($trash, $gitPath) = $shim.replace(' ', '').split('=')
$gitPath=$gitPath.replace('\git.exe','') $gitPath = $gitPath.replace('\git.exe', '')
} }
return $gitPath.toString() return $gitPath.toString()
} }
function compareVersions($userVersion, $vendorVersion) { function compareVersions($userVersion, $vendorVersion) {
if (-not($userVersion -eq $null)) { if ($null -ne $userVersion) {
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4) ($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
} else { } else {
return -1 return -1
} }
if (-not($vendorVersion -eq $null)) { if ($null -ne $vendorVersion) {
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4) ($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
} else { } else {
return 1 return 1
@ -47,17 +48,17 @@ function compareVersions($userVersion, $vendorVersion) {
return 1 return 1
} }
if ($userMajor -gt $vendorMajor) {return 1} if ($userMajor -gt $vendorMajor) { return 1 }
if ($userMajor -lt $vendorMajor) {return -1} if ($userMajor -lt $vendorMajor) { return -1 }
if ($userMinor -gt $vendorMinor) {return 1} if ($userMinor -gt $vendorMinor) { return 1 }
if ($userMinor -lt $vendorMinor) {return -1} if ($userMinor -lt $vendorMinor) { return -1 }
if ($userPatch -gt $vendorPatch) {return 1} if ($userPatch -gt $vendorPatch) { return 1 }
if ($userPatch -lt $vendorPatch) {return -1} if ($userPatch -lt $vendorPatch) { return -1 }
if ($userBuild -gt $vendorBuild) {return 1} if ($userBuild -gt $vendorBuild) { return 1 }
if ($userBuild -lt $vendorBuild) {return -1} if ($userBuild -lt $vendorBuild) { return -1 }
return 0 return 0
} }
@ -65,45 +66,48 @@ function compareVersions($userVersion, $vendorVersion) {
function compare_git_versions($userVersion, $vendorVersion) { function compare_git_versions($userVersion, $vendorVersion) {
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion $result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
# write-host "Compare Versions Result: ${result}" Write-Debug "Compare Versions Result: ${result}"
if ($result -ge 0) { if ($result -ge 0) {
return $userVersion return $userVersion
} else { }
else {
return $vendorVersion return $vendorVersion
} }
} }
function Configure-Git($gitRoot, $gitType, $gitPathUser){ function Configure-Git($gitRoot, $gitType, $gitPathUser) {
# Proposed Behavior # Proposed Behavior
# Modify the path if we are using VENDORED Git do nothing if using USER Git. # Modify the path if we are using VENDORED Git, do nothing if using USER Git.
# If User Git is installed but older match its path config adding paths # 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 # in the same path positions allowing a user to configure Cmder Git path
# using locally installed Git Path Config. # using locally installed Git Path Config.
if ($gitType -eq 'VENDOR') { if ($gitType -eq 'VENDOR') {
# If User Git is installed replace its path config with Newer Vendored Git Path # If User Git is installed replace its path config with Newer Vendored Git Path
if ($gitPathUser -ne '' -and $gitPathUser -ne $null) { if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
# write-host "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..." Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot) $newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
} else { }
if (!($env:Path -match [regex]::Escape("$gitRoot\cmd"))) { else {
# write-host "Adding $gitRoot\cmd to the path" if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
Write-Debug "Adding $gitRoot\cmd to the path"
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path) $newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
} }
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already # 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"))) { if ((Test-Path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
# write-host "Adding $gitRoot\mingw32\bin to the path" Write-Debug "Adding $gitRoot\mingw32\bin to the path"
$newPath = "$newPath;$gitRoot\mingw32\bin" $newPath = "$newPath;$gitRoot\mingw32\bin"
} elseif ((test-path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) { }
# write-host "Adding $gitRoot\mingw64\bin to the path" 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" $newPath = "$newPath;$gitRoot\mingw64\bin"
} }
# Add "$gitRoot\usr\bin" to the path if exists and not done already # 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"))) { if ((Test-Path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
# write-host "Adding $gitRoot\usr\bin to the path" Write-Debug "Adding $gitRoot\usr\bin to the path"
$newPath = "$newPath;$gitRoot\usr\bin" $newPath = "$newPath;$gitRoot\usr\bin"
} }
} }
@ -114,53 +118,59 @@ function Configure-Git($gitRoot, $gitType, $gitPathUser){
return $env:path return $env:path
} }
function Import-Git(){ function Import-Git() {
$GitModule = Get-Module -Name Posh-Git -ListAvailable $GitModule = Get-Module -Name Posh-Git -ListAvailable
if($GitModule | select version | where version -le ([version]"0.6.1.20160330")){ if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
Import-Module Posh-Git > $null Import-Module Posh-Git > $null
} }
if($GitModule | select version | where version -ge ([version]"1.0.0")){ if ($GitModule | Select-Object version | Where-Object version -ge ([version]"1.0.0")) {
Import-Module Posh-Git > $null Import-Module Posh-Git > $null
$GitPromptSettings.AnsiConsole = $false $GitPromptSettings.AnsiConsole = $false
} }
if(-not ($GitModule) ) { if (-not $GitModule) {
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart cmder." 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"
return $false
} }
# Make sure we only run once by alawys returning true # Make sure we only run once by always returning true
return $true return $true
} }
function checkGit($Path) { function checkGit($Path) {
if (Test-Path -Path (Join-Path $Path '.git') ) { if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
if($env:gitLoaded -eq 'false') { return
}
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
$SplitPath = Split-Path $path
if ($SplitPath) { checkGit($SplitPath) }
return
}
if (getGitStatusSetting -eq $true) {
if ($null -eq $env:gitLoaded) {
$env:gitLoaded = Import-Git $env:gitLoaded = Import-Git
} }
if ($env:gitLoaded -eq $true) {
if (getGitStatusSetting -eq $true) {
Write-VcsStatus Write-VcsStatus
} else { }
}
else {
$headContent = Get-Content (Join-Path $Path '.git/HEAD') $headContent = Get-Content (Join-Path $Path '.git/HEAD')
if ($headContent -like "ref: refs/heads/*") { if ($headContent -like "ref: refs/heads/*") {
$branchName = $headContent.Substring(16) $branchName = $headContent.Substring(16)
} else { }
else {
$branchName = "HEAD detached at $($headContent.Substring(0, 7))" $branchName = "HEAD detached at $($headContent.Substring(0, 7))"
} }
Write-Host " [$branchName]" -NoNewline -ForegroundColor White Write-Host " [$branchName]" -NoNewline -ForegroundColor White
} }
return
}
$SplitPath = split-path $path
if ($SplitPath) {
checkGit($SplitPath)
}
} }
function getGitStatusSetting() { function getGitStatusSetting() {
$gitStatus = (git --no-pager config -l) | out-string $gitStatus = (git --no-pager config -l) | Out-String
ForEach ($line in $($gitStatus -split "`r`n")) { foreach ($line in $($gitStatus -split "`r`n")) {
if ($line -match 'cmder.status=false' -or $line -match 'cmder.psstatus=false') { if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) {
return $false return $false
} }
} }

File diff suppressed because it is too large Load Diff

16
vendor/sources.json vendored
View File

@ -1,22 +1,22 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "2.38.0.windows.1", "version": "2.47.0.windows.1",
"url": "https://github.com/git-for-windows/git/releases/download/v2.38.0.windows.1/PortableGit-2.38.0-64-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.47.0.windows.1/PortableGit-2.47.0-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
"version": "1.3.47", "version": "1.7.3",
"url": "https://github.com/chrisant996/clink/releases/download/v1.3.47/clink.1.3.47.d5796b.zip" "url": "https://github.com/chrisant996/clink/releases/download/v1.7.3/clink.1.7.3.f8fb96.zip"
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "22.08.07", "version": "23.07.24",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v22.08.07/ConEmuPack.220807.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",
"version": "0.4.1", "version": "0.6.0",
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/0.4.1.zip" "url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.0.zip"
} }
] ]

View File

@ -6,6 +6,7 @@
;= Add aliases below here ;= Add aliases below here
e.=explorer . e.=explorer .
gl=git log --oneline --all --graph --decorate $* gl=git log --oneline --all --graph --decorate $*
l=ls --show-control-chars -CFGNhp --color --ignore={"NTUSER.DAT*","ntuser.dat*"} $*
ls=ls --show-control-chars -F --color $* ls=ls --show-control-chars -F --color $*
pwd=cd pwd=cd
clear=cls clear=cls