mirror of
				https://github.com/gaschz/dotfiles.git
				synced 2025-11-04 05:28:56 +01:00 
			
		
		
		
	feat: enable all optional shellcheck validations
This commit is contained in:
		
							parent
							
								
									024e9c469d
								
							
						
					
					
						commit
						69c14a2429
					
				@ -1,7 +1,7 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
 | 
			
		||||
# SPDX-FileCopyrightText: 2018 Chris Laprise <https://github.com/tasket>
 | 
			
		||||
# SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
# SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
#
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-only
 | 
			
		||||
 | 
			
		||||
@ -9,6 +9,20 @@
 | 
			
		||||
## Credits: https://github.com/tasket/Qubes-scripts
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
if ! command -v sensors >/dev/null; then
 | 
			
		||||
  echo "Program not installed: sensors" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
if ! command -v xentop >/dev/null; then
 | 
			
		||||
  echo "Program not installed: xentop" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
sensors_stats () {
 | 
			
		||||
  # shellcheck disable=SC2312
 | 
			
		||||
  sensors | grep -E "^(${sensor_lines})"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
delay=5
 | 
			
		||||
sortcol=3
 | 
			
		||||
sensor_lines='Package id 0|fan1|CPU'
 | 
			
		||||
@ -17,38 +31,35 @@ newline='
 | 
			
		||||
sumline="--------------------------------------------------------"
 | 
			
		||||
header="\033[2K\nVM NAME                          STATE   CPU(%)   MEM(MB)"
 | 
			
		||||
 | 
			
		||||
sensors_stats () {
 | 
			
		||||
  sensors | grep -E "^($sensor_lines)"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
trap "tput reset" HUP INT QUIT ABRT TERM EXIT
 | 
			
		||||
 | 
			
		||||
tput reset
 | 
			
		||||
sensors_stats
 | 
			
		||||
echo -e "$header"
 | 
			
		||||
cpusum=0; memsum=0; table="$sumline"
 | 
			
		||||
# shellcheck disable=SC2016
 | 
			
		||||
stdbuf -oL xentop -b -f -d "$delay" | \
 | 
			
		||||
echo -e "${header}"
 | 
			
		||||
cpusum=0; memsum=0; table="${sumline}"
 | 
			
		||||
# shellcheck disable=SC2016,SC2312
 | 
			
		||||
stdbuf -oL xentop -b -f -d "${delay}" | \
 | 
			
		||||
  stdbuf -oL awk '{printf ("%-32s %5s %5d   %7d\n", $1,$2,$4,$5/1000) }' | \
 | 
			
		||||
  (
 | 
			
		||||
    read -r ln
 | 
			
		||||
    while true; do
 | 
			
		||||
      if read -r -t 0.1 ln; then
 | 
			
		||||
        table="$table$newline$ln"
 | 
			
		||||
        read -r _ _ cpu mem <<<"$ln"
 | 
			
		||||
        table="${table}${newline}${ln}"
 | 
			
		||||
        read -r _ _ cpu mem <<<"${ln}"
 | 
			
		||||
        cpusum=$((cpusum+cpu))
 | 
			
		||||
        memsum=$((memsum+mem))
 | 
			
		||||
      else
 | 
			
		||||
        # End of list, print totals, make new page.
 | 
			
		||||
        sort -k $sortcol -n -r <<<"$table"
 | 
			
		||||
        printf '%-32s %5s  %5d   %7d\033[J\033[H' " " " " "$cpusum" "$memsum"
 | 
			
		||||
        sort -k "${sortcol}" -n -r <<<"${table}"
 | 
			
		||||
        printf '%-32s %5s  %5d   %7d\033[J\033[H' " " " " "${cpusum}" \
 | 
			
		||||
          "${memsum}"
 | 
			
		||||
        read -r ln
 | 
			
		||||
        cpusum=0; memsum=0
 | 
			
		||||
        table="$sumline"
 | 
			
		||||
        table="${sumline}"
 | 
			
		||||
        #clear
 | 
			
		||||
        #sensors |grep -E "^($sensor_lines)"
 | 
			
		||||
        #sensors |grep -E "^(${sensor_lines})"
 | 
			
		||||
        sensors_stats
 | 
			
		||||
        echo -e "\033[2K$header\n"
 | 
			
		||||
        echo -e "\033[2K${header}\n"
 | 
			
		||||
      fi
 | 
			
		||||
    done
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
@ -20,4 +20,4 @@
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
xkb_plugin="$(xfconf-query -v -c xfce4-panel -p /plugins -l | grep xkb)"
 | 
			
		||||
xfconf-query -c xfce4-panel -p "$xkb_plugin/group-policy" -n -s 0
 | 
			
		||||
xfconf-query -c xfce4-panel -p "${xkb_plugin}/group-policy" -n -s 0
 | 
			
		||||
 | 
			
		||||
@ -6,7 +6,7 @@
 | 
			
		||||
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
## Guarantee commands are run from $HOME
 | 
			
		||||
## Guarantee commands are run from ${HOME}
 | 
			
		||||
cd
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2034
 | 
			
		||||
@ -25,35 +25,35 @@ fail_invalid_name(){
 | 
			
		||||
test_description(){
 | 
			
		||||
  key="$1"
 | 
			
		||||
  value="$2"
 | 
			
		||||
  if ! (echo "$value" | grep -E -q "${description_regex}"); then
 | 
			
		||||
    fail_invalid_name "$key"
 | 
			
		||||
  if ! (echo "${value}" | grep -E -q "${description_regex}"); then
 | 
			
		||||
    fail_invalid_name "${key}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test_name(){
 | 
			
		||||
  key="$1"
 | 
			
		||||
  value="$2"
 | 
			
		||||
  if ! (echo "$value" | grep -E -q "${regex}"); then
 | 
			
		||||
    fail_invalid_name "$key"
 | 
			
		||||
  if ! (echo "${value}" | grep -E -q "${regex}"); then
 | 
			
		||||
    fail_invalid_name "${key}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
clean_repo_name(){
 | 
			
		||||
  case "${repo-}" in
 | 
			
		||||
    *.git) repo="";;
 | 
			
		||||
    *) repo="$repo.git";;
 | 
			
		||||
    *) repo="${repo}.git";;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
is_bare(){
 | 
			
		||||
  _repo="$1"
 | 
			
		||||
  if ! test -d "$_repo"; then
 | 
			
		||||
    echo "Repository doesn't exist: $_repo" >&2
 | 
			
		||||
  if ! test -d "${_repo}"; then
 | 
			
		||||
    echo "Repository doesn't exist: ${_repo}" >&2
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
  if ! test "$(git -C "$_repo" rev-parse --is-bare-repository)" = "true"
 | 
			
		||||
  then
 | 
			
		||||
    echo "Repository is not bare: $_repo" >&2
 | 
			
		||||
  bare_repo_check="$(git -C "${_repo}" rev-parse --is-bare-repository)"
 | 
			
		||||
  if ! test "${bare_repo_check}" = "true"; then
 | 
			
		||||
    echo "Repository is not bare: ${_repo}" >&2
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -13,29 +13,29 @@ usage(){
 | 
			
		||||
  # shellcheck disable=2154
 | 
			
		||||
  echo "usage: ${0##*/} SECTION REPOSITORY [DESCRIPTION]
 | 
			
		||||
note: prints the current description if none description is specified.:w
 | 
			
		||||
regex: $regex" >&2
 | 
			
		||||
regex: ${regex}" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test -n "${2-}" || usage
 | 
			
		||||
section="$1"
 | 
			
		||||
test_name section "$section"
 | 
			
		||||
test_name section "${section}"
 | 
			
		||||
repo="$2"
 | 
			
		||||
test_name repo "$repo"
 | 
			
		||||
test_name repo "${repo}"
 | 
			
		||||
clean_repo_name
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2154
 | 
			
		||||
is_bare "$base/$section/$repo"
 | 
			
		||||
is_bare "${base}/${section}/${repo}"
 | 
			
		||||
 | 
			
		||||
description_file="$base/$section/$repo/description"
 | 
			
		||||
description_file="${base}/${section}/${repo}/description"
 | 
			
		||||
 | 
			
		||||
if test -z "${3-}"; then
 | 
			
		||||
  test -f "$description_file" || touch "$description_file"
 | 
			
		||||
  cat "$description_file"
 | 
			
		||||
  test -f "${description_file}" || touch "${description_file}"
 | 
			
		||||
  cat "${description_file}"
 | 
			
		||||
  exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
description="$(echo "$3" | cut -c 1-80)"
 | 
			
		||||
test_description description "$description"
 | 
			
		||||
test_description description "${description}"
 | 
			
		||||
 | 
			
		||||
echo "$description" | tee "$description_file"
 | 
			
		||||
echo "${description}" | tee "${description_file}"
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,8 @@ set -eu
 | 
			
		||||
printf "Available commands:\n"
 | 
			
		||||
for f in "${0%/*}"/*; do
 | 
			
		||||
  test "${f##*/}" != "help" || continue
 | 
			
		||||
  test -f "$f" || continue
 | 
			
		||||
  test -x "$f" || continue
 | 
			
		||||
  usage="$("$f" --help 2>&1 | head -1 | sed "s/[Uu]sage: //")"
 | 
			
		||||
  test -f "${f}" || continue
 | 
			
		||||
  test -x "${f}" || continue
 | 
			
		||||
  usage="$("${f}" --help 2>&1 | head -1 | sed "s/[Uu]sage: //")"
 | 
			
		||||
  printf ' %-15s\t\t%s\n' "${f##*/}" "${usage}"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
@ -12,25 +12,25 @@ set -eu
 | 
			
		||||
usage(){
 | 
			
		||||
  # shellcheck disable=2154
 | 
			
		||||
  echo "usage: ${0##*/} SECTION REPOSITORY [BRANCH]
 | 
			
		||||
regex: $regex" >&2
 | 
			
		||||
regex: ${regex}" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test -n "${2-}" || usage
 | 
			
		||||
section="$1"
 | 
			
		||||
test_name section "$section"
 | 
			
		||||
test_name section "${section}"
 | 
			
		||||
repo="$2"
 | 
			
		||||
test_name repo "$repo"
 | 
			
		||||
test_name repo "${repo}"
 | 
			
		||||
clean_repo_name
 | 
			
		||||
branch=""
 | 
			
		||||
test -n "${3-}" && branch="$3"
 | 
			
		||||
 | 
			
		||||
if test -n "${branch}"; then
 | 
			
		||||
  test_name branch "$branch"
 | 
			
		||||
  test_name branch "${branch}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2154
 | 
			
		||||
git init \
 | 
			
		||||
  --bare \
 | 
			
		||||
  ${branch:+--initial-branch $branch} \
 | 
			
		||||
  -- "$base/$section/$repo"
 | 
			
		||||
  ${branch:+--initial-branch ${branch}} \
 | 
			
		||||
  -- "${base}/${section}/${repo}"
 | 
			
		||||
 | 
			
		||||
@ -15,7 +15,7 @@ set -eu
 | 
			
		||||
usage(){
 | 
			
		||||
  # shellcheck disable=2154
 | 
			
		||||
  echo "usage: ${0##*/} [SECTION]
 | 
			
		||||
regex: $regex" >&2
 | 
			
		||||
regex: ${regex}" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -23,12 +23,12 @@ section=""
 | 
			
		||||
case "${1-}" in
 | 
			
		||||
  -h|--help) usage;;
 | 
			
		||||
  "") ;;
 | 
			
		||||
  *) section="$1"; test_name section "$section";;
 | 
			
		||||
  *) section="$1"; test_name section "${section}";;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2154
 | 
			
		||||
if ! test -d "$base/$section"; then
 | 
			
		||||
  echo "Section doesn't exist: $section" >&2
 | 
			
		||||
if ! test -d "${base}/${section}"; then
 | 
			
		||||
  echo "Section doesn't exist: ${section}" >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -39,10 +39,10 @@ print_bare='
 | 
			
		||||
'
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2154
 | 
			
		||||
if test -n "$section"; then
 | 
			
		||||
  find "$base/$section" -maxdepth 1 -type d -name "*.git" \
 | 
			
		||||
    -exec sh -c "$print_bare" -- {} \; -prune 2>/dev/null || true
 | 
			
		||||
if test -n "${section}"; then
 | 
			
		||||
  find "${base}/${section}" -maxdepth 1 -type d -name "*.git" \
 | 
			
		||||
    -exec sh -c "${print_bare}" -- {} \; -prune 2>/dev/null || true
 | 
			
		||||
else
 | 
			
		||||
  find "$base" -maxdepth 2 -type d -name "*.git" \
 | 
			
		||||
    -exec sh -c "$print_bare" -- {} \; -prune 2>/dev/null || true
 | 
			
		||||
  find "${base}" -maxdepth 2 -type d -name "*.git" \
 | 
			
		||||
    -exec sh -c "${print_bare}" -- {} \; -prune 2>/dev/null || true
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -30,13 +30,18 @@ set -eu
 | 
			
		||||
 | 
			
		||||
command -v git >/dev/null || exit 1
 | 
			
		||||
 | 
			
		||||
: "${GIT_PUSH_CERT_STATUS:-}"
 | 
			
		||||
: "${GIT_PUSH_CERT_KEY:-}"
 | 
			
		||||
: "${GIT_PUSH_CERT_NONCE_STATUS:-}"
 | 
			
		||||
: "${GIT_PUSH_CERT_NONCE:-}"
 | 
			
		||||
 | 
			
		||||
obj_rejected=""
 | 
			
		||||
zero="$(git hash-object --stdin </dev/null | tr "0-9a-f" "0")"
 | 
			
		||||
tmpdir="$(mktemp -d "${TMPDIR:-/tmp}/XXXXXX")"
 | 
			
		||||
trap 'rm -f "$tmpdir"' HUP INT QUIT ABRT TERM EXIT
 | 
			
		||||
trap 'rm -f "${tmpdir}"' HUP INT QUIT ABRT TERM EXIT
 | 
			
		||||
 | 
			
		||||
err(){
 | 
			
		||||
  echo "$*" >&2
 | 
			
		||||
  echo "${*}" >&2
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
require_signed_push(){
 | 
			
		||||
@ -77,33 +82,33 @@ check_signed_push_keyring(){
 | 
			
		||||
  cert="$(git cat-file blob "${GIT_PUSH_CERT}")"
 | 
			
		||||
  begin_sig="-----BEGIN PGP SIGNATURE-----"
 | 
			
		||||
 | 
			
		||||
  cert_msg="$tmpdir"/cert.msg
 | 
			
		||||
  cert_sig="$tmpdir"/cert.sig
 | 
			
		||||
  cert_msg="${tmpdir}"/cert.msg
 | 
			
		||||
  cert_sig="${tmpdir}"/cert.sig
 | 
			
		||||
 | 
			
		||||
  in_sig=0
 | 
			
		||||
  echo "$cert" | while read -r line; do
 | 
			
		||||
    if test "$in_sig" = "1" || test "$line" = "$begin_sig"; then
 | 
			
		||||
  echo "${cert}" | while read -r line; do
 | 
			
		||||
    if test "${in_sig}" = "1" || test "${line}" = "${begin_sig}"; then
 | 
			
		||||
      in_sig=1
 | 
			
		||||
      echo "$line" | tee -a "$cert_sig"
 | 
			
		||||
    elif test "$line" != "$begin_sig"; then
 | 
			
		||||
      echo "$line" | tee -a "$cert_msg"
 | 
			
		||||
      echo "${line}" | tee -a "${cert_sig}"
 | 
			
		||||
    elif test "${line}" != "${begin_sig}"; then
 | 
			
		||||
      echo "${line}" | tee -a "${cert_msg}"
 | 
			
		||||
    else
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  gpg_out="$("$gpg" --status-fd=1 --no-default-keyring \
 | 
			
		||||
  gpg_out="$("${gpg}" --status-fd=1 --no-default-keyring \
 | 
			
		||||
              --homedir "${GIT_PUSH_CERT_PGPHOMEDIR}" \
 | 
			
		||||
              --verify "$cert_sig" "$cert_msg" 2>&1)"
 | 
			
		||||
              --verify "${cert_sig}" "${cert_msg}" 2>&1)"
 | 
			
		||||
  gpg_ec="$?"
 | 
			
		||||
  gpg_sig="$(echo "$gpg_out" | awk '/ GOODSIG /{print $3}')"
 | 
			
		||||
  if test "$gpg_ec" = "0"; then
 | 
			
		||||
    true "Cert validation succeeded. Key: $gpg_sig"
 | 
			
		||||
  gpg_sig="$(echo "${gpg_out}" | awk '/ GOODSIG /{print $3}')"
 | 
			
		||||
  if test "${gpg_ec}" = "0"; then
 | 
			
		||||
    true "Cert validation succeeded. Key: ${gpg_sig}"
 | 
			
		||||
  else
 | 
			
		||||
    err "Cert validation failed. Verification output:"
 | 
			
		||||
    err "$gpg_out"
 | 
			
		||||
    err "${gpg_out}"
 | 
			
		||||
  fi
 | 
			
		||||
  rm -rf "$tmpdir"
 | 
			
		||||
  rm -rf "${tmpdir}"
 | 
			
		||||
 | 
			
		||||
  if test "${GIT_PUSH_CERT_NONCE_STATUS}" = "OK"; then
 | 
			
		||||
    true "Cert nonce validation succeeded. Nonce: ${GIT_PUSH_CERT_NONCE}"
 | 
			
		||||
@ -119,47 +124,47 @@ if git config --get receive.certNonceSeed >/dev/null 2>&1; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
while read -r oldrev newrev ref; do
 | 
			
		||||
  true "$oldrev $newrev $ref"
 | 
			
		||||
  test "$newrev" = "$zero" && continue
 | 
			
		||||
  true "${oldrev} ${newrev} ${ref}"
 | 
			
		||||
  test "${newrev}" = "${zero}" && continue
 | 
			
		||||
 | 
			
		||||
  if test "$oldrev" = "$zero"; then
 | 
			
		||||
    objects="$(git rev-list "$newrev")"
 | 
			
		||||
  if test "${oldrev}" = "${zero}"; then
 | 
			
		||||
    objects="$(git rev-list "${newrev}")"
 | 
			
		||||
  else
 | 
			
		||||
    objects="$(git rev-list "$oldrev..$newrev")"
 | 
			
		||||
    objects="$(git rev-list "${oldrev}..${newrev}")"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  obj_type="$(git cat-file -t "$newrev")"
 | 
			
		||||
  if test "$obj_type" = "tag"; then
 | 
			
		||||
    if git verify-tag "$newrev" >/dev/null 2>&1; then
 | 
			
		||||
      true "Tag validation succeeded for tag: $newrev"
 | 
			
		||||
  obj_type="$(git cat-file -t "${newrev}")"
 | 
			
		||||
  if test "${obj_type}" = "tag"; then
 | 
			
		||||
    if git verify-tag "${newrev}" >/dev/null 2>&1; then
 | 
			
		||||
      true "Tag validation succeeded for tag: ${newrev}"
 | 
			
		||||
    else
 | 
			
		||||
      obj_rejected="${obj_rejected-} $newrev "
 | 
			
		||||
      obj_rejected="${obj_rejected-} ${newrev} "
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
    commit_tag="$(git rev-list -n1 "$newrev")"
 | 
			
		||||
    obj_rejected="$(echo "$obj_rejected" | sed "s/ $commit_tag //")"
 | 
			
		||||
    err "Commit validation done by tag: $commit_tag $newrev"
 | 
			
		||||
    commit_tag="$(git rev-list -n1 "${newrev}")"
 | 
			
		||||
    obj_rejected="$(echo "${obj_rejected}" | sed "s/ ${commit_tag} //")"
 | 
			
		||||
    err "Commit validation done by tag: ${commit_tag} ${newrev}"
 | 
			
		||||
    continue
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  for obj in $objects; do
 | 
			
		||||
  for obj in ${objects}; do
 | 
			
		||||
 | 
			
		||||
    if git verify-commit "$obj" >/dev/null 2>&1; then
 | 
			
		||||
      true "Commit validation succeeded commit: $obj"
 | 
			
		||||
    if git verify-commit "${obj}" >/dev/null 2>&1; then
 | 
			
		||||
      true "Commit validation succeeded commit: ${obj}"
 | 
			
		||||
      continue
 | 
			
		||||
    else
 | 
			
		||||
      err "No valid signature in commit: $obj"
 | 
			
		||||
      obj_rejected="${obj_rejected-} $obj "
 | 
			
		||||
      err "No valid signature in commit: ${obj}"
 | 
			
		||||
      obj_rejected="${obj_rejected-} ${obj} "
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
  done
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
test -n "$obj_rejected" || exit 0
 | 
			
		||||
test -n "${obj_rejected}" || exit 0
 | 
			
		||||
 | 
			
		||||
obj_rejected="$(echo "$obj_rejected" | tr -s " " |
 | 
			
		||||
obj_rejected="$(echo "${obj_rejected}" | tr -s " " |
 | 
			
		||||
  sed -e "s/^ //" -e "s/ $//")"
 | 
			
		||||
err "Couldn't verify objects: $obj_rejected"
 | 
			
		||||
err "Couldn't verify objects: ${obj_rejected}"
 | 
			
		||||
exit 1
 | 
			
		||||
 | 
			
		||||
## Force signed pushes if receive.certNonceSeed is set.
 | 
			
		||||
@ -168,42 +173,42 @@ if git config --get receive.certNonceSeed >/dev/null 2>&1; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
while read -r oldrev newrev ref; do
 | 
			
		||||
  true "$oldrev $newrev $ref"
 | 
			
		||||
  test "$newrev" = "$zero" && continue
 | 
			
		||||
  true "${oldrev} ${newrev} ${ref}"
 | 
			
		||||
  test "${newrev}" = "${zero}" && continue
 | 
			
		||||
 | 
			
		||||
  if test "$oldrev" = "$zero"; then
 | 
			
		||||
    objects="$(git rev-list "$newrev")"
 | 
			
		||||
  if test "${oldrev}" = "${zero}"; then
 | 
			
		||||
    objects="$(git rev-list "${newrev}")"
 | 
			
		||||
  else
 | 
			
		||||
    objects="$(git rev-list "$oldrev..$newrev")"
 | 
			
		||||
    objects="$(git rev-list "${oldrev}..${newrev}")"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  obj_type="$(git cat-file -t "$newrev")"
 | 
			
		||||
  if test "$obj_type" = "tag"; then
 | 
			
		||||
    if git verify-tag "$newrev" >/dev/null 2>&1; then
 | 
			
		||||
      true "Tag validation succeeded for tag: $newrev"
 | 
			
		||||
  obj_type="$(git cat-file -t "${newrev}")"
 | 
			
		||||
  if test "${obj_type}" = "tag"; then
 | 
			
		||||
    if git verify-tag "${newrev}" >/dev/null 2>&1; then
 | 
			
		||||
      true "Tag validation succeeded for tag: ${newrev}"
 | 
			
		||||
    else
 | 
			
		||||
      obj_rejected="${obj_rejected-} $newrev "
 | 
			
		||||
      obj_rejected="${obj_rejected-} ${newrev} "
 | 
			
		||||
      continue
 | 
			
		||||
    fi
 | 
			
		||||
    commit_tag="$(git rev-list -n1 "$newrev")"
 | 
			
		||||
    obj_rejected="$(echo "$obj_rejected" | sed "s/ $commit_tag //")"
 | 
			
		||||
    err "Commit validation done by tag: $commit_tag $newrev"
 | 
			
		||||
    commit_tag="$(git rev-list -n1 "${newrev}")"
 | 
			
		||||
    obj_rejected="$(echo "${obj_rejected}" | sed "s/ ${commit_tag} //")"
 | 
			
		||||
    err "Commit validation done by tag: ${commit_tag} ${newrev}"
 | 
			
		||||
    continue
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  for obj in $objects; do
 | 
			
		||||
    if git verify-commit "$obj" >/dev/null 2>&1; then
 | 
			
		||||
      true "Commit validation succeeded for commit: $obj"
 | 
			
		||||
  for obj in ${objects}; do
 | 
			
		||||
    if git verify-commit "${obj}" >/dev/null 2>&1; then
 | 
			
		||||
      true "Commit validation succeeded for commit: ${obj}"
 | 
			
		||||
      continue
 | 
			
		||||
    else
 | 
			
		||||
      err "No valid signature in commit: $obj"
 | 
			
		||||
      obj_rejected="${obj_rejected-} $obj "
 | 
			
		||||
      err "No valid signature in commit: ${obj}"
 | 
			
		||||
      obj_rejected="${obj_rejected-} ${obj} "
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
test -n "$obj_rejected" || exit 0
 | 
			
		||||
test -n "${obj_rejected}" || exit 0
 | 
			
		||||
 | 
			
		||||
obj_rejected="$(echo "$obj_rejected" | tr -s " " | sed -e "s/^ //;s/ $//")"
 | 
			
		||||
err "Couldn't verify objects: $obj_rejected"
 | 
			
		||||
obj_rejected="$(echo "${obj_rejected}" | tr -s " " | sed -e "s/^ //;s/ $//")"
 | 
			
		||||
err "Couldn't verify objects: ${obj_rejected}"
 | 
			
		||||
exit 1
 | 
			
		||||
 | 
			
		||||
@ -15,12 +15,12 @@ file="$1"
 | 
			
		||||
#sha1="$3"
 | 
			
		||||
 | 
			
		||||
char="$(git config --get core.commentChar || echo "#")"
 | 
			
		||||
template="$(git config --get commit.template | sed "s|^~/|$HOME/|")"
 | 
			
		||||
template="$(git config --get commit.template | sed "s|^~/|${HOME}/|")"
 | 
			
		||||
 | 
			
		||||
if test "$char" = "auto"; then
 | 
			
		||||
if test "${char}" = "auto"; then
 | 
			
		||||
  ## Try to skip the init.template comment char by getting the last match, as
 | 
			
		||||
  ## the template will be placed at the beginning of the file.
 | 
			
		||||
  char="$(grep -E "^(#|;|@|!|$|%|^|&|\\||:) " "$file" | cut -c 1 | tail -n 1)"
 | 
			
		||||
  char="$(grep -E "^(#|;|@|!|$|%|^|&|\\||:) " "${file}" | cut -c1 | tail -n1)"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
## Remove the default instructional message and its following empty line.
 | 
			
		||||
@ -28,12 +28,12 @@ sed -i'' \
 | 
			
		||||
  -e "/^. Please enter the commit message .*. Lines starting$/d" \
 | 
			
		||||
  -e "/^. with '.' will be ignored, .* aborts the commit.$/ {
 | 
			
		||||
      N; d; }" \
 | 
			
		||||
  "$file"
 | 
			
		||||
  "${file}"
 | 
			
		||||
 | 
			
		||||
## Replace init.template comment char to the core.commentChar line per line.
 | 
			
		||||
if test -f "$template"; then
 | 
			
		||||
if test -f "${template}"; then
 | 
			
		||||
  while read -r line; do
 | 
			
		||||
    mod_line="$(echo "$line" | sed "s/^. /${char} /")"
 | 
			
		||||
    sed -i'' "s/^${line}$/${mod_line}/" "$file"
 | 
			
		||||
  done < "$template"
 | 
			
		||||
    mod_line="$(echo "${line}" | sed "s/^. /${char} /")"
 | 
			
		||||
    sed -i'' "s/^${line}$/${mod_line}/" "${file}"
 | 
			
		||||
  done < "${template}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -7,8 +7,8 @@
 | 
			
		||||
## Setup git client on new machine on a local/separate git configuration.
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
gitconfig_file="$HOME/.gitconfig.local"
 | 
			
		||||
signature_file="$HOME/.signature"
 | 
			
		||||
gitconfig_file="${HOME}/.gitconfig.local"
 | 
			
		||||
signature_file="${HOME}/.signature"
 | 
			
		||||
vim_modeline="vim: ft=gitconfig"
 | 
			
		||||
 | 
			
		||||
usage(){
 | 
			
		||||
@ -30,20 +30,20 @@ email="$2"
 | 
			
		||||
signingkey="$3"
 | 
			
		||||
 | 
			
		||||
set_git_config(){
 | 
			
		||||
  git config --file "$gitconfig_file" "$1" "$2"
 | 
			
		||||
  git config --file "${gitconfig_file}" "$1" "$2"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set_git_config user.name "$user"
 | 
			
		||||
set_git_config user.email "$email"
 | 
			
		||||
set_git_config user.signingKey "$signingkey"
 | 
			
		||||
set_git_config user.name "${user}"
 | 
			
		||||
set_git_config user.email "${email}"
 | 
			
		||||
set_git_config user.signingKey "${signingkey}"
 | 
			
		||||
 | 
			
		||||
if test -s "$signature_file"; then
 | 
			
		||||
  set_git_config format.signatureFile "$signature_file"
 | 
			
		||||
if test -s "${signature_file}"; then
 | 
			
		||||
  set_git_config format.signatureFile "${signature_file}"
 | 
			
		||||
else
 | 
			
		||||
  set_git_config format.signature "$user"
 | 
			
		||||
  set_git_config format.signature "${user}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
grep \
 | 
			
		||||
  -E "^;*\s+(vim:.*(\s+|:)|vim:(\s*))(ft|filetype)=gitconfig((\s+|:).*|$)" \
 | 
			
		||||
  -q "$gitconfig_file" ||
 | 
			
		||||
  sed -i'' "1i; $vim_modeline" "$gitconfig_file"
 | 
			
		||||
  -q "${gitconfig_file}" ||
 | 
			
		||||
  sed -i'' "1i; ${vim_modeline}" "${gitconfig_file}"
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,7 @@
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
if command -v delta >/dev/null; then
 | 
			
		||||
  exec delta "$@"
 | 
			
		||||
  exec delta "${@}"
 | 
			
		||||
else
 | 
			
		||||
  : "${DIFF_HIGHLIGHT_SOURCE:=/usr/share/doc/git/contrib/diff-highlight}"
 | 
			
		||||
  : "${DIFF_HIGHLIGHT_EXEC:=/usr/share/git-core/contrib/diff-highlight}"
 | 
			
		||||
@ -26,5 +26,5 @@ else
 | 
			
		||||
    exec "${DIFF_HIGHLIGHT_EXEC}" | less -RS
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  exec less -RS "$@"
 | 
			
		||||
  exec less -RS "${@}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -7,7 +7,8 @@
 | 
			
		||||
## Setup git server.
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
if ! test "$(id -u)" = "0"; then
 | 
			
		||||
uid="$(id -u)"
 | 
			
		||||
if ! test "${uid}" = "0"; then
 | 
			
		||||
  echo "This program requires root." >&2
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
@ -25,23 +26,23 @@ git_user="git"
 | 
			
		||||
git_home="/var/git"
 | 
			
		||||
git_shell="$(command -v git-shell)"
 | 
			
		||||
 | 
			
		||||
useradd -m "$git_user" -d "$git_home" -s "$git_shell"
 | 
			
		||||
mkdir -p "$git_home/src"
 | 
			
		||||
useradd -m "${git_user}" -d "${git_home}" -s "${git_shell}"
 | 
			
		||||
mkdir -p "${git_home}/src"
 | 
			
		||||
 | 
			
		||||
mkdir -p "$git_home/.ssh"
 | 
			
		||||
chmod 0700 "$git_home/.ssh"
 | 
			
		||||
touch "$git_home/.ssh/authorized_keys"
 | 
			
		||||
chmod 0600 "$git_home/.ssh/authorized_keys"
 | 
			
		||||
mkdir -p "${git_home}/.ssh"
 | 
			
		||||
chmod 0700 "${git_home}/.ssh"
 | 
			
		||||
touch "${git_home}/.ssh/authorized_keys"
 | 
			
		||||
chmod 0600 "${git_home}/.ssh/authorized_keys"
 | 
			
		||||
 | 
			
		||||
mkdir -p "$git_home/git-shell-commands"
 | 
			
		||||
cp -r "$git_home/.config/git/shell"/* "$git_home/git-shell-commands"
 | 
			
		||||
chmod -R 0755 "$git_home/git-shell-commands"
 | 
			
		||||
mkdir -p "${git_home}/git-shell-commands"
 | 
			
		||||
cp -r "${git_home}/.config/git/shell"/* "${git_home}/git-shell-commands"
 | 
			
		||||
chmod -R 0755 "${git_home}/git-shell-commands"
 | 
			
		||||
 | 
			
		||||
git config --system receive.updateServerInfo true
 | 
			
		||||
git config --system receive.advertisePushOptions true
 | 
			
		||||
nonce="$(head /dev/urandom |
 | 
			
		||||
  LC_ALL=C tr -dc 'A-Za-z0-9!#$%&'\''()*+,-./:;<=>?@[\]^_`{|}~' |
 | 
			
		||||
  cut -c 1-256)"
 | 
			
		||||
git config --system receive.certNonceSeed "$nonce"
 | 
			
		||||
git config --system receive.certNonceSeed "${nonce}"
 | 
			
		||||
 | 
			
		||||
chown -R "$git_user":"$git_user" "$git_home"
 | 
			
		||||
chown -R "${git_user}":"${git_user}" "${git_home}"
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,8 @@
 | 
			
		||||
##
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
: "${XDG_CONFIG_HOME:=$HOME/.config}"
 | 
			
		||||
: "${XDG_CONFIG_HOME:=${HOME}/.config}"
 | 
			
		||||
 | 
			
		||||
CURL_HOME="$XDG_CONFIG_HOME/curl"
 | 
			
		||||
WGETRC="$XDG_CONFIG_HOME/wget/wgetrc"
 | 
			
		||||
CURL_HOME="${XDG_CONFIG_HOME}/curl"
 | 
			
		||||
WGETRC="${XDG_CONFIG_HOME}/wget/wgetrc"
 | 
			
		||||
export CURL_HOME WGETRC
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
##
 | 
			
		||||
## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
##
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
##
 | 
			
		||||
@ -15,26 +15,30 @@
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
test -n "${1:-}" || { echo "usage: ${0##*/} QUBE"; exit 1; }
 | 
			
		||||
test "$(id -u)" = "0" || { echo "Program requires root."; exit 1; }
 | 
			
		||||
uid="$(id -u)"
 | 
			
		||||
test "${uid}" = "0" || { echo "Program requires root."; exit 1; }
 | 
			
		||||
 | 
			
		||||
vm="$1"
 | 
			
		||||
qvm-check "$vm" >/dev/null 2>&1 || { echo "VM doesn't exist: '$vm'"; exit 1; }
 | 
			
		||||
qube="${1-}"
 | 
			
		||||
if ! qvm-check -- "${qube}" >/dev/null 2>&1; then
 | 
			
		||||
  echo "VM doesn't exist: '${qube}'"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
test -f ./setup.sh || { echo "File doesn't exist: './setup.sh'"; exit 1; }
 | 
			
		||||
 | 
			
		||||
if test "$vm" = "dom0"; then
 | 
			
		||||
if test "${qube}" = "dom0"; then
 | 
			
		||||
  sh ./dotfiles/setup.sh
 | 
			
		||||
  user_name="$(getent group qubes | awk -F "[:,]" '{print $4}')"
 | 
			
		||||
  user_home="$(getent passwd "${user_name}" | awk -F ":" '{print $6}')"
 | 
			
		||||
  sudo -u "${user_name}" mkdir -pv "${user_home}/.cache"
 | 
			
		||||
  tmpdir="$(sudo -u "${user_name}" mktemp -d "${user_home}/.cache/XXXXXX")"
 | 
			
		||||
  trap 'rm -rf -- "$tmpdir"' EXIT INT HUP QUIT ABRT
 | 
			
		||||
  cp -r ./dotfiles "$tmpdir"
 | 
			
		||||
  chown -R "${user_name}:${user_name}" "$tmpdir"
 | 
			
		||||
  sudo -u "${user_name}" "$tmpdir/dotfiles/setup.sh"
 | 
			
		||||
  trap 'rm -rf -- "${tmpdir}"' EXIT INT HUP QUIT ABRT
 | 
			
		||||
  cp -r ./dotfiles "${tmpdir}"
 | 
			
		||||
  chown -R "${user_name}:${user_name}" "${tmpdir}"
 | 
			
		||||
  sudo -u "${user_name}" "${tmpdir}/dotfiles/setup.sh"
 | 
			
		||||
  exit
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
qvm-run -q "$vm" -- "rm -rf ~/QubesIncoming/dom0/files"
 | 
			
		||||
qvm-copy-to-vm "$vm" ../files
 | 
			
		||||
qvm-run -q "$vm" -- "sh ~/QubesIncoming/dom0/files/setup.sh"
 | 
			
		||||
qvm-run -q "$vm" -- "rm -rf ~/QubesIncoming/dom0/files"
 | 
			
		||||
qvm-run -q "${qube}" -- "rm -rf ~/QubesIncoming/dom0/files"
 | 
			
		||||
qvm-copy-to-vm "${qube}" ../files
 | 
			
		||||
qvm-run -q "${qube}" -- "sh ~/QubesIncoming/dom0/files/setup.sh"
 | 
			
		||||
qvm-run -q "${qube}" -- "rm -rf ~/QubesIncoming/dom0/files"
 | 
			
		||||
 | 
			
		||||
@ -7,15 +7,15 @@
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
prg="$0"
 | 
			
		||||
if ! test -e "$prg"; then
 | 
			
		||||
  case "$prg" in
 | 
			
		||||
if ! test -e "${prg}"; then
 | 
			
		||||
  case "${prg}" in
 | 
			
		||||
    (*/*) exit 1;;
 | 
			
		||||
    (*) prg=$(command -v -- "$prg") || exit;;
 | 
			
		||||
    (*) prg=$(command -v -- "${prg}") || exit;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
dir="$(cd -P -- "$(dirname -- "$prg")" && pwd -P)" || exit 1
 | 
			
		||||
prg="$dir/$(basename -- "$prg")" || exit 1
 | 
			
		||||
cd -- "$dir" || exit 1
 | 
			
		||||
dir="$(cd -P -- "$(dirname -- "${prg}")" && pwd -P)" || exit 1
 | 
			
		||||
prg="${dir}/$(basename -- "${prg}")" || exit 1
 | 
			
		||||
cd -- "${dir}" || exit 1
 | 
			
		||||
 | 
			
		||||
usage(){
 | 
			
		||||
  printf '%s\n' "Usage: ${0##*/} [-h|--help] DIR [DIR2...]"
 | 
			
		||||
@ -29,17 +29,23 @@ case "${1-}" in
 | 
			
		||||
  *) args="${*}";;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
for dir in $args; do
 | 
			
		||||
  case "${dir##*/}" in "."|"..") continue;; esac
 | 
			
		||||
for dir in ${args}; do
 | 
			
		||||
  case "${dir##*/}" in
 | 
			
		||||
    "."|"..") continue;;
 | 
			
		||||
    *) ;;
 | 
			
		||||
  esac
 | 
			
		||||
  dir="${dir%*/}"
 | 
			
		||||
  test -f "$dir" && continue
 | 
			
		||||
  if ! test -d "$dir"; then
 | 
			
		||||
    printf '%s\n' "Directory doesn't exist: '$dir'." >&2
 | 
			
		||||
  test -f "${dir}" && continue
 | 
			
		||||
  if ! test -d "${dir}"; then
 | 
			
		||||
    printf '%s\n' "Directory doesn't exist: '${dir}'." >&2
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
  for file in "$dir"/.*; do
 | 
			
		||||
    test -e "$file" || continue
 | 
			
		||||
    case "${file##*/}" in "."|"..") continue;; esac
 | 
			
		||||
    cp -rv "$file" "$HOME"
 | 
			
		||||
  for file in "${dir}"/.*; do
 | 
			
		||||
    test -e "${file}" || continue
 | 
			
		||||
    case "${file##*/}" in
 | 
			
		||||
      "."|"..") continue;;
 | 
			
		||||
      *) ;;
 | 
			
		||||
    esac
 | 
			
		||||
    cp -rv "${file}" "${HOME}"
 | 
			
		||||
  done
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
@ -7,9 +7,9 @@
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
 | 
			
		||||
