Hello, this is a bridge between Subversion (svn) and Twitter, the intent of this tool is to update a Twitter account when new commit messages arrives in a Subversion repository. We almost never have access to svn repository to add a post-commit hook in a way to call our script and send updates to twitter, so this tool was done to overcome that situation. Using it, you can monitor for example a svn repository from Google Hosting, from Sourceforge.net, etc…
The process of the tool is simple: it will firstly check Twitter account for the last svn commit message (the messages always start with a “$” prefix, or with another user-defined prefix), and then it will check the svn repository server to verify if it has new commits compared to the last tweet revision, if it has, it will update twitter with newer commit messages.
Here is a simple example of a Twitter account updated with commit messages:
The tool is very simple to use in command-line:
Python的twittsvn v.0.1克里斯蒂安S. Perone //www.cpetem.com用法:twittsvn.py [选项]选项:-h,--help显示此帮助信息并退出Twitter的选项:Twitter的会计选项-u TWITTER_USERNAME金宝搏188官方,--username =金宝搏188官方 TWITTER_USERNAME Twitter用户名(必需)。-p 金宝搏188官方TWITTER_PASSWORD,--password = TWITTER_PASSWORD微博密码(必需)。-r 金宝搏188官方TWITTER_REPONAME,--reponame = TWITTER_REPONAME库名称(需要)。-c 金宝搏188官方TWITTER_COUNT,--twittercount = TWITTER_COUNT多少鸣叫从Twitter获取,默认值是 '30'。颠覆选项:Subversion的选项-s SVN_PATH,--spath = SVN_PATH颠覆路径,默认为 ''。-n SVN_NUMLOG,--numlog = SVN的SVN_NUMLOG数记录得到的,默认为 '5'。
这里是一个简单的例子:
#蟒蛇twittsvn.py -u TWITTE金宝搏188官方R_USERNAME -p twitter_password \ -r any_repository_name
你必须在一个仓库目录执行它(而不是服务器,本地文件),或使用“-s”选项来指定本地存储库的路径。你应该把这个脚本使用cron或类似的东西来执行periodicaly。
要使用这个工具,你必须安装pysvn和python-twitter. To install Python-twitter you can use “easy_install python-twitter”, but for pysvn you must check the download section at the project site.
Here is the source-code of the twittsvn.py:
#中的python-twittsvn - 一个SV金宝搏188官方N / Twitter的桥#版权所有(C)2009基督教S. Perone ##这个程序是免费软件:您可以重新分配和/或发表修改#它在GNU通用公共许可证的条款#自由软件基金会,无论是牌照的第3版,或#(由你选择)任何更新的版本。##本程序是基于希望,这将是有用的,但#无任何担保。甚至没有#适销性或适用于特定用途的隐含担保。详情请参见该#GNU通用公共许可证。##你应该已经收到一份GNU通用公共许可证#的副本连同本程序。如果不是看到。从进口optparse进口OptionParser SYS进口重新导入时,选项组__version__ = “0.1” __author__ = “基督教S. Perone” TWITTER_PREFIX = “$” TWITTER_MSG = TWITTER_PREFI金宝搏188官方X +“[%s]的修订版%的[%s]的%S d:%s的“尝试:进口pysvn除了导入错误:养导入错误,‘pysvn没有找到,检查http://pysvn.tigris.org/project_downloads.html’尝试:除了导入错误导入Twitter的:提高导入错误,”蟒蛇,叽叽喳喳未找到金宝搏188官方检查http://code.google.com/p/python-twitte金宝搏188官方r “DEF ssl_server_trust_prompt(trust_dict):返回TRUE,如图5所示,真DEF run_main():解析器= OptionParser()打印”。Python的twittsvn v%S \ n根据%的 “%(__version__,__author__)打印的 ”http://www.cpetem.com \ n“ 个group_tw金宝搏188官方itter =选项组(解析器, ”推选项“, ”微博会计选项“)group_twitter.add_option( ” - U“,”--username”,DEST = 金宝搏188官方“TWITTER_USERNAME”,帮助= “Twitter用户名(必需)”,类型= “字符串”)group_twitter.add_option( “ - p”, “ - 密码”,DEST = “twitter_password”,帮助= 金宝搏188官方“推密码(必需)。”, type="string") group_twitter.add_option("-r", "--reponame", dest="twitter_reponame", help="Repository name (required).", type="string") group_twitter.add_option("-c", "--twittercount", dest="twitter_count", help="How many tweets to fetch from Twitter, default is '30'.", type="int", default=30) parser.add_option_group(group_twitter) group_svn = OptionGroup(parser, "Subversion Options", "Subversion Options") group_svn.add_option("-s", "--spath", dest="svn_path", help="Subversion path, default is '.'.", default=".", type="string") group_svn.add_option("-n", "--numlog", dest="svn_numlog", help="Number of SVN logs to get, default is '5'.", default=5, type="int") parser.add_option_group(group_svn) (options, args) = parser.parse_args() if options.twitter_username is None: parser.print_help() print "\nError: you must specify a Twitter username !" return if options.twitter_password is None: parser.print_help() print "\nError: you must specify a Twitter password !" return if options.twitter_reponame is None: parser.print_help() print "\nError: you must specify any repository name !" return twitter_api = twitter.Api(username=options.twitter_username, password=options.twitter_password) twitter_api.SetCache(None) # Dammit cache ! svn_api = pysvn.Client() svn_api.callback_ssl_server_trust_prompt = ssl_server_trust_prompt print "Checking Twitter synchronization..." status_list = twitter_api.GetUserTimeline(options.twitter_username, count=options.twitter_count) print "Got %d statuses to check..." % len(status_list) last_twitter_commit = None for status in status_list: if status.text.startswith(TWITTER_PREFIX): print "SVN Commit messages found !" last_twitter_commit = status break print "Checking SVN logs for ['%s']..." % options.svn_path log_list = svn_api.log(options.svn_path, limit=options.svn_numlog) if last_twitter_commit is None: print "No twitter SVN commit messages found, posting last %d svn commit messages..." % options.svn_numlog log_list.reverse() for log in log_list: message = log["message"].strip() date = time.ctime(log["date"]) if len(message) <= 0: message = "(no message)" twitter_api.PostUpdate(TWITTER_MSG % (options.twitter_reponame, log["revision"].number, log["author"], date, message)) print "Posted %d svn commit messages to twitter !" % len(log_list) else: print "SVN commit messages found in twitter, checking last revision message...." msg_regex = re.compile(r'Rev\. (\d+) by') last_rev_twitter = int(msg_regex.findall(last_twitter_commit.text)[0]) print "Last revision detected in twitter is #%d, checking for new svn commit messages..." % last_rev_twitter rev_num = pysvn.Revision(pysvn.opt_revision_kind.number, last_rev_twitter+1) try: log_list = svn_api.log(options.svn_path, revision_end=rev_num, limit=options.svn_numlog) except pysvn.ClientError: print "No more revisions found !" log_list = [] if len(log_list) <= 0: print "No new SVN commit messages found !" print "Updated !" return log_list.reverse() print "Posting new messages to twitter..." posted_new = 0 for log in log_list: message = log["message"].strip() date = time.ctime(log["date"]) if len(message) <= 0: message = "(no message)" if log["revision"].number > last_rev_twitter: twitter_api.PostUpdate(TWITTER_MSG % (options.twitter_reponame, log["revision"].number, log["author"], date, message )) posted_new+=1 print "Posted new %d messages to twitter !" % posted_new print "Updated!" if __name__ == "__main__": run_main()