Skip to content

Commit

Permalink
addpkg(main/termux-core): 0.1.0
Browse files Browse the repository at this point in the history
  • Loading branch information
agnostic-apollo committed Dec 21, 2024
1 parent e026bf0 commit 4afcd5a
Show file tree
Hide file tree
Showing 12 changed files with 2,008 additions and 1 deletion.
33 changes: 33 additions & 0 deletions packages/termux-core/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
TERMUX_PKG_HOMEPAGE=https://github.com/termux/termux-core-package
TERMUX_PKG_DESCRIPTION="Utils for Termux core"
TERMUX_PKG_LICENSE="MIT"
TERMUX_PKG_MAINTAINER="@termux"
TERMUX_PKG_VERSION=0.1.0

# FIXME: Fix urls
TERMUX_PKG_SRCURL=git+https://github.com/termux/termux-core-package
TERMUX_PKG_GIT_BRANCH="0.1.0-prerelease"

#TERMUX_PKG_SRCURL=file:///home/builder/termux-packages/sources/termux-core-package
#TERMUX_PKG_SHA256=SKIP_CHECKSUM

#TERMUX_PKG_SRCURL=https://github.com/termux/termux-core-package/archive/refs/tags/${TERMUX_PKG_VERSION}.tar.gz
#TERMUX_PKG_SHA256=xxx

# FIXME: uncomment
#TERMUX_PKG_ESSENTIAL=true
TERMUX_PKG_BUILD_IN_SRC=true
TERMUX_PKG_AUTO_UPDATE=true
TERMUX_PKG_PLATFORM_INDEPENDENT=true
TERMUX_PKG_EXTRA_MAKE_ARGS="TERMUX_CORE_PKG__VERSION=${TERMUX_PKG_VERSION} TERMUX_CORE_PKG__ARCH=${TERMUX_ARCH} \
TERMUX__NAME=${TERMUX__NAME} TERMUX__LNAME=${TERMUX__LNAME} \
TERMUX__REPOS_HOST_ORG_NAME=${TERMUX__REPOS_HOST_ORG_NAME} TERMUX__REPOS_HOST_ORG_URL=${TERMUX__REPOS_HOST_ORG_URL} \
TERMUX_APP__PACKAGE_NAME=${TERMUX_APP__PACKAGE_NAME} TERMUX_APP__DATA_DIR=${TERMUX_APP__DATA_DIR} \
TERMUX__ROOTFS=${TERMUX__ROOTFS} TERMUX__HOME=${TERMUX__HOME} TERMUX__PREFIX=${TERMUX__PREFIX} \
TERMUX_ENV__S_ROOT=${TERMUX_ENV__S_ROOT} \
TERMUX_ENV__SS_TERMUX=${TERMUX_ENV__SS_TERMUX} TERMUX_ENV__S_TERMUX=${TERMUX_ENV__S_TERMUX} \
TERMUX_ENV__SS_TERMUX_APP=${TERMUX_ENV__SS_TERMUX_APP} TERMUX_ENV__S_TERMUX_APP=${TERMUX_ENV__S_TERMUX_APP} \
TERMUX_ENV__SS_TERMUX_CORE__TESTS=${TERMUX_ENV__SS_TERMUX_CORE__TESTS} TERMUX_ENV__S_TERMUX_CORE__TESTS=${TERMUX_ENV__S_TERMUX_CORE__TESTS} \
TERMUX_PKGS__REPO_NAME=${TERMUX_PKGS__REPO_NAME} TERMUX_PKGS__REPO_URL=${TERMUX_PKGS__REPO_URL} \
TERMUX_PKGS__BUILD__REPO_ROOT_DIR=${TERMUX_PKGS__BUILD__REPO_ROOT_DIR} \
TERMUX_CORE_PKG__REPO_NAME=${TERMUX_CORE_PKG__REPO_NAME} TERMUX_CORE_PKG__REPO_URL=${TERMUX_CORE_PKG__REPO_URL}"
Original file line number Diff line number Diff line change
@@ -0,0 +1,254 @@
#!/bin/bash
# shellcheck shell=bash

if [ -z "${BASH_VERSION:-}" ]; then
echo "The 'termux-replace-termux-core-src-scripts' script must be run from a 'bash' shell."; return 64 2>/dev/null|| exit 64 # EX__USAGE
fi



REGEX__ABSOLUTE_PATH='^(/[^/]+)+$'

function termux_rtcss__log_errors() { echo "$@" 1>&2; }

