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>&nbsp;<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)