#!/bin/bash
# sys/tool/git - git support
set -e
######
# Native dependencies
sys_tool_git_client_packages=( git )
######
# Library configuration
sys_tool_git_config_init() {
lib_setting_vars git_repodir
git_repodir=/var/cache/git
lib_setting_vars git_short
git_short=false
lib_setting_vars git_porcelin
git_porcelin=false
lib_setting_vars git_push_tags
git_push_tags=false
}
######
# Internal functions
git_run() {
local -a opts
$git_porcelin && opts+=( --porcelin )
opts+=( "$@" )
run git "$@"
}
######
# git repository support
git_clone() {
has_args 2 "$@"
local url=$1
local dir=$2
git_run clone "$url" "$dir"
}
git_update() {
local dir=$1
[ -z "$dir" ] || run_pushd "$dir"
git_run pull --rebase
[ -z "$dir" ] || run_popd
}
git_clone_or_update() {
local url=$1
local dir=$2
if [ -d "$dir" ]; then
git_update "$dir"
else
git_clone "$url" "$dir"
fi
}
git_push() {
local -a opts=()
! $git_push_tags || opts+=( --tags )
git_run push "${opts[@]}" "$@"
}
######
# Working copy directories
git_repo_pushd() { has_args 1 "$@"; run_pushd "$git_repodir/$1"; }
git_repo_popd() { run_popd; }
git_repo_dir() {
local path=$PWD
while true; do
if [ -d "$path/.git" ]; then
debug "found git repo: $path"
echo "$path"
return 0
fi
if [ "$path" = "" ]; then
error "git repo not found in path"
break
fi
path=${path%/*}
done
}
git_checkout() { git_run checkout "$@"; }
git_status() { git_run status "$@"; }
git_status_new() { git_status --untracked-files normal "$@"; }
git_status_repo() { git_status --untracked-files no "$@"; }
git_status_all() { git_status --untracked-files all "$@"; }
######
# Staging functions
git_add() { git_run add "$@"; }
git_mv() {
file_mkdir "$dst"
git_run mv "$@"
}
git_reset() { git_run reset "$@"; }
git_reset_soft() { git_reset --soft "$@"; }
git_reset_hard() { git_reset --hard "$@"; }
######
# Commit functions
git_commit() { git_run commit "$@"; }
git_commit_fast() {
local git_porcelin=true
git_status
}
git_commit_drop() { git_reset_hard HEAD^; }
######
# Tag functions
git_tag() { git_run tag "$@"; }
git_tag_delete() { git_run tag -d "$@"; }
git_tag_prev() { git_run describe --tags --abbrev=0 "${1:-HEAD}^1"; }
######
# Log introspection
git_log() {
git_run log "$@"
}
git_commit_title() {
local rev=$1
git_log --oneline $rev^..$rev | cut -f2- -d' '
}
Generated on Tue Apr 25 21:21:25 PDT 2017 by mcsh i7 v0.18.0.