btsfwd to forward&pull a bug.
authormadcoder <madcoder>
Tue, 23 May 2006 21:51:25 +0000 (21:51 +0000)
committermadcoder <madcoder>
Tue, 23 May 2006 21:51:25 +0000 (21:51 +0000)
btspull will become the cron at some point.

btsfwd [new file with mode: 0755]

diff --git a/btsfwd b/btsfwd
new file mode 100755 (executable)
index 0000000..e8abd1a
--- /dev/null
+++ b/btsfwd
@@ -0,0 +1,163 @@
+#! /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: