diff options
Diffstat (limited to '%HOME%/.bash_utils')
-rw-r--r-- | %HOME%/.bash_utils/cxx.sh | 118 | ||||
-rw-r--r-- | %HOME%/.bash_utils/distr.sh | 29 | ||||
-rw-r--r-- | %HOME%/.bash_utils/file.sh | 35 | ||||
-rw-r--r-- | %HOME%/.bash_utils/git.sh | 102 | ||||
-rw-r--r-- | %HOME%/.bash_utils/text.sh | 43 |
5 files changed, 327 insertions, 0 deletions
diff --git a/%HOME%/.bash_utils/cxx.sh b/%HOME%/.bash_utils/cxx.sh new file mode 100644 index 0000000..527c120 --- /dev/null +++ b/%HOME%/.bash_utils/cxx.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Cygwin configuration files" project. +# For details, see https://github.com/egor-tensin/cygwin-home. +# Distributed under the MIT License. + +runc_flags=('-Wall' '-Wextra') + +runc() ( + set -o errexit -o nounset -o pipefail + + local -a c_flags=("${runc_flags[@]+"${runc_flags[@]}"}") + local -a src_files + local -a prog_flags + + while [ "$#" -gt 0 ]; do + case "$1" in + -c|--c-flags) + if [ "$#" -le 1 ]; then + echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2 + return 1 + fi + shift + c_flags+=("$1") + shift + ;; + + -h|--help) + echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--c-flags FLAG]... [--] [SRC_PATH]..." + return 0 + ;; + + --) + shift + break + ;; + + *) + src_files+=("$( realpath "$1" )") + shift + ;; + esac + done + + prog_flags=("$@") + + local build_dir + build_dir="$( mktemp --directory )" + + 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" )" + + gcc -o "$output_name" \ + "${c_flags[@]+"${c_flags[@]}"}" \ + "${src_files[@]+"${src_files[@]}"}" + + "$output_name" "${prog_flags[@]+"${prog_flags[@]}"}" +) + +runcxx_flags=('-Wall' '-Wextra' '-std=c++14') + +runcxx() ( + set -o errexit -o nounset -o pipefail + + local -a cxx_flags=("${runcxx_flags[@]+"${runcxx_flags[@]}"}") + local -a src_files + local -a prog_flags + + while [ "$#" -gt 0 ]; do + case "$1" in + -c|--cxx-flags) + if [ "$#" -le 1 ]; then + echo "${FUNCNAME[0]}: missing argument for parameter: $1" >&2 + return 1 + fi + shift + cxx_flags+=("$1") + shift + ;; + + -h|--help) + echo "usage: ${FUNCNAME[0]} [-h|--help] [-c|--cxx-flags FLAG]... [--] [SRC_PATH]..." + return 0 + ;; + + --) + shift + break + ;; + + *) + src_files+=("$( realpath "$1" )") + shift + ;; + esac + done + + prog_flags=("$@") + + local build_dir + build_dir="$( mktemp --directory )" + + 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" )" + + g++ -o "$output_name" \ + "${cxx_flags[@]+"${cxx_flags[@]}"}" \ + "${src_files[@]+"${src_files[@]}"}" + + "$output_name" "${prog_flags[@]+"${prog_flags[@]}"}" +) diff --git a/%HOME%/.bash_utils/distr.sh b/%HOME%/.bash_utils/distr.sh new file mode 100644 index 0000000..06d342a --- /dev/null +++ b/%HOME%/.bash_utils/distr.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Cygwin configuration files" project. +# For details, see https://github.com/egor-tensin/cygwin-home. +# Distributed under the MIT License. + +checksums_path='sha1sums.txt' + +update_checksums() { + sha1sum -- "$@" > "$checksums_path" +} + +update_checksums_distr() ( + set -o errexit -o nounset -o pipefail + + local -a paths + local path + + while IFS= read -d '' -r path; do + paths+=("$path") + done < <( find . -type f -\( -iname '*.exe' -o -iname '*.iso' -\) -print0 ) + + update_checksums "${paths[@]+"${paths[@]}"}" +) + +verify_checksums() { + sha1sum --check "$checksums_path" +} diff --git a/%HOME%/.bash_utils/file.sh b/%HOME%/.bash_utils/file.sh new file mode 100644 index 0000000..0321833 --- /dev/null +++ b/%HOME%/.bash_utils/file.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Cygwin configuration files" project. +# For details, see https://github.com/egor-tensin/cygwin-home. +# Distributed under the MIT License. + +swap_files() ( + set -o errexit -o nounset -o pipefail + + if [ "$#" -ne 2 ]; then + echo "usage: ${FUNCNAME[0]} PATH1 PATH2" >&2 + return 1 + fi + + local path1="$1" + local path2="$2" + + if [ ! -f "$path1" ]; then + echo "${FUNCNAME[0]}: must be a regular file: $path1" >&2 + return 1 + fi + + if [ ! -f "$path2" ]; then + echo "${FUNCNAME[0]}: must be a regular file: $path2" >&2 + return 1 + fi + + local tmp_path + tmp_path="$( mktemp "$( dirname "$path1" )/XXX" )" + + mv "$path1" "$tmp_path" + mv "$path2" "$path1" + mv "$tmp_path" "$path2" +) diff --git a/%HOME%/.bash_utils/git.sh b/%HOME%/.bash_utils/git.sh new file mode 100644 index 0000000..54e50f6 --- /dev/null +++ b/%HOME%/.bash_utils/git.sh @@ -0,0 +1,102 @@ +#!/usr/bin/env bash + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Cygwin configuration files" project. +# For details, see https://github.com/egor-tensin/cygwin-home. +# Distributed under the MIT License. + +list_repo_files() ( + set -o errexit -o nounset -o pipefail + + local -a cmd=(git ls-files) + + while [ "$#" -gt 0 ]; do + case "$1" in + -z|-0) + cmd+=(-z) + shift + ;; + + -h|--help) + echo "usage: ${FUNCNAME[0]} [-h|--help] [-z|-0]" + return 0 + ;; + + *) + echo "${FUNCNAME[0]}: unrecognized parameter: $1" >&2 + return 1 + ;; + esac + done + + eval "${cmd[@]+"${cmd[@]}"}" +) + +list_repo_dirs() ( + set -o errexit -o nounset -o pipefail + + local -a cmd=(git ls-tree -d -r) + + while [ "$#" -gt 0 ]; do + case "$1" in + -z|-0) + cmd+=(-z) + shift + ;; + + -h|--help) + echo "usage: ${FUNCNAME[0]} [-h|--help] [-z|-0]" + return 0 + ;; + + *) + echo "${FUNCNAME[0]}: unrecognized parameter: $1" >&2 + return 1 + ;; + esac + done + + cmd+=(--name-only HEAD) + + eval "${cmd[@]+"${cmd[@]}"}" +) + +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 + chmod 0700 .git +) + +backup_repo() ( + set -o errexit -o nounset -o pipefail + + local repo_dir + repo_dir="$( realpath . )" + local repo_name + repo_name="$( basename "$repo_dir" )" + local backup_dir="$repo_dir" + + if [ $# -eq 1 ]; then + backup_dir="$1" + elif [ $# -gt 1 ]; then + echo "usage: ${FUNCNAME[0]} [BACKUP_DIR]" >&2 + exit 1 + fi + + local zip_name + zip_name="${repo_name}_$( date -u +'%Y%m%dT%H%M%S' ).zip" + + git archive \ + --format=zip -9 \ + --output="$backup_dir/$zip_name" \ + --remote="$repo_dir" \ + HEAD +) + +backup_repo_dropbox() ( + set -o errexit -o nounset -o pipefail + + backup_repo "$USERPROFILE/Dropbox/backups" +) diff --git a/%HOME%/.bash_utils/text.sh b/%HOME%/.bash_utils/text.sh new file mode 100644 index 0000000..ad3f203 --- /dev/null +++ b/%HOME%/.bash_utils/text.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +# Copyright (c) 2016 Egor Tensin <Egor.Tensin@gmail.com> +# This file is part of the "Cygwin configuration files" project. +# 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 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 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//'"'" + +lint() { + trim "$@" && trimeol "$@" && eol "$@" +} + +doslint() { + trim "$@" && trimdoseol "$@" && doseol "$@" +} + +replace_word() ( + set -o errexit -o nounset -o pipefail + + if [ "$#" -lt 3 ]; then + echo "usage: ${FUNCNAME[0]} OLD NEW PATH..." >&2 + return 1 + fi + + local old="$1" + shift + local new="$2" + shift + + sed --binary --in-place "s/\\b$old\\b/$new/g" "$@" +) |