summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--archbuild.in4
-rw-r--r--lib/common.sh66
-rw-r--r--makechrootpkg.in2
3 files changed, 51 insertions, 21 deletions
diff --git a/archbuild.in b/archbuild.in
index 9f1b98a..8e272a1 100644
--- a/archbuild.in
+++ b/archbuild.in
@@ -51,14 +51,14 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '$(basename "${copy}")'..."
- lock 9 "$copydir.lock" "Locking chroot copy '$copy'"
+ lock 9 "$copy.lock" "Locking chroot copy '$copy'"
if [[ "$(stat -f -c %T "${copy}")" == btrfs ]]; then
{ type -P btrfs && btrfs subvolume delete "${copy}"; } &>/dev/null
fi
rm -rf --one-file-system "${copy}"
done
- exec 9>&-
+ lock_close 9
rm -rf --one-file-system "${chroots}/${repo}-${arch}"
mkdir -p "${chroots}/${repo}-${arch}"
diff --git a/lib/common.sh b/lib/common.sh
index 9446ff5..c6c5993 100644
--- a/lib/common.sh
+++ b/lib/common.sh
@@ -2,7 +2,7 @@
export LANG=C
# check if messages are to be printed using color
-unset ALL_OFF BOLD BLUE GREEN RED YELLOW
+declare ALL_OFF= BOLD= BLUE= GREEN= RED= YELLOW=
if [[ -t 2 ]]; then
# prefer terminal safe colored and bold text when tput is supported
if tput setaf 0 &>/dev/null; then
@@ -40,12 +40,12 @@ msg2() {
warning() {
local mesg=$1; shift
- printf "${YELLOW}==> WARNING:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+ printf "${YELLOW}==> $(gettext "WARNING:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
error() {
local mesg=$1; shift
- printf "${RED}==> ERROR:${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
+ printf "${RED}==> $(gettext "ERROR:")${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() {
@@ -54,16 +54,22 @@ stat_busy() {
}
stat_done() {
- printf "${BOLD}done${ALL_OFF}\n" >&2
+ printf "${BOLD}$(gettext "done")${ALL_OFF}\n" >&2
}
+_setup_workdir=false
setup_workdir() {
- [[ -z $WORKDIR ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
+ [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
+ _setup_workdir=true
+ trap 'trap_abort' INT QUIT TERM HUP
+ trap 'trap_exit' EXIT
}
cleanup() {
- [[ -n $WORKDIR ]] && rm -rf "$WORKDIR"
- [[ $1 ]] && exit $1
+ if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
+ rm -rf "$WORKDIR"
+ fi
+ [[ -n ${1:-} ]] && exit $1
}
abort() {
@@ -86,9 +92,6 @@ die() {
cleanup 1
}
-trap 'trap_abort' INT QUIT TERM HUP
-trap 'trap_exit' EXIT
-
##
# usage : in_array( $needle, $haystack )
# return : 0 - found
@@ -135,10 +138,19 @@ get_full_version() {
# usage : lock( $fd, $file, $message )
##
lock() {
- eval "exec $1>"'"$2"'
- if ! flock -n $1; then
- stat_busy "$3"
- flock $1
+ local fd=$1
+ local file=$2
+ local mesg=$3
+
+ # Only reopen the FD if it wasn't handed to us
+ if [[ "$(readlink -f /dev/fd/$fd)" != "$(readlink -f "$file")" ]]; then
+ mkdir -p "${file%/*}"
+ eval "exec $fd>"'"$file"'
+ fi
+
+ if ! flock -n $fd; then
+ stat_busy "$mesg"
+ flock $fd
stat_done
fi
}
@@ -147,10 +159,28 @@ lock() {
# usage : slock( $fd, $file, $message )
##
slock() {
- eval "exec $1>"'"$2"'
- if ! flock -sn $1; then
- stat_busy "$3"
- flock -s $1
+ local fd=$1
+ local file=$2
+ local mesg=$3
+
+ # Only reopen the FD if it wasn't handed to us
+ if [[ "$(readlink -f /dev/fd/$fd)" != "$(readlink -f "$file")" ]]; then
+ mkdir -p "${file%/*}"
+ eval "exec $fd>"'"$file"'
+ fi
+
+ eval "exec $fd>"'"$file"'
+ if ! flock -sn $fd; then
+ stat_busy "$mesg"
+ flock -s $fd
stat_done
fi
}
+
+##
+# usage : lock_close( $fd )
+##
+lock_close() {
+ local fd=$1
+ eval "exec $fd>&-"
+}
diff --git a/makechrootpkg.in b/makechrootpkg.in
index fd1d432..c55cab4 100644
--- a/makechrootpkg.in
+++ b/makechrootpkg.in
@@ -139,7 +139,7 @@ if [[ ! -d $copydir ]] || $clean_first; then
stat_done
# Drop the read lock again
- exec 8>&-
+ lock_close 8
fi
if [[ -n "${install_pkgs[*]}" ]]; then