#:depends-on:git-get autoload -U regexp-replace GIT_DEBUG=0 GIT_CMD="`which -p git 2>/dev/null`" GTI_CMD="`which -p gti 2>/dev/null`" FWOAR_GIT_DIR=("$HOME"/git*repos) if ! [[ -d "$HOME/git*_repos" ]]; then mkdir -p "$HOME"/git_repos fi git-rb() { FW_GIT_URL=$1 FW_GIT_BRANCH="" if [[ "$2" == */* ]]; then FW_GIT_REF="$2" else FW_GIT_BRANCH=$2 FW_GIT_REF=refs/heads/"$FW_GIT_BRANCH" fi read -A results < <( git ls-remote "$FW_GIT_URL" "$2" | tr '\n' '\t') for (( idx=1; idx < ${#results}; idx += 2 )); do jq -n --arg url "$FW_GIT_URL" \ --arg branch "$FW_GIT_BRANCH" \ --arg hash "$results[$idx]" \ --arg ref "$results[$((idx+1))]" \ '{hash: $hash, ref: $ref, url: $url, branch: $branch}' done } git-pwdurl () { set -x local -a parts parts=(${(s:/:)PWD}) repo_root=${parts[(I)git_repos]} site_idx=$((repo_root + 1)) repo_idx=$((repo_root + 2)) repo=${(j:/:)parts[$repo_idx,-1]} site=${parts[$site_idx]} case "$1" in git) echo "git://$site:$repo.git" ;; ssh) echo git@$site:$repo.git ;; *) echo https://$site/$repo.git ;; esac } git-cpwd () { git clone --recursive "$(git-pwdurl "$1")" . } git-fp() { $(pbpaste | grep git\ push) } git-bump() { git commit -m "${SITE_PREFIX:-}(bump)" --allow-empty } git-update-repos() { find . -name .git | ( while read -r repo; do printf "---\n$repo\n"; git --work-tree="${repo%/*}" --git-dir="$repo" pull --ff-only ; printf "\n\n" done ) } git-ub() { git stash || exit 1 git pull --rebase git stash pop } git-ufgrep() { PATTERN="$1" if [[ ${PATTERN}x == ""x ]]; then PATTERN='.*' fi PATTERN="${PATTERN//\//\\/}" if [[ "$GIT_DEBUG" == 1 ]]; then echo "$PATTERN" fi git status --porcelain | awk '$1 == "??" && $2 ~ /[.]'"$PATTERN"'$/' } git-run() { ( DIR="$1" shift git cd "$DIR" exec "$@" ) } git-back() { git checkout - } git-ff() { git merge --ff-only } git-pff() { git pull --ff-only } git-root() { rootpath="$(git rev-parse --show-toplevel)" echo "$rootpath/$1" } git-ag() { ag "$@" -- "$(git-root)" } git-cd() { cd "$(git-root)/$1" } alias groot=git-cd git-graph() { git log --graph --format=oneline --decorate "$@" } alias gl=git-graph git-find-tag() { git log --format=oneline --all | gawk -vtofind="$*" -vFS=$'[ ]+|:[ ]*' \ 'tolower($2) == "code" {$2=$2" "$3; for (i=3;i<NF;i++) $i=$(i+1); $NF=""} \ {code=$2; hash=$1; for (i=1;i<=NF-2;i++) $i=$(i+2); NF=NF-2} \ code ~ tofind {print code": "hash" "$0}' } git-messages() { if [[ -d .git ]]; then echo "Git log messages:" git log -n 5 | egrep --color=yes -Io '(TODO|NOTE|FIXME|BUG|DONE):.*$' fi echo "Messages from files:" egrep --color=yes -IHnro '(TODO|NOTE|FIXME|BUG):.*$' . | psc ' for line in sys.stdin: line = line.strip().split(":", 2) print("%s\n\t%s" % (":".join(line[2:]), ":".join(line[:2])))' } git-gh-create() { local organization_name=${1?need a repo name or org/repo pair} local repo_name=${2:-$organization_name} local api_url=https://api.github.com/user/repos if (( $# == 2 )) { api_url="https://api.github.com/orgs/$organization_name/repos" } regexp-replace repo_name '[" ]' '-' local GH_TOKEN source "$HOME/.github-token" jq '{full_name, clone_url, ssh_url}' <( ( curl -XPOST -v \ -u "fiddlerwoaroof:$GH_TOKEN" \ "$api_url" \ -H 'Content-Type: application/json' \ --data-binary @- <<-EOF { "name": "${repo_name}" } EOF ) ) } alias git-msg=git-messages alias git-cj="git-get cj" alias git-hub="git-get github" alias git-lab="git-get gitlab" alias gh="git-hub" if [[ ! -z "$GIT_CMD" ]]; then # git wrapper that mimics the functionality of git for commandlets but also # searches shell functions. git() { local possible_cmd local cmdlets possible_cmd="${${$(expand-alias "git-$1")#'}%'}" printf "%s" "$possible_cmd" | read -A cmdlets if [[ "$GIT_DEBUG" != "0" ]]; then echo "git: looking for: \"$possible_cmd\" command: \"${cmdlets[1]}\"" fi if is-function "${cmdlets[1]}"; then "${cmdlets[@]}" "${@[2,-1]}" else "$GIT_CMD" "$@" fi } fi cr() { cd "$(fzf --preview='git --git-dir={1}/.git --work-tree={1} status' < "$HOME"/.git_repos)" }