If you need to report work time in JIRA and native comment hashes are not suitable for you, there is simple Groovy script that does the same and can be adjusted to particular scenario or configuration:
It uses a bunch of command line parameters - first is either prod or test; test just prints tasks, prod sends them to JIRA. There is an example CLI command:
@GrabResolver(name='test', root='https://maven.atlassian.com/content/groups/public/') @Grab( group ='com.atlassian.jira.plugins', module = 'jira-soapclient', version = '4.4' ) @Grab(group='org.eclipse.jgit', module='org.eclipse.jgit', version='3.3.2.201404171909-r') import com.atlassian.jira.rpc.soap.client.JiraSoapServiceServiceLocator import com.atlassian.jira.rpc.soap.client.RemoteWorklog import groovy.transform.TailRecursive import org.eclipse.jgit.lib.Repository import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.storage.file.FileRepositoryBuilder import java.text.SimpleDateFormat import static java.util.Calendar.* @TailRecursive static Set<RevCommit> subcommits(RevCommit commit, int start, RevWalk walk, def all) { if (commit.commitTime > start) { all << commit commit.parents.collect{ walk.parseCommit(it) }.each { subcommits(it, start, walk, all) } } return all } Repository repository = new FileRepositoryBuilder().setGitDir(new File(args[3])).setMustExist(true).build() RevWalk walk = new RevWalk(repository) def formattime = new SimpleDateFormat('yyyy-MM-dd') formattime.setTimeZone(TimeZone.getTimeZone("UTC")) Date start = formattime.parse(args[4]) Date end = formattime.parse(args[5]) def all = subcommits(walk.parseCommit(repository.resolve("HEAD")), start.time / 1000L as int, walk, new HashSet()) def mine = all.findAll{ it.authorIdent.name == args[6] && it.fullMessage =~ /^PRJ-[0-9]+/ } def actual = mine.min{ it.commitTime } def tasks = (start..end).findAll{!(it[DAY_OF_WEEK] in [SUNDAY, SATURDAY])}.collect {date -> actual = mine.find{ date.time / 1000L <= it.commitTime && (date + 1).time / 1000L > it.commitTime } ?: actual [date:date, task:(actual.fullMessage =~ /(PRJ-[0-9]+)/)[0][1]] } if (args[0] == 'test') { tasks.each { println "${it.date} - ${it.task}" } } else if (args[0] == 'prod') { def jiraSoapService = new JiraSoapServiceServiceLocator().getJirasoapserviceV2(new URL('http://jira.com/rpc/soap/jirasoapservice-v2')) String token = jiraSoapService.login(args[1], args[2]) tasks.each { jiraSoapService.addWorklogAndRetainRemainingEstimate(token, it.task, new RemoteWorklog(timeSpent: "8h", startDate:it.date.toCalendar())) } }
It uses a bunch of command line parameters - first is either prod or test; test just prints tasks, prod sends them to JIRA. There is an example CLI command:
groovy gittotempo.groovy prod jirauser jirapassword c:\work\project\.git 2014-08-01 2014-08-31 gituser