Merge branch 'master' into feature/tf_tt_auto_apply_fix

This commit is contained in:
Marc Cornellà 2025-12-17 18:53:00 +01:00 committed by GitHub
commit 2f76eeb0ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
53 changed files with 864 additions and 464 deletions

6
.github/FUNDING.yml vendored
View file

@ -1,2 +1,6 @@
github: [ohmyzsh, robbyrussell, mcornella, larson-carter, carlosala] github:
- ohmyzsh
- robbyrussell
- mcornella
- carlosala
open_collective: ohmyzsh open_collective: ohmyzsh

View file

@ -12,7 +12,7 @@ dependencies:
plugins/gradle: plugins/gradle:
repo: gradle/gradle-completion repo: gradle/gradle-completion
branch: master branch: master
version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6 version: a9d7c822e42cc6a5b028b59e46cffcc8e7bc1134
precopy: | precopy: |
set -e set -e
find . ! -name _gradle ! -name LICENSE -delete find . ! -name _gradle ! -name LICENSE -delete

View file

@ -4,27 +4,31 @@ on:
schedule: schedule:
- cron: "0 6 * * 0" - cron: "0 6 * * 0"
permissions:
contents: read
jobs: jobs:
check: check:
name: Check for updates name: Check for updates
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
permissions:
contents: write # this is needed to push commits and branches
steps: steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
id: generate-token id: generate-token
uses: actions/create-github-app-token@v2 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.OHMYZSH_APP_ID }} app-id: ${{ secrets.OHMYZSH_APP_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v6 uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
with: with:
python-version: "3.12" python-version: "3.12"
cache: "pip" cache: "pip"

View file

@ -1,7 +1,7 @@
certifi==2025.8.3 certifi==2025.11.12
charset-normalizer==3.4.3 charset-normalizer==3.4.4
idna==3.10 idna==3.11
PyYAML==6.0.2 PyYAML==6.0.3
requests==2.32.5 requests==2.32.5
semver==3.0.4 semver==3.0.4
urllib3==2.5.0 urllib3==2.6.2

View file

@ -219,32 +219,33 @@ class Dependency:
# Create new branch # Create new branch
branch = Git.checkout_or_create_branch(branch_name) branch = Git.checkout_or_create_branch(branch_name)
# Update dependencies.yml file
self.__update_yaml(
f"tag:{new_version}" if is_tag else status["version"]
)
# Update dependency files # Update dependency files
self.__apply_upstream_changes() self.__apply_upstream_changes()
# Add all changes and commit if not Git.repo_is_clean():
has_new_commit = Git.add_and_commit(self.name, new_version) # Update dependencies.yml file
self.__update_yaml(
if has_new_commit: f"tag:{new_version}" if is_tag else status["version"]
# Push changes to remote
Git.push(branch)
# Create GitHub PR
GitHub.create_pr(
branch,
f"feat({self.name}): update to version {new_version}",
f"""## Description
Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
Check out the [list of changes]({status['compare_url']}).
""",
) )
# Add all changes and commit
has_new_commit = Git.add_and_commit(self.name, new_version)
if has_new_commit:
# Push changes to remote
Git.push(branch)
# Create GitHub PR
GitHub.create_pr(
branch,
f"chore({self.name}): update to version {new_version}",
f"""## Description
Update for **{self.desc}**: update to version [{new_version}]({status["head_url"]}).
Check out the [list of changes]({status["compare_url"]}).
""",
)
# Clean up repository # Clean up repository
Git.clean_repo() Git.clean_repo()
except (CommandRunner.Exception, shutil.Error) as e: except (CommandRunner.Exception, shutil.Error) as e:
@ -275,8 +276,8 @@ Check out the [list of changes]({status['compare_url']}).
There is a new version of `{self.name}` {self.kind} available. There is a new version of `{self.name}` {self.kind} available.
New version: [{new_version}]({status['head_url']}) New version: [{new_version}]({status["head_url"]})
Check out the [list of changes]({status['compare_url']}). Check out the [list of changes]({status["compare_url"]}).
""" """
print("Creating GitHub issue", file=sys.stderr) print("Creating GitHub issue", file=sys.stderr)
@ -377,21 +378,28 @@ class Git:
) )
return branch_name return branch_name
@staticmethod
def repo_is_clean() -> bool:
"""
Returns `True` if the repo is clean.
Returns `False` if the repo is dirty.
"""
try:
CommandRunner.run_or_fail(
["git", "diff", "--exit-code"], stage="CheckRepoClean"
)
return True
except CommandRunner.Exception:
return False
@staticmethod @staticmethod
def add_and_commit(scope: str, version: str) -> bool: def add_and_commit(scope: str, version: str) -> bool:
""" """
Returns `True` if there were changes and were indeed commited. Returns `True` if there were changes and were indeed commited.
Returns `False` if the repo was clean and no changes were commited. Returns `False` if the repo was clean and no changes were commited.
""" """
# check if repo is clean (clean => no error, no commit) if Git.repo_is_clean():
try:
CommandRunner.run_or_fail(
["git", "diff", "--exit-code"], stage="CheckRepoClean"
)
return False return False
except CommandRunner.Exception:
# if it's other kind of error just throw!
pass
user_name = os.environ.get("GIT_APP_NAME") user_name = os.environ.get("GIT_APP_NAME")
user_email = os.environ.get("GIT_APP_EMAIL") user_email = os.environ.get("GIT_APP_EMAIL")
@ -415,7 +423,7 @@ class Git:
f"user.email={user_email}", f"user.email={user_email}",
"commit", "commit",
"-m", "-m",
f"feat({scope}): update to {version}", f"chore({scope}): update to {version}",
], ],
stage="CreateCommit", stage="CreateCommit",
env=clean_env, env=clean_env,

View file

@ -25,8 +25,13 @@ jobs:
- ubuntu-latest - ubuntu-latest
- macos-latest - macos-latest
steps: steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Set up git repository - name: Set up git repository
uses: actions/checkout@v5 uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Install zsh - name: Install zsh
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: sudo apt-get update; sudo apt-get install zsh run: sudo apt-get update; sudo apt-get install zsh
@ -41,8 +46,13 @@ jobs:
needs: needs:
- test - test
steps: steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Checkout - name: Checkout
uses: actions/checkout@v5 uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Install Vercel CLI - name: Install Vercel CLI
run: npm install -g vercel run: npm install -g vercel
- name: Setup project and deploy - name: Setup project and deploy

View file

@ -23,8 +23,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Set up git repository - name: Set up git repository
uses: actions/checkout@v5 uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
- name: Install zsh - name: Install zsh
run: sudo apt-get update; sudo apt-get install zsh run: sudo apt-get update; sudo apt-get install zsh
- name: Check syntax - name: Check syntax

View file

@ -16,16 +16,19 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
id: generate-token id: generate-token
uses: actions/create-github-app-token@v2 uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
with: with:
app-id: ${{ secrets.OHMYZSH_APP_ID }} app-id: ${{ secrets.OHMYZSH_APP_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Store app token
run: echo "GH_TOKEN=${{ steps.generate-token.outputs.token }}" >> "$GITHUB_ENV"
- name: Read project data - name: Read project data
env: env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
ORGANIZATION: ohmyzsh ORGANIZATION: ohmyzsh
PROJECT_NUMBER: "1" PROJECT_NUMBER: "1"
run: | run: |
@ -48,14 +51,14 @@ jobs:
}' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json }' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
# Parse project data # Parse project data
cat >> $GITHUB_ENV <<EOF cat >> "$GITHUB_ENV" <<EOF
PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json) PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json)
PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json) PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json) THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
EOF EOF
- name: Add to project - name: Add to project
env: env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }} ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }}
run: | run: |
item_id="$(gh api graphql -f query=' item_id="$(gh api graphql -f query='
@ -66,45 +69,51 @@ jobs:
} }
} }
} }
' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')" ' -f project="$PROJECT_ID" -f content="$ISSUE_OR_PR_ID" --jq '.data.addProjectV2ItemById.item.id')"
echo "ITEM_ID=$item_id" >> $GITHUB_ENV echo "ITEM_ID=$item_id" >> $GITHUB_ENV
- name: Classify Pull Request - name: Classify Pull Request
if: github.event_name == 'pull_request_target' if: github.event_name == 'pull_request_target'
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: | run: |
touch plugins.list themes.list # Get the list of modified files in the PR, and extract plugins and themes
gh pr view "$PR_NUMBER" \
gh pr view ${{ github.event.pull_request.number }} \ --repo "$GITHUB_REPOSITORY" \
--repo ${{ github.repository }} \
--json files --jq '.files.[].path' | awk -F/ ' --json files --jq '.files.[].path' | awk -F/ '
BEGIN {
plugins = 0
themes = 0
}
/^plugins\// { /^plugins\// {
plugins[$2] = 1 if (plugin == $2) next
plugin = $2
plugins++
} }
/^themes\// { /^themes\// {
gsub(/\.zsh-theme$/, "", $2) gsub(/\.zsh-theme$/, "", $2)
themes[$2] = 1 if (theme == $2) next
theme = $2
themes++
} }
END { END {
for (plugin in plugins) { # plugin and theme are values controlled by the PR author
print plugin >> "plugins.list" # so we should sanitize them before using anywhere else
if (plugins == 1) {
gsub(/[^a-zA-Z0-9._-]/, "", plugin)
print "PLUGIN=" plugin
} }
for (theme in themes) { if (themes == 1) {
print theme >> "themes.list" gsub(/[^a-zA-Z0-9._-]/, "", theme)
print "THEME=" theme
} }
} }
' ' >> "$GITHUB_ENV"
# If only one plugin is modified, add it to the plugin field
if [[ $(wc -l < plugins.list) = 1 ]]; then
echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
fi
# If only one theme is modified, add it to the theme field
if [[ $(wc -l < themes.list) = 1 ]]; then
echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
fi
- name: Fill Pull Request fields in project - name: Fill Pull Request fields in project
if: github.event_name == 'pull_request_target' if: github.event_name == 'pull_request_target'
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
run: | run: |
gh api graphql -f query=' gh api graphql -f query='
mutation ( mutation (
@ -140,7 +149,7 @@ jobs:
} }
} }
} }
' -f project=$PROJECT_ID -f item=$ITEM_ID \ ' -f project="$PROJECT_ID" -f item="$ITEM_ID" \
-f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \ -f plugin_field="$PLUGIN_FIELD_ID" -f plugin_value="$PLUGIN" \
-f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \ -f theme_field="$THEME_FIELD_ID" -f theme_value="$THEME" \
--silent --silent

65
.github/workflows/scorecard.yml vendored Normal file
View file

