83 lines
2.1 KiB
Bash
Executable File
83 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
# shellcheck source=lib/common.sh
|
|
source "${SCRIPT_DIR}/lib/common.sh"
|
|
|
|
FILTER=""
|
|
FORMAT="table"
|
|
|
|
usage() {
|
|
cat >&2 <<'EOF'
|
|
Usage: list.sh [--private|--public] [--format table|tsv|name]
|
|
|
|
--private 只列出 private repo
|
|
--public 只列出 public repo
|
|
--format FORMAT table (default) | tsv | name
|
|
EOF
|
|
exit 1
|
|
}
|
|
|
|
while [[ $# -gt 0 ]]; do
|
|
case "$1" in
|
|
--private) FILTER="private"; shift ;;
|
|
--public) FILTER="public"; shift ;;
|
|
--format)
|
|
[[ $# -ge 2 ]] || { log_err "--format 需要一個值"; exit 1; }
|
|
FORMAT="$2"; shift 2 ;;
|
|
-h|--help) usage ;;
|
|
*) log_err "未知參數:$1"; usage ;;
|
|
esac
|
|
done
|
|
|
|
case "$FORMAT" in
|
|
table|tsv|name) ;;
|
|
*) log_err "--format 只能是 table / tsv / name"; exit 1 ;;
|
|
esac
|
|
|
|
load_config
|
|
require_cmd jq column
|
|
|
|
PAGE=1
|
|
LIMIT=50
|
|
ALL_ITEMS="$(mktemp)"
|
|
trap 'rm -f "$ALL_ITEMS"; _cleanup_common' EXIT
|
|
|
|
while :; do
|
|
gitea_api GET "/user/repos?limit=${LIMIT}&page=${PAGE}"
|
|
if [[ "$HTTP_CODE" != "200" ]]; then
|
|
log_err "GET /user/repos 失敗 (HTTP ${HTTP_CODE})"
|
|
cat "$GITEA_API_RESP_FILE" >&2
|
|
exit 1
|
|
fi
|
|
jq -c '.[]' < "$GITEA_API_RESP_FILE" >> "$ALL_ITEMS"
|
|
COUNT="$(jq 'length' < "$GITEA_API_RESP_FILE")"
|
|
[[ "$COUNT" -lt "$LIMIT" ]] && break
|
|
PAGE=$((PAGE + 1))
|
|
done
|
|
|
|
filter_jq="."
|
|
case "$FILTER" in
|
|
private) filter_jq='select(.private == true)' ;;
|
|
public) filter_jq='select(.private == false)' ;;
|
|
esac
|
|
|
|
TOTAL="$(jq -s "map($filter_jq) | length" < "$ALL_ITEMS")"
|
|
log_info "抓到 ${TOTAL} 個 repo"
|
|
|
|
case "$FORMAT" in
|
|
name)
|
|
jq -r "$filter_jq | .name" < "$ALL_ITEMS"
|
|
;;
|
|
tsv)
|
|
jq -r "$filter_jq | [.name, (if .private then \"private\" else \"public\" end), (.description // \"\")] | @tsv" < "$ALL_ITEMS"
|
|
;;
|
|
table)
|
|
{
|
|
printf 'NAME\tVISIBILITY\tDESCRIPTION\n'
|
|
jq -r "$filter_jq | [.name, (if .private then \"private\" else \"public\" end), (.description // \"\")] | @tsv" < "$ALL_ITEMS"
|
|
} | column -t -s $'\t'
|
|
;;
|
|
esac
|