Commit b90cbfd21ec9bd366ee931d246d51f8821b2a023

Authored by Dmitriy Zaporozhets
1 parent 9c668133

Move project services models to own subdirectory

Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
app/models/assembla_service.rb
... ... @@ -1,45 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -class AssemblaService < Service
19   - include HTTParty
20   -
21   - validates :token, presence: true, if: :activated?
22   -
23   - def title
24   - 'Assembla'
25   - end
26   -
27   - def description
28   - 'Project Management Software (Source Commits Endpoint)'
29   - end
30   -
31   - def to_param
32   - 'assembla'
33   - end
34   -
35   - def fields
36   - [
37   - { type: 'text', name: 'token', placeholder: '' }
38   - ]
39   - end
40   -
41   - def execute(push)
42   - url = "https://atlas.assembla.com/spaces/ouposp/github_tool?secret_key=#{token}"
43   - AssemblaService.post(url, body: { payload: push }.to_json, headers: { 'Content-Type' => 'application/json' })
44   - end
45   -end
app/models/campfire_service.rb
... ... @@ -1,78 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -class CampfireService < Service
19   - attr_accessible :subdomain, :room
20   -
21   - validates :token, presence: true, if: :activated?
22   -
23   - def title
24   - 'Campfire'
25   - end
26   -
27   - def description
28   - 'Simple web-based real-time group chat'
29   - end
30   -
31   - def to_param
32   - 'campfire'
33   - end
34   -
35   - def fields
36   - [
37   - { type: 'text', name: 'token', placeholder: '' },
38   - { type: 'text', name: 'subdomain', placeholder: '' },
39   - { type: 'text', name: 'room', placeholder: '' }
40   - ]
41   - end
42   -
43   - def execute(push_data)
44   - room = gate.find_room_by_name(self.room)
45   - return true unless room
46   -
47   - message = build_message(push_data)
48   -
49   - room.speak(message)
50   - end
51   -
52   - private
53   -
54   - def gate
55   - @gate ||= Tinder::Campfire.new(subdomain, token: token)
56   - end
57   -
58   - def build_message(push)
59   - ref = push[:ref].gsub("refs/heads/", "")
60   - before = push[:before]
61   - after = push[:after]
62   -
63   - message = ""
64   - message << "[#{project.name_with_namespace}] "
65   - message << "#{push[:user_name]} "
66   -
67   - if before =~ /000000/
68   - message << "pushed new branch #{ref} \n"
69   - elsif after =~ /000000/
70   - message << "removed branch #{ref} \n"
71   - else
72   - message << "pushed #{push[:total_commits_count]} commits to #{ref}. "
73   - message << "#{project.web_url}/compare/#{before}...#{after}"
74   - end
75   -
76   - message
77   - end
78   -end
app/models/flowdock_service.rb
... ... @@ -1,54 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -require "flowdock-git-hook"
19   -
20   -class FlowdockService < Service
21   - validates :token, presence: true, if: :activated?
22   -
23   - def title
24   - 'Flowdock'
25   - end
26   -
27   - def description
28   - 'Flowdock is a collaboration web app for technical teams.'
29   - end
30   -
31   - def to_param
32   - 'flowdock'
33   - end
34   -
35   - def fields
36   - [
37   - { type: 'text', name: 'token', placeholder: '' }
38   - ]
39   - end
40   -
41   - def execute(push_data)
42   - repo_path = File.join(Gitlab.config.gitlab_shell.repos_path, "#{project.path_with_namespace}.git")
43   - Flowdock::Git.post(
44   - push_data[:ref],
45   - push_data[:before],
46   - push_data[:after],
47   - token: token,
48   - repo: repo_path,
49   - repo_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}",
50   - commit_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/%s",
51   - diff_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/compare/%s...%s",
52   - )
53   - end
54   -end
app/models/gitlab_ci_service.rb
... ... @@ -1,78 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -class GitlabCiService < Service
19   - attr_accessible :project_url
20   -
21   - validates :project_url, presence: true, if: :activated?
22   - validates :token, presence: true, if: :activated?
23   -
24   - delegate :execute, to: :service_hook, prefix: nil
25   -
26   - after_save :compose_service_hook, if: :activated?
27   -
28   - def compose_service_hook
29   - hook = service_hook || build_service_hook
30   - hook.url = [project_url, "/build", "?token=#{token}"].join("")
31   - hook.save
32   - end
33   -
34   - def commit_status_path sha
35   - project_url + "/builds/#{sha}/status.json?token=#{token}"
36   - end
37   -
38   - def commit_status sha
39   - response = HTTParty.get(commit_status_path(sha))
40   -
41   - if response.code == 200 and response["status"]
42   - response["status"]
43   - else
44   - :error
45   - end
46   - end
47   -
48   - def build_page sha
49   - project_url + "/builds/#{sha}"
50   - end
51   -
52   - def builds_path
53   - project_url + "?ref=" + project.default_branch
54   - end
55   -
56   - def status_img_path
57   - project_url + "/status.png?ref=" + project.default_branch
58   - end
59   -
60   - def title
61   - 'GitLab CI'
62   - end
63   -
64   - def description
65   - 'Continuous integration server from GitLab'
66   - end
67   -
68   - def to_param
69   - 'gitlab_ci'
70   - end
71   -
72   - def fields
73   - [
74   - { type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' },
75   - { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3'}
76   - ]
77   - end
78   -end
app/models/hipchat_service.rb
... ... @@ -1,74 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -class HipchatService < Service
19   - attr_accessible :room
20   -
21   - validates :token, presence: true, if: :activated?
22   -
23   - def title
24   - 'Hipchat'
25   - end
26   -
27   - def description
28   - 'Private group chat and IM'
29   - end
30   -
31   - def to_param
32   - 'hipchat'
33   - end
34   -
35   - def fields
36   - [
37   - { type: 'text', name: 'token', placeholder: '' },
38   - { type: 'text', name: 'room', placeholder: '' }
39   - ]
40   - end
41   -
42   - def execute(push_data)
43   - gate[room].send('Gitlab', create_message(push_data))
44   - end
45   -
46   - private
47   -
48   - def gate
49   - @gate ||= HipChat::Client.new(token)
50   - end
51   -
52   - def create_message(push)
53   - ref = push[:ref].gsub("refs/heads/", "")
54   - before = push[:before]
55   - after = push[:after]
56   -
57   - message = ""
58   - message << "#{push[:user_name]} "
59   - if before =~ /000000/
60   - message << "pushed new branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> to <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a>\n"
61   - elsif after =~ /000000/
62   - message << "removed branch #{ref} from <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> \n"
63   - else
64   - message << "#pushed to branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> "
65   - message << "of <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> "
66   - message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)"
67   - for commit in push[:commits] do
68   - message << "<br /> - #{commit[:message]} (<a href=\"#{commit[:url]}\">#{commit[:id][0..5]}</a>)"
69   - end
70   - end
71   -
72   - message
73   - end
74   -end
app/models/pivotaltracker_service.rb
... ... @@ -1,62 +0,0 @@
1   -# == Schema Information
2   -#
3   -# Table name: services
4   -#
5   -# id :integer not null, primary key
6   -# type :string(255)
7   -# title :string(255)
8   -# token :string(255)
9   -# project_id :integer not null
10   -# created_at :datetime not null
11   -# updated_at :datetime not null
12   -# active :boolean default(FALSE), not null
13   -# project_url :string(255)
14   -# subdomain :string(255)
15   -# room :string(255)
16   -#
17   -
18   -class PivotaltrackerService < Service
19   - include HTTParty
20   -
21   - validates :token, presence: true, if: :activated?
22   -
23   - def title
24   - 'PivotalTracker'
25   - end
26   -
27   - def description
28   - 'Project Management Software (Source Commits Endpoint)'
29   - end
30   -
31   - def to_param
32   - 'pivotaltracker'
33   - end
34   -
35   - def fields
36   - [
37   - { type: 'text', name: 'token', placeholder: '' }
38   - ]
39   - end
40   -
41   - def execute(push)
42   - url = 'https://www.pivotaltracker.com/services/v5/source_commits'
43   - push[:commits].each do |commit|
44   - message = {
45   - 'source_commit' => {
46   - 'commit_id' => commit[:id],
47   - 'author' => commit[:author][:name],
48   - 'url' => commit[:url],
49   - 'message' => commit[:message]
50   - }
51   - }
52   - PivotaltrackerService.post(
53   - url,
54   - body: message.to_json,
55   - headers: {
56   - 'Content-Type' => 'application/json',
57   - 'X-TrackerToken' => token
58   - }
59   - )
60   - end
61   - end
62   -end
app/models/project.rb
... ... @@ -23,6 +23,13 @@
23 23 # visibility_level :integer default(0), not null
24 24 #
25 25  
  26 +require_relative "project_services/assembla_service"
  27 +require_relative "project_services/campfire_service"
  28 +require_relative "project_services/flowdock_service"
  29 +require_relative "project_services/gitlab_ci_service"
  30 +require_relative "project_services/hipchat_service"
  31 +require_relative "project_services/pivotaltracker_service"
  32 +
26 33 class Project < ActiveRecord::Base
27 34 include Gitlab::ShellAdapter
28 35 include Gitlab::VisibilityLevel
... ...
app/models/project_services/assembla_service.rb 0 → 100644
... ... @@ -0,0 +1,45 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +class AssemblaService < Service
  19 + include HTTParty
  20 +
  21 + validates :token, presence: true, if: :activated?
  22 +
  23 + def title
  24 + 'Assembla'
  25 + end
  26 +
  27 + def description
  28 + 'Project Management Software (Source Commits Endpoint)'
  29 + end
  30 +
  31 + def to_param
  32 + 'assembla'
  33 + end
  34 +
  35 + def fields
  36 + [
  37 + { type: 'text', name: 'token', placeholder: '' }
  38 + ]
  39 + end
  40 +
  41 + def execute(push)
  42 + url = "https://atlas.assembla.com/spaces/ouposp/github_tool?secret_key=#{token}"
  43 + AssemblaService.post(url, body: { payload: push }.to_json, headers: { 'Content-Type' => 'application/json' })
  44 + end
  45 +end
... ...
app/models/project_services/campfire_service.rb 0 → 100644
... ... @@ -0,0 +1,78 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +class CampfireService < Service
  19 + attr_accessible :subdomain, :room
  20 +
  21 + validates :token, presence: true, if: :activated?
  22 +
  23 + def title
  24 + 'Campfire'
  25 + end
  26 +
  27 + def description
  28 + 'Simple web-based real-time group chat'
  29 + end
  30 +
  31 + def to_param
  32 + 'campfire'
  33 + end
  34 +
  35 + def fields
  36 + [
  37 + { type: 'text', name: 'token', placeholder: '' },
  38 + { type: 'text', name: 'subdomain', placeholder: '' },
  39 + { type: 'text', name: 'room', placeholder: '' }
  40 + ]
  41 + end
  42 +
  43 + def execute(push_data)
  44 + room = gate.find_room_by_name(self.room)
  45 + return true unless room
  46 +
  47 + message = build_message(push_data)
  48 +
  49 + room.speak(message)
  50 + end
  51 +
  52 + private
  53 +
  54 + def gate
  55 + @gate ||= Tinder::Campfire.new(subdomain, token: token)
  56 + end
  57 +
  58 + def build_message(push)
  59 + ref = push[:ref].gsub("refs/heads/", "")
  60 + before = push[:before]
  61 + after = push[:after]
  62 +
  63 + message = ""
  64 + message << "[#{project.name_with_namespace}] "
  65 + message << "#{push[:user_name]} "
  66 +
  67 + if before =~ /000000/
  68 + message << "pushed new branch #{ref} \n"
  69 + elsif after =~ /000000/
  70 + message << "removed branch #{ref} \n"
  71 + else
  72 + message << "pushed #{push[:total_commits_count]} commits to #{ref}. "
  73 + message << "#{project.web_url}/compare/#{before}...#{after}"
  74 + end
  75 +
  76 + message
  77 + end
  78 +end
... ...
app/models/project_services/flowdock_service.rb 0 → 100644
... ... @@ -0,0 +1,54 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +require "flowdock-git-hook"
  19 +
  20 +class FlowdockService < Service
  21 + validates :token, presence: true, if: :activated?
  22 +
  23 + def title
  24 + 'Flowdock'
  25 + end
  26 +
  27 + def description
  28 + 'Flowdock is a collaboration web app for technical teams.'
  29 + end
  30 +
  31 + def to_param
  32 + 'flowdock'
  33 + end
  34 +
  35 + def fields
  36 + [
  37 + { type: 'text', name: 'token', placeholder: '' }
  38 + ]
  39 + end
  40 +
  41 + def execute(push_data)
  42 + repo_path = File.join(Gitlab.config.gitlab_shell.repos_path, "#{project.path_with_namespace}.git")
  43 + Flowdock::Git.post(
  44 + push_data[:ref],
  45 + push_data[:before],
  46 + push_data[:after],
  47 + token: token,
  48 + repo: repo_path,
  49 + repo_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}",
  50 + commit_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/commit/%s",
  51 + diff_url: "#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}/compare/%s...%s",
  52 + )
  53 + end
  54 +end
