#!/bin/bash
##### Input :: bash git-info.sh DIR DEST [|branch|version|log]
gitdir=$1
dest=$2
mode=$3
if [ -n "$gitdir" ]; then gitdir="$(cygpath -u "$gitdir")"; fi
if [ -n "$dest" ]; then dest="$(cygpath -u "$dest")"; fi
## hier oder angegebenen Verzeichnis
if [ -n "$gitdir" ]; then
cd "$gitdir"
fi
if [ "$mode" == "log" ]; then
# Branch-References # Autor, Relative, CommitDate # Subject ## Message-Body
## HEAD -> master, origin/master, origin/HEAD
## geo, 3 days ago, 2020-04-17 22:46:58 +0200
## Formular '
DB /
SQL-Stataments durchsuchen' anpassungen (#194)
## ...
result=$(git show -s --format=format:"%D %n%an, %ar, %ci %n%s %n%n%b" | sed "s#\\n#\\r\\n#g")
else
##### Behandlung für Submodul wenn Branch nicht "richtig" auslesbar (z.B. wenn GIT SHOW nur "HEAD" ausgibt)
if [ -f ".git" ] && [ -d "../.git" ]; then
dirname=${gitdir##*/}
dirname=${dirname#(/[(]}
dirname=${dirname#)/[)]}
branch=$(git -C .. submodule | grep ".[0-9a-f]+ $dirname \\(.*\\)$")
fi
##### Branch, Version, CommitDatum und CommitLog
if [ -z "$branch" ]; then branch=$(git show -s --pretty=format:"%D"); fi
version=$(git describe --tags --always "--dirty=*")
cdate=$(git show -s --format=format:"%ci")
##### Formate konvertieren
## BranchName exrahieren :: xxx | aaa -> xxx | aaa -> xxx, yyy, zzz ==> xxx
## Hash und Version+Offset trennen :: vvv-i-gxxxxxxxx ==> yyy+i xxxxxxxx
## Datum lesbarer :: 2019-11-05T09:27:17+01:00 ==> 2019-11-05 09:27
branch=$(echo "$branch" | awk '{ print gensub(".* ?-> ?", "", "g") }')
branch=$(echo "$branch" | awk '{ print gensub("^HEAD, ?", "", "g") }')
branch=$(echo "$branch" | awk '{ print gensub(" ?,.*$", "\\1", "g") }')
version=$(echo "$version" | awk '{ print gensub("-([0-9]+)-g([0-9a-f]{8})", "+\\1 \\2", "g") }')
cdate=$(echo "$cdate" | awk '{ print gensub("([0-9]{4}-[0-9]{2}-[0-9]{2})[T ]([0-9]{2}:[0-9]{2}):[0-9]{2}([ ]?[+-][0-9]{2}:?[0-9]{2})?", "\\1 \\2", "g") }')
##### Zusatzinfo über geänderte oder neue Dateien (nicht commited)
#if [ $(git diff --stat) != '' ]; then dirty="*"; fi # modified files exists
#if [ -z $(git status -s) ]; then dirty="**"; fi # modified or untracked files exists
##### Ausgabe
if [ "$mode" == "branch" ]; then
result="$branch"
elif [ "$mode" == "version" ]; then
if [[ "$version" =~ "+" ]]; then
# 19.10.02+37 7c8c3e76*
result="$version"
else
# 7c8c3e76* 2019-11-05 09:27
result="$version $cdate"
fi
else
# master 7c8c3e76 2019-11-05 09:27 (ohne Version-Tag)
# master 19.10.02+37 7c8c3e76* 2019-11-05 09:27 (Version-Tag vorhanden)
result="$branch $version $cdate"
fi
fi
#clear
echo $result
if [ -n "$dest" ]; then
echo -n "$result" > $dest
fi