Browse Source

Replicate the GitHub script interface for convenience

master
JustAnotherArchivist 3 years ago
parent
commit
0f477ca79d
1 changed files with 47 additions and 28 deletions
  1. +47
    -28
      gitlab.com-list-repos

+ 47
- 28
gitlab.com-list-repos View File

@@ -1,40 +1,59 @@
#!/bin/bash
set -euo pipefail

if [[ $# -ne 1 || "$1" == '-h' || "$1" == '--help' ]]
GIT_URLS_MODE='--git-urls'
MODES=("${GIT_URLS_MODE}")

if [[ $# -lt 1 || ( $# -ge 2 && "$1" == --* && ! " ${MODES[@]} " =~ " ${1} " ) || "$1" == '-h' || "$1" == '--help' ]]
then
echo "Usage: $0 USER_OR_GROUP_NAME" >&2
echo "Usage: $0 [$(printf " | %s" "${MODES[@]}" | sed 's,^ | ,,')] USER_OR_GROUP_NAME [USER_OR_GROUP_NAME...]" >&2
exit 1
fi
name="$1"
mode=''
if [[ $# -ge 2 && "$1" == --* ]]
then
mode="$1"
shift
fi

scriptpath="$(cd "$(dirname "$0")"; pwd -P)"

page="$("${scriptpath}/curl-ua" firefox -s "https://gitlab.com/${name}")"
if grep -q -F '<a data-target="div#activity" data-action="activity" data-toggle="tab" href="' <<<"${page}"
then
echo "User" >&2
url="https://gitlab.com/api/v4/users/${name}/projects?per_page=100"
elif grep -q -F '<li class="home active"><a title="Group details" href="' <<<"${page}"
then
echo "Group" >&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
for name
do
page="$("${scriptpath}/curl-ua" firefox -s "https://gitlab.com/${name}")"
if grep -q -F '<a data-target="div#activity" data-action="activity" data-toggle="tab" href="' <<<"${page}"
then
echo "${name}: User" >&2
url="https://gitlab.com/api/v4/users/${name}/projects?per_page=100"
elif grep -q -F '<li class="home active"><a title="Group details" href="' <<<"${page}"
then
echo "${name}: Group" >&2
url="https://gitlab.com/api/v4/groups/${name}/projects?per_page=100&include_subgroups=true"
else
echo "Error: unknown page type for ${name}" >&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 ]]
{
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
}
done | grep -Po '"path_with_namespace":\s*"\K[^"]+' | sed 's,^,https://gitlab.com/,' | {
if [[ -z "${mode}" ]]
then
cat
elif [[ "${mode}" == "${GIT_URLS_MODE}" ]]
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
awk '{ print $0 ".git"; print $0 ".wiki.git"; }'
fi
} | grep -Po '"path_with_namespace":\s*"\K[^"]+' | sed 's,^,https://gitlab.com/,'
}

Loading…
Cancel
Save