mirror of
https://github.com/cmderdev/cmder.git
synced 2026-03-03 01:16:07 +08:00
Compare commits
72 Commits
copilot/fi
...
dax/fix-gi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
adbd6322f6 | ||
|
|
7f22d2eb73 | ||
|
|
573bf6ebfb | ||
|
|
05de4f606a | ||
|
|
c8495a0f58 | ||
|
|
6593acf8c8 | ||
|
|
0c6b2d9900 | ||
|
|
66ab9ad6f7 | ||
|
|
6137073ba3 | ||
|
|
6858619614 | ||
|
|
002282636a | ||
|
|
48cc28a634 | ||
|
|
e71c7679f6 | ||
|
|
c06d852248 | ||
|
|
ee967279d0 | ||
|
|
dc93fa5d1b | ||
|
|
684185ca8a | ||
|
|
2780a43323 | ||
|
|
641ce7b1e8 | ||
|
|
a52b0b9e10 | ||
|
|
825df3aace | ||
|
|
a937901e82 | ||
|
|
27c7a0cdc6 | ||
|
|
838c1cfaa3 | ||
|
|
bff3862ad4 | ||
|
|
2057ee58b0 | ||
|
|
9e6e1485b0 | ||
|
|
baef798b6c | ||
|
|
865d0c1858 | ||
|
|
60848f56c5 | ||
|
|
b86fca35bc | ||
|
|
0bc7fd3aaa | ||
|
|
1e04711a21 | ||
|
|
3810b8d258 | ||
|
|
d05d03117a | ||
|
|
1509616205 | ||
|
|
6a698046a0 | ||
|
|
148f685bb3 | ||
|
|
73685145ea | ||
|
|
799f63de1f | ||
|
|
6da8e5849e | ||
|
|
25ac8f113e | ||
|
|
40ddf9a451 | ||
|
|
0db2dbf6f8 | ||
|
|
d285f63068 | ||
|
|
62cccaf284 | ||
|
|
6ba699a3c4 | ||
|
|
13dd021d6a | ||
|
|
c3f239267d | ||
|
|
e79f54e16e | ||
|
|
24427c1a41 | ||
|
|
a918a6aae1 | ||
|
|
d3ae747a6d | ||
|
|
7f0cfac498 | ||
|
|
dc3b142b32 | ||
|
|
9c3bbe9b24 | ||
|
|
be44bac956 | ||
|
|
4fb6bed907 | ||
|
|
f4e68b0388 | ||
|
|
a824b721cb | ||
|
|
153f7310a1 | ||
|
|
3172771f15 | ||
|
|
ef46d6465d | ||
|
|
eabadf96dc | ||
|
|
7b248bc9a3 | ||
|
|
2ce0146d6e | ||
|
|
5dfa14ccce | ||
|
|
4d259ba84c | ||
|
|
bbd7507b4e | ||
|
|
b9246177c0 | ||
|
|
a8d897f633 | ||
|
|
304b8c7a05 |
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@@ -5,7 +5,11 @@
|
|||||||
|
|
||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
|
# Enable version updates for GitHub Actions
|
||||||
- package-ecosystem: "github-actions" # See documentation for possible values
|
- package-ecosystem: "github-actions" # See documentation for possible values
|
||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
schedule:
|
schedule:
|
||||||
interval: "weekly"
|
interval: "weekly"
|
||||||
|
labels:
|
||||||
|
- "👆 Dependencies"
|
||||||
|
- "🔄️ GitHub Actions"
|
||||||
|
|||||||
29
.github/workflows/branches.yml
vendored
29
.github/workflows/branches.yml
vendored
@@ -19,10 +19,25 @@ jobs:
|
|||||||
# Steps represent a sequence of tasks that will be executed as part of the job
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
steps:
|
steps:
|
||||||
# Checks-out the repository under $GITHUB_WORKSPACE, so the job can access it
|
# Checks-out the repository under $GITHUB_WORKSPACE, so the job can access it
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # fetch all history for all branches and tags
|
fetch-depth: 0 # fetch all history for all branches and tags
|
||||||
|
|
||||||
|
- name: Summary - Merge operation started
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "## 🔀 Update Branches - Workflow Summary" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "### Merge Operation" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Property | Value |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| --- | --- |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Source Branch | \`master\` |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Target Branch | \`development\` |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Triggered by | @${{ github.actor }} |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "| Commit | \`${{ github.sha }}\` |" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
|
||||||
# Runs a single command using the runners shell
|
# Runs a single command using the runners shell
|
||||||
- name: Merge master into development
|
- name: Merge master into development
|
||||||
run: |
|
run: |
|
||||||
@@ -31,3 +46,15 @@ jobs:
|
|||||||
git checkout development
|
git checkout development
|
||||||
git merge --no-ff master
|
git merge --no-ff master
|
||||||
git push origin development
|
git push origin development
|
||||||
|
|
||||||
|
- name: Summary - Merge completed
|
||||||
|
if: success()
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "### ✅ Merge Successful" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "The \`master\` branch has been successfully merged into \`development\`." >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "**Merge type:** No fast-forward merge" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "" >> $GITHUB_STEP_SUMMARY
|
||||||
|
echo "> The development branch is now synchronized with the latest changes from master." >> $GITHUB_STEP_SUMMARY
|
||||||
|
|||||||
187
.github/workflows/build.yml
vendored
187
.github/workflows/build.yml
vendored
@@ -35,10 +35,69 @@ jobs:
|
|||||||
discussions: write
|
discussions: write
|
||||||
steps:
|
steps:
|
||||||
- name: Check out repository code (Action from GitHub)
|
- name: Check out repository code (Action from GitHub)
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Summary - Repository checkout
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Get Cmder version
|
||||||
|
. scripts/utils.ps1
|
||||||
|
$cmderVersion = Get-VersionStr
|
||||||
|
$buildTime = (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
|
||||||
|
|
||||||
|
# Determine branch link (handle PR merge refs)
|
||||||
|
$branchName = "${{ github.ref_name }}"
|
||||||
|
$branchLink = ""
|
||||||
|
if ($branchName -match '^(\d+)/(merge|head)$') {
|
||||||
|
# This is a PR merge/head ref, link to the PR
|
||||||
|
$prNumber = $Matches[1]
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/pull/$prNumber"
|
||||||
|
} elseif ("${{ github.event_name }}" -eq "pull_request") {
|
||||||
|
# This is a pull request event, link to the PR
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/pull/${{ github.event.pull_request.number }}"
|
||||||
|
} else {
|
||||||
|
# Regular branch, link to the branch tree
|
||||||
|
$branchLink = "https://github.com/${{ github.repository }}/tree/${{ github.ref_name }}"
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary = @"
|
||||||
|
## 📦 Build Cmder - Workflow Summary
|
||||||
|
|
||||||
|
<small>Build started: $buildTime</small>
|
||||||
|
|
||||||
|
### Repository Information
|
||||||
|
| Property | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| Repository | [``${{ github.repository }}``](https://github.com/${{ github.repository }}) |
|
||||||
|
| Branch | [``$branchName``]($branchLink) |
|
||||||
|
| Commit | [``${{ github.sha }}``](https://github.com/${{ github.repository }}/commit/${{ github.sha }}) |
|
||||||
|
| Actor | [@${{ github.actor }}](https://github.com/${{ github.actor }}) |
|
||||||
|
| Workflow | ``${{ github.workflow }}`` |
|
||||||
|
| Cmder Version | **$cmderVersion** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 📁 Vendor Packages
|
||||||
|
| Package | Version |
|
||||||
|
| --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Read vendor sources.json and add to summary
|
||||||
|
$vendorSources = Get-Content "vendor/sources.json" | ConvertFrom-Json
|
||||||
|
if ($vendorSources.Count -eq 0) {
|
||||||
|
$summary += "`n| _No vendor packages found_ | |"
|
||||||
|
} else {
|
||||||
|
foreach ($vendor in $vendorSources) {
|
||||||
|
$summary += "`n| ``$($vendor.name)`` | $($vendor.version) |"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary += "`n"
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Add MSBuild to PATH
|
- name: Add MSBuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v2
|
uses: microsoft/setup-msbuild@v2
|
||||||
|
|
||||||
@@ -47,36 +106,132 @@ jobs:
|
|||||||
working-directory: scripts
|
working-directory: scripts
|
||||||
run: .\build.ps1 -Compile -verbose
|
run: .\build.ps1 -Compile -verbose
|
||||||
|
|
||||||
|
- name: Summary - Build completed
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Build Status
|
||||||
|
|
||||||
|
✅ Cmder built successfully.
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Pack the built files
|
- name: Pack the built files
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
working-directory: scripts
|
working-directory: scripts
|
||||||
run: .\pack.ps1 -verbose
|
run: .\pack.ps1 -verbose
|
||||||
|
|
||||||
- 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
|
||||||
|
|
||||||
|
- name: Summary - Artifacts uploaded
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 🗃️ Artifacts
|
||||||
|
|
||||||
|
| Artifact | Size | Download | Hash (SHA256) |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
# Function to get artifact download URL with retry logic
|
||||||
|
function Get-ArtifactDownloadUrl {
|
||||||
|
param(
|
||||||
|
[string]$ArtifactName,
|
||||||
|
[int]$MaxRetries = 3,
|
||||||
|
[int]$DelaySeconds = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
for ($i = 0; $i -lt $MaxRetries; $i++) {
|
||||||
|
try {
|
||||||
|
# Use GitHub CLI to get artifact information
|
||||||
|
$artifactsJson = gh api "repos/${{ github.repository }}/actions/runs/${{ github.run_id }}/artifacts" --jq ".artifacts[] | select(.name == `"$ArtifactName`")"
|
||||||
|
|
||||||
|
if ($artifactsJson) {
|
||||||
|
$artifact = $artifactsJson | ConvertFrom-Json
|
||||||
|
if ($artifact.archive_download_url) {
|
||||||
|
return $artifact.archive_download_url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Host "Attempt $($i + 1) failed to get artifact URL for $ArtifactName : $_"
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($i -lt ($MaxRetries - 1)) {
|
||||||
|
Start-Sleep -Seconds $DelaySeconds
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $null
|
||||||
|
}
|
||||||
|
|
||||||
|
$artifacts = @("cmder.zip", "cmder.7z", "cmder_mini.zip", "hashes.txt")
|
||||||
|
foreach ($artifact in $artifacts) {
|
||||||
|
$path = "build/$artifact"
|
||||||
|
if (Test-Path $path) {
|
||||||
|
$size = (Get-Item $path).Length / 1MB
|
||||||
|
$hash = (Get-FileHash $path -Algorithm SHA256).Hash
|
||||||
|
|
||||||
|
# Try to get the actual artifact download URL
|
||||||
|
$downloadUrl = Get-ArtifactDownloadUrl -ArtifactName $artifact
|
||||||
|
$warning = ""
|
||||||
|
|
||||||
|
if (-not $downloadUrl) {
|
||||||
|
# Fallback to workflow run page if artifact URL fetch fails
|
||||||
|
$downloadUrl = "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
|
$warning = " ⚠️"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Determine emoji based on file type
|
||||||
|
if ($artifact -match '\.txt$') {
|
||||||
|
$emoji = "📄"
|
||||||
|
} elseif ($artifact -match '\.(zip|7z)$') {
|
||||||
|
$emoji = "🗄️"
|
||||||
|
} else {
|
||||||
|
$emoji = "📦"
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary += "`n| $emoji ``$artifact`` | $([math]::Round($size, 2)) MB | [📥 Download$warning]($downloadUrl) | ``$hash`` |"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$summary += "`n"
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Create Release
|
- name: Create Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
@@ -88,3 +243,25 @@ jobs:
|
|||||||
draft: true
|
draft: true
|
||||||
generate_release_notes: true
|
generate_release_notes: true
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
|
||||||
|
- name: Summary - Release created
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Release Information
|
||||||
|
|
||||||
|
🚀 Draft release created for tag: **``${{ github.ref_name }}``**
|
||||||
|
|
||||||
|
Release includes:
|
||||||
|
- Full version (``cmder.zip``, ``cmder.7z``)
|
||||||
|
- Mini version (``cmder_mini.zip``)
|
||||||
|
- File hashes (``hashes.txt``)
|
||||||
|
|
||||||
|
> ⚠️ Release is in **draft** mode. Please review and publish manually.
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
50
.github/workflows/codeql.yml
vendored
50
.github/workflows/codeql.yml
vendored
@@ -45,7 +45,26 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Summary - CodeQL analysis started
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
## 🔒 CodeQL Security Analysis - Workflow Summary
|
||||||
|
|
||||||
|
### Analysis Configuration
|
||||||
|
|
||||||
|
| Property | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| Repository | ``${{ github.repository }}`` |
|
||||||
|
| Branch | ``${{ github.ref_name }}`` |
|
||||||
|
| Language | ``${{ matrix.language }}`` |
|
||||||
|
| Commit | ``${{ github.sha }}`` |
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
@@ -67,7 +86,36 @@ jobs:
|
|||||||
working-directory: scripts
|
working-directory: scripts
|
||||||
run: .\build.ps1 -Compile -verbose
|
run: .\build.ps1 -Compile -verbose
|
||||||
|
|
||||||
|
- name: Summary - Build status
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
### ✅ Build Completed
|
||||||
|
|
||||||
|
Cmder launcher built successfully for CodeQL analysis.
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v4
|
uses: github/codeql-action/analyze@v4
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
|
|
||||||
|
- name: Summary - Analysis completed
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
### 🔍 CodeQL Analysis Results
|
||||||
|
|
||||||
|
✅ CodeQL security analysis completed successfully.
|
||||||
|
|
||||||
|
**Language analyzed:** ``${{ matrix.language }}``
|
||||||
|
|
||||||
|
> Check the Security tab for detailed findings and recommendations.
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
121
.github/workflows/tests.yml
vendored
121
.github/workflows/tests.yml
vendored
@@ -38,17 +38,132 @@ jobs:
|
|||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Summary - Test execution started
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Get Cmder version
|
||||||
|
. scripts/utils.ps1
|
||||||
|
$cmderVersion = Get-VersionStr
|
||||||
|
|
||||||
|
$summary = @"
|
||||||
|
## ✅ Run Tests - Workflow Summary
|
||||||
|
|
||||||
|
### Test Environment
|
||||||
|
| Property | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| Repository | ``${{ github.repository }}`` |
|
||||||
|
| Branch | ``${{ github.ref_name }}`` |
|
||||||
|
| Commit | ``${{ github.sha }}`` |
|
||||||
|
| Runner OS | ``${{ runner.os }}`` |
|
||||||
|
| Cmder Version | **$cmderVersion** |
|
||||||
|
| PowerShell Version | **$($PSVersionTable.PSVersion)** |
|
||||||
|
| Event | ``${{ github.event_name }}`` |
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Initialize vendors
|
- name: Initialize vendors
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
working-directory: scripts
|
working-directory: scripts
|
||||||
run: .\build.ps1 -verbose
|
run: .\build.ps1 -verbose
|
||||||
|
|
||||||
|
- name: Summary - Vendor initialization
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
# Get vendor versions from sources.json
|
||||||
|
$vendorInfo = @()
|
||||||
|
$sources = Get-Content "vendor\sources.json" -Raw | ConvertFrom-Json
|
||||||
|
$vendorDirs = $sources.PSObject.Properties | ForEach-Object { $_.Name }
|
||||||
|
foreach ($dir in $vendorDirs) {
|
||||||
|
$versionFile = "vendor/$dir/.cmderver"
|
||||||
|
if (Test-Path $versionFile) {
|
||||||
|
$version = Get-Content $versionFile -Raw
|
||||||
|
$vendorInfo += "- **$dir**: $($version.Trim())"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary = @"
|
||||||
|
### ⚙️ Vendor Initialization
|
||||||
|
|
||||||
|
✅ Vendor dependencies initialized successfully.
|
||||||
|
|
||||||
|
**Vendor Versions:**
|
||||||
|
"@
|
||||||
|
|
||||||
|
$(
|
||||||
|
if ($vendorInfo.Count -eq 0) {
|
||||||
|
$summary += "_No vendor version information available._"
|
||||||
|
} else {
|
||||||
|
$summary += $vendorInfo -join '`n'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
|
- name: Summary - Test results table header
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
### 📋 Test Results
|
||||||
|
|
||||||
|
| Test | Status | Duration |
|
||||||
|
| --- | --- | --- |
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- name: Testing Clink Shell
|
- name: Testing Clink Shell
|
||||||
|
id: test-clink
|
||||||
run: |
|
run: |
|
||||||
cmd /c vendor\init.bat /v /d /t
|
cmd /c vendor\init.bat /v /d /t
|
||||||
- name: Testing PowerShell
|
|
||||||
|
- name: Summary - Clink Shell test
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''vendor\profile.ps1'''"
|
"| Clink Shell | ✅ Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
- name: Testing PowerShell
|
||||||
|
id: test-powershell
|
||||||
|
run: |
|
||||||
|
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
|
||||||
|
|
||||||
|
- name: Summary - PowerShell test
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
"| PowerShell | ✅ Passed | Profile script execution |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
- name: Testing Bash
|
- name: Testing Bash
|
||||||
|
id: test-bash
|
||||||
run: |
|
run: |
|
||||||
bash vendor/cmder.sh
|
bash vendor/cmder.sh
|
||||||
|
|
||||||
|
- name: Summary - Bash test
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
"| Bash | ✅ Passed | Bash environment initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
|
- name: Summary - All tests completed
|
||||||
|
if: success()
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
|
||||||
|
### ✅ All Tests Completed
|
||||||
|
|
||||||
|
All shell environments tested successfully!
|
||||||
|
|
||||||
|
**Test Coverage:**
|
||||||
|
- ✅ Clink shell environment (Windows cmd.exe with Clink)
|
||||||
|
- ✅ PowerShell environment (with Cmder profile)
|
||||||
|
- ✅ Bash environment (Git Bash integration)
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
57
.github/workflows/vendor.yml
vendored
57
.github/workflows/vendor.yml
vendored
@@ -24,10 +24,22 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Summary - Workflow started
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$summary = @"
|
||||||
|
## 📦 Update Vendor - Workflow Summary
|
||||||
|
|
||||||
|
Checking for vendor dependency updates...
|
||||||
|
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- id: make-changes
|
- id: make-changes
|
||||||
name: Checking for updates
|
name: Checking for updates
|
||||||
env:
|
env:
|
||||||
@@ -49,8 +61,33 @@ jobs:
|
|||||||
}
|
}
|
||||||
if ($count -eq 0) { return }
|
if ($count -eq 0) { return }
|
||||||
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
||||||
|
|
||||||
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||||
|
|
||||||
|
- name: Summary - Update check results
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$count = [int]$env:COUNT_UPDATED
|
||||||
|
if ($count -eq 0) {
|
||||||
|
$summary = @"
|
||||||
|
### ✅ No Updates Available
|
||||||
|
|
||||||
|
All vendor dependencies are up to date.
|
||||||
|
"@
|
||||||
|
} else {
|
||||||
|
$word = if ($count -eq 1) { 'dependency' } else { 'dependencies' }
|
||||||
|
$summary = @"
|
||||||
|
### 🔄 Updates Found
|
||||||
|
|
||||||
|
**$count** vendor $word updated:
|
||||||
|
|
||||||
|
$env:UPDATE_MESSAGE
|
||||||
|
|
||||||
|
"@
|
||||||
|
}
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|
||||||
- uses: peter-evans/create-pull-request@v7
|
- uses: peter-evans/create-pull-request@v7
|
||||||
if: env.COUNT_UPDATED > 0
|
if: env.COUNT_UPDATED > 0
|
||||||
with:
|
with:
|
||||||
@@ -63,3 +100,21 @@ jobs:
|
|||||||
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
|
commit-message: '⬆️ Update dependencies (${{ env.LIST_UPDATED }})'
|
||||||
branch: update-vendor
|
branch: update-vendor
|
||||||
base: master
|
base: master
|
||||||
|
|
||||||
|
- name: Summary - Pull request created
|
||||||
|
if: env.COUNT_UPDATED > 0
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$Summary = @"
|
||||||
|
### 🎉 Pull Request Created
|
||||||
|
|
||||||
|
A pull request has been created to update the vendor dependencies.
|
||||||
|
|
||||||
|
**Branch:** ``update-vendor``
|
||||||
|
|
||||||
|
**Updated dependencies:** $env:LIST_UPDATED
|
||||||
|
|
||||||
|
> Please review and merge the pull request to apply the updates.
|
||||||
|
"@
|
||||||
|
|
||||||
|
$summary | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
||||||
|
|||||||
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
|
||||||
|
|||||||
@@ -354,7 +354,7 @@ However, Cmder can in fact run in a variety of other terminal emulators, and eve
|
|||||||
|
|
||||||
⚠ *Note:* Cmder includes built-in support for Windows Terminal directory tracking via OSC 9;9 sequences. This enables "Duplicate Tab" and "Split Pane" features to preserve the current working directory for both `cmd.exe` and PowerShell sessions.
|
⚠ *Note:* Cmder includes built-in support for Windows Terminal directory tracking via OSC 9;9 sequences. This enables "Duplicate Tab" and "Split Pane" features to preserve the current working directory for both `cmd.exe` and PowerShell sessions.
|
||||||
|
|
||||||
⚠ *Note:* Cmder also includes built-in support for [Windows Terminal shell integration](https://learn.microsoft.com/en-us/windows/terminal/tutorials/shell-integration) via OSC 133 sequences (A, B, C) for PowerShell sessions. This enables features like command navigation (jump between commands), command selection, visual command separators, and improved command history management in Windows Terminal.
|
⚠ *Note:* Cmder also includes built-in support for [Windows Terminal shell integration](https://learn.microsoft.com/en-us/windows/terminal/tutorials/shell-integration) via OSC 133 sequences (A, B, C, D) for PowerShell sessions. This enables features like command navigation (jump between commands), command selection, visual command separators, command exit code tracking, and improved command history management in Windows Terminal.
|
||||||
|
|
||||||
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
|
For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration).
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\build.ps1 -SourcesPath '~/custom/vendors.json'
|
.\build.ps1 -SourcesPath '~/custom/vendors.json'
|
||||||
|
|
||||||
Build cmder with your own packages. See vendor/sources.json for the syntax you need to copy.
|
Build Cmder with your own packages. See vendor/sources.json for the syntax you need to copy.
|
||||||
.NOTES
|
.NOTES
|
||||||
AUTHORS
|
AUTHORS
|
||||||
Samuel Vasko, Jack Bennett
|
Samuel Vasko, Jack Bennett
|
||||||
@@ -60,7 +60,7 @@ Param(
|
|||||||
[switch]$Compile
|
[switch]$Compile
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get the scripts and cmder root dirs we are building in.
|
# Get the scripts and Cmder root dirs we are building in.
|
||||||
$cmder_root = Resolve-Path "$PSScriptRoot\.."
|
$cmder_root = Resolve-Path "$PSScriptRoot\.."
|
||||||
|
|
||||||
# Dot source util functions into this scope
|
# Dot source util functions into this scope
|
||||||
|
|||||||
@@ -2,18 +2,18 @@
|
|||||||
.Synopsis
|
.Synopsis
|
||||||
Pack Cmder
|
Pack Cmder
|
||||||
.DESCRIPTION
|
.DESCRIPTION
|
||||||
Use this script to pack cmder into release archives
|
Use this script to pack Cmder into release archives
|
||||||
|
|
||||||
You will need to make this script executable by setting your Powershell Execution Policy to Remote signed
|
You will need to make this script executable by setting your Powershell Execution Policy to Remote signed
|
||||||
Then unblock the script for execution with UnblockFile .\pack.ps1
|
Then unblock the script for execution with UnblockFile .\pack.ps1
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\pack.ps1
|
.\pack.ps1
|
||||||
|
|
||||||
Creates default archives for cmder
|
Creates default archives for Cmder
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\pack.ps1 -verbose
|
.\pack.ps1 -verbose
|
||||||
|
|
||||||
Creates default archives for cmder with plenty of information
|
Creates default archives for Cmder with plenty of information
|
||||||
.NOTES
|
.NOTES
|
||||||
AUTHORS
|
AUTHORS
|
||||||
Samuel Vasko, Jack Bennett, Martin Kemp
|
Samuel Vasko, Jack Bennett, Martin Kemp
|
||||||
|
|||||||
@@ -172,13 +172,13 @@ function Register-Cmder() {
|
|||||||
# Text for the context menu item.
|
# Text for the context menu item.
|
||||||
$MenuText = "Cmder Here"
|
$MenuText = "Cmder Here"
|
||||||
|
|
||||||
, # Defaults to the current cmder directory when run from cmder.
|
, # Defaults to the current Cmder directory when run from Cmder.
|
||||||
$PathToExe = (Join-Path $env:CMDER_ROOT "cmder.exe")
|
$PathToExe = (Join-Path $env:CMDER_ROOT "cmder.exe")
|
||||||
|
|
||||||
, # Commands the context menu will execute.
|
, # Commands the context menu will execute.
|
||||||
$Command = "%V"
|
$Command = "%V"
|
||||||
|
|
||||||
, # Defaults to the icons folder in the cmder package.
|
, # Defaults to the icons folder in the Cmder package.
|
||||||
$icon = (Split-Path $PathToExe | Join-Path -ChildPath 'icons/cmder.ico')
|
$icon = (Split-Path $PathToExe | Join-Path -ChildPath 'icons/cmder.ico')
|
||||||
)
|
)
|
||||||
Begin
|
Begin
|
||||||
|
|||||||
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
|
||||||
|
|||||||
45
vendor/git-prompt.sh
vendored
45
vendor/git-prompt.sh
vendored
@@ -5,9 +5,9 @@ function getGitStatusSetting() {
|
|||||||
# Get all git config entries for the current repository without pager
|
# Get all git config entries for the current repository without pager
|
||||||
gitConfig=$(git --no-pager config -l 2>/dev/null) || return 0 # treat failure as enabled
|
gitConfig=$(git --no-pager config -l 2>/dev/null) || return 0 # treat failure as enabled
|
||||||
|
|
||||||
# Check if git status for Cmder is disabled
|
# Check if git status display for Cmder is disabled via config
|
||||||
if [[ $gitConfig =~ (^|$'\n')cmder\.status=false($|$'\n') ]] || \
|
# Matches: cmder.status=false or cmder.shstatus=false (Bash-specific)
|
||||||
[[ $gitConfig =~ (^|$'\n')cmder\.shstatus=false($|$'\n') ]]
|
if [[ $gitConfig =~ (^|$'\n')cmder\.(sh)?status=false($|$'\n') ]]
|
||||||
then
|
then
|
||||||
return 1 # disabled
|
return 1 # disabled
|
||||||
fi
|
fi
|
||||||
@@ -47,9 +47,41 @@ then
|
|||||||
. ~/.config/git/git-prompt.sh
|
. ~/.config/git/git-prompt.sh
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Taken parts from https://github.com/git-for-windows/build-extra/blob/main/git-extra/git-prompt.sh
|
|
||||||
|
# Setup OSC 133 shell integration for Windows Terminal
|
||||||
|
if [ -n "$WT_SESSION" ]; then
|
||||||
|
__cmder_prompt_command() {
|
||||||
|
local exit_code=$?
|
||||||
|
# Emit OSC 133;D to mark the end of command execution with exit code
|
||||||
|
printf '\e]133;D;%s\a' "$exit_code"
|
||||||
|
return $exit_code
|
||||||
|
}
|
||||||
|
|
||||||
|
__cmder_preexec() {
|
||||||
|
# Emit OSC 133;C to mark the start of command execution
|
||||||
|
printf '\e]133;C\a'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Append to PROMPT_COMMAND to emit sequences just before each prompt
|
||||||
|
if [ -z "$PROMPT_COMMAND" ]; then
|
||||||
|
PROMPT_COMMAND="__cmder_prompt_command"
|
||||||
|
else
|
||||||
|
PROMPT_COMMAND="__cmder_prompt_command;$PROMPT_COMMAND"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use DEBUG trap to emit OSC 133;C before command execution
|
||||||
|
trap '__cmder_preexec' DEBUG
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Source: github.com/git-for-windows/build-extra/blob/main/git-extra/git-prompt.sh
|
||||||
PS1='\[\033]0;${TITLEPREFIX:+$TITLEPREFIX:}${PWD//[^[:ascii:]]/?}\007\]' # set window title to TITLEPREFIX (if set) and current working directory
|
PS1='\[\033]0;${TITLEPREFIX:+$TITLEPREFIX:}${PWD//[^[:ascii:]]/?}\007\]' # set window title to TITLEPREFIX (if set) and current working directory
|
||||||
# PS1="$PS1"'\n' # new line (disabled)
|
# PS1="$PS1"'\n' # new line (disabled)
|
||||||
|
|
||||||
|
if [ -n "$WT_SESSION" ]; then
|
||||||
|
# Emit OSC 133;A to mark the start of prompt
|
||||||
|
PS1="$PS1"'\e]133;A\a'
|
||||||
|
fi
|
||||||
|
|
||||||
PS1="$PS1"'\[\033[32m\]' # change to green and bold
|
PS1="$PS1"'\[\033[32m\]' # change to green and bold
|
||||||
PS1="$PS1"'\u@\h ' # user@host<space>
|
PS1="$PS1"'\u@\h ' # user@host<space>
|
||||||
PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set)
|
PS1="$PS1${MSYSTEM:+\[\033[35m\]$MSYSTEM }" # show MSYSTEM in purple (if set)
|
||||||
@@ -80,6 +112,11 @@ else
|
|||||||
PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold
|
PS1="$PS1"'\[\033[30;1m\]' # change color to grey in bold
|
||||||
PS1="$PS1"'λ ' # prompt: Cmder uses λ
|
PS1="$PS1"'λ ' # prompt: Cmder uses λ
|
||||||
PS1="$PS1"'\[\033[0m\]' # reset color
|
PS1="$PS1"'\[\033[0m\]' # reset color
|
||||||
|
|
||||||
|
if [ -n "$WT_SESSION" ]; then
|
||||||
|
# Emit OSC 133;B to mark the end of prompt
|
||||||
|
PS1="$PS1"'\[\e]133;B\a\]'
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
|
MSYS2_PS1="$PS1" # for detection by MSYS2 SDK's bash.basrc
|
||||||
|
|||||||
3
vendor/init.bat
vendored
3
vendor/init.bat
vendored
@@ -223,6 +223,9 @@ goto :SKIP_CLINK
|
|||||||
:: Revert back to plain cmd.exe prompt without clink
|
:: Revert back to plain cmd.exe prompt without clink
|
||||||
prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m
|
prompt $E[1;32;49m$P$S$_$E[1;30;49mλ$S$E[0m
|
||||||
|
|
||||||
|
:: Add Windows Terminal shell integration support (OSC 133 sequences)
|
||||||
|
if defined WT_SESSION (prompt $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\)
|
||||||
|
|
||||||
chcp %cp%>nul
|
chcp %cp%>nul
|
||||||
|
|
||||||
:CLINK_FINISH
|
:CLINK_FINISH
|
||||||
|
|||||||
63
vendor/profile.ps1
vendored
63
vendor/profile.ps1
vendored
@@ -7,15 +7,11 @@
|
|||||||
|
|
||||||
$CMDER_INIT_START = Get-Date
|
$CMDER_INIT_START = Get-Date
|
||||||
|
|
||||||
# Compatibility with PS major versions <= 2
|
# Determine the script root if not already set
|
||||||
if (!$PSScriptRoot) {
|
if (!$PSScriptRoot) {
|
||||||
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
|
$PSScriptRoot = Split-Path $Script:MyInvocation.MyCommand.Path
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($ENV:CMDER_USER_CONFIG) {
|
|
||||||
Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
|
|
||||||
}
|
|
||||||
|
|
||||||
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
|
# We do this for Powershell as Admin Sessions because CMDER_ROOT is not being set.
|
||||||
if (!$ENV:CMDER_ROOT) {
|
if (!$ENV:CMDER_ROOT) {
|
||||||
if ($ENV:ConEmuDir) {
|
if ($ENV:ConEmuDir) {
|
||||||
@@ -31,6 +27,12 @@ $ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
|
|||||||
# Recent PowerShell versions include PowerShellGet out of the box
|
# Recent PowerShell versions include PowerShellGet out of the box
|
||||||
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
|
$moduleInstallerAvailable = [bool](Get-Command -Name 'Install-Module' -ErrorAction SilentlyContinue)
|
||||||
|
|
||||||
|
# Enable Debug and Verbose output if CMDER_DEBUG environment variable is set to '1' or 'true'
|
||||||
|
if ($env:CMDER_DEBUG -and ($env:CMDER_DEBUG -match '^(1|true)$')) {
|
||||||
|
$DebugPreference = 'Continue'
|
||||||
|
$VerbosePreference = 'Continue'
|
||||||
|
}
|
||||||
|
|
||||||
# Add Cmder modules directory to the autoload path.
|
# Add Cmder modules directory to the autoload path.
|
||||||
$CmderModulePath = Join-path $PSScriptRoot "psmodules/"
|
$CmderModulePath = Join-path $PSScriptRoot "psmodules/"
|
||||||
|
|
||||||
@@ -43,28 +45,40 @@ if (-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderMo
|
|||||||
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
|
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($env:CMDER_USER_CONFIG) {
|
||||||
|
Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
|
||||||
|
}
|
||||||
|
|
||||||
# Read vendored Git Version
|
# Read vendored Git Version
|
||||||
$gitVersionVendor = Get-GitVersion -GitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd"
|
$gitVendorPath = Join-Path $ENV:CMDER_ROOT 'vendor\git-for-windows\cmd'
|
||||||
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
|
$gitVersionVendor = Get-GitVersion -GitPath $gitVendorPath
|
||||||
|
if (-not [string]::IsNullOrEmpty($gitVersionVendor)) {
|
||||||
|
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
|
||||||
|
} else {
|
||||||
|
Write-Debug "GIT VENDOR is not present at '$gitVendorPath'"
|
||||||
|
}
|
||||||
|
|
||||||
# Get user installed Git version(s) if found, and compare them with vendored version.
|
# Get user installed Git version(s) if found, and compare them with vendored version.
|
||||||
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
|
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
|
||||||
Write-Debug "GIT PATH: {$git.Path}"
|
Write-Debug "GIT USER PATH: $($git.Path)"
|
||||||
$gitDir = Split-Path -Path $git.Path
|
$gitDir = Split-Path -Path $git.Path
|
||||||
$gitDir = Get-GitShimPath -GitPath $gitDir
|
$gitDir = Get-GitShimPath -GitPath $gitDir
|
||||||
$gitVersionUser = Get-GitVersion -GitPath $gitDir
|
$gitVersionUser = Get-GitVersion -GitPath $gitDir
|
||||||
Write-Debug "GIT USER: ${gitVersionUser}"
|
Write-Debug "GIT USER VERSION: ${gitVersionUser}"
|
||||||
|
|
||||||
$useGitVersion = Compare-GitVersion -UserVersion $gitVersionUser -VendorVersion $gitVersionVendor
|
$useGitVersion = Compare-GitVersion -UserVersion $gitVersionUser -VendorVersion $gitVersionVendor
|
||||||
Write-Debug "Using Git Version: ${useGitVersion}"
|
Write-Debug "Using Git Version: ${useGitVersion}"
|
||||||
|
|
||||||
# Use user installed Git
|
# Use user installed Git
|
||||||
if ($null -eq $gitPathUser) {
|
if ($null -eq $gitPathUser) {
|
||||||
|
Write-Debug "Detected Git from mingw bin directory"
|
||||||
|
Write-Debug "Git Dir: ${gitDir}"
|
||||||
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') {
|
if ($gitDir -match '\\mingw32\\bin' -or $gitDir -match '\\mingw64\\bin') {
|
||||||
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 12))
|
$gitPathUser = $gitDir.subString(0, $gitDir.Length - 12)
|
||||||
} else {
|
} else {
|
||||||
$gitPathUser = ($gitDir.subString(0,$gitDir.Length - 4))
|
$gitPathUser = $gitDir.subString(0, $gitDir.Length - 4)
|
||||||
}
|
}
|
||||||
|
Write-Debug "Git Path User: ${gitDir}"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($useGitVersion -eq $gitVersionUser) {
|
if ($useGitVersion -eq $gitVersionUser) {
|
||||||
@@ -98,8 +112,7 @@ if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
|
|||||||
# Display an extra prompt line between the prompt and the command input
|
# Display an extra prompt line between the prompt and the command input
|
||||||
Set-PSReadlineOption -ExtraPromptLineCount 1
|
Set-PSReadlineOption -ExtraPromptLineCount 1
|
||||||
|
|
||||||
# Add OSC 133;C support for Windows Terminal shell integration
|
# Invoked when Enter is pressed to submit a command
|
||||||
# This marks the start of command output (emitted when Enter is pressed)
|
|
||||||
if ($env:WT_SESSION) {
|
if ($env:WT_SESSION) {
|
||||||
Set-PSReadLineKeyHandler -Key Enter -ScriptBlock {
|
Set-PSReadLineKeyHandler -Key Enter -ScriptBlock {
|
||||||
# Get the current command line
|
# Get the current command line
|
||||||
@@ -110,7 +123,7 @@ if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
|
|||||||
# Accept the line first
|
# Accept the line first
|
||||||
[Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
|
[Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
|
||||||
|
|
||||||
# Emit OSC 133;C sequence to mark start of command output
|
# Emit OSC 133;C to mark start of command output
|
||||||
# This is written directly to the console after the command is accepted
|
# This is written directly to the console after the command is accepted
|
||||||
[Console]::Write("$([char]0x1B)]133;C$([char]7)")
|
[Console]::Write("$([char]0x1B)]133;C$([char]7)")
|
||||||
}
|
}
|
||||||
@@ -221,21 +234,26 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
|
|||||||
$lastSUCCESS = $?
|
$lastSUCCESS = $?
|
||||||
$realLastExitCode = $LastExitCode
|
$realLastExitCode = $LastExitCode
|
||||||
|
|
||||||
# Emit OSC 9;9 sequence for Windows Terminal directory tracking
|
# Terminal-specific escape sequences for Windows Terminal and ConEmu
|
||||||
# This enables "Duplicate Tab" and "Split Pane" to preserve the working directory
|
if ($env:WT_SESSION -or $env:ConEmuPID) {
|
||||||
# Only active in Windows Terminal ($env:WT_SESSION) or ConEmu ($env:ConEmuPID)
|
# Emit OSC 133;D to mark the end of command execution with exit code
|
||||||
|
if ($env:WT_SESSION) {
|
||||||
|
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;D;$realLastExitCode$([char]7)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Emit OSC 9;9 to enable directory tracking
|
||||||
|
# Enables "Duplicate Tab" and "Split Pane" to preserve the working directory
|
||||||
$loc = $executionContext.SessionState.Path.CurrentLocation
|
$loc = $executionContext.SessionState.Path.CurrentLocation
|
||||||
if (($env:WT_SESSION -or $env:ConEmuPID) -and $loc.Provider.Name -eq "FileSystem") {
|
if ($loc.Provider.Name -eq "FileSystem") {
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]9;9;`"$($loc.ProviderPath)`"$([char]0x1B)\"
|
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]9;9;`"$($loc.ProviderPath)`"$([char]0x1B)\"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Emit OSC 133;A sequence for Windows Terminal shell integration
|
# Emit OSC 133;A to mark the start of the prompt
|
||||||
# This marks the start of the prompt
|
|
||||||
# Enables features like command navigation, selection, and visual separators
|
# Enables features like command navigation, selection, and visual separators
|
||||||
# Only active in Windows Terminal ($env:WT_SESSION)
|
|
||||||
if ($env:WT_SESSION) {
|
if ($env:WT_SESSION) {
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;A$([char]7)"
|
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;A$([char]7)"
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
|
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
|
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x200B)`r$([char]0x1B)[K"
|
||||||
@@ -246,8 +264,7 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
|
|||||||
CmderPrompt
|
CmderPrompt
|
||||||
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
||||||
|
|
||||||
# Emit OSC 133;B sequence for Windows Terminal shell integration
|
# Emit OSC 133;B to mark the start of command input (after prompt, before user types)
|
||||||
# This marks the start of command input (after prompt, before user types)
|
|
||||||
if ($env:WT_SESSION) {
|
if ($env:WT_SESSION) {
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;B$([char]7)"
|
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;B$([char]7)"
|
||||||
}
|
}
|
||||||
|
|||||||
12
vendor/sources.json
vendored
12
vendor/sources.json
vendored
@@ -1,13 +1,13 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "git-for-windows",
|
"name": "git-for-windows",
|
||||||
"version": "2.51.2.windows.1",
|
"version": "2.52.0.windows.1",
|
||||||
"url": "https://github.com/git-for-windows/git/releases/download/v2.51.2.windows.1/PortableGit-2.51.2-64-bit.7z.exe"
|
"url": "https://github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/PortableGit-2.52.0-64-bit.7z.exe"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "clink",
|
"name": "clink",
|
||||||
"version": "1.8.8",
|
"version": "1.9.5",
|
||||||
"url": "https://github.com/chrisant996/clink/releases/download/v1.8.8/clink.1.8.8.a63364.zip"
|
"url": "https://github.com/chrisant996/clink/releases/download/v1.9.5/clink.1.9.5.ee6b4f.zip"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "conemu-maximus5",
|
"name": "conemu-maximus5",
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "clink-completions",
|
"name": "clink-completions",
|
||||||
"version": "0.6.6",
|
"version": "0.6.7",
|
||||||
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.6.zip"
|
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.7.zip"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user