mirror of
https://github.com/cmderdev/cmder.git
synced 2026-03-02 17:06:07 +08:00
Compare commits
2 Commits
dax/fix-gi
...
copilot/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9d17a2f4cb | ||
|
|
5c072d47e4 |
4
.github/dependabot.yml
vendored
4
.github/dependabot.yml
vendored
@@ -5,11 +5,7 @@
|
|||||||
|
|
||||||
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,25 +19,10 @@ 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@v6
|
- uses: actions/checkout@v5
|
||||||
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: |
|
||||||
@@ -46,15 +31,3 @@ 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,69 +35,10 @@ 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@v6
|
uses: actions/checkout@v5
|
||||||
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
|
||||||
|
|
||||||
@@ -106,132 +47,36 @@ 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@v6
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: build/cmder.zip
|
path: build/cmder.zip
|
||||||
name: cmder.zip
|
name: cmder.zip
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Upload artifact (cmder.7z)
|
- name: Upload artifact (cmder.7z)
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: build/cmder.7z
|
path: build/cmder.7z
|
||||||
name: cmder.7z
|
name: cmder.7z
|
||||||
|
|
||||||
- name: Upload artifact (cmder_mini.zip)
|
- name: Upload artifact (cmder_mini.zip)
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
path: build/cmder_mini.zip
|
path: build/cmder_mini.zip
|
||||||
name: cmder_mini.zip
|
name: cmder_mini.zip
|
||||||
|
|
||||||
- name: Upload artifact (hashes.txt)
|
- name: Upload artifact (hashes.txt)
|
||||||
uses: actions/upload-artifact@v6
|
uses: actions/upload-artifact@v4
|
||||||
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:
|
||||||
@@ -243,25 +88,3 @@ 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
|
|
||||||
|
|||||||
54
.github/workflows/codeql.yml
vendored
54
.github/workflows/codeql.yml
vendored
@@ -45,30 +45,11 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v6
|
uses: actions/checkout@v5
|
||||||
|
|
||||||
- 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
|
||||||
uses: github/codeql-action/init@v4
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -86,36 +67,7 @@ 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@v3
|
||||||
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
|
|
||||||
|
|||||||
119
.github/workflows/tests.yml
vendored
119
.github/workflows/tests.yml
vendored
@@ -38,132 +38,17 @@ jobs:
|
|||||||
continue-on-error: false
|
continue-on-error: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v5
|
||||||
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: Summary - Clink Shell test
|
|
||||||
if: success()
|
|
||||||
shell: pwsh
|
|
||||||
run: |
|
|
||||||
"| Clink Shell | ✅ Passed | Cmd shell initialization |" | Add-Content -Path $env:GITHUB_STEP_SUMMARY -Encoding utf8
|
|
||||||
- name: Testing PowerShell
|
- name: Testing PowerShell
|
||||||
id: test-powershell
|
|
||||||
run: |
|
run: |
|
||||||
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "$env:CMDER_DEBUG='1'; . 'vendor\profile.ps1'"
|
PowerShell.exe -ExecutionPolicy Bypass -NoLogo -NoProfile -Command "Invoke-Expression '. ''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
|
|
||||||
|
|||||||
89
.github/workflows/vendor.yml
vendored
89
.github/workflows/vendor.yml
vendored
@@ -24,69 +24,32 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v6
|
- uses: actions/checkout@v5
|
||||||
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:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: |
|
||||||
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
$currentVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
||||||
. .\scripts\update.ps1 -verbose
|
. .\scripts\update.ps1 -verbose
|
||||||
Set-GHVariable -Name COUNT_UPDATED -Value $count
|
Set-GHVariable -Name COUNT_UPDATED -Value $count
|
||||||
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
$newVersion = (Get-Content .\vendor\sources.json | ConvertFrom-Json)
|
||||||
$listUpdated = ""
|
$listUpdated = ""
|
||||||
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
|
$updateMessage = "| Name | Old Version | New Version |`n| :--- | ---- | ---- |`n"
|
||||||
foreach ($s in $newVersion) {
|
foreach ($s in $newVersion) {
|
||||||
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
|
$oldVersion = ($currentVersion | Where-Object {$_.name -eq $s.name}).version
|
||||||
if ($s.version -ne $oldVersion) {
|
if ($s.version -ne $oldVersion) {
|
||||||
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
|
$repoUrl = ($repoUrl = $s.Url.Replace("/archive/", "/releases/")).Substring(0, $repoUrl.IndexOf("/releases/")) + "/releases"
|
||||||
$listUpdated += "$($s.name) v$($s.version), "
|
$listUpdated += "$($s.name) v$($s.version), "
|
||||||
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
|
$updateMessage += "| **[$($s.name)]($repoUrl)** | $oldVersion | **$($s.version)** |`n"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
if ($count -eq 0) { return }
|
||||||
if ($count -eq 0) { return }
|
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
||||||
Set-GHVariable -Name LIST_UPDATED -Value $listUpdated.Trim(', ')
|
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
||||||
|
|
||||||
echo "UPDATE_MESSAGE<<<EOF`n$updateMessage`n<EOF" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
|
|
||||||
|
|
||||||
- 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
|
||||||
@@ -100,21 +63,3 @@ 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,84 +1,5 @@
|
|||||||
# 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
|
||||||
|
|||||||
@@ -352,10 +352,6 @@ Cmder by default comes with a vendored ConEmu installation as the underlying ter
|
|||||||
|
|
||||||
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
|
However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator.
|
||||||
|
|
||||||
⚠ *Note:* Cmder includes built-in support for Windows Terminal directory tracking via OSC 9;9 sequences. This enables "Duplicate Tab" and "Split Pane" features to preserve the current working directory for both `cmd.exe` and PowerShell sessions.
|
|
||||||
|
|
||||||
⚠ *Note:* Cmder also includes built-in support for [Windows Terminal shell integration](https://learn.microsoft.com/en-us/windows/terminal/tutorials/shell-integration) via OSC 133 sequences (A, B, C, 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).
|
||||||
|
|
||||||
## Upgrading
|
## Upgrading
|
||||||
|
|||||||
@@ -21,19 +21,19 @@
|
|||||||
|
|
||||||
Skip all downloads and only build launcher.
|
Skip all downloads and only build launcher.
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\build -verbose
|
.\build.ps1 -verbose
|
||||||
|
|
||||||
Execute the build and see what's going on.
|
Execute the build and see what's going on.
|
||||||
.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
|
||||||
Part of the Cmder project.
|
Part of the Cmder project.
|
||||||
.LINK
|
.LINK
|
||||||
http://cmder.app/ - Project Home
|
https://github.com/cmderdev/cmder - Project Home
|
||||||
#>
|
#>
|
||||||
[CmdletBinding(SupportsShouldProcess = $true)]
|
[CmdletBinding(SupportsShouldProcess = $true)]
|
||||||
Param(
|
Param(
|
||||||
@@ -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
|
||||||
@@ -35,7 +35,7 @@ Param(
|
|||||||
[string]$saveTo = "$PSScriptRoot\..\build"
|
[string]$saveTo = "$PSScriptRoot\..\build"
|
||||||
)
|
)
|
||||||
|
|
||||||
$cmderRoot = Resolve-Path $cmderRoot
|
$cmder_root = Resolve-Path $cmderRoot
|
||||||
|
|
||||||
. "$PSScriptRoot\utils.ps1"
|
. "$PSScriptRoot\utils.ps1"
|
||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
@@ -47,10 +47,10 @@ $targets = @{
|
|||||||
"cmder_mini.zip" = "-xr!`"vendor\git-for-windows`"";
|
"cmder_mini.zip" = "-xr!`"vendor\git-for-windows`"";
|
||||||
}
|
}
|
||||||
|
|
||||||
Push-Location -Path $cmderRoot
|
Push-Location -Path $cmder_root
|
||||||
|
|
||||||
Delete-Existing "$cmderRoot\Version*"
|
Delete-Existing "$cmder_root\Version*"
|
||||||
Delete-Existing "$cmderRoot\build\*"
|
Delete-Existing "$cmder_root\build\*"
|
||||||
|
|
||||||
if (-not (Test-Path -PathType container $saveTo)) {
|
if (-not (Test-Path -PathType container $saveTo)) {
|
||||||
(New-Item -ItemType Directory -Path $saveTo) | Out-Null
|
(New-Item -ItemType Directory -Path $saveTo) | Out-Null
|
||||||
@@ -59,16 +59,16 @@ if (-not (Test-Path -PathType container $saveTo)) {
|
|||||||
$saveTo = Resolve-Path $saveTo
|
$saveTo = Resolve-Path $saveTo
|
||||||
|
|
||||||
$version = Get-VersionStr
|
$version = Get-VersionStr
|
||||||
(New-Item -ItemType file "$cmderRoot\Version $version") | Out-Null
|
(New-Item -ItemType file "$cmder_root\Version $version") | Out-Null
|
||||||
|
|
||||||
if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
|
if ($PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent) {
|
||||||
Write-Verbose "Packing Cmder $version in $saveTo..."
|
Write-Verbose "Packing Cmder $version in $saveTo..."
|
||||||
$excluded = (Get-Content -Path "$cmderRoot\packignore") -Split [System.Environment]::NewLine | Where-Object { $_ }
|
$excluded = (Get-Content -Path "$cmder_root\packignore") -Split [System.Environment]::NewLine | Where-Object { $_ }
|
||||||
Get-ChildItem $cmderRoot -Force -Exclude $excluded
|
Get-ChildItem $cmder_root -Force -Exclude $excluded
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($t in $targets.GetEnumerator()) {
|
foreach ($t in $targets.GetEnumerator()) {
|
||||||
Create-Archive "$cmderRoot" "$saveTo\$($t.Name)" $t.Value
|
Create-Archive "$cmder_root" "$saveTo\$($t.Name)" $t.Value
|
||||||
$hash = (Digest-Hash "$saveTo\$($t.Name)")
|
$hash = (Digest-Hash "$saveTo\$($t.Name)")
|
||||||
Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash)
|
Add-Content -path "$saveTo\hashes.txt" -value ($t.Name + ' ' + $hash)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,17 +5,17 @@
|
|||||||
This script updates dependencies to the latest version in vendor/sources.json file.
|
This script updates dependencies to the latest version in vendor/sources.json file.
|
||||||
|
|
||||||
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 .\build.ps1
|
Then unblock the script for execution with UnblockFile .\update.ps1
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\build.ps1
|
.\update.ps1
|
||||||
|
|
||||||
Updates the dependency sources in the default location, the vendor/sources.json file.
|
Updates the dependency sources in the default location, the vendor/sources.json file.
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\build -verbose
|
.\update.ps1 -verbose
|
||||||
|
|
||||||
Updates the dependency sources and see what's going on.
|
Updates the dependency sources and see what's going on.
|
||||||
.EXAMPLE
|
.EXAMPLE
|
||||||
.\build.ps1 -SourcesPath '~/custom/vendors.json'
|
.\update.ps1 -SourcesPath '~/custom/vendors.json'
|
||||||
|
|
||||||
Specify the path to update dependency sources file at.
|
Specify the path to update dependency sources file at.
|
||||||
.NOTES
|
.NOTES
|
||||||
@@ -23,7 +23,7 @@
|
|||||||
David Refoua <David@Refoua.me>
|
David Refoua <David@Refoua.me>
|
||||||
Part of the Cmder project.
|
Part of the Cmder project.
|
||||||
.LINK
|
.LINK
|
||||||
http://cmder.app/ - Project Home
|
https://github.com/cmderdev/cmder - Project Home
|
||||||
#>
|
#>
|
||||||
[CmdletBinding(SupportsShouldProcess = $true)]
|
[CmdletBinding(SupportsShouldProcess = $true)]
|
||||||
Param(
|
Param(
|
||||||
@@ -32,11 +32,7 @@ Param(
|
|||||||
# -whatif switch to not actually make changes
|
# -whatif switch to not actually make changes
|
||||||
|
|
||||||
# Path to the vendor configuration source file
|
# Path to the vendor configuration source file
|
||||||
[string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json",
|
[string]$sourcesPath = "$PSScriptRoot\..\vendor\sources.json"
|
||||||
|
|
||||||
# Include pre-release versions (RC, beta, alpha, etc.)
|
|
||||||
# By default, only stable releases are considered
|
|
||||||
[switch]$IncludePrerelease = $false
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Get the root directory of the cmder project.
|
# Get the root directory of the cmder project.
|
||||||
@@ -83,39 +79,11 @@ function Match-Filenames {
|
|||||||
return $position
|
return $position
|
||||||
}
|
}
|
||||||
|
|
||||||
# Checks if a release is a pre-release based on GitHub API flag and version tag keywords
|
|
||||||
# Pre-release keywords include: -rc (release candidate), -beta, -alpha, -preview, -pre
|
|
||||||
function Test-IsPrerelease {
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
$release
|
|
||||||
)
|
|
||||||
|
|
||||||
# Check if marked as pre-release by GitHub
|
|
||||||
if ($release.prerelease -eq $true) {
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Check for common pre-release keywords in tag name
|
|
||||||
# This catches versions like v2.50.0-rc, v1.0.0-beta, v1.0.0-alpha, etc.
|
|
||||||
$prereleaseKeywords = @('-rc', '-beta', '-alpha', '-preview', '-pre')
|
|
||||||
foreach ($keyword in $prereleaseKeywords) {
|
|
||||||
if ($release.tag_name -ilike "*$keyword*") {
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
# Uses the GitHub api in order to fetch the current download links for the latest releases of the repo.
|
# Uses the GitHub api in order to fetch the current download links for the latest releases of the repo.
|
||||||
function Fetch-DownloadUrl {
|
function Fetch-DownloadUrl {
|
||||||
param (
|
param (
|
||||||
[Parameter(Mandatory = $true)]
|
[Parameter(Mandatory = $true)]
|
||||||
$urlStr,
|
$urlStr
|
||||||
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[bool]$includePrerelease = $false
|
|
||||||
)
|
)
|
||||||
|
|
||||||
$url = [uri] $urlStr
|
$url = [uri] $urlStr
|
||||||
@@ -159,13 +127,6 @@ function Fetch-DownloadUrl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
:loop foreach ($i in $info) {
|
:loop foreach ($i in $info) {
|
||||||
# Skip pre-release versions unless explicitly included
|
|
||||||
# Pre-releases include RC (Release Candidate), beta, alpha, and other test versions
|
|
||||||
if (-not $includePrerelease -and (Test-IsPrerelease $i)) {
|
|
||||||
Write-Verbose "Skipping pre-release version: $($i.tag_name)"
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-not ($i.assets -is [array])) {
|
if (-not ($i.assets -is [array])) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -203,26 +164,12 @@ function Fetch-DownloadUrl {
|
|||||||
|
|
||||||
# Special case for archive downloads of repository
|
# Special case for archive downloads of repository
|
||||||
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
|
if (($null -eq $downloadLinks) -or (-not $downloadLinks)) {
|
||||||
if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive")) {
|
if ((($p | ForEach-Object { $_.Trim('/') }) -contains "archive") -and $info[0].tag_name) {
|
||||||
# Find the first release that matches our pre-release filtering criteria
|
for ($i = 0; $i -lt $p.Length; $i++) {
|
||||||
$selectedRelease = $null
|
if ($p[$i].Trim('/') -eq "archive") {
|
||||||
foreach ($release in $info) {
|
$p[$i + 1] = $info[0].tag_name + ".zip"
|
||||||
# Apply the same filtering logic
|
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
|
||||||
if (-not $includePrerelease -and (Test-IsPrerelease $release)) {
|
return $downloadLinks
|
||||||
continue
|
|
||||||
}
|
|
||||||
# Use the first release that passes the filter
|
|
||||||
$selectedRelease = $release
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($selectedRelease -and $selectedRelease.tag_name) {
|
|
||||||
for ($i = 0; $i -lt $p.Length; $i++) {
|
|
||||||
if ($p[$i].Trim('/') -eq "archive") {
|
|
||||||
$p[$i + 1] = $selectedRelease.tag_name + ".zip"
|
|
||||||
$downloadLinks = $url.Scheme + "://" + $url.Host + ($p -join '')
|
|
||||||
return $downloadLinks
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -268,7 +215,7 @@ foreach ($s in $sources) {
|
|||||||
|
|
||||||
Write-Verbose "Old Link: $($s.url)"
|
Write-Verbose "Old Link: $($s.url)"
|
||||||
|
|
||||||
$downloadUrl = Fetch-DownloadUrl $s.url -includePrerelease $IncludePrerelease
|
$downloadUrl = Fetch-DownloadUrl $s.url
|
||||||
|
|
||||||
if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
|
if (($null -eq $downloadUrl) -or ($downloadUrl -eq '')) {
|
||||||
Write-Verbose "No new links were found"
|
Write-Verbose "No new links were found"
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
function Ensure-Exists($path) {
|
function Ensure-Exists($path) {
|
||||||
if (-not (Test-Path $path)) {
|
if (-not (Test-Path $path)) {
|
||||||
Write-Error "Missing required $path! Ensure it is installed"
|
throw "Missing required $path! Ensure it is installed"
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
return $true > $null
|
return $true > $null
|
||||||
}
|
}
|
||||||
@@ -16,8 +15,7 @@ function Ensure-Executable($command) {
|
|||||||
Set-Alias -Name "7z" -Value "$env:programw6432\7-zip\7z.exe" -Scope script
|
Set-Alias -Name "7z" -Value "$env:programw6432\7-zip\7z.exe" -Scope script
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Write-Error "Missing $command! Ensure it is installed and on in the PATH"
|
throw "Missing $command! Ensure it is installed and on in the PATH"
|
||||||
exit 1
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -172,13 +170,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
|
||||||
|
|||||||
270
vendor/clink.lua
vendored
270
vendor/clink.lua
vendored
@@ -7,7 +7,7 @@
|
|||||||
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
|
-- luacheck: globals uah_color cwd_color lamb_color clean_color dirty_color conflict_color unknown_color
|
||||||
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
|
-- luacheck: globals prompt_homeSymbol prompt_lambSymbol prompt_type prompt_useHomeSymbol prompt_useUserAtHost
|
||||||
-- luacheck: globals prompt_singleLine prompt_includeVersionControl
|
-- luacheck: globals prompt_singleLine prompt_includeVersionControl
|
||||||
-- luacheck: globals prompt_overrideGitStatusOptIn
|
-- luacheck: globals prompt_overrideGitStatusOptIn prompt_overrideSvnStatusOptIn
|
||||||
-- luacheck: globals clink io.popenyield os.isdir settings.get
|
-- luacheck: globals clink io.popenyield os.isdir settings.get
|
||||||
|
|
||||||
-- At first, load the original clink.lua file
|
-- At first, load the original clink.lua file
|
||||||
@@ -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, fast)
|
local function get_git_branch(git_dir)
|
||||||
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,90 +341,8 @@ local function get_git_branch(git_dir, fast)
|
|||||||
-- 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
|
|
||||||
|
|
||||||
-- If the branch name is ".invalid" and the fast method wasn't requested,
|
return branch_name or 'HEAD detached at '..HEAD:sub(1, 7)
|
||||||
-- 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
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -432,8 +350,13 @@ end
|
|||||||
-- @return {false|mercurial branch information}
|
-- @return {false|mercurial branch information}
|
||||||
---
|
---
|
||||||
local function get_hg_branch()
|
local function get_hg_branch()
|
||||||
-- Return the branch information.
|
-- Return the branch information. The default is to get just the
|
||||||
local file = io.popen("hg branch 2>nul")
|
-- branch name, but you could e.g. use the "hg-prompt" extension to
|
||||||
|
-- get more information, such as any applied mq patches. Here's an
|
||||||
|
-- example of that:
|
||||||
|
-- local cmd = "hg prompt \"{branch}{status}{|{patch}}{update}\""
|
||||||
|
local cmd = "hg branch 2>nul"
|
||||||
|
local file = io.popen(cmd)
|
||||||
if not file then
|
if not file then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
@@ -476,7 +399,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(git_dir)
|
local function get_git_status()
|
||||||
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
local file = io_popenyield("git --no-optional-locks status --porcelain 2>nul")
|
||||||
if not file then
|
if not file then
|
||||||
return {}
|
return {}
|
||||||
@@ -498,31 +421,7 @@ local function get_git_status(git_dir)
|
|||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
|
|
||||||
local branch = get_git_branch(git_dir, false--[[fast]])
|
return { status = is_status, conflict = conflict_found }
|
||||||
local remote = get_git_remote(git_dir, branch)
|
|
||||||
|
|
||||||
return { status = is_status, branch = branch, remote = remote, conflict = conflict_found }
|
|
||||||
end
|
|
||||||
|
|
||||||
---
|
|
||||||
-- Get the status of working dir
|
|
||||||
-- @return {bool}
|
|
||||||
---
|
|
||||||
local function get_hg_status()
|
|
||||||
-- The default is to just use the branch name, but you could e.g. use the
|
|
||||||
-- "hg-prompt" extension to get more information, such as any applied mq
|
|
||||||
-- patches. Here's an example of that:
|
|
||||||
-- "hg prompt \"{branch}{status}{|{patch}}{update}\""
|
|
||||||
local pipe = io_popenyield("hg status -amrd 2>&1")
|
|
||||||
if not pipe then
|
|
||||||
return { error = true }
|
|
||||||
end
|
|
||||||
|
|
||||||
local output = pipe:read('*all')
|
|
||||||
pipe:close()
|
|
||||||
|
|
||||||
local dirty = (output ~= nil and output ~= "")
|
|
||||||
return { clean = not dirty }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -530,7 +429,7 @@ end
|
|||||||
-- @return {bool}
|
-- @return {bool}
|
||||||
---
|
---
|
||||||
local function get_svn_status()
|
local function get_svn_status()
|
||||||
local file = io_popenyield("svn status -q 2>nul")
|
local file = io_popenyield("svn status -q")
|
||||||
if not file then
|
if not file then
|
||||||
return { error = true }
|
return { error = true }
|
||||||
end
|
end
|
||||||
@@ -600,11 +499,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(git_dir)
|
local function get_git_info_table()
|
||||||
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(git_dir) or {}
|
return cmderGitStatusOptIn and get_git_status() or {}
|
||||||
end)
|
end)
|
||||||
if not info then
|
if not info then
|
||||||
info = cached_info.git_info or {}
|
info = cached_info.git_info or {}
|
||||||
@@ -621,14 +520,21 @@ local function git_prompt_filter()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Colors for git status
|
||||||
|
local colors = {
|
||||||
|
clean = get_clean_color(),
|
||||||
|
dirty = get_dirty_color(),
|
||||||
|
conflict = get_conflict_color(),
|
||||||
|
nostatus = get_unknown_color()
|
||||||
|
}
|
||||||
|
|
||||||
local git_dir = get_git_dir()
|
local git_dir = get_git_dir()
|
||||||
local color
|
local color
|
||||||
if git_dir then
|
if git_dir then
|
||||||
local branch = get_git_branch(git_dir, true--[[fast]])
|
local branch = get_git_branch(git_dir)
|
||||||
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
|
if cached_info.git_dir ~= git_dir or cached_info.git_branch ~= branch then
|
||||||
(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
|
||||||
@@ -636,36 +542,23 @@ 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(git_dir)
|
local gitInfo = get_git_info_table()
|
||||||
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 = colors.nostatus
|
||||||
elseif gitStatus then
|
elseif gitStatus then
|
||||||
color = get_clean_color()
|
color = colors.clean
|
||||||
else
|
else
|
||||||
color = get_dirty_color()
|
color = colors.dirty
|
||||||
end
|
end
|
||||||
|
|
||||||
if gitConflict then
|
if gitConflict then
|
||||||
color = get_conflict_color()
|
color = colors.conflict
|
||||||
end
|
end
|
||||||
|
|
||||||
local result = " "..color.."("..branch..")"
|
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", " "..color.."("..branch..")")
|
||||||
clink.prompt.value = gsub_plain(clink.prompt.value, "{git}", result)
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -675,18 +568,6 @@ local function git_prompt_filter()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_hg_info_table()
|
|
||||||
local info = clink_promptcoroutine(function ()
|
|
||||||
return get_hg_status() or {}
|
|
||||||
end)
|
|
||||||
if not info then
|
|
||||||
info = cached_info.hg_info or {}
|
|
||||||
else
|
|
||||||
cached_info.hg_info = info
|
|
||||||
end
|
|
||||||
return info
|
|
||||||
end
|
|
||||||
|
|
||||||
local function hg_prompt_filter()
|
local function hg_prompt_filter()
|
||||||
|
|
||||||
-- Don't do any hg processing if the prompt doesn't want to show hg info.
|
-- Don't do any hg processing if the prompt doesn't want to show hg info.
|
||||||
@@ -696,30 +577,33 @@ local function hg_prompt_filter()
|
|||||||
|
|
||||||
local hg_dir = get_hg_dir()
|
local hg_dir = get_hg_dir()
|
||||||
if hg_dir then
|
if hg_dir then
|
||||||
local branch = get_hg_branch()
|
-- Colors for mercurial status
|
||||||
if branch and
|
local colors = {
|
||||||
|
clean = get_clean_color(),
|
||||||
|
dirty = get_dirty_color(),
|
||||||
|
nostatus = get_unknown_color()
|
||||||
|
}
|
||||||
|
local output = get_hg_branch()
|
||||||
|
|
||||||
|
-- strip the trailing newline from the branch name
|
||||||
|
local n = #output
|
||||||
|
while n > 0 and output:find("^%s", n) do n = n - 1 end
|
||||||
|
local branch = output:sub(1, n)
|
||||||
|
|
||||||
|
if branch ~= nil and
|
||||||
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
|
string.sub(branch,1,7) ~= "abort: " and -- not an HG working copy
|
||||||
(not string.find(branch, "is not recognized")) then -- 'hg' not in path
|
(not string.find(branch, "is not recognized")) then -- 'hg' not in path
|
||||||
-- If in a different repo or branch than last time, discard cached info
|
local color = colors.clean
|
||||||
if cached_info.hg_dir ~= hg_dir or cached_info.hg_branch ~= branch then
|
|
||||||
cached_info.hg_info = nil
|
local pipe = io.popen("hg status -amrd 2>&1")
|
||||||
cached_info.hg_dir = hg_dir
|
if pipe then
|
||||||
cached_info.hg_branch = branch
|
output = pipe:read('*all')
|
||||||
|
pipe:close()
|
||||||
|
if output ~= nil and output ~= "" then color = colors.dirty end
|
||||||
end
|
end
|
||||||
|
|
||||||
local hgInfo = get_hg_info_table()
|
local result = color .. "(" .. branch .. ")"
|
||||||
|
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", " "..result)
|
||||||
local color
|
|
||||||
if not hgInfo or hgInfo.error then
|
|
||||||
color = get_unknown_color()
|
|
||||||
elseif hgInfo.clean then
|
|
||||||
color = get_clean_color()
|
|
||||||
else
|
|
||||||
color = get_dirty_color()
|
|
||||||
end
|
|
||||||
|
|
||||||
local result = " "..color.."("..branch..")"
|
|
||||||
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", result)
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -728,18 +612,6 @@ local function hg_prompt_filter()
|
|||||||
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
|
clink.prompt.value = gsub_plain(clink.prompt.value, "{hg}", "")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_svn_info_table()
|
|
||||||
local info = clink_promptcoroutine(function ()
|
|
||||||
return get_svn_status() or {}
|
|
||||||
end)
|
|
||||||
if not info then
|
|
||||||
info = cached_info.svn_info or {}
|
|
||||||
else
|
|
||||||
cached_info.svn_info = info
|
|
||||||
end
|
|
||||||
return info
|
|
||||||
end
|
|
||||||
|
|
||||||
local function svn_prompt_filter()
|
local function svn_prompt_filter()
|
||||||
|
|
||||||
-- Don't do any svn processing if the prompt doesn't want to show svn info.
|
-- Don't do any svn processing if the prompt doesn't want to show svn info.
|
||||||
@@ -747,6 +619,13 @@ local function svn_prompt_filter()
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Colors for svn status
|
||||||
|
local colors = {
|
||||||
|
clean = get_clean_color(),
|
||||||
|
dirty = get_dirty_color(),
|
||||||
|
nostatus = get_unknown_color()
|
||||||
|
}
|
||||||
|
|
||||||
local svn_dir = get_svn_dir()
|
local svn_dir = get_svn_dir()
|
||||||
if svn_dir then
|
if svn_dir then
|
||||||
-- if we're inside of svn repo then try to detect current branch
|
-- if we're inside of svn repo then try to detect current branch
|
||||||
@@ -758,16 +637,29 @@ local function svn_prompt_filter()
|
|||||||
cached_info.svn_dir = svn_dir
|
cached_info.svn_dir = svn_dir
|
||||||
cached_info.svn_branch = branch
|
cached_info.svn_branch = branch
|
||||||
end
|
end
|
||||||
|
-- Get the svn status using coroutine if available and option is enabled. Otherwise use a blocking call
|
||||||
local svnInfo = get_svn_info_table()
|
local svnStatus
|
||||||
|
if clink.promptcoroutine and io.popenyield and settings.get("prompt.async") and prompt_overrideSvnStatusOptIn then -- luacheck: no max line length
|
||||||
|
svnStatus = clink_promptcoroutine(function ()
|
||||||
|
return get_svn_status()
|
||||||
|
end)
|
||||||
|
-- If the status result is pending, use the cached version instead, otherwise store it to the cache
|
||||||
|
if svnStatus == nil then
|
||||||
|
svnStatus = cached_info.svn_info
|
||||||
|
else
|
||||||
|
cached_info.svn_info = svnStatus
|
||||||
|
end
|
||||||
|
else
|
||||||
|
svnStatus = get_svn_status()
|
||||||
|
end
|
||||||
|
|
||||||
local color
|
local color
|
||||||
if not svnInfo or svnInfo.error then
|
if not svnStatus or svnStatus.error then
|
||||||
color = get_unknown_color()
|
color = colors.nostatus
|
||||||
elseif svnInfo.clean then
|
elseif svnStatus.clean then
|
||||||
color = get_clean_color()
|
color = colors.clean
|
||||||
else
|
else
|
||||||
color = get_dirty_color()
|
color = colors.dirty
|
||||||
end
|
end
|
||||||
|
|
||||||
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")")
|
clink.prompt.value = gsub_plain(clink.prompt.value, "{svn}", " "..color.."("..branch..")")
|
||||||
|
|||||||
5
vendor/cmder_prompt_config.lua.default
vendored
5
vendor/cmder_prompt_config.lua.default
vendored
@@ -38,6 +38,11 @@ prompt_includeVersionControl = true
|
|||||||
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
|
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
|
||||||
prompt_overrideGitStatusOptIn = false
|
prompt_overrideGitStatusOptIn = false
|
||||||
|
|
||||||
|
-- OPTIONAL. If true then always ignore the cmder.status and cmder.cmdstatus svn config settings and run the svn prompt commands in the background.
|
||||||
|
-- default is false
|
||||||
|
-- NOTE: This only takes effect if using Clink v1.2.10 or higher.
|
||||||
|
prompt_overrideSvnStatusOptIn = false
|
||||||
|
|
||||||
-- Prompt Attributes
|
-- Prompt Attributes
|
||||||
--
|
--
|
||||||
-- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors
|
-- Colors: https://github.com/cmderdev/cmder/wiki/Customization#list-of-colors
|
||||||
|
|||||||
49
vendor/git-prompt.sh
vendored
49
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 display for Cmder is disabled via config
|
# Check if git status for Cmder is disabled
|
||||||
# Matches: cmder.status=false or cmder.shstatus=false (Bash-specific)
|
if [[ $gitConfig =~ (^|$'\n')cmder\.status=false($|$'\n') ]] || \
|
||||||
if [[ $gitConfig =~ (^|$'\n')cmder\.(sh)?status=false($|$'\n') ]]
|
[[ $gitConfig =~ (^|$'\n')cmder\.shstatus=false($|$'\n') ]]
|
||||||
then
|
then
|
||||||
return 1 # disabled
|
return 1 # disabled
|
||||||
fi
|
fi
|
||||||
@@ -47,41 +47,9 @@ 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)
|
||||||
@@ -102,7 +70,7 @@ else
|
|||||||
PS1="$PS1"'\[\033[36m\]' # change color to cyan
|
PS1="$PS1"'\[\033[36m\]' # change color to cyan
|
||||||
PS1="$PS1"'`__git_ps1`' # bash function
|
PS1="$PS1"'`__git_ps1`' # bash function
|
||||||
else
|
else
|
||||||
PS1="$PS1"'\[\033[37;1m\]' # change color to white
|
PS1="$PS1"'\[\033[37;1m\]' # change color to white
|
||||||
PS1="$PS1"'`getSimpleGitBranch`'
|
PS1="$PS1"'`getSimpleGitBranch`'
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -112,14 +80,9 @@ 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
|
||||||
|
|
||||||
# Evaluate all user-specific Bash completion scripts (if any)
|
# Evaluate all user-specific Bash completion scripts (if any)
|
||||||
if test -z "$WINELOADERNOEXEC"
|
if test -z "$WINELOADERNOEXEC"
|
||||||
|
|||||||
5
vendor/init.bat
vendored
5
vendor/init.bat
vendored
@@ -223,9 +223,6 @@ 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
|
||||||
@@ -358,7 +355,7 @@ setlocal enabledelayedexpansion
|
|||||||
if defined git_locale (
|
if defined git_locale (
|
||||||
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
|
REM %print_debug% init.bat "Env Var - git_locale=!git_locale!"
|
||||||
if not defined LANG (
|
if not defined LANG (
|
||||||
for /F "delims=" %%F in ('"!git_locale!" -uU 2') do (
|
for /F "delims=" %%F in ('!git_locale! -uU 2') do (
|
||||||
set "LANG=%%F"
|
set "LANG=%%F"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
2
vendor/lib/lib_base.cmd
vendored
2
vendor/lib/lib_base.cmd
vendored
@@ -4,7 +4,7 @@ set lib_base=call "%~dp0lib_base.cmd"
|
|||||||
|
|
||||||
if "%~1" == "/h" (
|
if "%~1" == "/h" (
|
||||||
%lib_base% help "%~0"
|
%lib_base% help "%~0"
|
||||||
) else if "%~1" neq "" (
|
) else if "%1" neq "" (
|
||||||
call :%*
|
call :%*
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
2
vendor/lib/lib_console.cmd
vendored
2
vendor/lib/lib_console.cmd
vendored
@@ -14,7 +14,7 @@ if %fast_init% gtr %verbose_output% if %fast_init% gtr %debug_output% exit /b
|
|||||||
|
|
||||||
if "%~1" == "/h" (
|
if "%~1" == "/h" (
|
||||||
%lib_base% help "%~0"
|
%lib_base% help "%~0"
|
||||||
) else if "%~1" neq "" (
|
) else if "%1" neq "" (
|
||||||
call :%*
|
call :%*
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
4
vendor/lib/lib_git.cmd
vendored
4
vendor/lib/lib_git.cmd
vendored
@@ -1,12 +1,12 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
call "%~dp0lib_base.cmd"
|
call "%~dp0lib_base.cmd"
|
||||||
call "%~dp0lib_console.cmd"
|
call "%%~dp0lib_console.cmd"
|
||||||
set lib_git=call "%~dp0lib_git.cmd"
|
set lib_git=call "%~dp0lib_git.cmd"
|
||||||
|
|
||||||
if "%~1" == "/h" (
|
if "%~1" == "/h" (
|
||||||
%lib_base% help "%~0"
|
%lib_base% help "%~0"
|
||||||
) else if "%~1" neq "" (
|
) else if "%1" neq "" (
|
||||||
call :%*
|
call :%*
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
38
vendor/lib/lib_path.cmd
vendored
38
vendor/lib/lib_path.cmd
vendored
@@ -1,12 +1,12 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
call "%~dp0lib_base.cmd"
|
call "%~dp0lib_base.cmd"
|
||||||
call "%~dp0lib_console.cmd"
|
call "%%~dp0lib_console"
|
||||||
set lib_path=call "%~dp0lib_path.cmd"
|
set lib_path=call "%~dp0lib_path.cmd"
|
||||||
|
|
||||||
if "%~1" == "/h" (
|
if "%~1" == "/h" (
|
||||||
%lib_base% help "%~0"
|
%lib_base% help "%~0"
|
||||||
) else if "%~1" neq "" (
|
) else if "%1" neq "" (
|
||||||
call :%*
|
call :%*
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ exit /b
|
|||||||
set "add_path=%~1"
|
set "add_path=%~1"
|
||||||
) else (
|
) else (
|
||||||
%print_error% "You must specify a directory to add to the path!"
|
%print_error% "You must specify a directory to add to the path!"
|
||||||
exit /b 1
|
exit 1
|
||||||
)
|
)
|
||||||
|
|
||||||
if "%~2" neq "" if /i "%~2" == "append" (
|
if "%~2" neq "" if /i "%~2" == "append" (
|
||||||
@@ -72,7 +72,7 @@ exit /b
|
|||||||
set "PATH=%add_to_path%;%PATH%"
|
set "PATH=%add_to_path%;%PATH%"
|
||||||
)
|
)
|
||||||
goto :end_enhance_path
|
goto :end_enhance_path
|
||||||
) else if "%add_to_path%" equ "" (
|
) else if "add_to_path" equ "" (
|
||||||
goto :end_enhance_path
|
goto :end_enhance_path
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -84,20 +84,20 @@ exit /b
|
|||||||
|
|
||||||
setlocal enabledelayedexpansion
|
setlocal enabledelayedexpansion
|
||||||
if "!found!" == "0" (
|
if "!found!" == "0" (
|
||||||
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
|
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!;"
|
||||||
call :set_found
|
call :set_found
|
||||||
)
|
)
|
||||||
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
|
%print_debug% :enhance_path "Env Var INSIDE PATH !find_query! - found=!found!"
|
||||||
|
|
||||||
if /i "!position!" == "append" (
|
if /i "!position!" == "append" (
|
||||||
if "!found!" == "0" (
|
if "!found!" == "0" (
|
||||||
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
|
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:";!find_query!\"$"
|
||||||
call :set_found
|
call :set_found
|
||||||
)
|
)
|
||||||
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
|
%print_debug% :enhance_path "Env Var END PATH !find_query! - found=!found!"
|
||||||
) else (
|
) else (
|
||||||
if "!found!" == "0" (
|
if "!found!" == "0" (
|
||||||
echo "!PATH!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
|
echo "!path!"|!WINDIR!\System32\findstr >nul /I /R /C:"^\"!find_query!;"
|
||||||
call :set_found
|
call :set_found
|
||||||
)
|
)
|
||||||
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
|
%print_debug% :enhance_path "Env Var BEGIN PATH !find_query! - found=!found!"
|
||||||
@@ -119,8 +119,7 @@ exit /b
|
|||||||
:end_enhance_path
|
:end_enhance_path
|
||||||
set "PATH=%PATH:;;=;%"
|
set "PATH=%PATH:;;=;%"
|
||||||
|
|
||||||
REM echo %path%|wc -c
|
REM echo %path%|"C:\Users\dgames\cmder - dev\vendor\git-for-windows\usr\bin\wc" -c
|
||||||
|
|
||||||
if "%fast_init%" == "1" exit /b
|
if "%fast_init%" == "1" exit /b
|
||||||
|
|
||||||
if not "%OLD_PATH:~0,3000%" == "%OLD_PATH:~0,3001%" goto :toolong
|
if not "%OLD_PATH:~0,3000%" == "%OLD_PATH:~0,3001%" goto :toolong
|
||||||
@@ -128,22 +127,15 @@ exit /b
|
|||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
:toolong
|
:toolong
|
||||||
set "_rand=%RANDOM%"
|
echo "%OLD_PATH%">"%temp%\cmder_lib_pathA"
|
||||||
if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" 2>nul 1>nul
|
echo "%PATH%">"%temp%\cmder_lib_pathB"
|
||||||
if exist "%temp%\%_rand%_cmder_lib_pathB" del "%temp%\%_rand%_cmder_lib_pathB" 2>nul 1>nul
|
fc /b "%temp%\cmder_lib_pathA" "%temp%\cmder_lib_pathB" 2>nul 1>nul
|
||||||
if exist "%temp%\%_rand%_cmder_lib_pathA" goto :toolong
|
if errorlevel 1 ( del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB" & goto :changed )
|
||||||
if exist "%temp%\%_rand%_cmder_lib_pathB" goto :toolong
|
del "%temp%\cmder_lib_pathA" & del "%temp%\cmder_lib_pathB"
|
||||||
echo "%OLD_PATH%">"%temp%\%_rand%_cmder_lib_pathA"
|
|
||||||
if errorlevel 1 ( if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" & goto :toolong )
|
|
||||||
echo "%PATH%">"%temp%\%_rand%_cmder_lib_pathB"
|
|
||||||
if errorlevel 1 ( if exist "%temp%\%_rand%_cmder_lib_pathA" del "%temp%\%_rand%_cmder_lib_pathA" & if exist "%temp%\%_rand%_cmder_lib_pathB" del "%temp%\%_rand%_cmder_lib_pathB" & goto :toolong )
|
|
||||||
fc /b "%temp%\%_rand%_cmder_lib_pathA" "%temp%\%_rand%_cmder_lib_pathB" 2>nul 1>nul
|
|
||||||
if errorlevel 1 ( del "%temp%\%_rand%_cmder_lib_pathA" & del "%temp%\%_rand%_cmder_lib_pathB" & set "_rand=" & goto :changed )
|
|
||||||
del "%temp%\%_rand%_cmder_lib_pathA" & del "%temp%\%_rand%_cmder_lib_pathB" & set "_rand="
|
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
:changed
|
:changed
|
||||||
%print_debug% :enhance_path "END Env Var - PATH=%PATH%"
|
%print_debug% :enhance_path "END Env Var - PATH=%path%"
|
||||||
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
|
%print_debug% :enhance_path "Env Var %find_query% - found=%found%"
|
||||||
exit /b
|
exit /b
|
||||||
|
|
||||||
@@ -187,7 +179,7 @@ exit /b
|
|||||||
set "add_path=%~1"
|
set "add_path=%~1"
|
||||||
) else (
|
) else (
|
||||||
%print_error% "You must specify a directory to add to the path!"
|
%print_error% "You must specify a directory to add to the path!"
|
||||||
exit /b 1
|
exit 1
|
||||||
)
|
)
|
||||||
|
|
||||||
set "depth=%~2"
|
set "depth=%~2"
|
||||||
|
|||||||
4
vendor/lib/lib_profile.cmd
vendored
4
vendor/lib/lib_profile.cmd
vendored
@@ -1,12 +1,12 @@
|
|||||||
@echo off
|
@echo off
|
||||||
|
|
||||||
call "%~dp0lib_base.cmd"
|
call "%~dp0lib_base.cmd"
|
||||||
call "%~dp0lib_console.cmd"
|
call "%%~dp0lib_console"
|
||||||
set lib_profile=call "%~dp0lib_profile.cmd"
|
set lib_profile=call "%~dp0lib_profile.cmd"
|
||||||
|
|
||||||
if "%~1" == "/h" (
|
if "%~1" == "/h" (
|
||||||
%lib_base% help "%~0"
|
%lib_base% help "%~0"
|
||||||
) else if "%~1" neq "" (
|
) else if "%1" neq "" (
|
||||||
call :%*
|
call :%*
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
109
vendor/profile.ps1
vendored
109
vendor/profile.ps1
vendored
@@ -7,11 +7,15 @@
|
|||||||
|
|
||||||
$CMDER_INIT_START = Get-Date
|
$CMDER_INIT_START = Get-Date
|
||||||
|
|
||||||
# Determine the script root if not already set
|
# Compatibility with PS major versions <= 2
|
||||||
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) {
|
||||||
@@ -24,61 +28,40 @@ if (!$ENV:CMDER_ROOT) {
|
|||||||
# Remove trailing '\'
|
# Remove trailing '\'
|
||||||
$ENV:CMDER_ROOT = ($ENV:CMDER_ROOT).TrimEnd("\")
|
$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/"
|
||||||
|
|
||||||
# Import Cmder functions
|
|
||||||
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
|
$CmderFunctions = Join-Path $CmderModulePath "Cmder.ps1"
|
||||||
. $CmderFunctions
|
. $CmderFunctions
|
||||||
|
|
||||||
# Configure PSModulePath to include Cmder modules if not already present
|
if(-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
|
||||||
if (-not $moduleInstallerAvailable -and -not $env:PSModulePath.Contains($CmderModulePath) ) {
|
|
||||||
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
|
$env:PSModulePath = $env:PSModulePath.Insert(0, "$CmderModulePath;")
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($env:CMDER_USER_CONFIG) {
|
$gitVersionVendor = (readVersion -gitPath "$ENV:CMDER_ROOT\vendor\git-for-windows\cmd")
|
||||||
Write-Verbose "CMDER IS ALSO USING INDIVIDUAL USER CONFIG FROM '$ENV:CMDER_USER_CONFIG'!"
|
Write-Debug "GIT VENDOR: ${gitVersionVendor}"
|
||||||
}
|
|
||||||
|
|
||||||
# Read vendored Git Version
|
# Get user installed Git Version[s] and Compare with vendored if found.
|
||||||
$gitVendorPath = Join-Path $ENV:CMDER_ROOT 'vendor\git-for-windows\cmd'
|
|
||||||
$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.
|
|
||||||
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
|
foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
|
||||||
Write-Debug "GIT USER PATH: $($git.Path)"
|
Write-Debug "GIT PATH: {$git.Path}"
|
||||||
$gitDir = Split-Path -Path $git.Path
|
$gitDir = Split-Path -Path $git.Path
|
||||||
$gitDir = Get-GitShimPath -GitPath $gitDir
|
$gitDir = isGitShim -gitPath $gitDir
|
||||||
$gitVersionUser = Get-GitVersion -GitPath $gitDir
|
$gitVersionUser = (readVersion -gitPath $gitDir)
|
||||||
Write-Debug "GIT USER VERSION: ${gitVersionUser}"
|
Write-Debug "GIT USER: ${gitVersionUser}"
|
||||||
|
|
||||||
$useGitVersion = Compare-GitVersion -UserVersion $gitVersionUser -VendorVersion $gitVersionVendor
|
$useGitVersion = compare_git_versions -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) {
|
||||||
@@ -89,7 +72,7 @@ foreach ($git in (Get-Command -ErrorAction SilentlyContinue 'git')) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Use vendored Git if no user Git found or user Git is older than vendored Git
|
# User vendored Git.
|
||||||
if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
|
if ($null -eq $ENV:GIT_INSTALL_ROOT -and $null -ne $gitVersionVendor) {
|
||||||
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
|
$ENV:GIT_INSTALL_ROOT = "$ENV:CMDER_ROOT\vendor\git-for-windows"
|
||||||
$ENV:GIT_INSTALL_TYPE = 'VENDOR'
|
$ENV:GIT_INSTALL_TYPE = 'VENDOR'
|
||||||
@@ -99,43 +82,23 @@ Write-Debug "GIT_INSTALL_ROOT: ${ENV:GIT_INSTALL_ROOT}"
|
|||||||
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
|
Write-Debug "GIT_INSTALL_TYPE: ${ENV:GIT_INSTALL_TYPE}"
|
||||||
|
|
||||||
if ($null -ne $ENV:GIT_INSTALL_ROOT) {
|
if ($null -ne $ENV:GIT_INSTALL_ROOT) {
|
||||||
$env:Path = Set-GitPath -GitRoot "$ENV:GIT_INSTALL_ROOT" -GitType $ENV:GIT_INSTALL_TYPE -GitPathUser $gitPathUser
|
$env:Path = Configure-Git -gitRoot "$ENV:GIT_INSTALL_ROOT" -gitType $ENV:GIT_INSTALL_TYPE -gitPathUser $gitPathUser
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create 'vi' alias for 'vim' if vim is available
|
|
||||||
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
|
if (Get-Command -Name "vim" -ErrorAction SilentlyContinue) {
|
||||||
New-Alias -name "vi" -value vim
|
New-Alias -name "vi" -value vim
|
||||||
}
|
}
|
||||||
|
|
||||||
# PSReadline configuration
|
|
||||||
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
|
if (Get-Module PSReadline -ErrorAction "SilentlyContinue") {
|
||||||
# Display an extra prompt line between the prompt and the command input
|
|
||||||
Set-PSReadlineOption -ExtraPromptLineCount 1
|
Set-PSReadlineOption -ExtraPromptLineCount 1
|
||||||
|
|
||||||
# Invoked when Enter is pressed to submit a command
|
|
||||||
if ($env:WT_SESSION) {
|
|
||||||
Set-PSReadLineKeyHandler -Key Enter -ScriptBlock {
|
|
||||||
# Get the current command line
|
|
||||||
$line = $null
|
|
||||||
$cursor = $null
|
|
||||||
[Microsoft.PowerShell.PSConsoleReadLine]::GetBufferState([ref]$line, [ref]$cursor)
|
|
||||||
|
|
||||||
# Accept the line first
|
|
||||||
[Microsoft.PowerShell.PSConsoleReadLine]::AcceptLine()
|
|
||||||
|
|
||||||
# Emit OSC 133;C to mark start of command output
|
|
||||||
# This is written directly to the console after the command is accepted
|
|
||||||
[Console]::Write("$([char]0x1B)]133;C$([char]7)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Pre-assign default prompt hooks so the first run of Cmder gets a working prompt
|
# Pre-assign default prompt hooks so the first run of cmder gets a working prompt.
|
||||||
$env:gitLoaded = $null
|
$env:gitLoaded = $null
|
||||||
[ScriptBlock]$PrePrompt = {}
|
[ScriptBlock]$PrePrompt = {}
|
||||||
[ScriptBlock]$PostPrompt = {}
|
[ScriptBlock]$PostPrompt = {}
|
||||||
[ScriptBlock]$CmderPrompt = {
|
[ScriptBlock]$CmderPrompt = {
|
||||||
# Check if we're currently running under Admin privileges
|
# Check if we're currently running under Admin privileges.
|
||||||
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
|
||||||
$principal = [Security.Principal.WindowsPrincipal] $identity
|
$principal = [Security.Principal.WindowsPrincipal] $identity
|
||||||
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
|
$adminRole = [Security.Principal.WindowsBuiltInRole]::Administrator
|
||||||
@@ -144,7 +107,7 @@ $env:gitLoaded = $null
|
|||||||
$Host.UI.RawUI.ForegroundColor = "White"
|
$Host.UI.RawUI.ForegroundColor = "White"
|
||||||
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
|
Microsoft.PowerShell.Utility\Write-Host "PS " -NoNewline -ForegroundColor $color
|
||||||
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
|
Microsoft.PowerShell.Utility\Write-Host $pwd.ProviderPath -NoNewLine -ForegroundColor Green
|
||||||
Show-GitStatus -Path $pwd.ProviderPath
|
checkGit($pwd.ProviderPath)
|
||||||
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
|
Microsoft.PowerShell.Utility\Write-Host "`nλ" -NoNewLine -ForegroundColor "DarkGray"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -233,28 +196,6 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
|
|||||||
[ScriptBlock]$Prompt = {
|
[ScriptBlock]$Prompt = {
|
||||||
$lastSUCCESS = $?
|
$lastSUCCESS = $?
|
||||||
$realLastExitCode = $LastExitCode
|
$realLastExitCode = $LastExitCode
|
||||||
|
|
||||||
# Terminal-specific escape sequences for Windows Terminal and ConEmu
|
|
||||||
if ($env:WT_SESSION -or $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
|
|
||||||
if ($loc.Provider.Name -eq "FileSystem") {
|
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]9;9;`"$($loc.ProviderPath)`"$([char]0x1B)\"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Emit OSC 133;A to mark the start of the prompt
|
|
||||||
# Enables features like command navigation, selection, and visual separators
|
|
||||||
if ($env:WT_SESSION) {
|
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;A$([char]7)"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$host.UI.RawUI.WindowTitle = Microsoft.PowerShell.Management\Split-Path $pwd.ProviderPath -Leaf
|
$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"
|
||||||
if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
|
if ($lastSUCCESS -or ($LastExitCode -ne 0)) {
|
||||||
@@ -263,12 +204,6 @@ if ( $(Get-Command prompt).Definition -match 'PS \$\(\$executionContext.SessionS
|
|||||||
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
PrePrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
||||||
CmderPrompt
|
CmderPrompt
|
||||||
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
PostPrompt | Microsoft.PowerShell.Utility\Write-Host -NoNewline
|
||||||
|
|
||||||
# Emit OSC 133;B to mark the start of command input (after prompt, before user types)
|
|
||||||
if ($env:WT_SESSION) {
|
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "$([char]0x1B)]133;B$([char]7)"
|
|
||||||
}
|
|
||||||
|
|
||||||
$global:LastExitCode = $realLastExitCode
|
$global:LastExitCode = $realLastExitCode
|
||||||
return " "
|
return " "
|
||||||
}
|
}
|
||||||
|
|||||||
294
vendor/psmodules/Cmder.ps1
vendored
294
vendor/psmodules/Cmder.ps1
vendored
@@ -1,250 +1,178 @@
|
|||||||
function Get-GitVersion {
|
function readVersion($gitPath) {
|
||||||
param(
|
$gitExecutable = "${gitPath}\git.exe"
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$GitPath
|
|
||||||
)
|
|
||||||
|
|
||||||
$gitExecutable = Join-Path $GitPath "git.exe"
|
if (-not (Test-Path "$gitExecutable")) {
|
||||||
|
|
||||||
if (-not (Test-Path $gitExecutable)) {
|
|
||||||
return $null
|
return $null
|
||||||
}
|
}
|
||||||
|
|
||||||
# Execute 'git --version' and capture output
|
$gitVersion = (cmd /c "${gitExecutable}" --version)
|
||||||
$gitVersion = & $gitExecutable --version 2>$null
|
|
||||||
|
|
||||||
if ($gitVersion -match 'git version\s+(\S+)') {
|
if ($gitVersion -match 'git version') {
|
||||||
return $Matches[1]
|
($trash1, $trash2, $gitVersion) = $gitVersion.split(' ', 3)
|
||||||
|
} else {
|
||||||
|
pause
|
||||||
|
return $null
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Debug "Git executable path: $gitExecutable"
|
return $gitVersion.toString()
|
||||||
Write-Error "'git --version' returned an improper version string!"
|
|
||||||
Write-Error "Unable to determine Git version from output: $gitVersion"
|
|
||||||
|
|
||||||
return $null
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-GitShimPath {
|
function isGitShim($gitPath) {
|
||||||
param(
|
# check if there is a shim file - if yes, read the actual executable path
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$GitPath
|
|
||||||
)
|
|
||||||
# Check if there is a shim file - if yes, read the actual executable path
|
|
||||||
# See: github.com/ScoopInstaller/Shim
|
# See: github.com/ScoopInstaller/Shim
|
||||||
|
|
||||||
$shimFile = Join-Path $GitPath "git.shim"
|
if (Test-Path "${gitPath}\git.shim") {
|
||||||
if (Test-Path $shimFile) {
|
$shim = (get-content "${gitPath}\git.shim")
|
||||||
$shimContent = Get-Content $shimFile -Raw
|
($trash, $gitPath) = $shim.replace(' ', '').split('=')
|
||||||
if ($shimContent -match '^\s*path\s*=\s*(.+)\s*$') {
|
|
||||||
$GitPath = $Matches[1].Trim().Replace('\git.exe', '')
|
$gitPath = $gitPath.replace('\git.exe', '')
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $GitPath
|
return $gitPath.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
function Compare-Version {
|
function compareVersions($userVersion, $vendorVersion) {
|
||||||
param(
|
if ($null -ne $userVersion) {
|
||||||
[Parameter(Mandatory = $false)]
|
($userMajor, $userMinor, $userPatch, $userBuild) = $userVersion.split('.', 4)
|
||||||
[AllowNull()]
|
} else {
|
||||||
[string]$UserVersion,
|
return -1
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[AllowNull()]
|
|
||||||
[string]$VendorVersion
|
|
||||||
)
|
|
||||||
|
|
||||||
if ([string]::IsNullOrEmpty($UserVersion)) { return -1 }
|
|
||||||
if ([string]::IsNullOrEmpty($VendorVersion)) { return 1 }
|
|
||||||
|
|
||||||
# Split version strings by dots to compare segment by segment
|
|
||||||
# For "2.49.0.windows.1", we get: ["2", "49", "0", "windows", "1"]
|
|
||||||
$userParts = $UserVersion -split '\.'
|
|
||||||
$vendorParts = $VendorVersion -split '\.'
|
|
||||||
|
|
||||||
$maxLength = [Math]::Max($userParts.Count, $vendorParts.Count)
|
|
||||||
|
|
||||||
for ($i = 0; $i -lt $maxLength; $i++) {
|
|
||||||
$userPart = if ($i -lt $userParts.Count) { $userParts[$i] } else { '' }
|
|
||||||
$vendorPart = if ($i -lt $vendorParts.Count) { $vendorParts[$i] } else { '' }
|
|
||||||
|
|
||||||
# Check if both parts are purely numeric
|
|
||||||
$userIsNumeric = $userPart -match '^\d+$'
|
|
||||||
$vendorIsNumeric = $vendorPart -match '^\d+$'
|
|
||||||
|
|
||||||
if ($userIsNumeric -and $vendorIsNumeric) {
|
|
||||||
# Both numeric: compare as integers (so 49 > 5, not lexicographic)
|
|
||||||
$userNum = [int]$userPart
|
|
||||||
$vendorNum = [int]$vendorPart
|
|
||||||
|
|
||||||
if ($userNum -gt $vendorNum) { return 1 }
|
|
||||||
if ($userNum -lt $vendorNum) { return -1 }
|
|
||||||
}
|
|
||||||
elseif ($userIsNumeric -and -not $vendorIsNumeric) {
|
|
||||||
# Numeric segment comes before text segment (e.g., "2.0" < "2.0.rc1")
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
elseif (-not $userIsNumeric -and $vendorIsNumeric) {
|
|
||||||
# Text segment comes after numeric segment
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
# Both are text: use case-insensitive lexicographic comparison
|
|
||||||
$cmp = [string]::Compare($userPart, $vendorPart, $true)
|
|
||||||
if ($cmp -ne 0) { return [Math]::Sign($cmp) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($null -ne $vendorVersion) {
|
||||||
|
($vendorMajor, $vendorMinor, $vendorPatch, $vendorBuild) = $vendorVersion.split('.', 4)
|
||||||
|
} else {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if (($userMajor -eq $vendorMajor) -and ($userMinor -eq $vendorMinor) -and ($userPatch -eq $vendorPatch) -and ($userBuild -eq $vendorBuild)) {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($userMajor -gt $vendorMajor) { return 1 }
|
||||||
|
if ($userMajor -lt $vendorMajor) { return -1 }
|
||||||
|
|
||||||
|
if ($userMinor -gt $vendorMinor) { return 1 }
|
||||||
|
if ($userMinor -lt $vendorMinor) { return -1 }
|
||||||
|
|
||||||
|
if ($userPatch -gt $vendorPatch) { return 1 }
|
||||||
|
if ($userPatch -lt $vendorPatch) { return -1 }
|
||||||
|
|
||||||
|
if ($userBuild -gt $vendorBuild) { return 1 }
|
||||||
|
if ($userBuild -lt $vendorBuild) { return -1 }
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
function Compare-GitVersion {
|
function compare_git_versions($userVersion, $vendorVersion) {
|
||||||
param(
|
$result = compareVersions -userVersion $userVersion -vendorVersion $vendorVersion
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[AllowNull()]
|
|
||||||
[string]$UserVersion,
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[AllowNull()]
|
|
||||||
[string]$VendorVersion
|
|
||||||
)
|
|
||||||
|
|
||||||
$result = Compare-Version -UserVersion $UserVersion -VendorVersion $VendorVersion
|
Write-Debug "Compare Versions Result: ${result}"
|
||||||
|
|
||||||
Write-Debug "Compare Versions Result: $result"
|
|
||||||
if ($result -ge 0) {
|
if ($result -ge 0) {
|
||||||
return $UserVersion
|
return $userVersion
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return $vendorVersion
|
||||||
}
|
}
|
||||||
return $VendorVersion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Set-GitPath {
|
function Configure-Git($gitRoot, $gitType, $gitPathUser) {
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$GitRoot,
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$GitType,
|
|
||||||
[Parameter(Mandatory = $false)]
|
|
||||||
[string]$GitPathUser
|
|
||||||
)
|
|
||||||
|
|
||||||
# Proposed Behavior
|
# Proposed Behavior
|
||||||
|
|
||||||
# Modify the path if we are using VENDORED Git, do nothing if using USER Git.
|
# Modify the path if we are using VENDORED Git, do nothing if using USER Git.
|
||||||
# If User Git is installed but is older, match its path config adding paths
|
# If User Git is installed but is older, match its path config adding paths
|
||||||
# in the same path positions allowing a user to configure Cmder Git path
|
# in the same path positions allowing a user to configure Cmder Git path
|
||||||
# using locally installed Git Path Config.
|
# using locally installed Git Path Config.
|
||||||
|
if ($gitType -eq 'VENDOR') {
|
||||||
|
# If User Git is installed replace its path config with Newer Vendored Git Path
|
||||||
|
if (($null -ne $gitPathUser) -and ($gitPathUser -ne '')) {
|
||||||
|
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$gitPathUser' with newer vendored Git path '$gitRoot' in the system path..."
|
||||||
|
|
||||||
if ($GitType -ne 'VENDOR') {
|
$newPath = ($env:path -ireplace [regex]::Escape($gitPathUser), $gitRoot)
|
||||||
return $env:Path
|
|
||||||
}
|
|
||||||
|
|
||||||
$newPath = $env:Path
|
|
||||||
|
|
||||||
# Replace user Git path with vendored Git if user path exists
|
|
||||||
if ($GitPathUser) {
|
|
||||||
Write-Verbose "Cmder 'profile.ps1': Replacing older user Git path '$GitPathUser' with newer vendored Git path '$GitRoot' in the system path..."
|
|
||||||
$newPath = $newPath -ireplace [regex]::Escape($GitPathUser), $GitRoot
|
|
||||||
} else {
|
|
||||||
# Add Git cmd directory to the path
|
|
||||||
$gitCmd = Join-Path $GitRoot "cmd"
|
|
||||||
if (-not ($newPath -match [regex]::Escape($gitCmd))) {
|
|
||||||
Write-Debug "Adding $gitCmd to the path"
|
|
||||||
$newPath = "$gitCmd;$newPath"
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
if (-not ($env:Path -match [regex]::Escape("$gitRoot\cmd"))) {
|
||||||
|
Write-Debug "Adding $gitRoot\cmd to the path"
|
||||||
|
$newPath = $($gitRoot + "\cmd" + ";" + $env:Path)
|
||||||
|
}
|
||||||
|
|
||||||
# Add mingw[32|64]\bin directories to the path, if they exist and not already present
|
# Add "$gitRoot\mingw[32|64]\bin" to the path if exists and not done already
|
||||||
# Prefer mingw64 on 64-bit systems, mingw32 on 32-bit systems
|
if ((Test-Path "$gitRoot\mingw32\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw32\bin"))) {
|
||||||
$is64Bit = [Environment]::Is64BitOperatingSystem
|
Write-Debug "Adding $gitRoot\mingw32\bin to the path"
|
||||||
$mingwDirs = if ($is64Bit) { @('mingw64', 'mingw32') } else { @('mingw32') }
|
$newPath = "$newPath;$gitRoot\mingw32\bin"
|
||||||
|
}
|
||||||
|
elseif ((Test-Path "$gitRoot\mingw64\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\mingw64\bin"))) {
|
||||||
|
Write-Debug "Adding $gitRoot\mingw64\bin to the path"
|
||||||
|
$newPath = "$newPath;$gitRoot\mingw64\bin"
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($mingw in $mingwDirs) {
|
# Add "$gitRoot\usr\bin" to the path if exists and not done already
|
||||||
$mingwBin = Join-Path $GitRoot "$mingw\bin"
|
if ((Test-Path "$gitRoot\usr\bin") -and -not ($env:path -match [regex]::Escape("$gitRoot\usr\bin"))) {
|
||||||
if ((Test-Path $mingwBin) -and -not ($newPath -match [regex]::Escape($mingwBin))) {
|
Write-Debug "Adding $gitRoot\usr\bin to the path"
|
||||||
Write-Debug "Adding $mingwBin to the path"
|
$newPath = "$newPath;$gitRoot\usr\bin"
|
||||||
$newPath = "$newPath;$mingwBin"
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Add usr\bin directory to the path
|
return $newPath
|
||||||
$usrBin = Join-Path $GitRoot "usr\bin"
|
|
||||||
if ((Test-Path $usrBin) -and -not ($newPath -match [regex]::Escape($usrBin))) {
|
|
||||||
Write-Debug "Adding $usrBin to the path"
|
|
||||||
$newPath = "$newPath;$usrBin"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return $newPath
|
return $env:path
|
||||||
}
|
}
|
||||||
|
|
||||||
function Import-Git {
|
function Import-Git() {
|
||||||
$gitModule = Get-Module -Name Posh-Git -ListAvailable
|
$GitModule = Get-Module -Name Posh-Git -ListAvailable
|
||||||
|
if ($GitModule | Select-Object version | Where-Object version -le ([version]"0.6.1.20160330")) {
|
||||||
if (-not $gitModule) {
|
Import-Module Posh-Git > $null
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r`n"
|
|
||||||
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder."
|
|
||||||
Microsoft.PowerShell.Utility\Write-Host -NoNewline "`r$([char]0x1B)[A"
|
|
||||||
return $false
|
|
||||||
}
|
}
|
||||||
|
if ($GitModule | Select-Object version | Where-Object version -ge ([version]"1.0.0")) {
|
||||||
# Import posh-git module (works for all versions)
|
Import-Module Posh-Git > $null
|
||||||
Import-Module Posh-Git -ErrorAction SilentlyContinue | Out-Null
|
|
||||||
|
|
||||||
# Apply version-specific settings for posh-git 1.0.0+
|
|
||||||
if (($gitModule.Version -ge [version]"1.0.0") -and (Get-Variable -Name GitPromptSettings -ErrorAction SilentlyContinue)) {
|
|
||||||
$GitPromptSettings.AnsiConsole = $false
|
$GitPromptSettings.AnsiConsole = $false
|
||||||
}
|
}
|
||||||
|
if (-not $GitModule) {
|
||||||
|
Write-Host -NoNewline "`r`n"
|
||||||
|
Write-Warning "Missing git support, install posh-git with 'Install-Module posh-git' and restart Cmder."
|
||||||
|
Write-Host -NoNewline "`r$([char]0x1B)[A"
|
||||||
|
return $false
|
||||||
|
}
|
||||||
|
# Make sure we only run once by always returning true
|
||||||
return $true
|
return $true
|
||||||
}
|
}
|
||||||
|
|
||||||
function Show-GitStatus {
|
function checkGit($Path) {
|
||||||
param(
|
|
||||||
[Parameter(Mandatory = $true)]
|
|
||||||
[string]$Path
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (-not (Test-Path -Path (Join-Path $Path '.git'))) {
|
||||||
$gitDir = Join-Path $Path '.git'
|
$SplitPath = Split-Path $path
|
||||||
if (-not (Test-Path $gitDir)) {
|
if ($SplitPath) { checkGit($SplitPath) }
|
||||||
$parentPath = Split-Path $Path
|
|
||||||
if ($parentPath) {
|
|
||||||
Show-GitStatus -Path $parentPath
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if (getGitStatusSetting -eq $true) {
|
||||||
if (Get-GitStatusSetting) {
|
|
||||||
if ($null -eq $env:gitLoaded) {
|
if ($null -eq $env:gitLoaded) {
|
||||||
$env:gitLoaded = Import-Git
|
$env:gitLoaded = Import-Git
|
||||||
}
|
}
|
||||||
if ($env:gitLoaded -eq $true) {
|
if ($env:gitLoaded -eq $true) {
|
||||||
Write-VcsStatus
|
Write-VcsStatus
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
$headFile = Join-Path $gitDir 'HEAD'
|
else {
|
||||||
if (Test-Path $headFile) {
|
$headContent = Get-Content (Join-Path $Path '.git/HEAD')
|
||||||
$headContent = Get-Content $headFile -Raw
|
if ($headContent -like "ref: refs/heads/*") {
|
||||||
if ($headContent -match 'ref: refs/heads/(.+)') {
|
$branchName = $headContent.Substring(16)
|
||||||
$branchName = $Matches[1].Trim()
|
|
||||||
} else {
|
|
||||||
$shortHash = $headContent.Substring(0, [Math]::Min(7, $headContent.Length))
|
|
||||||
$branchName = "HEAD detached at $shortHash"
|
|
||||||
}
|
|
||||||
Microsoft.PowerShell.Utility\Write-Host " [$branchName]" -NoNewline -ForegroundColor White
|
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
$branchName = "HEAD detached at $($headContent.Substring(0, 7))"
|
||||||
|
}
|
||||||
|
Write-Host " [$branchName]" -NoNewline -ForegroundColor White
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function Get-GitStatusSetting {
|
function getGitStatusSetting() {
|
||||||
$gitConfig = git --no-pager config -l 2>$null | Out-String
|
$gitStatus = (git --no-pager config -l) | Out-String
|
||||||
|
|
||||||
# Check if git status display is disabled via config
|
foreach ($line in $($gitStatus -split "`r`n")) {
|
||||||
# Matches: cmder.status=false or cmder.psstatus=false (PowerShell-specific)
|
if (($line -match 'cmder.status=false') -or ($line -match 'cmder.psstatus=false')) {
|
||||||
if ($gitConfig -match '(?m)^cmder\.(ps)?status=false$') {
|
return $false
|
||||||
return $false
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $true
|
return $true
|
||||||
|
|||||||
19
vendor/sources.json
vendored
19
vendor/sources.json
vendored
@@ -1,27 +1,22 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"name": "git-for-windows",
|
"name": "git-for-windows",
|
||||||
"version": "2.52.0.windows.1",
|
"version": "2.49.0.windows.1",
|
||||||
"url": "https://github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/PortableGit-2.52.0-64-bit.7z.exe"
|
"url": "https://github.com/git-for-windows/git/releases/download/v2.49.0.windows.1/PortableGit-2.49.0-64-bit.7z.exe"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "clink",
|
"name": "clink",
|
||||||
"version": "1.9.5",
|
"version": "1.7.14",
|
||||||
"url": "https://github.com/chrisant996/clink/releases/download/v1.9.5/clink.1.9.5.ee6b4f.zip"
|
"url": "https://github.com/chrisant996/clink/releases/download/v1.7.14/clink.1.7.14.843933.zip"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "conemu-maximus5",
|
"name": "conemu-maximus5",
|
||||||
"version": "23.07.24",
|
"version": "23.07.24",
|
||||||
"url": "https://github.com/ConEmu/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
|
"url": "https://github.com/Maximus5/ConEmu/releases/download/v23.07.24/ConEmuPack.230724.7z"
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "windows-terminal",
|
|
||||||
"version": "1.23.12811.0",
|
|
||||||
"url": "https://github.com/microsoft/terminal/releases/download/v1.23.12811.0/Microsoft.WindowsTerminal_1.23.12811.0_x64.zip"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "clink-completions",
|
"name": "clink-completions",
|
||||||
"version": "0.6.7",
|
"version": "0.6.2",
|
||||||
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.7.zip"
|
"url": "https://github.com/vladimir-kotikov/clink-completions/archive/v0.6.2.zip"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user