1436 lines
46 KiB
Bash
Executable File
1436 lines
46 KiB
Bash
Executable File
#! /bin/bash
|
|
|
|
# Program name
|
|
PROGRAM_NAME="Octojpack"
|
|
PROGRAM_CODE="octojpack"
|
|
PROGRAM_VERSION="1.0.2"
|
|
PROGRAM_V="1.0"
|
|
PROGRAM_URL="https://git.vdm.dev/octoleo/${PROGRAM_CODE}"
|
|
|
|
# Do some prep work
|
|
command -v git >/dev/null 2>&1 || {
|
|
echo >&2 "[error] We require git for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting."
|
|
exit 1
|
|
}
|
|
command -v curl >/dev/null 2>&1 || {
|
|
echo >&2 "[error] We require curl for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting."
|
|
exit 1
|
|
}
|
|
command -v jq >/dev/null 2>&1 || {
|
|
echo >&2 "[error] We require jq for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not installed. Aborting."
|
|
exit 1
|
|
}
|
|
|
|
# main function ˘Ô≈ôﺣ
|
|
function main() {
|
|
# check if we have project overides for the environment variables
|
|
# shellcheck disable=SC2015
|
|
[ -f "$VDM_PACKAGE_CONF_FILE" ] && getProjectEnvironment || {
|
|
echo >&2 "[error] We require config file with correct packaging details for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not found in/at $VDM_PACKAGE_CONF_FILE. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# get the package details
|
|
getPackageDetails || {
|
|
echo >&2 "[error] We require config file with correct packaging details for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not found in/at $VDM_PACKAGE_CONF_FILE. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# get destination details
|
|
getRepositoryDetails || {
|
|
echo >&2 "[error] We require config file with correct destination repository details for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not found in/at $VDM_PACKAGE_CONF_FILE. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# build the project package path
|
|
setPackageDir || {
|
|
echo >&2 "[error] We could not set the package directories for ${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# set the files
|
|
setFiles || {
|
|
echo >&2 "[error] We could not find any files for ${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO} package. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# set languages
|
|
setLanguages
|
|
# set the package XML
|
|
setPackageXml
|
|
# set the readme
|
|
setReadMe
|
|
# set the licence file
|
|
setLicenseFile || {
|
|
echo >&2 "[error] We could not set the LICENSE for ${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# set the installation file
|
|
setInstallFile
|
|
# get package repository
|
|
setRepository || {
|
|
echo >&2 "[error] We could not set the GIT repository for ${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}. Aborting."
|
|
clearMainEnv
|
|
exit 1
|
|
}
|
|
# remove all files
|
|
clearFiles
|
|
# clear main env
|
|
clearMainEnv
|
|
# final message
|
|
_echo "[Success] Package completely updated!"
|
|
}
|
|
|
|
# set the package details
|
|
function getPackageDetails() {
|
|
# little information of progress
|
|
_echo "[info] Loading the Package Details..."
|
|
# make configuration globally available
|
|
export VDM_CONFIG_DATA
|
|
# check for errors
|
|
local has_error=false
|
|
# get the global config values if not set
|
|
getConfigValue 'VDM_PACKAGER' '.global.packager' false || VDM_PACKAGER="${PROGRAM_NAME} v${PROGRAM_V}"
|
|
getConfigValue 'VDM_PACKAGER_URL' '.global.packager_url' false || VDM_PACKAGER_URL="${PROGRAM_URL}"
|
|
getConfigValue 'VDM_PACKAGER_LANG' '.global.language' false || VDM_PACKAGER_LANG="en-GB"
|
|
getConfigValue 'VDM_GLOBAL_TOKEN' '.global.token' || has_error=true
|
|
getConfigValue 'VDM_GLOBAL_API' '.global.api' || has_error=true
|
|
getConfigValue 'VDM_GLOBAL_URL' '.global.url' || has_error=true
|
|
# check if we have some errors already
|
|
$has_error && return 13
|
|
|
|
# package related details
|
|
getConfigValue 'VDM_PACKAGE_NAME' '.package.package_name' || has_error=true
|
|
getConfigValue 'VDM_CODE_NAME' '.package.code_name' || has_error=true
|
|
getConfigValue 'VDM_PACKAGE_VERSION_ID' '.package.version_id' false
|
|
getConfigValue 'VDM_NAME' '.package.name' || has_error=true
|
|
getConfigValue 'VDM_DESCRIPTION' '.package.description' || has_error=true
|
|
getConfigValue 'VDM_MIN_JOOMLA_VERSION' '.package.min_joomla_version' false || VDM_MIN_JOOMLA_VERSION="3.8"
|
|
getConfigValue 'VDM_MAX_JOOMLA_VERSION' '.package.max_joomla_version' false || unset VDM_MAX_JOOMLA_VERSION
|
|
getConfigValue 'VDM_COPYRIGHT' '.package.copyright' || has_error=true
|
|
getConfigValue 'VDM_COPYRIGHT_YEAR' '.package.copyright_year' || has_error=true
|
|
getConfigValue 'VDM_LICENSE' '.package.license' || has_error=true
|
|
getConfigValue 'VDM_LICENSE_FILE' '.package.license_file' || has_error=true
|
|
getConfigValue 'VDM_INSTALLATION_FILE' '.package.installation_file' false || unset VDM_INSTALLATION_FILE
|
|
getConfigValue 'VDM_AUTHOR' '.package.author' || has_error=true
|
|
getConfigValue 'VDM_AUTHOR_EMAIL' '.package.author_email' || has_error=true
|
|
getConfigValue 'VDM_AUTHOR_URL' '.package.author_url' || has_error=true
|
|
getConfigValue 'VDM_UPDATE_SERVER' '.package.update_servers' || has_error=true
|
|
# check if we have some errors already
|
|
$has_error && return 13
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set the target repository details
|
|
function getRepositoryDetails() {
|
|
# make sure we have package details
|
|
if [[ "${VDM_CONFIG_DATA}" =~ '"repository"' ]]; then
|
|
# little information of progress
|
|
_echo "[info] Loading the Repository Details..."
|
|
# check for errors
|
|
local has_error=false
|
|
# get the global config values if not set
|
|
getConfigValue 'VDM_PACKAGE_OWNER' '.repository.owner' || has_error=true
|
|
getConfigValue 'VDM_PACKAGE_REPO' '.repository.repo' || has_error=true
|
|
getConfigValue 'VDM_PACKAGE_TOKEN_NAME' '.repository.token_name' false || VDM_PACKAGE_TOKEN_NAME="VDM_GLOBAL_TOKEN"
|
|
getConfigValue 'VDM_PACKAGE_URL_NAME' '.repository.url_name' false || VDM_PACKAGE_URL_NAME="VDM_GLOBAL_URL"
|
|
getConfigValue 'VDM_PACKAGE_API_NAME' '.repository.api_name' false || VDM_PACKAGE_API_NAME="VDM_GLOBAL_API"
|
|
# check if we have some errors already
|
|
$has_error && return
|
|
# set the package (api/url/toke)
|
|
VDM_PACKAGE_TOKEN=${!VDM_PACKAGE_TOKEN_NAME}
|
|
VDM_PACKAGE_URL=${!VDM_PACKAGE_URL_NAME}
|
|
VDM_PACKAGE_API=${!VDM_PACKAGE_API_NAME}
|
|
# make globally available
|
|
export VDM_PACKAGE_TOKEN
|
|
export VDM_PACKAGE_URL
|
|
export VDM_PACKAGE_API
|
|
# success
|
|
return 0
|
|
else
|
|
# failed
|
|
return 17
|
|
fi
|
|
}
|
|
|
|
# clear the main environment variables
|
|
function clearMainEnv() {
|
|
# clear all exported package details
|
|
# SET IN: getRepositoryDetails
|
|
unset VDM_PACKAGE_OWNER
|
|
unset VDM_PACKAGE_REPO
|
|
unset VDM_PACKAGE_TOKEN_NAME
|
|
unset VDM_PACKAGE_TOKEN
|
|
unset VDM_PACKAGE_API_NAME
|
|
unset VDM_PACKAGE_API
|
|
unset VDM_PACKAGE_URL_NAME
|
|
unset VDM_PACKAGE_URL
|
|
# SET IN: setPackageDir
|
|
unset VDM_PACKAGE_DIR
|
|
unset VDM_PACKAGE_GIT_DIR
|
|
unset VDM_PACKAGE_SRC_DIR
|
|
unset VDM_PACKAGE_LANG_DIR
|
|
unset VDM_PACKAGE_XML
|
|
unset VDM_FILES_XML
|
|
unset VDM_LANGUAGES_XML
|
|
unset VDM_README_MD
|
|
unset VDM_INSTALL_PHP
|
|
# SET IN: getPackageDetails
|
|
unset VDM_CONFIG_DATA
|
|
unset VDM_PACKAGER
|
|
unset VDM_PACKAGER_URL
|
|
unset VDM_GLOBAL_TOKEN
|
|
unset VDM_GLOBAL_API
|
|
unset VDM_PACKAGE_NAME
|
|
unset VDM_CODE_NAME
|
|
unset VDM_PACKAGE_VERSION
|
|
unset VDM_PACKAGE_VERSION_ID
|
|
unset VDM_NAME
|
|
unset VDM_DESCRIPTION
|
|
unset VDM_MIN_JOOMLA_VERSION
|
|
unset VDM_MAX_JOOMLA_VERSION
|
|
unset VDM_COPYRIGHT
|
|
unset VDM_COPYRIGHT_YEAR
|
|
unset VDM_LICENSE
|
|
unset VDM_LICENSE_FILE
|
|
unset VDM_LICENSE_FILE_PATH
|
|
unset VDM_INSTALLATION_FILE
|
|
unset VDM_AUTHOR
|
|
unset VDM_AUTHOR_EMAIL
|
|
unset VDM_AUTHOR_URL
|
|
unset VDM_UPDATE_SERVER
|
|
# SET IN: callGiteaAPI
|
|
unset VDM_API_BUCKET
|
|
}
|
|
|
|
# clear all this projects files
|
|
function clearFiles() {
|
|
# always remove files
|
|
rm -fr "${VDM_PACKAGE_DIR:?}"
|
|
rm -fr "${VDM_PACKAGE_GIT_DIR:?}/${VDM_PACKAGE_REPO:?}"
|
|
}
|
|
|
|
# get value from config
|
|
function getConfigValue() {
|
|
# with config values we only try to load it
|
|
# if it is not already set
|
|
# so if we find that it is set
|
|
# we're done search
|
|
[ -n "${!1}" ] && return 0
|
|
# get what we can from the config if not already set in the .env file
|
|
# so to set the value globally use the .env option
|
|
# to set per project use the config file of the project
|
|
getValueFromJson "$1" "$2" || {
|
|
# give little heads-up if not blocked
|
|
"${3:-true}" && echo >&2 "[error] We require ($2) for $PROGRAM_NAME v${PROGRAM_V} to work, but it's not found in $VDM_PACKAGE_CONF_FILE."
|
|
# we had no success
|
|
return 19
|
|
}
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
function getValueFromJson() {
|
|
# some local values
|
|
local value_key
|
|
local json
|
|
# load the values
|
|
value_key="${2}"
|
|
# load the json object
|
|
json="${3:-$VDM_CONFIG_DATA}"
|
|
# get the value
|
|
# shellcheck disable=SC2034
|
|
val=$(echo "${json}" | jq -r "$value_key")
|
|
# check the value not to be null
|
|
[ "${val}" = 'null' ] && {
|
|
# we had no success
|
|
return 19
|
|
}
|
|
# set the dynamic variable $1=(MUST BE VALID VARIABLE NAME)
|
|
eval "$1"=\"\$val\"
|
|
return 0
|
|
}
|
|
|
|
# set the Package Path
|
|
function setPackageDir() {
|
|
# little information of progress
|
|
_echo "[info] Setting the Package Directories..."
|
|
# the full project path
|
|
VDM_PACKAGE_DIR="${VDM_MAIN_DIR}/${VDM_PACKAGE_REPO}"
|
|
VDM_PACKAGE_GIT_DIR="${VDM_MAIN_DIR}/git"
|
|
VDM_PACKAGE_SRC_DIR="${VDM_PACKAGE_DIR}/src"
|
|
# always remove previous files (if found)
|
|
rm -fr "${VDM_PACKAGE_DIR:?}"
|
|
rm -fr "${VDM_PACKAGE_GIT_DIR:?}/${VDM_PACKAGE_REPO:?}"
|
|
# set the package language folder
|
|
VDM_PACKAGE_LANG_DIR="${VDM_PACKAGE_DIR}/languages"
|
|
# set the package xml
|
|
VDM_PACKAGE_XML="${VDM_PACKAGE_DIR}/${VDM_PACKAGE_NAME,,}.xml"
|
|
# set the files xml
|
|
VDM_FILES_XML="${VDM_MAIN_DIR}/files.xml"
|
|
# set the languages xml
|
|
VDM_LANGUAGES_XML="${VDM_MAIN_DIR}/languages.xml"
|
|
# set the extensions list of files
|
|
VDM_README_FILES_MD="${VDM_MAIN_DIR}/README_FILES.md"
|
|
# set the README
|
|
VDM_README_MD="${VDM_PACKAGE_DIR}/README.md"
|
|
# set the license file
|
|
VDM_LICENSE_FILE_PATH="${VDM_PACKAGE_DIR}/LICENSE"
|
|
# set the package install script
|
|
VDM_INSTALL_PHP="${VDM_PACKAGE_DIR}/install_${VDM_CODE_NAME,,}.php"
|
|
# makes the project path available
|
|
export VDM_PACKAGE_DIR
|
|
export VDM_PACKAGE_GIT_DIR
|
|
export VDM_PACKAGE_SRC_DIR
|
|
export VDM_PACKAGE_LANG_DIR
|
|
# makes the project file locations available
|
|
export VDM_PACKAGE_XML
|
|
export VDM_FILES_XML
|
|
export VDM_LANGUAGES_XML
|
|
export VDM_README_MD
|
|
export VDM_INSTALL_PHP
|
|
export VDM_LICENSE_FILE_PATH
|
|
# make sure the packages dir is created
|
|
mkdir -p "${VDM_PACKAGE_DIR}" || return 12
|
|
#make sure the src dir is created
|
|
mkdir -p "${VDM_PACKAGE_SRC_DIR}" || return 12
|
|
#make sure the languages dir is created
|
|
mkdir -p "${VDM_PACKAGE_LANG_DIR}" || return 12
|
|
#make sure the git dir is created
|
|
mkdir -p "${VDM_PACKAGE_GIT_DIR}" || return 12
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set the Files
|
|
function setFiles() {
|
|
# little information of progress
|
|
_echo "[info] Loading the Files..."
|
|
# make sure its reset
|
|
echo -e '\t<files folder="src">' >"${VDM_FILES_XML}"
|
|
echo "" >"${VDM_README_FILES_MD}"
|
|
# check for errors
|
|
local has_error=false
|
|
local has_files=false
|
|
# loop over the repos
|
|
local i=0
|
|
for owner in $(echo "${VDM_CONFIG_DATA}" | jq -r '.files[].owner'); do
|
|
# get the config values needed
|
|
# shellcheck disable=SC2015
|
|
[ -n "${owner}" ] && VDM_OWNER="${owner}" || continue
|
|
# check for errors
|
|
has_error=false
|
|
# get the global config values if not set
|
|
getConfigValue 'VDM_REPO' ".files[$i].repo" || has_error=true
|
|
getConfigValue 'VDM_TYPE' ".files[$i].type" || has_error=true
|
|
getConfigValue 'VDM_ID' ".files[$i].id" || has_error=true
|
|
getConfigValue 'VDM_ENABLED' ".files[$i].enabled" false || VDM_ENABLED=1
|
|
# check if we have some errors already
|
|
if $has_error; then
|
|
clearFileEnv
|
|
# increment
|
|
((i++))
|
|
continue
|
|
fi
|
|
getConfigValue 'VDM_TOKEN_NAME' ".files[$i].token_name" false || VDM_TOKEN_NAME="VDM_GLOBAL_TOKEN"
|
|
getConfigValue 'VDM_API_NAME' ".files[$i].api_name" false || VDM_API_NAME="VDM_GLOBAL_API"
|
|
getConfigValue 'VDM_URL_NAME' ".files[$i].url_name" false || VDM_URL_NAME="VDM_GLOBAL_URL"
|
|
getConfigValue 'VDM_MODE' ".files[$i].mode" false || VDM_MODE='tags'
|
|
# set additional
|
|
VDM_GROUP=''
|
|
VDM_CLIENT=''
|
|
VDM_TYPE_KEY=''
|
|
VDM_TYPE_VAL=''
|
|
if [ "$VDM_TYPE" = 'plugin' ]; then
|
|
# set the plugin group
|
|
getConfigValue 'VDM_GROUP' ".files[$i].group" || has_error=true
|
|
# set the key
|
|
VDM_TYPE_KEY="group"
|
|
VDM_TYPE_VAL="${VDM_GROUP}"
|
|
elif [ "$VDM_TYPE" = 'module' ] || [ "$VDM_TYPE" = 'template' ]; then
|
|
# set module & template client
|
|
getConfigValue 'VDM_CLIENT' ".files[$i].client" || has_error=true
|
|
# set the key
|
|
VDM_TYPE_KEY="client"
|
|
VDM_TYPE_VAL="${VDM_CLIENT}"
|
|
fi
|
|
# check if we have some errors already
|
|
if $has_error; then
|
|
clearFileEnv
|
|
# increment
|
|
((i++))
|
|
continue
|
|
fi
|
|
# set the URL
|
|
VDM_URL=${!VDM_URL_NAME}
|
|
# set the API
|
|
VDM_API=${!VDM_API_NAME}
|
|
# set the token
|
|
VDM_TOKEN=${!VDM_TOKEN_NAME}
|
|
# export these values
|
|
export VDM_OWNER
|
|
export VDM_MODE
|
|
export VDM_ENABLED
|
|
export VDM_TYPE_KEY
|
|
export VDM_TYPE_VAL
|
|
export VDM_TOKEN
|
|
export VDM_API
|
|
export VDM_URL
|
|
# get this zip packages
|
|
if getZipFile; then
|
|
# check if this is the package version ID
|
|
if [ -n "${VDM_PACKAGE_VERSION_ID}" ] &&
|
|
[ -z "${VDM_PACKAGE_VERSION}" ] &&
|
|
[ "${VDM_PACKAGE_VERSION_ID}" = "${VDM_ID}" ]; then
|
|
# set the package version
|
|
VDM_PACKAGE_VERSION="${VDM_ZIP_VERSION:-$VDM_ZIP_NAME}"
|
|
export VDM_PACKAGE_VERSION
|
|
fi
|
|
# we have a file
|
|
has_files=true
|
|
fi
|
|
# increment
|
|
((i++))
|
|
# clear env
|
|
clearFileEnv
|
|
done
|
|
# make sure to close the files
|
|
echo -e '\t</files>' >>"${VDM_FILES_XML}"
|
|
# check if we found a file
|
|
$has_files || return 13
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# just to clear all file ENVs
|
|
function clearFileEnv() {
|
|
# SET IN: setFiles
|
|
unset VDM_OWNER
|
|
unset VDM_REPO
|
|
unset VDM_TYPE
|
|
unset VDM_ID
|
|
unset VDM_GROUP
|
|
unset VDM_CLIENT
|
|
unset VDM_TYPE_KEY
|
|
unset VDM_TYPE_VAL
|
|
unset VDM_TOKEN_NAME
|
|
unset VDM_TOKEN
|
|
unset VDM_API_NAME
|
|
unset VDM_API
|
|
unset VDM_URL_NAME
|
|
unset VDM_URL
|
|
unset VDM_MODE
|
|
# SET IN: getFileByKey || getFileByRelease || getFileByTag
|
|
unset VDM_ZIP_NAME
|
|
unset VDM_ZIP_VERSION
|
|
unset VDM_ZIP_MESSAGE
|
|
unset VDM_RELEASE_ID
|
|
unset VDM_ASSET_ID
|
|
unset VDM_ASSET_DOWNLOAD
|
|
}
|
|
|
|
# get the repository zip package
|
|
function getZipFile() {
|
|
# check the mode
|
|
if [ "${VDM_MODE}" = 'tags' ] || [ "${VDM_MODE}" = 'releases' ]; then
|
|
# make API call
|
|
callGiteaAPI "${VDM_MODE}" "${VDM_OWNER}" "${VDM_REPO}" "${VDM_API}" "${VDM_TOKEN}" || return 11
|
|
# check the mode and availability
|
|
if [ -n "${VDM_API_BUCKET}" ] && [ "${VDM_MODE}" = 'tags' ]; then
|
|
# get file by tag
|
|
getFileByTag || return 11
|
|
elif [ -n "${VDM_API_BUCKET}" ] && [ "${VDM_MODE}" = 'releases' ]; then
|
|
# get file by release
|
|
getFileByRelease || return 11
|
|
else
|
|
return 11
|
|
fi
|
|
else
|
|
# make API call
|
|
callGiteaAPI "tags" "${VDM_OWNER}" "${VDM_REPO}" "${VDM_API}" "${VDM_TOKEN}" || return 11
|
|
# get the file by key/branch/tag
|
|
getFileByKey || return 11
|
|
fi
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# get the file by tag
|
|
function getFileByTag() {
|
|
# get the name
|
|
getValueFromJson "VDM_ZIP_NAME" ".name" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Tag name not found in VDM_API_BUCKET."
|
|
return 12
|
|
}
|
|
# get the message
|
|
getValueFromJson "VDM_ZIP_MESSAGE" ".message" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Tag message not found in VDM_API_BUCKET."
|
|
return 12
|
|
}
|
|
# download the zip file if not already set
|
|
if [ ! -f "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip" ]; then
|
|
# give message
|
|
_echo "[info] Downloading the (${VDM_OWNER}-${VDM_REPO}-${VDM_ZIP_NAME}.zip) package."
|
|
curl -s -L "${VDM_API}/repos/${VDM_OWNER}/${VDM_REPO}/archive/${VDM_ZIP_NAME}.zip?access_token=${VDM_TOKEN}" -o "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip"
|
|
else
|
|
# zip already set
|
|
_echo "[error] ${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip already set."
|
|
return 12
|
|
fi
|
|
# add file to xml
|
|
setFileToXML
|
|
# update the readme
|
|
setFileToREADME
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# get the file by tag
|
|
function getFileByRelease() {
|
|
# check that we got some file
|
|
local has_files=false
|
|
local i=0
|
|
# get the name
|
|
getValueFromJson "VDM_ZIP_NAME" ".tag_name" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Release name not found in VDM_API_BUCKET."
|
|
return 12
|
|
}
|
|
# get the message
|
|
getValueFromJson "VDM_ZIP_MESSAGE" ".name" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Release message not found in VDM_API_BUCKET."
|
|
return 12
|
|
}
|
|
# we may have multiple assets (but we only load the first ZIP file we get)
|
|
# because we can only have the ${VDM_ID} only once in the xml file
|
|
for asset_zip_file_name in $(echo "${VDM_API_BUCKET}" | jq -r '.assets[].name'); do
|
|
# make sure we did not already get a file
|
|
$has_files && {
|
|
# increment
|
|
((i++))
|
|
continue
|
|
}
|
|
# we only work with zip files for now
|
|
[[ "$asset_zip_file_name" == *".zip" ]] || {
|
|
# increment
|
|
((i++))
|
|
continue
|
|
}
|
|
# download the zip file if not already set
|
|
if [ ! -f "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${asset_zip_file_name}" ]; then
|
|
# get download link
|
|
getValueFromJson "VDM_ASSET_DOWNLOAD" ".assets[$i].browser_download_url" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Asset [$i].browser_download_url for (${asset_zip_file_name}) not found in VDM_API_BUCKET."
|
|
# increment
|
|
((i++))
|
|
continue
|
|
}
|
|
# give message
|
|
_echo "[info] Downloading the (${VDM_OWNER}-${asset_zip_file_name}) package."
|
|
curl -s -L "${VDM_ASSET_DOWNLOAD}?access_token=${VDM_TOKEN}" -o "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${asset_zip_file_name}"
|
|
# so we got a file
|
|
has_files=true
|
|
# add to xml file
|
|
setFileToXML "${VDM_OWNER}__${asset_zip_file_name}"
|
|
# update the readme
|
|
setFileToREADME "${VDM_ZIP_NAME}" "${VDM_ASSET_DOWNLOAD}"
|
|
else
|
|
# zip already set
|
|
_echo "[notice] ${VDM_OWNER}__${asset_zip_file_name} already set."
|
|
fi
|
|
# increment
|
|
((i++))
|
|
done
|
|
# check if we got a file
|
|
$has_files || return 12
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# get the file by key
|
|
function getFileByKey() {
|
|
# get the name
|
|
VDM_ZIP_NAME="${VDM_MODE}"
|
|
# get the message
|
|
VDM_ZIP_MESSAGE="${VDM_MODE}"
|
|
# get the name
|
|
getValueFromJson "VDM_ZIP_VERSION" ".name" "${VDM_API_BUCKET}" || {
|
|
_echo "[error] Tag name not found in VDM_API_BUCKET. (but ignored since we are getting file by key)"
|
|
VDM_ZIP_VERSION="${VDM_MODE}"
|
|
}
|
|
# download the zip file if not already set
|
|
if [ ! -f "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip" ]; then
|
|
# give message
|
|
_echo "[info] Downloading the (${VDM_OWNER}-${VDM_REPO}-${VDM_ZIP_NAME}.zip) package."
|
|
# download the zip file
|
|
curl -s -L "${VDM_API}/repos/${VDM_OWNER}/${VDM_REPO}/archive/${VDM_ZIP_NAME}.zip?access_token=${VDM_TOKEN}" -o "${VDM_PACKAGE_SRC_DIR}/${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip"
|
|
else
|
|
# zip already set
|
|
_echo "[error] ${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip already set."
|
|
return 12
|
|
fi
|
|
# move the tag values to global scope
|
|
export VDM_ZIP_NAME
|
|
export VDM_ZIP_MESSAGE
|
|
export VDM_ZIP_VERSION
|
|
# add file to xml
|
|
setFileToXML
|
|
# update the readme
|
|
setFileToREADME
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set the File Details to XML
|
|
function setFileToREADME() {
|
|
local tmp_zip_name="${VDM_ZIP_NAME}"
|
|
local zip_name="${1:-$tmp_zip_name}"
|
|
local tmp_zip_url="https://${VDM_URL}/${VDM_OWNER}/${VDM_REPO}/archive/${VDM_ZIP_NAME}.zip"
|
|
local zip_url="${2:-$tmp_zip_url}"
|
|
local tmp_message="${VDM_ZIP_MESSAGE}"
|
|
local message="${3:-$tmp_message}"
|
|
# set the readme list of extensions
|
|
{
|
|
echo -n "- [${VDM_OWNER}/${VDM_REPO}]"
|
|
echo -n "(https://${VDM_URL}/${VDM_OWNER}/${VDM_REPO})"
|
|
echo " [${zip_name}](${zip_url})"
|
|
echo "> ${message}"
|
|
} >>"${VDM_README_FILES_MD}"
|
|
}
|
|
|
|
# set the File Details to XML
|
|
function setFileToXML() {
|
|
local tmp_zip_name="${VDM_OWNER}__${VDM_REPO}__${VDM_ZIP_NAME}.zip"
|
|
local zip_name="${1:-$tmp_zip_name}"
|
|
# add the file xml details
|
|
{
|
|
echo -en '\t\t<file type="'
|
|
echo -n "${VDM_TYPE}"
|
|
echo -n '" id="'
|
|
echo -n "${VDM_ID}"
|
|
echo -n '"'
|
|
[[ -n "${VDM_TYPE_KEY}" ]] &&
|
|
echo -n " ${VDM_TYPE_KEY}=" &&
|
|
echo -n '"' &&
|
|
echo -n "${VDM_TYPE_VAL}" &&
|
|
echo -n '"'
|
|
echo ">$zip_name</file>"
|
|
} >>"${VDM_FILES_XML}"
|
|
}
|
|
|
|
# make API call
|
|
function callGiteaAPI() {
|
|
# the locals
|
|
local mode="${1}"
|
|
local owner="${2}"
|
|
local repo="${3}"
|
|
local api="${4}"
|
|
local token="${5}"
|
|
local zip_packages
|
|
local message
|
|
# each time reset
|
|
unset VDM_API_BUCKET
|
|
# give message
|
|
_echo "[info] Getting ${mode} information from ${owner}/${repo} repository."
|
|
# get the zip packages
|
|
zip_packages=$(curl -s -X 'GET' "${api}/repos/${owner}/${repo}/${mode}?access_token=${token}" -H 'accept: application/json')
|
|
# check for error
|
|
if [[ "${zip_packages}" =~ '"errors"' ]] && [[ "${zip_packages}" =~ '"message"' ]]; then
|
|
# get the message
|
|
message=$(echo "${zip_packages}" | jq -r ".message")
|
|
# check that we have tags (not ideal, but to catch wrong repo path)
|
|
_echo "[error] failed to get ${mode} from ${owner}/${repo} repository [${message}]."
|
|
# we an add more later
|
|
return 12
|
|
elif [ "${zip_packages}" = '[]' ]; then
|
|
# check that we have tags (not ideal, but to catch wrong repo path)
|
|
_echo "[error] failed to get ${mode} from ${owner}/${repo} repository."
|
|
# we an add more later
|
|
return 12
|
|
fi
|
|
# get the latest
|
|
VDM_API_BUCKET=$(echo "${zip_packages}" | jq ".[0]")
|
|
# success
|
|
export VDM_API_BUCKET
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set the package language file and xml
|
|
function setLanguages() {
|
|
# little information of progress
|
|
_echo "[info] Loading the Languages..."
|
|
# make sure its reset
|
|
echo -e '\t<languages folder="languages">' >"${VDM_LANGUAGES_XML}"
|
|
# check for errors
|
|
local has_error
|
|
# loop over the repos
|
|
i=0
|
|
for vdm_lang_tag in $(echo "${VDM_CONFIG_DATA}" | jq -r '.languages[].tag'); do
|
|
# check for errors
|
|
has_error=false
|
|
# get the config values needed
|
|
getConfigValue 'vdm_lang_ini' ".languages[$i].ini" || has_error=true
|
|
getConfigValue 'vdm_lang_key' ".languages[$i].key" || has_error=true
|
|
getConfigValue 'vdm_lang_value' ".languages[$i].value" || has_error=true
|
|
# check if we have some errors already
|
|
if $has_error; then
|
|
clearLangEnv
|
|
continue
|
|
fi
|
|
# set file name
|
|
# shellcheck disable=SC2154
|
|
language_file_name="${vdm_lang_tag}.${VDM_PACKAGE_NAME,,}.${vdm_lang_ini}"
|
|
# set file path
|
|
language_file_path="${VDM_PACKAGE_LANG_DIR}/${vdm_lang_tag}/${language_file_name}"
|
|
# build the language string
|
|
# shellcheck disable=SC2154
|
|
language_string="${vdm_lang_key}="
|
|
language_string+='"'
|
|
# shellcheck disable=SC2154
|
|
language_string+="${vdm_lang_value}"
|
|
language_string+='"'
|
|
# create dir for language and add to xml only once
|
|
if [ ! -d "${VDM_PACKAGE_LANG_DIR}/${vdm_lang_tag}" ]; then
|
|
# create the language directory
|
|
mkdir -p "${VDM_PACKAGE_LANG_DIR}/${vdm_lang_tag}"
|
|
fi
|
|
# add value to language file
|
|
if [ -f "${language_file_path}" ]; then
|
|
echo "${language_string}" >>"${language_file_path}"
|
|
else
|
|
# first time
|
|
echo "${language_string}" >"${language_file_path}"
|
|
# add to xml
|
|
setLanguageXml "${vdm_lang_tag}" "${vdm_lang_tag}/${language_file_name}"
|
|
fi
|
|
# increment
|
|
((i++))
|
|
# load the Project name to Readme when found
|
|
# shellcheck disable=SC1090
|
|
[ "${vdm_lang_tag}" = "${VDM_PACKAGER_LANG}" ] && source "${language_file_path}"
|
|
# remove values
|
|
clearLangEnv
|
|
done
|
|
# make sure its reset
|
|
echo -e '\t</languages>' >>"${VDM_LANGUAGES_XML}"
|
|
}
|
|
|
|
# just to clear all file ENVs
|
|
function clearLangEnv() {
|
|
# SET IN: setLanguages
|
|
unset vdm_lang_tag
|
|
unset vdm_lang_ini
|
|
unset vdm_lang_key
|
|
unset vdm_lang_value
|
|
}
|
|
|
|
# set the Language XML Details
|
|
function setLanguageXml() {
|
|
# add the file details
|
|
{
|
|
echo -en '\t\t<language tag="'
|
|
echo -n "${1}"
|
|
echo -n '">'
|
|
echo -n "${2}"
|
|
echo '</language>'
|
|
} >>"${VDM_LANGUAGES_XML}"
|
|
}
|
|
|
|
# set the Package XML Details
|
|
function setPackageXml() {
|
|
# little information of progress
|
|
_echo "[info] Setting the Package XML..."
|
|
# set the local version
|
|
local version
|
|
# remove all but numbers and points
|
|
# TODO we need to allow only stable versions (when getting the tags)
|
|
# shellcheck disable=SC2001
|
|
version=$(echo "${VDM_PACKAGE_VERSION:-1.0.0}" | sed 's/[^0-9.]//g')
|
|
# add the package details
|
|
{
|
|
echo '<?xml version="1.0" encoding="utf-8"?>'
|
|
echo -n '<extension version="'
|
|
echo -n "${VDM_MIN_JOOMLA_VERSION:-3.8}"
|
|
echo '" type="package" method="upgrade">'
|
|
# set the name
|
|
echo -en '\t<name>'
|
|
echo -n "${VDM_NAME}"
|
|
echo '</name>'
|
|
# set the package name
|
|
echo -en '\t<packagename>'
|
|
echo -n "${VDM_CODE_NAME,,}"
|
|
echo '</packagename>'
|
|
# set the version
|
|
echo -en '\t<version>'
|
|
echo -n "${version}"
|
|
echo '</version>'
|
|
# set the creationDate
|
|
echo -en '\t<creationDate>'
|
|
echo -n "${CREATION_DATE}"
|
|
echo '</creationDate>'
|
|
# set the author
|
|
echo -en '\t<author>'
|
|
echo -n "${VDM_AUTHOR}"
|
|
echo '</author>'
|
|
# set the authorEmail
|
|
echo -en '\t<authorEmail>'
|
|
echo -n "${VDM_AUTHOR_EMAIL}"
|
|
echo '</authorEmail>'
|
|
# set the authorUrl
|
|
echo -en '\t<authorUrl>'
|
|
echo -n "${VDM_AUTHOR_URL}"
|
|
echo '</authorUrl>'
|
|
# set the copyright
|
|
echo -en '\t<copyright>'
|
|
echo -n "${VDM_COPYRIGHT}"
|
|
echo '</copyright>'
|
|
# set the copyrightyear
|
|
echo -en '\t<copyrightyear>'
|
|
echo -n "${VDM_COPYRIGHT_YEAR:-$CREATION_YEAR}"
|
|
echo '</copyrightyear>'
|
|
# set the license
|
|
echo -en '\t<license>'
|
|
echo -n "${VDM_LICENSE}"
|
|
echo '</license>'
|
|
# set the packager
|
|
echo -en '\t<packager>'
|
|
echo -n "${VDM_PACKAGER:-$PROGRAM_NAME}"
|
|
echo '</packager>'
|
|
# set the packagerurl
|
|
echo -en '\t<packagerurl>'
|
|
echo -n "${VDM_PACKAGER_URL:-$PROGRAM_URL}"
|
|
echo '</packagerurl>'
|
|
# set the description
|
|
echo -en '\t<description>'
|
|
echo -n "${VDM_DESCRIPTION}"
|
|
echo '</description>'
|
|
# set the script file if found
|
|
if [ -n "${VDM_INSTALLATION_FILE}" ]; then
|
|
echo -en '\t<scriptfile>'
|
|
echo -n "install_${VDM_CODE_NAME,,}.php"
|
|
echo '</scriptfile>'
|
|
fi
|
|
# set the update server if found
|
|
if [ -n "${VDM_UPDATE_SERVER}" ]; then
|
|
echo -e '\t<updateservers>'
|
|
echo -en '\t\t<server type="extension" name="'
|
|
[ -n "${!VDM_NAME}" ] && echo -n "${!VDM_NAME}" || echo -n "${VDM_NAME}"
|
|
echo -n ' - Updates" element="'
|
|
echo -n "${VDM_PACKAGE_NAME}"
|
|
echo -n '">'
|
|
echo -n "${VDM_UPDATE_SERVER}"
|
|
echo '</server>'
|
|
echo -e '\t</updateservers>'
|
|
fi
|
|
# add the languages
|
|
cat "${VDM_LANGUAGES_XML}"
|
|
# add the files
|
|
cat "${VDM_FILES_XML}"
|
|
# close the extension xml
|
|
echo '</extension>'
|
|
} >"${VDM_PACKAGE_XML}"
|
|
# remove file no longer needed
|
|
rm "${VDM_LANGUAGES_XML}"
|
|
rm "${VDM_FILES_XML}"
|
|
}
|
|
|
|
# set the package README
|
|
function setReadMe() {
|
|
# little information of progress
|
|
_echo "[info] Setting the README..."
|
|
# add the Project Name to Readme
|
|
{
|
|
[ -n "${!VDM_NAME}" ] && echo -n "# ${!VDM_NAME}" || echo -n "# ${VDM_NAME}"
|
|
# add the version
|
|
echo " (${VDM_PACKAGE_VERSION:-1.0.0})"
|
|
echo ""
|
|
# set the Description
|
|
reg="[[:space:]]+"
|
|
if [[ "${VDM_DESCRIPTION}" =~ $reg ]]; then
|
|
echo "${VDM_DESCRIPTION}"
|
|
else
|
|
[ -n "${!VDM_DESCRIPTION}" ] && echo "${!VDM_DESCRIPTION}" || echo "${VDM_DESCRIPTION}"
|
|
fi
|
|
echo ""
|
|
echo "## Details"
|
|
echo ""
|
|
echo "- Packager: [${VDM_PACKAGER}](${VDM_PACKAGER_URL})"
|
|
echo "- Author: [${VDM_AUTHOR}](${VDM_AUTHOR_URL})"
|
|
echo "- Creation Date: ${CREATION_DATE}"
|
|
[ -n "${VDM_MAX_JOOMLA_VERSION}" ] && echo "- Max Joomla Version: J${VDM_MAX_JOOMLA_VERSION}"
|
|
echo "- Minimum Joomla Version: J${VDM_MIN_JOOMLA_VERSION}"
|
|
echo ""
|
|
echo "## Extensions"
|
|
# add the list of extensions
|
|
cat "${VDM_README_FILES_MD}"
|
|
echo ""
|
|
echo "### Copyright (${VDM_COPYRIGHT_YEAR:-$CREATION_YEAR})"
|
|
echo "> ${VDM_COPYRIGHT}"
|
|
echo "### License"
|
|
echo "> ${VDM_LICENSE}"
|
|
echo ""
|
|
} >"${VDM_README_MD}"
|
|
# remove the Readme files build
|
|
rm "${VDM_README_FILES_MD:?}"
|
|
}
|
|
|
|
# set the license file
|
|
function setLicenseFile() {
|
|
local has_error=false
|
|
# check if the license file is passed via a URL
|
|
if [[ "${VDM_LICENSE_FILE}" =~ ^"http:" ]] || [[ "${VDM_LICENSE_FILE}" =~ ^"https:" ]]; then
|
|
# shellcheck disable=SC2143
|
|
if [[ $(wget -S --spider "${VDM_LICENSE_FILE}" 2>&1 | grep 'HTTP/1.1 200 OK') ]]; then
|
|
wget --quiet "${VDM_LICENSE_FILE}" -O "${VDM_LICENSE_FILE_PATH}"
|
|
VDM_LICENSE_FILE="LICENSE"
|
|
else
|
|
echo >&2 "[error] The license:${VDM_LICENSE_FILE} is not a valid URL."
|
|
has_error=true
|
|
fi
|
|
elif [ -f "${VDM_LICENSE_DIR}/${VDM_LICENSE_FILE}" ]; then
|
|
# now copy the license file
|
|
cp "${VDM_LICENSE_DIR}/${VDM_LICENSE_FILE}" "${VDM_LICENSE_FILE_PATH}"
|
|
else
|
|
echo >&2 "[error] The license:${VDM_LICENSE_DIR}/${VDM_LICENSE_FILE} not found."
|
|
has_error=true
|
|
fi
|
|
# check if we have some errors
|
|
if $has_error; then
|
|
return 16
|
|
fi
|
|
# little information of progress
|
|
_echo "[info] Setting the License File..."
|
|
return 0
|
|
}
|
|
|
|
# set the install file
|
|
function setInstallFile() {
|
|
local has_error=false
|
|
# check if the installation script file is passed via a URL
|
|
if [[ "${VDM_INSTALLATION_FILE}" =~ ^"http:" ]] || [[ "${VDM_INSTALLATION_FILE}" =~ ^"https:" ]]; then
|
|
# shellcheck disable=SC2143
|
|
if [[ $(wget -S --spider "${VDM_INSTALLATION_FILE}" 2>&1 | grep 'HTTP/1.1 200 OK') ]]; then
|
|
wget --quiet "${VDM_INSTALLATION_FILE}" -O "${VDM_INSTALL_PHP}"
|
|
else
|
|
echo >&2 "[error] The installation script file:${VDM_INSTALLATION_FILE} is not a valid URL."
|
|
has_error=true
|
|
fi
|
|
elif [ -f "${VDM_INSTALLATION_FILE}" ]; then
|
|
# now copy the installation script file
|
|
cp "${VDM_INSTALLATION_FILE}" "${VDM_INSTALL_PHP}"
|
|
fi
|
|
# check if we have some errors
|
|
if $has_error; then
|
|
return 16
|
|
fi
|
|
# little information of progress
|
|
_echo "[info] Setting the Installation.php File..."
|
|
return 0
|
|
}
|
|
|
|
# get the package repository
|
|
function setRepository() {
|
|
# change to git directory
|
|
cd "${VDM_PACKAGE_GIT_DIR}" || return 22
|
|
# check if the repository exist on our gitea instance
|
|
local update_repo
|
|
# shellcheck disable=SC2015
|
|
if git ls-remote "ssh://git@${VDM_PACKAGE_URL}/${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" -q >/dev/null 2>&1; then
|
|
getExistingRepository || return 23
|
|
update_repo=true
|
|
else
|
|
setNewRepository || return 24
|
|
update_repo=false
|
|
fi
|
|
# make sure we are in the correct dir and then remove all existing data
|
|
cd "${VDM_PACKAGE_GIT_DIR}/${VDM_PACKAGE_REPO}" || return 25
|
|
# remove any existing files and folders from repository
|
|
rm -rf -- * || return 26
|
|
# move all new files into repository
|
|
setRepositoryNewFiles || return 27
|
|
# check if we have changes
|
|
if $update_repo && [[ -z $(git status --porcelain) ]]; then
|
|
_echo "[info] No changes found in (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
else
|
|
# add user details
|
|
setUserDetails
|
|
# check if we must update or create repository
|
|
if $update_repo; then
|
|
# make API call
|
|
callGiteaAPI "tags" "${VDM_PACKAGE_OWNER}" "${VDM_PACKAGE_REPO}" "${VDM_PACKAGE_API}" "${VDM_PACKAGE_TOKEN}" || return 28
|
|
# get the name
|
|
if [ -n "${VDM_API_BUCKET}" ]; then
|
|
version_name=$(echo "${VDM_API_BUCKET}" | jq -r ".name")
|
|
else
|
|
return 28
|
|
fi
|
|
# set update message
|
|
if [ "${VDM_PACKAGE_VERSION:-1.0.0}" != "${version_name}" ]; then
|
|
message="Update - ${VDM_PACKAGE_VERSION:-1.0.0}"
|
|
else
|
|
message="Update"
|
|
fi
|
|
# get the repository last tag
|
|
makeGitCommit "${message}" "${VDM_PACKAGE_VERSION:-1.0.0}" "${version_name}" || return 28
|
|
# give little notice of progress
|
|
_echo "[info] Pushing changes to (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# make a normal push update
|
|
git push >/dev/null 2>&1 || return 30
|
|
git push --tags >/dev/null 2>&1 || return 30
|
|
else
|
|
# create new repo
|
|
setGitRepository || return 29
|
|
# give little notice of progress
|
|
_echo "[info] Pushing (TO CREATE) changes to (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# push to creat the repository (if allowed)
|
|
git push -u origin master >/dev/null 2>&1 || return 30
|
|
git push --tags >/dev/null 2>&1 || return 30
|
|
fi
|
|
fi
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# get the existing repository
|
|
function getExistingRepository() {
|
|
# little information of progress
|
|
_echo "[info] Getting (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# clone the existing repository
|
|
git clone "ssh://git@${VDM_PACKAGE_URL}/${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 23
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set the new repository
|
|
function setNewRepository() {
|
|
# little information of progress
|
|
_echo "[info] Creating (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) folder"
|
|
# check if the repository exist on our gitea instance
|
|
mkdir -p "${VDM_PACKAGE_GIT_DIR}/${VDM_PACKAGE_REPO}" || return 24
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# set new git repository
|
|
function setGitRepository() {
|
|
# little information of progress
|
|
_echo "[info] Initializing the (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# initialize the repository
|
|
git init >/dev/null 2>&1 || return 29
|
|
# add the first commit
|
|
makeGitCommit "First Commit - ${VDM_PACKAGE_VERSION:-1.0.0}" "${VDM_PACKAGE_VERSION:-1.0.0}" >/dev/null 2>&1 || return 28
|
|
# little information of progress
|
|
_echo "[info] Adding remote branch to (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# add the remote branch
|
|
git remote add origin "ssh://git@${VDM_PACKAGE_URL}/${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 29
|
|
#success
|
|
return 0
|
|
}
|
|
|
|
# Set Git user details based on environment variables
|
|
function setUserDetails () {
|
|
# Set Git author name
|
|
if [ -n "${GIT_AUTHOR_NAME+x}" ]; then
|
|
git config user.name "${GIT_AUTHOR_NAME}"
|
|
_echo "[info] Git author name set to: ${GIT_AUTHOR_NAME}"
|
|
fi
|
|
|
|
# Set Git author email
|
|
if [ -n "${GIT_AUTHOR_EMAIL+x}" ]; then
|
|
git config user.email "${GIT_AUTHOR_EMAIL}"
|
|
_echo "[info] Git author email set to: ${GIT_AUTHOR_EMAIL}"
|
|
fi
|
|
|
|
# Set Git GPG sign
|
|
if [ -n "${GIT_GPG_SIGN+x}" ]; then
|
|
git config commit.gpgsign "${GIT_GPG_SIGN}"
|
|
_echo "[info] Git GPG sign set to: ${GIT_GPG_SIGN}"
|
|
fi
|
|
|
|
# Set Git SSH key path
|
|
if [ -n "${GIT_SSH_KEY_PATH+x}" ]; then
|
|
git config core.sshCommand "ssh -i ${GIT_SSH_KEY_PATH}"
|
|
_echo "[info] Git SSH key path set to: ${GIT_SSH_KEY_PATH}"
|
|
fi
|
|
|
|
# Set Git GPG key
|
|
if [ -n "${GIT_GPG_KEY+x}" ]; then
|
|
git config user.signingkey "${GIT_GPG_KEY}"
|
|
_echo "[info] Git GPG key set to: ${GIT_GPG_KEY}"
|
|
fi
|
|
}
|
|
|
|
# make the git commit
|
|
function makeGitCommit() {
|
|
# add all (or remove)
|
|
git add . >/dev/null 2>&1 || return 28
|
|
# little information of progress
|
|
_echo "[info] Committing (${1}) to (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# set the commit message
|
|
git commit -am"${1}" >/dev/null 2>&1 || return 28
|
|
# check if the tag should be added
|
|
if [ "${2:-error}" != "error" ] && [ "${2:-error}" != "${3:-none}" ]; then
|
|
# little information of progress
|
|
_echo "[info] Adding TAG (${2}) to (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
|
# add the new tag
|
|
git tag "${2}" >/dev/null 2>&1 || return 28
|
|
fi
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# add all the new files to the repository
|
|
function setRepositoryNewFiles() {
|
|
# little information of progress
|
|
_echo "[info] Moving new files into the (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) directory"
|
|
_echo "[info] Removing the ${VDM_PACKAGE_DIR:?} directory"
|
|
# move all the new files
|
|
if [ -d "${VDM_PACKAGE_DIR}" ]; then
|
|
mv "${VDM_PACKAGE_DIR:?}/"* "${VDM_PACKAGE_GIT_DIR}/${VDM_PACKAGE_REPO}" >/dev/null 2>&1 &&
|
|
rm -rf "${VDM_PACKAGE_DIR:?}" >/dev/null 2>&1 ||
|
|
return 27
|
|
else
|
|
return 27
|
|
fi
|
|
# success
|
|
return 0
|
|
}
|
|
|
|
# gives us a unique file name for any url
|
|
function getUniqueFileName() {
|
|
local url="$1"
|
|
local hash
|
|
hash=$(echo "$url" | sha256sum | awk '{print $1}')
|
|
echo "${hash:0:10}"
|
|
}
|
|
|
|
# give the echo messages
|
|
# only if not set to be quiet
|
|
function _echo() {
|
|
if (("$QUIET" == 0)); then
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
# uninstalls the octojpack program.
|
|
function runUninstall() {
|
|
# now remove the script
|
|
if [ -f "/usr/local/bin/${PROGRAM_CODE}" ]; then
|
|
sudo rm -f "/usr/local/bin/${PROGRAM_CODE}"
|
|
echo "[info] ${PROGRAM_NAME} v${PROGRAM_VERSION} has been completely uninstalled."
|
|
else
|
|
echo "[info] ${PROGRAM_NAME} v${PROGRAM_VERSION} is not installed."
|
|
fi
|
|
}
|
|
|
|
# check if we have project overrides for the environment variables
|
|
function getProjectEnvironment() {
|
|
# load the config data
|
|
VDM_CONFIG_DATA=$(cat "$VDM_PACKAGE_CONF_FILE")
|
|
# make sure we have package details
|
|
if [[ "${VDM_CONFIG_DATA}" =~ '"package"' ]] && [[ "${VDM_CONFIG_DATA}" =~ '"files"' ]]; then
|
|
# little information of progress
|
|
_echo "[info] Loading the environment variables..."
|
|
# make configuration globally available
|
|
export VDM_CONFIG_DATA
|
|
# get package code_name
|
|
getConfigValue 'VDM_CODE_NAME' '.package.code_name'
|
|
# the tmp path to the env of this project
|
|
tmp_path="/home/$USER/.config/${PROGRAM_CODE}/.${VDM_CODE_NAME}"
|
|
# shellcheck disable=SC1090
|
|
[ -f "${tmp_path}" ] && source "${tmp_path}"
|
|
# clear this tmp out
|
|
unset tmp_path
|
|
# success
|
|
return 0
|
|
else
|
|
# failed
|
|
return 17
|
|
fi
|
|
}
|
|
|
|
# updates the octojpack program to the latest version.
|
|
function runUpdate() {
|
|
# remove the current version
|
|
if [ -f "/usr/local/bin/${PROGRAM_CODE}" ]; then
|
|
# just backup in case of failure
|
|
sudo mv "/usr/local/bin/${PROGRAM_CODE}" "/usr/local/bin/${PROGRAM_CODE}.bak"
|
|
fi
|
|
# pull the latest version. Master is always the latest
|
|
if sudo curl --fail -L "https://git.vdm.dev/api/v1/repos/octoleo/${PROGRAM_CODE}/raw/src/${PROGRAM_CODE}?ref=${branch:-master}" -o "/usr/local/bin/${PROGRAM_CODE}" 2>/dev/null; then
|
|
# give success message
|
|
echo "[success] Update was successful."
|
|
# do we have a backup
|
|
if [ -f "/usr/local/bin/${PROGRAM_CODE}.bak" ]; then
|
|
# lets remove it now
|
|
sudo rm -f "/usr/local/bin/${PROGRAM_CODE}.bak"
|
|
fi
|
|
else
|
|
# show the error
|
|
echo >&2 "[error] Update failed! Please try again later."
|
|
# do we have a backup
|
|
if [ -f "/usr/local/bin/${PROGRAM_CODE}.bak" ]; then
|
|
# move backup back
|
|
sudo mv "/usr/local/bin/${PROGRAM_CODE}.bak" "/usr/local/bin/${PROGRAM_CODE}"
|
|
fi
|
|
fi
|
|
# always set the permission again if we have a file
|
|
if [ -f "/usr/local/bin/${PROGRAM_CODE}" ]; then
|
|
# the we make sure its executable
|
|
sudo chmod +x "/usr/local/bin/${PROGRAM_CODE}"
|
|
fi
|
|
# always exit so the new script can load
|
|
exit 0
|
|
}
|
|
|
|
# help message ʕ•ᴥ•ʔ
|
|
function show_help() {
|
|
cat <<EOF
|
|
Usage: ${PROGRAM_CODE} [OPTION...]
|
|
Options
|
|
======================================================
|
|
-p | --packager=<packager Name>
|
|
Packager name
|
|
example: ${PROGRAM_CODE} -p="Vast Development Method"
|
|
======================================================
|
|
-pu | --packager-url=<//packager.url>
|
|
Packager url
|
|
example: ${PROGRAM_CODE} -pu="https://git.vdm.dev/"
|
|
======================================================
|
|
-md | --main-dir=<path>
|
|
load the main working directory
|
|
example: ${PROGRAM_CODE} --main-dir=/src
|
|
======================================================
|
|
-e | --env=<file>
|
|
load the environment variables file
|
|
example: ${PROGRAM_CODE} --env=/src/.env
|
|
======================================================
|
|
--conf | --config=<path/url>
|
|
load the configuration for the package in json format
|
|
file-example: src/example.json
|
|
example: ${PROGRAM_CODE} --config=config.json
|
|
======================================================
|
|
-ld | --licence-dir=<path>
|
|
load the licence directory
|
|
example: ${PROGRAM_CODE} --licence-dir=/src/licence
|
|
======================================================
|
|
-t | --token=<access_token>
|
|
load the global token
|
|
example: ${PROGRAM_CODE} --token=xxxxxxxxxxxxxxxxxxxxxxxxx
|
|
======================================================
|
|
-u | --url=<gitea>
|
|
Global url of the Gitea instance
|
|
example: ${PROGRAM_CODE} --url="git.vdm.dev"
|
|
======================================================
|
|
-a | --api=<//gitea.api>
|
|
Global api of the Gitea instance
|
|
example: ${PROGRAM_CODE} --api="https://git.vdm.dev/api/v1"
|
|
======================================================
|
|
-q | --quiet
|
|
mute all output messages
|
|
example: ${PROGRAM_CODE} --quiet
|
|
======================================================
|
|
--update
|
|
to update your install
|
|
example: ${PROGRAM_CODE} --update
|
|
======================================================
|
|
--uninstall
|
|
to uninstall this script
|
|
example: ${PROGRAM_CODE} --uninstall
|
|
======================================================
|
|
-h|--help
|
|
display this help menu
|
|
example: ${PROGRAM_CODE} -h
|
|
example: ${PROGRAM_CODE} --help
|
|
======================================================
|
|
${PROGRAM_NAME} v${PROGRAM_VERSION}
|
|
======================================================
|
|
EOF
|
|
}
|
|
|
|
# SET THE DEFAULTS #####################################
|
|
# get start time
|
|
# shellcheck disable=SC2034
|
|
START_BUILD=$(date +"%s")
|
|
# use UTC+00:00 time also called zulu
|
|
# shellcheck disable=SC2034
|
|
START_DATE=$(TZ=":ZULU" date +"%m/%d/%Y @ %R (UTC)")
|
|
CREATION_DATE=$(TZ=":ZULU" date +"%B %Y")
|
|
CREATION_YEAR=$(TZ=":ZULU" date +"%Y")
|
|
|
|
# the quiet switch
|
|
QUIET="${QUIET:-0}"
|
|
|
|
# we set the packager directorys
|
|
tmp_path="/home/$USER/${PROGRAM_CODE}"
|
|
# ALWAYS USE GLOBAL IF SET
|
|
VDM_MAIN_DIR="${VDM_MAIN_DIR:-$tmp_path}"
|
|
|
|
# we set the licenses directory
|
|
tmp_path="${VDM_MAIN_DIR}/licenses"
|
|
[ -d "$tmp_path" ] || tmp_path="/home/$USER/${PROGRAM_CODE}/licenses"
|
|
# if path not set try $PWD path
|
|
[ -d "$tmp_path" ] || tmp_path="$PWD"
|
|
# ALWAYS USE GLOBAL IF SET
|
|
VDM_LICENSE_DIR="${VDM_LICENSE_DIR:-$tmp_path}"
|
|
|
|
# the environment file variables path
|
|
tmp_path="$PWD/.env_${PROGRAM_CODE}"
|
|
# if file not set try $PWD path
|
|
[ -f "$tmp_path" ] || tmp_path="$VDM_MAIN_DIR/.env_${PROGRAM_CODE}"
|
|
# if file not set try $VDM_MAIN_DIR path
|
|
[ -f "$tmp_path" ] || tmp_path="/home/$USER/.config/${PROGRAM_CODE}/.env"
|
|
# ALWAYS USE GLOBAL IF SET
|
|
VDM_ENV_FILE_PATH="${VDM_ENV_FILE_PATH:-$tmp_path}"
|
|
|
|
# clear this tmp out
|
|
unset tmp_path
|
|
|
|
# check if we have options
|
|
while :; do
|
|
case $1 in
|
|
-h | --help)
|
|
show_help # Display a usage synopsis.
|
|
exit
|
|
;;
|
|
-q | --quiet)
|
|
QUIET=1
|
|
;;
|
|
--uninstall)
|
|
runUninstall
|
|
shift
|
|
;;
|
|
--update)
|
|
runUpdate
|
|
shift
|
|
;;
|
|
-md=* | --main-dir=*)
|
|
VDM_MAIN_DIR=${1#*=}
|
|
if [ -z "$VDM_MAIN_DIR" ]; then
|
|
echo '[error] "--main-dir" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-e=* | --env=*)
|
|
VDM_ENV_FILE_PATH=${1#*=}
|
|
if [ -z "$VDM_ENV_FILE_PATH" ]; then
|
|
echo '[error] "--env" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
--conf=* | --config=*)
|
|
VDM_PACKAGE_CONF_FILE=${1#*=}
|
|
if [ -z "$VDM_PACKAGE_CONF_FILE" ]; then
|
|
echo '[error] "--conf" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-ld=* | --licence-dir=*)
|
|
VDM_LICENSE_DIR=${1#*=}
|
|
if [ -z "$VDM_LICENSE_DIR" ]; then
|
|
echo '[error] "--licence-dir" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-p=* | --packager=*)
|
|
VDM_PACKAGER=${1#*=}
|
|
if [ -z "$VDM_PACKAGER" ]; then
|
|
echo '[error] "--packager" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-pu=* | --packager-url=*)
|
|
VDM_PACKAGER_URL=${1#*=}
|
|
if [ -z "$VDM_PACKAGER_URL" ]; then
|
|
echo '[error] "--packager-url" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-t=* | --token=*)
|
|
VDM_GLOBAL_TOKEN=${1#*=}
|
|
if [ -z "$VDM_GLOBAL_TOKEN" ]; then
|
|
echo '[error] "--token" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-a=* | --api=*)
|
|
VDM_GLOBAL_API=${1#*=}
|
|
if [ -z "$VDM_GLOBAL_API" ]; then
|
|
echo '[error] "--api" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-u=* | --url=*)
|
|
VDM_GLOBAL_URL=${1#*=}
|
|
if [ -z "$VDM_GLOBAL_URL" ]; then
|
|
echo '[error] "--url" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
-v=* | --verbosity=*)
|
|
VDM_VERBOSITY=${1#*=}
|
|
if [ -z "$VDM_VERBOSITY" ]; then
|
|
echo '[error] "--verbosity" requires a non-empty option argument.'
|
|
exit 17
|
|
fi
|
|
;;
|
|
--) # End of all options.
|
|
shift
|
|
break
|
|
;;
|
|
-?*)
|
|
printf '[error] Unknown option: %s\n' "$1" >&2
|
|
exit 1
|
|
;;
|
|
*) # Default case: If no more options then break out of the loop.
|
|
break
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# load local environment variables
|
|
if [ -f "$VDM_ENV_FILE_PATH" ]; then
|
|
# shellcheck disable=SC1090
|
|
source "$VDM_ENV_FILE_PATH"
|
|
fi
|
|
|
|
# if path not set try $PWD path (so you can open a folder that has .octojpack file and it will be loaded)
|
|
tmp_path="$PWD/.${PROGRAM_CODE}"
|
|
# if file not set try $VDM_MAIN_DIR path
|
|
[ -f "$tmp_path" ] || tmp_path="$VDM_MAIN_DIR/.${PROGRAM_CODE}"
|
|
# ALWAYS USE GLOBAL IF SET
|
|
VDM_PACKAGE_CONF_FILE=${VDM_PACKAGE_CONF_FILE:-$tmp_path}
|
|
|
|
# Check if the config file is passed as a URL
|
|
if [[ "$VDM_PACKAGE_CONF_FILE" =~ ^http: ]] || [[ "$VDM_PACKAGE_CONF_FILE" =~ ^https: ]]; then
|
|
# Check if the URL is valid
|
|
if curl --output /dev/null --silent --head --fail "$VDM_PACKAGE_CONF_FILE"; then
|
|
# Create the directory for the configuration file if it doesn't exist
|
|
mkdir -p "$HOME/.config/$PROGRAM_CODE/projects"
|
|
|
|
# get a file name
|
|
file_name=$(getUniqueFileName "$VDM_PACKAGE_CONF_FILE")
|
|
|
|
# Download the configuration file
|
|
curl --silent "$VDM_PACKAGE_CONF_FILE" -o "$HOME/.config/$PROGRAM_CODE/projects/${file_name}_conf.json"
|
|
VDM_PACKAGE_CONF_FILE="$HOME/.config/$PROGRAM_CODE/projects/${file_name}_conf.json"
|
|
else
|
|
# Print an error message and exit if the URL is invalid
|
|
echo >&2 "[error] The config file at $VDM_PACKAGE_CONF_FILE is not a valid URL. Aborting."
|
|
exit 18
|
|
fi
|
|
fi
|
|
|
|
# make sure whe have a configuration file
|
|
[ -f "${VDM_PACKAGE_CONF_FILE}" ] || {
|
|
echo >&2 "[error] The config:${VDM_PACKAGE_CONF_FILE:-empty_value} could not be found. Aborting."
|
|
exit 18
|
|
}
|
|
|
|
# run Main ┬┴┬┴┤(・_├┬┴┬┴
|
|
main
|
|
|
|
exit 0
|