aboutsummaryrefslogtreecommitdiffstats
path: root/src/extract.sh
blob: 07346fcf9140f9c1c198a404c6b3bc83145cc850 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env bash

# TODO Add support for ammendments
#
# The user can ammend more information to an issue which is located at
# a different place by referencing the issue's id.  Example:
#
# ```bash
# #!/usr/bin/env bash
#
# set -efu
#
# ls -al
# # TODO Original issue
# #
# # @id original-issue
#
# ls
# # @original-issue more information on the issue
# ```

# TODO Only one issue per comment block
#
# Only the first TODO/FIXME inside a comment block should be considered
# as the start of an issue.

# TODO Add support for other keywords
#
# Additionally to TODO, also FIXME should start an issue.  There might
# be more interesting keywords.

# TODO Add tags
#
# Users can add tags inside issue title and description.  Tags are slugs
# and start with @
#
# @assigned aforemny

# TODO Add filter by tags
#
# Users can filter issues for tags with the option -t/--tag @tag.
#
# @assigned kirchner@posteo.de

# TODO Generate and show hash for each issue


set -efu

git ls-files --cached --exclude-standard --other |
  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" ;;
      *.sh) ext="sh" ;;
      *) ;;
    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 -n '0,/^$/p')
    body=$(echo "$text" | tail -n +$(($(echo "$heading" | wc -l) + 2)))

    echo "$item" | jq -c \
      --arg body "$body" \
      --arg created_at "$created_at" \
      --arg first_commit "$first_commit" \
      --arg heading "$heading" \
      --argjson end_row "$end_row" \
      --argjson start_row "$start_row" \
      '. + {
        "body": $body,
        "created_at": $created_at,
        "end_row": $end_row,
        "first_commit": $first_commit,
        "heading": $heading,
        "start_row": $start_row
      }'
  done