On 31/10/17 04:03, Eli Schwartz wrote:
Additionally provide a separate error for the confusing if unlikely event that the user tries to use an existing file as a package output directory.
This also means we now consistently try to create any nonexistent *DEST directories as needed before aborting with E_FS_PERMISSIONS. Previously only $BUILDDIR received that kindness.
Fixes FS#43537
Signed-off-by: Eli Schwartz <eschwartz@archlinux.org> ---
mkdir -p has a really bad error when a file exists that conflicts with the path to be created. But I'm still not sure whether to include that code in ensure_writable_dir
scripts/libmakepkg/util/util.sh.in | 19 +++++++++++++++++++ scripts/makepkg.sh.in | 19 ++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/scripts/libmakepkg/util/util.sh.in b/scripts/libmakepkg/util/util.sh.in index d676249d..8a6149ed 100644 --- a/scripts/libmakepkg/util/util.sh.in +++ b/scripts/libmakepkg/util/util.sh.in @@ -83,3 +83,22 @@ cd_safe() { exit 1 fi } + +# Try to create directory if one does not yet exist. Fails if the directory +# exists but has no write permissions, or if there is an existing file with +# the same name. +ensure_writable_dir() { + local parent=$1 dirname=$1 + + until [[ -e $parent ]]; do + parent="${parent%/*}" + done + if [[ -f $parent ]]; then + error "$(gettext "Cannot create %s due to conflicting file.")" "$parent" + return 1 + fi + if ( [[ ! -d $dirname ]] && ! mkdir -p "$dirname" ) || [[ ! -w $dirname ]]; then + return 1 + fi + return 0 +} diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in index 20cc22ad..35665f16 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -1360,34 +1360,27 @@ else fi
-if [[ ! -d $BUILDDIR ]]; then - if ! mkdir -p "$BUILDDIR"; then - error "$(gettext "You do not have write permission to create packages in %s.")" "$BUILDDIR" - plain "$(gettext "Aborting...")" - exit 1 - fi - chmod a-s "$BUILDDIR"
As discussed on IRC, this chmod is important. If the build dir gets created with a sticky bit, that propagates through the package. A