ruby_git_hooks 0.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +19 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +327 -0
- data/Rakefile +7 -0
- data/TODO +67 -0
- data/bin/git-add-hooks +111 -0
- data/bin/git-clone +57 -0
- data/bin/git-hclone +57 -0
- data/lib/ruby_git_hooks/all.rb +7 -0
- data/lib/ruby_git_hooks/case_clash.rb +30 -0
- data/lib/ruby_git_hooks/copyright_check.rb +181 -0
- data/lib/ruby_git_hooks/email_notify.rb +50 -0
- data/lib/ruby_git_hooks/git_ops.rb +93 -0
- data/lib/ruby_git_hooks/jira_add_comment.rb +354 -0
- data/lib/ruby_git_hooks/jira_ref_check.rb +32 -0
- data/lib/ruby_git_hooks/max_file_size.rb +32 -0
- data/lib/ruby_git_hooks/non_ascii.rb +33 -0
- data/lib/ruby_git_hooks/ruby_debug.rb +26 -0
- data/lib/ruby_git_hooks/version.rb +5 -0
- data/lib/ruby_git_hooks/watermark.rb +27 -0
- data/lib/ruby_git_hooks.rb +343 -0
- data/ruby_git_hooks.gemspec +37 -0
- data/test/basic_hook_test.rb +143 -0
- data/test/case_clash_hook_test.rb +58 -0
- data/test/copyright_check_test.rb +162 -0
- data/test/fake_curl +12 -0
- data/test/fake_mailer +5 -0
- data/test/jira_add_comment_test.rb +151 -0
- data/test/jira_ref_check_test.rb +37 -0
- data/test/max_file_size_hook_test.rb +52 -0
- data/test/multi_hook_test.rb +77 -0
- data/test/non_ascii_hook_test.rb +47 -0
- data/test/repos/.keep +0 -0
- data/test/test_helper.rb +17 -0
- data/test/watermark_test.rb +39 -0
- metadata +226 -0
@@ -0,0 +1,162 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
require "minitest/autorun"
|
6
|
+
require "pony"
|
7
|
+
|
8
|
+
class RealCopyrightCheckHookTest < HookTestCase
|
9
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
10
|
+
FAKE_MAILER = File.join(File.dirname(__FILE__), "fake_mailer")
|
11
|
+
MAILER_FILE = File.join(File.dirname(__FILE__), "mail_params")
|
12
|
+
TEST_HOOK_BASIC = <<TEST
|
13
|
+
#{RubyGitHooks.shebang}
|
14
|
+
require "ruby_git_hooks/copyright_check"
|
15
|
+
|
16
|
+
RubyGitHooks.register CopyrightCheckHook.new("domain" => "example.com",
|
17
|
+
"from" => "Copyright Enforcement <noreply@example.com>",
|
18
|
+
"via" => :sendmail,
|
19
|
+
"via_options" => {
|
20
|
+
:location => #{FAKE_MAILER.inspect},
|
21
|
+
:arguments => '#{MAILER_FILE.inspect}'
|
22
|
+
}
|
23
|
+
)
|
24
|
+
|
25
|
+
RubyGitHooks.run
|
26
|
+
TEST
|
27
|
+
|
28
|
+
TEST_HOOK_COMPANY = <<TEST
|
29
|
+
#{RubyGitHooks.shebang}
|
30
|
+
require "ruby_git_hooks/copyright_check"
|
31
|
+
|
32
|
+
RubyGitHooks.register CopyrightCheckHook.new("domain" => "example.com",
|
33
|
+
"from" => "Copyright Enforcement <noreply@example.com>",
|
34
|
+
"company_check" => /YoYoDyne (Industries)?/i,
|
35
|
+
"via" => :sendmail,
|
36
|
+
"via_options" => {
|
37
|
+
:location => #{FAKE_MAILER.inspect},
|
38
|
+
:arguments => '#{MAILER_FILE.inspect}'
|
39
|
+
}
|
40
|
+
)
|
41
|
+
|
42
|
+
RubyGitHooks.run
|
43
|
+
TEST
|
44
|
+
|
45
|
+
TEST_HOOK_NO_SEND = <<TEST
|
46
|
+
#{RubyGitHooks.shebang}
|
47
|
+
require "ruby_git_hooks/copyright_check"
|
48
|
+
|
49
|
+
RubyGitHooks.run CopyrightCheckHook.new("no_send" => true)
|
50
|
+
TEST
|
51
|
+
|
52
|
+
TEST_HOOK_EXCLUDE = <<TEST
|
53
|
+
#{RubyGitHooks.shebang}
|
54
|
+
require "ruby_git_hooks/copyright_check"
|
55
|
+
|
56
|
+
RubyGitHooks.register CopyrightCheckHook.new("domain" => "example.com",
|
57
|
+
"from" => "Copyright Enforcement <noreply@example.com>",
|
58
|
+
"via" => :sendmail,
|
59
|
+
"via_options" => {
|
60
|
+
:location => #{FAKE_MAILER.inspect},
|
61
|
+
:arguments => '#{MAILER_FILE.inspect}'
|
62
|
+
},
|
63
|
+
"exclude_files" => ["schema.rb"]
|
64
|
+
)
|
65
|
+
|
66
|
+
RubyGitHooks.run
|
67
|
+
TEST
|
68
|
+
|
69
|
+
def setup
|
70
|
+
# Empty out the test repos dir
|
71
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
72
|
+
|
73
|
+
# Remove test mail file
|
74
|
+
Hook.shell! "rm -f #{MAILER_FILE}"
|
75
|
+
raise "Couldn't delete #{MAILER_FILE}!" if File.exist? MAILER_FILE
|
76
|
+
|
77
|
+
# Create local parent and child repos with a single shared commit
|
78
|
+
Dir.chdir REPOS_DIR
|
79
|
+
|
80
|
+
new_bare_repo
|
81
|
+
clone_repo
|
82
|
+
new_commit "child_repo", "README"
|
83
|
+
git_push
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_copyright_post_commit
|
87
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_BASIC)
|
88
|
+
|
89
|
+
new_commit("child_repo", "file_w_no_copy_notice.rb", <<FILE_CONTENTS)
|
90
|
+
# No copyright notice!
|
91
|
+
FILE_CONTENTS
|
92
|
+
|
93
|
+
mail_out = File.read MAILER_FILE
|
94
|
+
|
95
|
+
# Should get email with the most recent commit about
|
96
|
+
# file_w_no_copy_notice.rb, which has no copyright notice.
|
97
|
+
assert mail_out.include?(last_commit_sha[0..6]),
|
98
|
+
"Mail message must include latest SHA!"
|
99
|
+
assert mail_out.include?("file_w_no_copy_notice.rb"),
|
100
|
+
"Mail message must mention file_w_no_copy_notice.rb!"
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_copyright_no_send_option
|
104
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_NO_SEND)
|
105
|
+
|
106
|
+
new_commit("child_repo", "file_w_no_copy_notice_but_nosend.rb", <<FILE_CONTENTS)
|
107
|
+
# No copyright notice!
|
108
|
+
FILE_CONTENTS
|
109
|
+
|
110
|
+
assert !File.exist?(MAILER_FILE),
|
111
|
+
"Copyright test must not send email if 'no_send' is set!"
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_copyright_basic_correct
|
115
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_BASIC)
|
116
|
+
|
117
|
+
new_commit("child_repo", "correct_file.rb", <<FILE_CONTENTS)
|
118
|
+
# Copyright (C) 1941-2013 YoyoDyne, Inc. All Rights Reserved.
|
119
|
+
FILE_CONTENTS
|
120
|
+
|
121
|
+
assert !File.exist?(MAILER_FILE), "Copyright test must not send email!"
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_copyright_company_correct
|
125
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_COMPANY)
|
126
|
+
|
127
|
+
new_commit("child_repo", "correct_file.rb", <<FILE_CONTENTS)
|
128
|
+
# Copyright (C) 1941-2013 YoyoDyne Industries All Rights Reserved.
|
129
|
+
FILE_CONTENTS
|
130
|
+
|
131
|
+
assert !File.exist?(MAILER_FILE), "Copyright test must not send email!"
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_copyright_company_incorrect
|
135
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_COMPANY)
|
136
|
+
|
137
|
+
new_commit("child_repo", "correct_file.rb", <<FILE_CONTENTS)
|
138
|
+
# Copyright (C) 1941-2013 YoyoWrong All Rights Reserved.
|
139
|
+
FILE_CONTENTS
|
140
|
+
|
141
|
+
assert File.exist?(MAILER_FILE), "Must email about wrong company name!"
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_copyright_no_first_year
|
145
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_BASIC)
|
146
|
+
|
147
|
+
new_commit("child_repo", "correct_file_single_year.rb", <<FILE_CONTENTS)
|
148
|
+
# Copyright (C) 2013 YoyoDyne, Inc. All Rights Reserved.
|
149
|
+
FILE_CONTENTS
|
150
|
+
|
151
|
+
assert !File.exist?(MAILER_FILE), "Copyright test must not send email!"
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_copyright_exclude_files
|
155
|
+
add_hook("child_repo", "post-commit", TEST_HOOK_EXCLUDE)
|
156
|
+
new_commit("child_repo", "schema.rb", <<FILE_CONTENTS)
|
157
|
+
# NO copyright but I'm an excluded file.
|
158
|
+
FILE_CONTENTS
|
159
|
+
assert !File.exist?(MAILER_FILE), "Copyright test must not send email!"
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
data/test/fake_curl
ADDED
data/test/fake_mailer
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
require "ruby_git_hooks/jira_add_comment"
|
5
|
+
|
6
|
+
require "minitest/autorun"
|
7
|
+
require "rest-client"
|
8
|
+
|
9
|
+
class JiraCommentAddHookTest < HookTestCase
|
10
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
11
|
+
|
12
|
+
def setup
|
13
|
+
# NOTE- we can't just register a hook and do the commit and push
|
14
|
+
# for these tests because we need to mock the calls to
|
15
|
+
# RestClient to access Jira and the RubyGitHooks run in a separate process
|
16
|
+
# so the mocking won't work.
|
17
|
+
|
18
|
+
# Still create the repos and do the commits in order to get valid commit IDs
|
19
|
+
# for when we do the check directly
|
20
|
+
|
21
|
+
# Empty out the test repos dir
|
22
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
23
|
+
# Create local parent and child repos with a single shared commit
|
24
|
+
Dir.chdir REPOS_DIR
|
25
|
+
|
26
|
+
new_bare_repo
|
27
|
+
clone_repo
|
28
|
+
new_commit "child_repo", "README"
|
29
|
+
git_push
|
30
|
+
# add_hook("parent_repo.git", "post-receive", TEST_HOOK) # can't do this
|
31
|
+
@hook = JiraCommentAddHook.new "host" => "jira.example.com",
|
32
|
+
"username" => "user", "password" => "password"
|
33
|
+
end
|
34
|
+
|
35
|
+
def fake_hook_check(msg = "Commit message")
|
36
|
+
new_commit("child_repo", "file.txt","Contents", msg)
|
37
|
+
stub(@hook).commit_message { msg }
|
38
|
+
sha = last_commit_sha("child_repo")
|
39
|
+
stub(@hook).commits{[sha]}
|
40
|
+
Dir.chdir("child_repo") do
|
41
|
+
@hook.check
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_no_reference_to_jira
|
46
|
+
|
47
|
+
dont_allow(JiraCommentAddHook).get_comment_content # check that no comment text is prepared
|
48
|
+
# because there are no tickets
|
49
|
+
fake_hook_check("No reference to Jira")
|
50
|
+
# will raise error if get_comment_content is called
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_malformed_reference
|
54
|
+
dont_allow(JiraCommentAddHook).get_comment_content # check that no comment text is prepared
|
55
|
+
# because there are no tickets
|
56
|
+
fake_hook_check( "Incorrect reference to JiraJIRA-123" )
|
57
|
+
# will raise error if get_comment_content is called
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def test_bad_reference
|
62
|
+
dont_allow(JiraCommentAddHook).add_comment # check that no comments are added
|
63
|
+
# because there are no valid tickets
|
64
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/BAD-234") do
|
65
|
+
exc = RestClient::Exception.new
|
66
|
+
mock(exc).http_code.at_least(1) { 404 }
|
67
|
+
raise exc
|
68
|
+
end
|
69
|
+
|
70
|
+
fake_hook_check("Message with BAD-234 reference to Jira" )
|
71
|
+
|
72
|
+
# will raise error if add_comment is called
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
def test_good_reference
|
78
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/GOOD-234") { <<JSON }
|
79
|
+
{ "fields": { "status": { "name": "Open" } } }
|
80
|
+
JSON
|
81
|
+
|
82
|
+
mock(RestClient).post.with_any_args {<<JSON } # more complicated to check the args, just be sure it's called.
|
83
|
+
{ "fields": { "status": { "name": "Open" } } }
|
84
|
+
JSON
|
85
|
+
|
86
|
+
fake_hook_check("Message with GOOD-234 reference to Jira" )
|
87
|
+
|
88
|
+
# as long as the mocked RestClient calls happen, we succeeded
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def test_multiple_references_with_good
|
93
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/GOOD-234") { <<JSON }
|
94
|
+
{ "fields": { "status": { "name": "Open" } } }
|
95
|
+
JSON
|
96
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/BAD-456") do
|
97
|
+
exc = RestClient::Exception.new
|
98
|
+
mock(exc).http_code.at_least(1) { 404 }
|
99
|
+
raise exc
|
100
|
+
end
|
101
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/NOT-123") do
|
102
|
+
exc = RestClient::Exception.new
|
103
|
+
mock(exc).http_code.at_least(1) { 404 }
|
104
|
+
raise exc
|
105
|
+
end
|
106
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/CLOSE-123") { <<JSON }
|
107
|
+
{ "fields": { "status": { "name": "Closed" } } }
|
108
|
+
JSON
|
109
|
+
|
110
|
+
mock(RestClient).post.with_any_args {<<JSON } # more complicated to check the args, just be sure it's called.
|
111
|
+
{ "fields": { "status": { "name": "Open" } } }
|
112
|
+
JSON
|
113
|
+
|
114
|
+
fake_hook_check("Message with CLOSE-123 BAD-456 GOOD-234 NOT-123 reference to Jira" )
|
115
|
+
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_multiple_references_none_good
|
120
|
+
dont_allow(JiraCommentAddHook).add_comment # check that no comments are added
|
121
|
+
# because there are no valid tickets
|
122
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/BAD-456") do
|
123
|
+
exc = RestClient::Exception.new
|
124
|
+
mock(exc).http_code.at_least(1) { 404 }
|
125
|
+
raise exc
|
126
|
+
end
|
127
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/CLOSE-123") { <<JSON }
|
128
|
+
{ "fields": { "status": { "name": "Closed" } } }
|
129
|
+
JSON
|
130
|
+
fake_hook_check("Message with CLOSE-123 BAD-456 reference to Jira" )
|
131
|
+
end
|
132
|
+
|
133
|
+
|
134
|
+
def test_closed_ok_when_not_checking
|
135
|
+
@hook = JiraCommentAddHook.new "check_status" => false, "host" => "jira.example.com",
|
136
|
+
"username" => "user", "password" => "password"
|
137
|
+
|
138
|
+
mock(RestClient).get("https://user:password@jira.example.com/rest/api/latest/issue/CLOSE-123") { <<JSON }
|
139
|
+
{ "fields": { "status": { "name": "Closed" } } }
|
140
|
+
JSON
|
141
|
+
mock(RestClient).post.with_any_args {<<JSON } # more complicated to check the args, just be sure it's called.
|
142
|
+
{ "fields": { "status": { "name": "Open" } } }
|
143
|
+
JSON
|
144
|
+
|
145
|
+
fake_hook_check("Message with CLOSE-123 don't check if closed reference to Jira" )
|
146
|
+
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
require "ruby_git_hooks/jira_ref_check"
|
5
|
+
|
6
|
+
require "minitest/autorun"
|
7
|
+
|
8
|
+
class JiraReferenceCheckHookTest < HookTestCase
|
9
|
+
def setup
|
10
|
+
@hook = JiraReferenceCheckHook.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_no_reference_to_jira
|
14
|
+
mock(@hook).commit_message.at_least(1) { "No reference to Jira" }
|
15
|
+
|
16
|
+
assert_equal false, @hook.check
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_malformed_reference
|
20
|
+
mock(@hook).commit_message.at_least(1) { "Incorrect reference to JiraJIRA-123" }
|
21
|
+
|
22
|
+
assert_equal false, @hook.check
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_good_reference
|
26
|
+
mock(@hook).commit_message.at_least(1) { "Message with GOOD-234 reference to Jira" }
|
27
|
+
|
28
|
+
assert_equal true, @hook.check
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_multiple_references_with_good
|
32
|
+
mock(@hook).commit_message.at_least(1) { "Message with CLOSE-123 BAD-456 GOOD-234 NOT-123 reference to Jira" }
|
33
|
+
assert_equal true, @hook.check
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
require "minitest/autorun"
|
6
|
+
|
7
|
+
class MaxFileSizeHookTest < HookTestCase
|
8
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
9
|
+
MAX_SIZE = 100000
|
10
|
+
TEST_HOOK_BODY = <<TEST
|
11
|
+
#{RubyGitHooks.shebang}
|
12
|
+
require "ruby_git_hooks/max_file_size"
|
13
|
+
|
14
|
+
RubyGitHooks.run MaxFileSizeHook.new(MAX_SIZE)
|
15
|
+
TEST
|
16
|
+
|
17
|
+
def setup
|
18
|
+
# Empty out the test repos dir
|
19
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
20
|
+
|
21
|
+
# Create local parent and child repos with a single shared commit
|
22
|
+
Dir.chdir REPOS_DIR
|
23
|
+
|
24
|
+
new_bare_repo
|
25
|
+
clone_repo
|
26
|
+
new_commit "child_repo", "README"
|
27
|
+
git_push
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_max_file_size_pre_receive
|
31
|
+
add_hook("parent_repo.git", "pre-receive", TEST_HOOK_BODY)
|
32
|
+
filename = "#{REPOS_DIR}/child_repo/BigFile.txt"
|
33
|
+
|
34
|
+
File.open(filename, "w") do |f|
|
35
|
+
alphanum = [('a'..'z'),('A'..'Z'),('0'..'9')].map{|i| i.to_a}.flatten
|
36
|
+
string = (0...MAX_SIZE*2).map{ alphanum[rand(alphanum.length)] }.join
|
37
|
+
f.write(string)
|
38
|
+
end
|
39
|
+
new_commit "child_repo", "BigFile.txt", nil
|
40
|
+
|
41
|
+
# Should reject w/ pre-commit hook
|
42
|
+
assert_raises RuntimeError do
|
43
|
+
git_push
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
#def test_case_clash_pre_commit
|
49
|
+
# add_hook("parent_repo.git", "pre-receive", TEST_HOOK_BODY)
|
50
|
+
#end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
require "test_helper"
|
4
|
+
|
5
|
+
require "minitest/autorun"
|
6
|
+
|
7
|
+
class CopyrightCheckHookTest < HookTestCase
|
8
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
9
|
+
TEST_HOOK_MULTI_REG = <<TEST
|
10
|
+
#{RubyGitHooks.shebang}
|
11
|
+
require "ruby_git_hooks/ruby_debug"
|
12
|
+
require "ruby_git_hooks/copyright_check"
|
13
|
+
|
14
|
+
RubyGitHooks.register RubyDebugHook.new
|
15
|
+
RubyGitHooks.register CopyrightCheckHook.new("no_send" => true)
|
16
|
+
|
17
|
+
RubyGitHooks.run
|
18
|
+
TEST
|
19
|
+
|
20
|
+
TEST_HOOK_MULTI_RUN = <<TEST
|
21
|
+
#{RubyGitHooks.shebang}
|
22
|
+
require "ruby_git_hooks/ruby_debug"
|
23
|
+
require "ruby_git_hooks/copyright_check"
|
24
|
+
|
25
|
+
RubyGitHooks.run RubyDebugHook.new,
|
26
|
+
CopyrightCheckHook.new("no_send" => true)
|
27
|
+
TEST
|
28
|
+
|
29
|
+
def setup
|
30
|
+
# Empty out the test repos dir
|
31
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
32
|
+
|
33
|
+
# Create local parent and child repos with a single shared commit
|
34
|
+
Dir.chdir REPOS_DIR
|
35
|
+
|
36
|
+
new_bare_repo
|
37
|
+
clone_repo
|
38
|
+
new_commit "child_repo", "README"
|
39
|
+
git_push
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_multi_reg_pre_commit
|
43
|
+
add_hook("child_repo", "pre-commit", TEST_HOOK_MULTI_REG)
|
44
|
+
|
45
|
+
last_sha = last_commit_sha
|
46
|
+
|
47
|
+
new_commit("child_repo", "myfile.rb", <<FILE_CONTENTS)
|
48
|
+
# Copyright (C) 2013 YoyoDyne, Inc. All Rights Reserved.
|
49
|
+
# No copyright notice, no ruby-debug. Should be fine.
|
50
|
+
FILE_CONTENTS
|
51
|
+
|
52
|
+
assert last_sha != last_commit_sha,
|
53
|
+
"Multiple pre-commit should accept legal commit."
|
54
|
+
last_sha = last_commit_sha # update
|
55
|
+
|
56
|
+
assert_raises RuntimeError do
|
57
|
+
new_commit("child_repo", "myfile.rb", <<FILE_CONTENTS)
|
58
|
+
# No copyright notice, but no ruby-debug
|
59
|
+
FILE_CONTENTS
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_equal last_sha, last_commit_sha,
|
63
|
+
"Multiple pre-commit should refuse illegal commit (1)."
|
64
|
+
|
65
|
+
assert_raises RuntimeError do
|
66
|
+
new_commit("child_repo", "myfile.rb", <<FILE_CONTENTS)
|
67
|
+
# Includes a copyright notice, but has ruby-debug
|
68
|
+
# Copyright (C) 2013 YoyoDyne, Inc. All Rights Reserved.
|
69
|
+
require 'ruby-debug'
|
70
|
+
FILE_CONTENTS
|
71
|
+
end
|
72
|
+
|
73
|
+
assert_equal last_sha, last_commit_sha,
|
74
|
+
"Multiple pre-commit should refuse illegal commit (2)."
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
3
|
+
|
4
|
+
require "test_helper"
|
5
|
+
|
6
|
+
require "minitest/autorun"
|
7
|
+
|
8
|
+
class NonAsciiHookTest < HookTestCase
|
9
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
10
|
+
FAKE_CURL = File.expand_path File.join(File.dirname(__FILE__), "fake_curl")
|
11
|
+
TEST_HOOK_BODY = <<TEST
|
12
|
+
#{RubyGitHooks.shebang}
|
13
|
+
require "ruby_git_hooks/non_ascii"
|
14
|
+
|
15
|
+
RubyGitHooks.run NonAsciiCharactersCheckHook.new
|
16
|
+
TEST
|
17
|
+
|
18
|
+
def setup
|
19
|
+
# Empty out the test repos dir
|
20
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
21
|
+
|
22
|
+
# Create local parent and child repos with a single shared commit
|
23
|
+
Dir.chdir REPOS_DIR
|
24
|
+
|
25
|
+
new_bare_repo
|
26
|
+
clone_repo
|
27
|
+
new_commit "child_repo", "README"
|
28
|
+
git_push
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_non_ascii_commit_msg
|
32
|
+
add_hook("child_repo", "commit-msg", TEST_HOOK_BODY)
|
33
|
+
|
34
|
+
assert_raises RuntimeError do
|
35
|
+
new_commit "child_repo", "test1", "Contents", "Hello this a mixed string © that I made.\nнельзя писать в коммит сообщение по русски"
|
36
|
+
end
|
37
|
+
|
38
|
+
# This should succeed
|
39
|
+
new_commit "child_repo", "test2", "GoodContents", "Nice and warm non-ascii message"
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
#def test_case_clash_pre_commit
|
44
|
+
# add_hook("parent_repo.git", "pre-receive", TEST_HOOK_BODY)
|
45
|
+
#end
|
46
|
+
|
47
|
+
end
|
data/test/repos/.keep
ADDED
File without changes
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright (C) 2013 OL2, Inc. See LICENSE.txt for details.
|
2
|
+
|
3
|
+
# Test local copy first
|
4
|
+
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), "..", "lib")
|
5
|
+
|
6
|
+
require "minitest/pride"
|
7
|
+
require "rr"
|
8
|
+
|
9
|
+
require "ruby_git_hooks"
|
10
|
+
require "ruby_git_hooks/git_ops"
|
11
|
+
|
12
|
+
class HookTestCase < MiniTest::Unit::TestCase
|
13
|
+
Hook = RubyGitHooks::Hook
|
14
|
+
include RubyGitHooks::GitOps
|
15
|
+
|
16
|
+
include RR::Adapters::MiniTest
|
17
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
require "minitest/autorun"
|
5
|
+
|
6
|
+
class AddWatermarkHookTest < HookTestCase
|
7
|
+
REPOS_DIR = File.expand_path File.join(File.dirname(__FILE__), "repos")
|
8
|
+
FAKE_CURL = File.expand_path File.join(File.dirname(__FILE__), "fake_curl")
|
9
|
+
TEST_HOOK_BODY = <<TEST
|
10
|
+
#{RubyGitHooks.shebang}
|
11
|
+
require "ruby_git_hooks/watermark"
|
12
|
+
|
13
|
+
RubyGitHooks.run AddWatermarkCommitHook.new("WATERMARK")
|
14
|
+
TEST
|
15
|
+
|
16
|
+
def setup
|
17
|
+
# Empty out the test repos dir
|
18
|
+
Hook.shell! "rm -rf #{File.join(REPOS_DIR, "*")}"
|
19
|
+
|
20
|
+
# Create local parent and child repos with a single shared commit
|
21
|
+
Dir.chdir REPOS_DIR
|
22
|
+
|
23
|
+
new_bare_repo
|
24
|
+
clone_repo
|
25
|
+
new_commit "child_repo", "README"
|
26
|
+
git_push
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_commit_has_watermark
|
30
|
+
add_hook("child_repo", "commit-msg", TEST_HOOK_BODY)
|
31
|
+
|
32
|
+
# This should succeed
|
33
|
+
new_commit "child_repo", "test2", "GoodContents", "Commit message"
|
34
|
+
msg = last_commit_message ("child_repo")
|
35
|
+
assert msg =~/WATERMARK/
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|