if test -z "$ENV" && test -n "$PATH"; then
 | 
			
		||||
if test -z "${ENV}" && test -n "${PATH}"; then
 | 
			
		||||
  case $- in
 | 
			
		||||
    *l*) ;;
 | 
			
		||||
      *) . "$HOME/.bash_profile" >/dev/null ;;
 | 
			
		||||
      *) . "${HOME}/.bash_profile" >/dev/null ;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
@ -6,5 +6,8 @@
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC1090,1091
 | 
			
		||||
 | 
			
		||||
. "$HOME/.profile"
 | 
			
		||||
case $- in *i*) . "$HOME/.bashrc";; esac
 | 
			
		||||
. "${HOME}/.profile"
 | 
			
		||||
case $- in
 | 
			
		||||
  *i*) . "${HOME}/.bashrc";;
 | 
			
		||||
  *) ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
@ -13,9 +13,9 @@ esac
 | 
			
		||||
 | 
			
		||||
## Source default files.
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
source "$HOME/.profile"
 | 
			
		||||
source "${HOME}/.profile"
 | 
			
		||||
# shellcheck disable=SC1090
 | 
			
		||||
source "$ENV"
 | 
			
		||||
source "${ENV}"
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ Options
 | 
			
		||||
HISTCONTROL=ignoredups
 | 
			
		||||
