optimis-workflow-scripts 0.0.1 → 0.0.2

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/bin/finish-feature CHANGED
@@ -1,28 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Syntax: finish-story msg
4
- # * Determine current local feature branch
5
- # * Extract story id from branch name (should be feature-STORYID)
6
- # * git checkout master
7
- # * git merge --squash feature-branch
8
- # * git commit 'Finish feature STORY TITLE [Story #STORYID]
9
- # * git push origin master
3
+ require File.expand_path(File.dirname(__FILE__)) + '/../lib/optimis-workflow'
10
4
 
11
- # system "git checkout master"
12
-
13
- current_branch = `git branch | grep '\*' | awk '{print $2}'`
14
- story_id = current_branch.split("-").last.chomp!
15
- modified_files = `git ls-files --modified && git ls-files --deleted && git ls-files --unmerged`
16
-
17
- fail "Error! You must specify a commit message." unless ARGV[0]
18
- fail "Whoops! You have uncommitted changes! Please commit or stash everything and then run again." unless modified_files.empty?
19
-
20
- if ARGV[0] == "-h" || ARGV[0] == "--help" || ARGV[0] == "help"
21
- puts "Syntax: finish-feature commit-msg"
22
- else
23
- commit_message = ARGV[0].chomp
24
- system 'git checkout master'
25
- system "git merge --squash #{current_branch}"
26
- system "git commit -m '#{commit_message} [finishes ##{story_id}\]'"
27
- system "git push origin master"
28
- end
5
+ OptimisWorkflow::Commands::FinishFeature.new(ARGV.dup).execute!
data/bin/finish-hotfix ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require File.expand_path(File.dirname(__FILE__)) + '/../lib/optimis-workflow'
4
+
5
+ OptimisWorkflow::Commands::FinishHotfix.new(ARGV.dup).execute!
data/bin/start-feature CHANGED
@@ -1,35 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'yaml'
4
- require 'uri'
5
- require 'net/http'
6
-
7
- fail "Please pass in a story id" if ARGV.empty?
8
-
9
- if ARGV[0] == "-h" || ARGV[0] == "--help" || ARGV[0] == "help"
10
- puts "Syntax: start-feature STORYID"
11
- else
12
- story_id = ARGV[0].chomp
13
- current_dir = `pwd`.chomp
14
- settings_file = current_dir + '/.tracker_settings.yml'
15
-
16
- @tracker_settings = YAML.load_file(settings_file) if File.exists?(settings_file)
17
-
18
- unless @tracker_settings.nil?
19
- url = URI.parse("http://www.pivotaltracker.com/services/v3/projects/#{@tracker_settings['project_id']}/stories/#{story_id}")
20
-
21
- net = Net::HTTP.new url.host, url.port
22
-
23
- net.start do |http|
24
- payload = '<story><current_state>started</current_state></story>'
25
- req = Net::HTTP::Put.new(url.request_uri, {'Content-type' => 'application/xml', 'X-TrackerToken' => @tracker_settings['token']})
26
- http.request(req, payload)
27
- end
28
-
29
- end
30
-
31
- system "git checkout -b feature-#{story_id}"
32
- end
33
-
34
-
3
+ require File.expand_path(File.dirname(__FILE__)) + '/../lib/optimis-workflow'
35
4
 
5
+ OptimisWorkflow::Commands::StartFeature.new(ARGV.dup).execute!
data/bin/start-hotfix CHANGED
@@ -1,12 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- fail "Please pass in a hotfix story id" if ARGV.empty?
4
-
5
- if ARGV[0] == "-h" || ARGV[0] == "--help" || ARGV[0] == "help"
6
- puts "Syntax: start-hotfix STORYID [stable]"
7
- else
8
- stable_branch = ARGV[1] || 'stable'
9
- system "git checkout -b hotfix-#{ARGV[0]} #{stable_branch}"
10
- end
11
-
3
+ require File.expand_path(File.dirname(__FILE__)) + '/../lib/optimis-workflow'
12
4
 
