aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcpettet <rush@wikimedia.org>2014-11-22 08:37:33 -0600
committercpettet <rush@wikimedia.org>2014-11-22 08:37:33 -0600
commitd812b51aaa8835325d44cbba9f2e69ff025fddeb (patch)
tree84e4e33aab84e3c4e5176ddf8026e4421fef3c95
parent39dc0f33cdb4406a42f54f9189a10745d57dc36b (diff)
fixup logic for tags that did not get migrated correctly
-rwxr-xr-xbugzilla_tag_update.py160
-rwxr-xr-xwmfphablib/phabdb.py35
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