flowdock-git-hook 0.4.2 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +6 -14
- data/.travis.yml +3 -2
- data/Gemfile +2 -1
- data/README.md +20 -4
- data/VERSION +1 -1
- data/flowdock-git-hook.gemspec +11 -5
- data/lib/flowdock/git.rb +34 -36
- data/lib/flowdock/git/builder.rb +116 -50
- data/spec/flowdock_git_spec.rb +63 -53
- metadata +52 -25
- data/spec/builder_spec.rb +0 -135
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
MDljNGM1ZGUwMzc4NzFlNTNmNTM3MjEyYTNmYzIzZDIzZWQxYjRhNzllYzUy
|
10
|
-
MWJhYWU1MGI2MzkzYzFhZmQxNTM3YjZlYzQyMjgwMmFiYzcwMzg0MTgxZTgw
|
11
|
-
YTEyY2ZjOTVmZGVkMzU3ODI2OGQxM2QxNWU3ZDIxOTA2ZGNkZDg=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
ODM0OGY3NDZjODVhZTdiMjJhYjJiYjI5ZWRkMmJjZTY0NzdjNDk4NWNiMzdk
|
14
|
-
NmQ3Y2EzZmFhNjcyNWFhODNiNmE4ZWJjYzhmNTBmOGNmMGQyMWU5ZjI1YjQw
|
15
|
-
OWYxMDU5ZjgzZmExYmViYzY1NDE1YTEwOTcwYzI5NzdjNzFlODg=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: db9e59fadcdfb7e5c9abdc0833bc16674be85612
|
4
|
+
data.tar.gz: 888ac972d310c012029d3aad21942f5f5ebd7eed
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e3d7c287e9b62c3a2b7518cf7f04c750e241ac7671f1d02d79f2c13cdae3639f41ff70b8eea87a4e4df1ecf8c0db63a28794f987c8607d3129aae67368bb9389
|
7
|
+
data.tar.gz: 6aa623fb9d787a681221747cd627fd768d82abd3f90fba37c28d38fb998af8acb0ea91f929b8d284df6be8e7d2c7369b2bafd8cd1cf0f31dcce6b7846e5d7e64
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -4,7 +4,7 @@ Git Post-Receive hook for [Flowdock](http://flowdock.com).
|
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
|
-
First, you need to install this gem. You need to have Ruby
|
7
|
+
First, you need to install this gem. You need to have Ruby and Rubygems installed in your system.
|
8
8
|
|
9
9
|
$ gem install flowdock-git-hook
|
10
10
|
|
@@ -13,9 +13,9 @@ Then, download the post-receive hook file to the hooks directory and make it exe
|
|
13
13
|
$ wget -O hooks/post-receive https://raw.github.com/flowdock/flowdock-git-hook/master/post-receive
|
14
14
|
$ chmod +x hooks/post-receive
|
15
15
|
|
16
|
-
|
16
|
+
Set the source flow token given to you by the Flowdock git configuration service
|
17
17
|
|
18
|
-
$ git config flowdock.token <
|
18
|
+
$ git config flowdock.token <source flow token>
|
19
19
|
|
20
20
|
After this, you should get updates from your git repo every time you push to it.
|
21
21
|
|
@@ -23,6 +23,22 @@ After this, you should get updates from your git repo every time you push to it.
|
|
23
23
|
|
24
24
|
Service specific instructions for [Gitlab](https://github.com/flowdock/flowdock-git-hook/wiki/Gitlab) and [Redmine](https://github.com/flowdock/flowdock-git-hook/wiki/Redmine) can be found in [Wiki](https://github.com/flowdock/flowdock-git-hook/wiki).
|
25
25
|
|
26
|
+
### Permanent references
|
27
|
+
|
28
|
+
By default each push to the `master` branch will generate a new thread containing just the commits that were pushed. Pushes to other branches or tags will be grouped to a single thread containing all the pushed commits. You can configure this behaviour by setting the `permanent-reference` git variable. The value of that configuration parameter should be a comma separated list of regular expressions.
|
29
|
+
|
30
|
+
For example to create new threads for each push to the `master` branch and any branch starting with `with-regex-` do this
|
31
|
+
|
32
|
+
$ git config flowdock.permanent-references "refs/heads/master, refs/heads/with-regex-.*"
|
33
|
+
|
34
|
+
|
35
|
+
### Repository name
|
36
|
+
|
37
|
+
The repository name displayed in the inbox message can be set with `repository-name`
|
38
|
+
|
39
|
+
$ git config flowdock.repository-name "my repo"
|
40
|
+
|
41
|
+
|
26
42
|
### Repository URL
|
27
43
|
|
28
44
|
Each Team Inbox item sent from the post-receive hook can link back to the repository. To configure the URL for the repository, configure a `repository-url`:
|
@@ -41,7 +57,7 @@ The `%s` will be replaced with the commit SHA.
|
|
41
57
|
|
42
58
|
Commit messages in Team Inbox can have a action for viewing the commit diff. To enable the Diff action for comparing commits, configure a `diff-url-pattern`:
|
43
59
|
|
44
|
-
$
|
60
|
+
$ git config flowdock.diff-url-pattern "http://example.com/mygitviewer/compare/%s...%s"
|
45
61
|
|
46
62
|
## Advanced usage
|
47
63
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
1.0.0
|
data/flowdock-git-hook.gemspec
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: flowdock-git-hook 1.0.0 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = "flowdock-git-hook"
|
8
|
-
s.version = "0.
|
9
|
+
s.version = "1.0.0"
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
11
13
|
s.authors = ["Ville Lautanala"]
|
12
|
-
s.date = "
|
14
|
+
s.date = "2015-07-22"
|
13
15
|
s.email = "lautis@gmail.com"
|
14
16
|
s.extra_rdoc_files = [
|
15
17
|
"LICENSE.txt",
|
@@ -29,14 +31,12 @@ Gem::Specification.new do |s|
|
|
29
31
|
"lib/flowdock/git.rb",
|
30
32
|
"lib/flowdock/git/builder.rb",
|
31
33
|
"post-receive",
|
32
|
-
"spec/builder_spec.rb",
|
33
34
|
"spec/flowdock_git_spec.rb",
|
34
35
|
"spec/spec_helper.rb"
|
35
36
|
]
|
36
37
|
s.homepage = "http://github.com/flowdock/flowdock-git-hook"
|
37
38
|
s.licenses = ["MIT"]
|
38
|
-
s.
|
39
|
-
s.rubygems_version = "2.0.5"
|
39
|
+
s.rubygems_version = "2.4.1"
|
40
40
|
s.summary = "Git Post-Receive hook for Flowdock"
|
41
41
|
|
42
42
|
if s.respond_to? :specification_version then
|
@@ -45,6 +45,8 @@ Gem::Specification.new do |s|
|
|
45
45
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
46
46
|
s.add_runtime_dependency(%q<grit>, [">= 2.4.1"])
|
47
47
|
s.add_runtime_dependency(%q<multi_json>, [">= 0"])
|
48
|
+
s.add_runtime_dependency(%q<flowdock>, ["~> 0.7"])
|
49
|
+
s.add_development_dependency(%q<byebug>, [">= 0"])
|
48
50
|
s.add_development_dependency(%q<rdoc>, [">= 2.4.2"])
|
49
51
|
s.add_development_dependency(%q<rspec>, ["~> 2.8"])
|
50
52
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
@@ -54,6 +56,8 @@ Gem::Specification.new do |s|
|
|
54
56
|
else
|
55
57
|
s.add_dependency(%q<grit>, [">= 2.4.1"])
|
56
58
|
s.add_dependency(%q<multi_json>, [">= 0"])
|
59
|
+
s.add_dependency(%q<flowdock>, ["~> 0.7"])
|
60
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
57
61
|
s.add_dependency(%q<rdoc>, [">= 2.4.2"])
|
58
62
|
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
59
63
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
@@ -64,6 +68,8 @@ Gem::Specification.new do |s|
|
|
64
68
|
else
|
65
69
|
s.add_dependency(%q<grit>, [">= 2.4.1"])
|
66
70
|
s.add_dependency(%q<multi_json>, [">= 0"])
|
71
|
+
s.add_dependency(%q<flowdock>, ["~> 0.7"])
|
72
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
67
73
|
s.add_dependency(%q<rdoc>, [">= 2.4.2"])
|
68
74
|
s.add_dependency(%q<rspec>, ["~> 2.8"])
|
69
75
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
data/lib/flowdock/git.rb
CHANGED
@@ -1,69 +1,52 @@
|
|
1
1
|
require "multi_json"
|
2
|
-
require "net/https"
|
3
2
|
require "cgi"
|
4
|
-
|
3
|
+
require "flowdock"
|
5
4
|
require "flowdock/git/builder"
|
6
5
|
|
7
6
|
module Flowdock
|
8
7
|
class Git
|
9
8
|
class TokenError < StandardError; end
|
10
|
-
API_ENDPOINT = "https://api.flowdock.com/v1/git"
|
11
9
|
|
12
10
|
class << self
|
13
11
|
def post(ref, from, to, options = {})
|
14
|
-
|
15
|
-
git.post(Git::Builder.new(git.repo, ref, from, to))
|
12
|
+
Git.new(ref, from, to, options).post
|
16
13
|
end
|
17
14
|
|
18
15
|
def background_post(ref, from, to, options = {})
|
19
|
-
|
20
|
-
git.background_post(Git::Builder.new(git.repo, ref, from, to))
|
16
|
+
Git.new(ref, from, to, options).background_post
|
21
17
|
end
|
22
18
|
end
|
23
19
|
|
24
|
-
def initialize(options = {})
|
20
|
+
def initialize(ref, from, to, options = {})
|
21
|
+
@ref = ref
|
22
|
+
@from = from
|
23
|
+
@to = to
|
25
24
|
@options = options
|
26
25
|
@token = options[:token] || config["flowdock.token"] || raise(TokenError.new("Flowdock API token not found"))
|
27
26
|
@commit_url = options[:commit_url] || config["flowdock.commit-url-pattern"] || nil
|
28
27
|
@diff_url = options[:diff_url] || config["flowdock.diff-url-pattern"] || nil
|
29
28
|
@repo_url = options[:repo_url] || config["flowdock.repository-url"] || nil
|
29
|
+
@repo_name = options[:repo_name] || config["flowdock.repository-name"] || nil
|
30
|
+
@permanent_refs = options[:permanent_refs] ||
|
31
|
+
(config["flowdock.permanent-references"] || "refs/heads/master")
|
32
|
+
.split(",")
|
33
|
+
.map(&:strip)
|
34
|
+
.map {|exp| Regexp.new(exp) }
|
30
35
|
end
|
31
36
|
|
32
37
|
# Send git push notification to Flowdock
|
33
|
-
def post
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
payload_hash = data.to_hash
|
38
|
-
if @repo_url
|
39
|
-
payload_hash[:repository][:url] = @repo_url
|
40
|
-
end
|
41
|
-
if @commit_url
|
42
|
-
payload_hash[:commits].each do |commit|
|
43
|
-
commit[:url] = @commit_url % commit[:id]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
if @diff_url
|
47
|
-
payload_hash[:compare] = @diff_url % [payload_hash[:before], payload_hash[:after]]
|
38
|
+
def post
|
39
|
+
messages.each do |message|
|
40
|
+
Flowdock::Client.new(flow_token: @token).post_to_thread(message)
|
48
41
|
end
|
49
|
-
|
50
|
-
req.set_form_data(:payload => MultiJson.encode(payload_hash))
|
51
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
52
|
-
|
53
|
-
if uri.scheme == 'https'
|
54
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
55
|
-
http.use_ssl = true
|
56
|
-
end
|
57
|
-
|
58
|
-
http.start { |http| http.request(req) }
|
59
42
|
end
|
60
43
|
|
61
44
|
# Create and post notification in background process. Avoid blocking the push notification.
|
62
|
-
def background_post
|
45
|
+
def background_post
|
63
46
|
pid = Process.fork
|
64
47
|
if pid.nil?
|
65
48
|
Grit::Git.with_timeout(600) do
|
66
|
-
post
|
49
|
+
post
|
67
50
|
end
|
68
51
|
else
|
69
52
|
Process.detach(pid) # Parent
|
@@ -76,12 +59,27 @@ module Flowdock
|
|
76
59
|
|
77
60
|
private
|
78
61
|
|
62
|
+
def messages
|
63
|
+
Git::Builder.new(repo: @repo,
|
64
|
+
ref: @ref,
|
65
|
+
before: @from,
|
66
|
+
after: @to,
|
67
|
+
commit_url: @commit_url,
|
68
|
+
branch_url: @branch_url,
|
69
|
+
diff_url: @diff_url,
|
70
|
+
repo_url: @repo_url,
|
71
|
+
repo_name: @repo_name,
|
72
|
+
permanent_refs: @permanent_refs,
|
73
|
+
tags: tags
|
74
|
+
).to_hashes
|
75
|
+
end
|
76
|
+
|
79
77
|
# Flowdock tags attached to the push notification
|
80
78
|
def tags
|
81
79
|
if @options[:tags]
|
82
80
|
@options[:tags]
|
83
81
|
else
|
84
|
-
config["flowdock.tags"].to_s.split(",")
|
82
|
+
config["flowdock.tags"].to_s.split(",").map(&:strip)
|
85
83
|
end.map do |t|
|
86
84
|
CGI.escape(t)
|
87
85
|
end
|
data/lib/flowdock/git/builder.rb
CHANGED
@@ -1,60 +1,38 @@
|
|
1
1
|
require "grit"
|
2
|
+
require 'cgi'
|
3
|
+
require "securerandom"
|
2
4
|
|
3
5
|
module Flowdock
|
4
6
|
class Git
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@after = after
|
12
|
-
end
|
13
|
-
|
14
|
-
def commits
|
15
|
-
@repo.commits_between(@before, @after).map do |commit|
|
16
|
-
{
|
17
|
-
:id => commit.sha,
|
18
|
-
:message => commit.message,
|
19
|
-
:timestamp => commit.authored_date.iso8601,
|
20
|
-
:author => {
|
21
|
-
:name => commit.author.name,
|
22
|
-
:email => commit.author.email
|
23
|
-
},
|
24
|
-
:removed => filter(commit.diffs) { |d| d.deleted_file },
|
25
|
-
:added => filter(commit.diffs) { |d| d.new_file },
|
26
|
-
:modified => filter(commit.diffs) { |d| !d.deleted_file && !d.new_file }
|
27
|
-
}
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def ref_name
|
32
|
-
@ref.to_s.sub(/\Arefs\/(heads|tags)\//, '')
|
7
|
+
class Commit
|
8
|
+
def initialize(external_thread_id, thread, tags, commit)
|
9
|
+
@commit = commit
|
10
|
+
@external_thread_id = external_thread_id
|
11
|
+
@thread = thread
|
12
|
+
@tags = tags
|
33
13
|
end
|
34
14
|
|
35
15
|
def to_hash
|
36
|
-
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
{}
|
51
|
-
end)
|
16
|
+
hash = {
|
17
|
+
external_thread_id: @external_thread_id,
|
18
|
+
event: "activity",
|
19
|
+
author: {
|
20
|
+
name: @commit[:author][:name],
|
21
|
+
email: @commit[:author][:email]
|
22
|
+
},
|
23
|
+
title: title,
|
24
|
+
thread: @thread,
|
25
|
+
body: body
|
26
|
+
}
|
27
|
+
hash[:tags] = @tags if @tags
|
28
|
+
encode(hash)
|
52
29
|
end
|
53
30
|
|
54
31
|
private
|
55
32
|
|
56
|
-
def
|
57
|
-
|
33
|
+
def encode(hash)
|
34
|
+
return hash unless "".respond_to? :encode
|
35
|
+
encode_as_utf8(hash)
|
58
36
|
end
|
59
37
|
|
60
38
|
# This only works on Ruby 1.9
|
@@ -72,12 +50,100 @@ module Flowdock
|
|
72
50
|
obj.force_encoding("ISO-8859-1").encode!(Encoding::UTF_8, :invalid => :replace, :undef => :replace)
|
73
51
|
end
|
74
52
|
end
|
75
|
-
obj
|
76
53
|
end
|
77
54
|
|
78
|
-
def
|
79
|
-
|
80
|
-
|
55
|
+
def body
|
56
|
+
content = @commit[:message][first_line.size..-1]
|
57
|
+
content.strip! if content
|
58
|
+
"<pre>#{content}</pre>" unless content.empty?
|
59
|
+
end
|
60
|
+
|
61
|
+
def first_line
|
62
|
+
@first_line ||= (@commit[:message].split("\n")[0] || @commit[:message])
|
63
|
+
end
|
64
|
+
|
65
|
+
def title
|
66
|
+
commit_id = @commit[:id][0, 7]
|
67
|
+
if @commit[:url]
|
68
|
+
"<a href=\"#{@commit[:url]}\">#{commit_id}</a> #{message_title}"
|
69
|
+
else
|
70
|
+
"#{commit_id} #{message_title}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def message_title
|
75
|
+
CGI.escape_html(first_line.strip)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Class used to build Git payload
|
80
|
+
class Builder
|
81
|
+
def initialize(opts)
|
82
|
+
@repo = opts[:repo]
|
83
|
+
@ref = opts[:ref]
|
84
|
+
@before = opts[:before]
|
85
|
+
@after = opts[:after]
|
86
|
+
@opts = opts
|
87
|
+
end
|
88
|
+
|
89
|
+
def commits
|
90
|
+
@repo.commits_between(@before, @after).map do |commit|
|
91
|
+
{
|
92
|
+
url: if @opts[:commit_url] then @opts[:commit_url] % [commit.sha] end,
|
93
|
+
id: commit.sha,
|
94
|
+
message: commit.message,
|
95
|
+
author: {
|
96
|
+
name: commit.author.name,
|
97
|
+
email: commit.author.email
|
98
|
+
}
|
99
|
+
}
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def ref_name
|
104
|
+
@ref.to_s.sub(/\Arefs\/(heads|tags)\//, '')
|
105
|
+
end
|
106
|
+
|
107
|
+
def to_hashes
|
108
|
+
commits.map do |commit|
|
109
|
+
Commit.new(external_thread_id, thread, @opts[:tags], commit).to_hash
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
|
115
|
+
def thread
|
116
|
+
@thread ||= {
|
117
|
+
title: thread_title,
|
118
|
+
external_url: @opts[:repo_url]
|
119
|
+
}
|
120
|
+
end
|
121
|
+
|
122
|
+
def permanent?
|
123
|
+
@permanent ||= @opts[:permanent_refs].select do |regex|
|
124
|
+
regex.match(@ref)
|
125
|
+
end.size > 0
|
126
|
+
end
|
127
|
+
|
128
|
+
def thread_title
|
129
|
+
action = if permanent?
|
130
|
+
"updated"
|
131
|
+
end
|
132
|
+
type = if @ref.match(%r(^refs/heads/))
|
133
|
+
"branch"
|
134
|
+
else
|
135
|
+
"tag"
|
136
|
+
end
|
137
|
+
[@opts[:repo_name], type, ref_name, action].compact.join(" ")
|
138
|
+
end
|
139
|
+
|
140
|
+
def external_thread_id
|
141
|
+
@external_thread_id ||=
|
142
|
+
if permanent?
|
143
|
+
SecureRandom.hex
|
144
|
+
else
|
145
|
+
@ref
|
146
|
+
end
|
81
147
|
end
|
82
148
|
end
|
83
149
|
end
|
data/spec/flowdock_git_spec.rb
CHANGED
@@ -1,36 +1,69 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
3
|
describe "Flowdock Git Hook" do
|
4
|
+
let(:before) { "611ef32e3eee84b61a7efd496bd71ae1af165823" }
|
5
|
+
let(:after) { "3a29fcd42ca69f40c8ed357052843d8e1e549013" }
|
6
|
+
let(:commits_in_range) { 8 }
|
7
|
+
let(:flowdock_token) { SecureRandom.hex }
|
8
|
+
let(:expected_message) {
|
9
|
+
{
|
10
|
+
event: "activity",
|
11
|
+
title: "3f3a5fd Bumped version",
|
12
|
+
thread: {
|
13
|
+
title: "branch master updated",
|
14
|
+
external_url: nil,
|
15
|
+
},
|
16
|
+
author: {
|
17
|
+
name: "Antti Pitkanen",
|
18
|
+
email: "antti@flowdock.com"
|
19
|
+
},
|
20
|
+
body: nil,
|
21
|
+
flow_token: flowdock_token
|
22
|
+
}
|
23
|
+
}
|
24
|
+
|
25
|
+
let!(:request) do
|
26
|
+
stub_request(:post, "https://api.flowdock.com/v1/messages")
|
27
|
+
end
|
28
|
+
|
4
29
|
it "raises error if git token is not defined" do
|
5
30
|
lambda {
|
6
|
-
Flowdock::Git.new
|
31
|
+
Flowdock::Git.new "ref", "from", "to"
|
7
32
|
}.should raise_error(Flowdock::Git::TokenError)
|
8
33
|
end
|
9
34
|
|
10
35
|
it "can read token from git config" do
|
11
36
|
Grit::Config.stub!(:new).and_return({
|
12
|
-
"flowdock.token" =>
|
37
|
+
"flowdock.token" => flowdock_token
|
13
38
|
})
|
14
39
|
|
15
40
|
lambda {
|
16
|
-
Flowdock::Git.new
|
41
|
+
Flowdock::Git.new "ref", "from", "to"
|
17
42
|
}.should_not raise_error
|
18
43
|
end
|
19
44
|
|
20
|
-
it "
|
21
|
-
|
22
|
-
|
23
|
-
@after = "a66d3ce668ae6f2a42d54d811962724200d5b32b"
|
24
|
-
@repo.stub!(:path).and_return("/foo/bar/flowdock-git-hook/.git")
|
25
|
-
@hash = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, @after).to_hash
|
45
|
+
it "builds payload" do
|
46
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token)
|
47
|
+
expect(request.with(body: hash_including(expected_message))).to have_been_made
|
26
48
|
end
|
27
49
|
|
28
|
-
it "
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
50
|
+
it "adds repo name to title if given" do
|
51
|
+
Grit::Config.stub!(:new).and_return(
|
52
|
+
"flowdock.repository-name" => "some repo"
|
53
|
+
)
|
54
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token)
|
55
|
+
expect(request.with(body: hash_including(
|
56
|
+
thread: expected_message[:thread].merge(title: "some repo branch master updated")))
|
57
|
+
).to have_been_made.times(commits_in_range - 1) # da fuq. if you figure out why 139fdb4 does not generate a hit please do tell me
|
58
|
+
end
|
59
|
+
|
60
|
+
it "posts all transient branch updates to same thread" do
|
61
|
+
Grit::Config.stub!(:new).and_return(
|
62
|
+
"flowdock.permanent-references" => ""
|
63
|
+
)
|
64
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token)
|
65
|
+
expect(request.with(body: hash_including(external_thread_id: "refs/heads/master"))
|
66
|
+
).to have_been_made.times(commits_in_range)
|
34
67
|
end
|
35
68
|
|
36
69
|
it "builds payload with repo url, diff url and commit urls" do
|
@@ -40,47 +73,24 @@ describe "Flowdock Git Hook" do
|
|
40
73
|
"flowdock.diff-url-pattern" => "http://www.example.com/compare/%s...%s",
|
41
74
|
"flowdock.commit-url-pattern" => "http://www.example.com/commit/%s"
|
42
75
|
})
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
}.should have_been_made
|
50
|
-
end
|
51
|
-
|
52
|
-
describe "Tagging" do
|
53
|
-
it "reads tags from initializer parameter" do
|
54
|
-
tags = Flowdock::Git.new(:token => "flowdock-token", :tags => ["foo", "bar"]).send(:tags)
|
55
|
-
tags.should include("foo", "bar")
|
56
|
-
end
|
57
|
-
|
58
|
-
it "reads tags from gitconfig as fallback" do
|
59
|
-
Grit::Config.stub!(:new).and_return({
|
60
|
-
"flowdock.tags" => "foo,bar"
|
61
|
-
})
|
62
|
-
tags = Flowdock::Git.new(:token => "flowdock-token").send(:tags)
|
63
|
-
tags.should include("foo", "bar")
|
64
|
-
end
|
65
|
-
|
66
|
-
it "encodes tags suitable for URI" do
|
67
|
-
Flowdock::Git.new(:token => "flowdock-token", :tags => ["foo%bar"]).send(:tags).should include("foo%25bar")
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
describe "Flowdock Git Hook", "HTTP Post" do
|
73
|
-
before :each do
|
74
|
-
stub_request(:post, "https://api.flowdock.com/v1/git/flowdock-token+foo+bar")
|
75
|
-
Flowdock::Git.post("origin/refs/master", "7e32af569ba794b0b1c5e4c38fef1d4e2e56be51", "a1a94ba4bfa5f855676066861604b8edae1a20f5", :token => "flowdock-token", :tags => ["foo", "bar"])
|
76
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token)
|
77
|
+
expect(request.with(body: hash_including(expected_message.merge(
|
78
|
+
thread: expected_message[:thread].merge(external_url: "http://www.example.com"),
|
79
|
+
title: "<a href=\"http://www.example.com/commit/3f3a5fd37f53970f71adec08c5376ae003ba22a3\">3f3a5fd</a> Bumped version"
|
80
|
+
)))
|
81
|
+
).to have_been_made
|
76
82
|
end
|
77
83
|
|
78
|
-
it "
|
79
|
-
|
84
|
+
it "attaches tags from configuration" do
|
85
|
+
Grit::Config.stub!(:new).and_return({"flowdock.tags" => "git, push, foo%bar"})
|
86
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token)
|
87
|
+
expect(request.with(body: hash_including(tags: ["git", "push", "foo%25bar"]))
|
88
|
+
).to have_been_made.times(7)
|
80
89
|
end
|
81
90
|
|
82
|
-
it "
|
83
|
-
|
84
|
-
|
91
|
+
it "attaches tags from opts" do
|
92
|
+
Flowdock::Git.post("refs/heads/master", before, after, token: flowdock_token, tags: ["git", "push", "foo%bar"])
|
93
|
+
expect(request.with(body: hash_including(tags: ["git", "push", "foo%25bar"]))
|
94
|
+
).to have_been_made.times(7)
|
85
95
|
end
|
86
96
|
end
|
metadata
CHANGED
@@ -1,125 +1,153 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flowdock-git-hook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ville Lautanala
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-07-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grit
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 2.4.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.4.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: multi_json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: flowdock
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.7'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.7'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: byebug
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
39
67
|
- !ruby/object:Gem::Version
|
40
68
|
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rdoc
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- -
|
73
|
+
- - ">="
|
46
74
|
- !ruby/object:Gem::Version
|
47
75
|
version: 2.4.2
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
|
-
- -
|
80
|
+
- - ">="
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: 2.4.2
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rspec
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
|
-
- - ~>
|
87
|
+
- - "~>"
|
60
88
|
- !ruby/object:Gem::Version
|
61
89
|
version: '2.8'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- - ~>
|
94
|
+
- - "~>"
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '2.8'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: bundler
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- - ~>
|
101
|
+
- - "~>"
|
74
102
|
- !ruby/object:Gem::Version
|
75
103
|
version: '1.0'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- - ~>
|
108
|
+
- - "~>"
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '1.0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: jeweler
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- - ~>
|
115
|
+
- - "~>"
|
88
116
|
- !ruby/object:Gem::Version
|
89
117
|
version: 1.8.7
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- - ~>
|
122
|
+
- - "~>"
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: 1.8.7
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
126
|
name: webmock
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
|
-
- -
|
129
|
+
- - ">="
|
102
130
|
- !ruby/object:Gem::Version
|
103
131
|
version: 1.6.4
|
104
132
|
type: :development
|
105
133
|
prerelease: false
|
106
134
|
version_requirements: !ruby/object:Gem::Requirement
|
107
135
|
requirements:
|
108
|
-
- -
|
136
|
+
- - ">="
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: 1.6.4
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
140
|
name: jruby-openssl
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
|
-
- -
|
143
|
+
- - ">="
|
116
144
|
- !ruby/object:Gem::Version
|
117
145
|
version: '0'
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
|
-
- -
|
150
|
+
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
152
|
version: '0'
|
125
153
|
description:
|
@@ -130,9 +158,9 @@ extra_rdoc_files:
|
|
130
158
|
- LICENSE.txt
|
131
159
|
- README.md
|
132
160
|
files:
|
133
|
-
- .document
|
134
|
-
- .rspec
|
135
|
-
- .travis.yml
|
161
|
+
- ".document"
|
162
|
+
- ".rspec"
|
163
|
+
- ".travis.yml"
|
136
164
|
- Gemfile
|
137
165
|
- LICENSE.txt
|
138
166
|
- README.md
|
@@ -143,7 +171,6 @@ files:
|
|
143
171
|
- lib/flowdock/git.rb
|
144
172
|
- lib/flowdock/git/builder.rb
|
145
173
|
- post-receive
|
146
|
-
- spec/builder_spec.rb
|
147
174
|
- spec/flowdock_git_spec.rb
|
148
175
|
- spec/spec_helper.rb
|
149
176
|
homepage: http://github.com/flowdock/flowdock-git-hook
|
@@ -156,17 +183,17 @@ require_paths:
|
|
156
183
|
- lib
|
157
184
|
required_ruby_version: !ruby/object:Gem::Requirement
|
158
185
|
requirements:
|
159
|
-
- -
|
186
|
+
- - ">="
|
160
187
|
- !ruby/object:Gem::Version
|
161
188
|
version: '0'
|
162
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
190
|
requirements:
|
164
|
-
- -
|
191
|
+
- - ">="
|
165
192
|
- !ruby/object:Gem::Version
|
166
193
|
version: '0'
|
167
194
|
requirements: []
|
168
195
|
rubyforge_project:
|
169
|
-
rubygems_version: 2.
|
196
|
+
rubygems_version: 2.4.1
|
170
197
|
signing_key:
|
171
198
|
specification_version: 4
|
172
199
|
summary: Git Post-Receive hook for Flowdock
|
data/spec/builder_spec.rb
DELETED
@@ -1,135 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
3
|
-
|
4
|
-
describe "Git Payload Builder" do
|
5
|
-
before :each do
|
6
|
-
@repo = Grit::Repo.new(".")
|
7
|
-
@before = "7e32af569ba794b0b1c5e4c38fef1d4e2e56be51"
|
8
|
-
@after = "a66d3ce668ae6f2a42d54d811962724200d5b32b"
|
9
|
-
end
|
10
|
-
|
11
|
-
it "parses ref name from head" do
|
12
|
-
Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, @after).ref_name.should == "master"
|
13
|
-
end
|
14
|
-
|
15
|
-
it "parses ref name from tag" do
|
16
|
-
Flowdock::Git::Builder.new(@repo, "refs/tags/release-1.0", @before, @after).ref_name.should == "release-1.0"
|
17
|
-
end
|
18
|
-
|
19
|
-
it "detects new branch and sets created=true in data" do
|
20
|
-
hash = Flowdock::Git::Builder.new(@repo, "refs/heads/master", "0000000000000000000000000000000000000000", @after).to_hash
|
21
|
-
hash[:created].should eq(true)
|
22
|
-
hash[:deleted].should_not eq(true)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "detects deleted branch and sets deleted=true in data" do
|
26
|
-
hash = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, "0000000000000000000000000000000000000000").to_hash
|
27
|
-
hash[:deleted].should eq(true)
|
28
|
-
hash[:created].should_not eq(true)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "doesn't include commits in branch delete" do
|
32
|
-
hash = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, "0000000000000000000000000000000000000000").to_hash
|
33
|
-
hash[:commits].should be_empty
|
34
|
-
end
|
35
|
-
|
36
|
-
describe "data hash" do
|
37
|
-
before :each do
|
38
|
-
@repo.stub!(:path).and_return("/foo/bar/flowdock-git-hook/.git")
|
39
|
-
@hash = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, @after).to_hash
|
40
|
-
end
|
41
|
-
|
42
|
-
if RUBY_VERSION > '1.9'
|
43
|
-
it "properly sets encoding for UTF-8 content" do
|
44
|
-
builder = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, "0000000000000000000000000000000000000000")
|
45
|
-
builder.stub(:commits).and_return([
|
46
|
-
{
|
47
|
-
:id => "0000000000000000000000000000000000000001",
|
48
|
-
:message => "This message contains UTF-8: ö".force_encoding("ASCII-8BIT"),
|
49
|
-
:timestamp => Time.now.iso8601,
|
50
|
-
:author => {
|
51
|
-
:name => "Föö Bär".force_encoding("ASCII-8BIT"),
|
52
|
-
:email => "foo@example.com"
|
53
|
-
},
|
54
|
-
:removed => [],
|
55
|
-
:added => [],
|
56
|
-
:modified => []
|
57
|
-
}
|
58
|
-
])
|
59
|
-
builder.to_hash[:commits][0][:message].encoding.should eq(Encoding::UTF_8)
|
60
|
-
builder.to_hash[:commits][0][:message].should == "This message contains UTF-8: ö"
|
61
|
-
end
|
62
|
-
|
63
|
-
it "encodes ISO-8859-1 to UTF-8" do
|
64
|
-
builder = Flowdock::Git::Builder.new(@repo, "refs/heads/master", @before, "0000000000000000000000000000000000000000")
|
65
|
-
builder.stub(:commits).and_return([
|
66
|
-
{
|
67
|
-
:id => "0000000000000000000000000000000000000001",
|
68
|
-
:message => "This message contains UTF-8: ö".encode("ISO-8859-1").force_encoding("ASCII-8BIT"),
|
69
|
-
:timestamp => Time.now.iso8601,
|
70
|
-
:author => {
|
71
|
-
:name => "Föö Bär".encode("ISO-8859-1").force_encoding("ASCII-8BIT"),
|
72
|
-
:email => "foo@example.com"
|
73
|
-
},
|
74
|
-
:removed => [],
|
75
|
-
:added => [],
|
76
|
-
:modified => []
|
77
|
-
}
|
78
|
-
])
|
79
|
-
builder.to_hash[:commits][0][:author][:name].encoding.should eq(Encoding::UTF_8)
|
80
|
-
builder.to_hash[:commits][0][:author][:name].should == "Föö Bär"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
it "contains before" do
|
85
|
-
@hash[:before].should == @before
|
86
|
-
end
|
87
|
-
|
88
|
-
it "contains after" do
|
89
|
-
@hash[:after].should == @after
|
90
|
-
end
|
91
|
-
|
92
|
-
it "contains ref" do
|
93
|
-
@hash[:ref].should == "refs/heads/master"
|
94
|
-
end
|
95
|
-
|
96
|
-
it "contains ref name" do
|
97
|
-
@hash[:ref_name].should == "master"
|
98
|
-
end
|
99
|
-
|
100
|
-
describe "commits" do
|
101
|
-
it "contains all changed commits" do
|
102
|
-
@hash[:commits].should have(2).items
|
103
|
-
end
|
104
|
-
|
105
|
-
it "has commit author information" do
|
106
|
-
@hash[:commits].first[:author][:name].should eq("Ville Lautanala")
|
107
|
-
@hash[:commits].first[:author][:email].should eq("lautis@gmail.com")
|
108
|
-
end
|
109
|
-
|
110
|
-
it "has commit id" do
|
111
|
-
@hash[:commits].first[:id].should == "cf4a78c59cf9e06ebd7336900b2a66b85a88b76c"
|
112
|
-
end
|
113
|
-
|
114
|
-
it "puts deleted files in an array" do
|
115
|
-
@hash[:commits].first[:removed].should include("spec/flowdock-git-hook_spec.rb")
|
116
|
-
end
|
117
|
-
|
118
|
-
it "puts added files to an array" do
|
119
|
-
@hash[:commits].first[:added].should include("lib/flowdock/git.rb")
|
120
|
-
end
|
121
|
-
|
122
|
-
it "detects modified files" do
|
123
|
-
@hash[:commits].first[:modified].should_not include("spec/flowdock-git-hook_spec.rb")
|
124
|
-
@hash[:commits].first[:modified].should_not include("lib/flowdock/git.rb")
|
125
|
-
@hash[:commits].first[:modified].should include("lib/flowdock-git-hook.rb")
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
describe "repository information" do
|
130
|
-
it "contains repository name based on file path" do
|
131
|
-
@hash[:repository][:name] = "flowdock-git-hook"
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|