thegarage-gitx 1.2.1 → 1.3.0
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/thegarage/gitx/cli.rb +26 -20
- data/lib/thegarage/gitx/git.rb +38 -9
- data/lib/thegarage/gitx/version.rb +1 -1
- data/spec/thegarage/gitx/cli_spec.rb +6 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9601c51e9fb7c39a2290715c05e752aeb5898c58
|
4
|
+
data.tar.gz: f0947bba05dcedbae40a94a770075b837f0b8fb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fb42815aa779d1b86f52d5c3c07f34fe1d06a8b97992a950d2e5cb7b1a9ab02d35d8131756cf780193039b5cfaf96bee9256204355878a6a8677a1ec6c07034
|
7
|
+
data.tar.gz: 5efd37b850dd801e9dd91537c70dc7e0616f1a4c601407789cf71594e9decbf5d5db221f8b90a4b0cd2b3b46dddc34066c7db7c4bd958c44e31093479fb2dc6f
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# thegarage-gitx
|
2
2
|
|
3
|
-
[](https://travis-ci.org/thegarage/thegarage-gitx)
|
4
4
|
|
5
5
|
Useful Git eXtensions for Development workflow at The Garage.
|
6
6
|
|
data/lib/thegarage/gitx/cli.rb
CHANGED
@@ -12,13 +12,14 @@ module Thegarage
|
|
12
12
|
include Thegarage::Gitx::Git
|
13
13
|
include Thegarage::Gitx::Github
|
14
14
|
|
15
|
-
|
15
|
+
TAGGABLE_BRANCHES = %w(master staging)
|
16
|
+
PULL_REQUEST_FOOTER = <<-EOS.dedent
|
17
|
+
# Pull Request Protips
|
18
|
+
# Include description of how this change accomplishes the task at hand.
|
16
19
|
# Use GitHub flavored Markdown http://github.github.com/github-flavored-markdown/
|
17
|
-
#
|
18
|
-
#
|
19
|
-
# Brief description of the change, and how it accomplishes the task they set out to do.
|
20
|
+
# Review CONTRIBUTING.md for recommendations of artifacts, links, images, screencasts, etc.
|
21
|
+
# NOTE: this footer will automatically be stripped from the pull request.
|
20
22
|
EOS
|
21
|
-
TAGGABLE_BRANCHES = %w(master staging)
|
22
23
|
|
23
24
|
method_option :trace, :type => :boolean, :aliases => '-v'
|
24
25
|
def initialize(*args)
|
@@ -34,11 +35,20 @@ module Thegarage
|
|
34
35
|
update
|
35
36
|
|
36
37
|
token = authorization_token
|
37
|
-
|
38
|
+
changelog = run_cmd "git log #{BASE_BRANCH}...#{current_branch} --no-merges --pretty=format:'%ci - %s%n%b'"
|
39
|
+
description_template = []
|
40
|
+
description_template << options[:description]
|
41
|
+
description_template << "\n"
|
42
|
+
description_template << '### Changelog'
|
43
|
+
description_template << changelog
|
44
|
+
description_template << "\n"
|
45
|
+
description_template << PULL_REQUEST_FOOTER
|
46
|
+
|
47
|
+
description = editor_input(description_template.join("\n"))
|
38
48
|
branch = current_branch
|
39
49
|
repo = current_remote_repo
|
40
50
|
url = create_pull_request token, branch, repo, description
|
41
|
-
say "Pull request created: #{url}"
|
51
|
+
say "Pull request created: #{url}", :green
|
42
52
|
end
|
43
53
|
|
44
54
|
# TODO: use --no-edit to skip merge messages
|
@@ -117,9 +127,7 @@ module Thegarage
|
|
117
127
|
good_branch = options[:destination] || ask("What branch do you want to reset #{bad_branch} to? (default: #{bad_branch})")
|
118
128
|
good_branch = bad_branch if good_branch.length == 0
|
119
129
|
|
120
|
-
|
121
|
-
good_tags = run_cmd("git tag -l 'build-#{good_branch}-*'").split
|
122
|
-
last_known_good_tag = good_tags.sort.last
|
130
|
+
last_known_good_tag = build_tags_for_branch(good_branch).last
|
123
131
|
raise "No known good tag found for branch: #{good_branch}. Verify tag exists via `git tag -l 'build-#{good_branch}-*'`" unless last_known_good_tag
|
124
132
|
return unless yes?("Reset #{bad_branch} to #{last_known_good_tag}? (y/n)", :green)
|
125
133
|
|
@@ -143,20 +151,18 @@ module Thegarage
|
|
143
151
|
|
144
152
|
desc 'buildtag', 'create a tag for the current Travis-CI build and push it back to origin'
|
145
153
|
def buildtag
|
146
|
-
|
154
|
+
branch = ENV['TRAVIS_BRANCH']
|
147
155
|
pull_request = ENV['TRAVIS_PULL_REQUEST']
|
148
|
-
|
149
|
-
raise "Unknown branch. ENV['TRAVIS_BRANCH'] is required." unless
|
150
|
-
|
156
|
+
|
157
|
+
raise "Unknown branch. ENV['TRAVIS_BRANCH'] is required." unless branch
|
158
|
+
|
151
159
|
if pull_request != 'false'
|
152
160
|
say "Skipping creation of tag for pull request: #{pull_request}"
|
153
|
-
elsif !TAGGABLE_BRANCHES.include?(
|
154
|
-
say "Cannot create build tag for branch: #{
|
161
|
+
elsif !TAGGABLE_BRANCHES.include?(branch)
|
162
|
+
say "Cannot create build tag for branch: #{branch}. Only #{TAGGABLE_BRANCHES} are supported."
|
155
163
|
else
|
156
|
-
|
157
|
-
|
158
|
-
run_cmd "git tag #{git_tag} -a -m 'Generated tag from TravisCI build #{ENV['TRAVIS_BUILD_NUMBER']}'"
|
159
|
-
run_cmd "git push origin #{git_tag}"
|
164
|
+
label = "Generated tag from TravisCI build #{ENV['TRAVIS_BUILD_NUMBER']}"
|
165
|
+
create_build_tag(branch, label)
|
160
166
|
end
|
161
167
|
end
|
162
168
|
|
data/lib/thegarage/gitx/git.rb
CHANGED
@@ -60,19 +60,21 @@ module Thegarage
|
|
60
60
|
end
|
61
61
|
|
62
62
|
# reset the specified aggregate branch to the same set of commits as the destination branch
|
63
|
-
def nuke_branch(
|
64
|
-
return if
|
65
|
-
|
63
|
+
def nuke_branch(outdated_branch, head_branch)
|
64
|
+
return if outdated_branch == head_branch
|
65
|
+
fail "Only aggregate branches are allowed to be reset: #{AGGREGATE_BRANCHES}" unless aggregate_branch?(outdated_branch)
|
66
|
+
return if migrations_need_to_be_reverted?
|
67
|
+
|
66
68
|
say "Resetting "
|
67
|
-
say "#{
|
69
|
+
say "#{outdated_branch} ", :green
|
68
70
|
say "branch to "
|
69
71
|
say head_branch, :green
|
70
72
|
|
71
73
|
run_cmd "git checkout #{Thegarage::Gitx::BASE_BRANCH}"
|
72
|
-
run_cmd "git branch -D #{
|
73
|
-
run_cmd "git push origin --delete #{
|
74
|
-
run_cmd "git checkout -b #{
|
75
|
-
share_branch
|
74
|
+
run_cmd "git branch -D #{outdated_branch}", :allow_failure => true
|
75
|
+
run_cmd "git push origin --delete #{outdated_branch}", :allow_failure => true
|
76
|
+
run_cmd "git checkout -b #{outdated_branch} #{head_branch}"
|
77
|
+
share_branch outdated_branch
|
76
78
|
run_cmd "git checkout #{Thegarage::Gitx::BASE_BRANCH}"
|
77
79
|
end
|
78
80
|
|
@@ -132,9 +134,36 @@ module Thegarage
|
|
132
134
|
pid = fork { exec "#{editor} #{flags} #{f.path}" }
|
133
135
|
Process.waitpid(pid)
|
134
136
|
description = File.read(f.path)
|
135
|
-
description.gsub(
|
137
|
+
description.gsub(CLI::PULL_REQUEST_FOOTER, '').chomp.strip
|
136
138
|
end
|
137
139
|
end
|
138
140
|
end
|
141
|
+
|
142
|
+
def create_build_tag(branch, label)
|
143
|
+
timestamp = Time.now.utc.strftime '%Y-%m-%d-%H-%M-%S'
|
144
|
+
git_tag = "build-#{branch}-#{timestamp}"
|
145
|
+
run_cmd "git tag #{git_tag} -a -m '#{label}'"
|
146
|
+
run_cmd "git push origin #{git_tag}"
|
147
|
+
end
|
148
|
+
|
149
|
+
def build_tags_for_branch(branch)
|
150
|
+
run_cmd "git fetch --tags"
|
151
|
+
build_tags = run_cmd("git tag -l 'build-#{branch}-*'").split
|
152
|
+
build_tags.sort
|
153
|
+
end
|
154
|
+
|
155
|
+
def migrations_need_to_be_reverted?
|
156
|
+
return false unless File.exists?('db/migrate')
|
157
|
+
outdated_migrations = run_cmd("git diff #{head_branch}...#{outdated_branch} --name-only db/migrate").split
|
158
|
+
return false if outdated_migrations.empty?
|
159
|
+
|
160
|
+
say "#{outdated_branch} contains migrations that may need to be reverted. Ensure any reversable migrations are reverted on affected databases before nuking.", :red
|
161
|
+
say 'Example commands to revert outdated migrations:'
|
162
|
+
outdated_migrations.reverse.each do |migration|
|
163
|
+
version = File.basename(migration).split('_').first
|
164
|
+
say "rake db:migrate:down VERSION=#{version}"
|
165
|
+
end
|
166
|
+
!yes?("Are you sure you want to nuke #{outdated_branch}? (y/n) ", :green)
|
167
|
+
end
|
139
168
|
end
|
140
169
|
end
|
@@ -16,7 +16,6 @@ describe Thegarage::Gitx::CLI do
|
|
16
16
|
allow(cli).to receive(:current_branch).and_return('feature-branch')
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
19
|
describe '#update' do
|
21
20
|
before do
|
22
21
|
expect(cli).to receive(:run).with('git pull origin feature-branch', capture: true).ordered
|
@@ -277,7 +276,9 @@ describe Thegarage::Gitx::CLI do
|
|
277
276
|
|
278
277
|
describe '#reviewrequest' do
|
279
278
|
context 'when github.user is not configured' do
|
279
|
+
let(:current_user) { nil }
|
280
280
|
it 'raises error' do
|
281
|
+
allow(cli).to receive(:current_user).and_return(current_user)
|
281
282
|
expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
|
282
283
|
expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
|
283
284
|
expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
|
@@ -311,9 +312,11 @@ describe Thegarage::Gitx::CLI do
|
|
311
312
|
expect(cli).to receive(:ask).with('Github password for ryan@codecrate.com: ', {:echo => false}).and_return(github_password)
|
312
313
|
expect(cli).to receive(:github_auth_token=).with(authorization_token)
|
313
314
|
|
315
|
+
expect(cli).to receive(:editor_input).and_return('scrubbed text')
|
314
316
|
expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
|
315
317
|
expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
|
316
318
|
expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
|
319
|
+
expect(cli).to receive(:run).with("git log master...feature-branch --no-merges --pretty=format:'%ci - %s%n%b'", capture: true).and_return("2013-01-01 did some stuff").ordered
|
317
320
|
|
318
321
|
cli.reviewrequest
|
319
322
|
end
|
@@ -336,9 +339,11 @@ describe Thegarage::Gitx::CLI do
|
|
336
339
|
|
337
340
|
expect(cli).to receive(:authorization_token).and_return(authorization_token)
|
338
341
|
|
342
|
+
expect(cli).to receive(:editor_input).and_return('scrubbed text')
|
339
343
|
expect(cli).to receive(:run).with("git pull origin feature-branch", capture: true).ordered
|
340
344
|
expect(cli).to receive(:run).with("git pull origin master", capture: true).ordered
|
341
345
|
expect(cli).to receive(:run).with("git push origin HEAD", capture: true).ordered
|
346
|
+
expect(cli).to receive(:run).with("git log master...feature-branch --no-merges --pretty=format:'%ci - %s%n%b'", capture: true).and_return("2013-01-01 did some stuff").ordered
|
342
347
|
|
343
348
|
cli.reviewrequest
|
344
349
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thegarage-gitx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Sonnek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-02-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: grit
|