Fix 3 bugs from issue #174 that caused silent failure loop: 1. kugetsu-log.sh: Fix json.loads with newlines - Previously, notifications JSON was embedded in a single-quoted Python string literal, but newlines in the JSON broke the Python parser. - Fix: Pass JSON via stdin to Python instead of embedding in string. 2. kugetsu-queue-daemon.sh: Create logs directory during init - The logs/ directory ($LOGS_DIR) was never created during kugetsu init. - Fix: Add mkdir -p for LOGS_DIR, WORKTREES_DIR, QUEUE_DIR, and QUEUE_ITEMS_DIR to ensure_dirs() and ensure_queue_dirs(). 3. kugetsu: Fix parse_issue_ref_from_message URL parsing - The function used buggy grep/sed to parse URLs like #158 - Fix: Use bash regex (=~) for reliable URL parsing with proper capture groups. Additional improvements: - ensure_dirs() now creates all necessary directories instead of just SESSIONS_DIR - ensure_queue_dirs() now also creates QUEUE_DIR and LOGS_DIR - parse_issue_ref_from_message uses consistent bash regex approach for all URL patterns
101 lines
2.9 KiB
Bash
Executable File
101 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
set -euo pipefail
|
|
|
|
cmd_logs() {
|
|
local count="${1:-10}"
|
|
|
|
if [ ! -d "$LOGS_DIR" ]; then
|
|
echo "No logs found."
|
|
return
|
|
fi
|
|
|
|
find "$LOGS_DIR" -type f -mtime +7 -delete 2>/dev/null
|
|
|
|
ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | while read line; do
|
|
echo "$line"
|
|
done
|
|
|
|
echo ""
|
|
echo "Recent log contents:"
|
|
echo "===================="
|
|
|
|
for log in $(ls -lt "$LOGS_DIR" | head -$((count + 1)) | tail -$count | awk '{print $NF}'); do
|
|
if [ -f "$LOGS_DIR/$log" ]; then
|
|
echo ""
|
|
echo "--- $log ---"
|
|
tail -20 "$LOGS_DIR/$log" | while read line; do
|
|
echo " $(mask_sensitive_vars "$line")"
|
|
done
|
|
fi
|
|
done
|
|
}
|
|
|
|
kugetsu_add_notification() {
|
|
local notification_type="$1"
|
|
local message="$2"
|
|
local issue_ref="${3:-}"
|
|
local timestamp=$(date -Iseconds)
|
|
|
|
mkdir -p "$(dirname "$NOTIFICATIONS_FILE")"
|
|
|
|
local notifications="[]"
|
|
if [ -f "$NOTIFICATIONS_FILE" ]; then
|
|
notifications=$(cat "$NOTIFICATIONS_FILE")
|
|
fi
|
|
|
|
notifications=$(echo "$notifications" | python3 -c "
|
|
import json
|
|
import sys
|
|
|
|
notifications = json.load(sys.stdin)
|
|
new_notification = {
|
|
'type': '$notification_type',
|
|
'message': '''$message'''.replace('\"', '\"'),
|
|
'issue_ref': '$issue_ref' if '$issue_ref' else None,
|
|
'timestamp': '$timestamp',
|
|
'read': False
|
|
}
|
|
|
|
notifications.append(new_notification)
|
|
notifications = notifications[-50:] if len(notifications) > 50 else notifications
|
|
|
|
print(json.dumps(notifications, indent=2))
|
|
")
|
|
|
|
echo "$notifications" > "$NOTIFICATIONS_FILE"
|
|
}
|
|
|
|
cmd_notify() {
|
|
local action="${1:-list}"
|
|
|
|
case "$action" in
|
|
list)
|
|
if [ ! -f "$NOTIFICATIONS_FILE" ]; then
|
|
echo "No notifications."
|
|
return
|
|
fi
|
|
|
|
local notifications=$(cat "$NOTIFICATIONS_FILE")
|
|
local count=$(echo "$notifications" | python3 -c "import sys, json; n=json.load(sys.stdin); print(sum(1 for x in n if not x.get('read', False)))")
|
|
|
|
if [ "$count" -eq 0 ]; then
|
|
echo "No unread notifications."
|
|
return
|
|
fi
|
|
|
|
echo "Unread notifications ($count):"
|
|
echo "$notifications" | python3 -c "import sys, json; [print(f\" [{x.get('timestamp', '')}] {x.get('type', '')}: {x.get('message', '')}\") for x in json.load(sys.stdin) if not x.get('read', False)]"
|
|
;;
|
|
clear)
|
|
if [ -f "$NOTIFICATIONS_FILE" ]; then
|
|
python3 -c "import json; print(json.dumps([x for x in json.load(open('$NOTIFICATIONS_FILE')) if x.get('read', False)], indent=2))" > "$NOTIFICATIONS_FILE"
|
|
echo "Cleared unread notifications."
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Usage: kugetsu notify [list|clear]" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|