mirror of
https://github.com/gosticks/PaperWM.git
synced 2026-02-18 06:42:50 +00:00
102 lines
2.7 KiB
Bash
Executable File
102 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/env zsh
|
||
|
||
indent=" "
|
||
|
||
# Ref: https://gitlab.gnome.org/GNOME/gnome-shell/issues/1
|
||
function skip-crap {
|
||
local crap_start="^Object [^ ]+ \(.*\), has been already finalized. Impossible to \w* any property \w* it.*"
|
||
|
||
local crap_continue=(
|
||
"^== Stack trace for context.*"
|
||
"^#[0-9]+\s*0x.*"
|
||
)
|
||
|
||
local skip=0
|
||
local skipped=0
|
||
local begin_skip_date
|
||
|
||
# Could probably be done more elegantly with awk/sed ?
|
||
while read -r date; do
|
||
read -r line
|
||
if [[ $line =~ $crap_start ]]; then
|
||
# echo setting skip
|
||
skip=1
|
||
begin_skip_date=$date
|
||
((skipped += 1))
|
||
continue
|
||
fi
|
||
|
||
if [[ $skip == 1 ]]; then
|
||
if [[ ($line =~ $crap_continue[1]) ||
|
||
($line =~ $crap_continue[2]) ]]; then
|
||
((skipped += 1))
|
||
continue
|
||
else
|
||
# echo reset skip
|
||
printf "%s\n" $begin_skip_date
|
||
printf "${indent}Skipped \"already finalized\" crap ($skipped lines)\n"
|
||
skip=0
|
||
skipped=0
|
||
fi
|
||
fi
|
||
|
||
printf "%s\n%s\n" $date $line
|
||
done
|
||
}
|
||
|
||
function group-stack-traces {
|
||
local addr="0x[0-9a-z]+"
|
||
local start_pattern="== Stack trace for context ${addr} =="
|
||
local stackframe="^#[0-9]+\s*${addr}"
|
||
local in_group=0
|
||
while read -r date; do
|
||
read -r line;
|
||
|
||
if [[ $line =~ $start_pattern ]]; then
|
||
in_group=1
|
||
elif ! [[ $line =~ $stackframe ]]; then
|
||
in_group=0
|
||
fi
|
||
|
||
if [[ $in_group == 0 ]]; then
|
||
printf "%s\n" $date
|
||
fi
|
||
|
||
printf "${indent}%s\n" $line
|
||
done
|
||
}
|
||
|
||
function date-on-separate-line {
|
||
# Use line buffering to be able to interactively grep the output
|
||
# (sed use line buffering when stdout is tty, but doesn't detect this
|
||
# transiently so `debug | grep foobar` will run without line buffering
|
||
# without the stdbuf stuff)
|
||
stdbuf -oL sed -e "s|\]:|]:\n${indent}|"
|
||
}
|
||
|
||
# We use non-breaking space to encode newlines in multiline messages
|
||
function decode-multiline-message {
|
||
stdbuf -oL sed -e 's| |\n |g'
|
||
}
|
||
|
||
function gnome-shell-exe-path {
|
||
if uname -a | grep --silent "NixOS"; then
|
||
echo $(dirname =gnome-shell(:A))/.gnome-shell-wrapped
|
||
else
|
||
echo =gnome-shell
|
||
fi
|
||
}
|
||
|
||
# Skip journalctl "logs start at.." to not disrupt date,line,date,line stream
|
||
function skip-header {
|
||
stdbuf -oL tail -n +2
|
||
}
|
||
|
||
journalctl --follow --lines 400 $@ $(gnome-shell-exe-path) \
|
||
| skip-header \
|
||
| date-on-separate-line \
|
||
| skip-crap \
|
||
| group-stack-traces \
|
||
| decode-multiline-message
|
||
|