#!env ruby # # add_commit_todo.rb # AddCommitTodo # # Copyright 2010 Paul Codding # All rights reserved. # # Released under the BSD license. require File.dirname(__FILE__) + '/basecamp' require 'time' class AddCommitTodo PROJECT_NAME = "Your Project" TODO_LIST_NAME = "Your To-Do List that could be named 'Commits To Be Merged'" BASECAMP_URL = "yourcompany.basecamphq.com" BASECAMP_USER = "yourusername" BASECAMP_PASSWORD = "yourpassword" BASECAMP_USE_SSL = true SVNLOOK_PATH = "/usr/bin/svnlook" def initialize(repo_path, revision) if (repo_path && revision) @repo_path = repo_path @revision = revision @session = Basecamp.establish_connection!(BASECAMP_URL, BASECAMP_USER, BASECAMP_PASSWORD, BASECAMP_USE_SSL) else usage() exit(1) end end def usage warn "Please specify the repo path and the revision... e.g. 'ruby add_commit_todo.rb /home/paul/svn/project 100'" end def add_todo # Determine the To-Do content using svnlook svn_log = `#{SVNLOOK_PATH} log #{@repo_path} --revision #{@revision}` svn_log.strip! puts "[D] SVN Log output for revision: #{@revision} - '#{svn_log}'" if svn_log.include?("erge") || svn_log.include?("maven") puts "[!] Not adding To-Do as this is a Merge operation" else # Find the correct project Basecamp::Project.find(:all).each { |project| project.name.eql?(PROJECT_NAME) ? @project = project : nil } Basecamp::TodoList.all(@project.id, false).each { |todo_list| todo_list.name.eql?(TODO_LIST_NAME) ? @todo_list = todo_list : nil } puts "[*] Adding merge To-Do to list: '#{@todo_list.name} (#{@todo_list.id})'" @todo_item = Basecamp::TodoItem.new(:todo_list_id => @todo_list.id) @todo_item.content = "[ r#{@revision} ] - #{svn_log}" @todo_item.responsible_party = "c#{@project.company.id}" @todo_item.notify = true puts "[*] Saving To-Do Item with content: '#{svn_log}'" @todo_item.save end end end act = AddCommittTodo.new(ARGV[0], ARGV[1]) act.add_todo