@ -39,20 +39,27 @@ fi
 | 
			
		||||
_reset_line() {
 | 
			
		||||
  case "${TERM-}" in
 | 
			
		||||
    ""|dumb|linux*|vt100*|vt220*) return;;
 | 
			
		||||
    *) ;;
 | 
			
		||||
  esac
 | 
			
		||||
  ## Credit: Can't find the source, posted on StackExchange or alike.
 | 
			
		||||
  ## Does not work well on Bash 5.0 and older.
 | 
			
		||||
  test "$(echo "${BASH_VERSION%.*}" | tr -d ".")" -lt 51 && return
 | 
			
		||||
  bash_version_clean="$(echo "${BASH_VERSION%.*}" | tr -d ".")"
 | 
			
		||||
  if test "${bash_version_clean}" -lt 51; then
 | 
			
		||||
    unset bash_version_clean
 | 
			
		||||
    return
 | 
			
		||||
  fi
 | 
			
		||||
  unset bash_version_clean
 | 
			
		||||
 | 
			
		||||
  local termios cur_y
 | 
			
		||||
  ## Ask the terminal for any pending (line buffered) input.
 | 
			
		||||
  termios=$(stty -g) && stty -icanon && stty "$termios"
 | 
			
		||||
  termios="$(stty -g)" && stty -icanon && stty "${termios}"
 | 
			
		||||
  unset termios
 | 
			
		||||
  ## On pending input, assume it's been echoed and we're not in first column.
 | 
			
		||||
  ## Otherwise ask the terminal for current column and read it from input.
 | 
			
		||||
  if read -t 0 || {
 | 
			
		||||
    IFS='[;' read -s -r -d'R' -p$'\033[6n' _ _ cur_y && [[ $cur_y != 1 ]]
 | 
			
		||||
    IFS='[;' read -s -r -d'R' -p$'\033[6n' _ _ cur_y && [[ ${cur_y} != 1 ]]
 | 
			
		||||
  }
 | 
			
		||||
  then
 | 
			
		||||
    unset cur_y
 | 
			
		||||
    ## Print line ending char with reversed video and end with newline.
 | 
			
		||||
    if test "${color_prompt-}" = "yes"; then
 | 
			
		||||
      printf '%b' "\033[41m\033[0m\033[7m%\033[m\n\r"
 | 
			
		||||