termux_rtcss__show_help() {

cat <<'HELP_EOF'
termux-replace-termux-core-src-scripts replaces inplace the `@<name>@`
formatted build time placeholders for the termux-core package source
scripts with their content in the `input_files` supplied.
Usage:
termux-replace-termux-core-src-scripts <input_files...>
The scripts whose placeholders are replaced exist in the
`packages/termux-core/src/scripts` directory of the `termux-package`
repo. The `<name>` in the `@<name>@` placeholders must be equal to
uppercased script file name whose content to replace.
The following required variables must be exported when executed this
script, which are defined in the `scripts/properties.sh` file of the
`termux-package` repo.
- TERMUX_ENV__S_ROOT
- TERMUX__PREFIX
- TERMUX_PKGS__REPO_URL
- TERMUX_CORE_PKG__REPO_URL
HELP_EOF

}

termux_rtcss__main() {

local return_value

if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
termux_rtcss__show_help || return $?
return 0
else
termux_rtcss__replace_termux_core_src_scripts "$@"
return_value=$?
if [ $return_value -eq 64 ]; then # EX__USAGE
echo ""
termux_rtcss__show_help
fi
return $return_value
fi

}

termux_rtcss__replace_termux_core_src_scripts() {

local return_value

if [ $# -lt 1 ]; then
termux_rtcss__log_errors "input_files not passed."
return 64
fi

local exported_variable
local input_file
local src_script_file
local src_script_content
local src_script_escaped_content
local src_script_content_var_name
local termux_core__src_srcipts_dir


termux_core__src_srcipts_dir=$(realpath "$(dirname "$TERMUX_RTCSS__ARG_0")/../../src/scripts")
if [[ ! "$termux_core__src_srcipts_dir" =~ $REGEX__ABSOLUTE_PATH ]]; then
termux_rtcss__log_errors "The termux_core__src_srcipts_dir '$termux_core__src_srcipts_dir' with length ${#termux_core__src_srcipts_dir} is invalid."
termux_rtcss__log_errors "The termux_core__src_srcipts_dir must be an absolute path for a sub path under rootfs '/'."
return 1
fi

if [ ! -d "$termux_core__src_srcipts_dir" ]; then
termux_rtcss__log_errors "The termux_core__src_srcipts_dir '$termux_core__src_srcipts_dir' directory does not exist."
return 1
fi

# The order matters here. The scripts that have `@*@` placeholders
# for other scripts must come before their placeholder scripts,
# so that first the caller scripts get replaced in the input
# files, and then the placeholders for other scripts get replaced
# in the input files.
# For example, the `termux_core__bash__termux_apps_info_env_variable` script
# has the `@TERMUX_CORE__BASH__TERMUX_SCOPED_ENV_VARIABLE@`
# placeholder for the `termux_core__bash__termux_scoped_env_variable`
# script and so the `termux_core__bash__termux_apps_info_env_variable` script
# comes first.
local -a required_src_scripts=(
"termux_core__bash__termux_apps_info_app_version_name"
"termux_core__bash__termux_apps_info_env_variable"
"termux_core__bash__termux_scoped_env_variable"
"termux_core__sh__termux_apps_info_app_version_name"
"termux_core__sh__termux_apps_info_env_variable"
"termux_core__sh__termux_scoped_env_variable"
)

for src_script_file in "${required_src_scripts[@]}"; do
if [ ! -f "$termux_core__src_srcipts_dir/$src_script_file" ]; then
termux_rtcss__log_errors "The '$src_script_file' source script file \
not found under the termux_core__src_srcipts_dir '$termux_core__src_srcipts_dir' directory."
return 1
fi
done


local -a required_exported_variables=(
"TERMUX_ENV__S_ROOT"
"TERMUX__PREFIX"
"TERMUX_PKGS__REPO_URL"
"TERMUX_CORE_PKG__REPO_URL"
)

for exported_variable in "${required_exported_variables[@]}"; do
if [ -z "${!exported_variable}" ]; then
termux_rtcss__log_errors "The $exported_variable variable is not set."
return 1
fi
done


for input_file in "$@"; do
if [ ! -f "$input_file" ]; then
termux_rtcss__log_errors "The input file '$input_file' passed does not exist at path"
return 1
fi
done



# For all the required_src_scripts, read their content into local variables
for src_script_file in "${required_src_scripts[@]}"; do
# Read the src_script_file and ensure its not empty
src_script_content="$(cat "$termux_core__src_srcipts_dir/$src_script_file")"
return_value=$?
if [ $return_value -ne 0 ]; then
termux_rtcss__log_errors "Failed to read the '$src_script_file' source script file \
under the termux_core__src_srcipts_dir '$termux_core__src_srcipts_dir' directory."
return $return_value
elif [ -z "$src_script_content" ]; then
termux_rtcss__log_errors "The '$src_script_file' source script file \
under the termux_core__src_srcipts_dir '$termux_core__src_srcipts_dir' directory is empty."
return 1
fi

# Replace placeholder for variables (not scripts) in the src_script_content
src_script_content="$(printf "%s" "$src_script_content" | sed \
-e "s%[@]TERMUX_ENV__S_ROOT[@]%$(termux_rtcss__get_sed_replacement_escaped_string "$TERMUX_ENV__S_ROOT")%g" \
-e "s%[@]TERMUX__PREFIX[@]%$(termux_rtcss__get_sed_replacement_escaped_string "$TERMUX__PREFIX")%g" \
-e "s%[@]TERMUX_PKGS__REPO_URL[@]%$(termux_rtcss__get_sed_replacement_escaped_string "$TERMUX_PKGS__REPO_URL")%g" \
-e "s%[@]TERMUX_CORE_PKG__REPO_URL[@]%$(termux_rtcss__get_sed_replacement_escaped_string "$TERMUX_CORE_PKG__REPO_URL")%g"
)" || return $?

# Create a local variable with the same name as its script file name with `__content` appended
src_script_content_var_name="${src_script_file}__content"
local "$src_script_content_var_name"
printf -v "$src_script_content_var_name" "%s" "$src_script_content"

#echo "$src_script_content_var_name:"$'\n```'"${!src_script_content_var_name}"$'\n```'
done



# For all the required_src_scripts
for src_script_file in "${required_src_scripts[@]}"; do
src_script_content_var_name="${src_script_file}__content"

# Escape the content to be used as a sed replacement string
src_script_escaped_content="$(termux_rtcss__get_sed_replacement_escaped_string \
"${!src_script_content_var_name}")" || return $?

# For all the input_files, replace the first line found that
# contains the `@src_script_file@` placeholder with the script content
for input_file in "$@"; do
sed -i'' -e "s/.*[@]${src_script_file^^}[@].*/$src_script_escaped_content/" "$input_file"
return_value=$?
if [ $return_value -ne 0 ]; then
termux_rtcss__log_errors "Failed to replace the '$src_script_file' source script \
placeholder in the input file '$input_file' with script content."
return $return_value
fi
done
done

return 0

}

