nix/home/program/bash/module/Git.nix

288 lines
6 KiB
Nix

{ ... }: {
text = ''
# Git push.
function gps() {
git push "''${@}"
}
# Git push all (branches). Useful for pushing all stuff to a new remote.
function gpsa() {
local remotes=($(git remote))
for remote in ''${remotes[@]}; do
echo -n "''${remote}: "
git push "''${remote}" --tags "refs/remotes/origin/*:refs/heads/*"
done
}
# Git force push.
function gpsf() {
git push --force "''${@}"
}
# Git pull.
function gpl() {
git pull "''${@}"
}
# Git log.
function gl() {
git log --show-signature "''${@}"
}
# Git status.
function gs() {
git status "''${@}"
}
# Git stash.
function gst() {
git stash "''${@}"
}
# Git diff.
function gd() {
git diff "''${@}"
}
# Git diff added.
function gda() {
git diff --cached "''${@}"
}
# Git commit.
function gc() {
git commit -m "''${@}"
}
# Git clone (lazy!).
function gcl() {
git clone --filter tree:0 "''${@}"
}
# Git signed commit.
function gcs() {
git commit -S -m "''${@}"
}
# Git checkout.
function gch() {
git checkout "''${@}"
}
# Git checkout branch.
# Usage: gchb <BRANCH>
function gchb() {
git checkout -b "''${@}"
}
# Git branch.
function gb() {
git branch --all "''${@}"
}
# Git branch delete.
# Usage: gbd <BRANCH>
function gbd() {
git branch -D "''${@}"
}
# Git branch delete all except current.
function gbda() {
git branch | grep -v ^* | xargs git branch -D
}
# Git fetch all.
function gf() {
git fetch --all -v -p
}
# Git tag.
function gt() {
git tag "''${@}"
}
# Git ignore files.
function gi() {
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
}
# Git patch create.
# Usage: gpc <FILE>
function gpc() {
git diff --cached --binary > "''${@}"
}
# Git patch (apply).
# Usage: gp <FILE>
function gp() {
git apply "''${@}"
}
# Run git garbage collection.
function ggc() {
git gc --aggressive --no-cruft --prune=now
}
# Preview diff while adding. Adds current dir by default.
# Usage: ga [FILES]
function ga() {
local target=''${@}
if [[ "''${target}" = "" ]]; then
target="."
fi
git diff ''${target}
git add ''${target}
}
# Rebase by X commits or from root. When COUNT is 0 - rebase from root. Default is 2.
# Usage: gr [COMMIT COUNT]
function gr() {
local base="''${1}"
# Rebase last 2 commits by default.
if [[ "''${base}" = "" ]]; then
base="2"
fi
# If 0, rebase from root. else from specified base.
if [[ "''${base}" = "0" ]]; then
git rebase -i --root
else
git rebase -i HEAD~''${base}
fi
}
# Specify git user as Dmitry Voronin with provided email.
# Usage: gu [EMAIL]
function gu() {
local name="Dmitry Voronin"
local email="''${1}"
if [[ "''${name}" = "" || "''${email}" = "" ]]; then
echo "usage: gu [EMAIL]"
return 2
fi
git config user.name "''${name}"
git config user.email "''${email}"
}
# Get my git repo.
# Usage: gg <REPO>
function gg() {
local repo="''${1}"
if [[ "''${repo}" = "" ]]; then
help gg
return 2
fi
git clone https://git.voronind.com/voronind/"''${repo}"
}
# See diff for a specific commit. Last commit by default.
# Usage: gdc [COMMITHASH]
function gdc() {
local hash="''${1}"
[[ "''${hash}" = "" ]] && hash="HEAD"
git diff "''${hash}^!"
}
# Get version number based on commit count.
function gv() {
git rev-list HEAD --count
}
# Open the remote web url in default browser.
# Usage: gw [REMOTE]
function gw() {
local remote="''${1}"
[[ "''${remote}" = "" ]] && remote="$(git remote | head -n1)"
local url="$(git remote get-url ''${remote})"
open "''${url}"
}
# Sign the old commits. 0 to resign from root.
# Usage: git_sign [COMMIT_COUNT]
function git_sign() {
local base="''${1}"
# Resign last commit by default.
if [[ "''${base}" = "" ]]; then
base="1"
fi
# If 0, rebase from root. else from specified base.
if [[ "''${base}" = "0" ]]; then
git rebase --exec 'git commit --amend --no-edit -n -S' -i --root
else
git rebase --exec 'git commit --amend --no-edit -n -S' -i HEAD~''${base}
fi
}
# Show current branch.
function _git_current_branch() {
git branch --show-current 2> /dev/null
}
# Show origin's url.
function _git_origin_url() {
git remote get-url origin
}
# Get this dotfiles url.
function _git_dotfiles_url() {
echo 'https://git.voronind.com/voronind/linux.git'
}
# Check if current git repo is this dotfiles.
function _git_is_dotfiles() {
# [[ "$(_git_origin_url)" = "$(_git_dotfiles_url)" ]]
local dir="''${PWD}"
while [[ "''${dir}" != "" ]]; do
if [[ -d "''${dir}/.git" ]]; then
if [[ "''${dir}" = "''${HOME}" ]] || [[ "''${dir}" = "$(realpath ''${HOME})" ]]; then
return 0
else
return 1
fi
fi
dir="''${dir%/*}"
done
}
# Autocomplete.
_completion_loader git &> /dev/null
__git_complete gps _git_push &> /dev/null
__git_complete gpsf _git_push &> /dev/null
__git_complete gpl _git_pull &> /dev/null
__git_complete gl _git_log &> /dev/null
__git_complete gs _git_status &> /dev/null
__git_complete gst _git_stash &> /dev/null
__git_complete gd _git_diff &> /dev/null
__git_complete gdc _git_diff &> /dev/null
__git_complete gc _git_commit &> /dev/null
__git_complete gch _git_checkout &> /dev/null
__git_complete gchb _git_checkout &> /dev/null
__git_complete gb _git_branch &> /dev/null
__git_complete gbd _git_branch &> /dev/null
__git_complete gf _git_fetch &> /dev/null
__git_complete gt _git_tag &> /dev/null
__git_complete gp _git_apply &> /dev/null
__git_complete ga _git_add &> /dev/null
__git_complete gw _git_pull &> /dev/null
# Autocomplete with my git emails.
function _gu() {
_autocomplete_first hi@voronind.com dd.voronin@fsight.ru
}
complete -F _gu gu
'';
}