@ -79,12 +86,13 @@ newline=$'\n'
 | 
			
		||||
if test "${color_prompt:-}" = "yes"; then
 | 
			
		||||
  # shellcheck disable=SC2154
 | 
			
		||||
  PS1="\$(_reset_line)\$(resize-terminal)\[\033[35m\][\[${reset_color}\]"
 | 
			
		||||
  PS1="${PS1}${debian_chroot:+($debian_chroot)}\[${usercolor}\]\u@\h "
 | 
			
		||||
  PS1="${PS1}${debian_chroot:+(${debian_chroot})}\[${usercolor}\]\u@\h "
 | 
			
		||||
  PS1="${PS1}\[${dircolor}\]\w\[${reset_color}\]\$(_git_prompt_info)"
 | 
			
		||||
  PS1="${PS1}\[\033[35m\]]\[${reset_color}\]${newline-}\$(_print_ec)"
 | 
			
		||||
  PS1="${PS1}${ps1_symbol} "
 | 
			
		||||
else
 | 
			
		||||
  PS1="\$(_reset_line)\$(resize-terminal)[${debian_chroot:+($debian_chroot)}"
 | 
			
		||||
  PS1="\$(_reset_line)\$(resize-terminal)"
 | 
			
		||||
  PS1="${PS1}[${debian_chroot:+(${debian_chroot})}"
 | 
			
		||||
  PS1="${PS1}\u@\h:\w\$(_git_prompt_info)]${newline-}\$(_print_ec)"
 | 
			
		||||
  PS1="${PS1}${ps1_symbol} "
 | 
			
		||||
fi
 | 
			
		||||
@ -92,8 +100,9 @@ fi
 | 
			
		||||
case "${TERM-}" in
 | 
			
		||||
  screen*|xterm*|rxvt*)
 | 
			
		||||
    ## Set window title
 | 
			
		||||
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
 | 
			
		||||
    PS1="\[\e]0;${debian_chroot:+(${debian_chroot})}\u@\h: \w\a\]${PS1}"
 | 
			
		||||
    ;;
 | 
			
		||||
  *) ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
case "${TERM-}" in
 | 
			
		||||
@ -113,13 +122,21 @@ fi
 | 
			
		||||
unset newline ps1_symbol
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ Plugins
 | 
			
		||||
! has zoxide || eval "$(zoxide init bash)"
 | 
			
		||||
! has gitlint || eval "$(_GITLINT_COMPLETE=bash_source gitlint)"
 | 
			
		||||
if has zoxide; then
 | 
			
		||||
  zoxide_bash_completion="$(zoxide init bash)"
 | 
			
		||||
  eval "${zoxide_bash_completion}"
 | 
			
		||||
  unset zoxide_bash_completion
 | 
			
		||||
fi
 | 
			
		||||
if has gitlint; then
 | 
			
		||||
  gitlint_bash_completion="$(_GITLINT_COMPLETE=bash_source gitlint)"
 | 
			
		||||
  eval "${gitlint_bash_completion}"
 | 
			
		||||
  unset gitlint_bash_completion
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
source_readable /usr/share/doc/fzf/examples/key-bindings.bash
 | 
			
		||||
source_readable /usr/share/doc/fzf/examples/completion.bash
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ End
 | 
			
		||||
## Source local bash configuration.
 | 
			
		||||
source_readable "$HOME/.bashrc.local"
 | 
			
		||||
source_readable "${HOME}/.bashrc.local"
 | 
			
		||||
## }}}
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@ if test -d "$1"; then
 | 
			
		||||
else
 | 
			
		||||
  case $1 in
 | 
			
		||||
    *.json) command -v jq >/dev/null && exec jq -C . "$1";;
 | 
			
		||||
    *) ;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -5,56 +5,61 @@
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
## Not so invasive because it only assigns a value if it is empty.
 | 
			
		||||
# shellcheck disable=SC2312
 | 
			
		||||
: "${HOME:=$(cd ~ && pwd)}"
 | 
			
		||||
# shellcheck disable=SC2312
 | 
			
		||||
: "${USER:=$(id -un || printf %s "${HOME##*/}")}"
 | 
			
		||||
: "${UID:=$(id -u || awk -F ":" -v user="$USER" '/^user:/{print $3}' \
 | 
			
		||||
# shellcheck disable=SC2312
 | 
			
		||||
: "${UID:=$(id -u || awk -F ":" -v user="${USER}" '/^user:/{print $3}' \
 | 
			
		||||
  /etc/passwd)}"
 | 
			
		||||
# shellcheck disable=SC2312
 | 
			
		||||
: "${HOSTNAME:=$(hostname)}"
 | 
			
		||||
export HOME USER UID HOSTNAME
 | 
			
		||||
 | 
			
		||||
## Set XDG_*_HOME variables.
 | 
			
		||||
XDG_CONFIG_HOME="$HOME/.config"
 | 
			
		||||
XDG_CACHE_HOME="$HOME/.cache"
 | 
			
		||||
XDG_DATA_HOME="$HOME/.local/share"
 | 
			
		||||
XDG_STATE_HOME="$HOME/.local/state"
 | 
			
		||||
XDG_CONFIG_HOME="${HOME}/.config"
 | 
			
		||||
XDG_CACHE_HOME="${HOME}/.cache"
 | 
			
		||||
XDG_DATA_HOME="${HOME}/.local/share"
 | 
			
		||||
XDG_STATE_HOME="${HOME}/.local/state"
 | 
			
		||||
export XDG_CONFIG_HOME XDG_CACHE_HOME XDG_DATA_HOME XDG_STATE_HOME
 | 
			
		||||
mkdir -p \
 | 
			
		||||
  "$XDG_CONFIG_HOME" "$XDG_CACHE_HOME" "$XDG_DATA_HOME" "$XDG_STATE_HOME"
 | 
			
		||||
mkdir -p "${XDG_CONFIG_HOME}" "${XDG_CACHE_HOME}" "${XDG_DATA_HOME}" \
 | 
			
		||||
  "${XDG_STATE_HOME}"
 | 
			
		||||
