From 2ffb87726b93ffd73a5291d6db1bc3d13fbcde17 Mon Sep 17 00:00:00 2001 From: Jeffery To Date: Thu, 29 Jun 2023 15:27:40 +0800 Subject: [PATCH] python: Rework filespec install script * Support wildcards in install (`+`) paths * Add fourth parameter to set directory permissions If file permissions are given (third parameter), these will now apply to files only. * Add non-recursive set permissions command (`==`) * Be more strict about filespec format Blank lines and lines starting with `#` will be ignored. Other errors (unknown command, missing path parameter, etc.) will cause the script to exit. * Be more strict about ensuring paths exist for all commands * Avoid spawning subshells This also removes outdated filespec paths in the python3 package; these paths delete files that are no longer present. Signed-off-by: Jeffery To --- lang/python/python-package-install.sh | 171 ++++++++++++++++++++------ lang/python/python3/Makefile | 30 ++--- 2 files changed, 148 insertions(+), 53 deletions(-) diff --git a/lang/python/python-package-install.sh b/lang/python/python-package-install.sh index fa42f6f4a8..4e7fb7af5b 100644 --- a/lang/python/python-package-install.sh +++ b/lang/python/python-package-install.sh @@ -1,45 +1,140 @@ #!/bin/sh -set -e -process_filespec() { - local src_dir="$1" - local dst_dir="$2" - local filespec="$3" - echo "$filespec" | ( - IFS='|' - while read fop fspec fperm; do - local fop=`echo "$fop" | tr -d ' \t\n'` - if [ "$fop" = "+" ]; then - if [ ! -e "${src_dir}${fspec}" ]; then - echo "File not found '${src_dir}${fspec}'" - exit 1 - fi - dpath=`dirname "$fspec"` - if [ -z "$fperm" ]; then - dperm=`stat -c "%a" ${src_dir}${dpath}` - fi - mkdir -p -m$dperm ${dst_dir}${dpath} - echo "copying: '$fspec'" - cp -fpR ${src_dir}${fspec} ${dst_dir}${dpath}/ - if [ -n "$fperm" ]; then - chmod -R $fperm ${dst_dir}${fspec} - fi - elif [ "$fop" = "-" ]; then - echo "removing: '$fspec'" - rm -fR ${dst_dir}${fspec} - elif [ "$fop" = "=" ]; then - echo "setting permissions: '$fperm' on '$fspec'" - chmod -R $fperm ${dst_dir}${fspec} - fi - done - ) +log() { + printf '%s\n' "$*" } -src_dir="$1" -dst_dir="$2" +error() { + printf 'Error: %s\n' "$*" >&2 +} + +path_exists() { + local dir="$1" + local path="$2" + + [ -n "$(find "$dir"/$path -print -quit 2>/dev/null)" ] +} + +file_dir_chmod() { + local dir="$1" + local path="$2" + local file_mode="$3" + local dir_mode="$4" + shift; shift; shift; shift; + + if [ -n "$file_mode" ]; then + find "$dir"/$path -type f "$@" -exec chmod "$file_mode" -- '{}' + + fi + + if [ -n "$dir_mode" ]; then + find "$dir"/$path -type d "$@" -exec chmod "$dir_mode" -- '{}' + + fi +} + +src="$1" +dest="$2" filespec="$3" -process_filespec "$src_dir" "$dst_dir" "$filespec" || { - echo "process filespec error-ed" +if [ -z "$src" ]; then + error "Missing source directory" exit 1 -} +fi +if [ -z "$dest" ]; then + error "Missing destination directory" + exit 1 +fi + +while IFS='|' read -r cmd path file_mode dir_mode; do + + # trim whitespace + + cmd="${cmd#"${cmd%%[![:space:]]*}"}" + cmd="${cmd%"${cmd##*[![:space:]]}"}" + + path="${path#"${path%%[![:space:]]*}"}" + path="${path%"${path##*[![:space:]]}"}" + + file_mode="${file_mode#"${file_mode%%[![:space:]]*}"}" + file_mode="${file_mode%"${file_mode##*[![:space:]]}"}" + + dir_mode="${dir_mode#"${dir_mode%%[![:space:]]*}"}" + dir_mode="${dir_mode%"${dir_mode##*[![:space:]]}"}" + + + if [ -z "$cmd" ] || [ "$cmd" != "${cmd#\#}" ]; then + continue + fi + + if [ -z "$path" ]; then + error "Missing path for \"$cmd\"" + exit 1 + fi + + case "$cmd" in + +) + log "Copying: \"$path\"" + + if ! path_exists "$src" "$path"; then + error "\"$src/$path\" not found" + exit 1 + fi + + dir="${path%/*}" + mkdir -p "$dest/$dir" + cp -fpR "$src"/$path "$dest/$dir/" + + file_dir_chmod "$dest" "$path" "$file_mode" "$dir_mode" + ;; + + -) + log "Removing: \"$path\"" + + if ! path_exists "$dest" "$path"; then + error "\"$dest/$path\" not found" + exit 1 + fi + + rm -fR -- "$dest"/$path + ;; + + =) + log "Setting recursive permissions \"${file_mode:-(none)}\"/\"${dir_mode:-(none)}\" on \"$path\"" + + if ! path_exists "$dest" "$path"; then + error "\"$dest/$path\" not found" + exit 1 + fi + + if [ -z "$file_mode$dir_mode" ]; then + error "Missing recursive permissions for \"$path\"" + exit 1 + fi + + file_dir_chmod "$dest" "$path" "$file_mode" "$dir_mode" + ;; + + ==) + log "Setting permissions \"${file_mode:-(none)}\"/\"${dir_mode:-(none)}\" on \"$path\"" + + if ! path_exists "$dest" "$path"; then + error "\"$dest/$path\" not found" + exit 1 + fi + + if [ -z "$file_mode$dir_mode" ]; then + error "Missing permissions for \"$path\"" + exit 1 + fi + + file_dir_chmod "$dest" "$path" "$file_mode" "$dir_mode" -maxdepth 0 + ;; + + *) + error "Unknown command \"$cmd\"" + exit 1 + ;; + esac + +done << EOF +$filespec +EOF diff --git a/lang/python/python3/Makefile b/lang/python/python3/Makefile index 45d14379c4..304e243041 100644 --- a/lang/python/python3/Makefile +++ b/lang/python/python3/Makefile @@ -121,13 +121,15 @@ define Py3BasePackage PYTHON3_PACKAGES_DEPENDS+=$(1) endif PYTHON3_LIB_FILES_DEL+=$(2) - define Py3Package/$(1)/filespec - ifneq ($(2),) - $(subst $(space),$(newline),$(foreach lib_file,$(2),+|$(lib_file))) - -|/usr/lib/python$(PYTHON3_VERSION)/*/test - -|/usr/lib/python$(PYTHON3_VERSION)/*/tests - endif - endef + ifeq ($(2),) + Py3Package/$(1)/filespec= + else + define Py3Package/$(1)/filespec + $(foreach lib_file,$(2), + +|$(lib_file) + ) + endef + endif Py3Package/$(1)/install?=: endef @@ -240,24 +242,22 @@ PYTHON3_LIB_FILES_DEL+=$(PYTHON3_BASE_LIB_FILES) define Py3Package/python3-base/filespec +|/usr/bin/python$(PYTHON3_VERSION) -$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_BASE_LIB_FILES),+|$(lib_file))) +$(foreach lib_file,$(PYTHON3_BASE_LIB_FILES), + +|$(lib_file) +) endef define Py3Package/python3-light/filespec +|/usr/lib/python$(PYTHON3_VERSION) -|/usr/lib/python$(PYTHON3_VERSION)/distutils/cygwinccompiler.py --|/usr/lib/python$(PYTHON3_VERSION)/distutils/command/wininst* -|/usr/lib/python$(PYTHON3_VERSION)/idlelib -|/usr/lib/python$(PYTHON3_VERSION)/tkinter -|/usr/lib/python$(PYTHON3_VERSION)/turtledemo --|/usr/lib/python$(PYTHON3_VERSION)/lib-dynload/_test*.so --|/usr/lib/python$(PYTHON3_VERSION)/pdb.doc --|/usr/lib/python$(PYTHON3_VERSION)/test -|/usr/lib/python$(PYTHON3_VERSION)/webbrowser.py --|/usr/lib/python$(PYTHON3_VERSION)/*/test --|/usr/lib/python$(PYTHON3_VERSION)/*/tests -|/usr/lib/python$(PYTHON3_VERSION)/_osx_support.py -$(subst $(space),$(newline),$(foreach lib_file,$(PYTHON3_LIB_FILES_DEL),-|$(lib_file))) +$(foreach lib_file,$(filter /usr/lib/python$(PYTHON3_VERSION)/%,$(PYTHON3_LIB_FILES_DEL)), + -|$(lib_file) +) endef define Package/libpython3/install