aboutsummaryrefslogtreecommitdiffstats
path: root/src/extract.sh
blob: ce5c4d0acb7f4a83332baaf05ea87dd9ace11b50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/usr/bin/env bash

set -efu

input_dir=${1-$PWD}

find "$input_dir" -type f | grep -Pv '/\.|~$' |
  while read -r input_file; do
    # TODO Add support for all tree-grepper supported files
    #
    # tree-grepper supported files can be listed through `tree-grepper
    # --languages`.
    ext=
    case $input_file in
      *.elm) ext="elm" ;;
      *.nix) ext="nix" ;;
      *) ;;
    esac

    if test -z $ext; then
      echo "warning, file $input_file ignored" >&2
      continue
    fi

    "$(dirname "$0")"/extract-$ext.sh "$input_file"
  done |
  while read -r item; do
    start_row=$(echo "$item" | jq '.match.start.row')
    end_row=$(echo "$item" | jq '.match.end.row')

    last_commit=$(echo "$item" | jq '.last_commit' -r)
    text=$(echo "$item" | jq '.text' -r)
    file=$(echo "$item" | jq '.file' -r)

    first_commit=$(git --no-pager log --reverse -S"$text" --format=%H | \
      head -n 1)

    created_at=$(git show $first_commit --no-patch --format=%ad)
    heading=$(echo "$text" | sed '/^$/Q' | sed 's/.*TODO //')
    body=$(echo "$text" | tail -n +$(($(echo "$heading" | wc -l) + 2)) | \
      awk -F '[^ ]' '
        NR == 1 {n = length($1)}
        {sub("^ {1,"n"}", ""); print}'
          )

    GREEN='\033[0;32m'
    BOLD=$(tput bold)
    NORMAL=$(tput sgr0)
    NC='\033[0m'
    echo -e "$GREEN--- $created_at --- $file$NC"
    echo
    echo "$BOLD$heading$NORMAL" | fold -s
    if test -n "$body"; then
      echo
      echo "$body" | fold -s
      echo
    fi
    echo
    cat "$file" | nl -w 4 -s "| " -p -d '' -b a| tail -n +$(($start_row - 2)) | head -n $(($end_row - $start_row + 7))
    echo
    echo
  done