--- /dev/null
+#! /usr/bin/env python
+# vim:set encoding=utf-8:
+###############################################################################
+# Copyright:
+# © 2006 Pierre Habouzit <madcoder@debian.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. Neither the name of the University nor the names of its contributors
+# may be used to endorse or promote products derived from this software
+# without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+###############################################################################
+
+"""
+Usage: %s [-n] nnn [remoteUri] [, nnn2 [remoteUri2]]
+
+ -n --dry-run
+ dry run
+ -s --short
+ short run, don't deal with 'Done' bugs.
+
+ nnn the debian bug number
+ remoteUri the url of the remote bug
+
+"""
+
+import sys, os, getopt, threading, time, signal
+import bts, utils
+from remote import RemoteBts
+from utils import BTSLConfig as Cnf
+
+def warn(s):
+ print >> sys.stderr, s
+
+def die(s):
+ print >> sys.stderr, s
+ os.kill(os.getpid(), signal.SIGKILL)
+ sys.exit(1)
+
+def usage(exitCode = 1):
+ die(__doc__.lstrip() % (sys.argv[0].split('/')[-1]))
+
+class Task(threading.Thread):
+ def __init__(self, rbts, res):
+ self.rbts = rbts
+ self.res = res
+ threading.Thread.__init__(self)
+
+ def run(self):
+ self.res += self.rbts.processQueue()
+ return
+
+if __name__ == "__main__":
+ debug = False
+ short = False
+
+ opts, args = getopt.getopt(sys.argv[1:], 'ns', ['dry-run', 'short'])
+ if len(args) < 1: usage(1)
+ for o, v in opts:
+ if o in ('-n', '--dry-run'):
+ debug = True
+ if o in ('-s', '--short'):
+ short = True
+
+ RemoteBts.setup(Cnf.resources())
+ btsi = bts.BtsInterface(Cnf)
+
+ queues = {}
+
+ cmds = [x.split('\007') for x in '\007'.join(args).split('\007,\007')]
+ for c in cmds:
+ if len(c) not in (1, 2): usage(1)
+ if len(c) is 1:
+ btsbug = btsi.getReport(c[0])
+
+ if btsbug is None:
+ warn("#%s does not exist" % (c[0]))
+ continue
+ if not btsbug.forward:
+ if not btsbug.fwdTo:
+ warn("#%s has no forwards" % (c[0]))
+ if len(btsbug.fwdTo) is not 1:
+ warn("#%s has more than one forward" % (c[0]))
+ continue
+
+ fwd = btsbug.forward
+ else:
+ btsbug = btsi.getReport(c[0])
+ if btsbug is None:
+ warn("#%s does not exist" % (c[0]))
+ continue
+
+ fwd = c[1]
+
+ if short and btsbug.done:
+ continue
+
+ rbts = RemoteBts.find(fwd)
+ if not rbts:
+ warn("#%s: not understood: %s" % (btsbug.id, fwd))
+ continue
+ rbts.enqueue(btsbug, fwd)
+
+ try:
+ res = []
+ for _, v in RemoteBts.resources.iteritems():
+ Task(v['bts'], res).start()
+
+ while threading.activeCount() > 1:
+ time.sleep(1)
+
+ per_src = {}
+ for btsbug, cmds in res:
+ if btsbug.srcpackage in per_src:
+ per_src[btsbug.srcpackage] += cmds
+ else:
+ per_src[btsbug.srcpackage] = cmds
+
+ mailer = bts.BtsMailer(debug)
+
+ for spkg, cmds in per_src.iteritems():
+ precmds = []
+ precmds.append("#")
+ precmds.append("# bts-link upstream status pull for source package %s" % (spkg))
+ precmds.append("# see http://lists.debian.org/debian-devel-announce/2006/05/msg00001.html")
+ precmds.append("#")
+ precmds.append("")
+ precmds.append("user %s" % (Cnf.get('general', 'user')))
+ precmds.append("")
+
+ cmds.append('thanks')
+
+ msg = mailer.BtsMail('\n'.join(precmds + cmds))
+ msg['From'] = Cnf.sender()
+ msg['To'] = 'control@bugs.debian.org'
+ msg['Cc'] = "%s, %s@packages.debian.org" % (Cnf.sender(), spkg)
+ msg['Subject'] = '[bts-link] source package %s' % (spkg)
+
+ mailer.sendmail(msg['From'], [msg['To'], msg['From'], "%s@packages.debian.org" % (spkg)], msg)
+
+ mailer.unlink()
+ except KeyboardInterrupt:
+ die("*** ^C...")
+
+# vim:set foldmethod=indent foldnestmax=1: