🦖

DiffからTODOコメントを集めてPRにコメントする

2024/09/07に公開

よくTODOコメントを溜めてしまうので、
Pull requestに追加されたTODOコメントをそのPRにコメントするGitHub Actionsのワークフローを作りました。

https://github.com/yuto-trd/todo-comments-in-pr

✅ 対象読者

  • 個人開発者
  • mainブランチをTODOコメントで汚したくない人

⭐ 特徴

  • Diffに残っているTODOコメントのみ収集するので、もとからあるTODOコメントは含まないようにした
  • regexを指定してカスタマイズできる
  • JSONを出力するので、表示形式をカスタマイズできる

対応しているコメント

// TODO: 対応

// TODO: 連続した行コメント
// 2行目

/* TODO:
 *   複数行コメント
 */

設定を変えることで他のコメントの対応もできます。

name: Find TODOs in pull requests

on:
  pull_request:

jobs:
  find-todos:
    # コメントするのに必要
    permissions:
      pull-requests: write

    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # Diffに含まれるTODOコメントを収集
      - uses: indigo-san/todo-comments-in-pr@v1
        id: todos

      # マークダウン形式に変換
      # Permalinkを使うようにしています
      - name: Generate a summary of the tasks
        uses: actions/github-script@v7
        id: summary
        with:
          result-encoding: string
          script: |
            const tasks = JSON.parse(String.raw`${{ steps.todos.outputs.tasks }}`);
            let body = tasks.map(task => `https://github.com/${{ github.repository }}/blob/${{ github.sha }}/${task.fileName}#L${task.startLine}-L${task.endLine}`).join('\n');

            if (tasks.length > 0) {
              body = `The following TODO comments were found:\n\n${body}`;
            } else {
              body = 'No TODO comments were found.';
            }
            return body;

      - name: Comment on the pull request
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          header: todo-cooments
          recreate: true
          message: |
            ${{ steps.summary.outputs.result }}

入力

path

任意 TODO を検索するファイルへのパス。JSON配列を指定する必要がある。
(デフォルト: ["*.cs","*.js","*.jsx","*.ts","*.tsx","*.css","*.scss","*.sass"])

commit

任意 現在のコミットと比較するコミット。
(デフォルト: ${{ github.event.pull_request.base.ref }})

single_line_comment

任意 単一行のコメントに一致する正規表現パターン。
(デフォルト: \/\/.*)

multi_line_comment_start

任意 複数行のコメントの先頭に一致する正規表現パターン。
(デフォルト: \/\*)

multi_line_comment_end

任意 複数行のコメントの末尾に一致する正規表現パターン。
(デフォルト: \*\/)

regex

任意 キーワードに一致する正規表現パターン。
(デフォルト: TODO)

出力

tasks

差分から見つかったタスクのリスト。

[
  {
    "startLine": 1,
    "endLine": 1,
    "content": "// TODO: test",
    "fileName": "path/to/file"
  }
]

tasks_count

差分で見つかったタスクの数。

Discussion