Files
KamishiroUPM/package.sh

132 lines
3.8 KiB
Bash
Executable File

apk add curl git git-lfs icu-data-full jq npm uuidgen sed >/dev/null
git config --global http.sslVerify false
git config --global advice.detachedHead false
Repo_Process() {
# Prepare Variables
local UUID=$(uuidgen)
local WORK_ROOT=$1
local REPO_SETTING=$2
local ADDR=$(echo $REPO_SETTING | jq -r '.addr')
local DIR=$(echo $REPO_SETTING | jq -r '.dir')
local TAG_REGEX=$(echo $REPO_SETTING | jq -r '.tagRegex')
local IGNORE_REPO=$(echo $REPO_SETTING | jq -r '.ignore')
local REPO_NAME=$(basename $ADDR | sed 's/\.[^\.]*$//')
local AUTHOR_NAME=$(echo "$ADDR" | awk -F[/:] '{print $(NF-1)}')
local PACKAGE_NAME=$(basename $DIR)
local PACKAGE_ROOT="$WORK_ROOT/$REPO_NAME-$UUID"
local PACKAGE_DIR="$WORK_ROOT/$REPO_NAME-$UUID/$DIR"
# Check if ignore
if [[ "$IGNORE_REPO" == "true" ]]; then
return
fi
if [[ "$TAG_REGEX" == null ]]; then
local TAG_REGEX="^[0-9]+\.[0-9]+\.[0-9]+$"
fi
if [[ "$DIR" == null ]]; then
local DIR="."
fi
# Download latest version
cd $WORK_ROOT
git clone $ADDR $REPO_NAME-$UUID >/dev/null 2>&1
cd $PACKAGE_ROOT
local TAGS=$(git tag -l --sort authordate)
# Tag Process
for TAG in $TAGS; do
# Check if tag is valid
if [[ ! $TAG =~ $TAG_REGEX ]]; then
echo "$REPO_NAME:$DIR@$TAG is invalid tag."
continue
fi
# Prepare Variables
local GITHUB_PACKAGE_ADDR="https://raw.githubusercontent.com/${AUTHOR_NAME}/${REPO_NAME}/${TAG}/${DIR}/package.json"
# 404 Check
local GITHUB_STAT=$(curl -sL $GITHUB_PACKAGE_ADDR -o /dev/null -w '%{http_code}\n')
if [[ "$GITHUB_STAT" != "200" ]]; then
echo "$REPO_NAME:$DIR@$TAG has invalid path."
continue
fi
local PACKAGE_JSON=$(curl -sL $GITHUB_PACKAGE_ADDR)
local GITHUB_NAME=$(echo "$PACKAGE_JSON" | jq -r .name)
local SEM_VERSION=$(echo "$TAG" | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+')
# Get Server tag
local SVR_STAT=$(curl -sL https://$NPM_REGISTRY/$GITHUB_NAME -o /dev/null -w '%{http_code}\n')
local SVR_VERS=""
if [[ "$SVR_STAT" == "200" ]]; then
local SVR_DATA=$(curl -sL https://$NPM_REGISTRY/$GITHUB_NAME)
local SVR_VERS=$(echo $SVR_DATA | jq .versions | jq -s -r '[ .[] | keys ] | flatten | unique | .[]')
fi
# Check server version
local EXIST_ON_SVR="false"
for SVR_VER in $SVR_VERS; do
if [[ "$SVR_VER" == "$SEM_VERSION" ]]; then
local EXIST_ON_SVR="true"
break
fi
done
if [[ "$EXIST_ON_SVR" == "true" ]]; then
echo "$REPO_NAME:$DIR@$TAG is already published."
continue
fi
# Download Repository
cd $WORK_ROOT
rm -r $PACKAGE_ROOT
git clone -b $TAG $ADDR $REPO_NAME-$UUID >/dev/null 2>&1
cd $PACKAGE_ROOT
git submodule update --init --recursive >/dev/null 2>&1
git lfs pull >/dev/null 2>&1
cd $PACKAGE_DIR
# Change Version
local PROCESS_VER='.version="'$SEM_VERSION'"'
local PACKAGE_JSON=$(echo "$PACKAGE_JSON" | jq "$PROCESS_VER" | jq -c .)
# Update package.json
rm package.json
echo $PACKAGE_JSON >package.json
# Publish Package
local DATA='{"name":"'"$NPM_USER"'", "password":"'"$NPM_PASS"'"}'
local USER="$NPM_USER":"$NPM_PASS"
local RETURN=$(curl -sL -H "Accept:application/json" -H "Content-Type:application/json" -X PUT --data "$DATA" --user "$USER" https://$NPM_REGISTRY/-/user/org.couchdb.user:$NPM_USER)
local TOKEN=$(echo $RETURN | jq '.token')
npm set //$NPM_REGISTRY/:_authToken $TOKEN
npm publish --registry https://$NPM_REGISTRY/ >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
echo "$REPO_NAME:$DIR@$TAG failed to publish."
else
echo "$REPO_NAME:$DIR@$TAG published."
fi
done
cd $WORK_ROOT
rm -r $PACKAGE_ROOT
}
JSON_FILES=$(find ./repos -name "*.json")
for JSON_FILE in $JSON_FILES; do
ROOT=$(pwd)
OBJ=$(cat $JSON_FILE | jq -c .)
Repo_Process "$ROOT" "$OBJ" &
done
wait