... ...
app/models/project_services/gitlab_ci_service.rb 0 → 100644
... ... @@ -0,0 +1,78 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +class GitlabCiService < Service
  19 + attr_accessible :project_url
  20 +
  21 + validates :project_url, presence: true, if: :activated?
  22 + validates :token, presence: true, if: :activated?
  23 +
  24 + delegate :execute, to: :service_hook, prefix: nil
  25 +
  26 + after_save :compose_service_hook, if: :activated?
  27 +
  28 + def compose_service_hook
  29 + hook = service_hook || build_service_hook
  30 + hook.url = [project_url, "/build", "?token=#{token}"].join("")
  31 + hook.save
  32 + end
  33 +
  34 + def commit_status_path sha
  35 + project_url + "/builds/#{sha}/status.json?token=#{token}"
  36 + end
  37 +
  38 + def commit_status sha
  39 + response = HTTParty.get(commit_status_path(sha))
  40 +
  41 + if response.code == 200 and response["status"]
  42 + response["status"]
  43 + else
  44 + :error
  45 + end
  46 + end
  47 +
  48 + def build_page sha
  49 + project_url + "/builds/#{sha}"
  50 + end
  51 +
  52 + def builds_path
  53 + project_url + "?ref=" + project.default_branch
  54 + end
  55 +
  56 + def status_img_path
  57 + project_url + "/status.png?ref=" + project.default_branch
  58 + end
  59 +
  60 + def title
  61 + 'GitLab CI'
  62 + end
  63 +
  64 + def description
  65 + 'Continuous integration server from GitLab'
  66 + end
  67 +
  68 + def to_param
  69 + 'gitlab_ci'
  70 + end
  71 +
  72 + def fields
  73 + [
  74 + { type: 'text', name: 'token', placeholder: 'GitLab CI project specific token' },
  75 + { type: 'text', name: 'project_url', placeholder: 'http://ci.gitlabhq.com/projects/3'}
  76 + ]
  77 + end
  78 +end
