Compare commits

...

6 commits
v1.0.7 ... main

Author SHA1 Message Date
60e62585eb
Format the code, add fmt and check targets
Some checks failed
Makefile CI / build (push) Has been cancelled
2025-11-30 17:32:49 +02:00
82d22c0bf0
Update AGENTS.md (anarko/qwen3-coder-flash:30b) 2025-11-30 16:04:17 +02:00
dbc138e82e
Added AGENTS.md and .editorconfig
Some checks failed
Makefile CI / build (push) Has been cancelled
2025-11-28 22:06:29 +02:00
b31cb20161
Release 1.0.8, update .pre-commit-config.yaml
Some checks failed
Makefile CI / build (push) Has been cancelled
Add how to release notes.
2025-11-02 16:52:51 +02:00
affb7ae553
Fixing VENV again...
Updated .pre-commit-config.yaml
2025-11-02 16:39:08 +02:00
Doncho Gunchev
dc39105663 Shorten ~/.ssh/controlmasters to ~/.ssh/c (104 char limit on mac).
Some checks failed
Makefile CI / build (push) Has been cancelled
2025-05-27 10:04:07 +00:00
14 changed files with 293 additions and 148 deletions

27
.editorconfig Normal file
View file

@ -0,0 +1,27 @@
# EditorConfig is awesome: https://EditorConfig.org
# top-most EditorConfig file
root = true
[*]
charset = utf-8
end_of_line = lf
# The POSIX standard requires the last line to end with a new line character.
# All UNIX tools expect a new line at the end of files. Most text editors use this convention too.
insert_final_newline = true
trim_trailing_whitespace = true
max_line_length = 120
# Matches multiple files with brace expansion notation
# Set default charset and 4 space indentation
[*.{py,txt,md,rst,c,cxx,cpp,h,hpp,hxx,sh,cfg,ini}]
indent_style = space
indent_size = 4
[*.{js,json,html,htm,xml,yaml,yml}]
indent_style = space
indent_size = 2
# Tab indentation (no size specified)
[{Makefile,*.go}]
indent_style = tab

View file

@ -1,7 +1,7 @@
--- ---
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.5.0 rev: v6.0.0
hooks: hooks:
- id: check-added-large-files - id: check-added-large-files
args: [ '--maxkb=64' ] args: [ '--maxkb=64' ]

33
AGENTS.md Normal file
View file

@ -0,0 +1,33 @@
# AGENTS.md - Repository Guidelines for Agentic Coding
## Build & Development Commands
- `make help` - Show all available targets
- `make dist` - Create source distribution in dist/
- `make rpm` - Build RPM package
- `make podman_rpm` - Build RPM using podman (for MacOS)
- `make changelog` - Add changelog entry via ./changelog.sh
- `make check` - Run shellcheck on all shell scripts
- `make fmt` - Format all shell scripts with shfmt
- `make clean` - Clean generated files
- Pre-commit hooks run automatically on commit (see .pre-commit-config.yaml)
## Code Style Guidelines
- **Shell Scripts**: Use bash syntax, source-safe with `${BASH_SOURCE-}` guard
- **File Permissions**: profile.d scripts must be 0644 (install -m 0644) - they are sourced, not executed
- **Line Endings**: LF only (enforced by pre-commit, see .editorconfig)
- **No trailing whitespace** (enforced by pre-commit, see .editorconfig)
- **Error Handling**: Use `command -v` instead of `which` for portability, `set -euo pipefail`
- **OS Compatibility**: Support both Linux and MacOS with conditional logic
- **Naming**: Profile.d files use `z-<name>.sh` pattern for alphabetical loading
- **Licensing**: The Unlicense unless explicitly stated otherwise
- **Indentation**: 4 spaces for shell scripts (see .editorconfig)
- **Large Files**: Max 64KB (enforced by pre-commit)
## Testing
- No specific testing framework currently used
- Use `make check` to lint shell scripts with shellcheck
- Shell scripts should be tested with basic manual verification
## Cursor/Copilot Rules
- No specific .cursorrules or .github/copilot-instructions.md found
- Follow standard shell script best practices

View file

