|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #!/bin/bash
- set -euo pipefail
-
- GIT_URLS_MODE='--git-urls'
- MODES=("${GIT_URLS_MODE}")
-
- function usage {
- echo "Usage: $0 [$(printf " | %s" "${MODES[@]}" | sed 's,^ | ,,')] [--instance URL] [USER_OR_GROUP_NAME...]" >&2
- echo "The instance URL defaults to https://gitlab.com/" >&2
- exit 1
- }
-
- mode=''
- if [[ $# -ge 1 && " ${MODES[@]} " =~ " ${1} " ]]
- then
- mode="$1"
- shift
- fi
-
- instance=https://gitlab.com/
- if [[ $# -ge 2 && "$1" == '--instance' ]]
- then
- instance="$2"
- shift
- shift
- if [[ "${instance}" != */ ]]
- then
- instance="${instance}/"
- fi
- fi
-
- if [[ $# -ge 1 && "$1" == --* ]]; then usage; fi
-
- if [[ $# -eq 0 ]]
- then
- target=instance
- set ''
- else
- target=user-or-group
- fi
-
- scriptpath="$(cd "$(dirname "$0")"; pwd -P)"
-
- for name
- do
- if [[ "${target}" == instance ]]
- then
- url="${instance}api/v4/projects?per_page=100"
- else
- page="$("${scriptpath}/curl-ua" firefox -s "${instance}${name}")"
- if grep -q -F '<a data-target="div#activity" data-action="activity" data-toggle="tab" href="' <<<"${page}"
- then
- echo "${name}: User" >&2
- url="${instance}api/v4/users/${name}/projects?per_page=100"
- elif grep -q -F 'data-page="groups:show"' <<<"${page}"
- then
- echo "${name}: Group" >&2
- url="${instance}api/v4/groups/${name}/projects?per_page=100&include_subgroups=true"
- else
- echo "Error: unknown page type for ${name}" >&2
- exit 1
- fi
- fi
-
- {
- pipe=$(mktemp -u); mkfifo "${pipe}"; exec 3<>"${pipe}"; rm "${pipe}"; unset pipe # For the disgusting HTTP header treatment
- "${scriptpath}/curl-ua" firefox -s --fail -D >({ grep -i -m 1 '^x-total-pages: ' || echo 'x-total-pages: 1'; } | sed 's,^.*: ,,' | tr -d '\r' >&3) "${url}"
- declare -i nPages=$(head -1 <&3)
- if [[ ${nPages} -ge 2 ]]
- then
- for ((page=2; page<=${nPages}; ++page))
- do
- echo -n $'\r'"Requesting page ${page} of ${nPages}" >&2
- "${scriptpath}/curl-ua" firefox -s --fail "${url}&page=${page}"
- done
- echo >&2
- fi
- }
- done | \
- grep -Po '"path_with_namespace":\s*"\K[^"]+' | \
- awk -v instance="${instance}" '{ print instance $0; }' | \
- {
- if [[ -z "${mode}" ]]
- then
- cat
- elif [[ "${mode}" == "${GIT_URLS_MODE}" ]]
- then
- awk '{ print $0 ".git"; print $0 ".wiki.git"; }'
- fi
- }
|