5
+ OptimisWorkflow::Commands::StartHotfix.new(ARGV.dup).execute!
@@ -0,0 +1,16 @@
1
+ require 'yaml'
2
+ require 'uri'
3
+ require 'net/http'
4
+
5
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/common"
6
+
7
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/base"
8
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/start_command"
9
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/finish_command"
10
+
11
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/start_feature"
12
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/finish_feature"
13
+
14
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/start_hotfix"
15
+ require File.expand_path(File.dirname(__FILE__)) + "/optimis-workflow/commands/finish_hotfix"
16
+
@@ -0,0 +1,24 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ class Base
5
+ include OptimisWorkflow::Common
6
+
7
+ attr_reader :args
8
+
9
+ def initialize(args)
10
+ if args[0] == "-h" || args[0] == "--help" || args[0] == "help"
11
+ puts help_msg
12
+ exit 0
13
+ else
14
+ @args = args
15
+ end
16
+ end
17
+
18
+ def execute!
19
+ local_stuff
20
+ remote_stuff
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,48 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ class FinishCommand < OptimisWorkflow::Commands::Base
5
+ attr_reader :feature_branch
6
+ def initialize(args)
7
+ super(args)
8
+ fail "\n\nError! You must specify a commit message.\n\n" if args[0].nil?
9
+ fail "\n\nWhoops! You have uncommitted changes! Please commit or stash everything and then run again.\n\n" unless self.class.modified_files.empty?
10
+
11
+ @feature_branch = `git branch | grep '\*' | awk '{print $2}'`
12
+ end
13
+
14
+ def self.modified_files
15
+ @modified_files ||= `git ls-files --modified && git ls-files --deleted && git ls-files --unmerged`
16
+ end
17
+
18
+ def story_id
19
+ @story_id ||= feature_branch.split("-").last.chomp!
20
+ end
21
+
22
+ def commit_msg
23
+ @commit_msg ||= args[0].chomp
24
+ end
25
+
26
+ def update_parent_branch
27
+ system "git checkout #{parent_branch}"
28
+ system "git pull origin #{parent_branch}"
29
+ system "git checkout #{feature_branch}"
30
+ system "git rebase #{parent_branch}"
31
+ end
32
+
33
+ def local_stuff
34
+ update_parent_branch
35
+ system "git checkout #{parent_branch}"
36
+ system "git merge --squash #{feature_branch}"
37
+ system "git commit -m '#{commit_msg} #{commit_msg_suffix}'"
38
+ system "git push origin #{parent_branch}"
39
+ end
40
+
41
+ def remote_stuff
42
+ # currently nothing needs to be done here b/c we're inserting a hook
43
+ # into the commit msg that will get sent to pivotal via a github
44
+ # post-receive callback.
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,24 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ # * Determine current local feature branch
5
+ # * Extract story id from branch name (should be feature-STORYID)
6
+ # * git checkout master
7
+ # * git merge --squash feature-branch
8
+ # * git commit 'COMMITMSG [finishes #STORYID]
9
+ # * git push origin master
10
+ class FinishFeature < OptimisWorkflow::Commands::FinishCommand
11
+ def parent_branch
12
+ 'master'
13
+ end
14
+
15
+ def commit_msg_suffix
16
+ "[finishes ##{story_id}]"
17
+ end
18
+
19
+ def help_msg
20
+ "Syntax: finish-feature commit-msg"
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,50 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+
5
+ # git checkout parent-branch
6
+ # git merge --squash hotfix-branch
7
+ # git commit COMMITMSG [fixes #STORYID]
8
+ # git push origin stable
9
+ # git checkout hotfix-branch
10
+ # git push -f origin feature-branch:staging
11
+ # git checkout master
12
+ # git merge stable
13
+ # merge squashed commits into stable and master
14
+ #
15
+ # mark as finished on pivotal
16
+ class FinishHotfix < OptimisWorkflow::Commands::FinishCommand
17
+ # need --no-deploy option
18
+
19
+ def local_stuff
20
+ super
21
+ do_deploy unless no_deploy?
22
+ update_master
23
+ end
24
+
25
+ def no_deploy?
26
+ args[1] && args[1].chomp == "--no-deploy"
27
+ end
28
+
29
+ def do_deploy
30
+ system "git checkout #{feature_branch}"
31
+ system "git push -f origin staging:#{feature_branch}"
32
+ end
33
+
34
+ def update_master
35
+ system "git checkout master"
36
+ system "git pull origin master"
37
+ system "git merge stable"
38
+ end
39
+
40
+ def commit_msg_suffix
41
+ "[fixes ##{story_id}]"
42
+ end
43
+
44
+ def parent_branch
45
+ 'stable'
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,15 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ class StartCommand < OptimisWorkflow::Commands::Base
5
+ def story_id
6
+ @story_id ||= args[0].chomp
7
+ end
8
+
9
+ def remote_stuff
10
+ mark_as_started_on_pivotal
11
+ end
12
+
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ class StartFeature < OptimisWorkflow::Commands::StartCommand
5
+ def initialize(args)
6
+ super(args)
7
+ fail "Please pass in a story id" if args.empty?
8
+ end
9
+
10
+ def local_stuff
11
+ system "git checkout -b feature-#{story_id}"
12
+ end
13
+
14
+ def help_msg
15
+ "Syntax: start-feature STORYID"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,27 @@
1
+
2
+ module OptimisWorkflow
3
+ module Commands
4
+ class StartHotfix < OptimisWorkflow::Commands::StartCommand
5
+ attr_reader :stable_branch
6
+
7
+ def initialize(args)
8
+ super(args)
9
+ if args.empty?
10
+ puts "\nError! Please pass in a hotfix story id"
11
+ exit 1
12
+ end
13
+ @stable_branch = args[1] || 'stable'
14
+ end
15
+
16
+ def help_msg
17
+ "Syntax: start-hotfix STORYID [stable]"
18
+ end
19
+
20
+ def local_stuff
21
+ system "git checkout -b hotfix-#{args[0]} #{stable_branch}"
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+
@@ -0,0 +1,47 @@
1
+
2
+ module OptimisWorkflow
3
+
4
+ # This module gets included into OptimisWorkflow::Commands::Base
5
+ module Common
6
+ def settings_file
7
+ @settings_file ||= current_dir + '/.tracker_settings.yml'
8
+ end
9
+
10
+ def current_dir
11
+ @current_dir ||= `pwd`.chomp
12
+ end
13
+
14
+ def payload
15
+ '<story><current_state>started</current_state></story>'
16
+ end
17
+
18
+ def start_feature
19
+ story_id = args[0].chomp
20
+ current_dir = `pwd`.chomp
21
+
22
+ mark_as_started
23
+ end
24
+
25
+ def mark_as_started_on_pivotal
26
+ unless settings.nil?
27
+ url = URI.parse("http://www.pivotaltracker.com/services/v3/projects/#{settings['project_id']}/stories/#{story_id}")
28
+
29
+ net = Net::HTTP.new url.host, url.port
30
+
31
+ net.start do |http|
32
+ req = Net::HTTP::Put.new(url.request_uri, {'Content-type' => 'application/xml', 'X-TrackerToken' => settings['token']})
33
+ http.request(req, payload)
34
+ end
35
+ end
36
+ end
37
+
38
+ def settings
39
+ @tracker_settings ||= YAML.load_file(settings_file) if File.exists?(settings_file)
40
+ end
41
+
42
+ private
43
+ def sys(cmd)
44
+ system cmd
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec/spec_helper'
2
+
3
+ def cmd_klass
4
+ OptimisWorkflow::Commands::FinishHotfix
5
+ end
6
+
7
+ describe OptimisWorkflow::Commands::FinishHotfix, 'when called with default opts' do
8
+ before :each do
9
+ Kernel.stub!(:system).and_return(true)
10
+ cmd_klass.stub!(:modified_files).and_return([])
11
+ @cmd = cmd_klass.new(['12345'])
12
+ end
13
+
14
+ it 'should attempt to perform a deploy' do
15
+ @cmd.should_receive(:do_deploy)
16
+ @cmd.execute!
17
+ end
18
+ end
19
+
20
+ describe OptimisWorkflow::Commands::FinishHotfix, 'when passed --no-deploy' do
21
+ before :each do
22
+ Kernel.stub!(:system).and_return(true)
23
+ cmd_klass.stub!(:modified_files).and_return([])
24
+ @cmd = cmd_klass.new(['12345', '--no-deploy'])
25
+ end
26
+
27
+ it 'should not attempt to deploy the app' do
28
+ @cmd.should_not_receive(:do_deploy)
29
+ @cmd.execute!
30
+ end
31
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,5 @@
1
+ --colour
2
+ --format
3
+ s
4
+ --loadby mtime
5
+ --reverse
@@ -0,0 +1,2 @@
1
+
2
+ require File.expand_path(File.dirname(__FILE__)) + '/../lib/optimis-workflow'
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alex Sharp
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-08 00:00:00 -07:00
17
+ date: 2010-04-14 00:00:00 -07:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -27,12 +27,22 @@ executables:
27
27
  - start-hotfix
