aboutsummaryrefslogtreecommitdiff
path: root/wmfphablib/util.py
blob: 0100650fb32767ea213a2a9c8dbd69f73c6cb2dd (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
import itertools
import re
import os
import sys
import json
import subprocess
import config
import time
import datetime
import syslog
import phabdb
import bzlib


def tflatten(t_of_tuples):
    return [element for tupl in t_of_tuples for element in tupl]

def bzbug_ref_translate(text):
    mentioned_bugs = find_bug_refs(text)
    phabrefs = {}
    for b in mentioned_bugs:
        bugint = re.search('\d+', b).group(0)
        reft = phabdb.reference_ticket('%s%s' % (bzlib.prepend, bugint))
        if reft:
            phabrefs[b] = reft
    refdict = {k: v[0] for k, v in phabrefs.iteritems() if v is not None}
    taskid = lambda x: phabdb.get_task_id_by_phid(x)
    newrefs = {k: "T%s" % (taskid(v),) for k, v in refdict.iteritems()}
    return replace_bug_refs(text, newrefs)

def replace_bug_refs(text, bug_translations):
    # {u'Bug1': 'T6', u'Bug 100': 'T121'}
    for bug, ticket in bug_translations.iteritems():
        text = re.sub(bug , ticket, text, re.IGNORECASE)
    return text

def find_bug_refs(text):

    # there are nicer ways to do this seemingly but
    # all attempts resulted in an outlier so here it is
    bug_matches = ['bug\d+',
                   'bug\s+?\d+',
                   'bug\s?\#\d+',
                   'bug\s+\#\d+', 
                   'bug\s+\#\s?\d+', 
                   'bug\s+\#\s+\d+', 
                   'bug\#\s?\d+',
                   'bug\#\s+\d+',
                   'bug\#\d+']
    bugs = []
    for regex in bug_matches:
        bugs.append(re.findall(regex, text, re.IGNORECASE))
    return list(itertools.chain.from_iterable(bugs))

def datetime_to_epoch(date_time):
    return str((date_time - datetime.datetime(1970,1,1)).total_seconds())

def epoch_to_datetime(epoch, timezone='UTC'):
    return str((datetime.datetime.fromtimestamp(int(float(epoch))
           ).strftime('%Y-%m-%d %H:%M:%S'))) + " (%s)" % (timezone,)

def errorlog(msg):
    try:
        msg = unicode(msg)
        syslog.syslog(msg)
        print >> sys.stderr, msg
    except:
        print 'error logging, well...error output'

def log(msg):
    if '-v' in ''.join(sys.argv):
        try:
            msg = unicode(msg)
            syslog.syslog(msg)
            print msg
        except:
            print 'error logging output'

def notice(msg):
    msg = unicode(msg)
    print "NOTICE: ", msg
    log(msg)

def vlog(msg):
    if '-vv' in ''.join(sys.argv):
        try:
            msg = unicode(msg)
            print '-> ', msg
        except:
            print 'error logging verbose output'

def update_blog(source, complete, failed, user_count, issue_count, apicon):
    title = "%s completed %s / failed %s" % (epoch_to_datetime(time.time()),
                                             complete,
                                             failed)
    print title
    body = "%s:\nUsers updated: %s\nIssues affected: %s" % (source, user_count, issue_count)
    return apicon.blog_update(apicon.user, title, body)

def source_name(path):
    return os.path.basename(path.strip('.py'))

def can_edit_ref():
    f = open('/srv/phab/phabricator/conf/local/local.json', 'r').read()
    settings = json.loads(f)
    try:
        return settings['maniphest.custom-field-definitions']['external_reference']['edit']
    except:
        return False

def runBash(cmd):
   p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
   out = p.stdout.read().strip()
   return out

def translate_json_dict_items(dict_of_j):
    for t in dict_of_j.keys():
        if dict_of_j[t]:
            try:
                dict_of_j[t] = json.loads(dict_of_j[t])
            except (TypeError, ValueError):
                pass
    return dict_of_j

def get_index(seq, attr, value):
    return next(index for (index, d) in enumerate(seq) if d[attr] == value)

def purge_cache():
    return runBash('/srv/phab/phabricator/bin/cache purge --purge-remarkup')

def destroy_issue(id):
    return runBash('/srv/phab/phabricator/bin/remove destroy T%s --no-ansi --force' % (id,))

def remove_issue_by_bugid(bugid, ref):
    log("Removing issue by reference %s%s" % (ref, bugid))
    taskphid = phabdb.reference_ticket("%s%s" % (ref, bugid))
    log("Removing issue by taskphid %s" % (taskphid,))
    if len(taskphid) < 1:
        return 'no task phid found to remove'
    issueid = phabdb.get_task_id_by_phid(taskphid[0])
    notice("!Removing issue T%s!" % (issueid,))
    out = ''
    out += destroy_issue(issueid)
    out += str(phabdb.remove_reference("%s%s" % (ref, bugid)))
    out += str(phabdb.reference_ticket("%s%s" % (ref, bugid)))
    return out

def return_bug_list(dbcon=None, priority=None, table='bugzilla_meta'):

    if sys.stdin.isatty():
        bugs = sys.argv[1:]
    else:
        bugs = sys.stdin.read().strip('\n').strip().split()

    if priority:
        if dbcon == None:
            print "cant find dbcon for priority buglist"
            return []
        bugs = phabdb.get_issues_by_priority(dbcon,
                                             priority,
                                             table=table)
    elif '-' in bugs[0]:
        start, stop = bugs[0].split('-')

        bugrange = range(int(start), int(stop) + 1)
        bugs = [int(b) for b in bugrange]

        for arg in sys.argv:
            if arg.startswith('x'):
                sample = int(arg.strip('x'))
                vlog("sample rate found %s" % (sample,))
                bugs = [b for b in bugs if int(b) % sample == 0]
    else:
        bugs = [int(i) for i in bugs if i.isdigit()]

    if not isinstance(bugs, list):
        print "Bug list not built"
        return []

    #exclude known bad
    bugs = [b for b in bugs if b not in bzlib.missing]

    log("Bugs count: %d" % (len(bugs)))
    return bugs