Leave TODO to bring back tmux session listings
[khome.git] / home / lib / login_functions.sh
index d1d458a..335f6fd 100644 (file)
@@ -28,8 +28,27 @@ notify_done() {
 
 ## p : string -> unit
 p() {
+    local -r usage='Usage: p [FILE] NAME'
+    local name
+    local file
+
+    case "$#" in
+        0)
+            echo "$usage" >&2
+            return 1;;
+        1)
+            file=~/._p/p
+            name="$1";;
+        2)
+            file="$1"
+            name="$2";;
+        *)
+            echo "$usage" >&2
+            return 1;;
+    esac
+
     awk \
-        -v _s="$1" \
+        -v _s="$name" \
         '
             BEGIN {_s = tolower(_s)}
 
@@ -56,11 +75,11 @@ p() {
                     u = tmp
                     printf("%d [C] s:\"%s\", e:\"%s\", u:\"%s\"\n", n, s, e, u) > "/dev/stderr"
                 }
-
-                printf "%s", p # XXX Intentionally avoiding newline in the result.
+                ps[n] = p
             }
 
             END {
+                printf "%s", ps[n]  # XXX Intentionally avoiding newline in the result.
                 if (n == 1) {
                     exit 0
                 } else if (n == 0) {
@@ -68,12 +87,12 @@ p() {
                     exit 1
                 } else if (n > 1) {
                     # TODO fzf-select which of the records the user (ahem, me) wants.
-                    printf "[WARNING] Found more than one record.\n" > "/dev/stderr"
+                    printf "[WARNING] Found more than one record. Selecting the last one.\n" > "/dev/stderr"
                     exit 0
                 }
             }
         ' \
-        ~/._p/p \
+        "$file" \
         | xsel -i -b -t 30000
 }
 
@@ -425,22 +444,57 @@ gh_clone_repo() {
     git clone "$1"
 }
 
-todo() {
+bar() {
+    local -r len="${1:-79}" # 1st arg or 79.
+    local -r char="${2:--}" # 2nd arg or a dash.
+    for _ in {1.."$len"}; do
+        printf '%c' "$char";
+    done
+}
+
+daily_todo_file_template() {
+cat << EOF
+===============================================================================
+$(date '+%F %A')
+===============================================================================
+
+-------------------------------------------------------------------------------
+TODAY
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+CURRENT
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+BLOCKED
+-------------------------------------------------------------------------------
+
+
+-------------------------------------------------------------------------------
+BACKLOG
+-------------------------------------------------------------------------------
+EOF
+}
+
+today() {
     local date
-    local timestamp
-    local bar
-    date=$(date +%F)
-    timestamp=$(date '+%F %A')
-    bar=$(for _ in {1..80}; do printf '='; done)
+    date="$(date +%F)"
     local -r dir="$DIR_TODO/daily"
     local -r file="$dir/$date.txt"
 
     mkdir -p "$dir"
     if [ ! -f "$file" ]
     then
-        printf '%s\n%s\n%s\n' "$bar" "$timestamp" "$bar" > "$file"
+        daily_todo_file_template > "$file"
     fi
-    cd "$DIR_TODO" && "$EDITOR" "$file"
+    cd "$DIR_TODO" && "$EDITOR" $EDITOR_ARGS "$file"
+}
+
+todo() {
+    cd "$DIR_TODO" && "$EDITOR" TODO
 }
 
 work_log_template() {
@@ -620,11 +674,54 @@ status() {
 
     echo 'accounting'
 
-    printf '%stmux\n%ssessions %d, clients %d\n' \
-        "$indent_unit" \
-        "${indent_unit}${indent_unit}" \
-        "$(tmux list-sessions 2> /dev/null | wc -l)" \
-        "$(tmux list-clients  2> /dev/null | wc -l)"
+    # TODO Bring back seesion and client listing, but per server/socket.
+    printf '%stmux\n' "$indent_unit"
+    ps -eo comm,cmd \
+    | awk '
+        # Expecting lines like:
+        #     "tmux: server    tmux -L pistactl new-session -d -s pistactl"
+        #     "tmux: client    tmux -L foo"
+        #     "tmux: client    tmux -Lbar"
+        #     "tmux: client    tmux"
+        #     "tmux: server    tmux -L foo -S bar" <-- -S takes precedence
+        /^tmux:/ {
+            # XXX This of course assumes pervasive usage of -L
+            # TODO Handle -S
+            role=$2
+
+            split($0, sides_of_S, "-S")
+            split(sides_of_S[2], words_right_of_S, FS)
+
+            split($0, sides_of_L, "-L")
+            split(sides_of_L[2], words_right_of_L, FS)
+
+            if (words_right_of_S[1]) {
+                sock = "path." words_right_of_S[1]
+            } else if (words_right_of_L[1]) {
+                sock = "name." words_right_of_L[1]
+            } else {
+                sock = "default"
+            }
+
+            roles[role]++
+            socks[sock]++
+            count[role, sock]++
+        }
+
+        END {
+            for (sock in socks) {
+                clients = count["client", sock]
+                printf "%s ", sock
+                if (clients) {
+                    printf "<-> %d", clients
+                }
+                printf "\n"
+            }
+            printf "\n"
+        }' \
+    | sort \
+    | column -t \
+    | indent "${indent_unit}${indent_unit}"
 
     echo
 
This page took 0.049226 seconds and 4 git commands to generate.