diff --git a/integrations/svn/humbug_svn_config.py b/integrations/svn/humbug_svn_config.py new file mode 100644 index 0000000..4789117 --- /dev/null +++ b/integrations/svn/humbug_svn_config.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright © 2013 Humbug, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + + +# Change these values to configure authentication for the plugin +HUMBUG_USER = "svn@example.com" +HUMBUG_API_KEY = "0123456789abcdef0123456789abcdef" + +# commit_notice_destination() lets you customize where commit notices +# are sent to with the full power of a Python function. +# +# It takes the following arguments: +# * path = the path to the svn repository on the server +# * commit = the commit id +# +# Returns a dictionary encoding the stream and subject to send the +# notification to (or None to send no notification). +# +# The default code below will send every commit except for the "master-plan" +# and "secret" repos to +# * stream "commits" +# * subject "deploy => branch_name" (using a pretty unicode right arrow) +def commit_notice_destination(path, commit): + repo = path.split('/')[-1] + if repo not in ["evil-master-plan", "my-super-secret-repository"]: + return dict(stream = "commits", + subject = u"deploy \u21D2 %s" % (repo,)) + + # Return None for cases where you don't want a notice sent + return None + +## If properly installed, the Humbug API should be in your import +## path, but if not, set a custom path below +HUMBUG_API_PATH = None + +# This should not need to change unless you have a custom Humbug subdomain. +HUMBUG_SITE = "https://humbughq.com" diff --git a/integrations/svn/post-commit b/integrations/svn/post-commit new file mode 100755 index 0000000..6b85e9b --- /dev/null +++ b/integrations/svn/post-commit @@ -0,0 +1,71 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Humbug notification post-commit hook. +# Copyright © 2012-2013 Humbug, Inc. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +# The "post-commit" script is run after a transaction is completed and a new +# revision is created. It is passed arguments on the command line in this +# form: +# +# For example: +# /srv/svn/carols 1843 + +import os +import sys +import subprocess +import time +import os.path +import pysvn + +sys.path.insert(0, os.path.dirname(__file__)) +import humbug_svn_config as config + +if config.HUMBUG_API_PATH is not None: + sys.path.append(config.HUMBUG_API_PATH) + +import humbug +client = humbug.Client( + email=config.HUMBUG_USER, + site=config.HUMBUG_SITE, + api_key=config.HUMBUG_API_KEY) +svn = pysvn.Client() + +path, rev = sys.argv[1:] + +# since its a local path, prepend "file://" +path = "file://" + path + +entry = svn.log(path, revision_end=pysvn.Revision(pysvn.opt_revision_kind.number, rev))[0] +message = """**{0}** committed revision r{1} to `{2}`. + +> {3} +""".format(entry['author'], rev, path.split('/')[-1], entry['revprops']['svn:log']) + +destination = config.commit_notice_destination(path, rev) + +message_data = { + "type": "stream", + "to": destination["stream"], + "subject": destination["subject"], + "content": message, +} +client.send_message(message_data)