🔭

GitHub Organizations に含まれるリポジトリの一覧を取得する

2023/11/13に公開

Motivation

GitHub の Organizations 内にあるリポジトリが増えてきたので、その一覧を markdown の表として出力したい。また、興味のあるリポジトリは特定のプレフィックス群から始まるので、それらでフィルタをかける必要がある。

Script

  • OUTPUT_FILE: 出力ファイル名
  • PREFIXES: プレフィックス群
  • ORGANIZATION: Organizations 名
#!/bin/bash

set -euCo pipefail

# constants
readonly OUTPUT_FILE="repo_table.txt"
readonly PREFIXES=("PREFIX_0" "PREFIX_1" "PREFIX_2")
readonly ORGANIZATION="YOUR_ORGANIZATION"

function list_repo() {
  local -r query='query($endCursor: String) {
    organization(login: "'"${ORGANIZATION}"'") {
      repositories(first: 100, after: $endCursor) {
        pageInfo {
          endCursor
          hasNextPage
        }
        nodes {
          name
          isArchived
        }
      }
    }
  }'

  local -r result=$(gh api graphql -F query="$query" --paginate)
  for prefix in "${PREFIXES[@]}"; do
    echo "${result}" |
      jq -r '.data.organization.repositories.nodes[] | select(.name | startswith("'"${prefix}"'")) | .name + " " + (.isArchived | tostring)' |
      sort
  done
}

function main() {
  echo "| Name | URL | Description | Archived |"
  echo "| ---- | --- | ----------- | -------- |"

  while read -r line; do
    read -r name archived <<<"${line}"
    if [[ "${archived}" == "true" ]]; then
      archived="o"
    else
      archived=""
    fi
    echo "| ${name} | https://github.com/${ORGANIZATION}/${name} | | ${archived} |"
  done < <(list_repo)
}

if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  main >"${OUTPUT_FILE}"
fi

Future Prospect

  • Description 列は手動で書くことを想定しているが、リポジトリの About から自動で取得したい
    • ただし、そのためにはリポジトリ作成のルール決めをする必要がある
  • 一覧の更新には手動で上記スクリプトを叩く必要があるが、自動実行にしたい
GitHubで編集を提案

Discussion