// ==UserScript==
// @name PT - full story life cycle
// @version 0.9
// @description track stories to PR and to deploy
// @match https://www.pivotaltracker.com/s/projects/*
// @author Karlotcha Hoa
// ==/UserScript==
setTimeout( function(){
// **************************************************************************
// PT models
// **************************************************************************
var project = tracker.Project.current()
, stories = project.stories()
, labels = project.labels()
, label_merge = labels.findByName('needs merge')
, label_deploy = labels.findByName('needs deploy')
, label_live = labels.findByName('live')
if (!label_merge) label_merge = labels.create({name:'needs merge'})
if (!label_deploy) label_deploy = labels.create({name:'needs deploy'})
if (!label_live) label_live = labels.create({name:'live'})
// **************************************************************************
// buttons
// **************************************************************************
$("body").delegate('.button.accept','click', function(){
var cid = $(this).parents().filter('.story').data('cid')
, story = stories.get(cid)
setTimeout(function(){
story.labels().add(label_merge)
story.save(story.changed)
},1000)
})
$("body").delegate('.button.merged','click', function(){
var cid = $(this).parents().filter('.story').data('cid')
, story = stories.get(cid)
$(this).parents().filter('header').find('.label:contains("needs merge")').remove()
$(this).remove()
story.labels().remove(label_merge)
story.labels().add(label_deploy)
story.save(story.changed)
})
$("body").delegate('.button.deployed','click', function(){
var cid = $(this).parents().filter('.story').data('cid')
, story = stories.get(cid)
$(this).parents().filter('header').find('.label:contains("needs deploy")').remove()
$(this).remove()
story.labels().remove(label_deploy)
story.labels().add(label_live)
story.save(story.changed)
})
// **************************************************************************
// main loop - creating mandatory buttons
// **************************************************************************
function main(){
var $states_merge = $('.accepted .label:contains("needs merge")')
.parents()
.filter('header')
.find('span.state')
$states_merge.each(function(){
var $state = $(this)
if ($state.find('.merged').length == 0)
$state.append('')
// automatic merge if PR-merge comment found
var cid = $state.parents().filter('.story').data('cid')
, story = stories.get(cid)
if (!story) return
var comments = story.comments()
, $button_merge = $state.find('.merged')
comments.each(function(comment) {
if (comment.get("commit_message") &&
comment.get("commit_message").lastIndexOf("Merge pull request #") >= 0 &&
$button_merge.length != 0)
$button_merge.trigger("click")
})
})
var $states_deploy = $('.accepted .label:contains("needs deploy")')
.parents()
.filter('header')
.find('span.state')
$states_deploy.each(function(){
var $state = $(this)
if ($state.find('.deployed').length == 0)
$state.append('')
})
}
for (var i = 1; i<10; i=i+2) setTimeout(main, i*1000)
setInterval(main, 60000)
$('body').click(function(){setTimeout(main, 1000)})
// **************************************************************************
// style
// **************************************************************************
var $style = $('')
$style.attr('type', 'text/css')
.append('.button.merged { color: #eee; background-color: #470047; border-color: #470047; }')
.append('.button.deployed { color: #eee; background-color: #003D00; border-color: #003D00; }')
$('head').append($style)
}, 10000);