... ...
app/models/project_services/hipchat_service.rb 0 → 100644
... ... @@ -0,0 +1,74 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +class HipchatService < Service
  19 + attr_accessible :room
  20 +
  21 + validates :token, presence: true, if: :activated?
  22 +
  23 + def title
  24 + 'Hipchat'
  25 + end
  26 +
  27 + def description
  28 + 'Private group chat and IM'
  29 + end
  30 +
  31 + def to_param
  32 + 'hipchat'
  33 + end
  34 +
  35 + def fields
  36 + [
  37 + { type: 'text', name: 'token', placeholder: '' },
  38 + { type: 'text', name: 'room', placeholder: '' }
  39 + ]
  40 + end
  41 +
  42 + def execute(push_data)
  43 + gate[room].send('Gitlab', create_message(push_data))
  44 + end
  45 +
  46 + private
  47 +
  48 + def gate
  49 + @gate ||= HipChat::Client.new(token)
  50 + end
  51 +
  52 + def create_message(push)
  53 + ref = push[:ref].gsub("refs/heads/", "")
  54 + before = push[:before]
  55 + after = push[:after]
  56 +
  57 + message = ""
  58 + message << "#{push[:user_name]} "
  59 + if before =~ /000000/
  60 + message << "pushed new branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> to <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a>\n"
  61 + elsif after =~ /000000/
  62 + message << "removed branch #{ref} from <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> \n"
  63 + else
  64 + message << "#pushed to branch <a href=\"#{project.web_url}/commits/#{ref}\">#{ref}</a> "
  65 + message << "of <a href=\"#{project.web_url}\">#{project.name_with_namespace.gsub!(/\s/,'')}</a> "
  66 + message << "(<a href=\"#{project.web_url}/compare/#{before}...#{after}\">Compare changes</a>)"
  67 + for commit in push[:commits] do
  68 + message << "<br /> - #{commit[:message]} (<a href=\"#{commit[:url]}\">#{commit[:id][0..5]}</a>)"
  69 + end
  70 + end
  71 +
  72 + message
  73 + end
  74 +end
