diff --git a/gitlab.com-list-repos b/gitlab.com-list-repos new file mode 100755 index 0000000..454ae37 --- /dev/null +++ b/gitlab.com-list-repos @@ -0,0 +1,40 @@ +#!/bin/bash +set -euo pipefail + +if [[ $# -ne 1 || "$1" == '-h' || "$1" == '--help' ]] +then + echo "Usage: $0 USER_OR_GROUP_NAME" >&2 + exit 1 +fi +name="$1" + +scriptpath="$(cd "$(dirname "$0")"; pwd -P)" + +page="$("${scriptpath}/curl-ua" firefox -s "https://gitlab.com/${name}")" +if grep -q -F '&2 + url="https://gitlab.com/api/v4/users/${name}/projects?per_page=100" +elif grep -q -F '
  • &2 + url="https://gitlab.com/api/v4/groups/${name}/projects?per_page=100&include_subgroups=true" +else + echo "Error: unknown page type" >&2 + exit 1 +fi + +{ + pipe=$(mktemp -u); mkfifo "${pipe}"; exec 3<>"${pipe}"; rm "${pipe}"; unset pipe # For the disgusting HTTP header treatment + "${scriptpath}/curl-ua" firefox -sv "${url}" 2> >(grep '^< x-total-pages: ' | sed 's,^.*: ,,' | tr -d '\r' >&3) + 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 "${url}&page=${page}" + done + echo >&2 + fi +} | grep -Po '"path_with_namespace":\s*"\K[^"]+' | sed 's,^,https://gitlab.com/,'