|
| 1 | +#!/usr/bin/ruby |
| 2 | +require 'json' |
| 3 | +require 'net/http' |
| 4 | +require 'yaml' |
| 5 | +require 'logger' |
| 6 | + |
| 7 | +$log = Logger.new(STDOUT) |
| 8 | +$log.level = Logger::DEBUG |
| 9 | + |
| 10 | + |
| 11 | +def get_fixed_issues() |
| 12 | + $log.debug "Searching for for forward merge" |
| 13 | + rev=`git rev-parse -q --verify MERGE_HEAD`.strip |
| 14 | + $log.debug "Found #{rev} from git rev-parse" |
| 15 | + return nil unless rev |
| 16 | + fixed = [] |
| 17 | + message = `git log -1 --pretty=%B #{rev}` |
| 18 | + message.each_line do |line| |
| 19 | + $log.debug "Checking #{line} for message" |
| 20 | + fixed << line.strip if /^(?:Fixes|Closes) gh-(\d+)/.match(line) |
| 21 | + end |
| 22 | + $log.debug "Found fixed issues #{fixed}" |
| 23 | + return fixed; |
| 24 | +end |
| 25 | + |
| 26 | +def rewrite_message(message_file, fixed) |
| 27 | + current_branch = `git rev-parse --abbrev-ref HEAD` |
| 28 | + rewritten_message = "" |
| 29 | + message = File.read(message_file) |
| 30 | + message.each_line do |line| |
| 31 | + match = /^Merge.*branch\ '(.*)'(?:\ into\ (.*))$/.match(line) |
| 32 | + if match |
| 33 | + from_branch = match[1] |
| 34 | + if from_branch.include? "/" |
| 35 | + from_branch = from_branch.partition("/").last |
| 36 | + end |
| 37 | + to_brach = match[2] |
| 38 | + $log.debug "Rewriting merge message" |
| 39 | + line = "Merge branch '#{from_branch}'" + (to_brach ? " into #{to_brach}\n" : "\n") |
| 40 | + end |
| 41 | + if fixed and line.start_with?("#") |
| 42 | + $log.debug "Adding fixed" |
| 43 | + rewritten_message << "\n" |
| 44 | + fixed.each do |fixes| |
| 45 | + rewritten_message << "#{fixes} in #{current_branch}\n" |
| 46 | + end |
| 47 | + fixed = nil |
| 48 | + end |
| 49 | + rewritten_message << line |
| 50 | + end |
| 51 | + return rewritten_message |
| 52 | +end |
| 53 | + |
| 54 | +$log.debug "Running prepare-forward-merge hook script" |
| 55 | + |
| 56 | +message_file=ARGV[0] |
| 57 | +message_type=ARGV[1] |
| 58 | + |
| 59 | +if message_type != "merge" |
| 60 | + $log.debug "Not a merge commit" |
| 61 | + exit 0; |
| 62 | +end |
| 63 | + |
| 64 | +$log.debug "Searching for for forward merge" |
| 65 | +fixed = get_fixed_issues() |
| 66 | +rewritten_message = rewrite_message(message_file, fixed) |
| 67 | +File.write(message_file, rewritten_message) |
0 commit comments