Merge pull request #1816 from tbhaxor/lint/git-plugins

Lint/git plugins
pull/1832/head
Noah Gorny 2021-02-06 00:31:41 +02:00 committed by GitHub
commit fe9ef1e4bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 252 additions and 209 deletions

View File

@ -50,6 +50,7 @@ themes/modern
plugins/available/basher.plugin.bash plugins/available/basher.plugin.bash
plugins/available/cmd-returned-notify.plugin.bash plugins/available/cmd-returned-notify.plugin.bash
plugins/available/docker-machine.plugin.bash plugins/available/docker-machine.plugin.bash
plugins/available/git.plugin.bash
plugins/available/go.plugin.bash plugins/available/go.plugin.bash
plugins/available/goenv.plugin.bash plugins/available/goenv.plugin.bash
plugins/available/history.plugin.bash plugins/available/history.plugin.bash

View File

@ -1,12 +1,13 @@
# shellcheck shell=bash
cite about-plugin cite about-plugin
about-plugin 'git helper functions' about-plugin 'git helper functions'
function git_remote { function git_remote {
about 'adds remote $GIT_HOSTING:$1 to current repo' about "adds remote $GIT_HOSTING:$1 to current repo"
group 'git' group "git"
echo "Running: git remote add origin ${GIT_HOSTING}:$1.git" echo "Running: git remote add origin ${GIT_HOSTING}:$1.git"
git remote add origin $GIT_HOSTING:$1.git git remote add origin "$GIT_HOSTING:$1".git
} }
function git_first_push { function git_first_push {
@ -23,15 +24,15 @@ function git_pub() {
BRANCH=$(git rev-parse --abbrev-ref HEAD) BRANCH=$(git rev-parse --abbrev-ref HEAD)
echo "Publishing ${BRANCH} to remote origin" echo "Publishing ${BRANCH} to remote origin"
git push -u origin $BRANCH git push -u origin "$BRANCH"
} }
function git_revert() { function git_revert() {
about 'applies changes to HEAD that revert all changes after this commit' about 'applies changes to HEAD that revert all changes after this commit'
group 'git' group 'git'
git reset $1 git reset "$1"
git reset --soft HEAD@{1} git reset --soft "HEAD@{1}"
git commit -m "Revert to ${1}" git commit -m "Revert to ${1}"
git reset --hard git reset --hard
} }
@ -48,7 +49,7 @@ function git_rollback() {
} }
function commit_exists() { function commit_exists() {
git rev-list --quiet $1 git rev-list --quiet "$1"
status=$? status=$?
if [ $status -ne 0 ]; then if [ $status -ne 0 ]; then
echo "Commit ${1} does not exist" echo "Commit ${1} does not exist"
@ -57,38 +58,39 @@ function git_rollback() {
} }
function keep_changes() { function keep_changes() {
while true while true; do
do # shellcheck disable=SC2162
read -p "Do you want to keep all changes from rolled back revisions in your working tree? [Y/N]" RESP read -p "Do you want to keep all changes from rolled back revisions in your working tree? [Y/N]" RESP
case $RESP case $RESP in
in
[yY]) [yY])
echo "Rolling back to commit ${1} with unstaged changes" echo "Rolling back to commit ${1} with unstaged changes"
git reset $1 git reset "$1"
break break
;; ;;
[nN]) [nN])
echo "Rolling back to commit ${1} with a clean working tree" echo "Rolling back to commit ${1} with a clean working tree"
git reset --hard $1 git reset --hard "$1"
break break
;; ;;
*) *)
echo "Please enter Y or N" echo "Please enter Y or N"
;;
esac esac
done done
} }
if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then
is_clean is_clean
commit_exists $1 commit_exists "$1"
while true while true; do
do # shellcheck disable=SC2162
read -p "WARNING: This will change your history and move the current HEAD back to commit ${1}, continue? [Y/N]" RESP read -p "WARNING: This will change your history and move the current HEAD back to commit ${1}, continue? [Y/N]" RESP
case $RESP case $RESP in
in
[yY]) [yY])
keep_changes $1 keep_changes "$1"
break break
;; ;;
[nN]) [nN])
@ -96,6 +98,7 @@ function git_rollback() {
;; ;;
*) *)
echo "Please enter Y or N" echo "Please enter Y or N"
;;
esac esac
done done
else else
@ -131,8 +134,8 @@ function git_info() {
# print all remotes and thier details # print all remotes and thier details
for remote in $(git remote show); do for remote in $(git remote show); do
echo $remote: echo "$remote":
git remote show $remote git remote show "$remote"
echo echo
done done
@ -160,13 +163,13 @@ function git_stats {
about 'display stats per author' about 'display stats per author'
group 'git' group 'git'
# awesome work from https://github.com/esc/git-stats # awesome work from https://github.com/esc/git-stats
# including some modifications # including some modifications
if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then
echo "Number of commits per author:" echo "Number of commits per author:"
git --no-pager shortlog -sn --all git --no-pager shortlog -sn --all
AUTHORS=$( git shortlog -sn --all | cut -f2 | cut -f1 -d' ') AUTHORS=$(git shortlog -sn --all | cut -f2 | cut -f1 -d' ')
LOGOPTS="" LOGOPTS=""
if [ "$1" == '-w' ]; then if [ "$1" == '-w' ]; then
LOGOPTS="$LOGOPTS -w" LOGOPTS="$LOGOPTS -w"
@ -180,22 +183,25 @@ if [ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]; then
LOGOPTS="$LOGOPTS -C --find-copies-harder" LOGOPTS="$LOGOPTS -C --find-copies-harder"
shift shift
fi fi
for a in $AUTHORS for a in $AUTHORS; do
do
echo '-------------------' echo '-------------------'
echo "Statistics for: $a" echo "Statistics for: $a"
echo -n "Number of files changed: " echo -n "Number of files changed: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f3 | sort -iu | wc -l # shellcheck disable=SC2086
git log $LOGOPTS --all --numstat --format="%n" --author="$a" | cut -f3 | sort -iu | wc -l
echo -n "Number of lines added: " echo -n "Number of lines added: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f1 | awk '{s+=$1} END {print s}' # shellcheck disable=SC2086
git log $LOGOPTS --all --numstat --format="%n" --author="$a" | cut -f1 | awk '{s+=$1} END {print s}'
echo -n "Number of lines deleted: " echo -n "Number of lines deleted: "
git log $LOGOPTS --all --numstat --format="%n" --author=$a | cut -f2 | awk '{s+=$1} END {print s}' # shellcheck disable=SC2086
git log $LOGOPTS --all --numstat --format="%n" --author="$a" | cut -f2 | awk '{s+=$1} END {print s}'
echo -n "Number of merges: " echo -n "Number of merges: "
git log $LOGOPTS --all --merges --author=$a | grep -c '^commit' # shellcheck disable=SC2086
git log $LOGOPTS --all --merges --author="$a" | grep -c '^commit'
done done
else else
echo "you're currently not in a git repository" echo "you're currently not in a git repository"
fi fi
} }
function gittowork() { function gittowork() {
@ -204,7 +210,7 @@ function gittowork() {
param '1: the language/type of the project, used for determining the contents of the .gitignore file' param '1: the language/type of the project, used for determining the contents of the .gitignore file'
example '$ gittowork java' example '$ gittowork java'
result=$(curl -L "https://www.gitignore.io/api/$1" 2>/dev/null) result=$(curl -L "https://www.gitignore.io/api/$1" 2> /dev/null)
if [[ $result =~ ERROR ]]; then if [[ $result =~ ERROR ]]; then
echo "Query '$1' has no match. See a list of possible queries with 'gittowork list'" echo "Query '$1' has no match. See a list of possible queries with 'gittowork list'"
@ -212,7 +218,7 @@ function gittowork() {
echo "$result" echo "$result"
else else
if [[ -f .gitignore ]]; then if [[ -f .gitignore ]]; then
result=`echo "$result" | grep -v "# Created by http://www.gitignore.io"` result=$(echo "$result" | grep -v "# Created by http://www.gitignore.io")
echo ".gitignore already exists, appending..." echo ".gitignore already exists, appending..."
echo "$result" >> .gitignore echo "$result" >> .gitignore
else else
@ -237,24 +243,21 @@ function gitignore-reload() {
err=0 err=0
# Disallow unstaged changes in the working tree # Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules -- if ! git diff-files --quiet --ignore-submodules --; then
then
echo >&2 "ERROR: Cannot reload .gitignore: Your index contains unstaged changes." echo >&2 "ERROR: Cannot reload .gitignore: Your index contains unstaged changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2 git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1 err=1
fi fi
# Disallow uncommited changes in the index # Disallow uncommited changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules if ! git diff-index --cached --quiet HEAD --ignore-submodules; then
then
echo >&2 "ERROR: Cannot reload .gitignore: Your index contains uncommited changes." echo >&2 "ERROR: Cannot reload .gitignore: Your index contains uncommited changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2 git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1 err=1
fi fi
# Prompt user to commit or stash changes and exit # Prompt user to commit or stash changes and exit
if [ $err = 1 ] if [ $err = 1 ]; then
then
echo >&2 "Please commit or stash them." echo >&2 "Please commit or stash them."
fi fi
@ -273,3 +276,42 @@ function gitignore-reload() {
echo >&2 "Files readded. Commit your new changes now." echo >&2 "Files readded. Commit your new changes now."
fi fi
} }
function git-changelog() {
# ---------------------------------------------------------------
# ORIGINAL ANSWER: https://stackoverflow.com/a/2979587/10362396 |
# ---------------------------------------------------------------
about 'Creates the git changelog from one point to another by date'
group 'git'
example '$ git-changelog origin/master...origin/release [md|txt]'
if [[ "$1" != *"..."* ]]; then
echo "Please include the valid 'diff' to make changelog"
return 1
fi
local NEXT=$(date +%F)
if [[ "$2" == "md" ]]; then
echo "# CHANGELOG $1"
# shellcheck disable=SC2162
git log "$1" --no-merges --format="%cd" --date=short | sort -u -r | while read DATE; do
echo
echo "### $DATE"
git log --no-merges --format=" * (%h) %s by [%an](mailto:%ae)" --since="$DATE 00:00:00" --until="$DATE 24:00:00"
NEXT=$DATE
done
else
echo "CHANGELOG $1"
echo ----------------------
# shellcheck disable=SC2162
git log "$1" --no-merges --format="%cd" --date=short | sort -u -r | while read DATE; do
echo
echo [$DATE]
git log --no-merges --format=" * (%h) %s by %an <%ae>" --since="$DATE 00:00:00" --until="$DATE 24:00:00"
NEXT=$DATE
done
fi
}