28
28
  extensions: []
29
29
 
30
- extra_rdoc_files: []
31
-
30
+ extra_rdoc_files:
31
+ - README.md
32
32
  files:
33
33
  - bin/finish-feature
34
+ - bin/finish-hotfix
34
35
  - bin/start-feature
35
36
  - bin/start-hotfix
37
+ - lib/optimis-workflow/commands/base.rb
38
+ - lib/optimis-workflow/commands/finish_command.rb
39
+ - lib/optimis-workflow/commands/finish_feature.rb
40
+ - lib/optimis-workflow/commands/finish_hotfix.rb
41
+ - lib/optimis-workflow/commands/start_command.rb
42
+ - lib/optimis-workflow/commands/start_feature.rb
43
+ - lib/optimis-workflow/commands/start_hotfix.rb
44
+ - lib/optimis-workflow/common.rb
45
+ - lib/optimis-workflow.rb
36
46
  - LICENSE
37
47
  - README.md
38
48
  has_rdoc: true
@@ -65,5 +75,7 @@ rubygems_version: 1.3.6
65
75
  signing_key:
66
76
  specification_version: 3
67
77
  summary: A collection of scripts we use to manage our workflow at OptimisDev.
68
- test_files: []
69
-
78
+ test_files:
79
+ - spec/finish_hotfix_spec.rb
80
+ - spec/spec.opts
81
+ - spec/spec_helper.rb