@ -4,11 +4,13 @@ WORKDIR /root/profile.d
COPY ./ . COPY ./ .
# dnf -y update && \
RUN \ RUN \
dnf -y update && \ dnf -y install rpmdevtools make && \
dnf -y install rpmdevtools make dnf -y clean all
# dnf -y install dnf-plugins-core epel-release && \ # dnf -y install dnf-plugins-core epel-release && \
# /usr/bin/crb enable && \ # /usr/bin/crb enable && \
# dnf -y clean all
RUN ./build.sh RUN ./build.sh

View file

@ -1,8 +1,8 @@
SHELL:=/bin/bash # Use bash syntax, mitigates dash's printf on Debian SHELL:=/bin/bash # Use bash syntax, mitigates dash's printf on Debian
ver:=$(shell git describe --dirty --long --match='v[0-9]*.[0-9]*' | cut -c 2- | cut -d - -f 1,2,4) ver:=$(shell git describe --dirty --long --match='v[0-9]*.[0-9]*' | cut -c 2- | cut -d - -f 1,2,4)
rpm_ver:=$(firstword $(subst -, ,$(ver))) rpm_ver:=$(firstword $(subst -, ,$(ver)))
rpm_rev:=$(subst $(rpm_ver)-,,$(ver)) name_rev:=$(subst $(rpm_ver)-,,$(ver))
rpm_rev:=$(subst -,_,$(rpm_rev)) rpm_rev:=$(subst -,_,$(name_rev))
help: help:
@ -15,6 +15,8 @@ help:
@echo " rpm: Create an RPM package." @echo " rpm: Create an RPM package."
@echo " podman_rpm Create an RPM package using podman on MacOS." @echo " podman_rpm Create an RPM package using podman on MacOS."
@echo " changelog: Add a changelog entry to gwebu-profile.spec.in." @echo " changelog: Add a changelog entry to gwebu-profile.spec.in."
@echo " check: Run shellcheck on all shell scripts."
@echo " fmt: Format all shell scripts with shfmt."
@echo @echo
@echo " clean: Clean all generated files." @echo " clean: Clean all generated files."
@echo @echo
@ -45,6 +47,17 @@ changelog:
./changelog.sh ./changelog.sh
.PHONY: check
check:
shellcheck --shell=bash --external-sources --source-path=etc/profile.d *.sh etc/profile.d/*.sh
rpmlint *.spec.in
.PHONY: fmt
fmt:
shfmt -w -i 4 -ci *.sh etc/profile.d/*.sh
.PHONY: clean .PHONY: clean
clean: clean:
rm -rf dist rm -rf dist

View file

@ -6,3 +6,32 @@ Unless explicitly stated in the file itself, the license is [The Unlicense](http
## Automation ## Automation
To update the RPM changelog run ./changelog.sh To update the RPM changelog run ./changelog.sh
Type `make` to see the available targets (dist, rpm, podman_rpm, changelog, clean).
## Releases
To create a new release first tag it:
```shell
git tag -a v1.0.0 -m "Release 1.0.0"
```
then run `./release.sh`. At this point
```shell
git commit -a --ammend
git tag -a v1.0.0 -m "Release 1.0.0" --force
```
This is a chicken and egg problem I have not decided how to solve yet.
Build the RPMs at this point with `make rpm` or `make podman_rpm`.
Once everything is OK push code and the tag.
```shell
git push
git push --tags
```
And draft a new release on GitHub.

View file

@ -3,13 +3,16 @@
set -euo pipefail set -euo pipefail
shopt -s nullglob dotglob shopt -s nullglob dotglob
if [ "$(uname -s)" != "Linux" ]; then echo "This script only works on Linux!" >&2; exit 254; fi if [ "$(uname -s)" != "Linux" ]; then
echo "This script only works on Linux!" >&2
exit 254
fi
set -x # debug set -x # debug
. /etc/os-release . /etc/os-release
ARCH="${ARCH:-$(uname -m)}" # ARCH="${ARCH:-$(uname -m)}" #
VER="${VER:-${VERSION_ID%%\.*}}" # 8 VER="${VER:-${VERSION_ID%%\.*}}" # 9
DIST_PRE="${PLATFORM_ID##*:}" # el8 DIST_PRE="${PLATFORM_ID##*:}" # el9
DIST="${DIST:-${DIST_PRE%%[0-9]*}}" # el DIST="${DIST:-${DIST_PRE%%[0-9]*}}" # el
OUT_DIR="/tmp/RPMS" OUT_DIR="/tmp/RPMS"
@ -24,17 +27,20 @@ export LC_TIME="${LANG}"
rm -rf "$OUT_DIR" rm -rf "$OUT_DIR"
mkdir "$OUT_DIR" mkdir "$OUT_DIR"
# Download all sources and patches.
#spectool -g ./*.spec #spectool -g ./*.spec
# #
# Install all build dependencies.
#if [ "$UID" == "0" ]; then #if [ "$UID" == "0" ]; then
# dnf builddep -y --refresh ./*.spec # dnf builddep -y --refresh ./*.spec
#fi #fi
# make rpmsrc # make dist
rpmbuild -ta ./dist/*.tar.xz \ rpmbuild -ta ./dist/*.tar.xz \
--define "_sourcedir $PWD/dist" \ --define "_sourcedir $PWD/dist" \
--define "_srcrpmdir $OUT_DIR" \ --define "_srcrpmdir $OUT_DIR" \
--define "_rpmdir $OUT_DIR" \ --define "_rpmdir $OUT_DIR"
mv "$OUT_DIR"/*/*.rpm "$OUT_DIR/" mv "$OUT_DIR"/*/*.rpm "$OUT_DIR/"
rmdir "$OUT_DIR"/* 2>/dev/null || true rmdir "$OUT_DIR"/* 2>/dev/null || true

View file

@ -12,7 +12,7 @@ change1="* $(date +'%a %b %d %Y') $(git log -1 --format='%aN <%aE>') - ${rpm_ver
change2="- $(git log -1 --format=%s)" change2="- $(git log -1 --format=%s)"
awk -v change1="${change1}" -v change2="${change2}" '/^%changelog/ {print; print change1; print change2; print ""; next} 1' gwebu-profile.spec.in \ awk -v change1="${change1}" -v change2="${change2}" '/^%changelog/ {print; print change1; print change2; print ""; next} 1' gwebu-profile.spec.in \
> gwebu-profile.spec.tmp && mv gwebu-profile.spec.tmp gwebu-profile.spec.in >gwebu-profile.spec.tmp && mv gwebu-profile.spec.tmp gwebu-profile.spec.in
sed -i.bak "s/Version: .*/Version: ${rpm_ver}/" gwebu-profile.spec.in sed -i.bak "s/Version: .*/Version: ${rpm_ver}/" gwebu-profile.spec.in
sed -i.bak "s/Release: .*/Release: ${rpm_numeric_rev}/" gwebu-profile.spec.in sed -i.bak "s/Release: .*/Release: ${rpm_numeric_rev}/" gwebu-profile.spec.in

