#! /bin/bash gitlab() ( is() { echo "$*" | grep -q gitlab.app && ! echo "$*" | grep -q '/wikis/' } get() { local project="$1" local blob="$2" project="$(urlencode "$project")" blob="$(urlencode "$blob")" local path="api/v4/projects/$project/repository/files/$blob/raw" _gcurl "https://gitlab-app.eng.qops.net/$path" } expand() { local cache_key="gitlab expand $*" if cache get "$cache_key"; then return 0 fi _expand "$@" | sort | cache put "$cache_key" } _expand() { local url="$1" local project="$(_url_to_project_root "$url" | head -n 1)" local root="$(_url_to_project_root "$url" | tail -n 1)" __expand "$project" "$root" } _url_to_project_root() { local url="$1" local url_path="${url#http*://gitlab*.net/}" local project="${url_path%%/-/*}" local root="${url_path#*$project}" local root="${root#*/-/}" local root="${root#tree/}" local root="${root#blob/}" local root="${root#*/}" echo "$project" echo "$root" } __expand() { local project="$1" local root="${2:-"/"}" local b64_files=() local b64_trees=("$root") local i=0 find_each() { local type="$1" shift echo "$*" \ | jq -c .[] \ | grep "\"type\":\"$type\"" \ | jq -r .path \ | while read -r line; do echo "$line" | base64; done \ | grep . } while [ "$i" -lt "${#b64_trees[@]}" ]; do got="$(_list_tree "$project" "${b64_trees[i]}")" for b64_tree in $(find_each "tree" "$got"); do if ! echo "${b64_trees[@]}" | grep -q "[ ^]$b64_tree[ $]"; then b64_trees+=("$b64_tree") fi done for b64_file in $(find_each "blob" "$got"); do if ! echo "${b64_files[@]}" | grep -q "[ ^]$b64_file[ $]"; then b64_files+=("$b64_file") fi done i=$((i+1)) done echo "$project" | base64 for b64_file in "${b64_files[@]}"; do echo "$b64_file" done } _list_tree() { local project="$(urlencode "$1")" local path="/api/v4/projects/$project/repository/tree" local query="recursive=true&path=$2" _gcurl "https://gitlab-app.eng.qops.net/$path?$query" } _gcurl() { local cache_key="gitlab _gcurl $*" if cache get "$cache_key"; then return 0 fi __gcurl "$@" | cache put "$cache_key" } __gcurl() { curl -sS -H "Authorization: Bearer $GITLAB_PAT" "$@" } "$@" ) urlencode() ( LC_COLLATE=C local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:$i:1}" case $c in [a-zA-Z0-9.~_-]) printf '%s' "$c" ;; *) printf '%%%02X' "'$c" ;; esac done )