Compare commits

..

63 Commits

Author SHA1 Message Date
19d5a87224 Fix GIT_INSTALL_ROOT again 2018-05-30 01:04:41 +02:00
44aadccbec ⬆️ ConEmu to 180528
release notes: https://conemu.github.io/en/Whats_New.html
2018-05-29 22:42:32 +02:00
83f411384c ⬆️ Update Git to 2.17.1
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.17.1.windows.2
2018-05-29 22:37:21 +02:00
7d31eeaa5a enable unc paths by default 2018-05-17 15:50:06 +02:00
36403df91e Updates issue template, notes on README.me and fixes line ending (#1751)
* add integration notes, refined docs

* change img size

* verbose issue template

* move docs from README to WIKI

* increased politeness factor by 10%
2018-05-04 00:29:25 +02:00
a843e85c8b Fix GitHub download failures (#1760)
* Github changed to only accept TLS 1.2 connections, this fixes the resulting failures.
2018-05-04 00:28:14 +02:00
4f3fcae9d9 Merge pull request #1754 from cmderdev/daxgames-patch-2
Fix git install root
2018-05-01 02:24:26 +02:00
13ea026dc9 Fix git install root
This is untested so don't merge yet.  I'll test tonight.
2018-04-26 19:06:18 -04:00
dc8e572ca5 ⬆️ ConEmu to 180416
release notes: https://conemu.github.io/en/Whats_New.html
2018-04-19 09:07:55 +02:00
b2262522c9 ⬆️ Update Git to 2.17.0
Release notes: https://github.com/git-for-windows/git/releases/tag/v2.17.0.windows.1
2018-04-13 20:20:59 +02:00
9d0729fe42 ⬆️ ConEmu to 180411
release notes: https://conemu.github.io/en/Whats_New.html
2018-04-13 20:20:59 +02:00
a1e47ceaca Merge pull request #1745 from daxgames/fix_reg_cleanup
Fixes for recent reworks
2018-04-13 18:27:11 +02:00
2a18ba084c fix spelling 2018-04-12 21:43:31 -04:00
12e3761017 fix tab 2018-04-12 21:41:42 -04:00
b8890ed297 switch to debug output 2018-04-12 21:39:52 -04:00
063f30c193 fix git missing error on cmder mini cmd shell 2018-04-12 21:32:38 -04:00
bc72f20a2d reposition echo 2018-04-12 21:06:00 -04:00
78a9711447 fix unreg cleanup 2018-04-12 21:05:38 -04:00
55d9b25f57 double quote more paths
fixes #1681
2018-04-06 18:08:28 +02:00
7294092618 fix a typo 2018-04-06 00:00:11 +02:00
959073ac5c Merge pull request #1730 from DRSDavidSoft/dev-david
Generate Win32 version string based on build no, git tag or fallback to changelog
2018-04-05 23:51:06 +02:00
e746101ed2 Merge pull request #1739 from daxgames/fix_init
fix bash and powershell init scripts
2018-04-05 23:48:26 +02:00
65bf25f1d0 fix bash and powershell init scripts 2018-04-03 14:17:34 -04:00
94e7c24b72 minor typo fix 2018-03-31 00:03:39 +04:30
d6569192fc replace tabs to spaces 2018-03-30 23:57:21 +04:30
7d04ded1c2 add appveyor message 2018-03-30 23:52:32 +04:30
5c3f46fd88 fix git detection statement 2018-03-30 23:46:48 +04:30
502129d4f9 minor fix 2018-03-30 23:31:51 +04:30
b36b8a4cb3 new version handle logic 2018-03-30 23:23:44 +04:30
3965852c26 clean before build 2018-03-29 03:23:18 +04:30
93d2c427ad respect powershell naming convention 2018-03-29 01:18:57 +04:30
624deec2f0 minor edit – added a character to the verbose output 2018-03-28 22:34:28 +04:30
c817df2032 add build version str; fix padding 2018-03-28 22:30:09 +04:30
236aefe8c6 add build version string 2018-03-28 22:28:33 +04:30
2f3f1d474a specified custom manifest file 2018-03-28 22:28:01 +04:30
cb4d95e7a3 added build number, removed duplicated manifest 2018-03-28 22:26:17 +04:30
1dadade661 replaces spaces to tabs 2018-03-28 22:24:26 +04:30
2bc17c4ff2 renamed app.manifest 2018-03-28 22:22:56 +04:30
ae473ecea6 add escaped quotes handling 2018-03-28 21:24:02 +04:30
3aeca3c972 add required block to else statement 2018-03-28 21:16:27 +04:30
57a28f118d add template for version string 2018-03-28 21:14:15 +04:30
018bf45df4 add version string handler 2018-03-28 21:13:55 +04:30
f8359fc3f7 add verbose version info 2018-03-28 21:11:31 +04:30
249f7b9baf add build flags; use spaces 2018-03-28 21:07:14 +04:30
eaf7048ed7 add automatic version creation
with this commit, the build script extracts the latest version string found in `CHANGELOG.md`, and then creates appropriate resource files for the executable compilation
2018-03-28 20:48:57 +04:30
f4321bbc33 add functions to get version and generate rc
these functions can be used to a) extract the version from `CHANGELOG.md` and b) create a .rc2 file from the `sample` template by replacing its content
2018-03-28 20:41:18 +04:30
96736feecc added version.rc2.sample
this file controls how the version strings appears in the final compiled .exe file
2018-03-28 20:38:12 +04:30
dc9e385365 add cmder manifest file 2018-03-28 18:43:41 +04:30
a85cd81f00 added version resources and manifest. 2018-03-28 18:37:46 +04:30
1662678ebf fixed line endings 2018-03-28 18:16:14 +04:30
bcf8527f74 run markdownlint and update changelog 2018-03-24 03:34:39 +01:00
72ab0f064f update psget to the latest version 2018-03-24 00:01:08 +01:00
91f5c5379a actually show the new task 2018-03-23 23:49:54 +01:00
19bad7dfa9 open cmder in the current working dir as every other windows app works (#1725)
open cmder in the current working dir as every other Windows app works
2018-03-23 23:38:53 +01:00
afb8f52516 ignore .github dir and markdown files for packaging 2018-03-23 23:34:05 +01:00
6543c204b7 add default WSL bash task 2018-03-23 23:29:24 +01:00
0438ce5763 ⬆️ Update Git to 2.16.3
Release notes: https://github.com/git-for-windows/git/releases/v2.16.3.windows.1
2018-03-23 23:11:05 +01:00
471369f73b Made all sub-routines in init.bat importable libs (#1706) 2018-03-23 15:20:07 +01:00
66d36fdc1c Created issue_template.md (#1723)
Purpose:
- Prevent duplicated/similar issues
- Explain the suitable repo for each issue, avoiding ConEmu issues here.
- Help users to provide a better explanation to identify the problem
2018-03-23 14:32:15 +01:00
17247f2065 ⬆️ ConEmu to 180318
release notes: https://conemu.github.io/en/Whats_New.html
2018-03-19 20:57:10 +01:00
63f3f8020f Merge pull request #1707 from cmderdev/drop_xp
Drop Windows XP support
2018-03-14 13:26:56 +01:00
60880362a9 No longer use the special _xp platform tools since we no longer support XP 2018-03-13 23:53:33 +01:00
91651fc98b Drop Windows XP support 2018-03-13 23:40:07 +01:00
24 changed files with 1718 additions and 1128 deletions

78
.github/issue_template.md vendored Normal file
View File

@ -0,0 +1,78 @@
<!--
Thank you for reporting a bug for the Cmder project!
------------------------------------------------------------------
Please make sure you read and follow the following instructions
carefully before reporting bugs, and/or requesting new features.
Make sure that you have:
• Searched for existing issues (including the **closed** ones)
for the similar problems here:
https://github.com/cmderdev/cmder/issues?q=is:issue
• Read the README.md and the Wiki:
- https://github.com/cmderdev/cmder/blob/master/README.md
- https://github.com/cmderdev/cmder/wiki
(What you may be asking here could already be explained there!)
• Please understand that Cmder by default uses ConEmu as the
underlying Terminal Emulator. If your issue is regarding
the **Terminal Emulator**, please visit the ConEmu issues page:
https://github.com/Maximus5/ConEmu/issues?q=is:issue
If there isn't an existing issue, you may open a new one there.
(We don't resolve issues regarding ConEmu here, so please
make sure you open the issue in the correct place.)
more info: https://conemu.github.io/en/ThirdPartyProblems.html
• If you are asking for guides on how to integrate Cmder into
your favorite IDE of choice, or how to perform an specific
task with Cmder, make sure you visit our label section first!
You may already have an answer under the Guides or Questions section.
For a list of labels, visit:
- https://github.com/cmderdev/cmder/labels
(Be sure to also check “Closed” issues in the labels section!)
• If the issue is regarding the other upstream technologies that
Cmder uses (e.g. Clink, Git, etc), please make sure that the
bug you are reporting only applies when they are used in
combination with Cmder. If the bug applies when the mentioned
tools are NOT used within Cmder, there's a good chance that
you should open the bug at the corresponding repo instead.
Read more on about Cmder on ConEmu docs:
https://conemu.github.io/en/cmder.html
Thank you for making sure you are opening a new valid issue!
-->
<!--
Some tips on how to write a better report:
- Put an `x` into all the boxes [ ] relevant to your issue (example: [x]).
- Use the *Preview* tab to see how your issue will actually look like, before sending it.
- Make sure the description is worded well enough to be understood, and with as much context and examples as possible.
- Post a screenshot or the command the triggered the problem, if applicable.
- Avoid using ambiguous phrases like: doesn't work, there'a problem, etc.
Help us reproduce the issue by explaining what went wrong, and what did you expect to happen.
- Please keep the ticket language to English only here.
We can't process your issue if it's written in Russian or Chinese as we can't understand them.
- ⚠ Read the following page to avoid posting a bad issue: https://conemu.github.io/en/BadIssue.html
-->
### Purpose of the issue
- [ ] Bug report (encountered problems/errors)
- [ ] Feature request (request for new functionality)
- [ ] Question
### Description of the issue
<!-- Provide a clear, simple description of your issue here -->

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
## Those files should be taken from their repositary ## Those files should be taken from their repositary
vendor/*/* vendor/*/*
!vendor/lib/*
!vendor/* !vendor/*
!vendor/psmodules/PsGet !vendor/psmodules/PsGet

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,8 @@ Cmder is a **software package** created out of pure frustration over absence of
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).
## Installation ## Installation
### Single User Portable Config ### Single User Portable Config
@ -79,7 +81,7 @@ In a file explorer window right click in or on a directory to see "Cmder Here" i
* <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search * <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search
* <kbd>Shift</kbd> + Mouse : Select and copy text from buffer * <kbd>Shift</kbd> + Mouse : Select and copy text from buffer
(Some shortcuts are not yet documented, though they exist - please document them here) _(Some shortcuts are not yet documented, though they exist - please document them here)_
## Features ## Features
@ -88,7 +90,7 @@ You can open multiple tabs each containing one of the following shells:
| Task | Shell | Description | | Task | Shell | Description |
| ---- | ----- | ----------- | | ---- | ----- | ----------- |
| Cmder | cmd.exe | Windows 'cmd.exe' shell enhanced with Git, Git aware prompt, Clink(GNU Readline), and Aliases. | | Cmder | cmd.exe | Windows 'cmd.exe' shell enhanced with Git, Git aware prompt, Clink (GNU Readline), and Aliases. |
| Cmder as Admin | cmd.exe | Administrative Windows 'cmd.exe' Cmder shell. | | Cmder as Admin | cmd.exe | Administrative Windows 'cmd.exe' Cmder shell. |
| PowerShell | powershell.exe | Windows PowerShell enhanced with Git and Git aware prompt . | | PowerShell | powershell.exe | Windows PowerShell enhanced with Git and Git aware prompt . |
| PowerShell as Admin | powershell.exe | Administrative Windows 'powershell.exe' Cmder shell. | | PowerShell as Admin | powershell.exe | Administrative Windows 'powershell.exe' Cmder shell. |
@ -99,9 +101,13 @@ 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.
Mintty tabs use a program called 'mintty' as the terminal that is not based on the Windows Console API so some differences in functionality are normal, as a result mintty specific config is done via the '[%USERPROFILE%|$HOME]/.minttyrc' file. ⚠ *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 eidition without additional configuration.
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. For more on Mintty and its config click [here](https://github.com/mintty/mintty). 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.
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).
An example of setting Cmder portable terminal colors for mintty: An example of setting Cmder portable terminal colors for mintty:
@ -114,6 +120,8 @@ cd mintty-colors-solarized/
echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user-profile.sh echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user-profile.sh
``` ```
You may find some Monokai color schemes for mintty to match Cmder [here](https://github.com/PhilipDaniels/mintty/blob/master/themes/Monokai) or [here](https://github.com/oumu/mintty-color-schemes/blob/master/base16-monokai-mod.minttyrc).
### Changing Cmder Default 'cmd.exe' Shell Startup Behaviour Using Task Arguments ### Changing Cmder Default 'cmd.exe' Shell Startup Behaviour Using Task Arguments
1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd> 1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd>
@ -160,7 +168,6 @@ You can write *.cmd|*.bat, *.ps1, and *.sh scripts and just drop them in the %CM
| PowerShell | $ENV:CMDER_ROOT\\config\\profile.d\\\*.ps1 | | PowerShell | $ENV:CMDER_ROOT\\config\\profile.d\\\*.ps1 |
| Bash/Mintty | $CMDER_ROOT/config/profile.d/*.sh | | Bash/Mintty | $CMDER_ROOT/config/profile.d/*.sh |
### Aliases ### Aliases
#### Cmder(Cmd.exe) Aliases #### Cmder(Cmd.exe) Aliases
You can define simple aliases for `cmd.exe` sessions with a command like `alias name=command`. Cmd.exe aliases support optional parameters through the `$1-9` or the `$*` special characters so the alias `vi=vim.exe $*` typed as `vi [filename]` will open `[filename]` in `vim.exe`. You can define simple aliases for `cmd.exe` sessions with a command like `alias name=command`. Cmd.exe aliases support optional parameters through the `$1-9` or the `$*` special characters so the alias `vi=vim.exe $*` typed as `vi [filename]` will open `[filename]` in `vim.exe`.
@ -212,7 +219,9 @@ Cmder is by default shipped with a vendored Git installation. On each instance
You may use your favorite version of Git by including its path in the `%PATH%` enviroment variable. Moreover, the **Mini** edition of Cmder (found on the [downloads page](https://github.com/cmderdev/cmder/releases)) excludes any vendored Git binaries. You may use your favorite version of Git by including its path in the `%PATH%` enviroment variable. Moreover, the **Mini** edition of Cmder (found on the [downloads page](https://github.com/cmderdev/cmder/releases)) excludes any vendored Git binaries.
### Using external Cygwin/Babun, MSys2, or Git for Windows SDK with Cmder. ### Using external Cygwin/Babun, MSys2, WSL, or Git for Windows SDK with Cmder.
You may run bash (the default shell used on Linux, macOS and GNU/Hurd) externally on Cmder, using the following instructions:
1. Setup a new task by pressing '<kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>'. 1. Setup a new task by pressing '<kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>'.
1. Click the '+' button to add a task. 1. Click the '+' button to add a task.
@ -220,7 +229,7 @@ You may use your favorite version of Git by including its path in the `%PATH%` e
1. Provide task parameters, this is optional. 1. Provide task parameters, this is optional.
1. Add ```cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console``` to the `Commands` text box. 1. Add ```cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console``` to the `Commands` text box.
Recommended Optional Steps: **Recommended Optional Steps:**
Copy the 'vendor/cmder_exinit' file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments ```/etc/profile.d/``` folder to use portable settings in the $CMDER_ROOT/config folder. Copy the 'vendor/cmder_exinit' file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments ```/etc/profile.d/``` folder to use portable settings in the $CMDER_ROOT/config folder.
@ -237,9 +246,16 @@ Uncomment and edit the below line in the script to use Cmder config even when la
# CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder. # CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder.
``` ```
### Integrating Cmder with [Hyper](https://github.com/zeit/hyper), [Microsoft VS Code](https://code.visualstudio.com/), 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).
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
## Upgrading ## Upgrading
The process of upgrading Cmder depends on the version/build you are currently running The process of upgrading Cmder depends on the version/build you are currently running.
If you have a `[cmder_root]/config/user-conemu.xml`, you are running a newer version of Cmder, follow the below process: If you have a `[cmder_root]/config/user-conemu.xml`, you are running a newer version of Cmder, follow the below process:

View File

@ -59,6 +59,7 @@
<value name="FadeInactive" type="hex" data="01"/> <value name="FadeInactive" type="hex" data="01"/>
<value name="FadeInactiveLow" type="hex" data="00"/> <value name="FadeInactiveLow" type="hex" data="00"/>
<value name="FadeInactiveHigh" type="hex" data="c8"/> <value name="FadeInactiveHigh" type="hex" data="c8"/>
<value name="ComSpec.UncPaths" type="hex" data="01"/>
<value name="ConVisible" type="hex" data="00"/> <value name="ConVisible" type="hex" data="00"/>
<value name="ConInMode" type="dword" data="ffffffff"/> <value name="ConInMode" type="dword" data="ffffffff"/>
<value name="UseInjects" type="hex" data="01"/> <value name="UseInjects" type="hex" data="01"/>
@ -484,7 +485,7 @@
<value name="DndRKey" type="hex" data="a2"/> <value name="DndRKey" type="hex" data="a2"/>
<value name="WndDragKey" type="dword" data="00121101"/> <value name="WndDragKey" type="dword" data="00121101"/>
<key name="Tasks" modified="2018-02-22 06:02:12" build="171109"> <key name="Tasks" modified="2018-02-22 06:02:12" build="171109">
<value name="Count" type="long" data="8"/> <value name="Count" type="long" data="9"/>
<key name="Task1" modified="2018-02-22 06:02:12" build="171109"> <key name="Task1" modified="2018-02-22 06:02:12" build="171109">
<value name="Name" type="string" data="{cmd::Cmder as Admin}"/> <value name="Name" type="string" data="{cmd::Cmder as Admin}"/>
<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;"/>
@ -504,7 +505,7 @@
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task3" modified="2018-02-22 06:05:13" build="171109"> <key name="Task3" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{Powershell::PowerShell as Admin}"/> <value name="Name" type="string" data="{PowerShell::PowerShell as Admin}"/>
<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="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data="*PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
@ -513,11 +514,11 @@
<value name="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
</key> </key>
<key name="Task4" modified="2018-02-22 06:05:13" build="171109"> <key name="Task4" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{Powershell::Powershell}"/> <value name="Name" type="string" data="{PowerShell::PowerShell}"/>
<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="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot;"/> <value name="Cmd1" type="string" data="PowerShell -ExecutionPolicy Bypass -NoLogo -NoProfile -NoExit -Command &quot;Invoke-Expression '. ''%ConEmuDir%\..\profile.ps1'''&quot;"/>
<value name="Cmd2" type="string" data="%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe"/> <value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%\vendor\git-for-windows\git-bash.exe&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="Flags" type="dword" data="00000000"/> <value name="Flags" type="dword" data="00000000"/>
@ -527,7 +528,7 @@
<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;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="*%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/> <value name="Cmd1" type="string" data="*&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<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>
@ -536,10 +537,10 @@
<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;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/> <value name="GuiArgs" type="string" data="/icon &quot;%ConEmuDir%\..\git-for-windows\usr\share\git\git-for-windows.ico&quot;"/>
<value name="Cmd1" type="string" data="%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/> <value name="Cmd1" type="string" data="&quot;%ConEmuDir%\..\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
<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="Cmd2" type="string" data="%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe /bin/bash -l"/> <value name="Cmd2" type="string" data="&quot;%CMDER_ROOT%vendor\git-for-windows\usr\bin\mintty.exe&quot; /bin/bash -l"/>
</key> </key>
<key name="Task7" modified="2018-02-22 06:05:13" build="171109"> <key name="Task7" modified="2018-02-22 06:05:13" build="171109">
<value name="Name" type="string" data="{bash::bash as Admin}"/> <value name="Name" type="string" data="{bash::bash as Admin}"/>
@ -548,14 +549,23 @@
<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="*cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot;"/> <value name="Cmd1" type="string" data="*cmd /c &quot;&quot;%ConEmuDir%\..\git-for-windows\bin\bash&quot; --login -i&quot;"/>
</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="cmd /c &quot;%ConEmuDir%\..\git-for-windows\bin\bash --login -i&quot;"/> <value name="Cmd1" type="string" data="cmd /c &quot;&quot;%ConEmuDir%\..\git-for-windows\bin\bash&quot; --login -i&quot;"/>
<value name="Active" type="long" data="0"/>
<value name="Count" type="long" data="1"/>
</key>
<key name="Task9" modified="2018-03-23 23:26:53" build="180318">
<value name="Name" type="string" data="{WSL::bash}"/>
<value name="Flags" type="dword" data="00000000"/>
<value name="Hotkey" type="dword" data="00000000"/>
<value name="GuiArgs" type="string" data='-icon "%USERPROFILE%\AppData\Local\lxss\bash.ico"'/>
<value name="Cmd1" type="string" data='set "PATH=%ConEmuBaseDirShort%\wsl;%PATH%" &amp; %ConEmuBaseDirShort%\conemu-cyg-64.exe --wsl -cur_console:pm:/mnt'/>
<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,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations"> <ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32"> <ProjectConfiguration Include="Debug|Win32">
@ -14,6 +14,7 @@
<ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid> <ProjectGuid>{4A8485A5-B7DD-4C44-B7F6-3E2765DD0CD3}</ProjectGuid>
<Keyword>Win32Proj</Keyword> <Keyword>Win32Proj</Keyword>
<RootNamespace>CmderLauncher</RootNamespace> <RootNamespace>CmderLauncher</RootNamespace>
<WindowsTargetPlatformVersion>10.0.16299.0</WindowsTargetPlatformVersion>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@ -25,9 +26,9 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType> <ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries> <UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141_xp</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization> <WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet> <CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v141</PlatformToolset>
</PropertyGroup> </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings"> <ImportGroup Label="ExtensionSettings">
@ -60,6 +61,9 @@
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>_USING_V110_SDK71_;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile> </ResourceCompile>
@ -83,6 +87,9 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
</Link> </Link>
<Manifest>
<AdditionalManifestFiles>src/app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
</Manifest>
<PostBuildEvent> <PostBuildEvent>
<Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command> <Command>copy $(TargetPath) $(SolutionDir)..\$(TargetFileName)</Command>
</PostBuildEvent> </PostBuildEvent>
@ -101,4 +108,4 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>
</Project> </Project>

View File

@ -5,8 +5,8 @@
#include <vector> #include <vector>
#include <shlobj.h> #include <shlobj.h>
#include <regex> #include <regex>
#include <iostream> #include <iostream>
#pragma comment(lib, "Shlwapi.lib") #pragma comment(lib, "Shlwapi.lib")
@ -16,8 +16,6 @@
#define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7) #define USE_TASKBAR_API (_WIN32_WINNT >= _WIN32_WINNT_WIN7)
#define XP (_WIN32_WINNT < _WIN32_WINNT_VISTA)
#define MB_TITLE L"Cmder Launcher" #define MB_TITLE L"Cmder Launcher"
#define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder"
#define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder" #define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder"
@ -140,7 +138,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location! Restart Cmder as administrator." ? L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location! Restart Cmder as Administrator."
: L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
@ -151,12 +149,11 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location! Restart Cmder as administrator." ? L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator."
: L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
} }
} }
else if (PathFileExists(userCfgPath)) { else if (PathFileExists(userCfgPath)) {
if (PathFileExists(cfgPath)) { if (PathFileExists(cfgPath)) {
@ -164,7 +161,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to backup location! Restart Cmder as administrator." ? L"Failed to copy ConEmu.xml file to backup location! Restart Cmder as Administrator."
: L"Failed to copy ConEmu.xml file to backup location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to backup location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
@ -175,7 +172,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as administrator." ? L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator."
: L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
@ -186,7 +183,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy ConEmu.xml file to user-conemu.xml backup location! Restart Cmder as administrator." ? L"Failed to copy ConEmu.xml file to user-conemu.xml backup location! Restart Cmder as Administrator."
: L"Failed to copy ConEmu.xml file to user-conemu.xml backup location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy ConEmu.xml file to user-conemu.xml backup location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
@ -196,7 +193,7 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
{ {
MessageBox(NULL, MessageBox(NULL,
(GetLastError() == ERROR_ACCESS_DENIED) (GetLastError() == ERROR_ACCESS_DENIED)
? L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as administrator." ? L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator."
: L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); : L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP);
exit(1); exit(1);
} }
@ -211,13 +208,6 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe");
} }
if (streqi(cmderStart.c_str(), L""))
{
TCHAR buff[MAX_PATH];
const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", buff, MAX_PATH);
cmderStart = buff;
}
if (is_single_mode) if (is_single_mode)
{ {
if (!streqi(cmderTask.c_str(), L"")) { if (!streqi(cmderTask.c_str(), L"")) {
@ -237,7 +227,6 @@ void StartCmder(std::wstring path = L"", bool is_single_mode = false, std::wstr
} }
} }
SetEnvironmentVariable(L"CMDER_ROOT", exeDir); SetEnvironmentVariable(L"CMDER_ROOT", exeDir);
if (wcscmp(userConfigDirPath, configDirPath) != 0) if (wcscmp(userConfigDirPath, configDirPath) != 0)
{ {
@ -310,33 +299,33 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
GetModuleFileName(NULL, exePath, sizeof(exePath)); GetModuleFileName(NULL, exePath, sizeof(exePath));
wchar_t commandStr[MAX_PATH + 20] = { 0 }; wchar_t commandStr[MAX_PATH + 20] = { 0 };
swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath); swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath);
// Now that we have `commandStr`, it's OK to change `exePath`... // Now that we have `commandStr`, it's OK to change `exePath`...
PathRemoveFileSpec(exePath); PathRemoveFileSpec(exePath);
PathCombine(icoPath, exePath, L"icons\\cmder.ico"); PathCombine(icoPath, exePath, L"icons\\cmder.ico");
// Now set the registry keys // Now set the registry keys
HKEY root = GetRootKey(opt); HKEY root = GetRootKey(opt);
HKEY cmderKey; HKEY cmderKey;
FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL)); FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL)); FAIL_ON_ERROR(RegSetValue(cmderKey, L"", REG_SZ, L"Cmder Here", NULL));
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2)); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"NoWorkingDirectory", 0, REG_SZ, (BYTE *)L"", 2));
FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t))); FAIL_ON_ERROR(RegSetValueEx(cmderKey, L"Icon", 0, REG_SZ, (BYTE *)icoPath, wcslen(icoPath) * sizeof(wchar_t)));
HKEY command; HKEY command;
FAIL_ON_ERROR(RegCreateKeyEx(cmderKey, L"command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL)); FAIL_ON_ERROR(RegCreateKeyEx(cmderKey, L"command", 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &command, NULL));
FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL)); FAIL_ON_ERROR(RegSetValue(command, L"", REG_SZ, commandStr, NULL));
RegCloseKey(command); RegCloseKey(command);
RegCloseKey(cmderKey); RegCloseKey(cmderKey);
RegCloseKey(root); RegCloseKey(root);
} }
void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName) void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
@ -344,11 +333,8 @@ void UnregisterShellMenu(std::wstring opt, wchar_t* keyBaseName)
HKEY root = GetRootKey(opt); HKEY root = GetRootKey(opt);
HKEY cmderKey; HKEY cmderKey;
FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL)); FAIL_ON_ERROR(RegCreateKeyEx(root, keyBaseName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &cmderKey, NULL));
#if XP
FAIL_ON_ERROR(SHDeleteKey(cmderKey, NULL));
#else
FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL)); FAIL_ON_ERROR(RegDeleteTree(cmderKey, NULL));
#endif RegDeleteKeyEx(root, keyBaseName, KEY_ALL_ACCESS, NULL);
RegCloseKey(cmderKey); RegCloseKey(cmderKey);
RegCloseKey(root); RegCloseKey(root);
} }
@ -363,7 +349,6 @@ struct cmderOptions
bool registerApp = false; bool registerApp = false;
bool unRegisterApp = false; bool unRegisterApp = false;
bool error = false; bool error = false;
}; };
cmderOptions GetOption() cmderOptions GetOption()
@ -418,7 +403,7 @@ cmderOptions GetOption()
cmderOptions.registerApp = true; cmderOptions.registerApp = true;
cmderOptions.unRegisterApp = false; cmderOptions.unRegisterApp = false;
if (szArgList[i + 1] != NULL) if (szArgList[i + 1] != NULL)
{ {
if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0) if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0)
{ {
cmderOptions.cmderRegScope = szArgList[i + 1]; cmderOptions.cmderRegScope = szArgList[i + 1];
@ -453,6 +438,7 @@ cmderOptions GetOption()
return cmderOptions; return cmderOptions;
} }
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance, _In_opt_ HINSTANCE hPrevInstance,
_In_ LPTSTR lpCmdLine, _In_ LPTSTR lpCmdLine,
@ -464,11 +450,11 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
cmderOptions cmderOptions = GetOption(); cmderOptions cmderOptions = GetOption();
if (cmderOptions.registerApp == true ) { if (cmderOptions.registerApp == true) {
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND);
RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM);
} }
else if (cmderOptions.unRegisterApp == true ) else if (cmderOptions.unRegisterApp == true)
{ {
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND);
UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM);
@ -481,6 +467,6 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
{ {
StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot); StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot);
} }
return 0; return 0;
} }

Binary file not shown.

54
launcher/src/app.manifest Normal file
View File

@ -0,0 +1,54 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<!-- Project description definition -->
<description>Cmder Console Emulator</description>
<!-- Project dependency definition -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
<!-- Win32 User Account Control definition -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
<!-- Required for appcompat behaviour -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
<!-- Add dpi awareness -->
<asmv3:application>
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true/pm</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
</assembly>

View File

@ -0,0 +1,27 @@
/**
* WARNING: do NOT modify this file! the content of this file should be
* automatically genereted before AppVeyor builds using the
* respective .ps1 Powershell scripts.
*
*/
/////////////////////////////////////////////////////////////////////////////
// Define the version numbers and build information manually here:
#define CMDER_MAJOR_VERSION {Cmder-Major-Version}
#define CMDER_MINOR_VERSION {Cmder-Minor-Version}
#define CMDER_REVISION_VERSION {Cmder-Revision-Version}
#define CMDER_BUILD_VERSION {Cmder-Build-Version}
#define CMDER_VERSION_STR {Cmder-Version-Str}
#define CMDER_PRODUCT_NAME_STR "Cmder"
#define CMDER_FILE_DESCRIPTION_STR "Cmder: Lovely Console Emulator."
#define CMDER_INTERNAL_NAME_STR "Cmder"
#define CMDER_ORIGINAL_FILENAME_STR "Cmder.exe"
#define CMDER_COMPANY_NAME_STR "Samuel Vasko"
#define CMDER_COPYRIGHT_YEAR_STR "2016"
#define CMDER_DEBUGFLAG 0x0L // set to 0x1L to enable debug mode
#define CMDER_BUILDFLAGS 0x0L
/////////////////////////////////////////////////////////////////////////////

View File

@ -2,7 +2,8 @@ launcher
.gitignore .gitignore
.gitattributes .gitattributes
.git .git
*.rb .github
*.md
build build
scripts scripts
config\.history config\.history
@ -19,4 +20,3 @@ appveyor.yml
vendor\cmder.sh vendor\cmder.sh
vendor\git-prompt.sh vendor\git-prompt.sh
config\user-* config\user-*
.github_changelog_generator

View File

@ -58,12 +58,15 @@ $ScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
$cmder_root = $ScriptRoot.replace("\scripts","") $cmder_root = $ScriptRoot.replace("\scripts","")
# Dot source util functions into this scope # Dot source util functions into this scope
. ".\utils.ps1" . "$PSScriptRoot\utils.ps1"
$ErrorActionPreference = "Stop" $ErrorActionPreference = "Stop"
Push-Location -Path $saveTo Push-Location -Path $saveTo
$sources = Get-Content $sourcesPath | Out-String | Convertfrom-Json $sources = Get-Content $sourcesPath | Out-String | Convertfrom-Json
# Get the version string
$version = Get-VersionStr
# Check for requirements # Check for requirements
Ensure-Exists $sourcesPath Ensure-Exists $sourcesPath
Ensure-Executable "7z" Ensure-Executable "7z"
@ -116,10 +119,17 @@ Pop-Location
if($Compile) { if($Compile) {
Push-Location -Path $launcher Push-Location -Path $launcher
msbuild CmderLauncher.vcxproj /p:configuration=Release Create-RC $version ($launcher + '\src\version.rc2');
msbuild CmderLauncher.vcxproj /t:Clean,Build /p:configuration=Release
if ($LastExitCode -ne 0) { if ($LastExitCode -ne 0) {
throw "msbuild failed to build the executable." throw "msbuild failed to build the executable."
} }
else {
Write-Verbose "successfully built Cmder v$version!"
if ( $Env:APPVEYOR -eq 'True' ) {
Add-AppveyorMessage -Message "Building Cmder v$version was successful." -Category Information
}
}
Pop-Location Pop-Location
} else { } else {
Write-Warning "You are not building a launcher, Use -Compile" Write-Warning "You are not building a launcher, Use -Compile"

View File

@ -48,7 +48,7 @@ $targets = @{
Delete-Existing "..\Version*" Delete-Existing "..\Version*"
Delete-Existing "..\build\*" Delete-Existing "..\build\*"
$version = Invoke-Expression "git describe --abbrev=0 --tags" $version = Get-VersionStr
(New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null (New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null
foreach ($t in $targets.GetEnumerator()) { foreach ($t in $targets.GetEnumerator()) {

View File

@ -62,6 +62,85 @@ function Digest-Hash($path) {
return Invoke-Expression "md5sum $path" return Invoke-Expression "md5sum $path"
} }
function Get-VersionStr() {
# Clear existing variable
if ($string) { Clear-Variable -name string }
# Determine if git is available
if (Get-Command "git.exe" -ErrorAction SilentlyContinue)
{
# Determine if the current diesctory is a git repository
$GitPresent = Invoke-Expression "git rev-parse --is-inside-work-tree" -erroraction SilentlyContinue
if ( $GitPresent -eq 'true' )
{
$string = Invoke-Expression "git describe --abbrev=0 --tags"
}
}
# Fallback used when Git is not available
if ( -not($string) )
{
$string = Parse-Changelog ($PSScriptRoot + '\..\' + 'CHANGELOG.md')
}
# Add build number, if AppVeyor is present
if ( $Env:APPVEYOR -eq 'True' )
{
$string = $string + '.' + $Env:APPVEYOR_BUILD_NUMBER
}
# Remove starting 'v' characters
$string = $string -replace '^v+','' # normalize version string
return $string
}
function Parse-Changelog($file) {
# Define the regular expression to match the version string from changelog
[regex]$regex = '^## \[(?<version>[\w\-\.]+)\]\([^\n()]+\)\s+\([^\n()]+\)$';
# 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 }
return $version
}
function Create-RC($string, $path) {
$version = $string + '.0.0.0.0' # padding for version string
if ( !(Test-Path "$path.sample") ) {
throw "Invalid path provided for resources file."
}
$resource = Get-Content -Path "$path.sample"
$pattern = @( "Cmder-Major-Version", "Cmder-Minor-Version", "Cmder-Revision-Version", "Cmder-Build-Version" )
$index = 0
# Replace all non-numeric characters to dots and split to array
$version = $version -replace '[^0-9]+','.' -split '\.'
foreach ($fragment in $version) {
if ( !$fragment ) { break }
elseif ($index -le $pattern.length) {
$resource = $resource.Replace( "{" + $pattern[$index++] + "}", $fragment )
}
}
# Add the version string
$resource = $resource.Replace( "{Cmder-Version-Str}", '"' + $string + '"' )
# Write the results
Set-Content -Path $path -Value $resource
}
function Register-Cmder() { function Register-Cmder() {
[CmdletBinding()] [CmdletBinding()]
Param Param
@ -121,6 +200,8 @@ function Download-File {
$Url, $Url,
$File $File
) )
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# I think this is the problem # I think this is the problem
$File = $File -Replace "/", "\" $File = $File -Replace "/", "\"
Write-Verbose "Downloading from $Url to $File" Write-Verbose "Downloading from $Url to $File"

22
vendor/cmder.sh vendored
View File

@ -4,7 +4,7 @@
# these customizations will follow Cmder if $CMDER_ROOT is copied # these customizations will follow Cmder if $CMDER_ROOT is copied
# to another machine. # to another machine.
# #
# Add system specific users customizations to $HOME/.bashrc, these # Add system specific users customizations to $HOME/.bashrc, these
# customizations will not follow Cmder to another machine. # customizations will not follow Cmder to another machine.
function runProfiled { function runProfiled {
@ -14,7 +14,7 @@ function runProfiled {
if [ ! "x${profile_d_scripts}" = "x" ] ; then if [ ! "x${profile_d_scripts}" = "x" ] ; then
for x in ${profile_d_scripts} ; do for x in ${profile_d_scripts} ; do
echo Sourcing "${1}/${x}"... # echo Sourcing "${1}/${x}"...
. "${1}/${x}" . "${1}/${x}"
done done
fi fi
@ -63,21 +63,21 @@ if [ -d "${CMDER_USER_CONFIG}/profile.d" ] ; then
runProfiled "${CMDER_USER_CONFIG}/profile.d" runProfiled "${CMDER_USER_CONFIG}/profile.d"
fi fi
initialConfig="${CMDER_ROOT}/config/user-profile.sh"
if [ -f "${CMDER_ROOT}/config/user-profile.sh" ] ; then if [ -f "${CMDER_ROOT}/config/user-profile.sh" ] ; then
. "${CMDER_ROOT}/config/user-profile.sh" . "${CMDER_ROOT}/config/user-profile.sh"
fi fi
if [ -f "${CMDER_USER_CONFIG}/user-profile.sh" ] ; then if [ "${CMDER_USER_CONFIG}" != "" ] ; then
initialConfig="${CMDER_USER_CONFIG}/user-profile.sh"
if [ -f "${CMDER_USER_CONFIG}/user-profile.sh" ] ; then
. "${CMDER_USER_CONFIG}/user-profile.sh" . "${CMDER_USER_CONFIG}/user-profile.sh"
else fi
if [ "${CMDER_USER_CONFIG}" != "" ] ; then fi
initialProfile="${CMDER_USER_CONFIG}/user-profile.sh"
else
initialProfile="${CMDER_ROOT}/config/user-profile.sh"
fi
echo Creating user startup file: "${initialProfile}" if [ ! -f "${initialConfig}" ] ; then
cat <<-eof >"${initialProfile}" echo Creating user startup file: "${initialConfig}"
cat <<-eof >"${initialConfig}"
# use this file to run your own startup commands for msys2 bash' # use this file to run your own startup commands for msys2 bash'
# To add a new vendor to the path, do something like: # To add a new vendor to the path, do something like:

340
vendor/init.bat vendored
View File

@ -27,22 +27,28 @@ 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%"
call "%cmder_root%\vendor\lib\lib_base"
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_profile"
:var_loop :var_loop
if "%~1" == "" ( if "%~1" == "" (
goto :start goto :start
) else if "%1"=="/v" ( ) else if /i "%1"=="/v" (
set verbose-output=1 set verbose-output=1
) else if "%1"=="/d" ( ) else if /i "%1"=="/d" (
set debug-output=1 set debug-output=1
) else if "%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" (
set "max_depth=%~2" set "max_depth=%~2"
shift shift
) else ( ) else (
call :show_error '/max_depth' requires a number between 1 and 5! %lib_console% show_error "'/max_depth' requires a number between 1 and 5!"
exit /b exit /b
) )
) else if "%1" == "/c" ( ) else if /i "%1" == "/c" (
if exist "%~2" ( if exist "%~2" (
if not exist "%~2\bin" mkdir "%~2\bin" if not exist "%~2\bin" mkdir "%~2\bin"
set "cmder_user_bin=%~2\bin" set "cmder_user_bin=%~2\bin"
@ -50,28 +56,28 @@ if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
set "cmder_user_config=%~2\config" set "cmder_user_config=%~2\config"
shift shift
) )
) else if "%1" == "/user_aliases" ( ) else if /i "%1" == "/user_aliases" (
if exist "%~2" ( if exist "%~2" (
set "user-aliases=%~2" set "user-aliases=%~2"
shift shift
) )
) else if "%1" == "/git_install_root" ( ) else if /i "%1" == "/git_install_root" (
if exist "%~2" ( if exist "%~2" (
set "GIT_INSTALL_ROOT=%~2" set "GIT_INSTALL_ROOT=%~2"
shift shift
) else ( ) else (
call :show_error The Git install root folder "%2", you specified does not exist! %lib_console% show_error "The Git install root folder "%~2", you specified does not exist!"
exit /b exit /b
) )
) else if "%1" == "/home" ( ) else if /i "%1" == "/home" (
if exist "%~2" ( if exist "%~2" (
set "HOME=%~2" set "HOME=%~2"
shift shift
) else ( ) else (
call :show_error The home folder "%2", you specified does not exist! %lib_console% show_error The home folder "%2", you specified does not exist!
exit /b exit /b
) )
) else if "%1" == "/svn_ssh" ( ) else if /i "%1" == "/svn_ssh" (
set SVN_SSH=%2 set SVN_SSH=%2
shift shift
) )
@ -79,12 +85,11 @@ if "%CMDER_ROOT:~-1%" == "\" SET "CMDER_ROOT=%CMDER_ROOT:~0,-1%"
goto var_loop goto var_loop
:start :start
%lib_console% debug-output init.bat "Env Var - CMDER_ROOT=%CMDER_ROOT%"
call :debug-output init.bat - Env Var - CMDER_ROOT=%CMDER_ROOT% %lib_console% debug-output init.bat "Env Var - debug-output=%debug-output%"
call :debug-output init.bat - Env Var - debug-output=%debug-output%
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
call :debug-output init.bat - CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'! %lib_console% debug-output init.bat "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '%CMDER_USER_CONFIG%'!"
) )
:: Pick right version of clink :: Pick right version of clink
@ -124,13 +129,16 @@ if not defined TERM set TERM=cygwin
:: * test if a git is in path and if yes, 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
setlocal enabledelayedexpansion
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" (goto :FOUND_GIT) if exist "%GIT_INSTALL_ROOT%\cmd\git.exe" goto :FOUND_GIT)
) )
%lib_console% debug-output init.bat "Looking for Git install root..."
:: get the version information for vendored git binary :: get the version information for vendored git binary
setlocal enabledelayedexpansion %lib_git% read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd"
call :read_version VENDORED "%CMDER_ROOT%\vendor\git-for-windows\cmd" %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') do ( for /F "delims=" %%F in ('where git.exe 2^>nul') do (
@ -140,11 +148,12 @@ for /F "delims=" %%F in ('where git.exe 2^>nul') do (
popd popd
:: get the version information for the user provided git binary :: get the version information for the user provided git binary
call :read_version USER "!test_dir!" %lib_git% read_version USER "!test_dir!"
%lib_git% validate_version USER !GIT_VERSION_USER!
if !errorlevel! geq 0 ( if !errorlevel! geq 0 (
:: compare the user git version against the vendored version :: compare the user git version against the vendored version
call :compare_versions USER VENDORED %lib_git% compare_versions USER VENDORED
:: use the user provided git if its version is greater than, or equal to the vendored git :: use the user provided git if its version is greater than, or equal to the vendored git
if !errorlevel! geq 0 if exist "!test_dir:~0,-4!\cmd\git.exe" ( if !errorlevel! geq 0 if exist "!test_dir:~0,-4!\cmd\git.exe" (
@ -175,7 +184,7 @@ for /F "delims=" %%F in ('where git.exe 2^>nul') do (
: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"
call :enhance_path "!GIT_INSTALL_ROOT!\cmd" %lib_path% enhance_path "!GIT_INSTALL_ROOT!\cmd"
) else ( ) else (
goto :NO_GIT goto :NO_GIT
) )
@ -184,33 +193,39 @@ if exist "%CMDER_ROOT%\vendor\git-for-windows" (
:: Add git to the path :: Add git to the path
if defined GIT_INSTALL_ROOT ( if defined GIT_INSTALL_ROOT (
rem add the unix commands at the end to not shadow windows commands like more rem add the unix commands at the end to not shadow windows commands like more
if exist "!GIT_INSTALL_ROOT!\cmd\git.exe" call :enhance_path "!GIT_INSTALL_ROOT!\cmd" append if exist "!GIT_INSTALL_ROOT!\cmd\git.exe" %lib_path% enhance_path "!GIT_INSTALL_ROOT!\cmd" append
if exist "!GIT_INSTALL_ROOT!\mingw32" ( if exist "!GIT_INSTALL_ROOT!\mingw32" (
call :enhance_path "!GIT_INSTALL_ROOT!\mingw32" append %lib_path% enhance_path "!GIT_INSTALL_ROOT!\mingw32" append
) else if exist "!GIT_INSTALL_ROOT!\mingw64" ( ) else if exist "!GIT_INSTALL_ROOT!\mingw64" (
call :enhance_path "!GIT_INSTALL_ROOT!\mingw64" append %lib_path% enhance_path "!GIT_INSTALL_ROOT!\mingw64" append
) )
if exist "!GIT_INSTALL_ROOT!\usr\bin" call :enhance_path "%GIT_INSTALL_ROOT%\usr\bin" append %lib_path% enhance_path "!GIT_INSTALL_ROOT!\usr\bin" append
:: define SVN_SSH so we can use git svn with ssh svn repositories :: 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"
) )
:NO_GIT
endlocal & set "PATH=%PATH%" & set "SVN_SSH=%SVN_SSH%" & set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%" endlocal & set "PATH=%PATH%" & set "SVN_SSH=%SVN_SSH%" & set "GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%"
call :debug-output init.bat - Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT% %lib_console% debug-output init.bat "Env Var - GIT_INSTALL_ROOT=%GIT_INSTALL_ROOT%"
%lib_console% debug-output init.bat "Found Git in: '%GIT_INSTALL_ROOT%'"
goto :PATH_ENHANCE
:: Enhance Path :NO_GIT
call :enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth% :: Skip this if GIT WAS FOUND else we did 'endlocal' above!
endlocal
:PATH_ENHANCE
%lib_path% enhance_path_recursive "%CMDER_ROOT%\bin" %max_depth%
if defined CMDER_USER_BIN ( if defined CMDER_USER_BIN (
call :enhance_path "%CMDER_USER_BIN%" %max_depth% %lib_path% enhance_path_recursive "%CMDER_USER_BIN%" %max_depth%
) )
call :enhance_path "%CMDER_ROOT%" append %lib_path% enhance_path "%CMDER_ROOT%" append
:: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d" :: Drop *.bat and *.cmd files into "%CMDER_ROOT%\config\profile.d"
:: to run them at startup. :: to run them at startup.
call :run_profile_d "%CMDER_ROOT%\config\profile.d" %lib_profile% run_profile_d "%CMDER_ROOT%\config\profile.d"
if defined CMDER_USER_CONFIG ( if defined CMDER_USER_CONFIG (
call :run_profile_d "%CMDER_USER_CONFIG%\profile.d" %lib_profile% run_profile_d "%CMDER_USER_CONFIG%\profile.d"
) )
:: Allows user to override default aliases store using profile.d :: Allows user to override default aliases store using profile.d
@ -269,7 +284,7 @@ call "%user-aliases%"
:: Basically we need to execute this post-install.bat because we are :: Basically we need to execute this post-install.bat because we are
:: manually extracting the archive rather than executing the 7z sfx :: manually extracting the archive rather than executing the 7z sfx
if exist "%GIT_INSTALL_ROOT%\post-install.bat" ( if exist "%GIT_INSTALL_ROOT%\post-install.bat" (
call :verbose-output Running Git for Windows one time Post Install.... %lib_console% verbose-output "Running Git for Windows one time Post Install...."
pushd "%GIT_INSTALL_ROOT%\" pushd "%GIT_INSTALL_ROOT%\"
"%GIT_INSTALL_ROOT%\git-bash.exe" --no-needs-console --hide --no-cd --command=post-install.bat "%GIT_INSTALL_ROOT%\git-bash.exe" --no-needs-console --hide --no-cd --command=post-install.bat
popd popd
@ -277,18 +292,24 @@ if exist "%GIT_INSTALL_ROOT%\post-install.bat" (
:: Set home path :: Set home path
if not defined HOME set "HOME=%USERPROFILE%" if not defined HOME set "HOME=%USERPROFILE%"
call :debug-output init.bat - Env Var - HOME=%HOME% %lib_console% debug-output init.bat "Env Var - HOME=%HOME%"
set "initialConfig=%CMDER_ROOT%\config\user-profile.cmd"
if exist "%CMDER_ROOT%\config\user-profile.cmd" ( if exist "%CMDER_ROOT%\config\user-profile.cmd" (
REM Create this file and place your own command in there REM Create this file and place your own command in there
call "%CMDER_ROOT%\config\user-profile.cmd" call "%CMDER_ROOT%\config\user-profile.cmd"
) )
if defined CMDER_USER_CONFIG if exist "%CMDER_USER_CONFIG%\user-profile.cmd" ( if defined CMDER_USER_CONFIG (
REM Create this file and place your own command in there set "initialConfig=%CMDER_USER_CONFIG%\user-profile.cmd"
call "%CMDER_USER_CONFIG%\user-profile.cmd" if exist "%CMDER_USER_CONFIG%\user-profile.cmd" (
) else ( REM Create this file and place your own command in there
echo Creating user startup file: "%CMDER_ROOT%\config\user-profile.cmd" call "%CMDER_USER_CONFIG%\user-profile.cmd"
)
)
if not exist "%initialConfig%" (
echo Creating user startup file: "%initialConfig%"
( (
echo :: use this file to run your own startup commands echo :: use this file to run your own startup commands
echo :: use in front of the command to prevent printing the command echo :: use in front of the command to prevent printing the command
@ -304,243 +325,8 @@ echo :: you can add your plugins to the cmder path like so
echo :: set "PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%" echo :: set "PATH=%%CMDER_ROOT%%\vendor\whatever;%%PATH%%"
echo. echo.
echo @echo off echo @echo off
) >"%temp%\user-profile.tmp" ) >"%initialConfig%"
if defined CMDER_USER_CONFIG (
copy "%temp%\user-profile.tmp" "%CMDER_USER_CONFIG%\user-profile.cmd"
) else (
copy "%temp%\user-profile.tmp" "%CMDER_ROOT%\config\user-profile.cmd"
)
) )
set initialConfig=
exit /b exit /b
::
:: sub-routines below here
::
:debug-output
if %debug-output% gtr 0 echo %* & echo.
exit /b
:verbose-output
if %debug-output% gtr 0 (
call :debug-output :verbose-output - %*
) else if %verbose-output% gtr 0 (
echo %*
)
exit /b
:show_error
echo ERROR: %*
echo CMDER Shell Initialization has Failed!
exit /b
:run_profile_d
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
call :verbose-output Calling "%~1\%%x"...
call "%~1\%%x"
)
popd
exit /b
::
:: specific to git version comparing
::
:read_version
:: clear the variables
set GIT_VERSION_%~1=
:: set the executable path
set "git_executable=%~2\git.exe"
call :debug-output :read_version - Env Var - git_executable=%git_executable%
:: check if the executable actually exists
if not exist "%git_executable%" (
call :verbose-output "%git_executable%" does not exist!
exit /b -255
)
:: get the git version in the provided directory
for /F "tokens=1,2,3 usebackq" %%F in (`"%git_executable%" --version 2^>nul`) do (
if "%%F %%G" == "git version" (
set "GIT_VERSION_%~1=%%H"
call :debug-output :read_version - Env Var - GIT_VERSION_%~1=%%H
) else (
echo "git --version" returned an inproper version string!
pause
exit /b
)
)
:: parse the returned string
call :debug-output :read_version - Calling - :validate_version "%~1" !GIT_VERSION_%~1!
call :validate_version "%~1" !GIT_VERSION_%~1!
exit /b
:parse_version
:: process a `x.x.x.xxxx.x` formatted string
for /F "tokens=1-3* delims=.,-" %%A in ("%2") do (
set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B"
set "%~1_PATCH=%%C"
set "%~1_BUILD=%%D"
)
exit /b
:validate_version
:: now parse the version information into the corresponding variables
call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes.
call :debug-output :validate_version - Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!
exit /b
:compare_versions
:: checks all major, minor, patch and build variables for the given arguments.
:: whichever binary that has the most recent version will be used based on the return code.
:: call :debug-output Comparing:
:: call :debug-output %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!
:: call :debug-output %~2: !%~2_MAJOR!.!%~2_MINOR!.!%~2_PATCH!.!%~2_BUILD!
if !%~1_MAJOR! GTR !%~2_MAJOR! (exit /b 1)
if !%~1_MAJOR! LSS !%~2_MAJOR! (exit /b -1)
if !%~1_MINOR! GTR !%~2_MINOR! (exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (exit /b -1)
:: looks like we have the same versions.
exit /b 0
:enhance_path
setlocal enabledelayedexpansion
if "%~1" neq "" (
if exist "%~1" (
set "add_path=%~1"
) else (
call :show_error :enhance_path - The path specified. "%~1", does not exist!
exit 1
)
) else (
call :show_error You must specify a directory to add to the path!
exit 1
)
if "%~2" neq "" if /i "%~2" == "append" (
set "position=%~2"
) else (
set "position="
)
set "find_query=%add_path%"
set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %"
set found=0
call :debug-output :enhance_path "Env Var - find_query=%find_query%"
echo "%PATH%"|findstr >nul /I /R ";%find_query%\"$"
if "!ERRORLEVEL!" == "0" set found=1
call :debug-output :enhance_path "Env Var 1 - found=!found!"
if "!found!" == "0" (
echo "%PATH%"|findstr >nul /i /r ";%find_query%;"
if "!ERRORLEVEL!" == "0" set found=1
call :debug-output :enhance_path "Env Var 2 - found=!found!"
)
if "%found%" == "0" (
call :debug-output :enhance_path "BEFORE Env Var - PATH=!path!"
if /i "%position%" == "append" (
call :debug-output :enhance_path "Appending '%add_path%'"
set "PATH=%PATH%;%add_path%"
) else (
call :debug-output :enhance_path "Prepending '%add_path%'"
set "PATH=%add_path%;%PATH%"
)
call :debug-output :enhance_path "AFTER Env Var - PATH=!path!"
)
endlocal & set "PATH=%PATH%"
exit /b
:enhance_path_recursive
::: ==============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if
::: required.
:::
:::include:
:::
::: call "$0"
:::
:::usage:
:::
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::
:::dptions:
:::
::: [max_depth] <in> Max recuse depth. Default: 1
:::
::: append <in> Append instead rather than pre-pend "[dir_path]"
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
::: ------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" (
set "add_path=%~1"
) else (
call :directory to add to the path!"
exit 1
)
if "%~2" gtr "1" (
set "max_depth=%~2"
) else (
set "max_depth=1"
)
if "%~3" neq "" if /i "%~3" == "append" (
set "position=%~3"
) else (
set "position="
)
if "%depth%" == "" set depth=0
call :debug-output :enhance_path_recursive "Env Var - add_path=%add_path%"
call :debug-output :enhance_path_recursive "Env Var - position=%position%"
call :debug-output :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr !depth! (
call :debug-output :enhance_path_recursive "Adding parent directory - '%add_path%'"
call :enhance_path "%add_path%" %position%
set /a "depth=!depth!+1"
for /d %%i in ("%add_path%\*") do (
call :debug-output :enhance_path_recursive "Env Var BEFORE - depth=!depth!"
call :debug-output :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %max_depth% %position%
call :debug-output :enhance_path_recursive "Env Var AFTER- depth=!depth!"
)
)
endlocal & set "PATH=%PATH%"
exit /b

48
vendor/lib/lib_base.cmd vendored Normal file
View File

@ -0,0 +1,48 @@
@echo off
set lib_base=call "%~dp0lib_base.cmd"
if "%~1" == "/h" (
%lib_base% help "%0"
) else if "%1" neq "" (
call :%*
)
exit /b
:help
:::===============================================================================
:::show_subs - shows all sub routines in a .bat/.cmd file with documentation
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_base% show_subs "file"
:::.
:::options:
:::.
::: file <in> full path to file containing lib_routines to display
:::.
:::-------------------------------------------------------------------------------
for /f "tokens=* delims=:" %%a in ('type "%~1" ^| findstr /i /r "^:::"') do (
rem echo a="%%a"
if "%%a"==" " (
echo.
if "%%a"=="." (
echo.
) else if /i "%%a" == "usage" (
echo %%a:
) else if /i "%%a" == "options" (
echo %%a:
) else if not "%%a" == "" (
echo %%a
)
)
pause
exit /b

79
vendor/lib/lib_console.cmd vendored Normal file
View File

@ -0,0 +1,79 @@
@echo off
rem set args=%*
call "%~dp0lib_base.cmd"
set lib_console=call "%~dp0lib_console.cmd"
if "%~1" == "/h" (
%lib_base% help "%0"
) else if "%1" neq "" (
call :%*
)
exit /b
:debug-output
:::===============================================================================
:::debug-output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% debug-output [caller] [message]
:::.
:::required:
:::.
::: [caller] <in> Script/sub routine name calling debug-output
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %debug-output% gtr 0 echo DEBUG(%~1): %~2 & echo.
exit /b
:verbose-output
:::===============================================================================
:::verbose-output - Output a debug message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% verbose-output "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
if %verbose-output% gtr 0 echo %~1
exit /b
:show_error
:::===============================================================================
:::show_error - Output an error message to the console.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_console% show_error "[message]"
:::.
:::required:
:::.
::: [message] <in> Message text to display.
:::.
:::-------------------------------------------------------------------------------
echo ERROR: %~1
exit /b

168
vendor/lib/lib_git.cmd vendored Normal file
View File

@ -0,0 +1,168 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console.cmd"
set lib_git=call "%~dp0lib_git.cmd"
if "%~1" == "/h" (
%lib_base% help "%0"
) else if "%1" neq "" (
call :%*
)
exit /b
:read_version
:::===============================================================================
:::read_version - Get the git.exe verion
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% read_version "[dir_path]"
:::.
:::required:
:::.
::: [GIT SCOPE] <in> USER | VENDORED
::: [GIT PATH] <in> Fully qualified path to the Git command root.
:::.
:::output:
:::.
::: GIT_VERSION_[GIT SCOPE] <out> Env variable containing Git semantic version string
:::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
:: clear the variables
set GIT_VERSION_%~1=
:: set the executable path
set "git_executable=%~2\git.exe"
%lib_console% debug-output :read_version "Env Var - git_executable=%git_executable%"
:: check if the executable actually exists
if not exist "%git_executable%" (
%lib_console% debug-output :read_version "%git_executable% does not exist."
exit /b -255
)
:: get the git version in the provided directory
for /F "tokens=1,2,3 usebackq" %%A in (`"%git_executable%" --version 2^>nul`) do (
if /i "%%A %%B" == "git version" (
set "GIT_VERSION_%~1=%%C"
%lib_console% debug-output :read_version "Env Var - GIT_VERSION_%~1=%%C"
) else (
%lib_console% show_error "git --version" returned an inproper version string!
pause
exit /b
)
)
endlocal & set GIT_VERSION%~1=!GIT_VERSION%~1!
exit /b
:parse_version
:::===============================================================================
:::parse_version - Parse semantic version string 'x.x.x.x' and return the pieces
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% parse_version "[VERSION]"
:::.
:::required:
:::.
::: [SCOPE] <in> USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::.
:::output:
:::.
::: [SCOPE]_MAJOR <out> Scoped Major version.
::: [SCOPE]_MINOR <out> Scoped Minor version.
::: [SCOPE]_PATCH <out> Scoped Patch version.
::: [SCOPE]_BUILD <out> Scoped Build version.
:::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
:: process a `x.x.x.xxxx.x` formatted string
for /F "tokens=1-3* delims=.,-" %%A in ("%2") do (
set "%~1_MAJOR=%%A"
set "%~1_MINOR=%%B"
set "%~1_PATCH=%%C"
set "%~1_BUILD=%%D"
)
endlocal & set "%~1_MAJOR=!%~1_MAJOR!" & set "%~1_MINOR=!%~1_MINOR!" & set "%~1_PATCH=!%~1_PATCH!" & set "%~1_BUILD=!%~1_BUILD!"
exit /b
:validate_version
:::===============================================================================
:::validate_version - Validate semantic version string 'x.x.x.x'.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE] [VERSION]
:::.
:::required:
:::.
::: [SCOPE] <in> Example: USER | VENDORED
::: [VERSION] <in> Semantic version String. Ex: 1.2.3.4
:::-------------------------------------------------------------------------------
:: now parse the version information into the corresponding variables
call :parse_version %~1 %~2
:: ... and maybe display it, for debugging purposes.
%lib_console% debug-output :validate_version "Found Git Version for %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!"
exit /b
:compare_versions
:::===============================================================================
:::compare_version - Compare semantic versions return latest version.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: %lib_git% validate_version [SCOPE1] [SCOPE2]
:::.
:::required:
:::.
::: [SCOPE1] <in> Example: USER
::: [SCOPE2] <in> Example: VENDOR
:::-------------------------------------------------------------------------------
:: 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.
:: %lib_console% debug-output Comparing:
:: %lib_console% debug-output %~1: !%~1_MAJOR!.!%~1_MINOR!.!%~1_PATCH!.!%~1_BUILD!
:: %lib_console% debug-output %~2: !%~2_MAJOR!.!%~2_MINOR!.!%~2_PATCH!.!%~2_BUILD!
if !%~1_MAJOR! GTR !%~2_MAJOR! (exit /b 1)
if !%~1_MAJOR! LSS !%~2_MAJOR! (exit /b -1)
if !%~1_MINOR! GTR !%~2_MINOR! (exit /b 1)
if !%~1_MINOR! LSS !%~2_MINOR! (exit /b -1)
if !%~1_PATCH! GTR !%~2_PATCH! (exit /b 1)
if !%~1_PATCH! LSS !%~2_PATCH! (exit /b -1)
if !%~1_BUILD! GTR !%~2_BUILD! (exit /b 1)
if !%~1_BUILD! LSS !%~2_BUILD! (exit /b -1)
:: looks like we have the same versions.
exit /b 0

155
vendor/lib/lib_path.cmd vendored Normal file
View File

@ -0,0 +1,155 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_path=call "%~dp0lib_path.cmd"
if "%~1" == "/h" (
%lib_base% help "%0"
) else if "%1" neq "" (
call :%*
)
exit /b
:enhance_path
:::===============================================================================
:::enhance_path - Add a directory to the path env variable if required.
:::
:::include:
:::
::: call "$0"
:::
:::usage:
:::
::: %lib_path% enhance_path "[dir_path]" [append]
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::
:::options:
:::
::: append <in> Append to the path env variable rather than pre-pend.
:::
:::output:
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" (
set "add_path=%~1"
) else (
%lib_console% show_error "You must specify a directory to add to the path!"
exit 1
)
if "%~2" neq "" if /i "%~2" == "append" (
set "position=%~2"
) else (
set "position="
)
set "find_query=%add_path%"
set "find_query=%find_query:\=\\%"
set "find_query=%find_query: =\ %"
set found=0
%lib_console% debug-output :enhance_path "Env Var - find_query=%find_query%"
echo "%PATH%"|findstr >nul /I /R ";%find_query%\"$"
if "!ERRORLEVEL!" == "0" set found=1
%lib_console% debug-output :enhance_path "Env Var 1 - found=!found!"
if "!found!" == "0" (
echo "%PATH%"|findstr >nul /i /r ";%find_query%;"
if "!ERRORLEVEL!" == "0" set found=1
%lib_console% debug-output :enhance_path "Env Var 2 - found=!found!"
)
if "%found%" == "0" (
%lib_console% debug-output :enhance_path "BEFORE Env Var - PATH=!path!"
if /i "%position%" == "append" (
%lib_console% debug-output :enhance_path "Appending '%add_path%'"
set "PATH=%PATH%;%add_path%"
) else (
%lib_console% debug-output :enhance_path "Prepending '%add_path%'"
set "PATH=%add_path%;%PATH%"
)
%lib_console% debug-output :enhance_path "AFTER Env Var - PATH=!path!"
)
endlocal & set "PATH=%PATH:;;=;%"
exit /b
:enhance_path_recursive
:::===============================================================================
:::enhance_path_recursive - Add a directory and subs to the path env variable if
::: required.
:::.
:::include:
:::.
::: call "$0"
:::.
:::usage:
:::.
::: call "%~DP0lib_path" enhance_path_recursive "[dir_path]" [max_depth] [append]
:::.
:::required:
:::.
::: [dir_path] <in> Fully qualified directory path. Ex: "c:\bin"
:::.
:::options:
:::.
::: [max_depth] <in> Max recuse depth. Default: 1
:::.
::: append <in> Append instead to path env variable rather than pre-pend.
:::.
:::output:
:::.
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
setlocal enabledelayedexpansion
if "%~1" neq "" (
set "add_path=%~1"
) else (
%lib_console% show_error "You must specify a directory to add to the path!"
exit 1
)
if "%~2" gtr "1" (
set "max_depth=%~2"
) else (
set "max_depth=1"
)
if "%~3" neq "" if /i "%~3" == "append" (
set "position=%~3"
) else (
set "position="
)
if "%depth%" == "" set depth=0
%lib_console% debug-output :enhance_path_recursive "Env Var - add_path=%add_path%"
%lib_console% debug-output :enhance_path_recursive "Env Var - position=%position%"
%lib_console% debug-output :enhance_path_recursive "Env Var - max_depth=%max_depth%"
if %max_depth% gtr !depth! (
%lib_console% debug-output :enhance_path_recursive "Adding parent directory - '%add_path%'"
call :enhance_path "%add_path%" %position%
set /a "depth=!depth!+1"
for /d %%i in ("%add_path%\*") do (
%lib_console% debug-output :enhance_path_recursive "Env Var BEFORE - depth=!depth!"
%lib_console% debug-output :enhance_path_recursive "Found Subdirectory - '%%~fi'"
call :enhance_path_recursive "%%~fi" %max_depth% %position%
%lib_console% debug-output :enhance_path_recursive "Env Var AFTER- depth=!depth!"
)
)
endlocal & set "PATH=%PATH%"
exit /b

46
vendor/lib/lib_profile.cmd vendored Normal file
View File

@ -0,0 +1,46 @@
@echo off
call "%~dp0lib_base.cmd"
call "%%~dp0lib_console"
set lib_profile=call "%~dp0lib_profile.cmd"
if "%~1" == "/h" (
%lib_base% help "%0"
) else if "%1" neq "" (
call :%*
)
exit /b
:run_profile_d
:::===============================================================================
:::run_profile_d - Run all scripts in the passed dir path
:::
:::include:
:::
::: call "$0"
:::
:::usage:
:::
::: %lib_profile% "[dir_path]"
:::
:::required:
:::
::: [dir_path] <in> Fully qualified directory path containing init *.cmd|*.bat.
::: Example: "c:\bin"
:::
::: path <out> Sets the path env variable if required.
:::-------------------------------------------------------------------------------
if not exist "%~1" (
mkdir "%~1"
)
pushd "%~1"
for /f "usebackq" %%x in ( `dir /b *.bat *.cmd 2^>nul` ) do (
%lib_console% verbose-output "Calling '%~1\%%x'..."
call "%~1\%%x"
)
popd
exit /b

2
vendor/profile.ps1 vendored
View File

@ -140,7 +140,7 @@ popd
# 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 -not (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) { if ($ENV:CMDER_USER_CONFIG -ne "" -and (test-path "$ENV:CMDER_USER_CONFIG\profile.d")) {
pushd $ENV:CMDER_USER_CONFIG\profile.d pushd $ENV:CMDER_USER_CONFIG\profile.d
foreach ($x in Get-ChildItem *.ps1) { foreach ($x in Get-ChildItem *.ps1) {
# write-host write-host Sourcing $x # write-host write-host Sourcing $x

View File

@ -9,8 +9,16 @@
#region Setup #region Setup
Write-Debug 'Set up the global scope config variables.' Write-Debug 'Set up the global scope config variables.'
$global:UserModuleBasePath = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath 'WindowsPowerShell\Modules' if ([Environment]::GetFolderPath('MyDocuments')) {
$global:CommonGlobalModuleBasePath = Join-Path -Path $env:CommonProgramFiles -ChildPath 'Modules' $global:UserModuleBasePath = Join-Path -Path ([Environment]::GetFolderPath('MyDocuments')) -ChildPath 'WindowsPowerShell\Modules'
}
else {
# Support scenarios where PSGet is running without a MyDocuments special folder (e.g. executing within a DSC resource)
$global:UserModuleBasePath = Join-Path -Path $env:ProgramFiles -ChildPath 'WindowsPowerShell\Modules'
}
# NOTE: Path changed to align with current MS conventions
$global:CommonGlobalModuleBasePath = Join-Path -Path $env:ProgramFiles -ChildPath 'WindowsPowerShell\Modules'
if (-not (Test-Path -Path:variable:global:PsGetDirectoryUrl)) { if (-not (Test-Path -Path:variable:global:PsGetDirectoryUrl)) {
$global:PsGetDirectoryUrl = 'https://github.com/psget/psget/raw/master/Directory.xml' $global:PsGetDirectoryUrl = 'https://github.com/psget/psget/raw/master/Directory.xml'
@ -96,16 +104,16 @@ Set-Variable -Name PSGET_PSD1 -Value 'PSD1' -Option Constant -Scope Script
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: definition in directory file or 'Install.ps1' Default: definition in directory file or 'Install.ps1'
.PARAMETER Force .PARAMETER Force
OBSOLATE OBSOLETE
Alternative name for 'Update'. Alternative name for 'Update'.
.PARAMETER Startup .PARAMETER Startup
OBSOLATE OBSOLETE
Alternative name for 'AddToProfile'. Alternative name for 'AddToProfile'.
.LINK .LINK
@ -349,7 +357,7 @@ function Install-Module {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Will not be check in combination with -All switch. Will not be check in combination with -All switch.
Default: 'Install.ps1' Default: 'Install.ps1'
@ -414,7 +422,7 @@ function Update-Module {
} }
else { else {
Install-Module -Module:$Module -Destination:$Destination -ModuleHash:$ModuleHash -Global:$Global -DoNotImport:$DoNotImport -AddToProfile:$AddToProfile -DirectoryUrl:$DirectoryUrl -Updat -DoNotPostInstall:$DoNotPostInstall -PostInstallHook:$PostInstallHook Install-Module -Module:$Module -Destination:$Destination -ModuleHash:$ModuleHash -Global:$Global -DoNotImport:$DoNotImport -AddToProfile:$AddToProfile -DirectoryUrl:$DirectoryUrl -Update -DoNotPostInstall:$DoNotPostInstall -PostInstallHook:$PostInstallHook
} }
} }
} }
@ -480,7 +488,9 @@ function Get-PsGetModuleInfo {
try { try {
Write-Verbose "Downloading modules repository from $DirectoryUrl" Write-Verbose "Downloading modules repository from $DirectoryUrl"
$repoRaw = $client.DownloadString($DirectoryUrl) $stream = $client.OpenRead($DirectoryUrl)
$repoXmlTemp = New-Object -TypeName System.Xml.XmlDocument
$repoXmlTemp.Load($stream)
$StatusCode = 200 $StatusCode = 200
} }
catch [System.Net.WebException] { catch [System.Net.WebException] {
@ -489,7 +499,7 @@ function Get-PsGetModuleInfo {
} }
if ($StatusCode -eq 200) { if ($StatusCode -eq 200) {
$repoXml = [xml]$repoRaw $repoXml = [xml]$repoXmlTemp
$CacheEntry.ETag = $client.ResponseHeaders['ETag'] $CacheEntry.ETag = $client.ResponseHeaders['ETag']
if (-not (Test-Path -Path $PsGetDataPath)) { if (-not (Test-Path -Path $PsGetDataPath)) {
@ -629,7 +639,7 @@ function Get-PsGetModuleHash {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: definition in directory file or 'Install.ps1' Default: definition in directory file or 'Install.ps1'
#> #>
@ -754,7 +764,7 @@ function Install-ModuleFromDirectory {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -863,7 +873,7 @@ function Install-ModuleFromWeb {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -1010,7 +1020,7 @@ function Install-ModuleFromLocal {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
Default: 'Install.ps1' Default: 'Install.ps1'
#> #>
@ -1311,6 +1321,13 @@ function Import-ModuleGlobally {
Write-Verbose "Importing installed module '$ModuleName' from '$($installedModule.ModuleBase)'" Write-Verbose "Importing installed module '$ModuleName' from '$($installedModule.ModuleBase)'"
Import-Module -Name $ModuleBase -Global -Force:$Force Import-Module -Name $ModuleBase -Global -Force:$Force
# For psget no further checks are needed and their execution cause
# an error for the update process of 'psget'
# https://github.com/psget/psget/issues/186
if ($ModuleName -eq 'PsGet') {
return
}
$IdentityExtension = [System.IO.Path]::GetExtension((Get-ModuleFile -Path $ModuleBase -ModuleName $ModuleName)) $IdentityExtension = [System.IO.Path]::GetExtension((Get-ModuleFile -Path $ModuleBase -ModuleName $ModuleName))
if ($IdentityExtension -eq '.dll') { if ($IdentityExtension -eq '.dll') {
# import module twice for binary modules to workaround PowerShell bug: # import module twice for binary modules to workaround PowerShell bug:
@ -1514,7 +1531,7 @@ function Invoke-DownloadModuleFromWeb {
.PARAMETER DoNotPostInstall .PARAMETER DoNotPostInstall
If defined, the PostInstallHook is not executed. If defined, the PostInstallHook is not executed.
.PARAMERTER PostInstallHook .PARAMETER PostInstallHook
Defines the name of a script inside the installed module folder which should be executed after installation. Defines the name of a script inside the installed module folder which should be executed after installation.
#> #>
function Install-ModuleToDestination { function Install-ModuleToDestination {
@ -1628,7 +1645,7 @@ function Install-ModuleToDestination {
$isDestinationInPSModulePath = $env:PSModulePath.Contains($Destination) $isDestinationInPSModulePath = $env:PSModulePath.Contains($Destination)
if ($isDestinationInPSModulePath) { if ($isDestinationInPSModulePath) {
if (-not (Get-Module $ModuleName -ListAvailable)) { if (-not (Get-Module $InstallWithModuleName -ListAvailable)) {
throw 'For some unexpected reasons module was not installed.' throw 'For some unexpected reasons module was not installed.'
} }
} }
@ -1639,14 +1656,14 @@ function Install-ModuleToDestination {
} }
if ($Update) { if ($Update) {
Write-Host "Module $ModuleName was successfully updated." -Foreground Green Write-Host "Module $InstallWithModuleName was successfully updated." -Foreground Green
} }
else { else {
Write-Host "Module $ModuleName was successfully installed." -Foreground Green Write-Host "Module $InstallWithModuleName was successfully installed." -Foreground Green
} }
if (-not $DoNotImport) { if (-not $DoNotImport) {
Import-ModuleGlobally -ModuleName:$ModuleName -ModuleBase:$targetFolderPath -Force:$Update Import-ModuleGlobally -ModuleName:$InstallWithModuleName -ModuleBase:$targetFolderPath -Force:$Update
} }
if ($isDestinationInPSModulePath -and $AddToProfile) { if ($isDestinationInPSModulePath -and $AddToProfile) {
@ -1657,8 +1674,8 @@ function Install-ModuleToDestination {
New-Item $PROFILE -Type File -Force -ErrorAction Stop New-Item $PROFILE -Type File -Force -ErrorAction Stop
} }
if (Select-String $PROFILE -Pattern "Import-Module $ModuleName") { if (Select-String $PROFILE -Pattern "Import-Module $InstallWithModuleName") {
Write-Verbose "Import-Module $ModuleName command already in your profile" Write-Verbose "Import-Module $InstallWithModuleName command already in your profile"
} }
else { else {
$signature = Get-AuthenticodeSignature -FilePath $PROFILE $signature = Get-AuthenticodeSignature -FilePath $PROFILE
@ -1667,8 +1684,8 @@ function Install-ModuleToDestination {
Write-Error "PsGet cannot modify code-signed profile '$PROFILE'." Write-Error "PsGet cannot modify code-signed profile '$PROFILE'."
} }
else { else {
Write-Verbose "Add Import-Module $ModuleName command to the profile" Write-Verbose "Add Import-Module $InstallWithModuleName command to the profile"
"`nImport-Module $ModuleName" | Add-Content $PROFILE "`nImport-Module $InstallWithModuleName" | Add-Content $PROFILE
} }
} }
} }
@ -1736,7 +1753,7 @@ function Test-ModuleInstalledAndImport {
return $false return $false
} }
Write-Warning "The module '$ModuleName' was installed at more then one location. Installed paths:`n`t$($installedModule.ModuleBase | Format-List | Out-String)`n'$($firstInstalledModule.ModuleBase)' is the searched destination." Write-Warning "The module '$ModuleName' was installed at more than one location. Installed paths:`n`t$($installedModule.ModuleBase | Format-List | Out-String)`n'$($firstInstalledModule.ModuleBase)' is the searched destination."
$installedModule = $targetModule $installedModule = $targetModule
} }
elseif ((Split-Path $installedModule.ModuleBase) -ne $Destination) { elseif ((Split-Path $installedModule.ModuleBase) -ne $Destination) {
@ -1801,7 +1818,7 @@ function Expand-ZipModule {
# Check if powershell v3+ and .net v4.5 is available # Check if powershell v3+ and .net v4.5 is available
$netFailed = $true $netFailed = $true
if ( $PSVersionTable.PSVersion.Major -ge 3 -and (Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4' -Recurse | Get-ItemProperty -Name Version | Where-Object { $_.Version -like '4.5*' }) ) { if ( $PSVersionTable.PSVersion.Major -ge 3 -and (Get-ChildItem -Path 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4' -Recurse | Get-ItemProperty -Name Version | Where-Object { $_.Version -like '4.5*' -Or $_.Version -ge '4.5' }) ) {
Write-Debug 'Attempting unzip using the .NET Framework...' Write-Debug 'Attempting unzip using the .NET Framework...'
try { try {
@ -1910,14 +1927,20 @@ function Invoke-DownloadNuGetPackage {
} }
Write-Verbose "Querying '$Source' repository for package with Id '$NuGetPackageId'" Write-Verbose "Querying '$Source' repository for package with Id '$NuGetPackageId'"
$Url = "{1}Packages()?`$filter=tolower(Id)+eq+'{0}'&`$orderby=Id" -f $NuGetPackageId.ToLower(), $Source
Write-Debug "NuGet query url: $Url"
try { try {
$Url = "{1}Packages()?`$filter=tolower(Id)+eq+'{0}'&`$orderby=Id" -f $NuGetPackageId.ToLower(), $Source
Write-Debug "Trying NuGet query url: $Url"
$XmlDoc = [xml]$WebClient.DownloadString($Url) $XmlDoc = [xml]$WebClient.DownloadString($Url)
} }
catch { catch {
throw "Unable to download from NuGet feed: $($_.Exception.InnerException.Message)" try {
$Url = "{1}Packages(Id='{0}')?`$orderby=Id" -f $NuGetPackageId, $Source
Write-Debug "Trying NuGet query url: $Url"
$XmlDoc = [xml]$WebClient.DownloadString($Url)
}
catch {
throw "Unable to download from NuGet feed: $($_.Exception.InnerException.Message)"
}
} }
if ($PackageVersion) { if ($PackageVersion) {
@ -2110,7 +2133,7 @@ function TabExpansion {
Get-PsGetModuleInfo -ModuleName "$lastword*" | % { $_.Id } | sort -Unique Get-PsGetModuleInfo -ModuleName "$lastword*" | % { $_.Id } | sort -Unique
} }
elseif ( Test-Path -Path Function:\$tabExpansionBackup ) { elseif ( Test-Path -Path Function:\$tabExpansionBackup ) {
& $teBackup $line $lastWord & $tabExpansionBackup $line $lastWord
} }
} }
} }

8
vendor/sources.json vendored
View File

@ -1,8 +1,8 @@
[ [
{ {
"name": "git-for-windows", "name": "git-for-windows",
"version": "v2.16.2.windows.1", "version": "v2.17.1.windows.2",
"url": "https://github.com/git-for-windows/git/releases/download/v2.16.2.windows.1/PortableGit-2.16.2-64-bit.7z.exe" "url": "https://github.com/git-for-windows/git/releases/download/v2.17.1.windows.2/PortableGit-2.17.1.2-64-bit.7z.exe"
}, },
{ {
"name": "clink", "name": "clink",
@ -11,8 +11,8 @@
}, },
{ {
"name": "conemu-maximus5", "name": "conemu-maximus5",
"version": "180206", "version": "180528",
"url": "https://github.com/Maximus5/ConEmu/releases/download/v18.02.06/ConEmuPack.180206.7z" "url": "https://github.com/Maximus5/ConEmu/releases/download/v18.05.28/ConEmuPack.180528.7z"
}, },
{ {
"name": "clink-completions", "name": "clink-completions",