10
etc/profile.d/ssh_controlmasters.sh Executable file → Normal file
View file

@ -3,7 +3,9 @@ if [ "${BASH_SOURCE-}" = "$0" ]; then
exit 33 exit 33
fi fi
# SSH Control Masters tools (setup controlmasters to be in ~/.ssh/controlmasters). # SSH Control Masters tools (setup controlmasters to be in ~/.ssh/c).
alias ssh_controlmasters_ls='(cd ~/.ssh/controlmasters; ls -A 2>/dev/null || echo "-- No control masters --")' alias ssh_controlmasters_ls='(cd ~/.ssh/c; ls -A 2>/dev/null || echo "-- No control masters --")'
alias ssh_controlmasters_check='(cd ~/.ssh/controlmasters; [ "$(ls -A)" ] && for i in *; do echo -n "$i: "; ssh -O check "${i%:*}" -p "${i##*:}"; done)' # shellcheck disable=SC2154
alias ssh_controlmasters_stop='(cd ~/.ssh/controlmasters; [ "$(ls -A)" ] && for i in *; do echo -n "$i: "; ssh -O stop "${i%:*}" -p "${i##*:}"; done)' alias ssh_controlmasters_check='(cd ~/.ssh/c; [ "$(ls -A)" ] && for i in *; do echo -n "$i: "; ssh -O check "${i%:*}" -p "${i##*:}"; done)'
# shellcheck disable=SC2154
alias ssh_controlmasters_stop='(cd ~/.ssh/c; [ "$(ls -A)" ] && for i in *; do echo -n "$i: "; ssh -O stop "${i%:*}" -p "${i##*:}"; done)'

