109 lines
2.7 KiB
Plaintext
109 lines
2.7 KiB
Plaintext
|
#!/usr/bin/env bash
|
||
|
# Summarize commit history and diff of Markdown files in the current Git repo
|
||
|
# Usage:
|
||
|
# markdown-git-changes [COMMIT [MARKDOWN_FILE]...]
|
||
|
#
|
||
|
# You can specify COMMIT as `--' to automatically see changes of given files
|
||
|
# against the upstream branch, HEAD^, or HEAD.
|
||
|
#
|
||
|
# Author: Jaeho Shin <netj@cs.stanford.edu>
|
||
|
# Created: 2013-11-18
|
||
|
set -eu
|
||
|
|
||
|
Here=$(dirname "$0")
|
||
|
PATH="$Here:$PATH" # add this directory to PATH for markdown-format-wdiff
|
||
|
|
||
|
# TODO passthru any diff options
|
||
|
|
||
|
# how to find markdown files in the current git repo
|
||
|
files=()
|
||
|
find_markdown_files() {
|
||
|
local IFS=$'\n'
|
||
|
set -- $(git ls-files | grep '\.\(md\|mkd\|markdn\|markdown\)$')
|
||
|
files=("$@")
|
||
|
}
|
||
|
|
||
|
# diff against given commit, or upstream branch, or HEAD^ if no local changes, or HEAD
|
||
|
since=--; [ $# -eq 0 ] || { since=$1; shift; }
|
||
|
if [ x"$since" = x"--" ]; then
|
||
|
find_markdown_files
|
||
|
since=`
|
||
|
git rev-parse --abbrev-ref HEAD@{upstream} 2>/dev/null ||
|
||
|
case $(git status --porcelain --untracked-files=no "${files[@]}" | wc -l) in
|
||
|
0) echo 'HEAD^' ;;
|
||
|
*) echo 'HEAD'
|
||
|
esac
|
||
|
`
|
||
|
fi
|
||
|
# unless list of files are given, find Markdown documents in the Git repo
|
||
|
if [ $# -gt 0 ]; then
|
||
|
files=("$@")
|
||
|
elif [ ${#files[@]} -eq 0 ]; then
|
||
|
find_markdown_files
|
||
|
fi
|
||
|
|
||
|
# make sure ${files[@]} isn't empty
|
||
|
[ ${#files[@]} -gt 0 ] || files+=(.)
|
||
|
|
||
|
|
||
|
# summarize commit history
|
||
|
{
|
||
|
echo "\$ git log --oneline "$since"..HEAD $*"
|
||
|
git log --oneline "$since"..HEAD "${files[@]}"
|
||
|
} |
|
||
|
sed 's/^/ /'
|
||
|
echo
|
||
|
|
||
|
# and embed the overall word diff
|
||
|
git diff ${GIT_DIFF_OPTS:-} --word-diff --patch-with-stat \
|
||
|
--minimal --patience \
|
||
|
"$since" -- "${files[@]}" |
|
||
|
sed '
|
||
|
# format prologue
|
||
|
1,/^diff /{
|
||
|
/^diff/! s/^/ /
|
||
|
}
|
||
|
|
||
|
# format file headers
|
||
|
/^diff /,/^+++ /{
|
||
|
/^diff /{
|
||
|
s|^diff .* \([^/]/\)\(.*\)|<div class="file-start"><code>\2</code></div>|
|
||
|
a\
|
||
|
\
|
||
|
|
||
|
}
|
||
|
/^<div class="file-start">/! s/^/ /
|
||
|
}
|
||
|
|
||
|
# format hunks
|
||
|
/^@@ -.* +.* @@/{
|
||
|
s| @@.*| @@|
|
||
|
s|^|<div class="hunk-start"><code>|
|
||
|
s|$|</code></div>|
|
||
|
}
|
||
|
' |
|
||
|
markdown-format-wdiff
|
||
|
echo '
|
||
|
<style>
|
||
|
pre:first-of-type { width: 78%; margin-left: auto; margin-right: auto; }
|
||
|
.file-start + p + pre,
|
||
|
.file-start + pre { margin-left: 61.8%; }
|
||
|
.file-start,
|
||
|
.hunk-start{ text-align: right; }
|
||
|
|
||
|
.file-start code{ font-size: inherit; }
|
||
|
|
||
|
.file-start/*:not(:first-of-type)*/{
|
||
|
font-size: 150%;
|
||
|
margin-top: 23.6%;
|
||
|
border-bottom: 1ex solid #ccc;
|
||
|
padding-bottom: 1ex;
|
||
|
}
|
||
|
.hunk-start{
|
||
|
margin-top: 2ex;
|
||
|
border-bottom: 1ex dashed #ccc;
|
||
|
padding-bottom: 1ex;
|
||
|
}
|
||
|
</style>
|
||
|
'
|