Compare commits
10 Commits
Author | SHA1 | Date | |
---|---|---|---|
54227596c2
|
|||
f480b6f1f3
|
|||
052353765d
|
|||
288f45832c
|
|||
3e0cdc9628
|
|||
ce947c5826
|
|||
ee4b5003cd
|
|||
5aa4369f83
|
|||
69738f8be6
|
|||
0cacdd8ed5
|
12
README.md
12
README.md
@ -1,12 +1,18 @@
|
||||
# Octojpack - Easy Joomla Extension Packaging
|
||||
<h2><img align="middle" src="https://raw.githubusercontent.com/odb/official-bash-logo/master/assets/Logos/Icons/PNG/64x64.png" >
|
||||
Octojpack - Easy Joomla Extension Packaging
|
||||
</h2>
|
||||
|
||||
Written by Llewellyn van der Merwe (@llewellynvdm)
|
||||
|
||||
With this script we can easily package multiple extensions in an automated way from a json configuration file, and environment variables.
|
||||
|
||||
Linted by [#ShellCheck](https://github.com/koalaman/shellcheck)
|
||||
|
||||
> program only for ubuntu/debian and Gitea systems at this time (should you like to use it on other OS's please open and issue...)
|
||||
---
|
||||
# Install
|
||||
```shell
|
||||
$ sudo curl -L "https://git.vdm.dev/api/v1/repos/octoleo/octojpack/raw/src/octojpack" -o /usr/local/bin/octojpack
|
||||
$ sudo curl -L "https://raw.githubusercontent.com/octoleo/octojpack/refs/heads/master/src/octojpack" -o /usr/local/bin/octojpack
|
||||
$ sudo chmod +x /usr/local/bin/octojpack
|
||||
```
|
||||
---
|
||||
@ -138,4 +144,4 @@ $ octojpack --uninstall
|
||||
```txt
|
||||
@copyright Copyright (C) 2021 Llewellyn van der Merwe. All rights reserved.
|
||||
@license GNU General Public License version 2; see LICENSE
|
||||
```
|
||||
```
|
||||
|
128
src/octojpack
128
src/octojpack
@ -3,7 +3,7 @@
|
||||
# Program name
|
||||
PROGRAM_NAME="Octojpack"
|
||||
PROGRAM_CODE="octojpack"
|
||||
PROGRAM_VERSION="1.3.0"
|
||||
PROGRAM_VERSION="1.3.8"
|
||||
PROGRAM_V="1.3"
|
||||
PROGRAM_URL="https://git.vdm.dev/octoleo/${PROGRAM_CODE}"
|
||||
|
||||
@ -249,7 +249,7 @@ function setValueFromJson() {
|
||||
}
|
||||
|
||||
# Safely use eval to dynamically set the value
|
||||
eval "$target_var"=\'"$value"\'
|
||||
declare -g "$target_var"="$value"
|
||||
}
|
||||
|
||||
# Get value from JSON
|
||||
@ -680,12 +680,20 @@ function callGiteaAPI() {
|
||||
local token="${5}"
|
||||
local json_data
|
||||
local message
|
||||
local url
|
||||
# each time reset
|
||||
unset VDM_API_BUCKET
|
||||
# give message
|
||||
_echo "[info] Getting ${mode} information from ${owner}/${repo} repository."
|
||||
# get the json data
|
||||
json_data=$(curl -s -H "Authorization: token ${token}" -H 'accept: application/json' -X 'GET' "${api}/repos/${owner}/${repo}/${mode}")
|
||||
# Check if mode is "tags"
|
||||
if [ "${mode}" = "tags" ]; then
|
||||
url="${api}/repos/${owner}/${repo}/${mode}?page=1"
|
||||
else
|
||||
url="${api}/repos/${owner}/${repo}/${mode}"
|
||||
fi
|
||||
# get the json data
|
||||
json_data=$(curl -s -H "Authorization: token ${token}" -H 'accept: application/json' -X 'GET' "${url}")
|
||||
# check for error
|
||||
if [[ "${json_data}" =~ '"errors"' ]] && [[ "${json_data}" =~ '"message"' ]]; then
|
||||
# get the message
|
||||
@ -795,10 +803,9 @@ function setPackageXml() {
|
||||
_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')
|
||||
# remove the v in front of the version (number-state-number)
|
||||
version="${VDM_PACKAGE_VERSION:-1.0.0}"
|
||||
version="${version/#v/}"
|
||||
# add the package details
|
||||
{
|
||||
echo '<?xml version="1.0" encoding="utf-8"?>'
|
||||
@ -988,7 +995,7 @@ function setRepository() {
|
||||
# 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
|
||||
if git ls-remote --exit-code --heads "git@${VDM_PACKAGE_URL}:${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1; then
|
||||
getExistingRepository || return 23
|
||||
update_repo=true
|
||||
else
|
||||
@ -1002,13 +1009,11 @@ function setRepository() {
|
||||
# move all new files into repository
|
||||
setRepositoryNewFiles || return 27
|
||||
# check if we have changes
|
||||
if $update_repo && [[ -z $(git status --porcelain) ]]; then
|
||||
if [[ "${update_repo}" == true && -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
|
||||
if [[ "${update_repo}" == true ]]; then
|
||||
# make API call
|
||||
callGiteaAPI "tags" "${VDM_PACKAGE_OWNER}" "${VDM_PACKAGE_REPO}" "${VDM_PACKAGE_API}" "${VDM_PACKAGE_TOKEN}" || return 28
|
||||
# check if tag exists
|
||||
@ -1019,6 +1024,8 @@ function setRepository() {
|
||||
else
|
||||
message="Update"
|
||||
fi
|
||||
# add user details
|
||||
setUserDetails
|
||||
# get the repository last tag
|
||||
makeGitCommit "${message}" "${VDM_PACKAGE_VERSION:-1.0.0}" "$VDM_TAG_EXIST" || return 28
|
||||
# give little notice of progress
|
||||
@ -1034,7 +1041,11 @@ function setRepository() {
|
||||
# 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
|
||||
if [[ "${VDM_PACKAGE_REPO_BRANCH}" == 'default' ]]; then
|
||||
git push -u origin master >/dev/null 2>&1 || return 30
|
||||
else
|
||||
git push -u origin "${VDM_PACKAGE_REPO_BRANCH:-master}" >/dev/null 2>&1 || return 30
|
||||
fi
|
||||
git push --tags >/dev/null 2>&1 || return 30
|
||||
fi
|
||||
fi
|
||||
@ -1048,10 +1059,10 @@ function getExistingRepository() {
|
||||
_echo "[info] Getting (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
||||
if [[ "${VDM_PACKAGE_REPO_BRANCH}" == 'default' ]]; then
|
||||
# clone the existing repository
|
||||
git clone "ssh://git@${VDM_PACKAGE_URL}/${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 23
|
||||
git clone "git@${VDM_PACKAGE_URL}:${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 23
|
||||
else
|
||||
# clone the existing repository
|
||||
git clone -b "${VDM_PACKAGE_REPO_BRANCH}" "ssh://git@${VDM_PACKAGE_URL}/${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 23
|
||||
git clone -b "${VDM_PACKAGE_REPO_BRANCH:-master}" "git@${VDM_PACKAGE_URL}:${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 23
|
||||
fi
|
||||
# success
|
||||
return 0
|
||||
@ -1073,12 +1084,14 @@ function setGitRepository() {
|
||||
_echo "[info] Initializing the (${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}) repository"
|
||||
# initialize the repository
|
||||
git init >/dev/null 2>&1 || return 29
|
||||
# add user details
|
||||
setUserDetails
|
||||
# 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
|
||||
git remote add origin "git@${VDM_PACKAGE_URL}:${VDM_PACKAGE_OWNER}/${VDM_PACKAGE_REPO}.git" >/dev/null 2>&1 || return 29
|
||||
# Check if a specific branch is set and it is not 'default'
|
||||
if [ "${VDM_PACKAGE_REPO_BRANCH}" != "default" ]; then
|
||||
_echo "[info] Setting branch to ${VDM_PACKAGE_REPO_BRANCH}"
|
||||
@ -1168,58 +1181,57 @@ function getUniqueFileName() {
|
||||
echo "${hash:0:10}"
|
||||
}
|
||||
|
||||
# get the version from the current directory
|
||||
# Get the version from the current directory
|
||||
function _xml_version() {
|
||||
local version
|
||||
local len=100
|
||||
local version=""
|
||||
local shortest_depth=100
|
||||
local file
|
||||
local v
|
||||
local e
|
||||
local p
|
||||
# Create a list of all XML files in the current directory.
|
||||
find . -type f -name '*.xml' > tmp
|
||||
# Loop through the list of XML files.
|
||||
while IFS= read -r file
|
||||
do
|
||||
# Skip XML files named config.xml, access.xml, or default.xml.
|
||||
if [[ "$file" == *"config.xml" ]] || [[ "$file" == *"access.xml" ]] || [[ "$file" == *"default.xml" ]]; then
|
||||
local depth
|
||||
|
||||
# Find XML files excluding config.xml, access.xml, default.xml
|
||||
while IFS= read -r file; do
|
||||
# Ensure file does not match exclusions
|
||||
case "$file" in
|
||||
*config.xml|*access.xml|*default.xml) continue ;;
|
||||
esac
|
||||
|
||||
# Ensure it's an extension XML (check if it has a <extension> root tag anywhere)
|
||||
if ! grep -iq '^[[:space:]]*<extension[[:space:]>]' "$file"; then
|
||||
continue
|
||||
fi
|
||||
# Retrieve the version number from the XML file.
|
||||
v=$(grep -o -P '(?<=\<version>).*?(?=\</version>)' "$file")
|
||||
# Check if the file is an update server file (which should not be used).
|
||||
e=$(grep -o -P '\<extension' "$file")
|
||||
# If a version number have been retrieved, and the file is not an update server file, continue processing.
|
||||
if [ -n "$v" ] && [ -n "$e" ]; then
|
||||
# Count the folder depth.
|
||||
# shellcheck disable=SC2001
|
||||
p=$(echo "$file" | sed 's|[^/]||g')
|
||||
# Keep the value of the shortest path.
|
||||
if [[ "${#p}" -lt $len ]]; then
|
||||
# Update the length.
|
||||
len="${#p}"
|
||||
# Set the version.
|
||||
version="$v"
|
||||
fi
|
||||
|
||||
# Extract version if present in XML
|
||||
v=$(sed -n 's|.*<version>\(.*\)</version>.*|\1|p' "$file" | head -n1)
|
||||
|
||||
# Skip if no version found
|
||||
[[ -z "$v" ]] && continue
|
||||
|
||||
# Determine folder depth (count slashes)
|
||||
depth=$(tr -cd '/' <<< "$file" | wc -c)
|
||||
|
||||
# Choose the file with the shortest path (highest in folder stack)
|
||||
if (( depth < shortest_depth )); then
|
||||
shortest_depth=$depth
|
||||
version=$v
|
||||
|
||||
# Since we want the highest-up file, and this is the shallowest so far,
|
||||
# we can break early if it's at root level (depth 1)
|
||||
(( depth <= 1 )) && break
|
||||
fi
|
||||
# Clear variables for each loop.
|
||||
unset v
|
||||
unset n
|
||||
unset e
|
||||
done < tmp
|
||||
|
||||
# Clear variables for each loop.
|
||||
rm tmp
|
||||
done < <(find . -type f -iname '*.xml')
|
||||
|
||||
# If a version number was found and starts with v
|
||||
if [ -z "$version" ]; then
|
||||
# Return failure if no version is found
|
||||
if [[ -z "$version" ]]; then
|
||||
return 14
|
||||
elif [[ $version != v* ]]; then
|
||||
version="v${version}"
|
||||
fi
|
||||
|
||||
VDM_ZIP_VERSION="$version"
|
||||
export VDM_ZIP_VERSION
|
||||
# Ensure version starts with 'v'
|
||||
[[ $version != v* ]] && version="v${version}"
|
||||
|
||||
# Export version
|
||||
export VDM_ZIP_VERSION="$version"
|
||||
|
||||
return 0
|
||||
}
|
||||
@ -1294,7 +1306,7 @@ function runUpdate() {
|
||||
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
|
||||
if sudo curl --fail -L "https://raw.githubusercontent.com/octoleo/${PROGRAM_CODE}/refs/heads/${branch:-master}/src/${PROGRAM_CODE}" -o "/usr/local/bin/${PROGRAM_CODE}" 2>/dev/null; then
|
||||
# give success message
|
||||
echo "[success] Update was successful."
|
||||
# do we have a backup
|
||||
|
Reference in New Issue
Block a user