#!/usr/bin/env pythonfrom trac.env import Environmentfrom trac.ticket.model import Ticketdef revert_changes(ticket, changed_fields, cursor): for f in ticket.fields: name = f['name'] if name not in changed_fields: continue old, new = changed_fields[name] if ticket[name] != new: continue if f.get('custom'): cursor.execute("UPDATE ticket_custom SET value=%s " "WHERE ticket=%s AND name=%s", (old, ticket.id, name)) else: cursor.execute("UPDATE ticket SET %s=%%s WHERE id=%%s" % name, (old, ticket.id))def delete_spam(envdir): env = Environment(envdir) db = env.get_db_cnx() try: cur = db.cursor() cur.execute("select ticket,time from ticket_change where field = 'comment' and newvalue like '%dynu.net%'") for id,time in cur: ticket = Ticket(env, id, db) cur.execute("select field,oldvalue,newvalue from ticket_change where ticket = %s and time = %s", (id, time)) changed_fields = dict([(field, (old, new)) for field, old, new in cur]) revert_changes(ticket, changed_fields, cur) cur.execute("delete from ticket_change where ticket = %s and time = %s", (id, time)) except Exception: db.rollback() raise else: db.commit()if __name__ == '__main__': import sys for envdir in sys.argv[1:]: delete_spam(envdir)