aboutsummaryrefslogtreecommitdiff
path: root/bugzilla_update_user_comments.py
diff options
context:
space:
mode:
authorcpettet <rush@wikimedia.org>2014-10-16 21:20:08 -0500
committercpettet <rush@wikimedia.org>2014-10-16 21:20:08 -0500
commit9de6eb39b3aed74286474603db4944e6b268fff3 (patch)
tree85e8d6707970b8e6c157fae4a994ef34e4b8dff4 /bugzilla_update_user_comments.py
parentb2ef2806c405c58d7d0ede01ea8da61ab912bca6 (diff)
comment metadata works
Diffstat (limited to 'bugzilla_update_user_comments.py')
-rwxr-xr-xbugzilla_update_user_comments.py210
1 files changed, 210 insertions, 0 deletions
diff --git a/bugzilla_update_user_comments.py b/bugzilla_update_user_comments.py
new file mode 100755
index 0000000..764db05
--- /dev/null
+++ b/bugzilla_update_user_comments.py
@@ -0,0 +1,210 @@
+#!/usr/bin/env python
+import os
+import argparse
+import time
+import json
+import multiprocessing
+import sys
+import collections
+from phabricator import Phabricator
+from wmfphablib import Phab as phabmacros
+from wmfphablib import phabdb
+from wmfphablib import log
+from wmfphablib import util
+from wmfphablib import bzlib
+from wmfphablib import config
+from wmfphablib import vlog
+from wmfphablib import errorlog as elog
+from wmfphablib import epoch_to_datetime
+from wmfphablib import ipriority
+from wmfphablib import now
+from wmfphablib import return_bug_list
+from wmfphablib import ipriority
+
+
+def update(user):
+
+ phab = Phabricator(config.phab_user,
+ config.phab_cert,
+ config.phab_host)
+
+ pmig = phabdb.phdb(db=config.bzmigrate_db,
+ user=config.bzmigrate_user,
+ passwd=config.bzmigrate_passwd)
+
+ phabm = phabmacros('', '', '')
+ phabm.con = phab
+
+ if phabdb.is_bot(user['userphid']):
+ log("%s is a bot no action" % (user['user']))
+ return True
+
+ epriority = phabdb.get_user_relations_priority(user['user'], pmig)
+ if epriority and len(epriority[0]) > 0:
+ if epriority[0][0] == ipriority['update_success']:
+ log('Skipping %s as already updated' % (user['user']))
+ return True
+
+ if not user['issues']:
+ log("%s has no issues to update" % (user['user'],))
+ return True
+
+ for i in user['issues']:
+ comdetails = pmig.sql_x("SELECT comments, xcomments FROM bugzilla_meta WHERE id = %s", (int(i),))
+ jcom, jxcom = comdetails[0]
+ coms = json.loads(jcom)
+ xcoms = json.loads(jxcom)
+
+ for key, xi in xcoms.iteritems():
+ com = coms[util.get_index(coms, "count", int(key))]
+ content = com['text']
+ log("Updating comment %s for %s" % (xi['xctransaction'], user['user']))
+ phabdb.set_comment_author(xi['xctransaction'], user['userphid'])
+ phabdb.set_comment_content(xi['xctransaction'], content + xi['xattached'])
+
+ current = phabdb.get_user_migration_comment_history(user['user'], pmig)
+ if current:
+ log(phabdb.set_user_relations_comments_priority(ipriority['update_success'], user['user'], pmig))
+ else:
+ log('%s user does not exist to update' % (user['user']))
+ return False
+ pmig.close()
+ log(util.purge_cache())
+ return True
+
+def run_update(user, tries=1):
+ if tries == 0:
+ pmig = phabdb.phdb(db=config.bzmigrate_db,
+ user=config.bzmigrate_user,
+ passwd=config.bzmigrate_passwd)
+ current = phabdb.get_user_migration_history(user['user'], pmig)
+ if current:
+ log(phabdb.set_user_relations_priority(ipriority['update_failed'], user['user'], pmig))
+ else:
+ log('%s user does not exist to update' % (user['user']))
+ pmig.close()
+ elog('final fail to update %s' % (user['user'],))
+ return False
+ try:
+ return update(user)
+ except Exception as e:
+ import traceback
+ tries -= 1
+ time.sleep(5)
+ traceback.print_exc(file=sys.stdout)
+ elog('failed to update %s' % (user,))
+ return run_update(user, tries=tries)
+
+def get_user_histories(verified):
+ histories = []
+ pmig = phabdb.phdb(db=config.bzmigrate_db,
+ user=config.bzmigrate_user,
+ passwd=config.bzmigrate_passwd)
+
+ for v in verified:
+ vlog(str(v))
+ saved_history = phabdb.get_user_migration_comment_history(v[1], pmig)
+ if not saved_history:
+ log('%s verified email has no saved history' % (v[1],))
+ continue
+ log('%s is being processed' % (v[1],))
+ history = {}
+ history['user'] = v[1]
+ history['userphid'] = v[0]
+ history['issues'] = saved_history[0]
+ history['created'] = saved_history[1]
+ history['modified'] = saved_history[2]
+ histories.append(history)
+
+ pmig.close()
+ return [util.translate_json_dict_items(d) for d in histories]
+
+def get_verified_users(modtime, limit=None):
+ #Find the task in new Phabricator that matches our lookup
+ verified = phabdb.get_verified_emails(modtime=modtime, limit=limit)
+ create_times = [v[2] for v in verified]
+ try:
+ newest = max(create_times)
+ except ValueError:
+ newest = modtime
+ return verified, newest
+
+def get_verified_user(email):
+ phid, email, is_verified = phabdb.get_user_email_info(email)
+ log("Single verified user: %s, %s, %s" % (phid, email, is_verified))
+ if is_verified:
+ return [(phid, email)]
+ else:
+ log("%s is not a verified email" % (email,))
+ return [()]
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Updates user header metadata from bugzilla')
+ parser.add_argument('-a', action="store_true", default=False)
+ parser.add_argument('-e', action="store", dest='email')
+ parser.add_argument('-m', action="store", dest="starting_epoch", default=None)
+ parser.add_argument('-v', action="store_true", default=False)
+ args = parser.parse_args()
+
+ pmig = phabdb.phdb(db=config.bzmigrate_db,
+ user=config.bzmigrate_user,
+ passwd=config.bzmigrate_passwd)
+
+ if args.a:
+ starting_epoch = phabdb.get_user_relations_last_finish(pmig)
+ users, finish_epoch = get_verified_users(starting_epoch, config.fab_limit)
+ elif args.email:
+ users = get_verified_user(args.email)
+ starting_epoch = 0
+ finish_epoch = 0
+ elif args.starting_epoch:
+ users, finish_epoch = get_verified_users(args.starting_epoch)
+ starting_epoch = args.starting_epoch
+ else:
+ parser.print_help()
+ sys.exit(1)
+
+ if not any(users):
+ log("Existing as there are no new verified users")
+ sys.exit()
+
+ histories = get_user_histories(filter(bool, users))
+ user_count = len(histories)
+
+ icounts = []
+ for u in histories:
+ c = 0
+ if u['issues']:
+ c += len(u['issues'])
+ icounts.append(c)
+ issue_count = sum(icounts)
+
+ log("User Count %s" % (str(user_count)))
+ log("Issue Count %s" % (str(issue_count)))
+
+ pid = os.getpid()
+ phabdb.user_relations_start(pid,
+ int(time.time()),
+ 0,
+ starting_epoch,
+ user_count, issue_count, pmig)
+
+
+ from multiprocessing import Pool
+ pool = Pool(processes=config.fab_multi)
+ _ = pool.map(run_update, histories)
+ complete = len(filter(bool, _))
+ failed = len(_) - complete
+ phabdb.user_relations_finish(pid,
+ int(time.time()),
+ ipriority['update_success'],
+ finish_epoch,
+ complete,
+ failed,
+ pmig)
+ print '%s completed %s, failed %s' % (sys.argv[0], complete, failed)
+ pmig.close()
+
+if __name__ == '__main__':
+ main()