pivotal-integration 1.6.0.1

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.
Files changed (43) hide show
  1. checksums.yaml +15 -0
  2. data/LICENSE +202 -0
  3. data/NOTICE +2 -0
  4. data/README.md +331 -0
  5. data/bin/pivotal +81 -0
  6. data/lib/pivotal-integration/command/assign.rb +50 -0
  7. data/lib/pivotal-integration/command/base.rb +63 -0
  8. data/lib/pivotal-integration/command/command.rb +20 -0
  9. data/lib/pivotal-integration/command/comment.rb +31 -0
  10. data/lib/pivotal-integration/command/configuration.rb +129 -0
  11. data/lib/pivotal-integration/command/estimate.rb +53 -0
  12. data/lib/pivotal-integration/command/finish.rb +50 -0
  13. data/lib/pivotal-integration/command/info.rb +30 -0
  14. data/lib/pivotal-integration/command/label.rb +33 -0
  15. data/lib/pivotal-integration/command/mark.rb +44 -0
  16. data/lib/pivotal-integration/command/new.rb +52 -0
  17. data/lib/pivotal-integration/command/open.rb +31 -0
  18. data/lib/pivotal-integration/command/prepare-commit-msg.sh +26 -0
  19. data/lib/pivotal-integration/command/release.rb +54 -0
  20. data/lib/pivotal-integration/command/start.rb +82 -0
  21. data/lib/pivotal-integration/command/switch.rb +44 -0
  22. data/lib/pivotal-integration/util/git.rb +280 -0
  23. data/lib/pivotal-integration/util/label.rb +72 -0
  24. data/lib/pivotal-integration/util/shell.rb +36 -0
  25. data/lib/pivotal-integration/util/story.rb +170 -0
  26. data/lib/pivotal-integration/util/util.rb +20 -0
  27. data/lib/pivotal-integration/version-update/gradle.rb +64 -0
  28. data/lib/pivotal-integration/version-update/version_update.rb +20 -0
  29. data/lib/pivotal_integration.rb +18 -0
  30. data/spec/git-pivotal-tracker-integration/command/assign_spec.rb +55 -0
  31. data/spec/git-pivotal-tracker-integration/command/base_spec.rb +38 -0
  32. data/spec/git-pivotal-tracker-integration/command/configuration_spec.rb +119 -0
  33. data/spec/git-pivotal-tracker-integration/command/finish_spec.rb +45 -0
  34. data/spec/git-pivotal-tracker-integration/command/label_spec.rb +44 -0
  35. data/spec/git-pivotal-tracker-integration/command/mark_spec.rb +49 -0
  36. data/spec/git-pivotal-tracker-integration/command/release_spec.rb +57 -0
  37. data/spec/git-pivotal-tracker-integration/command/start_spec.rb +55 -0
  38. data/spec/git-pivotal-tracker-integration/util/git_spec.rb +235 -0
  39. data/spec/git-pivotal-tracker-integration/util/label_spec.rb +193 -0
  40. data/spec/git-pivotal-tracker-integration/util/shell_spec.rb +52 -0
  41. data/spec/git-pivotal-tracker-integration/util/story_spec.rb +158 -0
  42. data/spec/git-pivotal-tracker-integration/version-update/gradle_spec.rb +74 -0
  43. metadata +241 -0
