papa 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +39 -0
  9. data/Rakefile +6 -0
  10. data/exe/papa +6 -0
  11. data/lib/papa.rb +11 -0
  12. data/lib/papa/cli.rb +17 -0
  13. data/lib/papa/command.rb +42 -0
  14. data/lib/papa/command_queue.rb +34 -0
  15. data/lib/papa/common.rb +4 -0
  16. data/lib/papa/common/add.rb +62 -0
  17. data/lib/papa/common/finish.rb +56 -0
  18. data/lib/papa/common/start.rb +30 -0
  19. data/lib/papa/git.rb +62 -0
  20. data/lib/papa/git/checkout.rb +14 -0
  21. data/lib/papa/git/merge.rb +27 -0
  22. data/lib/papa/git/rebase.rb +27 -0
  23. data/lib/papa/hotfix.rb +37 -0
  24. data/lib/papa/hotfix/add.rb +9 -0
  25. data/lib/papa/hotfix/finish.rb +11 -0
  26. data/lib/papa/hotfix/start.rb +9 -0
  27. data/lib/papa/output.rb +13 -0
  28. data/lib/papa/release.rb +47 -0
  29. data/lib/papa/release/add.rb +9 -0
  30. data/lib/papa/release/finish.rb +10 -0
  31. data/lib/papa/release/patch.rb +30 -0
  32. data/lib/papa/release/start.rb +9 -0
  33. data/lib/papa/sandbox.rb +12 -0
  34. data/lib/papa/sandbox/branches/bugfix/4-fix-charmeleon-spelling/Gemfile +24 -0
  35. data/lib/papa/sandbox/branches/bugfix/5-fix-gem-source/Gemfile +24 -0
  36. data/lib/papa/sandbox/branches/feature/1-add-butterfree-gem/Gemfile +25 -0
  37. data/lib/papa/sandbox/branches/feature/2-add-beedrill-gem/Gemfile +25 -0
  38. data/lib/papa/sandbox/branches/feature/6-add-pidgeotto-gem/Gemfile +26 -0
  39. data/lib/papa/sandbox/branches/feature/7-add-pidgeot-gem/Gemfile +26 -0
  40. data/lib/papa/sandbox/branches/master/Gemfile +24 -0
  41. data/lib/papa/sandbox/branches/patch/17.8.0/3-add-pidgey-gem/Gemfile +26 -0
  42. data/lib/papa/sandbox/generate.rb +177 -0
  43. data/lib/papa/thor.rb +5 -0
  44. data/lib/papa/version.rb +3 -0
  45. data/papa.gemspec +31 -0
  46. metadata +145 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: baa63ed9a4682f55dff53db355e5af29448bc4ab
