diff options
author | cpettet <rush@wikimedia.org> | 2014-11-22 08:37:33 -0600 |
---|---|---|
committer | cpettet <rush@wikimedia.org> | 2014-11-22 08:37:33 -0600 |
commit | d812b51aaa8835325d44cbba9f2e69ff025fddeb (patch) | |
tree | 84e4e33aab84e3c4e5176ddf8026e4421fef3c95 | |
parent | 39dc0f33cdb4406a42f54f9189a10745d57dc36b (diff) |
fixup logic for tags that did not get migrated correctly
-rwxr-xr-x | bugzilla_tag_update.py | 160 | ||||
-rwxr-xr-x | wmfphablib/phabdb.py | 35 |
2 files changed, 195 insertions, 0 deletions
diff --git a/bugzilla_tag_update.py b/bugzilla_tag_update.py new file mode 100755 index 0000000..b49af18 --- /dev/null +++ b/bugzilla_tag_update.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python +import multiprocessing +import time +import yaml +import ast +import json +import sys +import xmlrpclib +import os +import re +from phabricator import Phabricator +from wmfphablib import Phab as phabmacros +from wmfphablib import return_bug_list +from wmfphablib import phdb +from wmfphablib import now +from wmfphablib import mailinglist_phid +from wmfphablib import set_project_icon +from wmfphablib import phabdb +from wmfphablib import Phab +from wmfphablib import log +from wmfphablib import notice +from wmfphablib import vlog +from wmfphablib import errorlog as elog +from wmfphablib import bzlib +from wmfphablib import config +from wmfphablib import bzlib +from wmfphablib import util +from wmfphablib import datetime_to_epoch +from wmfphablib import epoch_to_datetime +from wmfphablib import ipriority + +def create(bugid): + phab = Phabricator(config.phab_user, + config.phab_cert, + config.phab_host) + + phabm = phabmacros('', '', '') + phabm.con = phab + + pmig = phabdb.phdb(db=config.bzmigrate_db, + user=config.bzmigrate_user, + passwd=config.bzmigrate_passwd) + + current = pmig.sql_x("SELECT priority, \ + header, \ + comments, \ + created, \ + modified \ + FROM bugzilla_meta WHERE id = %s", + (bugid,)) + if current: + import_priority, buginfo, com, created, modified = current[0] + else: + elog('%s not present for migration' % (bugid,)) + return False + + def get_ref(id): + refexists = phabdb.reference_ticket('%s%s' % (bzlib.prepend, + id)) + if refexists: + return refexists[0] + + buginfo = json.loads(buginfo) + com = json.loads(com) + bugid = int(bugid) + vlog(bugid) + vlog(buginfo) + + ticket = get_ref(bugid) + print 'TICKET ', ticket + + def is_sensitive(name): + return name.strip().lower().startswith('security') + + def project_security_settings(pname): + if is_sensitive(pname): + ephid = phabdb.get_project_phid('security') + edit = ephid + else: + edit = 'users' + view = 'public' + return edit, view + + server = xmlrpclib.ServerProxy(config.Bugzilla_url, use_datetime=True) + token_data = server.User.login({'login': config.Bugzilla_login, + 'password': config.Bugzilla_password}) + + token = token_data['token'] + #http://www.bugzilla.org/docs/tip/en/html/api/Bugzilla/WebService/Bug.html#attachments + kwargs = { 'ids': [bugid], 'Bugzilla_token': token } + + #list of projects to add to ticket + ptags = [] + + if buginfo['status'] == 'VERIFIED': + vlog("Adding 'verified' to %s" % (ticket,)) + ptags.append(('verified', 'tags')) + + if buginfo['status'].lower() == 'patch_to_review': + vlog("Adding 'Patch-For-Review' to %s" % (ticket,)) + ptags.append(('Patch-For-Review', 'tags', 'green')) + + log("status recognized as %s" % (buginfo['status'],)) + + phids = [] + for p in ptags: + edit, view = project_security_settings(p[0]) + phid = phabm.ensure_project(p[0], edit=edit, view=view) + phids.append(phid) + if p[1] is not None: + vlog("setting project %s icon to %s" % (p[0], p[1])) + set_project_icon(p[0], icon=p[1]) + + for phid in phids: + phabdb.set_related_project(ticket, phid) + + pmig.close() + return True + + +def run_create(bugid, tries=1): + if tries == 0: + pmig = phabdb.phdb(db=config.bzmigrate_db, + user=config.bzmigrate_user, + passwd=config.bzmigrate_passwd) + + import_priority = pmig.sql_x("SELECT priority \ + FROM bugzilla_meta \ + WHERE id = %s", (bugid,)) + if import_priority: + pmig.sql_x("UPDATE bugzilla_meta \ + SET priority=%s \ + WHERE id = %s", (ipriority['update_failed'], + bugid)) + else: + elog("%s does not seem to exist" % (bugid)) + pmig.close() + elog('failed to create %s' % (bugid,)) + return False + try: + return create(bugid) + except Exception as e: + import traceback + tries -= 1 + time.sleep(5) + traceback.print_exc(file=sys.stdout) + elog('failed to create %s (%s)' % (bugid, e)) + return run_create(bugid, tries=tries) + +def main(): + bugs = return_bug_list() + from multiprocessing import Pool + pool = Pool(processes=int(config.bz_createmulti)) + _ = pool.map(run_create, bugs) + complete = len(filter(bool, _)) + failed = len(_) - complete + print '%s completed %s, failed %s' % (sys.argv[0], complete, failed) + +if __name__ == '__main__': + main() diff --git a/wmfphablib/phabdb.py b/wmfphablib/phabdb.py index 220ff5f..f621bcf 100755 --- a/wmfphablib/phabdb.py +++ b/wmfphablib/phabdb.py @@ -452,6 +452,26 @@ def set_blocked_task(blocker, blocked): p.close() return get_tasks_blocked(blocker) + +def set_related_project(taskphid, projphid): + projects = get_task_projects(taskphid) + if projphid in projects: + util.vlog("%s project already tied to %s" % (projphid, + taskphid)) + return + + p = phdb(db='phabricator_maniphest', + user=phuser_user, + passwd=phuser_passwd) + + insert_values = (taskphid, 41, projphid, int(time.time()), 0) + p.sql_x("INSERT INTO edge \ + (src, type, dst, dateCreated, seq) \ + VALUES (%s, %s, %s, %s, %s)", + insert_values) + p.close() + return get_task_projects(taskphid) + def phid_hash(): """get a random hash for PHID building""" return os.urandom(20).encode('hex')[:20] @@ -637,6 +657,21 @@ def set_task_title_transaction(taskphid, dateModified)) p.close() +def get_task_projects(taskphid): + + p = phdb(db='phabricator_maniphest', + user=phuser_user, + passwd=phuser_passwd) + + _ = p.sql_x("SELECT dst \ + FROM edge \ + WHERE type = 41 AND src=%s", + (taskphid,), limit=None) + p.close() + if not _: + return [] + return [b[0] for b in _] + def get_tasks_blocked(taskphid): """ get the tasks I'm blocking :param taskphid: str |