## Set XDG_*_DIR variables.
 | 
			
		||||
eval "$(grep "^[ ]*XDG_[A-Z].*_DIR=" "$XDG_CONFIG_HOME/user-dirs.dirs" |
 | 
			
		||||
        sed "s/^/export /")"
 | 
			
		||||
xdg_dirs="$(awk '/^[ ]*XDG_[A-Z]*_DIR=/{print "export " $1}' \
 | 
			
		||||
  "${XDG_CONFIG_HOME}/user-dirs.dirs")"
 | 
			
		||||
eval "${xdg_dirs}"
 | 
			
		||||
 | 
			
		||||
## Set directory to be used for coding.
 | 
			
		||||
CODEDIR="$HOME/src"
 | 
			
		||||
CODEDIR="${HOME}/src"
 | 
			
		||||
export CODEDIR
 | 
			
		||||
 | 
			
		||||
## Set shell configuration directories.
 | 
			
		||||
SHDIR="$XDG_CONFIG_HOME/sh"
 | 
			
		||||
BASHDIR="$XDG_CONFIG_HOME/bash"
 | 
			
		||||
ZDOTDIR="$XDG_CONFIG_HOME/zsh"
 | 
			
		||||
SHDIR="${XDG_CONFIG_HOME}/sh"
 | 
			
		||||
BASHDIR="${XDG_CONFIG_HOME}/bash"
 | 
			
		||||
ZDOTDIR="${XDG_CONFIG_HOME}/zsh"
 | 
			
		||||
export SHDIR BASHDIR ZDOTDIR
 | 
			
		||||
 | 
			
		||||
## Set general variables.
 | 
			
		||||
PATH="$HOME/bin:$HOME/.local/bin/$HOSTNAME:$HOME/.local/bin"
 | 
			
		||||
PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 | 
			
		||||
PATH="$PATH:/usr/local/games:/usr/games"
 | 
			
		||||
INFOPATH="$HOME/.local/share/info:/usr/local/share/info:/usr/local/info"
 | 
			
		||||
INFOPATH="$INFOPATH:/usr/share/info:/usr/info"
 | 
			
		||||
MANPATH="$HOME/.local/share/man:/usr/local/man:/usr/local/share/man"
 | 
			
		||||
MANPATH="$MANPATH:/usr/X11R6/man:/opt/man:/snap/man:/usr/man:/usr/share/man"
 | 
			
		||||
ENV="$SHDIR/shrc"
 | 
			
		||||
BASH_ENV="$BASHDIR/bash_env"
 | 
			
		||||
PATH="${HOME}/bin:${HOME}/.local/bin/${HOSTNAME}:${HOME}/.local/bin"
 | 
			
		||||
PATH="${PATH}:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 | 
			
		||||
PATH="${PATH}:/usr/local/games:/usr/games"
 | 
			
		||||
INFOPATH="${HOME}/.local/share/info:/usr/local/share/info:/usr/local/info"
 | 
			
		||||
INFOPATH="${INFOPATH}:/usr/share/info:/usr/info"
 | 
			
		||||
MANPATH="${HOME}/.local/share/man:/usr/local/man:/usr/local/share/man"
 | 
			
		||||
MANPATH="${MANPATH}:/usr/X11R6/man:/opt/man:/snap/man:/usr/man:/usr/share/man"
 | 
			
		||||
ENV="${SHDIR}/shrc"
 | 
			
		||||
BASH_ENV="${BASHDIR}/bash_env"
 | 
			
		||||
TMPDIR="/tmp"
 | 
			
		||||
LANG="en_US.UTF-8"
 | 
			
		||||
LANGUAGE="${LANG%.*}"
 | 
			
		||||
LC_ALL="$LANG"
 | 
			
		||||
GNUPGHOME="$HOME/.gnupg"
 | 
			
		||||
LC_ALL="${LANG}"
 | 
			
		||||
GNUPGHOME="${HOME}/.gnupg"
 | 
			
		||||
export PATH INFOPATH MANPATH ENV TMPDIR LANG LANGUAGE LC_ALL GNUPGHOME
 | 
			
		||||
 | 
			
		||||
## Set interactive shell variables.
 | 
			
		||||
HISTSIZE=10000
 | 
			
		||||
EDITOR="$(has -s vim vim.tiny vi)"
 | 
			
		||||
test -n "$EDITOR" && VISUAL="$EDITOR"
 | 
			
		||||
test -n "${EDITOR}" && VISUAL="${EDITOR}"
 | 
			
		||||
TERMINAL="x-terminal-emulator"
 | 
			
		||||
BROWSER="chromium"
 | 
			
		||||
PAGER="less"
 | 
			
		||||
@ -82,18 +87,18 @@ export FZF_DEFAULT_COMMAND FZF_DEFAULT_OPTS FZF_TMUX
 | 
			
		||||
 | 
			
		||||
## 'vim.tiny' and 'vi' fails if VIMINIT is set to our vimrc.
 | 
			
		||||
if has vim; then
 | 
			
		||||
  if test -f "$XDG_CONFIG_HOME/vim/vimrc"; then
 | 
			
		||||
  if test -f "${XDG_CONFIG_HOME}/vim/vimrc"; then
 | 
			
		||||
    # shellcheck disable=SC2016,SC2089
 | 
			
		||||
    VIMINIT='let $MYVIMRC="$XDG_CONFIG_HOME/vim/vimrc" | so $MYVIMRC'
 | 
			
		||||
    VIMINIT='let $MYVIMRC="${XDG_CONFIG_HOME}/vim/vimrc" | so $MYVIMRC'
 | 
			
		||||
    # shellcheck disable=SC2090
 | 
			
		||||
    export VIMINIT
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
## XDG_CONFIG_HOME: user-specific configuration files
 | 
			
		||||
GTK2_RC_FILES="$XDG_CONFIG_HOME/gtk-2.0/gtkrc-2.0"
 | 
			
		||||
KDEHOME="$XDG_CONFIG_HOME/kde"
 | 
			
		||||
INPUTRC="$BASHDIR/inputrc"
 | 
			
		||||
GTK2_RC_FILES="${XDG_CONFIG_HOME}/gtk-2.0/gtkrc-2.0"
 | 
			
		||||
KDEHOME="${XDG_CONFIG_HOME}/kde"
 | 
			
		||||
INPUTRC="${BASHDIR}/inputrc"
 | 
			
		||||
if has less; then
 | 
			
		||||
  lesskey_src=0
 | 
			
		||||
  less_version="$(less -V | awk -F '[ .]' 'NR==1 {print $2}')"
 | 
			
		||||
@ -102,54 +107,56 @@ if has less; then
 | 
			
		||||
    *) if test "${less_version}" -ge 582; then lesskey_src=1; fi;;
 | 
			
		||||
  esac
 | 
			
		||||
  if test "${lesskey_src}" = "1"; then
 | 
			
		||||
    LESSKEY="$XDG_CONFIG_HOME/less/lesskey"
 | 
			
		||||
    LESSKEY="${XDG_CONFIG_HOME}/less/lesskey"
 | 
			
		||||
  elif has lesskey; then
 | 
			
		||||
    LESSKEY="$XDG_CONFIG_HOME/less/lesskey-old"
 | 
			
		||||
    lesskey -o "$LESSKEY" "$XDG_CONFIG_HOME/less/lesskey"
 | 
			
		||||
    LESSKEY="${XDG_CONFIG_HOME}/less/lesskey-old"
 | 
			
		||||
    lesskey -o "${LESSKEY}" "${XDG_CONFIG_HOME}/less/lesskey"
 | 
			
		||||
  fi
 | 
			
		||||
  unset lesskey_src less_version
 | 
			
		||||
fi
 | 
			
		||||
export GTK2_RC_FILES KDEHOME INPUTRC LESSKEY
 | 
			
		||||
 | 
			
		||||
## XDG_DATA_HOME: user-specific data files
 | 
			
		||||
RUSTUP_HOME="$XDG_DATA_HOME/rustup"
 | 
			
		||||
CARGO_HOME="$XDG_DATA_HOME/cargo"
 | 
			
		||||
GOPATH="$XDG_DATA_HOME/go"
 | 
			
		||||
WORKON_HOME="$XDG_DATA_HOME/virtualenvs"
 | 
			
		||||
ELECTRUMDIR="$XDG_DATA_HOME/electrum"
 | 
			
		||||
TERMINFO="$XDG_DATA_HOME/terminfo"
 | 
			
		||||
RUSTUP_HOME="${XDG_DATA_HOME}/rustup"
 | 
			
		||||
CARGO_HOME="${XDG_DATA_HOME}/cargo"
 | 
			
		||||
GOPATH="${XDG_DATA_HOME}/go"
 | 
			
		||||
WORKON_HOME="${XDG_DATA_HOME}/virtualenvs"
 | 
			
		||||
ELECTRUMDIR="${XDG_DATA_HOME}/electrum"
 | 
			
		||||
TERMINFO="${XDG_DATA_HOME}/terminfo"
 | 
			
		||||
export RUSTUP_HOME CARGO_HOME GOPATH WORKON_HOME ELECTRUMDIR TERMINFO
 | 
			
		||||
 | 
			
		||||
## XDG_STATE_HOME: user-specific state files, persists application restarts
 | 
			
		||||
LESSHISTFILE="$XDG_STATE_HOME/history-less"
 | 
			
		||||
HISTFILE="$XDG_STATE_HOME/history-shell"
 | 
			
		||||
LESSHISTFILE="${XDG_STATE_HOME}/history-less"
 | 
			
		||||
HISTFILE="${XDG_STATE_HOME}/history-shell"
 | 
			
		||||
export LESSHISTFILE HISTFILE
 | 
			
		||||
 | 
			
		||||
## XDG_CACHE_HOME: user-specific non-essential data files
 | 
			
		||||
GOCACHE="$XDG_CACHE_HOME/go-build"
 | 
			
		||||
GOMODCACHE="$XDG_CACHE_HOME/go/mod"
 | 
			
		||||
GOCACHE="${XDG_CACHE_HOME}/go-build"
 | 
			
		||||
GOMODCACHE="${XDG_CACHE_HOME}/go/mod"
 | 
			
		||||
export GOCACHE GOMODCACHE
 | 
			
		||||
 | 
			
		||||
## Start agents
 | 
			
		||||
ssh_agent_dir="$TMPDIR/ssh-agent-$USER"
 | 
			
		||||
ssh_agent_sock="$ssh_agent_dir/agent.sock"
 | 
			
		||||
ssh_agent_pid="$ssh_agent_dir/agent.pid"
 | 
			
		||||
ssh_agent_dir="${TMPDIR}/ssh-agent-${USER}"
 | 
			
		||||
ssh_agent_sock="${ssh_agent_dir}/agent.sock"
 | 
			
		||||
ssh_agent_pid="${ssh_agent_dir}/agent.pid"
 | 
			
		||||
if test -z "${SSH_AUTH_SOCK-}" && has ssh-agent; then
 | 
			
		||||
  test -d "$ssh_agent_dir" || mkdir -p "$ssh_agent_dir"
 | 
			
		||||
  if test -S "$ssh_agent_sock" &&
 | 
			
		||||
    test -r "$ssh_agent_sock" &&
 | 
			
		||||
    test -w "$ssh_agent_sock" &&
 | 
			
		||||
    test -f "$ssh_agent_pid" &&
 | 
			
		||||
    test -r "$ssh_agent_pid" &&
 | 
			
		||||
    test -s "$ssh_agent_pid"
 | 
			
		||||
  test -d "${ssh_agent_dir}" || mkdir -p "${ssh_agent_dir}"
 | 
			
		||||
  if test -S "${ssh_agent_sock}" &&
 | 
			
		||||
    test -r "${ssh_agent_sock}" &&
 | 
			
		||||
    test -w "${ssh_agent_sock}" &&
 | 
			
		||||
    test -f "${ssh_agent_pid}" &&
 | 
			
		||||
    test -r "${ssh_agent_pid}" &&
 | 
			
		||||
    test -s "${ssh_agent_pid}"
 | 
			
		||||
  then
 | 
			
		||||
    SSH_AUTH_SOCK="$ssh_agent_sock"
 | 
			
		||||
    read -r SSH_AGENT_PID < "$ssh_agent_pid"
 | 
			
		||||
    SSH_AUTH_SOCK="${ssh_agent_sock}"
 | 
			
		||||
    read -r SSH_AGENT_PID < "${ssh_agent_pid}"
 | 
			
		||||
    export SSH_AUTH_SOCK SSH_AGENT_PID
 | 
			
		||||
  else
 | 
			
		||||
    rm -f "$ssh_agent_sock" "$ssh_agent_pid"
 | 
			
		||||
    eval "$(ssh-agent -s -a "$ssh_agent_sock")" >/dev/null
 | 
			
		||||
    echo "$SSH_AGENT_PID" | tee "$ssh_agent_pid" >/dev/null
 | 
			
		||||
    rm -f "${ssh_agent_sock}" "${ssh_agent_pid}"
 | 
			
		||||
    ssh_agent_env="$(ssh-agent -s -a "${ssh_agent_sock}")"
 | 
			
		||||
    eval "${ssh_agent_env}" >/dev/null
 | 
			
		||||
    unset ssh_agent_env
 | 
			
		||||
    echo "${SSH_AGENT_PID}" | tee "${ssh_agent_pid}" >/dev/null
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
unset ssh_agent_dir ssh_agent_sock ssh_agent_pid
 | 
			
		||||
