|
|
@@ -0,0 +1,90 @@ |
|
|
|
#!/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 |
|
|
|
} |