mirror of
https://github.com/cmderdev/cmder.git
synced 2026-03-17 16:26:07 +08:00
Compare commits
18 Commits
copilot/ad
...
setup-cmde
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88c1fce86d | ||
|
|
9eba883ab0 | ||
|
|
7f22d2eb73 | ||
|
|
573bf6ebfb | ||
|
|
05de4f606a | ||
|
|
c8495a0f58 | ||
|
|
6593acf8c8 | ||
|
|
c06d852248 | ||
|
|
ee967279d0 | ||
|
|
9e6e1485b0 | ||
|
|
baef798b6c | ||
|
|
865d0c1858 | ||
|
|
60848f56c5 | ||
|
|
b86fca35bc | ||
|
|
d05d03117a | ||
|
|
6ba699a3c4 | ||
|
|
13dd021d6a | ||
|
|
c3f239267d |
11
.github/dependabot.yml
vendored
11
.github/dependabot.yml
vendored
@@ -1,11 +1,10 @@
|
|||||||
# To get started with Dependabot version updates, you'll need to specify which
|
|
||||||
# package ecosystems to update and where the package manifests are located.
|
|
||||||
# Please see the documentation for all configuration options:
|
|
||||||
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
|
||||||
|
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: "github-actions" # See documentation for possible values
|
# Enable version updates for GitHub Actions
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
|
labels:
|
||||||
|
- "👆 Dependencies"
|
||||||
|
- "🔄️ GitHub Actions"
|
||||||
|
|||||||
17
.github/workflows/build.yml
vendored
17
.github/workflows/build.yml
vendored
@@ -97,26 +97,26 @@ jobs:
|
|||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
- name: Upload artifact (cmder.zip)
|
- name: Upload artifact (cmder.zip)
|
||||||
uses: actions/upload-artifact@v5
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
path: build/cmder.zip
|
path: build/cmder.zip
|
||||||
name: cmder.zip
|
name: cmder.zip
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Upload artifact (cmder.7z)
|
- name: Upload artifact (cmder.7z)
|
||||||
uses: actions/upload-artifact@v5
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
path: build/cmder.7z
|
path: build/cmder.7z
|
||||||
name: cmder.7z
|
name: cmder.7z
|
||||||
|
|
||||||
- name: Upload artifact (cmder_mini.zip)
|
- name: Upload artifact (cmder_mini.zip)
|
||||||
uses: actions/upload-artifact@v5
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
path: build/cmder_mini.zip
|
path: build/cmder_mini.zip
|
||||||
name: cmder_mini.zip
|
name: cmder_mini.zip
|
||||||
|
|
||||||
- name: Upload artifact (hashes.txt)
|
- name: Upload artifact (hashes.txt)
|
||||||
uses: actions/upload-artifact@v5
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
path: build/hashes.txt
|
path: build/hashes.txt
|
||||||
name: hashes.txt
|
name: hashes.txt
|
||||||
@@ -128,10 +128,10 @@ jobs:
|
|||||||
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY
|
echo "### ☁️ Upload Status" >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY
|
echo "All artifacts successfully uploaded to GitHub Actions:" >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "- ✅ \`cmder.zip\`" >> $env:GITHUB_STEP_SUMMARY
|
echo '- ✅ `cmder.zip`' >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "- ✅ \`cmder.7z\`" >> $env:GITHUB_STEP_SUMMARY
|
echo '- ✅ `cmder.7z`' >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "- ✅ \`cmder_mini.zip\`" >> $env:GITHUB_STEP_SUMMARY
|
echo '- ✅ `cmder_mini.zip`' >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "- ✅ \`hashes.txt\`" >> $env:GITHUB_STEP_SUMMARY
|
echo '- ✅ `hashes.txt`' >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
@@ -160,3 +160,4 @@ jobs:
|
|||||||
echo "- File hashes (\`hashes.txt\`)" >> $env:GITHUB_STEP_SUMMARY
|
echo "- File hashes (\`hashes.txt\`)" >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
echo "" >> $env:GITHUB_STEP_SUMMARY
|
||||||
echo "> ⚠️ Release is in **draft** mode. Please review and publish manually." >> $env:GITHUB_STEP_SUMMARY
|
echo "> ⚠️ Release is in **draft** mode. Please review and publish manually." >> $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
|
|||||||
53
.github/workflows/codeql.yml
vendored
53
.github/workflows/codeql.yml
vendored
@@ -50,17 +50,20 @@ jobs:
|
|||||||
- name: Summary - CodeQL analysis started
|
- name: Summary - CodeQL analysis started
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "## 🔒 CodeQL Security Analysis - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'## 🔒 CodeQL Security Analysis - Workflow Summary'
|
||||||
echo "### Analysis Configuration" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### Analysis Configuration'
|
||||||
echo "| Property | Value |" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "| --- | --- |" >> $env:GITHUB_STEP_SUMMARY
|
'| Property | Value |'
|
||||||
echo "| Repository | \`${{ github.repository }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
'| --- | --- |'
|
||||||
echo "| Branch | \`${{ github.ref_name }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
'| Repository | `${{ github.repository }}` |'
|
||||||
echo "| Language | \`${{ matrix.language }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
'| Branch | `${{ github.ref_name }}` |'
|
||||||
echo "| Commit | \`${{ github.sha }}\` |" >> $env:GITHUB_STEP_SUMMARY
|
'| Language | `${{ matrix.language }}` |'
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'| Commit | `${{ github.sha }}` |'
|
||||||
|
''
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
@@ -86,10 +89,13 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### ✅ Build Completed" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### ✅ Build Completed'
|
||||||
echo "Cmder launcher built successfully for CodeQL analysis." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'Cmder launcher built successfully for CodeQL analysis.'
|
||||||
|
''
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v4
|
uses: github/codeql-action/analyze@v4
|
||||||
@@ -100,10 +106,13 @@ jobs:
|
|||||||
if: success()
|
if: success()
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### 🔍 CodeQL Analysis Results" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### 🔍 CodeQL Analysis Results'
|
||||||
echo "✅ CodeQL security analysis completed successfully." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'✅ CodeQL security analysis completed successfully.'
|
||||||
echo "**Language analyzed:** \`${{ matrix.language }}\`" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'**Language analyzed:** `${{ matrix.language }}`'
|
||||||
echo "> Check the Security tab for detailed findings and recommendations." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
|
'> Check the Security tab for detailed findings and recommendations.'
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
|
|||||||
60
.github/workflows/vendor.yml
vendored
60
.github/workflows/vendor.yml
vendored
@@ -31,10 +31,13 @@ jobs:
|
|||||||
- name: Summary - Workflow started
|
- name: Summary - Workflow started
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "## 📦 Update Vendor - Workflow Summary" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'## 📦 Update Vendor - Workflow Summary'
|
||||||
echo "Checking for vendor dependency updates..." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'Checking for vendor dependency updates...'
|
||||||
|
''
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
- id: make-changes
|
- id: make-changes
|
||||||
name: Checking for updates
|
name: Checking for updates
|
||||||
@@ -62,22 +65,28 @@ jobs:
|
|||||||
- name: Summary - Update check results
|
- name: Summary - Update check results
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
$count = $env:COUNT_UPDATED
|
$count = [int]$env:COUNT_UPDATED
|
||||||
if ($count -eq 0) {
|
if ($count -eq 0) {
|
||||||
echo "### ✅ No Updates Available" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### ✅ No Updates Available'
|
||||||
echo "All vendor dependencies are up to date." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
|
'All vendor dependencies are up to date.'
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
} else {
|
} else {
|
||||||
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
||||||
echo "### 🔄 Updates Found" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### 🔄 Updates Found'
|
||||||
echo "**$count** vendor $word updated:" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
"**$count** vendor $word updated:"
|
||||||
echo "$env:UPDATE_MESSAGE" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$env:UPDATE_MESSAGE
|
||||||
|
''
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
}
|
}
|
||||||
|
|
||||||
- uses: peter-evans/create-pull-request@v7
|
- uses: peter-evans/create-pull-request@v8
|
||||||
if: env.COUNT_UPDATED > 0
|
if: env.COUNT_UPDATED > 0
|
||||||
with:
|
with:
|
||||||
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
title: 'Updates to `${{ env.COUNT_UPDATED }}` vendored dependencies'
|
||||||
@@ -94,12 +103,15 @@ jobs:
|
|||||||
if: env.COUNT_UPDATED > 0
|
if: env.COUNT_UPDATED > 0
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
echo "### 🎉 Pull Request Created" >> $env:GITHUB_STEP_SUMMARY
|
$summary = @(
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'### 🎉 Pull Request Created'
|
||||||
echo "A pull request has been created to update the vendor dependencies." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'A pull request has been created to update the vendor dependencies.'
|
||||||
echo "**Branch:** \`update-vendor\`" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
'**Branch:** `update-vendor`'
|
||||||
echo "**Updated dependencies:** $env:LIST_UPDATED" >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
echo "" >> $env:GITHUB_STEP_SUMMARY
|
$env:LIST_UPDATED -and "**Updated dependencies:** $env:LIST_UPDATED" -or "**Updated dependencies:** "
|
||||||
echo "> Please review and merge the pull request to apply the updates." >> $env:GITHUB_STEP_SUMMARY
|
''
|
||||||
|
'> Please review and merge the pull request to apply the updates.'
|
||||||
|
)
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY
|
||||||
|
|||||||
79
CHANGELOG.md
79
CHANGELOG.md
@@ -1,5 +1,84 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## [1.3.25](https://github.com/cmderdev/cmder/tree/v1.3.25) (2024-05-31)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Component Updates
|
||||||
|
- Update Git for Windows to 2.45.1.windows.1.
|
||||||
|
- Update ConEmu to 24.05.31.
|
||||||
|
- Clink 1.6.14.
|
||||||
|
- clink-completions 0.5.2.
|
||||||
|
|
||||||
|
- Add `SECURITY.md` and refresh CI workflows and actions.
|
||||||
|
- Enable `match.expand_envvars` and improve git diagnostics for improper versions.
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- Fix #2944.
|
||||||
|
- Fix script error when the working directory contains `%`.
|
||||||
|
- Remove environment refresh race condition.
|
||||||
|
|
||||||
|
## [1.3.24](https://github.com/cmderdev/cmder/tree/v1.3.24) (2023-07-24)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Update `build.yml` workflow.
|
||||||
|
|
||||||
|
## [1.3.23](https://github.com/cmderdev/cmder/tree/v1.3.23) (2023-07-24)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Update ConEmu (conemu-maximus5) to 23.07.24.
|
||||||
|
|
||||||
|
## [1.3.22](https://github.com/cmderdev/cmder/tree/v1.3.22) (2023-07-24)
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Handle Clink injction differently in `init.bat`.
|
||||||
|
- Changes to `clink_settings.lua.default`.
|
||||||
|
- Do not add commands to Clink Command Line History that begin with whitespace as a default.
|
||||||
|
- This can be changed to the old behavior by setting `history_ignore_space` to `0` in `config\clink_settings.lua`.
|
||||||
|
- `history.max_lines` is now defaults to `25000` instead of `10000`.
|
||||||
|
- This can be changed back to the old behavior by setting `history_max_lines` to `10000` in `config\clink_settings.lua`.
|
||||||
|
- `history.shared` now defaults to `False` instead of `True`.
|
||||||
|
- The previous default of `True` was causing issues with some users when using Cmder in multiple sessions.
|
||||||
|
- This can be changed back to the old behavior by setting `history_shared` to `1` in `config\clink_settings.lua`.
|
||||||
|
|
||||||
|
- Component Updates
|
||||||
|
- Git for Windows to 2.41.0.windows.3
|
||||||
|
- Clink to 1.5.1
|
||||||
|
- ConEmu to 23.07.23
|
||||||
|
- clink-completions to 0.4.10
|
||||||
|
|
||||||
|
- Remove AppVeyor configuration and add CodeQL scanning and Dependabot updates.
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- Fix `/task "<taskName>"` handling.
|
||||||
|
- Skip clink injection when initialization fails fatally.
|
||||||
|
- Fix errors when git/svn/hg are not installed and in profile.d PowerShell scripts.
|
||||||
|
|
||||||
|
## [1.3.21](https://github.com/cmderdev/cmder/tree/v1.3.21) (2022-12-19)
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- Fix #2789.
|
||||||
|
- Fix Git Bash `GIT_INSTALL_ROOT` handling.
|
||||||
|
|
||||||
|
### Changes
|
||||||
|
|
||||||
|
- Refactor `clink.lua` to speed up the prompt.
|
||||||
|
- Refactor and Cleanup `init.bat` and related scripts.
|
||||||
|
- Refactor and Cleanup `profile.ps1` and related scripts.
|
||||||
|
- Remove handling of `clink` and `tcc` incompatibility.
|
||||||
|
- Update ConEmu to mitigate CVE-2022-46387.
|
||||||
|
- Update Git for Windows to 2.39.0.windows.1 and Clink to 1.4.4.
|
||||||
|
|
||||||
|
### Adds
|
||||||
|
|
||||||
|
- Add `show_warning` function to `vendor\lib\lib_console.cmd` for showing warning messages in yellow.
|
||||||
|
|
||||||
## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
|
## [1.3.20](https://github.com/cmderdev/cmder/tree/v1.3.20) (2022-03-18)
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
|
|||||||
330
vendor/bin/Setup-Cmder.ps1
vendored
Normal file
330
vendor/bin/Setup-Cmder.ps1
vendored
Normal file
@@ -0,0 +1,330 @@
|
|||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Integrate Cmder into the system and optionally add Cmder VS Code terminal profiles.
|
||||||
|
|
||||||
|
.DESCRIPTION
|
||||||
|
This script can perform three primary actions:
|
||||||
|
- Add/merge Cmder terminal profiles into VS Code's `terminal.integrated.profiles.windows` (when `-VSCode` is used).
|
||||||
|
- Set the user environment variable `CMDER_ROOT` (when `-SetRootEnv` is used).
|
||||||
|
- Prepend `CMDER_ROOT` to the user's `Path` variable (when `-PrependPath` is used).
|
||||||
|
|
||||||
|
The script attempts to discover a VS Code `settings.json` when `-SettingsJsonPath` is not provided. It will
|
||||||
|
only create a timestamped backup and write `settings.json` if the merged JSON differs from the original.
|
||||||
|
|
||||||
|
.PARAMETER VSCode
|
||||||
|
Switch to enable adding/merging Cmder profiles into VS Code `settings.json`. Defaults to enabled if the `code` command is found in the PATH.
|
||||||
|
|
||||||
|
.PARAMETER SetRootEnv
|
||||||
|
Switch to set the user environment variable `CMDER_ROOT` (if missing). Defaults to enabled.
|
||||||
|
|
||||||
|
.PARAMETER PrependPath
|
||||||
|
Switch to prepend `CMDER_ROOT` to the user's `Path` (if `cmder.exe` is not already on the Path). Defaults to enabled.
|
||||||
|
|
||||||
|
.PARAMETER CmderRoot
|
||||||
|
Path to the Cmder installation root. Defaults to the `CMDER_ROOT` environment variable if present, otherwise the current directory.
|
||||||
|
|
||||||
|
.PARAMETER DefaultProfile
|
||||||
|
Optional name of the Cmder profile to set as the default VS Code terminal profile. Valid values: 'Cmder - Cmd', 'Cmder - PowerShell', 'Cmder - Bash'.
|
||||||
|
|
||||||
|
.PARAMETER Confirm
|
||||||
|
When supplied, the script will skip the interactive confirmation prompt and proceed non-interactively. If omitted the script prompts in the terminal (default behavior).
|
||||||
|
|
||||||
|
.PARAMETER SettingsJsonPath
|
||||||
|
Explicit path to the VS Code `settings.json` to modify. If omitted the script attempts to discover a suitable file under common locations.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
# Dry-run / test (read-only):
|
||||||
|
.
|
||||||
|
.\vendor\bin\Add-CmderVSCodeProfiles.ps1 -SettingsJsonPath "$env:APPDATA\Code\User\settings.json" -Confirm
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
# Interactive use (default):
|
||||||
|
.
|
||||||
|
.\vendor\bin\Add-CmderVSCodeProfiles.ps1 -SettingsJsonPath "$env:APPDATA\Code\User\settings.json"
|
||||||
|
|
||||||
|
.NOTES
|
||||||
|
- The script writes a timestamped backup only when changes are required.
|
||||||
|
- It uses a terminal prompt (`Read-Host`) for confirmation unless `-Confirm` is provided.
|
||||||
|
- It requires appropriate permissions to modify the user's registry environment variables and to write the `settings.json` file.
|
||||||
|
Script: vendor/bin/Add-CmderVSCodeProfiles.ps1
|
||||||
|
#>
|
||||||
|
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Mandatory=$false)][switch]$VSCode = $true,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)][switch]$SetRootEnv = $true,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)][switch]$PrependPath = $true,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
# default $CmderRoot to the environment variable CMDER_ROOT if set, otherwise to the current directory
|
||||||
|
[string]$CmderRoot = $env:CMDER_ROOT ? $env:CMDER_ROOT : (Get-Location).ProviderPath,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
[string]$DefaultProfile,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)][switch]$Confirm,
|
||||||
|
|
||||||
|
[Parameter(Mandatory=$false)]
|
||||||
|
[string]$SettingsJsonPath
|
||||||
|
)
|
||||||
|
|
||||||
|
if (-not (get-command 'code')) {
|
||||||
|
Write-Error "VS Code command 'code' not found in PATH. Ensure VS Code is installed and 'code' is available in the command line."
|
||||||
|
$VSCode = $false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($VSCode -and $DefaultProfile) {
|
||||||
|
if ($DefaultProfile -notin @('Cmder - Cmd','Cmder - PowerShell','Cmder - Bash').Contains($DefaultProfile)) {
|
||||||
|
Write-Error "Invalid value for -DefaultProfile: '$DefaultProfile'. Valid options are 'Cmder - Cmd', 'Cmder - PowerShell', or 'Cmder - Bash'."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Merge-ProfilesToObject($target) {
|
||||||
|
# Collect existing profiles into a plain hashtable (handle IDictionary or PSCustomObject)
|
||||||
|
$combined = @{}
|
||||||
|
$existing = $null
|
||||||
|
if ($target.PSObject.Properties.Name -contains $propName) {
|
||||||
|
$existing = $target.PSObject.Properties[$propName].Value
|
||||||
|
}
|
||||||
|
if ($existing -ne $null) {
|
||||||
|
if ($existing -is [System.Collections.IDictionary]) {
|
||||||
|
foreach ($k in $existing.Keys) { $combined[$k] = $existing[$k] }
|
||||||
|
} else {
|
||||||
|
foreach ($p in $existing.PSObject.Properties) { $combined[$p.Name] = $p.Value }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Overlay/insert Cmder profiles — only add profiles that don't already exist
|
||||||
|
foreach ($k in $cmderProfiles.Keys) {
|
||||||
|
if ($combined.ContainsKey($k)) {
|
||||||
|
Write-Output "- Skipping existing profile '$k'!"
|
||||||
|
} else {
|
||||||
|
$combined[$k] = $cmderProfiles[$k]
|
||||||
|
Write-Output "- Adding missing profile '$k'"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create an ordered hashtable with keys sorted alphabetically
|
||||||
|
$ordered = [ordered]@{}
|
||||||
|
foreach ($k in ($combined.Keys | Sort-Object)) { $ordered[$k] = $combined[$k] }
|
||||||
|
|
||||||
|
# Remove any existing literal property with the dotted name, then re-add as a note property
|
||||||
|
if ($target.PSObject.Properties.Name -contains $propName) {
|
||||||
|
$target.PSObject.Properties.Remove($propName)
|
||||||
|
}
|
||||||
|
$target | Add-Member -NotePropertyName $propName -NotePropertyValue $ordered -Force
|
||||||
|
|
||||||
|
# If a default profile was requested and exists in the ordered set, set the default profile
|
||||||
|
if ($DefaultProfile) {
|
||||||
|
$defaultPropName = 'terminal.integrated.defaultProfile.windows'
|
||||||
|
if ($ordered.Keys -contains $DefaultProfile) {
|
||||||
|
if ($target.$defaultPropName -ne $DefaultProfile) {
|
||||||
|
if ($target.PSObject.Properties.Name -contains $defaultPropName) { $target.PSObject.Properties.Remove($defaultPropName) }
|
||||||
|
$target | Add-Member -NotePropertyName $defaultPropName -NotePropertyValue $DefaultProfile -Force
|
||||||
|
Write-Output "- Setting default profile to '$DefaultProfile'"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "- '$DefaultProfile' is already set as the default, no change needed."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "- Default profile '$DefaultProfile' not found in profiles list, skipping default profile set."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($VSCode -and -not $SettingsJsonPath) {
|
||||||
|
# If the user didn't provide a path, try to discover a VS Code `settings.json` under %APPDATA% and common roots
|
||||||
|
if (-not $SettingsJsonPath) {
|
||||||
|
$candidates = @()
|
||||||
|
$roots = @()
|
||||||
|
if ($env:APPDATA) { $roots += $env:APPDATA }
|
||||||
|
if ($env:LOCALAPPDATA) { $roots += $env:LOCALAPPDATA }
|
||||||
|
if ($env:USERPROFILE) { $roots += $env:USERPROFILE }
|
||||||
|
if ($env:ProgramFiles) { $roots += $env:ProgramFiles }
|
||||||
|
if (${env:ProgramFiles(x86)}) { $roots += ${env:ProgramFiles(x86)} }
|
||||||
|
|
||||||
|
foreach ($root in $roots | Select-Object -Unique) {
|
||||||
|
if (-not (Test-Path $root)) { continue }
|
||||||
|
try {
|
||||||
|
$found = Get-ChildItem -Path $root -Recurse -Filter settings.json -ErrorAction SilentlyContinue -Force
|
||||||
|
if ($found) { $candidates += $found }
|
||||||
|
} catch {}
|
||||||
|
}
|
||||||
|
|
||||||
|
$candidate = $candidates | Where-Object {
|
||||||
|
$_.FullName -match '\\User\\settings.json$' -and (
|
||||||
|
$_.FullName -match '\\Code( | - |\\)' -or
|
||||||
|
$_.FullName -match '\\data\\' -or
|
||||||
|
$_.FullName -match 'vscode' -or
|
||||||
|
$_.FullName -match 'Code -'
|
||||||
|
)
|
||||||
|
} | Select-Object -First 1
|
||||||
|
|
||||||
|
if (-not $candidate) {
|
||||||
|
$common = @(
|
||||||
|
Join-Path $env:APPDATA 'Code\\User\\settings.json',
|
||||||
|
Join-Path $env:APPDATA 'Code - Insiders\\User\\settings.json',
|
||||||
|
Join-Path $env:APPDATA 'Code - OSS\\User\\settings.json'
|
||||||
|
)
|
||||||
|
foreach ($p in $common) { if (Test-Path $p) { $candidate = Get-Item $p; break } }
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($candidate) {
|
||||||
|
$SettingsJsonPath = $candidate.FullName
|
||||||
|
} else {
|
||||||
|
Write-Error "Could not discover a VS Code 'settings.json' (installed or portable). Provide -SettingsJsonPath explicitly."
|
||||||
|
exit 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$SettingsJsonPath = (Resolve-Path -LiteralPath $SettingsJsonPath).ProviderPath
|
||||||
|
}
|
||||||
|
|
||||||
|
$CmderRoot = (Resolve-Path -LiteralPath $CmderRoot)
|
||||||
|
|
||||||
|
Write-Output "Configuration Summary:`n"
|
||||||
|
|
||||||
|
if ($VSCode) {
|
||||||
|
Write-Output "Add Missing VS Code Terminal Profiles: $SettingsJsonPath"
|
||||||
|
|
||||||
|
if ($DefaultProfile) {
|
||||||
|
Write-Output "Set Default VS Code Terminal Profile: $DefaultProfile"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($SetRootEnv) {
|
||||||
|
Write-Output "Add CMDER_ROOT environment variable: Yes (if not already present)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($PrependPath) {
|
||||||
|
Write-Output "Prepend CMDER_ROOT to User Path: Yes (if not already present)"
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $Confirm) {
|
||||||
|
# Prompt the user in the terminal (Read-Host) before making changes — default: No
|
||||||
|
$prompt = "`nDo you want to continue? [y/N]"
|
||||||
|
$answer = Read-Host -Prompt $prompt
|
||||||
|
if (-not $answer) { $answer = 'N' }
|
||||||
|
if ($answer.ToLower() -notin @('y','yes')) {
|
||||||
|
Write-Output "Cmder System Integration cancelled by user input. No changes were made."
|
||||||
|
exit 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($SetRootEnv) {
|
||||||
|
Write-Output "`nEnvironment Changes:`n"
|
||||||
|
|
||||||
|
# Set user environment variable CMDER_ROOT if not already set in the registry.
|
||||||
|
$didSet = $false
|
||||||
|
$regPath = 'HKCU:\Environment'
|
||||||
|
$regVal = $null
|
||||||
|
$prop = Get-ItemProperty -Path $regPath -ErrorAction SilentlyContinue
|
||||||
|
if ($prop -ne $null -and $prop.PSObject.Properties.Name -contains 'CMDER_ROOT') { $regVal = $prop.CMDER_ROOT }
|
||||||
|
if ([string]::IsNullOrEmpty($regVal)) {
|
||||||
|
Write-Output "- No CMDER_ROOT found in registry; will write HKCU:\Environment\CMDER_ROOT -> $CmderRoot"
|
||||||
|
[Environment]::SetEnvironmentVariable('CMDER_ROOT', $CmderRoot, 'User')
|
||||||
|
$didSet = $true
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Write-Output "- User environment variable 'CMDER_ROOT' already exists in registry with value '$regVal', skipping set."
|
||||||
|
}
|
||||||
|
|
||||||
|
$env:CMDER_ROOT = $CmderRoot
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($PrependPath) {
|
||||||
|
write-Output "`nPath Changes:`n"
|
||||||
|
# Prepend $ENV:CMDER_ROOT to the current users Path variable if not already present
|
||||||
|
if ((get-command 'cmder.exe' -ErrorAction SilentlyContinue) -eq $null) {
|
||||||
|
Write-Output "- 'cmder.exe' not found in current PATH, checking registry user Path variable..."
|
||||||
|
$pathVal = $null
|
||||||
|
if ($prop -ne $null -and $prop.PSObject.Properties.Name -contains 'Path') { $pathVal = $prop.Path }
|
||||||
|
if ($pathVal -ne $null -and -not ($pathVal.Split(';') -contains $env:CMDER_ROOT)) {
|
||||||
|
Write-Output "- Prepending '$env:CMDER_ROOT' to user Path environment variable in registry."
|
||||||
|
$newPath = "$env:CMDER_ROOT;$pathVal"
|
||||||
|
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$CmderPath = (Get-Command 'cmder.exe' -ErrorAction SilentlyContinue).Source
|
||||||
|
Write-Output "- 'cmder.exe' found in current PATH at '$CmderPath', skipping Path modification."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($VSCode) {
|
||||||
|
$cmderProfiles = @{}
|
||||||
|
|
||||||
|
if (($DefaultProfile -eq 'Cmder - Cmd') -or $VSCode) {
|
||||||
|
$cmderProfiles['Cmder - Cmd'] = @{
|
||||||
|
name = 'Cmder - Cmd'
|
||||||
|
path = @('${env:windir}\Sysnative\cmd.exe','${env:windir}\System32\cmd.exe')
|
||||||
|
args = @('/k','${env:cmder_root}\vendor\bin\vscode_init.cmd')
|
||||||
|
icon = 'terminal-cmd'
|
||||||
|
color = 'terminal.ansiGreen'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($DefaultProfile -eq 'Cmder - PowerShell') -or $VSCode) {
|
||||||
|
$cmderProfiles['Cmder - PowerShell'] = @{
|
||||||
|
name = 'Cmder - PowerShell'
|
||||||
|
source = 'PowerShell'
|
||||||
|
args = @('-ExecutionPolicy','Bypass','-NoLogo','-NoProfile','-NoExit','-Command','Invoke-Expression ''. ''''${env:CMDER_ROOT}\vendor\profile.ps1''''''')
|
||||||
|
icon = 'terminal-powershell'
|
||||||
|
color = 'terminal.ansiYellow'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($DefaultProfile -eq 'Cmder - Bash') -or $VSCode) {
|
||||||
|
$cmderProfiles['Cmder - Bash'] = @{
|
||||||
|
name = 'Cmder - Bash'
|
||||||
|
path = @('${env:windir}\Sysnative\cmd.exe','${env:windir}\System32\cmd.exe')
|
||||||
|
args = @('/k','${env:cmder_root}\vendor\start_git_bash.cmd')
|
||||||
|
icon = 'terminal-bash'
|
||||||
|
color = 'terminal.ansiBlue'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Output "`nProfile Changes:`n"
|
||||||
|
Write-Output "Reading '$SettingsJsonPath'...`n"
|
||||||
|
$raw = Get-Content -Raw -Path $SettingsJsonPath -ErrorAction Stop
|
||||||
|
try {
|
||||||
|
$json = $raw | ConvertFrom-Json -ErrorAction Stop
|
||||||
|
} catch {
|
||||||
|
Write-Error "Failed to parse JSON in $($SettingsJsonPath): $_"
|
||||||
|
exit 3
|
||||||
|
}
|
||||||
|
|
||||||
|
# Normalized copy of original JSON for change detection
|
||||||
|
$originalNormalized = $json | ConvertTo-Json -Depth 10
|
||||||
|
|
||||||
|
# Write-Output "Preparing to merge Cmder profiles into settings"
|
||||||
|
$propName = 'terminal.integrated.profiles.windows'
|
||||||
|
|
||||||
|
if ($json -is [System.Array]) {
|
||||||
|
foreach ($item in $json) { Merge-ProfilesToObject $item }
|
||||||
|
} else {
|
||||||
|
Merge-ProfilesToObject $json
|
||||||
|
}
|
||||||
|
|
||||||
|
# Compare normalized JSON and only back up / write if changes occurred
|
||||||
|
$newNormalized = $json | ConvertTo-Json -Depth 10
|
||||||
|
if ($originalNormalized -ne $newNormalized) {
|
||||||
|
$timestamp = (Get-Date).ToString('yyyyMMdd-HHmmss')
|
||||||
|
$backup = "$SettingsJsonPath.$timestamp.backup"
|
||||||
|
Write-Output "- Backing up 'settings.json' to '$backup' before applying changes..."
|
||||||
|
Copy-Item -Path $SettingsJsonPath -Destination $backup -Force
|
||||||
|
|
||||||
|
$pretty = $json | ConvertTo-Json -Depth 10
|
||||||
|
[System.IO.File]::WriteAllText($SettingsJsonPath, $pretty, [System.Text.Encoding]::UTF8)
|
||||||
|
Write-Output "- Backed up original to $backup"
|
||||||
|
Write-Output "- Added Cmder profiles into property '$propName' in $SettingsJsonPath"
|
||||||
|
Write-Output "`nApplied changes to '$SettingsJsonPath'..."
|
||||||
|
} else {
|
||||||
|
Write-Output "`nAll VS Code terminal profiles are already configured in '$SettingsJsonPath'. No changes were made."
|
||||||
|
}
|
||||||
|
}
|
||||||
3
vendor/bin/setup-cmder.cmd
vendored
Normal file
3
vendor/bin/setup-cmder.cmd
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
@echo off
|
||||||
|
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File "%~n0.ps1" %*
|
||||||
4
vendor/bin/setup-cmder.sh
vendored
Normal file
4
vendor/bin/setup-cmder.sh
vendored
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
powershell -NoProfile -ExecutionPolicy Bypass -File "$SCRIPT_DIR/${0%.*}.ps1" "$@"
|
||||||
116
vendor/clink.lua
vendored
116
vendor/clink.lua
vendored
@@ -324,7 +324,7 @@ end
|
|||||||
-- Find out current branch
|
-- Find out current branch
|
||||||
-- @return {nil|git branch name}
|
-- @return {nil|git branch name}
|
||||||
---
|
---
|
||||||
local function get_git_branch(git_dir)
|
local function get_git_branch(git_dir, fast)
|
||||||
git_dir = git_dir or get_git_dir()
|
git_dir = git_dir or get_git_dir()
|
||||||
|
|
||||||
-- If git directory not found then we're probably outside of repo
|
-- If git directory not found then we're probably outside of repo
|
||||||
@@ -341,8 +341,90 @@ local function get_git_branch(git_dir)
|
|||||||
-- if HEAD matches branch expression, then we're on named branch
|
-- if HEAD matches branch expression, then we're on named branch
|
||||||
-- otherwise it is a detached commit
|
-- otherwise it is a detached commit
|
||||||
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
local branch_name = HEAD:match('ref: refs/heads/(.+)')
|
||||||
|
if os.getenv("CLINK_DEBUG_GIT_REFTABLE") then
|
||||||
|
branch_name = '.invalid'
|
||||||
|
end
|
||||||
|
|
||||||
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
-- If the branch name is ".invalid" and the fast method wasn't requested,
|
||||||
|
-- then invoke git.exe to get accurate current branch info (slow method).
|
||||||
|
if branch_name == ".invalid" and not fast then
|
||||||
|
local file
|
||||||
|
branch_name = nil
|
||||||
|
|
||||||
|
-- Handle the most common case first.
|
||||||
|
if not branch_name then
|
||||||
|
file = io_popenyield("git --no-optional-locks branch 2>nul")
|
||||||
|
if file then
|
||||||
|
for line in file:lines() do
|
||||||
|
local b = line:match("^%*%s+(.*)")
|
||||||
|
if b then
|
||||||
|
b = b:match("^%((HEAD detached at .*)%)") or b
|
||||||
|
branch_name = b
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Handle the cases where "git branch" output is empty, but "git
|
||||||
|
-- branch --show-current" shows the branch name (e.g. a new repo).
|
||||||
|
if not branch_name then
|
||||||
|
file = io_popenyield("git --no-optional-locks branch --show-current 2>nul")
|
||||||
|
if file then
|
||||||
|
for line in file:lines() do -- luacheck: ignore 512
|
||||||
|
branch_name = line
|
||||||
|
break
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
branch_name = branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
||||||
|
end
|
||||||
|
|
||||||
|
return branch_name
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_git_remote(git_dir, branch)
|
||||||
|
if not git_dir then return nil end
|
||||||
|
if not branch then return nil end
|
||||||
|
|
||||||
|
local file = io.open(git_dir.."/config", 'r')
|
||||||
|
if not file then return nil end
|
||||||
|
|
||||||
|
local git_config = {}
|
||||||
|
|
||||||
|
local function get_git_config_value(section, param)
|
||||||
|
return git_config[section] and git_config[section][param] or nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local section
|
||||||
|
for line in file:lines() do
|
||||||
|
if (line:sub(1,1) == "[" and line:sub(-1) == "]") then
|
||||||
|
if (line:sub(2,5) == "lfs ") then
|
||||||
|
section = nil -- skip LFS entries as there can be many and we never use them
|
||||||
|
else
|
||||||
|
section = line:sub(2,-2)
|
||||||
|
git_config[section] = git_config[section] or {}
|
||||||
|
end
|
||||||
|
elseif section then
|
||||||
|
local param, value = line:match('^%s-([%w|_]+)%s-=%s+(.+)$')
|
||||||
|
if (param and value ~= nil) then
|
||||||
|
git_config[section][param] = value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
file:close()
|
||||||
|
|
||||||
|
local remote_to_push = get_git_config_value('branch "'..branch..'"', 'remote') or ''
|
||||||
|
local remote_ref = get_git_config_value('remote "'..remote_to_push..'"', 'push') or
|
||||||
|
get_git_config_value('push', 'default')
|
||||||
|
|
||||||
|
local text = remote_to_push
|
||||||
|
if remote_ref then text = text..'/'..remote_ref end
|
||||||
|
|
||||||
|
return text ~= '' and text or nil
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -394,7 +476,7 @@ end
|
|||||||
-- Get the status and conflict status of working dir
|
-- Get the status and conflict status of working dir
|
||||||
-- @return {bool <status>, bool <is_conflict>}
|
-- @return {bool <status>, bool <is_conflict>}
|
||||||
---
|
---
|
||||||
local function get_git_status()
|
local function get_git_status(git_dir)
|
||||||
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
||||||
if not file then
|
if not file then
|
||||||
return {}
|
return {}
|
||||||
@@ -416,7 +498,10 @@ local function get_git_status()
|
|||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
return { status = is_status, conflict = conflict_found }
|
local branch = get_git_branch(git_dir, false--[[fast]])
|
||||||
|
local remote = get_git_remote(git_dir, branch)
|
||||||
|
|
||||||
|
return { status = is_status, branch = branch, remote = remote, conflict = conflict_found }
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -515,11 +600,11 @@ end
|
|||||||
-- Use a prompt coroutine to get git status in the background.
|
-- Use a prompt coroutine to get git status in the background.
|
||||||
-- Cache the info so we can reuse it next time to reduce flicker.
|
-- Cache the info so we can reuse it next time to reduce flicker.
|
||||||
---
|
---
|
||||||
local function get_git_info_table()
|
local function get_git_info_table(git_dir)
|
||||||
local info = clink_promptcoroutine(function ()
|
local info = clink_promptcoroutine(function ()
|
||||||
-- Use git status if allowed.
|
-- Use git status if allowed.
|
||||||
local cmderGitStatusOptIn = get_git_status_setting()
|
local cmderGitStatusOptIn = get_git_status_setting()
|
||||||
return cmderGitStatusOptIn and get_git_status() or {}
|
return cmderGitStatusOptIn and get_git_status(git_dir) or {}
|
||||||
end)
|
end)
|
||||||
if not info then
|
if not info then
|
||||||
info = cached_info.git_info or {}
|
info = cached_info.git_info or {}
|
||||||
@@ -539,10 +624,11 @@ local function git_prompt_filter()
|
|||||||
local git_dir = get_git_dir()
|
local git_dir = get_git_dir()
|
||||||
local color
|
local color
|
||||||
if git_dir then
|
if git_dir then
|
||||||
local branch = get_git_branch(git_dir)
|
local branch = get_git_branch(git_dir, true--[[fast]])
|
||||||
if branch then
|
if branch then
|
||||||
-- If in a different repo or branch than last time, discard cached info.
|
-- If in a different repo or branch than last time, discard cached info.
|
||||||
if cached_info.git_dir ~= git_dir or cached_info.git_branch ~= branch then
|
if cached_info.git_dir ~= git_dir or
|
||||||
|
(branch ~= ".invalid" and cached_info.git_branch ~= branch) then
|
||||||
cached_info.git_info = nil
|
cached_info.git_info = nil
|
||||||
cached_info.git_dir = git_dir
|
cached_info.git_dir = git_dir
|
||||||
cached_info.git_branch = branch
|
cached_info.git_branch = branch
|
||||||
@@ -550,10 +636,22 @@ local function git_prompt_filter()
|
|||||||
|
|
||||||
-- If we're inside of git repo then try to detect current branch
|
-- If we're inside of git repo then try to detect current branch
|
||||||
-- Has branch => therefore it is a git folder, now figure out status
|
-- Has branch => therefore it is a git folder, now figure out status
|
||||||
local gitInfo = get_git_info_table()
|
local gitInfo = get_git_info_table(git_dir)
|
||||||
local gitStatus = gitInfo.status
|
local gitStatus = gitInfo.status
|
||||||
local gitConflict = gitInfo.conflict
|
local gitConflict = gitInfo.conflict
|
||||||
|
|
||||||
|
-- Compensate for git reftables.
|
||||||
|
branch = gitInfo.branch or branch
|
||||||
|
if branch == ".invalid" then
|
||||||
|
branch = "Loading..."
|
||||||
|
elseif gitInfo.remote then
|
||||||
|
branch = branch.." -> "..gitInfo.remote
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Prevent an older clink-completions git_prompt.lua scripts from
|
||||||
|
-- modifying the prompt.
|
||||||
|
branch = "\x1b[10m"..branch
|
||||||
|
|
||||||
if gitStatus == nil then
|
if gitStatus == nil then
|
||||||
color = get_unknown_color()
|
color = get_unknown_color()
|
||||||
elseif gitStatus then
|
elseif gitStatus then
|
||||||
|
|||||||
Reference in New Issue
Block a user