This script is intended for those who wish to push changesets
to lighthouse at push time, and not with a post-commit hook.
Because there's no point in having a distributed SCM if every
commit you do istantaneously goes public to lighthouse.
So, this script adds a new "git lh" command that fetches all the
revs between the remote origin and the current HEAD, and pushes
all of them to lighthouse.
This means that you should first issue git lh and then git push.
Installation (plain_text)
Put the source file alongside the git command, naming it "git-lh".
Configuration (plain_text)
Add the following to your .git/config:
[lighthouse]
token = your_lh_api_token
account = your_lh_account
project = your_lh_project_id
Credits (plain_text)
Original guide: http://github.com/guides/integrating-git-commit-messages-in-lighthouse/
Original script: http://pastie.org/178549
Author: http://github.com/vjt
Added goodies (plain_text)
A nice diffstat in lighthouse changeset messages ;-)
Don't want to issue two commands? Add this simple script:
git-lh-push
#!/bin/bash
git lh && git push
Ruby Source
#!/usr/bin/env ruby
# Install this script as "git-lh", alongside your git command (which git if you're unsure)
# Based on http://pastie.org/178549 by
# Modified by vjt@openssl.it (http://github.com/vjt)
require 'yaml'
require 'cgi'
require 'net/http'
git = `which git`.strip
revs = `#{git} log --pretty=format:%H origin..HEAD`.split(/\n/).reverse
if revs.size.zero?
puts "Already up-to-date."
exit 1
end
LIGHTHOUSE_TOKEN = `#{git} config --get lighthouse.token`.chomp
LIGHTHOUSE_ACCOUNT = `#{git} config --get lighthouse.account`.chomp
LIGHTHOUSE_PROJECT = `#{git} config --get lighthouse.project`.chomp
GITHUB_ACCOUNT, GITHUB_REPOSITORY = `#{git} remote -v`.scan(/(\w+)\/(\w+)\.git/).flatten
puts "* Pushing #{revs.size} revisions to lighthouse"
revs.each do |revision|
author = `#{git} show --pretty=format:"%an" #{revision} | sed q`.chomp
log = `#{git} show --pretty=format:"%s" #{revision} | sed q`.chomp
date = `#{git} show --pretty=format:"%aD" #{revision} | sed q`.chomp
diffstat = `#{git} diff --stat #{revision}^..#{revision}`.chomp.gsub(/\n/, '\& ')
changed = `#{git} diff-tree -r --name-status #{revision} | sed -n '$p'`
changes = changed.split("\n").inject([]) { |memo, line| memo << [$1, $2] if line.strip =~ /(\w)\s+(.*)/ }.to_yaml
xml = <<-EOF
#{CGI.escapeHTML("%s committed new changes to %s" % [author, GITHUB_REPOSITORY])}
#{CGI.escapeHTML(log)}\n
#{"http://github.com/%s/%s/commit/%s" % [ GITHUB_ACCOUNT, GITHUB_REPOSITORY, revision ]}\n
#{CGI.escapeHTML(diffstat)}
#{CGI.escapeHTML(changes)}#{CGI.escapeHTML(revision)}#{CGI.escapeHTML(date.split('(').first.strip)}
EOF
request = Net::HTTP::Post.new("/projects/#{LIGHTHOUSE_PROJECT}/changesets.xml")
request.set_content_type "application/xml"
request.basic_auth LIGHTHOUSE_TOKEN, "x"
request.body = xml
response = Net::HTTP.start("#{LIGHTHOUSE_ACCOUNT}.lighthouseapp.com").request(request)
puts " Pushed rev #{revision} (#{log}). response: #{response.message}"
sleep 0.3
end