@ -159,11 +166,11 @@ unset ssh_agent_dir ssh_agent_sock ssh_agent_pid
 | 
			
		||||
if test -n "${ZSH_VERSION:-}"; then
 | 
			
		||||
  setopt no_nomatch
 | 
			
		||||
fi
 | 
			
		||||
for f in "$XDG_CONFIG_HOME/sh/profile.d"/*.sh; do
 | 
			
		||||
for f in "${XDG_CONFIG_HOME}/sh/profile.d"/*.sh; do
 | 
			
		||||
  # shellcheck disable=SC1090,SC1091
 | 
			
		||||
  ! test -r "$f" || . "$f"
 | 
			
		||||
  ! test -r "${f}" || . "${f}"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
## Source local profile.
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
! test -r "$HOME/.profile.local" || . "$HOME/.profile.local"
 | 
			
		||||
! test -r "${HOME}/.profile.local" || . "${HOME}/.profile.local"
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ esac
 | 
			
		||||
 | 
			
		||||
## Source profile.
 | 
			
		||||
# shellcheck disable=SC1091
 | 
			
		||||
. "$HOME/.profile"
 | 
			
		||||
. "${HOME}/.profile"
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ Options
 | 
			
		||||
stty -ixon
 | 
			
		||||
@ -27,7 +27,7 @@ stty werase undef
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ Alias
 | 
			
		||||
## Standard commands.
 | 
			
		||||
test -n "$VISUAL" && alias vi='$VISUAL'
 | 
			
		||||
test -n "${VISUAL-}" && alias vi='${VISUAL}'
 | 
			
		||||
alias du="du -h"
 | 
			
		||||
alias df="df -h"
 | 
			
		||||
alias cp="cp -i"
 | 
			
		||||
@ -35,8 +35,8 @@ alias mv="mv -i"
 | 
			
		||||
alias ls="ls -hF --group-directories-first --color=auto"
 | 
			
		||||
if has lsblk; then
 | 
			
		||||
  _lsblk_options="NAME,FSTYPE,LABEL,SIZE,FSAVAIL,FSUSE%,MOUNTPOINT"
 | 
			
		||||
  alias lsblk='lsblk -o $_lsblk_options'
 | 
			
		||||
  alias lsblku='lsblk -o $_lsblk_options,UUID,PARTUUID'
 | 
			
		||||
  alias lsblk='lsblk -o ${_lsblk_options}'
 | 
			
		||||
  alias lsblku='lsblk -o ${_lsblk_options},UUID,PARTUUID'
 | 
			
		||||
fi
 | 
			
		||||
if ! grep --color 2>&1 | grep -qE "(unrecognized|unknown) option" &&
 | 
			
		||||
  ! grep --exclude 2>&1 | grep -qE "(unrecognized|unknown) option"
 | 
			
		||||
@ -53,23 +53,34 @@ has highlight && alias highlight="highlight --out-format=ansi"
 | 
			
		||||
has pygmentize && alias pygmentize="pygmentize -f terminal"
 | 
			
		||||
 | 
			
		||||
## Helpers.
 | 
			
		||||
alias reload='. $ENV' r="reload"
 | 
			
		||||
alias reload-xprofile='. $XDG_CONFIG_HOME/x11/xprofile' rx="reload-xprofile"
 | 
			
		||||
alias reload='. ${ENV}' r="reload"
 | 
			
		||||
if test -f "${XDG_CONFIG_HOME:-${HOME}/.config}/x11/xprofile"; then
 | 
			
		||||
  alias reload-xprofile='. ${XDG_CONFIG_HOME:-${HOME}/.config}/x11/xprofile'
 | 
			
		||||
  alias rx="reload-xprofile"
 | 
			
		||||
fi
 | 
			
		||||
cd_up(){
 | 
			
		||||
  # SPDX-FileCopyrightText: 2014 Grigory K <https://stackoverflow.com/users/2937875/grigory-k>
 | 
			
		||||
  # SPDX-License-Identifier: CC-BY-SA-3.0
 | 
			
		||||
  # Credits: https://stackoverflow.com/a/26134858
 | 
			
		||||
  case "${1-}" in
 | 
			
		||||
    [1-9]) cd "$(printf "%0.0s../" $(seq 1 "$1"))" || return;;
 | 
			
		||||
    "") cd .. || return;;
 | 
			
		||||
    *) cd "$(pwd | sed -r "s|(.*/$1[^/]*/).*|\1|")" || return
 | 
			
		||||
    [1-9])
 | 
			
		||||
      has seq || return
 | 
			
		||||
      # shellcheck disable=SC2312
 | 
			
		||||
      cd "$(printf "%0.0s../" $(seq 1 "${1}"))" || return
 | 
			
		||||
      ;;
 | 
			
		||||
    "")
 | 
			
		||||
      cd .. || return;;
 | 
			
		||||
    *)
 | 
			
		||||
      # shellcheck disable=SC2312
 | 
			
		||||
      cd "$(pwd | sed -r "s|(.*/${1}[^/]*/).*|\1|")" || return
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
alias up="cd_up"
 | 
			
		||||
## POSIX cd does not allow '--' and other shells breaks when not using it.
 | 
			
		||||
alias -- -="cd -" 2>/dev/null || true
 | 
			
		||||
test -n "$EDITOR" && alias e='$EDITOR'
 | 
			
		||||
test -n "$VISUAL" && alias v='$VISUAL'
 | 
			
		||||
test -n "${EDITOR-}" && alias e='${EDITOR}'
 | 
			
		||||
test -n "${VISUAL-}" && alias v='${VISUAL}'
 | 
			
		||||
alias j="jobs"
 | 
			
		||||
alias h="history"
 | 
			
		||||
alias l="ls -CF"
 | 
			
		||||
@ -114,7 +125,7 @@ has tmux && {
 | 
			
		||||
  tcla(){
 | 
			
		||||
    ## Clear all the panes of the current session.
 | 
			
		||||
    for _t_pane in $(tmux list-panes -s -F '#{pane_id}'); do
 | 
			
		||||
      tmux clear-history -t "$_t_pane"
 | 
			
		||||
      tmux clear-history -t "${_t_pane}"
 | 
			
		||||
    done
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@ -136,7 +147,7 @@ then
 | 
			
		||||
  g_alias="$(git config --get-regexp 'alias.*' | sed 's/^alias\.//;s/ .*//')"
 | 
			
		||||
  for key in $(printf '%s\n' "${g_alias}"); do
 | 
			
		||||
    # shellcheck disable=SC2139,SC2140
 | 
			
		||||
    alias "g$key"="git $key"
 | 
			
		||||
    alias "g${key}"="git ${key}"
 | 
			
		||||
  done
 | 
			
		||||
  unset g_alias
 | 
			
		||||
fi
 | 
			
		||||
@ -164,16 +175,20 @@ esac
 | 
			
		||||
if test "${color_prompt-}" = "yes"; then
 | 
			
		||||
  if has dircolors; then
 | 
			
		||||
    ## Use dircolors if available.
 | 
			
		||||
    if test -r "$XDG_CONFIG_HOME/dircolors/dircolors"; then
 | 
			
		||||
      eval "$(dircolors -b "$XDG_CONFIG_HOME/dircolors/dircolors")"
 | 
			
		||||
    if test -r "${XDG_CONFIG_HOME}/dircolors/dircolors"; then
 | 
			
		||||
      dircolors="$(dircolors -b "${XDG_CONFIG_HOME}/dircolors/dircolors")"
 | 
			
		||||
      eval "${dircolors}"
 | 
			
		||||
    else
 | 
			
		||||
      eval "$(dircolors -b)"
 | 
			
		||||
      dircolors="$(dircolors -b)"
 | 
			
		||||
      eval "${dircolors}"
 | 
			
		||||
    fi
 | 
			
		||||
    unset dircolors
 | 
			
		||||
    ## Fix bold on some terminals.
 | 
			
		||||
    case "${TERM-}" in
 | 
			
		||||
      xterm*|screen*)
 | 
			
		||||
        LS_COLORS="$(echo "$LS_COLORS" | sed -e 's/01;3/00;9/g')"
 | 
			
		||||
        LS_COLORS="$(echo "${LS_COLORS}" | sed -e 's/01;3/00;9/g')"
 | 
			
		||||
        ;;
 | 
			
		||||
      *) ;;
 | 
			
		||||
    esac
 | 
			
		||||
    export LS_COLORS
 | 
			
		||||
  else
 | 
			
		||||