... ...
app/models/project_services/pivotaltracker_service.rb 0 → 100644
... ... @@ -0,0 +1,62 @@
  1 +# == Schema Information
  2 +#
  3 +# Table name: services
  4 +#
  5 +# id :integer not null, primary key
  6 +# type :string(255)
  7 +# title :string(255)
  8 +# token :string(255)
  9 +# project_id :integer not null
  10 +# created_at :datetime not null
  11 +# updated_at :datetime not null
  12 +# active :boolean default(FALSE), not null
  13 +# project_url :string(255)
  14 +# subdomain :string(255)
  15 +# room :string(255)
  16 +#
  17 +
  18 +class PivotaltrackerService < Service
  19 + include HTTParty
  20 +
  21 + validates :token, presence: true, if: :activated?
  22 +
  23 + def title
  24 + 'PivotalTracker'
  25 + end
  26 +
  27 + def description
  28 + 'Project Management Software (Source Commits Endpoint)'
  29 + end
  30 +
  31 + def to_param
  32 + 'pivotaltracker'
  33 + end
  34 +
  35 + def fields
  36 + [
  37 + { type: 'text', name: 'token', placeholder: '' }
  38 + ]
  39 + end
  40 +
  41 + def execute(push)
  42 + url = 'https://www.pivotaltracker.com/services/v5/source_commits'
  43 + push[:commits].each do |commit|
  44 + message = {
  45 + 'source_commit' => {
  46 + 'commit_id' => commit[:id],
  47 + 'author' => commit[:author][:name],
  48 + 'url' => commit[:url],
  49 + 'message' => commit[:message]
  50 + }
  51 + }
  52 + PivotaltrackerService.post(
  53 + url,
  54 + body: message.to_json,
  55 + headers: {
  56 + 'Content-Type' => 'application/json',
  57 + 'X-TrackerToken' => token
  58 + }
  59 + )
  60 + end
  61 + end
  62 +end
... ...