aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--%HOME%/.bash_utils/cxx.sh106
-rw-r--r--%HOME%/.bash_utils/distr.sh19
-rw-r--r--%HOME%/.bash_utils/file.sh2
-rw-r--r--%HOME%/.bash_utils/git.sh44
-rw-r--r--%HOME%/.bash_utils/path.sh32
-rw-r--r--%HOME%/.bash_utils/text.sh61
6 files changed, 156 insertions, 108 deletions
diff --git a/%HOME%/.bash_utils/cxx.sh b/%HOME%/.bash_utils/cxx.sh
index 5d1a438..4ff81f4 100644
--- a/%HOME%/.bash_utils/cxx.sh
+++ b/%HOME%/.bash_utils/cxx.sh
@@ -7,52 +7,76 @@
runc_flags=('-Wall' '-Wextra')
+_runc_usage() (
+ set -o errexit -o nounset -o pipefail
+
+ local msg
+ for msg; do
+ echo "${FUNCNAME[1]}: $msg"
+ done
+
+ echo "usage: ${FUNCNAME[1]} [-h|--help] [-c|--comp-arg ARG]... C_PATH... [-- [PROG_ARG]...]"
+)
+
runc() (
set -o errexit -o nounset -o pipefail
local -a c_flags=(${runc_flags[@]+"${runc_flags[@]}"})
- local -a src_files
+ local -a src_files=()
local -a prog_args
while [ "$#" -gt 0 ]; do
- case "$1" in
+ local key="$1"
+ shift
+
+ case "$key" in
+ -h|--help)
+ _runc_usage
+ return 0
+ ;;
+
-c|--comp-arg)
- if [ "$#" -le 1 ]; then
- echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2
+ if [ "$#" -eq 0 ]; then
+ _runc_usage "missing argument for parameter: $key" >&2
return 1
fi
- shift
c_flags+=("$1")
shift
;;
- -h|--help)
- echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--comp-arg ARG]... C_PATH... [-- [PROG_ARG]...]"
- return 0
- ;;
-
--)
- shift
break
;;
*)
- src_files+=("$( realpath "$1" )")
- shift
+ src_files+=("$key")
;;
esac
done
prog_args=("$@")
+ if [ "${#src_files[@]}" -eq 0 ]; then
+ _runc_usage 'requires at least one source file path' >&2
+ return 1
+ fi
+
+ local -a _src_files=(${src_files[@]+"${src_files[@]}"})
+ src_files=()
+
+ local src_file
+ while IFS= read -d '' -r src_file; do
+ src_files+=("$src_file")
+ done < <( readlink -z --canonicalize-missing -- ${_src_files[@]+"${_src_files[@]}"} )
+
local build_dir
build_dir="$( mktemp --directory )"
- trap "$( printf 'popd > /dev/null && rm -rf %q' "$build_dir" )" 0
+ trap "$( printf 'popd > /dev/null && rm -rf -- %q' "$build_dir" )" 0
pushd "$build_dir" > /dev/null
local output_name
- output_name="$( mktemp --tmpdir=. "${FUNCNAME[0]}XXX.exe" )"
+ output_name="$( mktemp --tmpdir=. -- "${FUNCNAME[0]}XXX.exe" )"
gcc -o "$output_name" \
${c_flags[@]+"${c_flags[@]}"} \
@@ -63,52 +87,76 @@ runc() (
runcxx_flags=('-Wall' '-Wextra' '-std=c++14')
+_runcxx_usage() (
+ set -o errexit -o nounset -o pipefail
+
+ local msg
+ for msg; do
+ echo "${FUNCNAME[1]}: $msg"
+ done
+
+ echo "usage: ${FUNCNAME[1]} [-h|--help] [-c|--comp-arg ARG]... CPP_PATH... [-- [PROG_ARG]...]"
+)
+
runcxx() (
set -o errexit -o nounset -o pipefail
local -a cxx_flags=(${runcxx_flags[@]+"${runcxx_flags[@]}"})
- local -a src_files
+ local -a src_files=()
local -a prog_args
while [ "$#" -gt 0 ]; do
- case "$1" in
+ local key="$1"
+ shift
+
+ case "$key" in
+ -h|--help)
+ _runcxx_usage
+ return 0
+ ;;
+
-c|--comp-arg)
if [ "$#" -le 1 ]; then
- echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2
+ _runcxx_usage "missing argument for parameter: $key" >&2
return 1
fi
- shift
cxx_flags+=("$1")
shift
;;
- -h|--help)
- echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--comp-arg ARG]... CPP_PATH... [-- [PROG_ARG]...]"
- return 0
- ;;
-
--)
- shift
break
;;
*)
- src_files+=("$( realpath "$1" )")
- shift
+ src_files+=("$key")
;;
esac
done
prog_args=("$@")
+ if [ "${#src_files[@]}" -eq 0 ]; then
+ _runcxx_usage 'requires at least one source file path' >&2
+ return 1
+ fi
+
+ local -a _src_files=(${src_files[@]+"${src_files[@]}"})
+ src_files=()
+
+ local src_file
+ while IFS= read -d '' -r src_file; do
+ src_files+=("$src_file")
+ done < <( readlink -z --canonicalize-missing -- ${_src_files[@]+"${_src_files[@]}"} )
+
local build_dir
build_dir="$( mktemp --directory )"
- trap "$( printf 'popd > /dev/null && rm -rf %q' "$build_dir" )" 0
+ trap "$( printf 'popd > /dev/null && rm -rf -- %q' "$build_dir" )" 0
pushd "$build_dir" > /dev/null
local output_name
- output_name="$( mktemp --tmpdir=. "${FUNCNAME[0]}XXX.exe" )"
+ output_name="$( mktemp --tmpdir=. -- "${FUNCNAME[0]}XXX.exe" )"
g++ -o "$output_name" \
${cxx_flags[@]+"${cxx_flags[@]}"} \
diff --git a/%HOME%/.bash_utils/distr.sh b/%HOME%/.bash_utils/distr.sh
index ba92031..799f52f 100644
--- a/%HOME%/.bash_utils/distr.sh
+++ b/%HOME%/.bash_utils/distr.sh
@@ -20,11 +20,9 @@ sums_list_paths() (
echo "usage: ${FUNCNAME[0]} [-h|--help] [-0|-z]"
return 0
;;
-
-0|-z)
fmt='%s\0'
;;
-
*)
echo "${FUNCNAME[0]}: unrecognized parameter: $key" >&2
return 1
@@ -34,29 +32,38 @@ sums_list_paths() (
[ -f "$sums_path" ] || return 0
+ local -a paths=()
+
local path
while IFS= read -r path; do
- printf "$fmt" "$path"
- done < <( sed --binary 's/^\\\?[[:alnum:]]\+ [ *]//' "$sums_path" )
+ paths+=("$path")
+ done < <( sed --binary -- 's/^\\\?[[:alnum:]]\+ [ *]//' "$sums_path" )
+
+ [ "${#paths[@]}" -eq 0 ] && return 0
+
+ printf -- "$fmt" ${paths[@]+"${paths[@]}"}
)
sums_update() (
set -o errexit -o nounset -o pipefail
+ local -A existing
+ local -a missing=()
+
local path
- local -A existing
while IFS= read -d '' -r path; do
existing[$path]=1
done < <( sums_list_paths -z )
- local -a missing
for path in "$@"; do
if [ -z "${existing[$path]+x}" ]; then
missing+=("$path")
fi
done
+ [ "${#missing[@]}" -eq 0 ] && return 0
+
sha1sum -- ${missing[@]+"${missing[@]}"} >> "$sums_path"
)
diff --git a/%HOME%/.bash_utils/file.sh b/%HOME%/.bash_utils/file.sh
index 0321833..6741067 100644
--- a/%HOME%/.bash_utils/file.sh
+++ b/%HOME%/.bash_utils/file.sh
@@ -27,7 +27,7 @@ swap_files() (
fi
local tmp_path
- tmp_path="$( mktemp "$( dirname "$path1" )/XXX" )"
+ tmp_path="$( mktemp -- "$( dirname -- "$path1" )/XXX" )"
mv "$path1" "$tmp_path"
mv "$path2" "$path1"
diff --git a/%HOME%/.bash_utils/git.sh b/%HOME%/.bash_utils/git.sh
index 7b6c22c..5d74f39 100644
--- a/%HOME%/.bash_utils/git.sh
+++ b/%HOME%/.bash_utils/git.sh
@@ -10,49 +10,49 @@ source "$HOME/.bash_utils/text.sh"
list_repo_files() (
set -o errexit -o nounset -o pipefail
- local -a cmd=(git ls-files)
+ local -a cmd=(git ls-tree -r)
while [ "$#" -gt 0 ]; do
- case "$1" in
- -0|-z)
- cmd+=(-z)
- shift
- ;;
-
+ local key="$1"
+ shift
+ case "$key" in
-h|--help)
echo "usage: ${FUNCNAME[0]} [-h|--help] [-0|-z]"
return 0
;;
-
+ -0|-z)
+ cmd+=(-z)
+ ;;
*)
- echo "${FUNCNAME[0]}: unrecognized parameter: $1" >&2
+ echo "${FUNCNAME[0]}: unrecognized parameter: $key" >&2
return 1
;;
esac
done
+ cmd+=(--name-only HEAD)
+
eval ${cmd[@]+"${cmd[@]}"}
)
list_repo_dirs() (
set -o errexit -o nounset -o pipefail
- local -a cmd=(git ls-tree -d -r)
+ local -a cmd=(git ls-tree -r -d)
while [ "$#" -gt 0 ]; do
- case "$1" in
- -z|-0)
- cmd+=(-z)
- shift
- ;;
-
+ local key="$1"
+ shift
+ case "$key" in
-h|--help)
echo "usage: ${FUNCNAME[0]} [-h|--help] [-z|-0]"
return 0
;;
-
+ -z|-0)
+ cmd+=(-z)
+ ;;
*)
- echo "${FUNCNAME[0]}: unrecognized parameter: $1" >&2
+ echo "${FUNCNAME[0]}: unrecognized parameter: $key" >&2
return 1
;;
esac
@@ -66,8 +66,8 @@ list_repo_dirs() (
tighten_repo_security() (
set -o errexit -o nounset -o pipefail
- list_repo_files -z | xargs -0 chmod 0600
- list_repo_dirs -z | xargs -0 chmod 0700
+ list_repo_files -z | xargs -0 -- chmod 0600 --
+ list_repo_dirs -z | xargs -0 -- chmod 0700 --
chmod 0700 .git
)
@@ -101,9 +101,9 @@ backup_repo() (
set -o errexit -o nounset -o pipefail
local repo_dir
- repo_dir="$( realpath . )"
+ repo_dir="$( pwd )"
local repo_name
- repo_name="$( basename "$repo_dir" )"
+ repo_name="$( basename -- "$repo_dir" )"
local backup_dir="$repo_dir"
if [ $# -eq 1 ]; then
diff --git a/%HOME%/.bash_utils/path.sh b/%HOME%/.bash_utils/path.sh
index 7982427..4aff550 100644
--- a/%HOME%/.bash_utils/path.sh
+++ b/%HOME%/.bash_utils/path.sh
@@ -12,12 +12,12 @@ add_missing_path() (
[ "$#" -eq 0 ] && return 0
- local -a new_paths
+ local -a new_list
local path
while IFS= read -d '' -r path; do
- new_paths+=("$path")
- done < <( readlink --zero --canonicalize-missing -- "$@" )
+ new_list+=("$path")
+ done < <( readlink -z --canonicalize-missing -- "$@" )
for path; do
if str_contains "$path" ':'; then
@@ -26,21 +26,23 @@ add_missing_path() (
fi
done
- local -A old_paths_dict
- local -a old_paths_list
+ local -A old_dict
+ local -a old_list
- while IFS= read -d '' -r path; do
- old_paths_dict[$path]=1
- old_paths_list+=("$path")
- done < <( str_split -z -- "${PATH-}" ':' | xargs -0 readlink --zero --canonicalize-missing -- )
-
- for path in ${new_paths[@]+"${new_paths[@]}"}; do
- [ -n "${old_paths_dict[$path]+x}" ] && continue
- old_paths_dict[$path]=1
- old_paths_list+=("$path")
+ if [ -n "${PATH-}" ]; then
+ while IFS= read -d '' -r path; do
+ old_dict[$path]=1
+ old_list+=("$path")
+ done < <( str_split -z -- "${PATH-}" ':' | xargs -0 -- readlink -z --canonicalize-missing -- )
+ fi
+
+ for path in ${new_list[@]+"${new_list[@]}"}; do
+ [ -n "${old_dict[$path]+x}" ] && continue
+ old_dict[$path]=1
+ old_list+=("$path")
done
- str_join ':' ${old_paths_list[@]+"${old_paths_list[@]}"}
+ str_join ':' ${old_list[@]+"${old_list[@]}"}
)
add_path() {
diff --git a/%HOME%/.bash_utils/text.sh b/%HOME%/.bash_utils/text.sh
index 2228a8b..242837f 100644
--- a/%HOME%/.bash_utils/text.sh
+++ b/%HOME%/.bash_utils/text.sh
@@ -5,18 +5,18 @@
# For details, see https://github.com/egor-tensin/cygwin-home.
# Distributed under the MIT License.
-alias dos2eol='sed --binary --in-place '"'"'s/\(\r\?\)$//'"'"
-alias eol2dos='sed --binary --in-place '"'"'s/\r\?$/\r/'"'"
+alias dos2eol='sed --binary --in-place -- '"'"'s/\(\r\?\)$//'"'"
+alias eol2dos='sed --binary --in-place -- '"'"'s/\r\?$/\r/'"'"
-alias trim='sed --binary --in-place '"'"'s/[[:blank:]]*\(\r\?\)$/\1/'"'"
+alias trim='sed --binary --in-place -- '"'"'s/[[:blank:]]*\(\r\?\)$/\1/'"'"
-alias trimeol='sed --binary --in-place -e :a -e '"'"'/^\n*$/{$d;N;ba}'"'"
-alias trimdoseol='sed --binary --in-place -e :a -e '"'"'/^\(\r\n\)*\r$/{$d;N;ba}'"'"
+alias trimeol='sed --binary --in-place -e :a -e '"'"'/^\n*$/{$d;N;ba}'"'"' --'
+alias trimdoseol='sed --binary --in-place -e :a -e '"'"'/^\(\r\n\)*\r$/{$d;N;ba}'"'"' --'
-alias eol='sed --binary --in-place '"'"'$a\'"'"
-alias doseol='sed --binary --in-place '"'"'$s/\r\?$/\r/;a\'"'"
+alias eol='sed --binary --in-place -- '"'"'$a\'"'"
+alias doseol='sed --binary --in-place -- '"'"'$s/\r\?$/\r/;a\'"'"
-alias trimbom='sed --binary --in-place '"'"'1 s/^\xef\xbb\xbf//'"'"
+alias trimbom='sed --binary --in-place -- '"'"'1 s/^\xef\xbb\xbf//'"'"
lint() {
trim "$@" && trimeol "$@" && eol "$@"
@@ -39,7 +39,7 @@ replace_word() (
local new="$1"
shift
- sed --binary --in-place "s/\\b$old\\b/$new/g" "$@"
+ sed --binary --in-place -- "s/\\b$old\\b/$new/g" "$@"
)
str_tolower() (
@@ -70,7 +70,7 @@ str_contains() (
local str="$1"
local sub
- sub="$( printf '%q' "$2" )"
+ sub="$( printf -- '%q' "$2" )"
test "$str" != "${str#*$sub}"
)
@@ -85,7 +85,7 @@ str_starts_with() (
local str="$1"
local sub
- sub="$( printf '%q' "$2" )"
+ sub="$( printf -- '%q' "$2" )"
test "$str" != "${str#$sub}"
)
@@ -93,34 +93,29 @@ str_starts_with() (
str_split() (
set -o errexit -o nounset -o pipefail
- local zero=
+ local fmt='%s\n'
local -a args
while [ "$#" -ne 0 ]; do
- case "$1" in
- -0|-z)
- zero=1
- shift
- ;;
-
+ local key="$1"
+ shift
+ case "$key" in
-h|--help)
- echo "usage: ${FUNCNAME[0]} [-z|-0] [-h|--help] [--] STR DELIM"
+ echo "usage: ${FUNCNAME[0]} [-h|--help] [-z|-0] [--] STR DELIM"
return 0
;;
-
+ -0|-z)
+ fmt='%s\0'
+ ;;
--)
- shift
break
;;
-
-*)
- echo "${FUNCNAME[0]}: unrecognized parameter: $1" >&2
+ echo "${FUNCNAME[0]}: unrecognized parameter: $key" >&2
return 1
;;
-
*)
- args+=("$1")
- shift
+ args+=("$key")
;;
esac
done
@@ -128,7 +123,7 @@ str_split() (
args+=("$@")
if [ "${#args[@]}" -ne 2 ]; then
- echo "usage: ${FUNCNAME[0]} [-z|-0] [-h|--help] [--] STR DELIM"
+ echo "usage: ${FUNCNAME[0]} [-h|--help] [-z|-0] [--] STR DELIM"
return 1
fi
@@ -138,14 +133,10 @@ str_split() (
local -a xs
local x
- IFS="$old_delim" read -ra xs <<< "$str"
+ IFS="$old_delim" read -a xs -r <<< "$str"
for x in ${xs[@]+"${xs[@]}"}; do
- if [ -z "$zero" ]; then
- printf '%s\n' "$x"
- else
- printf '%s\0' "$x"
- fi
+ printf "$fmt" "$x"
done
)
@@ -169,10 +160,10 @@ str_join() (
*)
local s="$1"
shift
- printf '%s' "$s"
+ printf -- '%s' "$s"
for s; do
- printf '%s%s' "$delim" "$s"
+ printf -- '%s%s' "$delim" "$s"
done
;;
esac