#!/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' '
}

View the Script Reference Index


Generated on Tue Apr 25 21:21:25 PDT 2017 by mcsh i7 v0.18.0.