2
etc/profile.d/z-aliases.sh Executable file → Normal file
View file

@ -18,7 +18,7 @@ if [[ "$OSTYPE" != darwin* ]]; then
alias lll='ls --color=auto -Al "--time-style=+%Y-%m-%d %H:%M:%S GMT%z"' alias lll='ls --color=auto -Al "--time-style=+%Y-%m-%d %H:%M:%S GMT%z"'
# if there is iproute installed # if there is iproute installed
if command -v ip > /dev/null; then if command -v ip >/dev/null; then
# color ip route # color ip route
if ip -V | grep '^ip utility, iproute2-.*, libbpf' &>/dev/null; then if ip -V | grep '^ip utility, iproute2-.*, libbpf' &>/dev/null; then
# EL 8+ - "ip utility, iproute2-6.2.0, libbpf 0.5.0" # EL 8+ - "ip utility, iproute2-6.2.0, libbpf 0.5.0"

0
etc/profile.d/z-env.sh Executable file → Normal file
View file

278
etc/profile.d/z-ps-twtty-7.sh Executable file → Normal file
View file

@ -11,6 +11,10 @@
# alternatively write to the Free Software Foundation, Inc., # alternatively write to the Free Software Foundation, Inc.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# z-ps-twtty-7.sh - Nice bash prompt and history archiver
# by Doncho Gunchev <dgunchev@gmail.com>, 2025-11-02 16:27:00 EET
# Improve python virtual environments support.
#
# z-ps-twtty-7.sh - Nice bash prompt and history archiver # z-ps-twtty-7.sh - Nice bash prompt and history archiver
# by Doncho Gunchev <dgunchev@gmail.com>, 2024-01-27 15:58 EET # by Doncho Gunchev <dgunchev@gmail.com>, 2024-01-27 15:58 EET
# Show PIPESTATUS instead of just $?. Cleanup. # Show PIPESTATUS instead of just $?. Cleanup.
@ -47,124 +51,139 @@ if [ "${BASH_SOURCE-}" = "$0" ]; then
exit 33 exit 33
fi fi
if [ "$PS1" ] ; then # interactive shell detection if [ "$PS1" ]; then # interactive shell detection
# Log the logout event. # Log the logout event.
function prompt_command_exit() { function prompt_command_exit() {
trap - EXIT trap - EXIT
local now=$(date --rfc-3339=ns 2> /dev/null || date -Iseconds) local now
local HistFile now=$(date --rfc-3339=ns 2>/dev/null || date -Iseconds)
HistFile="$HOME/bash_history/$(date '+%Y-%m/%Y-%m-%d')" local HistFile
mkdir -p "${HistFile%/*}" HistFile="$HOME/bash_history/$(date '+%Y-%m/%Y-%m-%d')"
echo -e "# Logout,$USER@${HOSTNAME}:$PWD,$(tty),${SSH_CLIENT:-local},login=${my_LoginTime:-$now},now=$now\nlogout" >> "$HistFile" mkdir -p "${HistFile%/*}"
} echo -e "# Logout,$USER@${HOSTNAME}:$PWD,$(tty),${SSH_CLIENT:-local},login=${my_LoginTime:-$now},now=$now\nlogout" >>"$HistFile"
}
# Executed before each prompt. Fill the variables needed by PS1 here. # Executed before each prompt. Fill the variables needed by PS1 here.
function prompt_command() { function prompt_command() {
local now=$(date --rfc-3339=ns 2> /dev/null || date -Iseconds) local now
now=$(date --rfc-3339=ns 2>/dev/null || date -Iseconds)
# Manage the history # Manage the history
local HistFile="$HOME/bash_history/$(date '+%Y-%m/%Y-%m-%d')" local HistFile
mkdir -p "${HistFile%/*}" HistFile="$HOME/bash_history/$(date '+%Y-%m/%Y-%m-%d')"
mkdir -p "${HistFile%/*}"
if [ -z "$my_LoginTime" ]; then if [ -z "$my_LoginTime" ]; then
my_LoginTime="$now" my_LoginTime="$now"
fi fi
# Calculate the width of the prompt: # Calculate the width of the prompt:
my_TTY="$(tty)" my_TTY="$(tty)"
my_TTY="${my_TTY:5}" # cut the '/dev' part -> tty/1, pts/2... my_TTY="${my_TTY:5}" # cut the '/dev' part -> tty/1, pts/2...
my_PWD="${PWD}" my_PWD="${PWD}"
# Add all the accessories below ... # Add all the accessories below ...
my_D="$(date '+%Y-%m-%d %H:%M:%S')" my_D="$(date '+%Y-%m-%d %H:%M:%S')"
# This is for string size calculations only. The variable my_P is set, see PROMPT_COMMAND below. # This is for string size calculations only. The variable my_P is set, see PROMPT_COMMAND below.
local prompt="--($my_D, Err ${my_P[*]}, $my_TTY)---($PWD)--" if [ -z "$my_P" ]; then my_P="ERROR"; fi # make shellcheck happy.
local prompt="--($my_D, Err ${my_P[*]}, $my_TTY)---($PWD)--"
if [ -n "${VIRTUAL_ENV:-}" ] && [ -n "$_OLD_VIRTUAL_PS1" ]; then if [ -n "${VIRTUAL_ENV:-}" ] && [ -n "$_OLD_VIRTUAL_PS1" ]; then
if [ -n "$VIRTUAL_ENV_PROMPT" ]; then if [ -n "$VIRTUAL_ENV_PROMPT" ]; then
my_VENV="${VIRTUAL_ENV_PROMPT%) }" my_VENV="${VIRTUAL_ENV_PROMPT%\ }"
my_VENV="${my_VENV%) }" my_VENV="${my_VENV%\)}"
export my_VENV="${my_VENV#(}" my_VENV="${my_VENV#\(}"
else
# Best guess
export my_VENV="${VIRTUAL_ENV##*/}"
fi
prompt="--($my_D, Err ${my_P[*]}, $my_TTY, Venv $my_VENV)---($PWD)--"
# local ps1_prefix
ps1_prefix="${_OLD_VIRTUAL_PS1%\$\{my_TTY\}*}\${my_TTY}"
ps1_suffix="${_OLD_VIRTUAL_PS1#"$ps1_prefix"}"
# The magic with numbers copies the comma with the colors around it.
export PS1="${ps1_prefix}${ps1_prefix:${#ps1_prefix}-39:30}\
${ps1_prefix:${#ps1_prefix}-81:14}Venv${ps1_prefix:${#ps1_prefix}-63:14} ${my_VENV}${ps1_suffix}"
fi
local fill_size=0
[ -z "${COLUMNS}" ] && COLUMNS=$(tput cols)
((fill_size = COLUMNS - ${#prompt}))
my_FILL=""
if [ "$fill_size" -gt 0 ]; then
my_FILL="────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"
while [ "$fill_size" -gt ${#my_FILL} ]; do
my_FILL="${my_FILL}${my_FILL}${my_FILL}${my_FILL}"
done
my_FILL="${my_FILL::$fill_size}"
fi
if [ "$fill_size" -lt 0 ]; then
my_PWD="${my_PWD:1-$fill_size}"
fi
local OldCmdNo="$CmdNo" # See if we got new command later.
local Cmd
Cmd="$(history 1)"
CmdNo="${Cmd:0:7}"
if [[ -z "$OldCmdNo" ]]; then
Cmd="login"
else else
# Best guess Cmd="${Cmd:7}"
export my_VENV="${VIRTUAL_ENV##*/}"
fi fi
prompt="--($my_D, Err ${my_P[*]}, $my_TTY, $my_VENV)---($PWD)--" if [ "$OldCmdNo" != "$CmdNo" ]; then # Only save new commands, not empty lines or Ctrl+C.
if [ "${PS1:0:${#my_VENV}+3}" == "($my_VENV) " ]; then echo -e "# PIPESTATUS=${my_P[*]},$USER@${HOSTNAME}:$PWD,$(tty),${SSH_CLIENT:-local},login=$my_LoginTime,now=$now\n$Cmd" >>"$HistFile"
# PS1 will be restored by virtual environment's deactivate script.
# Yeah, that has to be done better, 172 is correct but magic number.
export PS1="${_OLD_VIRTUAL_PS1:0:172}, ${my_VENV}${_OLD_VIRTUAL_PS1:172}"
fi fi
fi }
local fill_size=0 function twtty {
[ -z "${COLUMNS}" ] && COLUMNS=$(tput cols) # The special "\[" and "\]" are telling bash that the text enclosed will not move the caret.
((fill_size=COLUMNS-${#prompt})) # shellcheck disable=SC2034
my_FILL="" local GRAY='\[\033[1;30m\]'
if [ "$fill_size" -gt 0 ]; then # shellcheck disable=SC2034
my_FILL="────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────" local LIGHT_GRAY='\[\033[0;37m\]'
while [ "$fill_size" -gt ${#my_FILL} ]; do # shellcheck disable=SC2034
my_FILL="${my_FILL}${my_FILL}${my_FILL}${my_FILL}" local WHITE='\[\033[1;37m\]'
done # shellcheck disable=SC2034
my_FILL="${my_FILL::$fill_size}" local NO_COLOUR='\[\033[0m\]'
fi
if [ "$fill_size" -lt 0 ]; then # shellcheck disable=SC2034
my_PWD="${my_PWD:1-$fill_size}" local LIGHT_BLUE='\[\033[1;34m\]'
fi # shellcheck disable=SC2034
local YELLOW='\[\033[1;33m\]'
local OldCmdNo="$CmdNo" # See if we got new command later. # shellcheck disable=SC2034
local Cmd="$(history 1)" local RED='\[\033[0;31m\]'
CmdNo="${Cmd:0:7}" # shellcheck disable=SC2034
if [[ -z "$OldCmdNo" ]]; then local LIGHT_RED='\[\033[1;31m\]'
Cmd="login"
else
Cmd="${Cmd:7}"
fi
if [ "$OldCmdNo" != "$CmdNo" ]; then # Only save new commands, not empty lines or Ctrl+C.
echo -e "# PIPESTATUS=${my_P[*]},$USER@${HOSTNAME}:$PWD,$(tty),${SSH_CLIENT:-local},login=$my_LoginTime,now=$now\n$Cmd" >> "$HistFile"
fi
}
function twtty { # shellcheck disable=SC2034
# The special "\[" and "\]" are telling bash that the text enclosed will not move the caret. local GREEN='\[\033[0;32m\]'
local GRAY='\[\033[1;30m\]' # shellcheck disable=SC2034
local LIGHT_GRAY='\[\033[0;37m\]' local LIGHT_GREEN='\[\033[1;32m\]'
local WHITE='\[\033[1;37m\]'
local NO_COLOUR='\[\033[0m\]'
local LIGHT_BLUE='\[\033[1;34m\]' if [ "${UID}" -ne '0' ]; then
local YELLOW='\[\033[1;33m\]' # Normal user colors
local C1="${GREEN}"
local C2="${LIGHT_GREEN}"
local C3="${WHITE}"
else
# root user colors
local C1="${LIGHT_RED}"
local C2="${YELLOW}"
local C3="${WHITE}"
fi
local RED='\[\033[0;31m\]' case "$TERM" in
local LIGHT_RED='\[\033[1;31m\]' xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=''
;;
esac
local GREEN='\[\033[0;32m\]' export PS1="$TITLEBAR${C1}${C2}─(\
local LIGHT_GREEN='\[\033[1;32m\]'
if [ "${UID}" -ne '0' ]; then
# Normal user colors
local C1="${GREEN}"
local C2="${LIGHT_GREEN}"
local C3="${WHITE}"
else
# root user colors
local C1="${LIGHT_RED}"
local C2="${YELLOW}"
local C3="${WHITE}"
fi
case "$TERM" in
xterm*)
TITLEBAR='\[\033]0;\u@\h:\w\007\]'
;;
*)
TITLEBAR=''
;;
esac
export PS1="$TITLEBAR\
${C1}${C2}(\
${C1}\${my_D}${C2}, ${C1}Err ${C3}\${my_P[*]}${C2}, ${C3}\${my_TTY}\ ${C1}\${my_D}${C2}, ${C1}Err ${C3}\${my_P[*]}${C2}, ${C3}\${my_TTY}\
${C2})${C1}\${my_FILL}${C2}(\ ${C2})${C1}\${my_FILL}${C2}(\
${C1}\${my_PWD}\ ${C1}\${my_PWD}\
@ -174,33 +193,38 @@ ${C1}└${C2}─(\
${C1}\${USER}${C2}@${C1}\${HOSTNAME%%.*}\ ${C1}\${USER}${C2}@${C1}\${HOSTNAME%%.*}\
${C2})${C3}\$${NO_COLOUR} " ${C2})${C3}\$${NO_COLOUR} "
export PS2="${C2}${C1}${C1}${NO_COLOUR} \[\033[K\]" export PS2="${C2}${C1}${C1}${NO_COLOUR} \[\033[K\]"
# Set my_P to the exit codes of the last command pipe. # Set my_P to the exit codes of the last command pipe.
local P='my_P=("${PIPESTATUS[@]}");prompt_command' # shellcheck disable=SC2016
if declare -p PROMPT_COMMAND &>/dev/null; then local P='my_P=("${PIPESTATUS[@]}");prompt_command'
local re='^declare -a ' if declare -p PROMPT_COMMAND &>/dev/null; then
if [[ "$(declare -p PROMPT_COMMAND)" =~ $re ]]; then # Array, supported since bash 5.1 local re='^declare -a '
PROMPT_COMMAND=("$P" "${PROMPT_COMMAND[@]}") if [[ "$(declare -p PROMPT_COMMAND)" =~ $re ]]; then # Array, supported since bash 5.1
else # String PROMPT_COMMAND=("$P" "${PROMPT_COMMAND[@]}")
PROMPT_COMMAND="$P;${PROMPT_COMMAND}" else # String
# shellcheck disable=SC2178
# shellcheck disable=SC2128
PROMPT_COMMAND="$P;${PROMPT_COMMAND}"
fi
else
# shellcheck disable=SC2178
PROMPT_COMMAND="$P"
fi fi
else unset P
PROMPT_COMMAND="$P"
trap prompt_command_exit EXIT
shopt -s cmdhist histappend
export HISTCONTROL='ignorespace' # ':erasedups' would prevent logging duplicate commands.
export HISTIGNORE='history:history *'
}
# Secure bash history
if [ ! -d "$HOME/bash_history" ]; then
mkdir -m 0700 "$HOME/bash_history"
fi fi
unset P
trap prompt_command_exit EXIT # call and unset
shopt -s cmdhist histappend twtty
export HISTCONTROL='ignorespace' # ':erasedups' would prevent logging duplicate commands. unset twtty
export HISTIGNORE='history:history *'
}
# Secure bash history
if [ ! -d "$HOME/bash_history" ]; then
mkdir -m 0700 "$HOME/bash_history"
fi
# call and unset
twtty; unset twtty
fi fi

0
etc/profile.d/z-time_style.sh Executable file → Normal file
View file

View file

@ -1,6 +1,6 @@
Summary: Gwebu profile.d - cool date, prompt with history, aliases Summary: Gwebu profile.d - cool date, prompt with history, aliases
Name: gwebu-profile Name: gwebu-profile
Version: 1.0.7 Version: 1.0.9
Release: 0 Release: 0
BuildArch: noarch BuildArch: noarch
License: GPLv2 License: GPLv2
@ -41,6 +41,15 @@ install -m 0644 etc/profile.d/*.sh %{buildroot}%{_sysconfdir}/profile.d/
%changelog %changelog
* Sun Nov 30 2025 Doncho N. Gunchev <dgunchev@gmail.com> - 1.0.9-0
- Format the code, add fmt and check targets
* Sun Nov 02 2025 Doncho N. Gunchev <dgunchev@gmail.com> - 1.0.8-0
- Fixing VENV again...
* Tue May 27 2025 Doncho Gunchev <doncho.gunchev@flyr.com> - 1.0.7-1
- Shorten ~/.ssh/controlmasters to ~/.ssh/c (104 char limit on mac).
* Sun Mar 09 2025 Doncho N. Gunchev <dgunchev@gmail.com> - 1.0.7-0 * Sun Mar 09 2025 Doncho N. Gunchev <dgunchev@gmail.com> - 1.0.7-0
- Improve python virtual environment support (uv) take 2. - Improve python virtual environment support (uv) take 2.