Skip to content

Instantly share code, notes, and snippets.

@karuppasamy
Created July 25, 2016 04:17
Show Gist options
  • Save karuppasamy/ba246b0de944c2f2392e2719df1106fa to your computer and use it in GitHub Desktop.
Save karuppasamy/ba246b0de944c2f2392e2719df1106fa to your computer and use it in GitHub Desktop.
Git Pre-push - Notify on Pivotal Tracker
#!/usr/bin/env ruby
# encoding: UTF-8
# Atlassian Stash and Pivotal Tracker Integration
# ===============================================
# - Post commit message details on Pivotal Tracker's user story
# Usage
# =====
# Create a branch with hash(#) + user story id. (#123467)
# Ex:
# ch_#12345678_short_description_of_the_story - Chore
# ft_#12345678_short_description_of_the_story - Features
# bg_#12345678_short_description_of_the_story - Bug
# rl_#12345678_short_description_of_the_story - Release
#
# If the branch name don't have a user story ID,
# then, add a branch ID in square bracket along with commit message.
# Ex:
# [#12345678] Create a new file
# Create a new file [#12345678]
# Create a [#12345678] new file
require 'net/https'
require 'json'
class GitLogs
attr_accessor :raw_log, :commit_data
def initialize
self.raw_log = `git log --no-color --format='Commit: %h%nAuthor: %aN <%aE>%nMessage: %s%nRefs: %d' -1`.force_encoding('utf-8')
parse!
self
end
def parse!
regexp = /Commit:\ (.*)\nAuthor:\ (.*)\nMessage:\ (.*)\nRefs:\ \ \((.*)\)/i
match = raw_log.scan(regexp).flatten
self.commit_data = GitLog.new(match[0], match[1], match[2], match[3])
end
def pivotal_sync!
Pivotal.new(commit_data).send! if commit_has_story_id?
end
def commit_has_story_id?
!commit_data.message.scan(/\[+\#(\d+)\D?(.*)\]/).empty?
end
end
class GitLog
attr_accessor :hash, :author, :message, :refs
SOURCE_CONTROL_URL = 'http://www.ida-gds.com/stash/projects/BGP/repos/bgp-react/commits/'
def initialize hash, author, message, refs
self.hash = hash
self.author = author
self.message = message
self.refs = refs
updated_message
end
def updated_message
return message if ids_from_refs.empty?
ids = ids_from_refs.join(' ')
self.message = if message.scan(/\[(.+)\]/).empty?
"[#{ids}] #{message}"
else
index = message.index('[') + 1
message.insert index, "#{ids} "
end
end
def ids_from_refs
refs.split(',').inject([]) do |result, ref|
id = ref.scan(/\#(\d+)\D/i).flatten
result << "##{id.first}" unless id.empty?
result
end.flatten
end
def to_json
{ source_commit:
{ commit_id: self.hash,
author: self.author,
message: self.message,
url: "#{SOURCE_CONTROL_URL}#{self.hash}"
}
}.to_json
end
end
class Pivotal
attr_accessor :git_log, :tracker_token
BASE_URI = URI('https://www.pivotaltracker.com/')
def initialize git_log
self.git_log = git_log
self.tracker_token = get_token
end
def get_token
`git config --get pivotal.token`.strip
end
def send!
https = Net::HTTP.start(BASE_URI.host, 443, {
use_ssl: true,
verify_mode: OpenSSL::SSL::VERIFY_NONE
})
request = Net::HTTP::Post.new('/services/v5/source_commits')
request['X-TrackerToken'] = tracker_token
request['Content-type'] = 'application/json'
request.body = git_log.to_json
response = https.request(request)
puts "********* Commit posted successfully on Pivotal Tracker *********"
end
end
GitLogs.new().pivotal_sync!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment