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")" | |
| }
 | |
| 
 |