##
# Escape the following characters with a backslash `\` in a string
# that is to be used as the `replacement` string in a `sed`
# `s/regexp/replacement/` expression so that the replacement string
# is literally replaced, even if the string is multiline:
# - `&` used to reference entire string matched by the regex,
# - `\` used to reference for capturing groups, like `\1`, `\2`, etc.
# - `/` used as the delimiter in sed `s/regexp/replacement/` expression.
# - `\n` characters must be escaped.
#
# The escaped replacement string will be echoed to `stdout`.
#
# **See Also:**
# - https://stackoverflow.com/a/29613573/14686958
#
# `termux_rtcss__get_sed_replacement_escaped_string` `<string>`
##
termux_rtcss__get_sed_replacement_escaped_string() {

local sed_replacement_escaped_string

# read is used to preserve trailing newlines that would be lost if a subshell is used, but isn't posix shell compliant
#IFS= read -d '' -r sed_replacement_escaped_string < <(sed -e ':a' -e '$!{N;ba' -e '}' -e 's/[&/\]/\\&/g; s/\n/\\&/g' <<<"$1")

# Instead of using the `sed -z` option, we manually add everything
# to pattern space
# `$!` checks if we are before last line, so if we are not on it,
# then we add next line to pattern space.
# Then we escape the required characters.
# The x is added in subshell to preserve trailing newlines and then removed
sed_replacement_escaped_string="$(printf '%s' "$1" | sed -e '$!{:a;N;$!ba;}; s/[&/\]/\\&/g; s/\n/\\&/g'; printf "%s" x)"
sed_replacement_escaped_string="${sed_replacement_escaped_string%x}"

printf %s "${sed_replacement_escaped_string%$'\n'}"

}



TERMUX_RTCSS__ARG_0="$0"

# If script is sourced, return with error, otherwise call main function
# - https://stackoverflow.com/a/28776166/14686958
# - https://stackoverflow.com/a/29835459/14686958
if (return 0 2>/dev/null); then
echo "${0##*/} cannot be sourced as '\$0' is required by internal functions, \
which will be invalid if functions are sourced and called directly." 1>&2
return 64 # EX__USAGE
else
termux_rtcss__main "$@"
exit $?
fi
Loading

0 comments on commit 4afcd5a

Please sign in to comment.