summaryrefslogtreecommitdiffstats
path: root/watch-bz
blob: a2eae5f5ba0d9d187d4a4f2b0692728e7a901de6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/bash
# silly, but good-enough bugzilla monitoring
# jpokorny@redhat.com (will be pleased to know about further enhancements)

# usage:
# 1. optionally git clone git://git.fedorahosted.org/git/python-bugzilla
#    (system-wide can also be used)
# 2. open ~/.watchbzrc for editing
#    - set BUGZILLA_ROOT when using cloned python-bugzilla
#    - optionally set STATUS and COMPONENT as per example
#      (or pass such string as a 1st argument)
#    - optionally set BZUSER to avoid the need to login manually before
#      the "watch session"; you can set BZPASSWORD as well but be careful!

set -u
export LANG=C

HERE="$(dirname "$(readlink -f "$0")")"

BUGZILLA=$(which bugzilla 2>/dev/null)
BUGZILLA_ROOT=/usr
BUGZILLA_COOKIE=~/.watchbzcookies
BUGZILLA_LOGOUT=1

# example defaults, modify via ~/.watchbzrc
COMPONENT=acpid,mc
STATUS=OPEN
REFRESH_INTERVAL=600  # [s], better not to drain bugzilla's power...
BZUSER=
BZPASSWORD=

# user configuration
[ -f ~/.watchbzrc ] && source ~/.watchbzrc

# Fedora and color-friendly watch: rhbz#801626
WATCHCMD=watch
COLORIZE=cat
if watch --color -n0.1 -g date &>/dev/null; then
	WATCHCMD='watch --color'
	COLORIZE="sed"
	COLORIZE+=" -e 's|\([0-9.A-Z]\++[, ]\)|\x1b[1;32m\1\x1b[0m|g'"
	COLORIZE+=" -e 's|\([0-9.A-Z]\+-[, ]\)|\x1b[35m\1\x1b[0m|g'"
	COLORIZE+=" -e 's|\([0-9.A-Z]\+?[, ]\)|\x1b[37m\1\x1b[0m|g'"
	COLORIZE+=" -e 's|\(!!!\)|\x1b[1;31m\1\x1b[0m|g'"
fi

# guess correct paths
if [ -z "$BUGZILLA" ] || [ -n "${BUGZILLA_ROOT}" ]; then
	# BUGZILLA_ROOT (path to local repo) should rather be set in ~/.watchbzrc
	BUGZILLA="${BUGZILLA_ROOT}/bin/bugzilla"
	PYTHONPATH=${PYTHONPATH:+:${PYTHONPATH}}
	export PYTHONPATH="${BUGZILLA_ROOT}${PYTHONPATH}"
fi

# hardcoded for now (note the SEP - OUTPUT_FMT relationship)
SEP=@@@
WIDTH=$(( $(stty size | cut -d' ' -f2) - 1 ))

# arguments
if [ $# -ge 1 ]; then
	if [[ "$1" = -* ]]; then
		STATUS=$(echo "$1" | cut -c2-)
		shift
	fi
	if [ $# -ge 1 ]; then
		COMPONENT="$1"
	fi
fi

# omit component if only single one queried
echo $COMPONENT | grep -q ','
if [ $? -eq 0 ]; then
	OUTPUT_FMT="%{component}$SEP%{bug_id}$SEP%{product}$SEP%{priority}$SEP%{status}$SEP%{flags}$SEP%{short_desc}"
else
	OUTPUT_FMT="%{bug_id}$SEP%{product}$SEP%{priority}$SEP%{status}$SEP%{flags}$SEP%{short_desc}"
fi


do_logout () {
	rm "${BUGZILLA_COOKIE}" && echo "watch-bz: Authorization cookie removed"
}

# exclusively using globals
do_init () {
	# login when available
	if [ -n "$BZUSER" ] && [ ! -f "${BUGZILLA_COOKIE}" ]; then
		"$BUGZILLA" --cookiefile="${BUGZILLA_COOKIE}" login "$BZUSER" $BZPASSWORD
		if [ $? -ne 0 ]; then
			echo "Cannot log in"
			exit 2
		fi
	fi

	# C-c handler to optionally remove cookie on exit
	test $BUGZILLA_LOGOUT -ne 0 && trap do_logout INT
}

# exclusively using globals
do_watch () {
	#sh -c \
	${WATCHCMD} -t --interval $REFRESH_INTERVAL --differences=cumulative \
	  "$BUGZILLA --cookiefile="${BUGZILLA_COOKIE}" query -c $COMPONENT \
	             -t $STATUS --outputformat $OUTPUT_FMT \
	  | sed -u \
	    -e \"s|${SEP}Red Hat Enterprise Linux |${SEP}EL|\" \
	    -e \"s|${SEP}Fedora|${SEP} F |\" \
	    -e \"s|${SEP}NEW|${SEP}N|\" \
	    -e \"s|${SEP}ASSIGNED|${SEP}A|\" \
	    -e \"s|${SEP}POST|${SEP}P|\" \
	    -e \"s|${SEP}MODIFIED|${SEP}M|\" \
	    -e \"s|${SEP}ON_QA|${SEP}Q|\" \
	    -e \"s|${SEP}ON_DEV|${SEP}D|\" \
	    -e \"s|${SEP}VERIFIED|${SEP}V|\" \
	    -e \"s|${SEP}RELEASE_PENDING|${SEP}R|\" \
	    -e \"s|${SEP}CLOSED|${SEP}C|\" \
	    -e \"s|${SEP}urgent|${SEP}!!!|\" \
	    -e \"s|${SEP}high|${SEP}!!|\" \
	    -e \"s|${SEP}medium|${SEP} ! |\" \
	    -e \"s|${SEP}low|${SEP} ~ |\" \
	    -e \"s|${SEP}unspecified|${SEP} ? |\" \
	    -e \"s|qa_ack|QA|\" \
	    -e \"s|pm_ack|PM|\" \
	    -e \"s|devel_ack|D|\" \
	    -e \"s|needinfo|I|\" \
	    -e \"s|exception|E|\" \
	    -e \"s|blocker|BL|\" \
	    -e \"s|requires_release_note|RN|\" \
	    -e \"s|docs_scoped|DS|\" \
	    -e \"s|rhel-||g\" \
	    -e \"s|qe_test_coverage||\" \
	    -e \"s|None||\" \
	  | ${HERE}/table-data $SEP | sort | cut -c-$WIDTH | ${COLORIZE}"
}

do_init
do_watch