0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 1) #!/usr/bin/env bash 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 2) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 3) # Licence: LGPLv2 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 4) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 5) out_dir="html_history_listing" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 6) git_dir="." 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 7) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 8) function Help() e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 9) { e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 10) if [[ $1 != "" ]]; then e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 11) echo "Error: $*" e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 12) fi e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 13) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 14) cat <<EOF e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 15) Usage: $0 -g <git_repo_directory> -o <html_output_directory> [-v] [-h] e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 16) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 17) A shell script for producing a nice html listing for the history of each file. e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 18) The script creates a index.html file that contains a link per html file in given git repository. e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 19) Each linked html file contains the change log for one file contained in the repository. e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 20) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 21) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 22) EOF e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 23) exit 1 e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 24) } e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 25) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 26) while getopts "hg:o:" opt; do e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 27) case ${opt} in e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 28) h) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 29) Help e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 30) ;; e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 31) g) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 32) git_dir=$OPTARG e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 33) ;; e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 34) o) 68e600ab (MoserMichael 2025-11-20 08:26:00 +0200 35) out_dir=$OPTARG e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 36) ;; e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 37) v) 68e600ab (MoserMichael 2025-11-20 08:26:00 +0200 38) set -x 68e600ab (MoserMichael 2025-11-20 08:26:00 +0200 39) export PS4='+(${BASH_SOURCE}:${LINENO})' 68e600ab (MoserMichael 2025-11-20 08:26:00 +0200 40) VERBOSE=1 e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 41) ;; e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 42) *) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 43) Help "Invalid option" e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 44) ;; e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 45) esac e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 46) done 1aba1075 (MoserMichael 2025-11-20 07:23:47 +0200 47) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 48) out_dir=$(realpath "${out_dir}") 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 49) git_dir=$(realpath "${git_dir}") 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 50) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 51) if [[ ! -d "$git_dir" ]]; then e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 52) Help "git repo directory ${git_dir} does not exist" e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 53) fi e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 54) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 55) script_dir=$(dirname $0) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 56) script_dir=$(realpath "${script_dir}") 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 57) html_index="" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 58) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 59) #if [[ -d "$out_dir" ]]; then 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 60) # rm -rf "$out_dir" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 61) #fi 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 62) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 63) cat <<EOF e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 64) ** building html listing ** e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 65) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 66) For repository directory: ${git_dir} e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 67) html listing directory: ${out_dir} e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 68) e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 69) EOF e2781be8 (MoserMichael 2025-11-20 07:42:31 +0200 70) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 71) mkdir -p "$out_dir" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 72) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 73) pushd "$git_dir" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 74) 568c0ac6 (MoserMichael 2025-11-20 08:29:50 +0200 75) origin_url=$(git config --get remote.origin.url) 568c0ac6 (MoserMichael 2025-11-20 08:29:50 +0200 76) html_prefix="<html><body><h2>History listing for git repository: ${origin_url}</h2><ul>" 568c0ac6 (MoserMichael 2025-11-20 08:29:50 +0200 77) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 78) for f in $(git ls-files); do 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 79) echo "Processing $f" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 80) out_file="$out_dir/$f" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 81) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 82) dname=$(dirname "$out_file") 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 83) mkdir -p "$dname" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 84) 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 85) #link_name=${f} 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 86) link_path="${f}.html" 1aba1075 (MoserMichael 2025-11-20 07:23:47 +0200 87) out_html_path="${out_file}.html" 1aba1075 (MoserMichael 2025-11-20 07:23:47 +0200 88) 1aba1075 (MoserMichael 2025-11-20 07:23:47 +0200 89) echo "<html><body><h2>History listing for file: ${f}</h2>" >${out_html_path} 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 90) 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 91) git log --color=always --follow --pretty=fuller -p --ignore-cr-at-eol --raw ${f} | ${script_dir}/ansi2html.sh | sed -E 's/^<span class="f3">commit (([0-9a-f]{8})[0-9a-f]+)<\/span>/<span class="f3"><a name="\2"\/>commit \1<\/span>/' >${out_html_path} 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 92) 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 93) blame_link_path="${f}.blame.html" 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 94) out_blame_html_path="${out_file}.blame.html" 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 95) ba16ef1f (MoserMichael 2026-01-06 07:55:37 +0200 96) cross_link_path=$(basename "${link_path}") ba16ef1f (MoserMichael 2026-01-06 07:55:37 +0200 97) 089c1ca9 (MoserMichael 2026-01-06 08:20:32 +0200 98) #git blame --color-lines ${f} | ${script_dir}/ansi2html.sh >${out_blame_html_path} 089c1ca9 (MoserMichael 2026-01-06 08:20:32 +0200 99) 089c1ca9 (MoserMichael 2026-01-06 08:20:32 +0200 100) git blame --root --color-lines ${f} | ${script_dir}/ansi2html.sh | sed -E "s@^<span class=\"f([0-9]+)\">([0-9a-f]+)@<span class=\"f\1\"><a href=\"${cross_link_path}#\2\">\2</a>@" | sed -E "s@^([0-9a-f]+)@<a href=\"${cross_link_path}#\1\">\1</a>@" >${out_blame_html_path} 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 101) 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 102) html_index="${html_index}<li> ${f} <a href=\"${link_path}\">Log</a> <a href=\"${blame_link_path}\">Blame</a> " 451c3912 (MoserMichael 2026-01-06 07:41:14 +0200 103) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 104) done 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 105) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 106) echo "${html_prefix}${html_index}" >${out_dir}/index.html 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 107) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 108) 0e6c62ee (MoserMichael 2025-11-20 07:17:15 +0200 109)