--- Begin Message ---
Package: cia-clients
Version: 20081025
Severity: wishlist
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
The attached patch updates the copy of bzr-cia included in cia-clients.
- -- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (650, 'unstable'), (600, 'experimental')
Architecture: i386 (i686)
Kernel: Linux 2.6.29-1-686 (SMP w/2 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Versions of packages cia-clients depends on:
ii python 2.5.4-2 An interactive high-level object-o
ii python-central 0.6.11 register and build utility for Pyt
cia-clients recommends no packages.
Versions of packages cia-clients suggests:
ii bzr 1.14-2 easy to use distributed version co
ii cvs 1:1.12.13-12 Concurrent Versions System
ii darcs 2.2.0-1 a distributed, interactive, smart
ii git-core 1:1.6.2.4-1 fast, scalable, distributed revisi
ii mercurial 1.2-1 scalable distributed version contr
ii subversion 1.6.1dfsg-1 Advanced version control system
- -- no debconf information
diff -r d2fd0351c5f4 bzr-cia/__init__.py
--- a/bzr-cia/__init__.py Sat Oct 25 18:14:34 2008 +0200
+++ b/bzr-cia/__init__.py Tue May 05 17:53:43 2009 +0200
@@ -1,3 +1,19 @@
+# Copyright (C) 2005-2009 Jelmer Vernooij <[email protected]>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
"""Post-commit hook to submit the commit to CIA (http://cia.navi.cx/)
Requires bzr 0.15 or higher.
@@ -21,16 +37,11 @@
version_info = (1, 0, 0, 'dev', 0)
-import socket
-import sys
-import xmlrpclib
-from xml.sax import saxutils
import bzrlib
from bzrlib.branch import Branch
from bzrlib.commands import Command, register_command
from bzrlib.option import Option
-import bzrlib.errors as errors
from bzrlib.trace import info, warning
@@ -53,15 +64,18 @@
pass
-def generate_cia_xml(repository, revid, project, revname=None, author=None):
- revision = repository.get_revision(revid)
- delta = repository.get_revision_delta(revid)
+def generate_cia_xml(branch, revid, project, revname=None, author=None):
+ from xml.sax import saxutils
+ revision = branch.repository.get_revision(revid)
+ delta = branch.repository.get_revision_delta(revid)
if revname is None:
revname = revid
if author is None:
- author = revision.committer
+ authors = revision.get_apparent_authors()
+ else:
+ authors = [author]
files = []
[files.append(f) for (f,_,_) in delta.added]
@@ -69,6 +83,8 @@
[files.append(f) for (_,f,_,_,_,_) in delta.renamed]
[files.append(f) for (f,_,_,_,_) in delta.modified]
+ authors_xml = "".join([" <author>%s</author>\n" % saxutils.escape(author) for author in authors])
+
return """
<message>
<generator>
@@ -85,17 +101,62 @@
<commit>
<revision>%s</revision>
<files>%s</files>
- <author>%s</author>
+ %s
<log>%s</log>
</commit>
</body>
</message>
-""" % (bzrlib.version_string, project, revision.properties['branch-nick'], revision.timestamp, revname,
+""" % (bzrlib.version_string, project, branch.nick, revision.timestamp, revname,
"\n".join(["<file>%s</file>" % saxutils.escape(f) for f in files]),
- saxutils.escape(author),
+ authors_xml,
saxutils.escape(revision.message))
+def cia_cache_dir():
+ from bzrlib.config import config_dir
+ import os
+ return os.path.join(config_dir(), "cia")
+
+
+def store_failed_message(revid, message):
+ import os
+ cache_dir = cia_cache_dir()
+ if not os.path.isdir(cache_dir):
+ os.mkdir(cache_dir)
+ cache_file = os.path.join(cache_dir, revid)
+ f = open(cache_file, 'w')
+ f.write(message)
+ f.close()
+ return cache_file
+
+
+def cia_connect(config):
+ import xmlrpclib
+ server = config.get_user_option('cia_server')
+ if server is None:
+ server = "http://cia.navi.cx"
+
+ return xmlrpclib.ServerProxy(server)
+
+
+class CIADeliverError(Exception):
+
+ def __init__(self, message):
+ self.message = message
+
+
+def cia_deliver(server, msg):
+ import socket, xmlrpclib
+ try:
+ server.hub.deliver(msg)
+ except xmlrpclib.ProtocolError, e:
+ raise CIADeliverError(e.errmsg)
+ except socket.gaierror, (_, errmsg):
+ raise CIADeliverError(errmsg)
+ except socket.error, (_, errmsg):
+ raise CIADeliverError(errmsg)
+
+
def cia_submit(branch, revid, revno, dry_run=False):
config = branch.get_config()
@@ -103,10 +164,6 @@
if project is None:
return
- server = config.get_user_option('cia_server')
- if server is None:
- server = "http://cia.navi.cx"
-
author = config.get_user_option('cia_user')
quiet = config.get_user_option('cia_quiet')
@@ -116,17 +173,17 @@
else:
revspec = revid
- msg = generate_cia_xml(branch.repository, revid, project, revspec, author)
+ msg = generate_cia_xml(branch, revid, project, revspec, author)
if not quiet:
info("Submitting revision to CIA.")
if not dry_run:
try:
- xmlrpclib.ServerProxy(server).hub.deliver(msg)
- except xmlrpclib.ProtocolError, e:
- warning("Unable to submit revision to CIA: %s" % e.errmsg)
- except socket.gaierror, (_, msg):
- warning("Unable to submit revision to CIA: %s" % msg)
+ cia_deliver(cia_connect(config), msg)
+ except CIADeliverError, (error, ):
+ warning("Unable to submit revision to CIA: %s" % error)
+ store_failed_message(revid, msg)
+ info("To retry submit later, run 'bzr cia-submit --pending'.")
else:
print msg
@@ -148,40 +205,63 @@
print config.get_user_option('cia_project')
+def submit_pending(config):
+ import os
+ server = cia_connect(config)
+ cache_dir = cia_cache_dir()
+ for revid in os.listdir(cache_dir):
+ path = os.path.join(cache_dir, revid)
+ msg = open(path, 'r').read()
+ try:
+ cia_deliver(server, msg)
+ except CIADeliverError, (error, ):
+ warning("Submitting %s failed: %s" % (revid, error))
+ else:
+ os.remove(path)
+
+
class cmd_cia_submit(Command):
"""Submit a revision to CIA
"""
takes_args = ['branch?']
takes_options = ['revision',
+ Option('pending',
+ help="Submit all pending CIA submissions."),
Option('dry-run',
help="Show what would be done, but don't actually do anything.")]
- def run(self, branch='.', revision=None,dry_run=False):
- br = Branch.open(branch)
+ def run(self, branch=None, revision=None, dry_run=False, pending=False):
+ if pending and (branch is not None or revision is not None):
+ raise BzrCommandError("--pending and specifying a branch are mutually exclusive")
+ if pending:
+ from bzrlib.config import GlobalConfig
+ submit_pending(GlobalConfig())
+ else:
+ if branch is not None:
+ branch = "."
+ br = Branch.open(branch)
- if revision is None:
- revs = [br.last_revision()]
- elif len(revision) == 1:
- revs = [revision[0].in_history(br).rev_id]
- elif len(revision) == 2:
- if revision[0].spec is None:
- from_revno = 1
+ if revision is None:
+ revs = [br.last_revision()]
+ elif len(revision) == 1:
+ revs = [revision[0].in_history(br).rev_id]
+ elif len(revision) == 2:
+ if revision[0].spec is None:
+ from_revno = 1
+ else:
+ from_revno = revision[0].in_history(br).revno
+
+ if revision[1].spec is None:
+ to_revno = br.revno()
+ else:
+ to_revno = revision[1].in_history(br).revno
+ revs = br.revision_history()[from_revno:to_revno]
else:
- from_revno = revision[0].in_history(br).revno
+ raise BzrCommandError('bzr submit-cia --revision takes one or two arguments')
- if revision[1].spec is None:
- to_revno = br.revno()
- else:
- to_revno = revision[1].in_history(br).revno
- revs = br.revision_history()[from_revno:to_revno]
- else:
- raise BzrCommandError('bzr submit-cia --revision takes one or two arguments')
-
- for rev_id in revs:
- cia_submit(br, rev_id, br.revision_id_to_revno(rev_id), dry_run)
-
- return 0
+ for rev_id in revs:
+ cia_submit(br, rev_id, br.revision_id_to_revno(rev_id), dry_run)
register_command(cmd_cia_project)
@@ -202,7 +282,7 @@
def test_suite():
from unittest import TestSuite, TestLoader
- import tests
+ from bzrlib.plugins.cia import tests
suite = TestSuite()
suite.addTest(tests.test_suite())
return suite
diff -r d2fd0351c5f4 bzr-cia/tests/test_xml.py
--- a/bzr-cia/tests/test_xml.py Sat Oct 25 18:14:34 2008 +0200
+++ b/bzr-cia/tests/test_xml.py Tue May 05 17:53:43 2009 +0200
@@ -28,7 +28,7 @@
revid = tree.commit("bla", timestamp=1180551778,
committer="Jelmer Vernooij <[email protected]>")
- xml = generate_cia_xml(tree.branch.repository, revid, "myproject")
+ xml = generate_cia_xml(tree.branch, revid, "myproject")
self.assertEqualDiff("""
<message>
@@ -57,7 +57,7 @@
tree = self.make_branch_and_tree("bla")
revid = tree.commit("bla", timestamp=1180551778)
- xml = generate_cia_xml(tree.branch.repository, revid, "myproject",
+ xml = generate_cia_xml(tree.branch, revid, "myproject",
author="somebody")
self.assertEqualDiff("""
@@ -87,7 +87,7 @@
tree = self.make_branch_and_tree("bla")
revid = tree.commit("bla", timestamp=1180551778)
- xml = generate_cia_xml(tree.branch.repository, revid, "myproject",
+ xml = generate_cia_xml(tree.branch, revid, "myproject",
revname="42", author="somebody")
self.assertEqualDiff("""
--- End Message ---