@ -0,0 +1,65 @@
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '20 7 * * 2'
push:
branches: ["master"]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
contents: read
actions: read
# To allow GraphQL ListCommits to work
issues: read
pull-requests: read
# To detect SAST tools
checks: read
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: "Checkout code"
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
publish_results: true
- name: "Upload artifact"
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@1b168cd39490f61582a9beae412bb7057a6b2c4e # v4.31.8
with:
sarif_file: results.sarif

5
.gitpod.Dockerfile vendored
View file

@ -1,5 +0,0 @@
FROM gitpod/workspace-full
RUN sudo apt-get update && \
sudo apt-get install -y zsh && \
sudo rm -rf /var/lib/apt/lists/*

View file

@ -1,9 +0,0 @@
image:
file: .gitpod.Dockerfile
tasks:
- init: |
export EDITOR="command gp open -w" VISUAL="command gp open -w"
cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc
ln -sf /workspace/ohmyzsh ~/.oh-my-zsh
command: exec zsh

View file

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors) Copyright (c) 2009-2025 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -18,10 +18,10 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://x.c
Twitter), and join us on [Discord](https://discord.gg/ohmyzsh). Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
[![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) [![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10713/badge)](https://www.bestpractices.dev/projects/10713)
[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh) [![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh)
[![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh) [![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh)
[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
<details> <details>
<summary>Table of Contents</summary> <summary>Table of Contents</summary>
@ -548,7 +548,7 @@ We're on social media:
## Merchandise ## Merchandise
We have We have
[stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github) [stickers, shirts, and coffee mugs available](https://commitgoods.com/collections/oh-my-zsh?utm_source=github)
for you to show off your love of Oh My Zsh. Again, you will become the talk of the town! for you to show off your love of Oh My Zsh. Again, you will become the talk of the town!
## License ## License

View file

@ -28,6 +28,7 @@ function _omz {
'plugin:Manage plugins' 'plugin:Manage plugins'
'pr:Manage Oh My Zsh Pull Requests' 'pr:Manage Oh My Zsh Pull Requests'
'reload:Reload the current zsh session' 'reload:Reload the current zsh session'
'shop:Open the Oh My Zsh shop'
'theme:Manage themes' 'theme:Manage themes'
'update:Update Oh My Zsh' 'update:Update Oh My Zsh'
'version:Show the version' 'version:Show the version'
@ -173,6 +174,7 @@ Available commands:
plugin <command> Manage plugins plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests pr <command> Manage Oh My Zsh Pull Requests
reload Reload the current zsh session reload Reload the current zsh session
shop Open the Oh My Zsh shop
theme <command> Manage themes theme <command> Manage themes
update Update Oh My Zsh update Update Oh My Zsh
version Show the version version Show the version
@ -621,10 +623,48 @@ function _omz::pr::test {
done done
(( $found )) || { (( $found )) || {
_omz::log error "could not found the ohmyzsh git remote. Aborting..." _omz::log error "could not find the ohmyzsh git remote. Aborting..."
return 1 return 1
} }
# Check if Pull Request has the "testers needed" label
_omz::log info "checking if PR #$1 has the 'testers needed' label..."
local pr_json label label_id="MDU6TGFiZWw4NzY1NTkwNA=="
pr_json=$(
curl -fsSL \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/ohmyzsh/ohmyzsh/pulls/$1"
)
if [[ $? -gt 0 || -z "$pr_json" ]]; then
_omz::log error "error when trying to fetch PR #$1 from GitHub."
return 1
fi
# Check if the label is present with jq or grep
if (( $+commands[jq] )); then
label="$(command jq ".labels.[] | select(.node_id == \"$label_id\")" <<< "$pr_json")"
else
label="$(command grep "\"$label_id\"" <<< "$pr_json" 2>/dev/null)"
fi
# If a maintainer hasn't labeled the PR to test, explain the security risk
if [[ -z "$label" ]]; then
_omz::log warn "PR #$1 does not have the 'testers needed' label. This means that the PR"
_omz::log warn "has not been reviewed by a maintainer and may contain malicious code."
# Ask for explicit confirmation: user needs to type "yes" to continue
_omz::log prompt "Do you want to continue testing it? [yes/N] "
builtin read -r
if [[ "${REPLY:l}" != yes ]]; then
_omz::log error "PR test canceled. Please ask a maintainer to review and label the PR."
return 1
else
_omz::log warn "Continuing to check out and test PR #$1. Be careful!"
fi
fi
# Fetch pull request head # Fetch pull request head
_omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..." _omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..."
command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || { command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || {
@ -683,6 +723,15 @@ function _omz::pr::test {
) )
} }
function _omz::shop {
local shop_url="https://commitgoods.com/collections/oh-my-zsh"
_omz::log info "Opening Oh My Zsh shop in your browser..."
_omz::log info "$shop_url"
open_command "$shop_url"
}
function _omz::reload { function _omz::reload {
# Delete current completion cache # Delete current completion cache
command rm -f $_comp_dumpfile $ZSH_COMPDUMP command rm -f $_comp_dumpfile $ZSH_COMPDUMP

View file

@ -117,7 +117,7 @@ function _omz_git_prompt_status() {
fi fi
# For each status prefix, do a regex comparison # For each status prefix, do a regex comparison
for status_prefix in ${(k)prefix_constant_map}; do for status_prefix in "${(@k)prefix_constant_map}"; do
local status_constant="${prefix_constant_map[$status_prefix]}" local status_constant="${prefix_constant_map[$status_prefix]}"
local status_regex=$'(^|\n)'"$status_prefix" local status_regex=$'(^|\n)'"$status_prefix"

View file

@ -112,7 +112,7 @@ bindkey -M vicmd '^[[1;5D' backward-word
bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark
bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls bindkey -s '\el' '^q ls\n' # [Esc-l] - run command: ls
bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line. bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line.
bindkey ' ' magic-space # [Space] - don't do history expansion bindkey ' ' magic-space # [Space] - don't do history expansion

View file

@ -60,8 +60,10 @@ function bgnotify_formatted {
} }
function bgnotify_appid { function bgnotify_appid {
if (( ${+commands[osascript]} )); then if (( ${+commands[lsappinfo]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null lsappinfo info -only bundleid "$(lsappinfo front)" | awk -F= '{print $2}' | tr -d '"' 2>/dev/null
elif (( ${+commands[osascript]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway
local app_id=$(bgnotify_find_sway_appid) local app_id=$(bgnotify_find_sway_appid)
[[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS [[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS
@ -108,6 +110,7 @@ function bgnotify_programid {
case "$TERM_PROGRAM" in case "$TERM_PROGRAM" in
iTerm.app) echo 'com.googlecode.iterm2' ;; iTerm.app) echo 'com.googlecode.iterm2' ;;
Apple_Terminal) echo 'com.apple.terminal' ;; Apple_Terminal) echo 'com.apple.terminal' ;;
ghostty) echo 'com.mitchellh.ghostty' ;;
esac esac
} }

View file

@ -4,6 +4,10 @@ for file (
# Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found # Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found
/usr/share/doc/pkgfile/command-not-found.zsh /usr/share/doc/pkgfile/command-not-found.zsh
# Homebrew: https://github.com/Homebrew/homebrew-command-not-found # Homebrew: https://github.com/Homebrew/homebrew-command-not-found
/opt/homebrew/Library/Homebrew/command-not-found/handler.sh
/usr/local/Homebrew/Library/Homebrew/command-not-found/handler.sh
/home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/command-not-found/handler.sh
# Old homebrew implementation
/opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh /opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh /usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh

View file

@ -114,13 +114,13 @@ that file will be open with `acroread`.
### Listing files inside a packed file ### Listing files inside a packed file
| Alias | Command | Description | | Alias | Command | Description |
| ------ | ---------- | --------------------------------- | | ------ | ------------ | --------------------------------- |
| zip | `unzip -l` | Lists files inside a .zip file | | zip | `unzip -l` | Lists files inside a .zip file |
| rar | `unrar l` | Lists files inside a .rar file | | rar | `unrar l` | Lists files inside a .rar file |
| tar | `tar tf` | Lists files inside a .tar file | | tar | `tar tf` | Lists files inside a .tar file |
| tar.gz | `echo` | Lists files inside a .tar.gz file | | tar.gz | `tar -ztf` | Lists files inside a .tar.gz file |
| ace | `unace l` | Lists files inside a .ace file | | ace | `unace l` | Lists files inside a .ace file |
### Some other features ### Some other features

View file

@ -2,6 +2,8 @@
This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
aliases for frequent docker-compose commands. aliases for frequent docker-compose commands.
This plugin chooses automatically between the legacy `docker-compose` command and the modern
`docker compose` subcommand, preferring `docker-compose` when both are available.
To use it, add docker-compose to the plugins array of your zshrc file: To use it, add docker-compose to the plugins array of your zshrc file:

View file

@ -1,6 +1,6 @@
# .NET Core CLI plugin # .NET CLI plugin
This plugin provides completion and useful aliases for [.NET Core CLI](https://dotnet.microsoft.com/). This plugin provides completion and useful aliases for [.NET CLI](https://dotnet.microsoft.com/).
To use it, add `dotnet` to the plugins array in your zshrc file. To use it, add `dotnet` to the plugins array in your zshrc file.

View file

@ -77,7 +77,15 @@ EOF
(*.lzma) unlzma "$full_path" ;; (*.lzma) unlzma "$full_path" ;;
(*.z) uncompress "$full_path" ;; (*.z) uncompress "$full_path" ;;
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx|*.pk3|*.pk4) unzip "$full_path" ;; (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx|*.pk3|*.pk4) unzip "$full_path" ;;
(*.rar) unrar x -ad "$full_path" ;; (*.rar)
if (( $+commands[unrar] )); then
unrar x -ad "$full_path"
elif (( $+commands[unar] )); then
unar -o . "$full_path"
else
echo "extract: cannot extract RAR files: install unrar or unar" >&2
success=1
fi ;;
(*.rpm) (*.rpm)
rpm2cpio "$full_path" | cpio --quiet -id ;; rpm2cpio "$full_path" | cpio --quiet -id ;;
(*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;; (*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;

View file

@ -1,9 +0,0 @@
# Fig plugin
This plugin sets up completion for [Fig](https://fig.io/).
To use it, add `fig` to the plugins array in your zshrc file:
```zsh
plugins=(... fig)
```

View file

@ -1,13 +0,0 @@
if ! (( $+commands[fig] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `fig`. Otherwise, compinit will have already done that
if [[ ! -f "$ZSH_CACHE_DIR/completions/_fig" ]]; then
autoload -Uz _fig
typeset -g -A _comps
_comps[fig]=_fig
fi
fig completion zsh >| "$ZSH_CACHE_DIR/completions/_fig" &|

View file

@ -26,4 +26,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flutter" ]]; then
_comps[flutter]=_flutter _comps[flutter]=_flutter
fi fi
flutter zsh-completion >| "$ZSH_CACHE_DIR/completions/_flutter" &| flutter zsh-completion < /dev/null >| "$ZSH_CACHE_DIR/completions/_flutter" &|

View file

@ -91,7 +91,7 @@ plugins=(... git)
| `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` | | `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` |
| `gdt` | `git diff-tree --no-commit-id --name-only -r` | | `gdt` | `git diff-tree --no-commit-id --name-only -r` |
| `gf` | `git fetch` | | `gf` | `git fetch` |
| `gfa` | `git fetch --all --tags --prune` | | `gfa` | `git fetch --all --tags --prune` |
| `gfo` | `git fetch origin` | | `gfo` | `git fetch origin` |
| `gg` | `git gui citool` | | `gg` | `git gui citool` |
| `gga` | `git gui citool --amend` | | `gga` | `git gui citool --amend` |
@ -213,7 +213,7 @@ plugins=(... git)
| `gtv` | `git tag \| sort -V` | | `gtv` | `git tag \| sort -V` |
| `gignore` | `git update-index --assume-unchanged` | | `gignore` | `git update-index --assume-unchanged` |
| `gunignore` | `git update-index --no-assume-unchanged` | | `gunignore` | `git update-index --no-assume-unchanged` |
| `gwch` | `git whatchanged -p --abbrev-commit --pretty=medium` | | `gwch` | `git log --patch --abbrev-commit --pretty=medium --raw` |
| `gwt` | `git worktree` | | `gwt` | `git worktree` |
| `gwtls` | `git worktree list` | | `gwtls` | `git worktree list` |
| `gwtmv` | `git worktree move` | | `gwtmv` | `git worktree move` |
@ -234,40 +234,29 @@ branch exists. We do this via the function `git_main_branch`.
These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not,
receive further support. receive further support.
| Alias | Command | Modification | | Alias | Command | Modification |
| :------- | :-------------------------------------------------------- | :-------------------------------------------------------- | | :------- | :-------------------------------------------------------- | :-----------------------------------------------------|
| `gap` | `git add --patch` | New alias: `gapa`. | | `gap` | `git add --patch` | New alias: `gapa` |
| `gcl` | `git config --list` | New alias: `gcf`. | | `gcl` | `git config --list` | New alias: `gcf` |
| `gdc` | `git diff --cached` | New alias: `gdca`. | | `gdt` | `git difftool` | No replacement |
| `gdt` | `git difftool` | No replacement. | | `ggpull` | `git pull origin $(git_current_branch)` | New function: `ggl` (`ggpull` is now aliased to this) |
| `ggpull` | `git pull origin $(current_branch)` | New alias: `ggl`. (`ggpull` still exists for now though.) | | `ggpur` | `git pull --rebase origin $(git_current_branch)` | New function: `ggu` (`ggpur` is now aliased to this) |
| `ggpur` | `git pull --rebase origin $(current_branch)` | New alias: `ggu`. (`ggpur` still exists for now though.) | | `ggpush` | `git push origin $(git_current_branch)` | New function: `ggp` (`ggpush` is now aliased to this) |
| `ggpush` | `git push origin $(current_branch)` | New alias: `ggp`. (`ggpush` still exists for now though.) |
| `gk` | `gitk --all --branches` | Now aliased to `gitk --all --branches`. |
| `glg` | `git log --stat --max-count=10` | Now aliased to `git log --stat --color`. |
| `glgg` | `git log --graph --max-count=10` | Now aliased to `git log --graph --color`. |
| `gwc` | `git whatchanged -p --abbrev-commit --pretty = medium` | New alias: `gwch`. |
| `gup` | `git pull --rebase` | now alias `gpr` |
| `gupv` | `git pull --rebase -v` | now alias `gprv` |
| `gupa` | `git pull --rebase --autostash` | now alias `gpra` |
| `gupav` | `git pull --rebase --autostash -v` | now alias `gprav` |
| `gupom` | `git pull --rebase origin $(git_main_branch)` | now alias `gprom` |
| `gupomi` | `git pull --rebase=interactive origin $(git_main_branch)` | now alias `gpromi` |
## Functions ## Functions
### Current ### Current
| Command | Description | | Command | Description |
| :----------------------- | :-------------------------------------------------------------------------------------------------------------- | | :----------------------- | :------------------------------------------------------------------------------------------------------------- |
| `current_branch` | Returns the name of the current branch. | | `git_current_branch` | Returns the name of the current branch (Lives in `lib/git.zsh`) |
| `git_current_user_email` | Returns the `user.email` config value. (Lives in `lib/git.zsh`.) | | `git_current_user_email` | Returns the `user.email` config value (Lives in `lib/git.zsh`) |
| `git_current_user_name` | Returns the `user.name` config value. (Lives in `lib/git.zsh`.) | | `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. | | `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. | | `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
| `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote. | | `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote |
| `gbda` | Deletes all merged branches | | `gbda` | Deletes all merged branches |
| `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) | | `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) |
### Work in Progress (WIP) ### Work in Progress (WIP)
@ -287,4 +276,3 @@ Note that `gwip` and `gunwip` are aliases, but are also documented here to group
| Command | Description | Reason | | Command | Description | Reason |
| :------------------- | :-------------------------------------- | :--------------------------------------------------------------- | | :------------------- | :-------------------------------------- | :--------------------------------------------------------------- |
| `current_repository` | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias). |

View file

@ -8,14 +8,6 @@ git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
# (order should follow README) # (order should follow README)
# #
# The name of the current branch
# Back-compatibility wrapper for when this function was defined here in
# the plugin, before being pulled in to core lib/git.zsh as git_current_branch()
# to fix the core -> git plugin dependency.
function current_branch() {
git_current_branch
}
# Check for develop and similarly named branches # Check for develop and similarly named branches
function git_develop_branch() { function git_develop_branch() {
command git rev-parse --git-dir &>/dev/null || return command git rev-parse --git-dir &>/dev/null || return
@ -102,7 +94,7 @@ function work_in_progress() {
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
function ggpnp() { function ggpnp() {
if [[ "$#" == 0 ]]; then if [[ $# == 0 ]]; then
ggl && ggp ggl && ggp
else else
ggl "${*}" && ggp "${*}" ggl "${*}" && ggp "${*}"
@ -110,7 +102,6 @@ function ggpnp() {
} }
compdef _git ggpnp=git-checkout compdef _git ggpnp=git-checkout
alias ggpur='ggu'
alias g='git' alias g='git'
alias ga='git add' alias ga='git add'
alias gaa='git add --all' alias gaa='git add --all'
@ -280,26 +271,27 @@ alias gpra='git pull --rebase --autostash'
alias gprav='git pull --rebase --autostash -v' alias gprav='git pull --rebase --autostash -v'
function ggu() { function ggu() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git pull --rebase origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git pull --rebase origin "${b:-$1}"
} }
compdef _git ggu=git-checkout compdef _git ggu=git-pull
alias gprom='git pull --rebase origin $(git_main_branch)' alias gprom='git pull --rebase origin $(git_main_branch)'
alias gpromi='git pull --rebase=interactive origin $(git_main_branch)' alias gpromi='git pull --rebase=interactive origin $(git_main_branch)'
alias gprum='git pull --rebase upstream $(git_main_branch)' alias gprum='git pull --rebase upstream $(git_main_branch)'
alias gprumi='git pull --rebase=interactive upstream $(git_main_branch)' alias gprumi='git pull --rebase=interactive upstream $(git_main_branch)'
alias ggpull='git pull origin "$(git_current_branch)"'
function ggl() { function ggl() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ $# != 0 ]] && [[ $# != 1 ]]; then
git pull origin "${*}" git pull origin "${*}"
else else
[[ "$#" == 0 ]] && local b="$(git_current_branch)" local b
git pull origin "${b:=$1}" [[ $# == 0 ]] && b="$(git_current_branch)"
git pull origin "${b:-$1}"
fi fi
} }
compdef _git ggl=git-checkout compdef _git ggl=git-pull
alias gluc='git pull upstream $(git_current_branch)' alias gluc='git pull upstream $(git_current_branch)'
alias glum='git pull upstream $(git_main_branch)' alias glum='git pull upstream $(git_main_branch)'
@ -307,10 +299,11 @@ alias gp='git push'
alias gpd='git push --dry-run' alias gpd='git push --dry-run'
function ggf() { function ggf() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git push --force origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git push --force origin "${b:-$1}"
} }
compdef _git ggf=git-checkout compdef _git ggf=git-push
alias gpf!='git push --force' alias gpf!='git push --force'
is-at-least 2.30 "$git_version" \ is-at-least 2.30 "$git_version" \
@ -318,10 +311,11 @@ is-at-least 2.30 "$git_version" \
|| alias gpf='git push --force-with-lease' || alias gpf='git push --force-with-lease'
function ggfl() { function ggfl() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git push --force-with-lease origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git push --force-with-lease origin "${b:-$1}"
} }
compdef _git ggfl=git-checkout compdef _git ggfl=git-push
alias gpsup='git push --set-upstream origin $(git_current_branch)' alias gpsup='git push --set-upstream origin $(git_current_branch)'
is-at-least 2.30 "$git_version" \ is-at-least 2.30 "$git_version" \
@ -330,17 +324,17 @@ is-at-least 2.30 "$git_version" \
alias gpv='git push --verbose' alias gpv='git push --verbose'
alias gpoat='git push origin --all && git push origin --tags' alias gpoat='git push origin --all && git push origin --tags'
alias gpod='git push origin --delete' alias gpod='git push origin --delete'
alias ggpush='git push origin "$(git_current_branch)"'
function ggp() { function ggp() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ $# != 0 ]] && [[ $# != 1 ]]; then
git push origin "${*}" git push origin "${*}"
else else
[[ "$#" == 0 ]] && local b="$(git_current_branch)" local b
git push origin "${b:=$1}" [[ $# == 0 ]] && b="$(git_current_branch)"
git push origin "${b:-$1}"
fi fi
} }
compdef _git ggp=git-checkout compdef _git ggp=git-push
alias gpu='git push upstream' alias gpu='git push upstream'
alias grb='git rebase' alias grb='git rebase'
@ -409,7 +403,7 @@ alias gts='git tag --sign'
alias gtv='git tag | sort -V' alias gtv='git tag | sort -V'
alias gignore='git update-index --assume-unchanged' alias gignore='git update-index --assume-unchanged'
alias gunignore='git update-index --no-assume-unchanged' alias gunignore='git update-index --no-assume-unchanged'
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' alias gwch='git log --patch --abbrev-commit --pretty=medium --raw'
alias gwt='git worktree' alias gwt='git worktree'
alias gwta='git worktree add' alias gwta='git worktree add'
alias gwtls='git worktree list' alias gwtls='git worktree list'
@ -422,19 +416,16 @@ alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!'
unset git_version unset git_version
# Logic for adding warnings on deprecated aliases # Logic for adding warnings on deprecated aliases or functions
local old_alias new_alias local old_name new_name
for old_alias new_alias ( for old_name new_name (
# TODO(2023-10-19): remove deprecated `git pull --rebase` aliases current_branch git_current_branch
gup gpr ggpull ggl
gupv gprv ggpur ggu
gupa gpra ggpush ggp
gupav gprav
gupom gprom
gupomi gpromi
); do ); do
aliases[$old_alias]=" aliases[$old_name]="
print -Pu2 \"%F{yellow}[oh-my-zsh] '%F{red}${old_alias}%F{yellow}' is a deprecated alias, using '%F{green}${new_alias}%F{yellow}' instead.%f\" print -Pu2 \"%F{yellow}[oh-my-zsh] '%F{red}${old_name}%F{yellow}' is deprecated, using '%F{green}${new_name}%F{yellow}' instead.%f\"
$new_alias" $new_name"
done done
unset old_alias new_alias unset old_name new_name

View file

@ -19,18 +19,18 @@ __gradle-init-cache-dir() {
} }
__gradle-set-settings-file() { __gradle-set-settings-file() {
# In order of precedence: --settings-file=filename, settings.gradle, settings.gradle.kts # In order of precedence: settings.gradle, settings.gradle.kts
local default_gradle_settings_file="$project_root_dir/settings.gradle" local default_gradle_settings_file="$project_root_dir/settings.gradle"
if [[ ! -f $default_gradle_settings_file ]]; then if [[ ! -f $default_gradle_settings_file ]]; then
default_gradle_settings_file="$project_root_dir/settings.gradle.kts" default_gradle_settings_file="$project_root_dir/settings.gradle.kts"
fi fi
gradle_settings_file=${${(v)opt_args[(i)-c|--settings-file]}:-$default_gradle_settings_file} gradle_settings_file=$default_gradle_settings_file
} }
__gradle-set-build-file() { __gradle-set-build-file() {
__gradle-set-settings-file __gradle-set-settings-file
# In order of precedence: --build-file=filename, rootProject.buildFileName, build.gradle, build.gradle.kts # In order of precedence: rootProject.buildFileName, build.gradle, build.gradle.kts
local default_gradle_build_file_name="build.gradle" local default_gradle_build_file_name="build.gradle"
if [[ -r $gradle_settings_file ]]; then if [[ -r $gradle_settings_file ]]; then
@ -45,8 +45,7 @@ __gradle-set-build-file() {
default_gradle_build_file="$project_root_dir/build.gradle.kts" default_gradle_build_file="$project_root_dir/build.gradle.kts"
fi fi
# If a build file is specified after '-b' or '--build-file', use this file. gradle_build_file=$default_gradle_build_file
gradle_build_file=${${(v)opt_args[(i)-b|--build-file]}:-$default_gradle_build_file}
} }
__gradle-set-cache-name() { __gradle-set-cache-name() {
@ -94,10 +93,11 @@ __gradle-generate-tasks-cache() {
# Reuse Gradle Daemon if IDLE but don't start a new one. # Reuse Gradle Daemon if IDLE but don't start a new one.
local gradle_tasks_output local gradle_tasks_output
if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then
gradle_tasks_output="$($gradle_cmd --daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
else else
gradle_tasks_output="$($gradle_cmd --no-daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --no-daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
fi fi
local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line
local -a match local -a match
for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do
@ -199,106 +199,158 @@ __gradle_subcommand() {
;; ;;
(dependencyInsight) (dependencyInsight)
_arguments \ _arguments \
'--all-variants[Show all variants of each dependency]' \
'--configuration=[Looks for the dependency in given configuration.]:dependency configuration:_gradle_dependency_configurations' \
'--dependency=[Shows the details of given dependency.]' \ '--dependency=[Shows the details of given dependency.]' \
'--configuration=[Looks for the dependency in given configuration.]:dependency configuration:_gradle_dependency_configurations' && ret=0 '--single-path[Show at most one path to each dependency]' && ret=0
;; ;;
(help) (help)
_arguments \ _arguments \
'--task[The task to show help for.]' && ret=0 '--task=[The task to show help for.]' && ret=0
;; ;;
(init) (init)
_arguments \ _arguments \
'--dsl=[DSL to be used in generated scripts.]:dsl:(groovy kotlin)' \ '--comments[Include clarifying comments in files.]' \
'--package=[Package for the generated source.]' \ '--dsl=[Set the build script DSL to be used in generated scripts.]' \
'--project-name=[Name of the generated project.]' \ '--incubating[Allow the generated build to use new features and APIs.]' \
'--test-framework=[Test framework to be used.]:test framework:(junit kotlintest scalatest spock testng)' \ '--insecure-protocol=[How to handle insecure URLs used for Maven Repositories.]' \
'--type=[Project type to generate.]:project type:(basic cpp-application cpp-library groovy-application groovy-library java-application java-library kotlin-application kotlin-library pom scala-library)' && ret=0 '--java-version=[Provides java version to use in the project.]' \
'--overwrite[Allow existing files in the build directory to be overwritten?]' \
'--package=[Set the package for source files.]' \
'--project-name=[Set the project name.]' \
'--split-project[Split functionality across multiple subprojects?]' \
'--test-framework=[Set the test framework to be used.]' \
'--type=[Set the type of project to generate.]' \
'--use-defaults[Use default values for options not configured explicitly]' && ret=0
;; ;;
(tasks) (tasks)
_arguments \ _arguments \
'--all[List all tasks, including subproject tasks.]' \ '--all[Show additional tasks and detail.]' \
'--group=[Show tasks only from given task group.]' && ret=0 '--group=[Show tasks for a specific group.]' \
'--groups=[Show tasks for specific groups (can be used multiple times to specify multiple groups).]' \
'--types[Show task class types]' && ret=0
;; ;;
(test) (test)
_arguments -C \ _arguments -C \
'--debug-jvm[Enable debugging for the test process. The process is started suspended and listening on port 5005. Requires the "java" plugin.]' \ '--debug-jvm[Enable debugging for the test process. The process is started suspended and listening on port 5005.]' \
'--fail-fast[Stops test execution after the first failed test. Requires the "java" plugin.]' \ '--fail-fast[Stops test execution after the first failed test.]' \
'--tests=[Sets test class or method name to be included, * is supported. Requires the "java" plugin.]' \ '--test-dry-run[Simulate test execution.]' \
'--tests=[Sets test class or method name to be included (in addition to the test task filters), '*' is supported.]' \
'(-)*:: :->task-or-option' && ret=0 '(-)*:: :->task-or-option' && ret=0
;; ;;
(wrapper) (wrapper)
_arguments \ _arguments \
'--distribution-type=[Binary-only or all with docs and sources]:*:distribution type:(bin all)' \ '--distribution-type=[The type of the Gradle distribution to be used by the wrapper.]:*:distribution type:(bin all)' \
'--gradle-version=[Set Gradle version for wrapper]' \ '--gradle-distribution-sha256-sum=[The SHA-256 hash sum of the gradle distribution.]' \
'--gradle-distribution-sha256-sum=[SHA-256 checksum]' \ '--gradle-distribution-url=[The URL to download the Gradle distribution from.]' \
'--gradle-distribution-url=[Set Gradle distribution URL]' && ret=0 '--gradle-version=[The version of the Gradle distribution required by the wrapper. The following labels are allowed: latest, release-candidate, release-milestone, release-nightly, and nightly.]' \
'--network-timeout=[Timeout in ms to use when the wrapper is performing network operations.]' \
'--validate-url[Sets task to validate the configured distribution url.]' && ret=0
;; ;;
(*) (*)
_arguments -C \ _arguments -C \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \ '-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \ '-Dorg.gradle.caching.debug=[]' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ '-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false)' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ '-Dorg.gradle.configuration-cache.entries-per-key=[]' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle' \ '-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.integrity-check=[]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.max-problems=[]' \
'--continue[Continues task execution after a task failure.]' \ '-Dorg.gradle.configuration-cache.parallel=[]' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \ '-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:org.gradle.configuration cache.problems:(fail warn)' \
'-Dorg.gradle.caching=[Set true to enable Gradle build cache.]:enable build cache:(true false)' \ '-Dorg.gradle.configuration-cache.read-only=[]' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]:enable daemon debug:(true false)' \ '-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \ '-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \ '-Dorg.gradle.console=[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:org.gradle.console:(plain auto rich verbose)' \
'-Dorg.gradle.jvmargs=[Set JVM arguments.]' \ '-Dorg.gradle.continue=[Continue task execution after a task failure.]' \
'-Dorg.gradle.java.home=[Set JDK home dir.]' \ '-Dorg.gradle.continuous.quietperiod=[]' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.daemon.healthcheckinterval=[]' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:enable parallel build:(true false)' \ '-Dorg.gradle.daemon.idletimeout=[]' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.debug.host=[]' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '-Dorg.gradle.debug.port=[]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ '-Dorg.gradle.debug.server=[]' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \ '-Dorg.gradle.debug.suspend=[]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:file:_directories' \ '-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle' \ '-Dorg.gradle.java.installations.auto-detect=[]' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \ '-Dorg.gradle.java.installations.auto-download=[]' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers' \ '-Dorg.gradle.java.installations.fromEnv=[]' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \ '-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \ '-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \ '-Dorg.gradle.jvmargs=[]' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \ '-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug)' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \ '-Dorg.gradle.logging.stacktrace=[]' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \ '-Dorg.gradle.native=[]' \
'(--scan)--no-scan[Do not create a build scan.]' \ '-Dorg.gradle.parallel=[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]:org.gradle.parallel:(true false)' \
'--offline[The build should operate without accessing network resources.]' \ '-Dorg.gradle.priority=[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']:org.gradle.priority:(normal low)' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):' \ '-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories' \ '-Dorg.gradle.projectcachedir=[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \ '-Dorg.gradle.unsafe.isolated-projects=[]' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \ '-Dorg.gradle.vfs.verbose=[]' \
'--priority[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.vfs.watch=[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]:org.gradle.vfs.watch:(true false)' \
'--project-cache-dir[Specifies the project-specific cache directory.]:cache directory:_directories' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \ '-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never)' \
'--recompile-scripts[Force build script recompiling.]' \ '-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \ (--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
'--refresh-dependencies[Refresh the state of dependencies.]' \ (--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--rerun-tasks[Ignore previously cached task results.]' \ '--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn)' \
'(--no-scan)--scan[Create a build scan.]' \ (--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \ '--console[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:console:(plain auto rich verbose)' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \ (--no-continue)'--continue[Continue task execution after a task failure.]' \
'--system-prop[system property (prop=val)]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \ {-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
{-u,--no-search-upward}"[Don't search in parent folders for a settings.gradle file.]" \ (--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \ (--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ {-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off)' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ {-m,--dry-run}'[Run the builds with all task actions disabled.]' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ \*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ '--export-keys[Exports the public keys used for dependency verification.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' && ret=0 '--foreground[Starts the Gradle daemon in the foreground.]' \
(--stacktrace,-s){-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
{-g,--gradle-user-home}'[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle user home:_directories' \
\*'--include-build[Include the specified build in the composite.]:include build:_directories' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Set log level to info.]' \
\*{-I,--init-script}'[Specify an initialization script.]:init script:_files -g \*.gradle(|.kts)' \
'--max-workers[Configure the number of concurrent workers Gradle is allowed to use.]' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stop task execution after a task failure.]' \
(--daemon)'--no-daemon[Do not use the Gradle daemon to run the build. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--parallel)'--no-parallel[Disables parallel execution to build projects.]' \
(--problems-report)'--no-problems-report[(Experimental) disables HTML problems report]' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \
(--scan)'--no-scan[Disables the creation of a Build Scan.]' \
(--watch-fs)'--no-watch-fs[Disables watching the file system.]' \
'--offline[Execute the build without accessing network resources.]' \
(--no-parallel)'--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--priority[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']' \
(--no-problems-report)'--problems-report[(Experimental) enables HTML problems report]' \
'--profile[Profile build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--project-cache-dir[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:project cache dir:_directories' \
{-p,--project-dir}'[Specifies the start directory for Gradle. Defaults to current directory.]:project dir:_directories' \
'--property-upgrade-report[(Experimental) Runs build with experimental property upgrade report.]' \
(--warn,-w,--info,-i,--debug,-d){-q,--quiet}'[Log errors only.]' \
{-U,--refresh-dependencies}'[Refresh the state of dependencies.]' \
'--refresh-keys[Refresh the public keys used for dependency verification.]' \
'--rerun[Causes the task to be re-run even if up-to-date.]' \
'--rerun-tasks[Ignore previously cached task results.]' \
(--no-scan)'--scan[Generate a Build Scan (powered by Develocity).]' \
{-V,--show-version}'[Print version info and continue.]' \
(--full-stacktrace,-S){-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'--task-graph[(Experimental) Print task graph instead of executing tasks.]' \
\*'--update-locks[Perform a partial update of the dependency lock, letting passed in module notations change version. (incubating)]' \
(--quiet,-q,--info,-i,--debug,-d){-w,--warn}'[Set log level to warn.]' \
'--warning-mode[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:warning mode:(all summary none)' \
(--no-watch-fs)'--watch-fs[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]' \
'--write-locks[Persists dependency resolution for locked configurations, ignoring existing locking information if it exists]' \
{-M,--write-verification-metadata}'[Generates checksums for dependencies used in the project (comma-separated list)]' && ret=0
;; ;;
esac esac
@ -324,76 +376,113 @@ _gradle() {
typeset -A opt_args typeset -A opt_args
_arguments -C \ _arguments -C \
'(-)'{-\?,-h,--help}'[Shows a help message.]' \ '-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories:->argument-expected' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \ '-Dorg.gradle.caching.debug=[]:->argument-expected' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \ '-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false):->argument-expected' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ '-Dorg.gradle.configuration-cache.entries-per-key=[]:->argument-expected' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ '-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]:->argument-expected' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle:->argument-expected' \ '-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories:->argument-expected' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]:->argument-expected' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]:->argument-expected' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '-Dorg.gradle.configuration-cache.integrity-check=[]:->argument-expected' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ '-Dorg.gradle.configuration-cache.max-problems=[]:->argument-expected' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.parallel=[]:->argument-expected' \
'--continue[Continues task execution after a task failure.]' \ '-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:org.gradle.configuration cache.problems:(fail warn):->argument-expected' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \ '-Dorg.gradle.configuration-cache.read-only=[]:->argument-expected' \
'-Dorg.gradle.caching=[Set true to enable Gradle build cache.]' \ '-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]:->argument-expected' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]:->argument-expected' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]' \ '-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]:->argument-expected' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \ '-Dorg.gradle.console=[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:org.gradle.console:(plain auto rich verbose):->argument-expected' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \ '-Dorg.gradle.continue=[Continue task execution after a task failure.]:->argument-expected' \
'-Dorg.gradle.jvmargs=[Set JVM arguments.]' \ '-Dorg.gradle.continuous.quietperiod=[]:->argument-expected' \
'-Dorg.gradle.java.home=[Set JDK home dir.]' \ '-Dorg.gradle.daemon.healthcheckinterval=[]:->argument-expected' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.daemon.idletimeout=[]:->argument-expected' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:(true false)' \ '-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories:->argument-expected' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]:->argument-expected' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.debug.host=[]:->argument-expected' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.debug.port=[]:->argument-expected' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '-Dorg.gradle.debug.server=[]:->argument-expected' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ '-Dorg.gradle.debug.suspend=[]:->argument-expected' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \
'--foreground[Starts the Gradle daemon in the foreground.]' \ '-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->argument-expected' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:home directory:_directories:->argument-expected' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \
'(-)--gui[Launches the Gradle GUI. (Removed in Gradle 4.0)]' \ '-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories:->argument-expected' \ '-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle:->argument-expected' \ '-Dorg.gradle.java.installations.fromEnv=[]:->argument-expected' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \ '-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories:->argument-expected' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers:->argument-expected' \ '-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories:->argument-expected' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \ '-Dorg.gradle.jvmargs=[]:->argument-expected' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \ '-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug):->argument-expected' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \ '-Dorg.gradle.logging.stacktrace=[]:->argument-expected' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \ '-Dorg.gradle.native=[]:->argument-expected' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \ '-Dorg.gradle.parallel=[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]:org.gradle.parallel:(true false):->argument-expected' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \ '-Dorg.gradle.priority=[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']:org.gradle.priority:(normal low):->argument-expected' \
'(--scan)--no-scan[Do not create a build scan.]' \ '-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]:->argument-expected' \
'--offline[The build should operate without accessing network resources.]' \ '-Dorg.gradle.projectcachedir=[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:org.gradle.projectcachedir:_directories:->argument-expected' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):->argument-expected' \ '-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories:->argument-expected' \ '-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \ '-Dorg.gradle.vfs.watch=[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]:org.gradle.vfs.watch:(true false):->argument-expected' \
'--priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:->argument-expected' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \ '-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never):->argument-expected' \
'--project-cache-dir=[Specifies the project-specific cache directory.]:cache directory:_directories:->argument-expected' \ '-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \ (--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
'--recompile-scripts[Force build script recompiling.]' \ (--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \ '--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn):->argument-expected' \
'--refresh-dependencies[Refresh the state of dependencies.]' \ (--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'--rerun-tasks[Ignore previously cached task results.]' \ '--console[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:console:(plain auto rich verbose):->argument-expected' \
'(--no-scan)--scan[Create a build scan.]' \ (--no-continue)'--continue[Continue task execution after a task failure.]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
'(-)--status[Shows status of running and recently stopped Gradle Daemons.]' \
'(-)--stop[Stops all Gradle daemons.]' \
'--system-prop[system property (prop=val)]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \ {-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
{-u,--no-search-upward}"[Don't search in parent folders for a settings.gradle file.]" \ (--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \ (--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(-)'{-v,--version}'[Print version info.]' \ {-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off):->argument-expected' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ {-m,--dry-run}'[Run the builds with all task actions disabled.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ \*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ '--export-keys[Exports the public keys used for dependency verification.]' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ '--foreground[Starts the Gradle daemon in the foreground.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \ (--stacktrace,-s){-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
'(-)*:: :->task-or-option' && ret=0 {-g,--gradle-user-home}'[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle user home:_directories:->argument-expected' \
{-h,--help}'[Shows a help message.]' \
\*'--include-build[Include the specified build in the composite.]:include build:_directories:->argument-expected' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Set log level to info.]' \
\*{-I,--init-script}'[Specify an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \
'--max-workers[Configure the number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stop task execution after a task failure.]' \
(--daemon)'--no-daemon[Do not use the Gradle daemon to run the build. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--parallel)'--no-parallel[Disables parallel execution to build projects.]' \
(--problems-report)'--no-problems-report[(Experimental) disables HTML problems report]' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \
(--scan)'--no-scan[Disables the creation of a Build Scan.]' \
(--watch-fs)'--no-watch-fs[Disables watching the file system.]' \
'--offline[Execute the build without accessing network resources.]' \
(--no-parallel)'--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--priority[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']:->argument-expected' \
(--no-problems-report)'--problems-report[(Experimental) enables HTML problems report]' \
'--profile[Profile build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--project-cache-dir[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:project cache dir:_directories:->argument-expected' \
{-p,--project-dir}'[Specifies the start directory for Gradle. Defaults to current directory.]:project dir:_directories:->argument-expected' \
'--property-upgrade-report[(Experimental) Runs build with experimental property upgrade report.]' \
(--warn,-w,--info,-i,--debug,-d){-q,--quiet}'[Log errors only.]' \
{-U,--refresh-dependencies}'[Refresh the state of dependencies.]' \
'--refresh-keys[Refresh the public keys used for dependency verification.]' \
'--rerun[Causes the task to be re-run even if up-to-date.]' \
'--rerun-tasks[Ignore previously cached task results.]' \
(--no-scan)'--scan[Generate a Build Scan (powered by Develocity).]' \
{-V,--show-version}'[Print version info and continue.]' \
(--full-stacktrace,-S){-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'--status[Shows status of running and recently stopped Gradle daemon(s).]' \
'--stop[Stops the Gradle daemon if it is running.]' \
'--task-graph[(Experimental) Print task graph instead of executing tasks.]' \
\*'--update-locks[Perform a partial update of the dependency lock, letting passed in module notations change version. (incubating)]' \
{-v,--version}'[Print version info and exit.]' \
(--quiet,-q,--info,-i,--debug,-d){-w,--warn}'[Set log level to warn.]' \
'--warning-mode[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:warning mode:(all summary none):->argument-expected' \
(--no-watch-fs)'--watch-fs[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]' \
'--write-locks[Persists dependency resolution for locked configurations, ignoring existing locking information if it exists]' \
{-M,--write-verification-metadata}'[Generates checksums for dependencies used in the project (comma-separated list)]:->argument-expected' \
'(-)*:: :->task-or-option' && ret=0
if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then
__gradle_tasks && ret=0 __gradle_tasks && ret=0

View file

@ -45,7 +45,14 @@
: ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND='bg=magenta,fg=white,bold'} : ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_FOUND='bg=magenta,fg=white,bold'}
: ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND='bg=red,fg=white,bold'} : ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_NOT_FOUND='bg=red,fg=white,bold'}
: ${HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'}
# Respect CASE_SENSITIVE setting for case sensitivity
if [[ "$CASE_SENSITIVE" = true ]]; then
: ${HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS=''}
else
: ${HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'}
fi
: ${HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE=''} : ${HISTORY_SUBSTRING_SEARCH_ENSURE_UNIQUE=''}
: ${HISTORY_SUBSTRING_SEARCH_FUZZY=''} : ${HISTORY_SUBSTRING_SEARCH_FUZZY=''}
: ${HISTORY_SUBSTRING_SEARCH_PREFIXED=''} : ${HISTORY_SUBSTRING_SEARCH_PREFIXED=''}

View file

@ -12,6 +12,16 @@ plugins=(... jj)
| Alias | Command | | Alias | Command |
| ------ | ----------------------------- | | ------ | ----------------------------- |
| jjb | `jj bookmark` |
| jjbc | `jj bookmark create` |
| jjbd | `jj bookmark delete` |
| jjbf | `jj bookmark forget` |
| jjbl | `jj bookmark list` |
| jjbm | `jj bookmark move` |
| jjbr | `jj bookmark rename` |
| jjbs | `jj bookmark set` |
| jjbt | `jj bookmark track` |
| jjbu | `jj bookmark untrack` |
| jjc | `jj commit` | | jjc | `jj commit` |
| jjcmsg | `jj commit --message` | | jjcmsg | `jj commit --message` |
| jjd | `jj diff` | | jjd | `jj diff` |
@ -22,14 +32,20 @@ plugins=(... jj)
| jjgf | `jj git fetch` | | jjgf | `jj git fetch` |
| jjgfa | `jj git fetch --all-remotes` | | jjgfa | `jj git fetch --all-remotes` |
| jjgp | `jj git push` | | jjgp | `jj git push` |
| jjgpa | `jj git push --all` |
| jjgpd | `jj git push --deleted` |
| jjgpt | `jj git push --tracked` |
| jjl | `jj log` | | jjl | `jj log` |
| jjla | `jj log -r "all()"` | | jjla | `jj log -r "all()"` |
| jjn | `jj new` | | jjn | `jj new` |
| jjnt | `jj new "trunk()"` |
| jjrb | `jj rebase` | | jjrb | `jj rebase` |
| jjrbm | `jj rebase -d "trunk()"` |
| jjrs | `jj restore` | | jjrs | `jj restore` |
| jjrt | `cd "$(jj root \|\| echo .)"` | | jjrt | `cd "$(jj root \|\| echo .)"` |
| jjsp | `jj split` | | jjsp | `jj split` |
| jjsq | `jj squash` | | jjsq | `jj squash` |
| jjst | `jj status` |
## Prompt usage ## Prompt usage
@ -88,3 +104,4 @@ that.
## Contributors ## Contributors
- [nasso](https://github.com/nasso) - Plugin Author - [nasso](https://github.com/nasso) - Plugin Author
- [imp](https://github.com/imp) - Occasional Alias Contributor

View file

@ -34,6 +34,16 @@ function jj_prompt_template() {
} }
# Aliases (sorted alphabetically) # Aliases (sorted alphabetically)
alias jjb='jj bookmark'
alias jjbc='jj bookmark create'
alias jjbd='jj bookmark delete'
alias jjbf='jj bookmark forget'
alias jjbl='jj bookmark list'
alias jjbm='jj bookmark move'
alias jjbr='jj bookmark rename'
alias jjbs='jj bookmark set'
alias jjbt='jj bookmark track'
alias jjbu='jj bookmark untrack'
alias jjc='jj commit' alias jjc='jj commit'
alias jjcmsg='jj commit --message' alias jjcmsg='jj commit --message'
alias jjd='jj diff' alias jjd='jj diff'
@ -44,11 +54,17 @@ alias jjgcl='jj git clone'
alias jjgf='jj git fetch' alias jjgf='jj git fetch'
alias jjgfa='jj git fetch --all-remotes' alias jjgfa='jj git fetch --all-remotes'
alias jjgp='jj git push' alias jjgp='jj git push'
alias jjgpa='jj git push --all'
alias jjgpd='jj git push --deleted'
alias jjgpt='jj git push --tracked'
alias jjl='jj log' alias jjl='jj log'
alias jjla='jj log -r "all()"' alias jjla='jj log -r "all()"'
alias jjn='jj new' alias jjn='jj new'
alias jjnt='jj new "trunk()"'
alias jjrb='jj rebase' alias jjrb='jj rebase'
alias jjrbm='jj rebase -d "trunk()"'
alias jjrs='jj restore' alias jjrs='jj restore'
alias jjrt='cd "$(jj root || echo .)"' alias jjrt='cd "$(jj root || echo .)"'
alias jjsp='jj split' alias jjsp='jj split'
alias jjsq='jj squash' alias jjsq='jj squash'
alias jjst='jj status'

View file

@ -20,10 +20,11 @@ function {
zstyle -a :omz:plugins:keychain options options zstyle -a :omz:plugins:keychain options options
# Check keychain version to decide whether to use --agents # Check keychain version to decide whether to use --agents
local version_string=$(keychain --version 2>&1 | head -n 2 | tail -n 1 | cut -d ' ' -f 4) local version_string=$(keychain --version 2>&1)
# start keychain, only use --agents for versions below 2.9.0 # start keychain, only use --agents for versions below 2.9.0
autoload -Uz is-at-least autoload -Uz is-at-least
if is-at-least 2.9 "$version_string"; then if [[ "$version_string" =~ 'keychain ([0-9]+\.[0-9]+)' ]] && \
is-at-least 2.9 "$match[1]"; then
keychain ${^options:-} ${^identities} --host $SHORT_HOST keychain ${^options:-} ${^identities} --host $SHORT_HOST
else else
keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST

View file

@ -27,7 +27,7 @@ plugins=(... kubectl)
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | | kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | | kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
| kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) | | kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) |
| kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) | | kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) |
| | | **Pod management** | | | | **Pod management** |
| kgp | `kubectl get pods` | List all pods in ps output format | | kgp | `kubectl get pods` | List all pods in ps output format |
| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` | | kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` |
@ -74,6 +74,7 @@ plugins=(... kubectl)
| kdeld | `kubectl delete deployment` | Delete the deployment | | kdeld | `kubectl delete deployment` | Delete the deployment |
| ksd | `kubectl scale deployment` | Scale a deployment | | ksd | `kubectl scale deployment` | Scale a deployment |
| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment | | krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment |
| krrd | `kubectl rollout restart deployment` | Rollout restart a deployment |
| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime | | kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime |
| | | **Rollout management** | | | | **Rollout management** |
| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment | | kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment |
@ -87,7 +88,7 @@ plugins=(... kubectl)
| kga | `kubectl get all` | List all resources in ps format | | kga | `kubectl get all` | List all resources in ps format |
| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces | | kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces |
| | | **Logs** | | | | **Logs** |
| kl | `kubectl logs` | Print the logs for a container or resource | | klog | `kubectl logs` | Print the logs for a container or resource |
| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) | | klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) |
| | | **File copy** | | | | **File copy** |
| kcp | `kubectl cp` | Copy files and directories to and from containers | | kcp | `kubectl cp` | Copy files and directories to and from containers |
@ -112,6 +113,7 @@ plugins=(... kubectl)
| kdelss | `kubectl delete statefulset` | Delete the statefulset | | kdelss | `kubectl delete statefulset` | Delete the statefulset |
| ksss | `kubectl scale statefulset` | Scale a statefulset | | ksss | `kubectl scale statefulset` | Scale a statefulset |
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment | | krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment |
| krrss | `kubectl rollout restart statefulset` | Rollout restart a statefulset |
| | | **Service Accounts management** | | | | **Service Accounts management** |
| kdsa | `kubectl describe sa` | Describe a service account in details | | kdsa | `kubectl describe sa` | Describe a service account in details |
| kdelsa | `kubectl delete sa` | Delete the service account | | kdelsa | `kubectl delete sa` | Delete the service account |

View file

@ -98,6 +98,7 @@ alias kdd='kubectl describe deployment'
alias kdeld='kubectl delete deployment' alias kdeld='kubectl delete deployment'
alias ksd='kubectl scale deployment' alias ksd='kubectl scale deployment'
alias krsd='kubectl rollout status deployment' alias krsd='kubectl rollout status deployment'
alias krrd='kubectl rollout restart deployment'
function kres(){ function kres(){
kubectl set env $@ REFRESHED_AT=$(date +%Y%m%d%H%M%S) kubectl set env $@ REFRESHED_AT=$(date +%Y%m%d%H%M%S)
@ -120,6 +121,7 @@ alias kdss='kubectl describe statefulset'
alias kdelss='kubectl delete statefulset' alias kdelss='kubectl delete statefulset'
alias ksss='kubectl scale statefulset' alias ksss='kubectl scale statefulset'
alias krsss='kubectl rollout status statefulset' alias krsss='kubectl rollout status statefulset'
alias krrss='kubectl rollout restart statefulset'
# Port forwarding # Port forwarding
alias kpf="kubectl port-forward" alias kpf="kubectl port-forward"
@ -129,7 +131,7 @@ alias kga='kubectl get all'
alias kgaa='kubectl get all --all-namespaces' alias kgaa='kubectl get all --all-namespaces'
# Logs # Logs
alias kl='kubectl logs' alias klog='kubectl logs'
alias kl1h='kubectl logs --since 1h' alias kl1h='kubectl logs --since 1h'
alias kl1m='kubectl logs --since 1m' alias kl1m='kubectl logs --since 1m'
alias kl1s='kubectl logs --since 1s' alias kl1s='kubectl logs --since 1s'

52
plugins/nestjs/README.md Normal file
View file

@ -0,0 +1,52 @@
# NestJS Plugin for Oh My Zsh
This plugin provides aliases for common [NestJS CLI](https://docs.nestjs.com/cli/overview) commands.
## Requirements
- [NestJS CLI](https://docs.nestjs.com/cli/overview#installation) installed globally:
`npm install -g @nestjs/cli`
## Aliases
| Alias | Command | Description |
| :------ | :--------------------------- | :------------------------------------------ |
| `nnew` | `nest new` | Create a new NestJS project |
| `nb` | `nest build` | Build the NestJS application |
| `ns` | `nest start` | Start the application |
| `nsw` | `nest start --watch` | Start the application in watch mode |
| `nsd` | `nest start --dev` | Start the application in dev mode |
| `nsdbg` | `nest start --debug --watch` | Start the application in debug & watch mode |
| `ng` | `nest generate` | Generate a NestJS element |
| `ngm` | `nest generate module` | Generate a module |
| `ngc` | `nest generate controller` | Generate a controller |
| `ngs` | `nest generate service` | Generate a service |
| `ngg` | `nest generate guard` | Generate a guard |
| `ngp` | `nest generate pipe` | Generate a pipe |
| `ngf` | `nest generate filter` | Generate a filter |
| `ngr` | `nest generate resolver` | Generate a GraphQL resolver |
| `ngcl` | `nest generate class` | Generate a class |
| `ngi` | `nest generate interface` | Generate an interface |
| `ngit` | `nest generate interceptor` | Generate an interceptor |
| `ngmi` | `nest generate middleware` | Generate a middleware |
| `ngd` | `nest generate decorator` | Generate a custom decorator |
| `ngres` | `nest generate resource` | Generate a CRUD resource |
| `nglib` | `nest generate library` | Generate a new library |
| `ngsub` | `nest generate sub-app` | Generate a new sub-application (monorepo) |
| `na` | `nest add` | Add a library to the project |
| `ni` | `nest info` | Display NestJS project information |
| `nu` | `nest update` | Update NestJS dependencies |
## Usage
1. Add `nestjs` to the `plugins` array in your `~/.zshrc` file:
```zsh
plugins=(... nestjs)
```
2. Restart your terminal or source your `~/.zshrc` file:
```zsh
source ~/.zshrc
```

View file

@ -0,0 +1,41 @@
# Oh My Zsh plugin for NestJS CLI
# Check if nest command exists
if ! command -v nest &>/dev/null; then
return
fi
# Project creation
alias nnew='nest new'
# Basic development
alias nb='nest build'
alias ns='nest start'
alias nsw='nest start --watch'
alias nsd='nest start --dev' # Alias for start --watch
alias nsdbg='nest start --debug --watch'
# Code generation (short aliases)
alias ng='nest generate'
alias ngm='nest generate module'
alias ngc='nest generate controller'
alias ngs='nest generate service'
alias ngg='nest generate guard'
alias ngp='nest generate pipe'
alias ngf='nest generate filter'
alias ngr='nest generate resolver'
alias ngcl='nest generate class'
alias ngi='nest generate interface'
alias ngit='nest generate interceptor'
alias ngmi='nest generate middleware'
alias ngd='nest generate decorator'
alias ngres='nest generate resource'
alias nglib='nest generate library'
alias ngsub='nest generate sub-app'
# Other commands
alias na='nest add'
alias ni='nest info'
alias nu='nest update'
# You can add more aliases or functions here as needed.

41
plugins/pulumi/README.md Normal file
View file

@ -0,0 +1,41 @@
# Pulumi
This is an **Oh My Zsh plugin** for the [**Pulumi CLI**](https://www.pulumi.com/docs/iac/cli/),
an Infrastructure as Code (IaC) tool for building, deploying and managing cloud infrastucture.
This plugin provides:
- 🚀 Short, intuitive aliases for common Pulumi commands
- 🎯 Auto-completion support for Pulumi
To use it, add `pulumi` to the plugins array in your `.zshrc` file:
```zsh
plugins=(... pulumi)
```
## ⚡ Aliases
| Alias | Command | Description |
| -------- | ---------------------- | ----------------------------- |
| `pul` | `pulumi` | Shortcut for Pulumi CLI |
| `pulcs` | `pulumi config set` | Set Pulumi configuration |
| `puld` | `pulumi destroy` | Destroy all resources |
| `pullog` | `pulumi logs -f` | Tail Pulumi logs in real-time |
| `pulp` | `pulumi preview` | Show planned changes |
| `pulr` | `pulumi refresh` | Refresh state from cloud |
| `puls` | `pulumi stack` | Show stack details |
| `pulsh` | `pulumi stack history` | Show stack history |
| `pulsi` | `pulumi stack init` | Initialize a new stack |
| `pulsl` | `pulumi stack ls` | List available stacks |
| `pulso` | `pulumi stack output` | Show stack outputs |
| `pulss` | `pulumi stack select` | Switch stack |
| `pulu` | `pulumi up` | Deploy infrastructure |
## 🎯 Autocompletion
If `pulumi gen-completion zsh` is available, this plugin **automatically loads Pulumi auto-completion**.
## 🛠️ Contribution
Feel free to open an issue or PR for improvements! 🚀

View file

@ -0,0 +1,28 @@
if (( ! $+commands[pulumi] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `pulumi`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_pulumi" ]]; then
typeset -g -A _comps
autoload -Uz _pulumi
_comps[pulumi]=_pulumi
fi
pulumi gen-completion zsh >| "$ZSH_CACHE_DIR/completions/_pulumi" &|
# Aliases
alias pul='pulumi'
alias pulcs='pulumi config set'
alias puld='pulumi destroy'
alias pullog='pulumi logs -f'
alias pulp='pulumi preview'
alias pulr='pulumi refresh'
alias puls='pulumi stack'
alias pulsh='pulumi stack history'
alias pulsi='pulumi stack init'
alias pulsl='pulumi stack ls'
alias pulso='pulumi stack output'
alias pulss='pulumi stack select'
alias pulu='pulumi up'

View file

@ -1,18 +0,0 @@
# rbfu plugin
This plugin starts [rbfu](https://github.com/hmans/rbfu), a minimal Ruby version
manager, and adds some useful functions.
To use it, add `rbfu` to the plugins array in your zshrc file:
```zsh
plugins=(... rbfu)
```
**Note: `rbfu` is deprecated and should no longer be used.**
## Functions
- `rbfu-rubies`: lists all installed rubies available to rbfu.
- `rvm_prompt_info`: shows the Ruby version being used with rbfu.

View file

@ -1,49 +0,0 @@
# Enables rbfu with --auto option, if available.
#
# Also provides a command to list all installed/available
# rubies. To ensure compatibility with themes, creates the
# rvm_prompt_info function to return the $RBFU_RUBY_VERSION
# version.
command -v rbfu &>/dev/null || return
eval "$(rbfu --init --auto)"
# Internal: Print ruby version details, if it's currently active, etc.
function _rbfu_rubies_print() {
# 1: path to ruby file
# 2: active ruby
local rb rb_out
rb="${$1:t}"
rb_out="$rb"
# If the ruby is a symlink, add @ to the name.
if [[ -h "$1" ]]; then
rb_out="${rb_out}${fg[green]}@${reset_color}"
fi
# If the ruby is active, add * to the name and show it in red.
if [[ "$rb" = "$2" ]]; then
rb_out="${fg[red]}${rb_out} ${fg[red]}*${reset_color}"
fi
echo $rb_out
}
# Public: Provide a list with all available rubies, this basically depends
# on ~/.rfbu/rubies. Highlights the currently active ruby version and aliases.
function rbfu-rubies() {
local rbfu_dir active_rb
rbfu_dir="${RBFU_RUBIES:-${HOME}/.rbfu/rubies}"
active_rb="${RBFU_RUBY_VERSION:-system}"
_rbfu_rubies_print "${rbfu_dir}/system" "$active_rb"
for rb in ${rbfu_dir}/*(N); do
_rbfu_rubies_print "$rb" "$active_rb"
done
}
# Public: Create rvm_prompt_info command for themes compatibility, unless
# it has already been defined.
(( ${+functions[rvm_prompt_info]} )) || \
function rvm_prompt_info() { echo "${${RBFU_RUBY_VERSION:=system}:gs/%/%%}" }

View file

@ -5,7 +5,7 @@
_ssh_configfile="$HOME/.ssh/config" _ssh_configfile="$HOME/.ssh/config"
if [[ -f "$_ssh_configfile" ]]; then if [[ -f "$_ssh_configfile" ]]; then
_ssh_hosts=($( _ssh_hosts=($(
egrep '^Host.*' "$_ssh_configfile" |\ grep -E '^Host.*' "$_ssh_configfile" |\
awk '{for (i=2; i<=NF; i++) print $i}' |\ awk '{for (i=2; i<=NF; i++) print $i}' |\
sort |\ sort |\
uniq |\ uniq |\

9
plugins/task/README.md Normal file
View file

@ -0,0 +1,9 @@
# Task plugin
This plugin adds completion for [Task CLI](https://taskfile.dev/), a fast, cross-platform build tool inspired by Make, designed for modern workflows.
To use it, add `task` to the plugins array in your zshrc file:
```zsh
plugins=(... task)
```

View file

@ -0,0 +1,14 @@
# Autocompletion for the task CLI (task).
if (( !$+commands[task] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `task`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_task" ]]; then
typeset -g -A _comps
autoload -Uz _task
_comps[task]=_task
fi
# Generate and load task completion
task --completion zsh >! "$ZSH_CACHE_DIR/completions/_task" &|

View file

@ -20,9 +20,11 @@ plugins=(... terraform)
| `tf` | `terraform` | | `tf` | `terraform` |
| `tfa` | `terraform apply` | | `tfa` | `terraform apply` |
| `tfa!` | `terraform apply -auto-approve` | | `tfa!` | `terraform apply -auto-approve` |
| `tfap` | `terraform apply -parallelism=1` |
| `tfc` | `terraform console` | | `tfc` | `terraform console` |
| `tfd` | `terraform destroy` | | `tfd` | `terraform destroy` |
| `tfd!` | `terraform destroy -auto-approve` | | `tfd!` | `terraform destroy -auto-approve` |
| `tfdp` | `terraform destroy -parallelism=1` |
| `tff` | `terraform fmt` | | `tff` | `terraform fmt` |
| `tffr` | `terraform fmt -recursive` | | `tffr` | `terraform fmt -recursive` |
| `tfi` | `terraform init` | | `tfi` | `terraform init` |
@ -35,6 +37,9 @@ plugins=(... terraform)
| `tfs` | `terraform state` | | `tfs` | `terraform state` |
| `tft` | `terraform test` | | `tft` | `terraform test` |
| `tfsh` | `terraform show` | | `tfsh` | `terraform show` |
| `tfw` | `terraform workspace` |
| `tfwl` | `terraform workspace list` |
| `tfws` | `terraform workspace select` |
## Prompt function ## Prompt function

View file

@ -18,9 +18,11 @@ function tf_version_prompt_info() {
alias tf='terraform' alias tf='terraform'
alias tfa='terraform apply' alias tfa='terraform apply'
alias tfa!='terraform apply -auto-approve' alias tfa!='terraform apply -auto-approve'
alias tfap='terraform apply -parallelism=1'
alias tfc='terraform console' alias tfc='terraform console'
alias tfd='terraform destroy' alias tfd='terraform destroy'
alias tfd!='terraform destroy -auto-approve' alias tfd!='terraform destroy -auto-approve'
alias tfdp='terraform destroy -parallelism=1'
alias tff='terraform fmt' alias tff='terraform fmt'
alias tffr='terraform fmt -recursive' alias tffr='terraform fmt -recursive'
alias tfi='terraform init' alias tfi='terraform init'
@ -33,3 +35,6 @@ alias tfv='terraform validate'
alias tfs='terraform state' alias tfs='terraform state'
alias tft='terraform test' alias tft='terraform test'
alias tfsh='terraform show' alias tfsh='terraform show'
alias tfw='terraform workspace'
alias tfwl='terraform workspace list'
alias tfws='terraform workspace select'

View file

@ -13,3 +13,6 @@ plugins=(... tldr)
| Shortcut | Description | | Shortcut | Description |
|------------------------------------|----------------------------------------------------------------------------| |------------------------------------|----------------------------------------------------------------------------|
| <kbd>Esc</kbd> + tldr | add tldr before the previous command to see the tldr page for this command | | <kbd>Esc</kbd> + tldr | add tldr before the previous command to see the tldr page for this command |
## Note
You also need to install ```tldr```.

View file

@ -1,6 +1,7 @@
# uv plugin # uv plugin
This plugin automatically installs [uv](https://github.com/astral-sh/uv)'s completions for you, and keeps them up to date. It also adds convenient aliases for common usage. This plugin automatically installs [uv](https://github.com/astral-sh/uv)'s completions for you,
and keeps them up to date. It also adds convenient aliases for common usage.
To use it, add `uv` to the plugins array in your zshrc file: To use it, add `uv` to the plugins array in your zshrc file:
@ -10,19 +11,26 @@ plugins=(... uv)
## Aliases ## Aliases
| Alias | Command | Description | | Alias | Command | Description |
|:----- |------------------------------------------------------------------------ |:-------------------------------------------------------------------- | | :---- | ---------------------------------------------------------------------------------------- | :-------------------------------------------------------------------- |
| uva | `uv add` | Add packages to the project | | uva | `uv add` | Add packages to the project |
| uvexp | `uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet` | Export the lock file to `requirements.txt` | | uvexp | `uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet` | Export the lock file to `requirements.txt` |
| uvl | `uv lock` | Lock the dependencies | | uvi | `uv init` | Initialize a new project in current workspace and environment. |
| uvlr | `uv lock --refresh` | Rebuild the lock file without upgrading dependencies | | uvinw | `uv init --no-workspace` | Initialize a new project in a new workspace and environment |
| uvlu | `uv lock --upgrade` | Lock the dependencies to the newest compatible versions | | uvl | `uv lock` | Lock the dependencies |
| uvp | `uv pip` | Manage pip packages | | uvlr | `uv lock --refresh` | Rebuild the lock file without upgrading dependencies |
| uvpy | `uv python` | Manage Python installs | | uvlu | `uv lock --upgrade` | Lock the dependencies to the newest compatible versions |
| uvr | `uv run` | Run commands within the project's environment | | uvp | `uv pip` | Manage pip packages |
| uvrm | `uv remove` | Remove packages from the project | | uvpi | `uv python install` | Install a specific version of python |
| uvs | `uv sync` | Sync the environment with the lock file | | uvpl | `uv python list` | Lists all python version installed |
| uvsr | `uv sync --refresh` | "Force" sync the environment with the lock file (ignore cache) | | uvpp | `uv python pin` | Pin the current project to use a specific Python version |
| uvsu | `uv sync --upgrade` | Sync the environment, allowing upgrades and ignoring the lock file | | uvpu | `uv python uninstall` | Remove a specific version of python |
| uvup | `uv self update` | Update the UV tool to the latest version | | uvpy | `uv python` | Manage Python installs |
| uvv | `uv venv` | Manage virtual environments | | uvr | `uv run` | Run commands within the project's environment |
| uvrm | `uv remove` | Remove packages from the project |
| uvs | `uv sync` | Sync the environment with the lock file |
| uvsr | `uv sync --refresh` | "Force" sync the environment with the lock file (ignore cache) |
| uvsu | `uv sync --upgrade` | Sync the environment, allowing upgrades and ignoring the lock file |
| uvtr | `uv tree` | Displays the full dependency tree for the current project environment |
| uvup | `uv self update` | Update the UV tool to the latest version |
| uvv | `uv venv` | Manage virtual environments |

View file

@ -7,16 +7,23 @@ alias uv="noglob uv"
alias uva='uv add' alias uva='uv add'
alias uvexp='uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet' alias uvexp='uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet'
alias uvi='uv init'
alias uvinw='uv init --no-workspace'
alias uvl='uv lock' alias uvl='uv lock'
alias uvlr='uv lock --refresh' alias uvlr='uv lock --refresh'
alias uvlu='uv lock --upgrade' alias uvlu='uv lock --upgrade'
alias uvp='uv pip' alias uvp='uv pip'
alias uvpi='uv python install'
alias uvpl='uv python list'
alias uvpu='uv python uninstall'
alias uvpy='uv python' alias uvpy='uv python'
alias uvpp='uv python pin'
alias uvr='uv run' alias uvr='uv run'
alias uvrm='uv remove' alias uvrm='uv remove'
alias uvs='uv sync' alias uvs='uv sync'
alias uvsr='uv sync --refresh' alias uvsr='uv sync --refresh'
alias uvsu='uv sync --upgrade' alias uvsu='uv sync --upgrade'
alias uvtr='uv tree'
alias uvup='uv self update' alias uvup='uv self update'
alias uvv='uv venv' alias uvv='uv venv'

View file

@ -1,7 +1,6 @@
# VS Code # VS Code
This plugin provides useful aliases to simplify the interaction between the command line and VS Code or This plugin provides useful aliases to simplify the interaction between the command line and VS Code, VSCodium, or Cursor editor.
VSCodium editor.
To start using it, add the `vscode` plugin to your `plugins` array in `~/.zshrc`: To start using it, add the `vscode` plugin to your `plugins` array in `~/.zshrc`:
@ -18,6 +17,7 @@ You can install either:
- VS Code (code) - VS Code (code)
- VS Code Insiders (code-insiders) - VS Code Insiders (code-insiders)
- VSCodium (codium) - VSCodium (codium)
- Cursor (cursor)
### MacOS ### MacOS
@ -33,6 +33,10 @@ open the Command Palette via (F1 or ⇧⌘P) and type shell command to find the
> Shell Command: Install 'codium' command in PATH > Shell Command: Install 'codium' command in PATH
For Cursor, open the Command Palette via (F1 or ⌘⇧P) and type shell command to find the Shell Command:
> Shell Command: Install 'cursor' command in PATH
## Using multiple flavours ## Using multiple flavours
If for any reason, you ever require to use multiple flavours of VS Code i.e. VS Code (stable) and VS Code If for any reason, you ever require to use multiple flavours of VS Code i.e. VS Code (stable) and VS Code
@ -43,7 +47,7 @@ executable.
```zsh ```zsh
ZSH_THEME=... ZSH_THEME=...
# Choose between one [code, code-insiders or codium] # Choose between one [code, code-insiders, codium, or cursor]
# The following line will make the plugin to open VS Code Insiders # The following line will make the plugin to open VS Code Insiders
# Invalid entries will be ignored, no aliases will be added # Invalid entries will be ignored, no aliases will be added
VSCODE=code-insiders VSCODE=code-insiders

View file

@ -1,4 +1,4 @@
# VS Code (stable / insiders) / VSCodium zsh plugin # VS Code (stable / insiders) / VSCodium / Cursor zsh plugin
# Authors: # Authors:
# https://github.com/MarsiBarsi (original author) # https://github.com/MarsiBarsi (original author)
# https://github.com/babakks # https://github.com/babakks
@ -19,6 +19,8 @@ if [[ -z "$VSCODE" ]]; then
VSCODE=code-insiders VSCODE=code-insiders
elif which codium &>/dev/null; then elif which codium &>/dev/null; then
VSCODE=codium VSCODE=codium
elif which cursor &>/dev/null; then
VSCODE=cursor
else else
return return
fi fi

View file

@ -232,7 +232,7 @@ function handle_update() {
# Ask for confirmation and only update on 'y', 'Y' or Enter # Ask for confirmation and only update on 'y', 'Y' or Enter
# Otherwise just show a reminder for how to update # Otherwise just show a reminder for how to update
echo -n "[oh-my-zsh] Would you like to update? [Y/n] " printf "[oh-my-zsh] Would you like to update? [Y/n] "
read -r -k 1 option read -r -k 1 option
[[ "$option" = $'\n' ]] || echo [[ "$option" = $'\n' ]] || echo
case "$option" in case "$option" in
@ -280,7 +280,7 @@ case "$update_mode" in
return 0 return 0
elif [[ "$EXIT_STATUS" -ne 0 ]]; then elif [[ "$EXIT_STATUS" -ne 0 ]]; then
print -P "\n%F{red}[oh-my-zsh] There was an error updating:%f" print -P "\n%F{red}[oh-my-zsh] There was an error updating:%f"
printf "\n${fg[yellow]}%s${reset_color}" "$ERROR" printf "\n${fg[yellow]}%s${reset_color}" "${ERROR}"
return 0 return 0
fi fi
} always { } always {

View file

@ -505,7 +505,7 @@ print_success() {
printf '\n' printf '\n'
printf '%s\n' "• Follow us on X: $(fmt_link @ohmyzsh https://x.com/ohmyzsh)" printf '%s\n' "• Follow us on X: $(fmt_link @ohmyzsh https://x.com/ohmyzsh)"
printf '%s\n' "• Join our Discord community: $(fmt_link "Discord server" https://discord.gg/ohmyzsh)" printf '%s\n' "• Join our Discord community: $(fmt_link "Discord server" https://discord.gg/ohmyzsh)"
printf '%s\n' "• Get stickers, t-shirts, coffee mugs and more: $(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)" printf '%s\n' "• Get stickers, t-shirts, coffee mugs and more: $(fmt_link "CommitGoods Shop" https://commitgoods.com/collections/oh-my-zsh)"
printf '%s\n' $FMT_RESET printf '%s\n' $FMT_RESET
} }

View file

@ -273,7 +273,7 @@ if LANG= git pull --quiet --rebase $remote $branch; then
printf "${BLUE}%s${RESET}\n\n" "$message" printf "${BLUE}%s${RESET}\n\n" "$message"
printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on X:" "$(fmt_link @ohmyzsh https://x.com/ohmyzsh)" printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on X:" "$(fmt_link @ohmyzsh https://x.com/ohmyzsh)"
printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)" printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)"
printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)" printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "CommitGoods Shop" https://commitgoods.com/collections/oh-my-zsh)"
elif [[ $verbose_mode == minimal ]]; then elif [[ $verbose_mode == minimal ]]; then
printf "${BLUE}%s${RESET}\n" "$message" printf "${BLUE}%s${RESET}\n" "$message"
fi fi