| #compdef jiri | |
| _jiri() { | |
| local -a commands | |
| commands=( | |
| 'branch:Show or delete branches' | |
| 'clean:Clean Jiri workspace (main tree or worktree)' | |
| 'diff:Prints diff between two snapshots' | |
| 'flags:describe all known top-level flags' | |
| 'help:describe subcommands and their syntax' | |
| 'init:Create a new jiri root' | |
| 'patch:Patch in the existing change' | |
| 'project:Manage the jiri projects' | |
| 'runp:Run a command in parallel across jiri projects' | |
| 'selfupdate:Update jiri tool' | |
| 'snapshot:Create a new project snapshot' | |
| 'status:Prints status of all the projects' | |
| 'update:Update all jiri projects' | |
| 'upload:Upload a changelist for review' | |
| 'version:Print the jiri version' | |
| 'worktree:Manage Jiri worktrees' | |
| ) | |
| _arguments \ | |
| '(-v -vv -q -quiet)'{-v,-vv}'[Print debug/trace level output]' \ | |
| '(-v -vv -q -quiet)'{-q,-quiet}'[Only print user actionable messages]' \ | |
| '-color[Use color]:color:(always never auto)' \ | |
| '-j[Number of jobs]:jobs' \ | |
| '-root[Jiri root directory]:directory:_files -/' \ | |
| '1: :{_describe "Jiri command" commands}' \ | |
| '*:: :->args' | |
| if [[ $state == "args" ]]; then | |
| case $words[1] in | |
| branch) | |
| _jiri_branch | |
| ;; | |
| clean) | |
| _jiri_clean | |
| ;; | |
| diff) | |
| _jiri_diff | |
| ;; | |
| init) | |
| _jiri_init | |
| ;; | |
| patch) | |
| _jiri_patch | |
| ;; | |
| project) | |
| _jiri_project | |
| ;; | |
| runp) | |
| _jiri_runp | |
| ;; | |
| snapshot) | |
| _jiri_snapshot | |
| ;; | |
| status) | |
| _jiri_status | |
| ;; | |
| update) | |
| _jiri_update | |
| ;; | |
| upload) | |
| _jiri_upload | |
| ;; | |
| worktree) | |
| _jiri_worktree | |
| ;; | |
| *) | |
| _normal | |
| ;; | |
| esac | |
| fi | |
| } | |
| _jiri_worktree() { | |
| local -a subcommands | |
| subcommands=( | |
| 'add:Create a new Jiri worktree' | |
| 'list:List Jiri worktrees' | |
| 'remove:Remove a Jiri worktree' | |
| 'sync:Sync Jiri worktree' | |
| 'prune:Prune Jiri worktrees' | |
| ) | |
| _arguments \ | |
| '1: :{_describe "worktree subcommand" subcommands}' \ | |
| '*:: :->args' | |
| if [[ $state == "args" ]]; then | |
| case $words[1] in | |
| add) | |
| _arguments \ | |
| '1:directory:_files -/' | |
| ;; | |
| remove) | |
| _arguments \ | |
| '(-f -force)'{-f,-force}'[Force removal even if dirty]' \ | |
| '1:worktree:_jiri_worktrees' | |
| ;; | |
| sync) | |
| _arguments \ | |
| '1:directory:_files -/' | |
| ;; | |
| list) | |
| _arguments \ | |
| '-status[Show sync status for each worktree]' | |
| ;; | |
| esac | |
| fi | |
| } | |
| _jiri_worktrees() { | |
| local -a wts | |
| wts=( ${(f)"$(jiri worktree list 2>/dev/null)"} ) | |
| _describe 'worktree' wts | |
| } | |
| _jiri_branches() { | |
| local -a branches | |
| branches=( ${(f)"$(jiri branch 2>/dev/null | grep 'Branch(es):' | cut -d: -f2 | tr ',' '\n' | tr -d ' ' | sort -u)"} ) | |
| _describe 'branch' branches | |
| } | |
| _jiri_projects() { | |
| local -a projects | |
| projects=( ${(f)"$(jiri project -template '{{.Name}}' 2>/dev/null)"} ) | |
| _describe 'project' projects | |
| } | |
| _jiri_branch() { | |
| _arguments \ | |
| '-D[Force delete branch from project]' \ | |
| '-d[Delete branch from project]' \ | |
| '-delete-merged[Delete merged branches]' \ | |
| '-delete-merged-cl[Delete merged branches and check Gerrit]' \ | |
| '-override-pc[Override project config]' \ | |
| '1:branch name:_jiri_branches' | |
| } | |
| _jiri_clean() { | |
| _arguments \ | |
| '1:directory:_files -/' | |
| } | |
| _jiri_diff() { | |
| _arguments \ | |
| '-cls[Return CLs for changed projects]' \ | |
| '-indent[Indent json output]' \ | |
| '-max-cls[Max number of CLs returned per changed project]:number' \ | |
| '1:snapshot 1:_files' \ | |
| '2:snapshot 2:_files' | |
| } | |
| _jiri_init() { | |
| _arguments \ | |
| '-analytics-opt[Opt in/out of analytics]:enable:(true false)' \ | |
| '-cache[Jiri cache directory]:directory:_files -/' \ | |
| '-cipd-max-threads[Number of threads for CIPD]:threads' \ | |
| '-cipd-paranoid-mode[Paranoid mode in cipd]:mode' \ | |
| '-dissociate[Dissociate git cache]' \ | |
| '-enable-lockfile[Enable lockfile enforcement]:enable:(true false)' \ | |
| '-exclude-dirs[Directories to skip]:directories' \ | |
| '-fetch-optional[Set up optional projects/packages to fetch]:attributes' \ | |
| '-keep-git-hooks[Keep current git hooks]:enable:(true false)' \ | |
| '-lockfile-name[Lockfile filename]:filename:_files' \ | |
| '-offload-packfiles[Use CDN for packfiles]' \ | |
| '-package-cache[Enable package cache]:enable:(true false)' \ | |
| '-partial[Use partial checkout]' \ | |
| '-prebuilt-json[Prebuilt json file]:filename:_files' \ | |
| '-rewrite-sso-to-https[Rewrite SSO to HTTPS]:enable:(true false)' \ | |
| '-shared[Shared caches]' \ | |
| '-show-analytics-data[Show analytics data]' \ | |
| '-skip-partial[Skip partial checkouts for remotes]:remotes' \ | |
| '-sso-cookie-path[Path to master SSO cookie]:file:_files' \ | |
| '1:directory:_files -/' | |
| } | |
| _jiri_patch() { | |
| _arguments \ | |
| '-branch[Name of branch to apply patch to]:branch' \ | |
| '-cherry-pick[Cherry-pick patches]' \ | |
| '-delete[Delete existing branch]' \ | |
| '-force[Force delete existing branch]' \ | |
| '-host[Gerrit host]:host' \ | |
| '-no-branch[Do not create branch]' \ | |
| '-project[Project to apply patch to]:project:_jiri_projects' \ | |
| '-rebase[Rebase change after downloading]' \ | |
| '-rebase-branch[Branch to rebase onto]:branch' \ | |
| '-rebase-revision[Revision to rebase to]:revision' \ | |
| '-topic[Patch whole topic]' \ | |
| '1:change or topic:' | |
| } | |
| _jiri_project() { | |
| _arguments \ | |
| '-clean[Restore projects to pristine state]' \ | |
| '-clean-all[Restore projects and delete all branches]' \ | |
| '-json-output[Path to write results]:file:_files' \ | |
| '-list-remote-projects[List remote projects]' \ | |
| '-local-manifest[List status based on local manifest]' \ | |
| '*-local-manifest-project[Respect local manifest for project]:project:_jiri_projects' \ | |
| '-regexp[Use argument as regexp]' \ | |
| '-template[Template for fields]:template' \ | |
| '*:project:_jiri_projects' | |
| } | |
| _jiri_runp() { | |
| _arguments \ | |
| '-branch[Branch names to match projects]:branch' \ | |
| '-collate-stdout[Collate stdout output]' \ | |
| '-exit-on-error[Kill all commands on error]' \ | |
| '-interactive[Interactive command]' \ | |
| '-no-uncommitted[Match projects with no uncommitted changes]' \ | |
| '-no-untracked[Match projects with no untracked files]' \ | |
| '-projects[Project keys to run commands in]:projects' \ | |
| '-remote[Match projects by remote URL]:remote' \ | |
| '-show-key-prefix[Prefix output with project key]' \ | |
| '-show-name-prefix[Prefix output with project name]' \ | |
| '-show-path-prefix[Prefix output with project path]' \ | |
| '-uncommitted[Match projects with uncommitted changes]' \ | |
| '-untracked[Match projects with untracked files]' \ | |
| '1:command line:' | |
| } | |
| _jiri_snapshot() { | |
| _arguments \ | |
| '-cipd[Generate cipd.ensure snapshot]' \ | |
| '1:snapshot file:_files' | |
| } | |
| _jiri_status() { | |
| _arguments \ | |
| '-branch[Display projects on this branch]:branch' \ | |
| '-changes[Display projects with changes]' \ | |
| '-check-head[Display projects not on HEAD]' \ | |
| '-commits[Display commits not merged with remote]' \ | |
| '-d[Same as -deleted]' \ | |
| '-deleted[List deleted projects]' | |
| } | |
| _jiri_update() { | |
| _arguments \ | |
| '-attempts[Number of attempts]:attempts' \ | |
| '-autoupdate[Automatically update jiri]' \ | |
| '-fetch-packages[Use cipd to fetch packages]' \ | |
| '-fetch-packages-timeout[Timeout for cipd fetch]:timeout (minutes)' \ | |
| '-force-autoupdate[Always update jiri]' \ | |
| '-gc[Garbage collect obsolete repos]' \ | |
| '-hook-timeout[Timeout for hooks]:timeout (minutes)' \ | |
| '-local-manifest[Use local manifest]' \ | |
| '*-local-manifest-project[Respect local manifest for project]:project:_jiri_projects' \ | |
| '-override-optional[Override existing optional attributes]' \ | |
| '*-package-to-skip[Skip fetching package]:package' \ | |
| '-rebase-all[Rebase all tracked branches]' \ | |
| '-rebase-current[Deprecated. Implies -rebase-tracked]' \ | |
| '-rebase-tracked[Rebase current tracked branches]' \ | |
| '-rebase-untracked[Rebase untracked branches onto HEAD]' \ | |
| '-run-hooks[Run hooks after update]' \ | |
| '1:snapshot file or url:_files' | |
| } | |
| _jiri_upload() { | |
| _arguments \ | |
| '-branch[Multipart branch]:branch' \ | |
| '-cc[CC emails/LDAPs]:cc' \ | |
| '-git-options[Passthrough git options]:options' \ | |
| '-l[Review labels]:labels' \ | |
| '-multipart[Send multipart CL]' \ | |
| '-presubmit[Presubmit type]:type:(none all)' \ | |
| '-r[Reviewer emails/LDAPs]:reviewers' \ | |
| '-rebase[Rebase before pushing]' \ | |
| '-remoteBranch[Remote branch]:branch' \ | |
| '-set-topic[Set topic]' \ | |
| '-topic[CL topic]:topic' \ | |
| '-verify[Run pre-push git hooks]' \ | |
| '1:ref:' | |
| } | |
| _jiri | |