When a branch is being deleted, do not enforce the commit blacklist in
[arvados-dev.git] / git / hooks / enforce-dco-signoff.rb
1 #!/usr/bin/env ruby
2
3 # This script can be installed as a git update hook.
4
5 # It can also be installed as a gitolite 'hooklet' in the
6 # hooks/common/update.secondary.d/ directory.
7
8 # NOTE: this script runs under the same assumptions as the 'update' hook, so
9 # the starting directory must be maintained and arguments must be passed on.
10
11 $refname = ARGV[0]
12 $oldrev  = ARGV[1]
13 $newrev  = ARGV[2]
14 $user    = ENV['USER']
15
16 puts "Enforcing DCO signoff: (#{$refname}) (#{$oldrev[0,6]}) (#{$newrev[0,6]})"
17
18 $regex = /\[ref: (\d+)\]/
19
20 $arvados_DCO = /Arvados-DCO-1.1-Signed-off-by:/
21
22 # enforced DCO signoff in commit message
23 def check_message_format
24   if ($newrev[0,6] ==  '000000')
25     # A branch is being deleted. Do not check old commits for DCO signoff!
26     all_revs    = []
27   elsif ($oldrev[0,6] ==  '000000')
28     if $refname != 'refs/heads/master'
29       # A new branch was pushed. Check all new commits in this branch.
30       all_revs  = `git log --pretty=format:%H master..#{$newrev}`.split("\n")
31     else
32       # When does this happen?
33       all_revs  = [$newrev]
34     end
35   else
36     all_revs    = `git rev-list --first-parent #{$oldrev}..#{$newrev}`.split("\n")
37   end
38
39   broken = false
40
41   all_revs.each do |rev|
42     message = `git cat-file commit #{rev} | sed '1,/^$/d' | grep -E "Arvados-DCO-1.1-Signed-off-by: .+@.+\..+"`
43
44     if ! $arvados_DCO.match(message)
45       puts "\n[POLICY] Rejected commit: missing Arvados-DCO-1.1-Signed-off-by line"
46       puts "\n******************************************************************\n"
47       puts "\nOffending commit: #{rev}\n"
48       puts "\nOffending commit message:\n\n"
49       puts `git cat-file commit #{rev} | sed '1,/^$/d'`
50       puts "\n******************************************************************\n"
51       puts "\n\n"
52       puts "\nFor more information, see\n"
53       puts "\n  https://dev.arvados.org/projects/arvados/wiki/Developer_Certificate_Of_Origin\n"
54       puts "\n\n"
55       broken = true
56     end
57   end
58
59   if broken
60     exit 1
61   end
62 end
63
64 check_message_format