python,python3: make deletion tolerant for paths with spaces
authorAlexandru Ardelean <ardeleanalex@gmail.com>
Tue, 5 Feb 2019 10:04:43 +0000 (12:04 +0200)
committerAlexandru Ardelean <ardeleanalex@gmail.com>
Tue, 12 Feb 2019 10:31:54 +0000 (12:31 +0200)
Piping to xargs does not handle spaces in paths too well, because it splits
up the paths.
For deleting empty dirs, we also need to do several retries, otherwise
`find` will try to go through the directories after they're deleted.

Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
lang/python/python-package-install.sh
lang/python/python3/files/python3-package-pip.mk
lang/python/python3/files/python3-package-setuptools.mk

index ae6f2ef770beaddd2a83be1c6dc1fb0e0c8f057c..30373751cec3d9b9c23d1bd18c829d76cf65c0ea 100644 (file)
@@ -40,6 +40,17 @@ process_filespec() {
        )
 }
 
+delete_empty_dirs() {
+       local dst_dir="$1"
+       if [ -d "$dst_dir/usr" ] ; then
+               for _ in $(seq 1 10) ; do
+                       find "$dst_dir/usr" -empty -type d -exec rmdir {} \; || continue
+                       break
+               done
+               rmdir "$dst_dir/usr" || true
+       fi
+}
+
 ver="$1"
 src_dir="$2"
 dst_dir="$3"
@@ -47,7 +58,7 @@ python="$4"
 mode="$5"
 filespec="$6"
 
-find "$src_dir" -name "*\.exe" | xargs rm -f
+find "$src_dir" -name "*\.exe" -exec rm -f {} \;
 
 process_filespec "$src_dir" "$dst_dir" "$filespec" || {
        echo "process filespec error-ed"
@@ -56,13 +67,9 @@ process_filespec "$src_dir" "$dst_dir" "$filespec" || {
 
 if [ "$mode" == "sources" ] ; then
        # Copy only python source files
-       find $dst_dir -not -type d -not -name "*\.py" | xargs rm -f
+       find "$dst_dir" -not -type d -not -name "*\.py" -exec rm -f {} \;
 
-       # Delete empty folders (if the case)
-       if [ -d "$dst_dir/usr" ] ; then
-               find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-               rmdir --ignore-fail-on-non-empty $dst_dir/usr
-       fi
+       delete_empty_dirs "$dst_dir"
        exit 0
 fi
 
@@ -75,19 +82,15 @@ legacy=
 #       So, we just stuck to un-optimized byte-codes,
 #       which is still way better/faster than running
 #       Python sources all the time.
-$python -m compileall $legacy -d '/' $dst_dir || {
+$python -m compileall $legacy -d '/' "$dst_dir" || {
        echo "python -m compileall err-ed"
        exit 1
 }
 
 # Delete source files and pyc [ un-optimized bytecode files ]
 # We may want to make this optimization thing configurable later, but not sure atm
-find $dst_dir -type f -name "*\.py" | xargs rm -f
+find "$dst_dir" -type f -name "*\.py" -exec rm -f {} \;
 
-# Delete empty folders (if the case)
-if [ -d "$dst_dir/usr" ] ; then
-       find $dst_dir/usr -type d | xargs rmdir --ignore-fail-on-non-empty
-       rmdir --ignore-fail-on-non-empty $dst_dir/usr
-fi
+delete_empty_dirs "$dst_dir"
 
 exit 0
index 1aaeaf2ee0c75fd532a2f095e2e82cefda0ca18e..8e209e139b37cb7208f28f7e90540a73748c041b 100644 (file)
@@ -21,7 +21,10 @@ define Package/python3-pip/install
                $(PKG_BUILD_DIR)/install-pip/lib/python$(PYTHON3_VERSION)/site-packages/pip \
                $(PKG_BUILD_DIR)/install-pip/lib/python$(PYTHON3_VERSION)/site-packages/pip-$(PYTHON3_PIP_VERSION).dist-info \
                $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages/
-       find $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages/ -name __pycache__ | xargs rm -rf
+       for _ in \$(seq 1 10) ; do \
+               find $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages/ -name __pycache__ -exec rm -rf {} \; || continue ; \
+               break ; \
+       done
 endef
 
 $(eval $(call Py3BasePackage,python3-pip, \
index c8415cbd9306c91691b4bc48c349867f4d3e268f..472f5a620cfd60b0e4d0d703b8d8f737ae0b2993 100644 (file)
@@ -24,7 +24,10 @@ define Py3Package/python3-setuptools/install
                $(PKG_BUILD_DIR)/install-setuptools/lib/python$(PYTHON3_VERSION)/site-packages/setuptools-$(PYTHON3_SETUPTOOLS_VERSION).dist-info \
                $(PKG_BUILD_DIR)/install-setuptools/lib/python$(PYTHON3_VERSION)/site-packages/easy_install.py \
                $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages
-       find $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages/ -name __pycache__ | xargs rm -rf
+       for _ in \$(seq 1 10) ; do \
+               find $(1)/usr/lib/python$(PYTHON3_VERSION)/site-packages/ -name __pycache__ -exec rm -rf {} \; || continue ; \
+               break ; \
+       done
 endef
 
 $(eval $(call Py3BasePackage,python3-setuptools, \