if type brew &>/dev/null; then FPATH=$(brew --prefix)/share/zsh-completions:$FPATH autoload -Uz compinit compinit fi #compdef gt ###-begin-gt-completions-### # # yargs command completion script # # Installation: gt completion >> ~/.zshrc # or gt completion >> ~/.zprofile on OSX. # _gt_yargs_completions() { local reply local si=$IFS IFS=$' ' reply=($(COMP_CWORD="$((CURRENT-1))" COMP_LINE="$BUFFER" COMP_POINT="$CURSOR" gt --get-yargs-completions "${words[@]}")) IFS=$si _describe 'values' reply } compdef _gt_yargs_completions gt ###-end-gt-completions-### # gh completions fpath=($HOME/.zsh/completions $fpath) autoload -Uz compinit compinit # Determine defaultBranch once per repo, store it if not set get_default_branch() { local branch branch=$(git config --get bakert.defaultBranch 2>/dev/null) if [[ -z "$branch" ]]; then branch=$(git remote show origin 2>/dev/null | awk '/HEAD branch/ {print $NF}') branch=${branch:-master} git config --local bakert.defaultBranch "$branch" echo "Set bakert.defaultBranch to '$branch' in local git config" >&2 fi echo "$branch" } # Perform an operation that might fail if the current branch is implicated in a way that won't fail # Leaves you on default branch after if your current branch ceased to exist. with_default_branch() { local current_branch=$(git rev-parse --abbrev-ref HEAD) local default_branch=$(get_default_branch) if [[ "$current_branch" != "$default_branch" ]]; then git switch "$default_branch" fi "$@" if [[ "$current_branch" != "$default_branch" ]] && git show-ref --verify --quiet "refs/heads/$current_branch"; then git switch "$current_branch" fi } ## Functions not aliases to allow completions ga() { git add "$@"; }; compdef _git ga=git-add gaa() { git add . "$@"; }; compdef _git gaa=git-add # Equivlent to `git add !$` gal() { emulate -L zsh setopt noglob local cmd last cmd=$(fc -ln -1) || return 1 local -a words words=(${(z)cmd}) (( ${#words} )) || { echo "No history."; return 1; } last=${words[-1]} last=${(Q)last} # remove surrounding quotes if any # Expand ~ / ~user without enabling globbing if [[ $last == "~"* ]]; then last=${~last} fi [[ -n $last ]] || { echo "No last arg."; return 1; } git add -- "$last" }; compdef _git gal=git-add gap() { git add -p "$@"; }; compdef _git gap=git-add gb() { git branch "$@"; }; compdef _git gb=git-branch gbd() { with_default_branch git branch -D "$@"; }; compdef _git gbd=git-branch gbl() { git blame "$@"; }; compdef _git gbl=git-blame gc() { git commit "$@"; }; compdef _git gc=git-commit gca() { git commit --amend "$@"; }; compdef _git gca=git-commit gcae() { git commit --amend --no-edit "$@"; }; compdef _git gcae=git-commit gcan() { git commit --amend -n "$@"; }; compdef _git gcan=git-commit gcane() { git commit --amend -n --no-edit "$@"; }; compdef _git gcane=git-commit gclb() { gpru && gded }; compdef _git gclb=git-branch gclfd() { git clean -fd "$@" }; compdef _git gclfd=git-clean gcp() { git cherry-pick "$@" }; compdef _git gcp=git-cherry-pick gcpa() { git cherry-pick --abort "$@" }; compdef _git gcpa=git-cherry-pick gcpc() { git cherry-pick --continue "$@" }; compdef _git gcpa=git-cherry-pick glc() { git clone "$@"; }; compdef _git glc=git-clone gcm() { git commit -m "$@"; }; compdef _git gcm=git-commit gcn() { git commit -n "$@"; }; compdef _git gcn=git-commit gco() { git checkout "$@"; }; compdef _git gco=git-checkout gd() { git diff "$@"; }; compdef _git gd=git-diff gdc() { git diff --cached "$@"; }; compdef _git gdc=git-diff gdd() { git diff $(get_default_branch) "$@"; }; compdef _git gdd=git-diff # Delete all local branches that don't have changes not already in default branch gded() { local default_branch=$(get_default_branch) for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do if [[ "$branch" != "$default_branch" ]]; then local count=$(git rev-list --count "$branch" --not "$default_branch") if [[ "$count" -eq 0 ]]; then echo "Deleting branch: $branch" git branch -D "$branch" fi fi done } gfo() { git fetch origin $(get_default_branch):$(get_default_branch) "$@"; }; compdef _git gfo=git-fetch # Make a gist, guessing exactly what you want a gist of based on state of repo gg() { local target=$1 local desc="" local filename="" local url="" if [[ -z $target ]]; then if [[ -n $(git status --porcelain) ]]; then desc="Working copy diff" filename="working.diff" url=$((git diff HEAD && git ls-files --others --exclude-standard | xargs -I {} git diff /dev/null {}) | gh gist create -f "$filename" -d "$desc" - | tail -n1) else desc="Top commit diff (HEAD)" filename="head.diff" url=$(git show HEAD | gh gist create -f "$filename" -d "$desc" - | tail -n1) fi elif [[ $target == "develop" ]]; then desc="Diff from develop" filename="develop.diff" url=$(git diff develop...HEAD | gh gist create -f "$filename" -d "$desc" - | tail -n1) else desc="Diff of $target" filename="$target.diff" url=$(git diff "$target...HEAD" | gh gist create -f "$filename" -d "$desc" - | tail -n1) fi echo "$url" open "$url" }; compdef _git gg=git-show # Make a gist of the difference between working copy and default branch ggd() { gg "$(get_default_branch)"; }; compdef _git ggd=git-show gl() { git log "$@"; }; compdef _git gl=git-log # Pretty one-liner log glp() { local git_args=() if [[ $1 =~ ^-[0-9]+$ ]] || [[ $1 =~ ^--max-count=[0-9]+$ ]] || [[ $1 =~ ^-n$ && $2 =~ ^[0-9]+$ ]]; then git_args=("$@") else git_args=("$@") fi git log --pretty="tformat:$FORMAT" "${git_args[@]}" | column -t -s '{' | less -XRS --quit-if-one-screen }; compdef _git glp=git-log gm() { git mv "$@"; }; compdef _git gm=git-mv gp() { git pull "$@"; }; compdef _git gp=git-pull gpf() { git push --force-with-lease "$@"; }; compdef _git gpf=git-push gpr() { gh pr create "$@"; }; compdef _gh gpr=gh-pr gprb() { gh pr create -B "$@"; }; compdef _gh gprb=gh-pr gprd() { gh pr create -d "$@"; }; compdef _gh gprd=gh-pr gprdb() { gh pr create -d -B "$@"; }; compdef _gh gprdb=gh-pr # Remove local branches that aren't on remote any more gpru() { cleanup_gone_branches() { git remote update origin --prune local gone_branches=$(git branch -vvv | grep gone | cut -d' ' -f3) if [[ -n "$gone_branches" ]]; then echo "$gone_branches" | xargs -I{} git branch -D '{}' fi } with_default_branch cleanup_gone_branches } gpso() { git push --set-upstream origin "${@:-$(git branch --show-current)}"; }; compdef _git gpso=git-push grb() { git rebase "$@"; }; compdef _git grb=git-rebase grba() { git rebase --abort "$@"; }; compdef _git grba=git-rebase grbc() { git rebase --continue "$@"; }; compdef _git grbc=git-rebase grbd() { git rebase $(get_default_branch) "$@"; }; compdef _git grbd=git-rebase grbdo() { gfo && git rebase $(get_default_branch) "$@"; }; compdef _git grbd=git-rebase grbi() { git rebase -i $(get_default_branch) "$@"; }; compdef _git grbi=git-rebase grl() { git reflog "$@"; }; compdef _git grl=git-reflog grs() { git reset "$@"; }; compdef _git grs=git-reset grsh1() { git reset HEAD~1 "$@"; }; compdef _git grsh1=git-reset grsh2() { git reset HEAD~2 "$@"; }; compdef _git grsh2=git-reset grsh3() { git reset HEAD~3 "$@"; }; compdef _git grsh3=git-reset grsh4() { git reset HEAD~4 "$@"; }; compdef _git grsh4=git-reset grsh5() { git reset HEAD~5 "$@"; }; compdef _git grsh5=git-reset grsh6() { git reset HEAD~6 "$@"; }; compdef _git grsh6=git-reset grsh7() { git reset HEAD~7 "$@"; }; compdef _git grsh7=git-reset grsh8() { git reset HEAD~8 "$@"; }; compdef _git grsh8=git-reset grsh9() { git reset HEAD~8 "$@"; }; compdef _git grsh9=git-reset grt() { git restore "$@"; }; compdef _git grt=git-restore grta() { git restore . "$@"; }; compdef _git grt=git-restore grts() { git restore --staged "$@"; }; compdef _git grt=git-restore grtsa() { git restore --staged . "$@"; }; compdef _git grt=git-restore grm() { git rm "$@"; }; compdef _git grm=git-rm gs() { git status "$@"; }; compdef _git gs=git-status gsh() { git show "$@"; }; compdef _git gsh=git-show gshn() { git show --name-only "$@"; }; compdef _git gsh=git-show gst() { git stash "$@"; }; compdef _git gst=git-stash gstd() { git stash drop "$@"; }; compdef _git gstd=git-stash gstl() { git stash list "$@"; }; compdef _git gstl=git-stash gstp() { git stash pop "$@"; }; compdef _git gstp=git-stash gsts() { git stash show -p "$@"; }; compdef _git gsts=git-stash gstu() { git stash -u "$@"; }; compdef _git gstu=git-stash gsw() { git switch "$@"; }; compdef _git gsw=git-switch gswc() { git switch -c "$@"; }; compdef _git gswc=git-switch gswcd() { git switch -c "$1" $(get_default_branch); }; compdef _git gswcd=git-switch gswd() { git switch $(get_default_branch); }; compdef _git gswd=git-switch gswp() { git switch - "$@"; }; compdef _git gswd=git-switch gtc() { gt create "$@"; } gtl() { gt log "$@"; } gtm() { gt move "$@"; } gtr() { gt restack "$@"; } gts() { gt submit "$@"; } gtsy() { gt sync "$@"; } gtt() { gt track "$@"; } alias gwip='git add . && git commit -m "WIP" -n'