@ -232,16 +247,16 @@ _git_prompt_info(){
 | 
			
		||||
  esac
 | 
			
		||||
  if test -n "${ZSH_VERSION-}"; then
 | 
			
		||||
    # shellcheck disable=2016
 | 
			
		||||
    if test "$color_prompt" = "yes"; then
 | 
			
		||||
      print -Pn '(%%{$branchcolor%%}%20>...>$ref%<<%%{\e[00m%%})'
 | 
			
		||||
    if test "${color_prompt}" = "yes"; then
 | 
			
		||||
      print -Pn '(%%{${branchcolor}%%}%20>...>${ref}%<<%%{\e[00m%%})'
 | 
			
		||||
    else
 | 
			
		||||
      print -Pn '(%20>...>$ref%<<)'
 | 
			
		||||
      print -Pn '(%20>...>${ref}%<<)'
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
    if test "$color_prompt" = "yes"; then
 | 
			
		||||
      printf '%s' "($branchcolor$ref$reset_color)"
 | 
			
		||||
    if test "${color_prompt}" = "yes"; then
 | 
			
		||||
      printf '%s' "(${branchcolor}${ref}${reset_color})"
 | 
			
		||||
    else
 | 
			
		||||
      printf '%s' "($ref)"
 | 
			
		||||
      printf '%s' "(${ref})"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  unset ref
 | 
			
		||||
@ -273,17 +288,20 @@ case "${ZSH_VERSION-}" in
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2034
 | 
			
		||||
if test "$(id -u)" = "0"; then
 | 
			
		||||
uid="$(id -u)"
 | 
			
		||||
if test "${uid}" = "0"; then
 | 
			
		||||
  usercolor="$(printf '%b' "\e[00;97m")"
 | 
			
		||||
  ps1_symbol="#"
 | 
			
		||||
fi
 | 
			
		||||
unset uid
 | 
			
		||||
 | 
			
		||||
## Do not colorize this prompt, Sh fails to count the correct number of
 | 
			
		||||
## characters on the prompt leading to problems.
 | 
			
		||||
user="$(id -un)"
 | 
			
		||||
if test "${color_prompt-}" = "yes"; then
 | 
			
		||||
  PS1="[${usercolor}$(id -un) $(hostname -s)${reset_color}]${ps1_symbol} "
 | 
			
		||||
  PS1="[${usercolor}${user} $(hostname -s)${reset_color}]${ps1_symbol} "
 | 
			
		||||
else
 | 
			
		||||
  PS1="$(id -un)@$(hostname -s)${ps1_symbol} "
 | 
			
		||||
  PS1="${user}@$(hostname -s)${ps1_symbol} "
 | 
			
		||||
fi
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ External Functions
 | 
			
		||||
@ -291,7 +309,7 @@ fi
 | 
			
		||||
## Source file if it is readable.
 | 
			
		||||
## Usage: source_readable FILE
 | 
			
		||||
source_readable(){
 | 
			
		||||
  for _file in "$@"; do
 | 
			
		||||
  for _file in "${@}"; do
 | 
			
		||||
    # shellcheck disable=SC1090
 | 
			
		||||
    ! test -r "${_file}" || . "${_file}"
 | 
			
		||||
  done
 | 
			
		||||
@ -301,23 +319,23 @@ _fzf_comprun() {
 | 
			
		||||
  _fzf_command="$1"
 | 
			
		||||
  shift
 | 
			
		||||
 | 
			
		||||
  case "$_fzf_command" in
 | 
			
		||||
  case "${_fzf_command}" in
 | 
			
		||||
    cd) if has tree; then
 | 
			
		||||
          fzf --preview 'tree -C {} | head -200' "$@"
 | 
			
		||||
          fzf --preview 'tree -C {} | head -200' "${@}"
 | 
			
		||||
        else
 | 
			
		||||
          fzf "$@"
 | 
			
		||||
          fzf "${@}"
 | 
			
		||||
        fi
 | 
			
		||||
        ;;
 | 
			
		||||
    export|unset)
 | 
			
		||||
      fzf --preview "eval 'echo \$'{}" "$@"
 | 
			
		||||
      fzf --preview "eval 'echo \$'{}" "${@}"
 | 
			
		||||
      ;;
 | 
			
		||||
    ssh)
 | 
			
		||||
      if has dig; then
 | 
			
		||||
        fzf --preview 'dig {}' "$@"
 | 
			
		||||
        fzf --preview 'dig {}' "${@}"
 | 
			
		||||
      fi
 | 
			
		||||
      ;;
 | 
			
		||||
    *)
 | 
			
		||||
      fzf --preview 'test -d {} || cat {}' "$@"
 | 
			
		||||
      fzf --preview 'test -d {} || cat {}' "${@}"
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
@ -325,5 +343,5 @@ _fzf_comprun() {
 | 
			
		||||
## }}}
 | 
			
		||||
## {{{ End
 | 
			
		||||
## Source local shell configuration file.
 | 
			
		||||
source_readable "$HOME/.shrc.local"
 | 
			
		||||
source_readable "${HOME}/.shrc.local"
 | 
			
		||||
## }}}
 | 
			
		||||
 | 
			
		||||
@ -11,14 +11,14 @@ set -eu
 | 
			
		||||
test -n "${1-}" || exit 1
 | 
			
		||||
 | 
			
		||||
prg="$1"
 | 
			
		||||
if ! test -e "$prg"; then
 | 
			
		||||
  case "$prg" in
 | 
			
		||||
if ! test -e "${prg}"; then
 | 
			
		||||
  case "${prg}" in
 | 
			
		||||
    (*/*) exit 1;;
 | 
			
		||||
    (*) prg=$(command -v -- "$prg") || exit 1;;
 | 
			
		||||
    (*) prg=$(command -v -- "${prg}") || exit 1;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
dir="$(cd -P -- "$(dirname -- "$prg")" && pwd -P)" || exit 1
 | 
			
		||||
prg="$dir/$(basename -- "$prg")" || exit 1
 | 
			
		||||
printf '%s\n' "$dir"
 | 
			
		||||
dir="$(cd -P -- "$(dirname -- "${prg}")" && pwd -P)" || exit 1
 | 
			
		||||
prg="${dir}/$(basename -- "${prg}")" || exit 1
 | 
			
		||||
printf '%s\n' "${dir}"
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
 | 
			
		||||
@ -33,15 +33,15 @@ if test -z "${1-}"; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
vi_cmd="$(has -s vim vi)"
 | 
			
		||||
if test -z "$vi_cmd"; then
 | 
			
		||||
if test -z "${vi_cmd}"; then
 | 
			
		||||
  printf '%s\n' "Please install 'vi(m)'."
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
for f in "${@}"; do
 | 
			
		||||
  cp "$f" "$f.asc"
 | 
			
		||||
  "$vi_cmd" -u NONE \
 | 
			
		||||
  cp "${f}" "${f}.asc"
 | 
			
		||||
  "${vi_cmd}" -u NONE \
 | 
			
		||||
    -c 'set nomodeline' -c 'norm gg}j' \
 | 
			
		||||
    -c '.,$!gpg -a --clear-sign' \
 | 
			
		||||
    -c 'wq' -- "$f.asc"
 | 
			
		||||
    -c 'wq' -- "${f}.asc"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
@ -20,6 +20,8 @@ action=""
 | 
			
		||||
test -n "${1-}" || exit 1
 | 
			
		||||
case "$1" in
 | 
			
		||||
  -s) action=show; shift; test -n "${1-}" || exit 1;;
 | 
			
		||||
  "") echo "Argument required" >&2; exit 1;;
 | 
			
		||||
  *) ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
for prog in "${@}"; do
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,13 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
## SPDX-FileCopyrightText: 2023 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
 | 
			
		||||
##
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
## Check if we are root, fail otherwise.
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
test "$(id -u)" -eq 0 && exit 0
 | 
			
		||||
uid="$(id -u)"
 | 
			
		||||
test "${uid}" -eq 0 && exit 0
 | 
			
		||||
printf '%s\n' "Permission denied, action requires privileges."
 | 
			
		||||
exit 1
 | 
			
		||||
 | 
			
		||||
@ -45,7 +45,8 @@ fi
 | 
			
		||||
if ! echo R | read -r -t 1 -sd R 2>/dev/null; then
 | 
			
		||||
  ## Fast but depends on XTerm.
 | 
			
		||||
  if has resize; then
 | 
			
		||||
    eval "$(resize)" >/dev/null
 | 
			
		||||
    resize_cmd="$(resize)"
 | 
			
		||||
    eval "${resize_cmd}" >/dev/null
 | 
			
		||||
    exit
 | 
			
		||||
  fi
 | 
			
		||||
  ## Slow due to heavy stty calls.
 | 
			
		||||
@ -53,7 +54,7 @@ if ! echo R | read -r -t 1 -sd R 2>/dev/null; then
 | 
			
		||||
  stty raw -echo min 0 time 1
 | 
			
		||||
  printf '\0337\033[r\033[99999;99999H\033[6n\0338' >/dev/tty
 | 
			
		||||
  IFS='[;R' read -r _ rows cols _ </dev/tty
 | 
			
		||||
  stty "$termios" cols "$cols" rows "$rows"
 | 
			
		||||
  stty "${termios}" cols "${cols}" rows "${rows}"
 | 
			
		||||
  unset termios
 | 
			
		||||
  exit
 | 
			
		||||
fi
 | 
			
		||||
@ -69,7 +70,7 @@ IFS='[;R' read -r -t 1 -s -d R _ rows cols _ </dev/tty || {
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if test ${COLUMNS} -eq "${cols}" && test ${LINES} -eq "${rows}";then
 | 
			
		||||
if test "${COLUMNS}" = "${cols}" && test "${LINES}" = "${rows}";then
 | 
			
		||||
  stty echo
 | 
			
		||||
  unset rows cols
 | 
			
		||||
  exit
 | 
			
		||||
 | 
			
		||||
@ -8,7 +8,7 @@ set -eu
 | 
			
		||||
 | 
			
		||||
command -v tmux >/dev/null || exit 1
 | 
			
		||||
: "${TMUX:=}"
 | 
			
		||||
ta_session="${1:-}"
 | 
			
		||||
session="${1:-}"
 | 
			
		||||
 | 
			
		||||
## Attach to session if it exists or not and from inside tmux or not.
 | 
			
		||||
## If name is supplied and doesn't exist, create session with given name.
 | 
			
		||||
@ -16,120 +16,120 @@ ta_session="${1:-}"
 | 
			
		||||
## else ask for the user to choose the wanted session.
 | 
			
		||||
## usage: ta SESSION ARGS
 | 
			
		||||
## example: ta dotfiles -d
 | 
			
		||||
ta_new(){
 | 
			
		||||
new(){
 | 
			
		||||
  ## Session name was not specified.
 | 
			
		||||
  ta_list="$(tmux list-sessions 2>/dev/null)"
 | 
			
		||||
  list="$(tmux list-sessions 2>/dev/null)"
 | 
			
		||||
 | 
			
		||||
  printf "Choose session or create one by providing a new name:\n"
 | 
			
		||||
  if test -n "$ta_list"; then
 | 
			
		||||
    printf %s"\n${ta_list}\n"
 | 
			
		||||
  if test -n "${list}"; then
 | 
			
		||||
    printf %s"\n${list}\n"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  printf "\nEnter session name: "
 | 
			
		||||
  read -r ta_name
 | 
			
		||||
  read -r name
 | 
			
		||||
 | 
			
		||||
  if test -z "$ta_name"; then
 | 
			
		||||
  if test -z "${name}"; then
 | 
			
		||||
    printf "Name cannot be empty.\n"
 | 
			
		||||
    return 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main(){
 | 
			
		||||
  if test -n "$TMUX"; then
 | 
			
		||||
  if test -n "${TMUX}"; then
 | 
			
		||||
    ## Inside tmux.
 | 
			
		||||
    if test "$ta_session" && tmux has-session -t "$ta_session" >/dev/null 2>&1
 | 
			
		||||
    if test "${session}" && tmux has-session -t "${session}" >/dev/null 2>&1
 | 
			
		||||
    then
 | 
			
		||||
      ## Session name was specified and it exists.
 | 
			
		||||
      tmux switch-client -t "$ta_session"
 | 
			
		||||
      tmux display-message "Switched to session $ta_session"
 | 
			
		||||
      tmux switch-client -t "${session}"
 | 
			
		||||
      tmux display-message "Switched to session ${session}"
 | 
			
		||||
 | 
			
		||||
    elif test -n "$ta_session"; then
 | 
			
		||||
    elif test -n "${session}"; then
 | 
			
		||||
      ## Session name was specified but it doesn't exist.
 | 
			
		||||
      tmux new-session -d -s "$ta_session"
 | 
			
		||||
      tmux switch-client -t "$ta_session"
 | 
			
		||||
      tmux display-message "Created and switched to session $ta_session"
 | 
			
		||||
      tmux new-session -d -s "${session}"
 | 
			
		||||
      tmux switch-client -t "${session}"
 | 
			
		||||
      tmux display-message "Created and switched to session ${session}"
 | 
			
		||||
 | 
			
		||||
    else
 | 
			
		||||
 | 
			
		||||
      ## Session name was not specified.
 | 
			
		||||
      ta_last="$(tmux display-message -p "#{client_last_session}")"
 | 
			
		||||
      if test -n "$ta_last" && tmux has-session -t "$ta_last"; then
 | 
			
		||||
      last="$(tmux display-message -p "#{client_last_session}")"
 | 
			
		||||
      if test -n "${last}" && tmux has-session -t "${last}"; then
 | 
			
		||||
        ## If tmux has a last session, use it.
 | 
			
		||||
        tmux switch-client -t "$ta_last"
 | 
			
		||||
        tmux display-message "Switched to session $ta_last"
 | 
			
		||||
        tmux switch-client -t "${last}"
 | 
			
		||||
        tmux display-message "Switched to session ${last}"
 | 
			
		||||
 | 
			
		||||
      else
 | 
			
		||||
 | 
			
		||||
        ## No last session, choose one or create one.
 | 
			
		||||
        printf "Last session not found.\n"
 | 
			
		||||
        ta_new || return 1
 | 
			
		||||
        new
 | 
			
		||||
 | 
			
		||||
        if tmux has-session -t "$ta_name" 2>/dev/null; then
 | 
			
		||||
        if tmux has-session -t "${name}" 2>/dev/null; then
 | 
			
		||||
          ## Chosen session exists.
 | 
			
		||||
          tmux switch-client -t "$ta_name"
 | 
			
		||||
          tmux display-message "Switched to session $ta_name"
 | 
			
		||||
          tmux switch-client -t "${name}"
 | 
			
		||||
          tmux display-message "Switched to session ${name}"
 | 
			
		||||
 | 
			
		||||
        else
 | 
			
		||||
          ## Chosen session doesn't exist.
 | 
			
		||||
          tmux new-session -d -s "$ta_name"
 | 
			
		||||
          tmux switch-client -t "$ta_name"
 | 
			
		||||
          tmux display-message "Created and switched to session $ta_name"
 | 
			
		||||
          tmux new-session -d -s "${name}"
 | 
			
		||||
          tmux switch-client -t "${name}"
 | 
			
		||||
          tmux display-message "Created and switched to session ${name}"
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  else
 | 
			
		||||
 | 
			
		||||
    ## Outside of tmux.
 | 
			
		||||
    if test -n "$ta_session" && ! tmux list-sessions >/dev/null 2>&1; then
 | 
			
		||||
    if test -n "${session}" && ! tmux list-sessions >/dev/null 2>&1; then
 | 
			
		||||
      ## Session name was specified but server is not running.
 | 
			
		||||
      tmux new-session -s "$ta_session"
 | 
			
		||||
      tmux display-message "Created session $ta_session"
 | 
			
		||||
      tmux new-session -s "${session}"
 | 
			
		||||
      tmux display-message "Created session ${session}"
 | 
			
		||||
      return 0
 | 
			
		||||
 | 
			
		||||
    elif ! tmux list-sessions >/dev/null 2>&1; then
 | 
			
		||||
      ## Server is not running.
 | 
			
		||||
      ta_new || return 1
 | 
			
		||||
      tmux new-session -s "$ta_name"
 | 
			
		||||
      tmux display-message "Created session $ta_name"
 | 
			
		||||
      new
 | 
			
		||||
      tmux new-session -s "${name}"
 | 
			
		||||
      tmux display-message "Created session ${name}"
 | 
			
		||||
      return 0
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if test "$ta_session" && tmux has-session -t "$ta_session" >/dev/null 2>&1
 | 
			
		||||
    if test "${session}" && tmux has-session -t "${session}" >/dev/null 2>&1
 | 
			
		||||
    then
 | 
			
		||||
      ## Session name was specified and it exists.
 | 
			
		||||
      tmux attach-session -t "$ta_session"
 | 
			
		||||
      tmux display-message "Attached to session $ta_session"
 | 
			
		||||
      tmux attach-session -t "${session}"
 | 
			
		||||
      tmux display-message "Attached to session ${session}"
 | 
			
		||||
 | 
			
		||||
    elif test -n "$ta_session"; then
 | 
			
		||||
    elif test -n "${session}"; then
 | 
			
		||||
      ## Session name was specified but it doesn't exist.
 | 
			
		||||
      tmux new-session -s "$ta_session"
 | 
			
		||||
      tmux display-message "Created new session $ta_session"
 | 
			
		||||
      tmux new-session -s "${session}"
 | 
			
		||||
      tmux display-message "Created new session ${session}"
 | 
			
		||||
 | 
			
		||||
    else
 | 
			
		||||
      ## Session name was not specified.
 | 
			
		||||
      ta_last="$(tmux display-message -p "#{session_name}")"
 | 
			
		||||
      last="$(tmux display-message -p "#{session_name}")"
 | 
			
		||||
 | 
			
		||||
      if test -n "$ta_last" && tmux has-session -t "$ta_last"; then
 | 
			
		||||
      if test -n "${last}" && tmux has-session -t "${last}"; then
 | 
			
		||||
        ## If tmux has a session name, use it.
 | 
			
		||||
        tmux attach-session -t "$ta_last"
 | 
			
		||||
        tmux display-message "Attached to session $ta_last"
 | 
			
		||||
        tmux attach-session -t "${last}"
 | 
			
		||||
        tmux display-message "Attached to session ${last}"
 | 
			
		||||
 | 
			
		||||
      else
 | 
			
		||||
        ta_new || return 1
 | 
			
		||||
        new
 | 
			
		||||
 | 
			
		||||
        if tmux has-session -t "$ta_name" 2>/dev/null; then
 | 
			
		||||
        if tmux has-session -t "${name}" 2>/dev/null; then
 | 
			
		||||
          ## Chosen session exists.
 | 
			
		||||
          tmux attach-session -t "$ta_name"
 | 
			
		||||
          tmux display-message "Attached to session $ta_name"
 | 
			
		||||
          tmux attach-session -t "${name}"
 | 
			
		||||
          tmux display-message "Attached to session ${name}"
 | 
			
		||||
 | 
			
		||||
        else
 | 
			
		||||
          ## Chosen session doesn't exist.
 | 
			
		||||
          tmux new-session -s "$ta_name"
 | 
			
		||||
          tmux display-message "Created session $ta_name"
 | 
			
		||||
          tmux new-session -s "${name}"
 | 
			
		||||
          tmux display-message "Created session ${name}"
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
main "$@"
 | 
			
		||||
main "${@}"
 | 
			
		||||
 | 
			
		||||
@ -11,8 +11,8 @@
 | 
			
		||||
## In the absence of an argument, the script will try to find a 'plugin'
 | 
			
		||||
##   directory at the defaults Tmux configuration directory in the following
 | 
			
		||||
##   order (stops at first match):
 | 
			
		||||
##    - ${XDG_CONFIG_HOME-$HOME/.config}/tmux/plugins
 | 
			
		||||
##    - $HOME/.tmux/plugins
 | 
			
		||||
##    - ${XDG_CONFIG_HOME-${HOME}/.config}/tmux/plugins
 | 
			
		||||
##    - ${HOME}/.tmux/plugins
 | 
			
		||||
##
 | 
			
		||||
## Note '@plugin' definition is only useful for TPM, this script will source
 | 
			
		||||
##   all plugins that are found. If you want to deactivate a plugin, move the
 | 
			
		||||
@ -29,12 +29,12 @@
 | 
			
		||||
set -eu
 | 
			
		||||
 | 
			
		||||
get_plugin_path(){
 | 
			
		||||
  xdg_file="${XDG_CONFIG_HOME-$HOME/.config}/tmux/tmux.conf"
 | 
			
		||||
  home_subdir_file="$HOME/.tmux/tmux.conf"
 | 
			
		||||
  if test -f "$xdg_file"; then
 | 
			
		||||
  xdg_file="${XDG_CONFIG_HOME-${HOME}/.config}/tmux/tmux.conf"
 | 
			
		||||
  home_subdir_file="${HOME}/.tmux/tmux.conf"
 | 
			
		||||
  if test -f "${xdg_file}"; then
 | 
			
		||||
    plugin_base="${xdg_file%/tmux.conf}/plugins"
 | 
			
		||||
    return 0
 | 
			
		||||
  elif test -f "$home_subdir_file"; then
 | 
			
		||||
  elif test -f "${home_subdir_file}"; then
 | 
			
		||||
    plugin_base="${home_subdir_file%/tmux.conf}/plugins"
 | 
			
		||||
    return 0
 | 
			
		||||
  fi
 | 
			
		||||
@ -45,16 +45,16 @@ set_plugin_path(){
 | 
			
		||||
  while true; do
 | 
			
		||||
    test -n "${1-}" || break
 | 
			
		||||
    cur_arg="$1"; shift
 | 
			
		||||
    case "$cur_arg" in
 | 
			
		||||
    case "${cur_arg}" in
 | 
			
		||||
      "")
 | 
			
		||||
        break
 | 
			
		||||
        ;;
 | 
			
		||||
      *)
 | 
			
		||||
        test -d "$cur_arg" || continue
 | 
			
		||||
        test -d "${cur_arg}" || continue
 | 
			
		||||
        if test -n "${plugin_base-}"; then
 | 
			
		||||
          plugin_base="${plugin_base-} $cur_arg"; continue
 | 
			
		||||
          plugin_base="${plugin_base-} ${cur_arg}"; continue
 | 
			
		||||
        else
 | 
			
		||||
          plugin_base="$cur_arg"; continue
 | 
			
		||||
          plugin_base="${cur_arg}"; continue
 | 
			
		||||
        fi
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
@ -64,32 +64,32 @@ set_plugin_path(){
 | 
			
		||||
source_plugins(){
 | 
			
		||||
  directory="$1"
 | 
			
		||||
  ## See shellcheck SC2044 to understand why loops over find are fragile.
 | 
			
		||||
  find "$directory" -maxdepth 1 -type d -not -name "$(printf "*\n*")" | \
 | 
			
		||||
  find "${directory}" -maxdepth 1 -type d -not -name "$(printf "*\n*")" | \
 | 
			
		||||
    while read -r plugin
 | 
			
		||||
  do
 | 
			
		||||
    plugin_name="${plugin##*/}"
 | 
			
		||||
    plugin_name="${plugin_name##tmux-}"
 | 
			
		||||
    plugin_name="$(echo "${plugin_name}" | tr "-" "_")"
 | 
			
		||||
    plugin_script="$plugin/$plugin_name.tmux"
 | 
			
		||||
    test -r "$plugin_script" || continue
 | 
			
		||||
    "$plugin_script" >/dev/null 2>&1
 | 
			
		||||
    plugin_script="${plugin}/${plugin_name}.tmux"
 | 
			
		||||
    test -r "${plugin_script}" || continue
 | 
			
		||||
    "${plugin_script}" >/dev/null 2>&1
 | 
			
		||||
  done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
plugin_base=""
 | 
			
		||||
command -v tmux >/dev/null || exit 1
 | 
			
		||||
if test -n "${1-}"; then
 | 
			
		||||
  set_plugin_path "$@"
 | 
			
		||||
  set_plugin_path "${@}"
 | 
			
		||||
else
 | 
			
		||||
  get_plugin_path || exit 1
 | 
			
		||||
  get_plugin_path
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
## Don't fail if not directory was found
 | 
			
		||||
test -n "${plugin_base-}" || exit 0
 | 
			
		||||
 | 
			
		||||
for p in ${plugin_base}; do
 | 
			
		||||
  test -d "$p" || continue
 | 
			
		||||
  source_plugins "$p"
 | 
			
		||||
  test -d "${p}" || continue
 | 
			
		||||
  source_plugins "${p}"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
exit
 | 
			
		||||
 | 
			
		||||
@ -4,7 +4,7 @@
 | 
			
		||||
##
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
: "${XDG_CONFIG_HOME:=$HOME/.config}"
 | 
			
		||||
: "${XDG_CONFIG_HOME:=${HOME}/.config}"
 | 
			
		||||
 | 
			
		||||
XINITRC="$XDG_CONFIG_HOME/x11/xinitrc"
 | 
			
		||||
XINITRC="${XDG_CONFIG_HOME}/x11/xinitrc"
 | 
			
		||||
export XINITRC
 | 
			
		||||
 | 
			
		||||
@ -5,5 +5,5 @@
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
test -r "$HOME/.profile" && . "$HOME/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=$HOME/.config}/x11/xprofile"
 | 
			
		||||
test -r "${HOME}/.profile" && . "${HOME}/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=${HOME}/.config}/x11/xprofile"
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,9 @@ if command -v xrdb >/dev/null; then
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
## If running normal OS or Qubes: Dom0, apply settings.
 | 
			
		||||
if ! command -v qubesdb-read >/dev/null || test "$(hostname)" = "dom0"; then
 | 
			
		||||
# shellcheck disable=3028
 | 
			
		||||
hostname="${HOSTNAME:-$(hostname)}"
 | 
			
		||||
if ! command -v qubesdb-read >/dev/null || test "${hostname}" = "dom0"; then
 | 
			
		||||
  ## Decrease key repeat delay to X ms.
 | 
			
		||||
  ## Increase key repeat rate to Y per second.
 | 
			
		||||
  xset r rate 275 60
 | 
			
		||||
@ -65,13 +67,14 @@ for wm in ${wm_list}; do
 | 
			
		||||
  if test "${wm}" = "dwm" && command -v xsetroot >/dev/null; then
 | 
			
		||||
    desktop_autostart
 | 
			
		||||
    while true; do
 | 
			
		||||
      xsetroot -name "$(display-statusbar)"
 | 
			
		||||
      xroot_name="$(display-statusbar)"
 | 
			
		||||
      xsetroot -name "${xroot_name}"
 | 
			
		||||
      sleep 60
 | 
			
		||||
    done &
 | 
			
		||||
  fi
 | 
			
		||||
  # shellcheck disable=SC2093
 | 
			
		||||
  ${wm} &
 | 
			
		||||
  wm_pid="$!"
 | 
			
		||||
  wm_pid="${!}"
 | 
			
		||||
done
 | 
			
		||||
 | 
			
		||||
test -z "${wm_pid:-}" || wait "${wm_pid}"
 | 
			
		||||
 | 
			
		||||
@ -5,5 +5,5 @@
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
test -r "$HOME/.profile" && . "$HOME/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=$HOME/.config}/x11/xprofile"
 | 
			
		||||
test -r "${HOME}/.profile" && . "${HOME}/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=${HOME}/.config}/x11/xprofile"
 | 
			
		||||
 | 
			
		||||
@ -5,5 +5,5 @@
 | 
			
		||||
## SPDX-License-Identifier: AGPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC1090,SC1091
 | 
			
		||||
test -r "$HOME/.profile" && . "$HOME/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=$HOME/.config}/x11/xsession"
 | 
			
		||||
test -r "${HOME}/.profile" && . "${HOME}/.profile"
 | 
			
		||||
. "${XDG_CONFIG_HOME:=${HOME}/.config}/x11/xsession"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user