summaryrefslogtreecommitdiffstats
path: root/watch-bz
blob: d5f1a2bf713f65e67aa21f7e9a85303eeaea769c (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
#!/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 $0)

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

# example defaults, modify via ~/.watchbzrc
COMPONENT=luci,ricci,clustermon,conga,sunzi
STATUS=OPEN
REFRESH_INTERVAL=600  # [s], better not to drain bugzilla's power...

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

# guess correct paths
if [ -z "$BUGZILLA" ]; then
	# BUGZILLA_ROOT (path to local repo) should rather be set in ~/.watchbzrc
	BUGZILLA="${BUGZILLA_ROOT}/bin/bugzilla"
	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}"
}

# 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 \
	watch -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 | cut -c-$WIDTH"
	# todo: colours for priorities (rhbz#801626)
	#-e 's/\(urgent\)/\^\[\[31m\1\^\[\[0m/' \
}

do_init
do_watch