summaryrefslogtreecommitdiffstats
path: root/scripts/filter-active.py
blob: 08ba86c1a4606defc1f9fb13cf606fe59c665e70 (plain) (blame)
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
#!/usr/bin/python3

import os, re, sys, curses
from optparse import OptionParser

from issue import get_issues, parse_status


def filter_out_states(issues, inc_releases, exc_releases, states, notstates):
    filteredissues = []
    for i in issues:
        for release in (inc_releases or i.get_releases()) - exc_releases:
            # Current state must be within 'states' (if specified), and
            # must not be within 'notstates' (if specified).
            m = parse_status(i.status(release))
            if ((m['state'] in states if states else True) and
                (m['state'] not in notstates if notstates else True)):
                filteredissues.append(i)
                break

    return filteredissues


def tparm_unicode(*args):
    return curses.tparm(*args).decode('ascii')


if __name__ == '__main__':
    parser = OptionParser()
    parser.add_option("-d", "--dirs", action="append")
    parser.add_option("-r", "--release", action="append")
    parser.add_option("-s", "--states", action="append")
    parser.add_option("-n", "--notstates", action="append")
    parser.add_option("-c", "--color", "--colour", action="store_true")
    parser.add_option("--no-color", "--no-colour",
                      action="store_false", dest="color")

    (options, args) = parser.parse_args()

    if not options.dirs:
        print('I: Listing issues in active directory')
        options.dirs = ['active']
    if not options.states and not options.notstates:
        print('I: Excluding N/A, ignored and released issues')
        options.notstates = ['N/A', 'ignored', 'released']
    if options.release:
        inc_releases = set(options.release)
        exc_releases = set()
    else:
        print('I: Excluding EOL releases')
        inc_releases = None
        with open('eol_releases') as eol_file:
            exc_releases = set(line.strip()
                               for line in eol_file
                               if not line.startswith('#'))
    if options.color is None:
        options.color = sys.stdout.isatty()
    if options.color:
        curses.setupterm()
        status_color = {"needed": tparm_unicode(curses.tigetstr("setaf"),
                                                curses.COLOR_RED),
                        "ignored": tparm_unicode(curses.tigetstr("setaf"),
                                                 curses.COLOR_YELLOW),
                        "pending": tparm_unicode(curses.tigetstr("setaf"),
                                                 curses.COLOR_MAGENTA),
                        "released": tparm_unicode(curses.tigetstr("setaf"),
                                                  curses.COLOR_GREEN),
                        "N/A": tparm_unicode(curses.tigetstr("setaf"),
                                             curses.COLOR_GREEN)}
        color_off = tparm_unicode(curses.tigetstr("op"))
    else:
        color_off = ''

    issues = []
    for d in options.dirs:
        issues = issues + get_issues(d)

    if options.states or options.notstates:
        issues = filter_out_states(issues, inc_releases, exc_releases,
                                   options.states, options.notstates)

    if options.release:
        list_releases = options.release
    else:
        all_releases = set()
        for i in issues:
            all_releases |= i.get_releases()
        list_releases = sorted(list(all_releases - exc_releases))

    if len(list_releases) == 1:
        min_width = 0
        max_width = 1000
    else:
        min_width = 20
        max_width = 20
        sys.stdout.write("                  ")
        for release in list_releases:
            sys.stdout.write(" %-20.20s " % release)
        sys.stdout.write("\n")

    for i in issues:
        sys.stdout.write("%17s:" % i.name)
        for release in list_releases:
            status = i.status(release) or "unknown"
            status_short = status.split(' ')[0]
            if options.color and status_short in status_color:
                color_on = status_color[status_short]
            else:
                color_on = ''
            sys.stdout.write(" %s%-*.*s%s " %
                             (color_on, min_width, max_width, status, color_off))
        sys.stdout.write("\n")

© 2014-2024 Faster IT GmbH | imprint | privacy policy