4
+ data.tar.gz: 5513f134da10af2b98048a6c988840ed2668939d
5
+ SHA512:
6
+ metadata.gz: 22a55a5b2b748a4eb98662d1be83392fc7826e117297127c6ecc31dabddbbd562b30106b64cc2d0036516aa211abe400f618c18be8b56ed96f40565ae9e744a6
7
+ data.tar.gz: 272a9e587e4b100ed4418397a49a4ff88429aea3277961756dbd323638d3eff1b09108ff4cb114b66c6cd25501ad5958b89b4d6dcfce66bc868ff5a870f6b0be
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.1.5
5
+ before_install: gem install bundler -v 1.15.4
data/CHANGELOG.md ADDED
File without changes
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in papa.gemspec
6
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 boggs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # Papa
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/papa`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'papa'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install papa
22
+
23
+ ## Usage
24
+
25
+ TODO: Write usage instructions here
26
+
27
+ ## Development
28
+
29
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
30
+
31
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
+
33
+ ## Contributing
34
+
35
+ Bug reports and pull requests are welcome on GitHub at https://github.com/b-ggs/papa.
36
+
37
+ ## License
38
+
39
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/exe/papa ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'papa'
5
+
6
+ Papa::CLI.start ARGV
data/lib/papa.rb ADDED
@@ -0,0 +1,11 @@
1
+ require 'thor'
2
+ require 'papa/thor'
3
+ require 'papa/version'
4
+ require 'papa/cli'
5
+ require 'papa/command'
6
+ require 'papa/command_queue'
7
+ require 'papa/git'
8
+ require 'papa/output'
9
+
10
+ module Papa
11
+ end
data/lib/papa/cli.rb ADDED
@@ -0,0 +1,17 @@
1
+ require 'papa/common'
2
+ require 'papa/release'
3
+ require 'papa/hotfix'
4
+ require 'papa/sandbox'
5
+
6
+ module Papa
7
+ class CLI < Thor
8
+ desc 'release [COMMAND]', 'Perform actions on release branches'
9
+ subcommand 'release', Release
10
+
11
+ desc 'hotfix [COMMAND]', 'Perform actions on hotfix branches'
12
+ subcommand 'hotfix', Hotfix
13
+
14
+ desc 'sandbox [COMMAND]', 'Test out papa in a sandboxed git environment'
15
+ subcommand 'sandbox', Sandbox
16
+ end
17
+ end
@@ -0,0 +1,42 @@
1
+ module Papa
2
+ class Command
3
+ attr_accessor :command, :output, :exit_status
4
+
5
+ def initialize(command)
6
+ @command = command
7
+ @output = nil
8
+ @exit_status = nil
9
+ end
10
+
11
+ def run
12
+ return if @command.nil?
13
+ output = `#{@command} #{Output::REDIRECT_TO_NULL}`
14
+ exit_status = $?.exitstatus
15
+ @output = output
16
+ @exit_status = exit_status
17
+ self
18
+ end
19
+
20
+ def failure_message
21
+ Output.stderr "ERROR: There was a problem running '#{command}'"
22
+ end
23
+
24
+ def cleanup
25
+ Output.stderr 'Cleaning up...'
26
+ end
27
+
28
+ def success?
29
+ @exit_status == 0
30
+ end
31
+
32
+ def failed?
33
+ @exit_status != 0
34
+ end
35
+
36
+ private
37
+
38
+ def current_branch
39
+ @current_branch ||= `git symbolic-ref --short HEAD`.chomp
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,34 @@
1
+ module Papa
2
+ class CommandQueue
3
+ attr_accessor :queue
4
+
5
+ def initialize
6
+ @queue = []
7
+ end
8
+
9
+ def add(command)
10
+ @queue.push command
11
+ end
12
+
13
+ def list_queue
14
+ Output.stdout 'Running:'
15
+ @queue.each do |command|
16
+ Output.stdout " #{command.command}"
17
+ end
18
+ end
19
+
20
+ def run
21
+ success = true
22
+ list_queue
23
+ @queue.each do |command|
24
+ if command.run.failed?
25
+ success = false
26
+ command.cleanup
27
+ command.failure_message
28
+ break
29
+ end
30
+ end
31
+ success
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,4 @@
1
+ module Papa
2
+ class Common
3
+ end
4
+ end
@@ -0,0 +1,62 @@
1
+ module Papa
2
+ class Common::Add
3
+ def run
4
+ @build_branch ||= "#{@build_type}/#{@version}"
5
+
6
+ success = true
7
+ @success_branches = []
8
+
9
+ @branches.each do |branch|
10
+ queue = CommandQueue.new
11
+ queue.add Git.fetch(remote: 'origin')
12
+ queue.add Git.checkout(branch_name: @build_branch)
13
+ queue.add Git.checkout(branch_name: branch)
14
+ queue.add Git.rebase(base_branch_name: @build_branch)
15
+ queue.add Git.force_push(remote: 'origin', branch_name: branch)
16
+ queue.add Git.checkout(branch_name: @build_branch)
17
+ queue.add Git.merge(branch_name: branch)
18
+ queue.add Git.push(remote: 'origin', branch_name: @build_branch)
19
+ if queue.run
20
+ @success_branches << branch
21
+ else
22
+ success = false
23
+ end
24
+ end
25
+
26
+ cleanup
27
+
28
+ success_message if !@success_branches.empty?
29
+
30
+ if !success
31
+ failure_message
32
+ exit 1
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def success_message
39
+ Output.stdout "Successfully added these branches to #{@build_branch}:"
40
+ @success_branches.each do |branch|
41
+ Output.stdout " #{branch}"
42
+ end
43
+ end
44
+
45
+ def cleanup
46
+ queue = CommandQueue.new
47
+ @branches.each { |branch| queue.add Git.delete_branch(branch_name: branch) }
48
+ queue.run
49
+ end
50
+
51
+ def failure_message
52
+ failed_branches = @branches - @success_branches
53
+
54
+ Output.stderr "Failed to add these branches to #{@build_branch}:"
55
+ failed_branches.each do |branch|
56
+ Output.stderr " #{branch}"
57
+ end
58
+ Output.stderr 'When the above problems are resolved, you can re-run this with:'
59
+ Output.stderr " papa #{@build_type} add -v #{@version} -b #{failed_branches.join(' ')}"
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,56 @@
1
+ module Papa
2
+ class Common::Finish
3
+ def run
4
+ @build_branch ||= "#{@build_type}/#{@version}"
5
+
6
+ success = true
7
+ @success_branches = []
8
+
9
+ @base_branches.each do |branch|
10
+ queue = CommandQueue.new
11
+ queue.add Git.fetch(remote: 'origin')
12
+ queue.add Git.checkout(branch_name: @build_branch)
13
+ queue.add Git.checkout(branch_name: branch)
14
+ queue.add Git.merge(branch_name: @build_branch)
15
+ queue.add Git.push(remote: 'origin', branch_name: branch)
16
+ if @tag_name && branch == 'master'
17
+ queue.add Git.tag(tag_name: @tag_name)
18
+ queue.add Git.push_tag(remote: 'origin', tag_name: @tag_name)
19
+ end
20
+ if queue.run
21
+ @success_branches << branch
22
+ else
23
+ success = false
24
+ end
25
+ end
26
+
27
+ success_message if !@success_branches.empty?
28
+
29
+ if !success
30
+ failure_message
31
+ exit 1
32
+ end
33
+ end
34
+
35
+ private
36
+
37
+ def success_message
38
+ Output.stdout "Successfully merged #{@build_branch} to these branches:"
39
+ @success_branches.each do |branch|
40
+ Output.stdout " #{branch}"
41
+ end
42
+ end
43
+
44
+ def failure_message
45
+ failed_branches = @base_branches - @success_branches
46
+
47
+ Output.stderr "Failed to merge #{@build_branch} to these branches:"
48
+ failed_branches.each do |branch|
49
+ Output.stderr " #{branch}"
50
+ end
51
+ # TODO: Handle master or develop failure
52
+ # Output.stderr "When the above problems are resolved, you can re-run this with:"
53
+ # Output.stderr " papa #{@build_type} finish -v #{@version} -b #{failed_branches.join(' ')}"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,30 @@
1
+ module Papa
2
+ class Common::Start
3
+ def run
4
+ @build_branch ||= "#{@build_type}/#{@version}"
5
+
6
+ queue = CommandQueue.new
7
+ queue.add Git.fetch(remote: 'origin')
8
+ queue.add Git.checkout(branch_name: @base_branch)
9
+ queue.add Git.branch(branch_name: @build_branch)
10
+ queue.add Git.checkout(branch_name: @build_branch)
11
+ queue.add Git.push(remote: 'origin', branch_name: @build_branch)
12
+ if queue.run
13
+ success_message
14
+ else
15
+ failure_message
16
+ exit 1
17
+ end
18
+ end
19
+
20
+ private
21
+
22
+ def success_message
23
+ Output.stdout "Successfully started new #{@build_type} branch #{@build_branch}"
24
+ end
25
+
26
+ def failure_message
27
+ Output.stderr "There was a problem starting #{@build_type} branch: #{@build_branch}"
28
+ end
29
+ end
30
+ end
data/lib/papa/git.rb ADDED
@@ -0,0 +1,62 @@
1
+ module Papa
2
+ class Git
3
+ def self.status
4
+ Command.new 'git status'
5
+ end
6
+
7
+ def self.fetch(remote:)
8
+ Command.new "git fetch #{remote}"
9
+ end
10
+
11
+ def self.checkout(branch_name:)
12
+ require 'papa/git/checkout'
13
+ Git::Checkout.new(branch_name)
14
+ end
15
+
16
+ def self.branch(branch_name:)
17
+ Command.new "git branch #{branch_name}"
18
+ end
19
+
20
+ def self.delete_branch(branch_name:)
21
+ Command.new "git branch -D #{branch_name}"
22
+ end
23
+
24
+ def self.merge(branch_name:)
25
+ require 'papa/git/merge'
26
+ Git::Merge.new(branch_name)
27
+ end
28
+
29
+ def self.merge_abort
30
+ Command.new 'git merge --abort'
31
+ end
32
+
33
+ def self.pull(remote:, branch_name:)
34
+ Command.new "git pull #{remote} #{branch_name}"
35
+ end
36
+
37
+ def self.push(remote:, branch_name:)
38
+ Command.new "git push #{remote} #{branch_name}"
39
+ end
40
+
41
+ def self.force_push(remote:, branch_name:)
42
+ Command.new "git push #{remote} #{branch_name} --force-with-lease"
43
+ end
44
+
45
+ def self.rebase(base_branch_name:)
46
+ require 'papa/git/rebase'
47
+ Git::Rebase.new(base_branch_name)
48
+ end
49
+
50
+ def self.rebase_abort
51
+ Command.new 'git rebase --abort'
52
+ end
53
+
54
+ def self.tag(tag_name:)
55
+ Command.new "git tag #{tag_name}"
56
+ end
57
+
58
+ def self.push_tag(remote:, tag_name:)
59
+ push(remote: remote, branch_name: tag_name)
60
+ end
61
+ end
62
+ end