You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
125 lines
3.3 KiB
125 lines
3.3 KiB
#!/bin/bash
|
|
|
|
# Copyright (c) 2025, crasowas.
|
|
#
|
|
# Use of this source code is governed by a MIT-style license
|
|
# that can be found in the LICENSE file or at
|
|
# https://opensource.org/licenses/MIT.
|
|
|
|
set -e
|
|
|
|
# Prevent duplicate loading
|
|
if [ -n "$UTILS_SH_LOADED" ]; then
|
|
return
|
|
fi
|
|
|
|
readonly UTILS_SH_LOADED=1
|
|
|
|
# Absolute path of the script and the tool's root directory
|
|
script_path="$(realpath "${BASH_SOURCE[0]}")"
|
|
tool_root_path="$(dirname "$(dirname "$script_path")")"
|
|
|
|
# Load common constants
|
|
source "$tool_root_path/Common/constants.sh"
|
|
|
|
# Print the elements of an array along with their indices
|
|
function print_array() {
|
|
local -a array=("$@")
|
|
|
|
for ((i=0; i<${#array[@]}; i++)); do
|
|
echo "[$i] $(decode_path "${array[i]}")"
|
|
done
|
|
}
|
|
|
|
# Split a string into substrings using a specified delimiter
|
|
function split_string_by_delimiter() {
|
|
local string="$1"
|
|
local -a substrings=()
|
|
|
|
IFS="$DELIMITER" read -ra substrings <<< "$string"
|
|
|
|
echo "${substrings[@]}"
|
|
}
|
|
|
|
# Encode a path string by replacing space with an escape character
|
|
function encode_path() {
|
|
echo "$1" | sed "s/ /$SPACE_ESCAPE/g"
|
|
}
|
|
|
|
# Decode a path string by replacing encoded character with space
|
|
function decode_path() {
|
|
echo "$1" | sed "s/$SPACE_ESCAPE/ /g"
|
|
}
|
|
|
|
# Get the dependency name by removing common suffixes
|
|
function get_dependency_name() {
|
|
local path="$1"
|
|
|
|
local dir_name="$(basename "$path")"
|
|
# Remove `.app`, `.framework`, and `.xcframework` suffixes
|
|
local dep_name="${dir_name%.*}"
|
|
|
|
echo "$dep_name"
|
|
}
|
|
|
|
# Get the executable name from the specified `Info.plist` file
|
|
function get_plist_executable() {
|
|
local plist_file="$1"
|
|
|
|
if [ ! -f "$plist_file" ]; then
|
|
echo ""
|
|
else
|
|
/usr/libexec/PlistBuddy -c "Print :CFBundleExecutable" "$plist_file" 2>/dev/null || echo ""
|
|
fi
|
|
}
|
|
|
|
# Get the version from the specified `Info.plist` file
|
|
function get_plist_version() {
|
|
local plist_file="$1"
|
|
|
|
if [ ! -f "$plist_file" ]; then
|
|
echo "$UNKNOWN_VERSION"
|
|
else
|
|
/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "$plist_file" 2>/dev/null || echo "$UNKNOWN_VERSION"
|
|
fi
|
|
}
|
|
|
|
# Get the path of the specified framework version
|
|
function get_framework_path() {
|
|
local path="$1"
|
|
local version_path="$2"
|
|
|
|
if [ -z "$version_path" ]; then
|
|
echo "$path"
|
|
else
|
|
echo "$path/$version_path"
|
|
fi
|
|
}
|
|
|
|
# Search for privacy manifest files in the specified directory
|
|
function search_privacy_manifest_files() {
|
|
local path="$1"
|
|
local -a privacy_manifest_files=()
|
|
|
|
# Create a temporary file to store search results
|
|
local temp_file="$(mktemp)"
|
|
|
|
# Ensure the temporary file is deleted on script exit
|
|
trap "rm -f $temp_file" EXIT
|
|
|
|
# Find privacy manifest files within the specified directory and store the results in the temporary file
|
|
find "$path" -type f -name "$PRIVACY_MANIFEST_FILE_NAME" -print0 2>/dev/null > "$temp_file"
|
|
|
|
while IFS= read -r -d '' file; do
|
|
privacy_manifest_files+=($(encode_path "$file"))
|
|
done < "$temp_file"
|
|
|
|
echo "${privacy_manifest_files[@]}"
|
|
}
|
|
|
|
# Get the privacy manifest file with the shortest path
|
|
function get_privacy_manifest_file() {
|
|
local privacy_manifest_file="$(printf "%s\n" "$@" | awk '{print length, $0}' | sort -n | head -n1 | cut -d ' ' -f2-)"
|
|
|
|
echo "$(decode_path "$privacy_manifest_file")"
|
|
}
|
|
|