@@ -0,0 +1,63 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'command'
17
+ require_relative 'configuration'
18
+ require_relative '../util/git'
19
+ require_relative '../util/story'
20
+ require 'pivotal-tracker'
21
+
22
+ # An abstract base class for all commands
23
+ # @abstract Subclass and override {#run} to implement command functionality
24
+ class PivotalIntegration::Command::Base
25
+ # Common initialization functionality for all command classes. This
26
+ # enforces that:
27
+ # * the command is being run within a valid Git repository
28
+ # * the user has specified their Pivotal Tracker API token
29
+ # * all communication with Pivotal Tracker will be protected with SSL
30
+ # * the user has configured the project id for this repository
31
+ def initialize(options = {})
32
+ @options = options
33
+ @repository_root = PivotalIntegration::Util::Git.repository_root
34
+ @configuration = PivotalIntegration::Command::Configuration.new
35
+
36
+ PivotalTracker::Client.token = @configuration.api_token
37
+ PivotalTracker::Client.use_ssl = true
38
+
39
+ @project = PivotalTracker::Project.find @configuration.project_id
40
+ end
41
+
42
+ # The main entry point to the command's execution
43
+ # @abstract Override this method to implement command functionality
44
+ def run(*arguments)
45
+ raise NotImplementedError
46
+ end
47
+
48
+ def story
49
+ if @options[:story_id]
50
+ @configuration.project.stories.find(@options[:story_id])
51
+ else
52
+ @configuration.story
53
+ end
54
+ end
55
+
56
+ class << self
57
+ attr_reader :description
58
+
59
+ def desc(text)
60
+ @description = text
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,20 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative '../../pivotal_integration'
17
+
18
+ # A module encapsulating the commands for the project
19
+ module PivotalIntegration::Command
20
+ end
@@ -0,0 +1,31 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require 'pivotal-tracker'
18
+
19
+ # The class that encapsulates assigning current Pivotal Tracker Story to a user
20
+ class PivotalIntegration::Command::Comment < PivotalIntegration::Command::Base
21
+ desc "Add a comment to the current story"
22
+
23
+ def run(*arguments)
24
+ comment = arguments.first
25
+ abort "A comment must be provided." unless comment
26
+
27
+ print "Adding comment to story ##{story.id}... "
28
+ PivotalIntegration::Util::Story.add_comment(story, comment)
29
+ puts 'OK'
30
+ end
31
+ end
@@ -0,0 +1,129 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'command'
17
+ require_relative '../util/git'
18
+ require 'highline/import'
19
+ require 'pivotal-tracker'
20
+
21
+ # A class that exposes configuration that commands can use
22
+ class PivotalIntegration::Command::Configuration
23
+
24
+ # Returns the user's Pivotal Tracker API token. If this token has not been
25
+ # configured, prompts the user for the value. The value is checked for in
26
+ # the _inherited_ Git configuration, but is stored in the _global_ Git
27
+ # configuration so that it can be used across multiple repositories.
28
+ #
29
+ # @return [String] The user's Pivotal Tracker API token
30
+ def api_token
31
+ api_token = PivotalIntegration::Util::Git.get_config KEY_API_TOKEN, :inherited
32
+
33
+ if api_token.empty?
34
+ api_token = ask('Pivotal API Token (found at https://www.pivotaltracker.com/profile): ').strip
35
+ PivotalIntegration::Util::Git.set_config KEY_API_TOKEN, api_token, :global
36
+ puts
37
+ end
38
+
39
+ api_token
40
+ end
41
+
42
+ # Returns the Pivotal Tracker project id for this repository. If this id
43
+ # has not been configuration, prompts the user for the value. The value is
44
+ # checked for in the _inherited_ Git configuration, but is stored in the
45
+ # _local_ Git configuration so that it is specific to this repository.
46
+ #
47
+ # @return [String] The repository's Pivotal Tracker project id
48
+ def project_id
49
+ project_id = PivotalIntegration::Util::Git.get_config KEY_PROJECT_ID, :inherited
50
+
51
+ if project_id.empty?
52
+ project_id = choose do |menu|
53
+ menu.prompt = 'Choose project associated with this repository: '
54
+
55
+ PivotalTracker::Project.all.sort_by { |project| project.name }.each do |project|
56
+ menu.choice(project.name) { project.id }
57
+ end
58
+ end
59
+
60
+ PivotalIntegration::Util::Git.set_config KEY_PROJECT_ID, project_id, :local
61
+ puts
62
+ end
63
+
64
+ project_id
65
+ end
66
+
67
+ # Returns the Pivotal Tracker project for this repository. If it is not
68
+ # configured yet, prompts the user for the value.
69
+ #
70
+ # @return [PivotalTracker::Project] The repository's Pivotal Tracker project
71
+ def project
72
+ PivotalTracker::Project.find project_id
73
+ end
74
+
75
+ # Returns the Pivotal Tracker user id for this repository. If this id
76
+ # has not been configuration, prompts the user for the value. The value is
77
+ # checked for in the _inherited_ Git configuration, but is stored in the
78
+ # _local_ Git configuration so that it is specific to this repository.
79
+ #
80
+ # @return [String] The repository's Pivotal Tracker user id
81
+ def user
82
+ user = PivotalIntegration::Util::Git.get_config KEY_USER, :inherited
83
+
84
+ if user.empty?
85
+ user = choose do |menu|
86
+ menu.prompt = 'Choose your user name associated with this repository: '
87
+
88
+ PivotalTracker::Project.all.map{ |p| p.memberships.all.map(&:name) }.flatten.uniq.each do |owner|
89
+ menu.choice(owner) { owner }
90
+ end
91
+ end
92
+
93
+ PivotalIntegration::Util::Git.set_config KEY_USER, user.inspect, :local
94
+ end
95
+
96
+ user
97
+ end
98
+
99
+ # Returns the story associated with the current development branch
100
+ #
101
+ # @return [PivotalTracker::Story] the story associated with the current development branch
102
+ def story
103
+ story_id = PivotalIntegration::Util::Git.get_config KEY_STORY_ID, :branch
104
+ if story_id.empty?
105
+ abort("You need to be on started story branch to do this!")
106
+ else
107
+ project.stories.find(story_id)
108
+ end
109
+ end
110
+
111
+ # Stores the story associated with the current development branch
112
+ #
113
+ # @param [PivotalTracker::Story] story the story associated with the current development branch
114
+ # @return [void]
115
+ def story=(story)
116
+ PivotalIntegration::Util::Git.set_config KEY_STORY_ID, story.id, :branch
117
+ end
118
+
119
+ private
120
+
121
+ KEY_API_TOKEN = 'pivotal.api-token'.freeze
122
+
123
+ KEY_USER = 'pivotal.user'.freeze
124
+
125
+ KEY_PROJECT_ID = 'pivotal.project-id'.freeze
126
+
127
+ KEY_STORY_ID = 'pivotal-story-id'.freeze
128
+
129
+ end
@@ -0,0 +1,53 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+
18
+ # The class that encapsulates starting a Pivotal Tracker Story
19
+ class PivotalIntegration::Command::Estimate < PivotalIntegration::Command::Base
20
+ desc "Assign an estimate to the current story"
21
+
22
+ def run(*arguments)
23
+ score = arguments.first
24
+
25
+ unless score
26
+ case story.estimate
27
+ when -1
28
+ puts "Story is currently unestimated."
29
+ else
30
+ puts "Story is currently estimated #{story.estimate}."
31
+ end
32
+
33
+ score = self.class.collect_estimation(@configuration.project)
34
+ end
35
+
36
+ case score
37
+ when -1
38
+ print 'Changing to unestimated... '
39
+ else
40
+ print "Changing estimation to #{score}... "
41
+ end
42
+
43
+ PivotalIntegration::Util::Story.estimate(story, score)
44
+ puts 'OK'
45
+ end
46
+
47
+ def self.collect_estimation(project)
48
+ possible_scores = project.point_scale.split(',')
49
+ score = -1
50
+ score = ask("Choose an estimation for this story [#{possible_scores.join(', ')}, enter for none]: ") until possible_scores.include?(score) or score.blank?
51
+ score.blank? ? -1 : score
52
+ end
53
+ end
@@ -0,0 +1,50 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+
18
+ # The class that encapsulates finishing a Pivotal Tracker Story
19
+ class PivotalIntegration::Command::Finish < PivotalIntegration::Command::Base
20
+ desc "Finish working on a story"
21
+
22
+ # Finishes a Pivotal Tracker story by doing the following steps:
23
+ # * Check that the pending merge will be trivial
24
+ # * Merge the development branch into the root branch
25
+ # * Delete the development branch
26
+ # * Push changes to remote
27
+ #
28
+ # @return [void]
29
+ def run(*arguments)
30
+ no_complete = arguments.delete('--no-complete')
31
+ no_delete = arguments.delete('--no-delete')
32
+ no_merge = arguments.delete('--no-merge')
33
+ pull_request = arguments.delete('--pull-request') || PivotalIntegration::Util::Git.finish_mode == :pull_request
34
+
35
+ if pull_request
36
+ PivotalIntegration::Util::Git.push PivotalIntegration::Util::Git.branch_name
37
+ PivotalIntegration::Util::Git.create_pull_request(@configuration.story)
38
+ PivotalIntegration::Util::Story.mark(@configuration.story, :finished)
39
+ return
40
+ end
41
+
42
+ unless no_merge
43
+ PivotalIntegration::Util::Git.trivial_merge?
44
+ PivotalIntegration::Util::Git.merge(@configuration.story, no_complete, no_delete)
45
+ end
46
+
47
+ PivotalIntegration::Util::Git.push PivotalIntegration::Util::Git.branch_name
48
+ end
49
+
50
+ end
@@ -0,0 +1,30 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require 'pivotal-tracker'
18
+
19
+ # The class that encapsulates assigning current Pivotal Tracker Story to a user
20
+ class PivotalIntegration::Command::Info < PivotalIntegration::Command::Base
21
+ desc "Get information on the current story"
22
+
23
+ def run(*arguments)
24
+ if story
25
+ PivotalIntegration::Util::Story.pretty_print story
26
+ else
27
+ abort "No story currently selected."
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require_relative '../util/label'
18
+ require 'pivotal-tracker'
19
+
20
+ MODES = %w(add remove list once)
21
+
22
+ # The class that encapsulates starting a Pivotal Tracker Story
23
+ class PivotalIntegration::Command::Label < PivotalIntegration::Command::Base
24
+ desc "Manage labels for the current story"
25
+
26
+ # Adds labels for active story.
27
+ # @return [void]
28
+ def run(mode, *labels)
29
+ abort "You need to specify mode first [#{MODES}], e.g. 'git label add to_qa'" unless MODES.include? mode
30
+
31
+ PivotalIntegration::Util::Label.send(mode, story, *labels)
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require 'pivotal-tracker'
18
+
19
+ # The class that encapsulates assigning current Pivotal Tracker Story to a user
20
+ class PivotalIntegration::Command::Mark < PivotalIntegration::Command::Base
21
+ desc "Mark the current story with a given state"
22
+
23
+ STATES = %w(unstarted started finished delivered rejected accepted)
24
+
25
+ # Assigns story to user.
26
+ # @return [void]
27
+ def run(*arguments)
28
+ state = arguments.first
29
+ state = choose_state if state.nil? or !STATES.include?(state)
30
+
31
+ PivotalIntegration::Util::Story.mark(story, state)
32
+ end
33
+
34
+ private
35
+
36
+ def choose_state
37
+ choose do |menu|
38
+ menu.prompt = 'Choose story state from above list: '
39
+ STATES.each do |state|
40
+ menu.choice(state)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,52 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require 'pivotal-tracker'
18
+
19
+ # The class that encapsulates starting a Pivotal Tracker Story
20
+ class PivotalIntegration::Command::New < PivotalIntegration::Command::Base
21
+ desc "Create a new story"
22
+
23
+ STORY_TYPES = %w(feature bug chore release)
24
+ def run(*arguments)
25
+ options = self.class.collect_type_and_name(arguments)
26
+
27
+ puts
28
+ print 'Creating new story on Pivotal Tracker... '
29
+ PivotalIntegration::Util::Story.new(@configuration.project, *options)
30
+ puts 'OK'
31
+ end
32
+
33
+ class << self
34
+ def collect_type_and_name(arguments)
35
+ type = STORY_TYPES.include?(arguments.first.try(:downcase)) ? arguments.shift : choose_type
36
+ type = type.downcase.to_sym
37
+
38
+ name = arguments.shift || ask('Provide a name for the new story: ')
39
+
40
+ [name, type]
41
+ end
42
+
43
+ private
44
+
45
+ def choose_type
46
+ choose do |menu|
47
+ menu.prompt = 'What type of story do you want to create: '
48
+ STORY_TYPES.each { |type| menu.choice(type.titleize) }
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,31 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require 'pivotal-tracker'
18
+ require 'launchy'
19
+
20
+ # The class that encapsulates assigning current Pivotal Tracker Story to a user
21
+ class PivotalIntegration::Command::Open < PivotalIntegration::Command::Base
22
+ desc "Open the current story or project in a web browser."
23
+
24
+ def run(*arguments)
25
+ if arguments.first.try(:downcase) == 'project'
26
+ Launchy.open "https://www.pivotaltracker.com/s/projects/#{story.project_id}"
27
+ else
28
+ Launchy.open story.url
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env bash
2
+ # Git Pivotal Tracker Integration
3
+ # Copyright (c) 2013 the original author or authors.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ CURRENT_BRANCH=$(git branch | grep "*" | sed "s/* //")
18
+ STORY_ID=$(git config branch.$CURRENT_BRANCH.pivotal-story-id)
19
+
20
+ if [[ $2 != "commit" && -n $STORY_ID ]]; then
21
+ ORIG_MSG_FILE="$1"
22
+ TEMP=$(mktemp /tmp/git-XXXXX)
23
+
24
+ (printf "\n\n[#$STORY_ID] " ; cat "$1") > "$TEMP"
25
+ cat "$TEMP" > "$ORIG_MSG_FILE"
26
+ fi
@@ -0,0 +1,54 @@
1
+ # Git Pivotal Tracker Integration
2
+ # Copyright (c) 2013 the original author or authors.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ require_relative 'base'
17
+ require_relative '../version-update/gradle'
18
+
19
+ # The class that encapsulates releasing a Pivotal Tracker Story
20
+ class PivotalIntegration::Command::Release < PivotalIntegration::Command::Base
21
+ desc "Create a release for a story"
22
+
23
+ # Releases a Pivotal Tracker story by doing the following steps:
24
+ # * Update the version to the release version
25
+ # * Create a tag for the release version
26
+ # * Update the version to the new development version
27
+ # * Push tag and changes to remote
28
+ #
29
+ # @param [String, nil] filter a filter for selecting the release to start. This
30
+ # filter can be either:
31
+ # * a story id
32
+ # * +nil+
33
+ # @return [void]
34
+ def run(filter)
35
+ story = PivotalIntegration::Util::Story.select_story(@project, filter.nil? ? 'release' : filter, 1)
36
+ PivotalIntegration::Util::Story.pretty_print story
37
+
38
+ updater = [
39
+ PivotalIntegration::VersionUpdate::Gradle.new(@repository_root)
40
+ ].find { |candidate| candidate.supports? }
41
+
42
+ current_version = updater.current_version
43
+ release_version = ask("Enter release version (current: #{current_version}): ")
44
+ next_version = ask("Enter next development version (current: #{current_version}): ")
45
+
46
+ updater.update_version release_version
47
+ PivotalIntegration::Util::Git.create_release_tag release_version, story
48
+ updater.update_version next_version
49
+ PivotalIntegration::Util::Git.create_commit "#{next_version} Development", story
50
+
51
+ PivotalIntegration::Util::Git.push PivotalIntegration::Util::Git.branch_name, "v#{release_version}"
52
+ end
53
+
54
+ end