#!/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 '&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 }