git_lib 1.2.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c3b82cc9214aa0d0faecd8aa639ae16fee57179d0be17aebc365ebebe52e43f
4
- data.tar.gz: 24b88e76619b9ab4138ebe07eca7c849f09377a2eec21afe384545d6e674df61
3
+ metadata.gz: f83b697a51aa8d99736c92879bb28d0e59f8635e7d32a9e0d9de5c9b6a0a2dc9
4
+ data.tar.gz: 62649c6cbe804f091acc15cf96e47cbb13521afd44a4cad571e378cbdd051719
5
5
  SHA512:
6
- metadata.gz: eb5e0a487b3adad39dc3bc3d3f3fe94097a143ea0d7fdbccef27d1f5515a4612e98ecd44251d7926b5c4d51aeffd1a0efd819db024564574089dc7428cb9b6f2
7
- data.tar.gz: 75f854dba8e98489dc373fd829c8792ba8fc581624f5b5191bce97978dba6eade70e89b42a4b16a20ef76f784f42f8c08984841eb246b6647e0e49b11471db92
6
+ metadata.gz: 7a4caae1a2a43f7602ff8b2b0d5d4db07565e2702cc497aabd781e95fff12a845d9568f33ea91db142a0caf8644b6fb7e024fd4cf3bcbf78a1f19a01519f8062
7
+ data.tar.gz: 3556c067c8d47dcbb0bf641800cf8f095d3fa994830c57169792fa85b6f04dd0720b87a3d8c8bd724d622054dc3c4efb0361ff0384909555109cb38d1abb7ff8
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Build
3
+ on: [push]
4
+ jobs:
5
+ tests:
6
+ name: Unit Tests
7
+ runs-on: ubuntu-latest
8
+ strategy:
9
+ fail-fast: false
10
+ matrix:
11
+ ruby: [2.5, 2.6]
12
+ gemfile:
13
+ - Gemfile
14
+ - gemfiles/rails_4.gemfile
15
+ - gemfiles/rails_5.gemfile
16
+ - gemfiles/rails_6.gemfile
17
+ env:
18
+ BUNDLE_GEMFILE: ${{ matrix.gemfile }}
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+ - uses: ruby/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ bundler: 1.17.3
25
+ bundler-cache: true
26
+ - name: Unit tests
27
+ run: bundle exec rspec
@@ -23,7 +23,7 @@ jobs:
23
23
  uses: mindsers/changelog-reader-action@v1
24
24
  with:
25
25
  version: ${{ steps.tag_name.outputs.current_version }}
26
- path: ./CHANGELOG.md
26
+ path: ./CHANGELOG.md
27
27
  - name: Create Release
28
28
  id: create_release
29
29
  uses: actions/create-release@v1
data/CHANGELOG.md CHANGED
@@ -4,6 +4,14 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
5
  Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.1.0] - 2021-12-13
8
+ ### Changed
9
+ - Changed `commit_diff_refs` to handle the `nil` case for `ancestor_ref`
10
+
11
+ ## [2.0.0] - 2021-08-24
12
+ ### Changed
13
+ - Add required `repository:` to `GitCommit`.
14
+
7
15
  ## [1.2.0] - 2020-07-13
8
16
  ### Added
9
17
  - Add support for Rails 5 and 6.
@@ -20,5 +28,7 @@ Note: this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0
20
28
  - Add magic frozen_string_literal: true comment everywhere.
21
29
  - Clean up Rakefile.
22
30
 
31
+ [2.1.0]: https://github.com/Invoca/git_lib/compare/v2.0.0...v2.1.0
32
+ [2.0.0]: https://github.com/Invoca/git_lib/compare/v1.2.0...v2.0.0
23
33
  [1.2.0]: https://github.com/Invoca/git_lib/compare/v1.1.1...v1.2.0
24
34
  [1.1.1]: https://github.com/Invoca/git_lib/compare/v1.1.0...v1.1.1
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git_lib (1.2.0)
4
+ git_lib (2.1.0)
5
5
  activesupport (>= 4.2, < 7)
6
6
 
7
7
  GEM
data/lib/git/git.rb CHANGED
@@ -150,20 +150,28 @@ module Git
150
150
  raw_output.split("\n")
151
151
  end
152
152
 
153
+ def sha_list_for_ref_range(ref, ancestor_ref, fetch: false)
154
+ commit_diff_refs(ref, ancestor_ref, fetch: fetch).map(&:sha)
155
+ end
156
+
153
157
  def commit_diff_refs(ref, ancestor_ref, fetch: false)
154
158
  if fetch
155
159
  fetch_all
156
160
  end
157
- ref_prefix = 'origin/' unless self.class.is_git_sha?(ref)
161
+
162
+ ref_prefix = 'origin/' unless self.class.is_git_sha?(ref)
158
163
  ancestor_ref_prefix = 'origin/' unless self.class.is_git_sha?(ancestor_ref)
159
164
 
160
- raw_output = execute(
161
- "log --format=%H\t%an\t%ae\t%aI\t%s " \
162
- "--no-color #{ancestor_ref_prefix}#{Shellwords.escape(ancestor_ref)}..#{ref_prefix}#{Shellwords.escape(ref)}"
163
- )
165
+ sha_range = if ancestor_ref
166
+ "#{ancestor_ref_prefix}#{Shellwords.escape(ancestor_ref)}..#{ref_prefix}#{Shellwords.escape(ref)}"
167
+ else
168
+ "#{ref_prefix}#{Shellwords.escape(ref)}"
169
+ end
170
+
171
+ raw_output = execute("log --format=%H\t%an\t%ae\t%aI\t%s --no-color #{sha_range}")
164
172
  raw_output.split("\n").map do |row|
165
173
  commit_data = row.split("\t")
166
- GitCommit.new(commit_data[0], commit_data[4], DateTime.iso8601(commit_data[3]), commit_data[1], commit_data[2])
174
+ GitCommit.new(commit_data[0], commit_data[4], DateTime.iso8601(commit_data[3]), commit_data[1], commit_data[2], repository_name: @repository_name)
167
175
  end
168
176
  end
169
177
 
@@ -2,14 +2,15 @@
2
2
 
3
3
  module Git
4
4
  class GitCommit
5
- attr_reader :sha, :message, :commit_date, :author_name, :author_email
5
+ attr_reader :repository_name, :sha, :message, :commit_date, :author_name, :author_email
6
6
 
7
- def initialize(sha, message, commit_date, author_name, author_email)
7
+ def initialize(sha, message, commit_date, author_name, author_email, repository_name:)
8
8
  @sha = sha
9
9
  @message = message
10
10
  @commit_date = commit_date
11
11
  @author_email = author_email
12
12
  @author_name = author_name
13
+ @repository_name = repository_name
13
14
  end
14
15
 
15
16
  def to_s
@@ -23,12 +23,13 @@ module Git
23
23
  GitConflict.new(repository_name, branch_a_name, branch_b_name, file_list)
24
24
  end
25
25
 
26
- def self.create_commit(sha: '1234567890123456789012345678901234567890',
26
+ def self.create_commit(repository_name: 'repository',
27
+ sha: '1234567890123456789012345678901234567890',
27
28
  message: 'Commit message',
28
29
  author_name: 'Author Name',
29
30
  author_email: 'author@email.com',
30
31
  commit_date: Time.current)
31
- GitCommit.new(sha, message, commit_date, author_name, author_email)
32
+ GitCommit.new(sha, message, commit_date, author_name, author_email, repository_name: repository_name)
32
33
  end
33
34
 
34
35
  def self.create_sha
data/lib/git/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Git
4
- VERSION = '1.2.0'
4
+ VERSION = '2.1.0'
5
5
  end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
  require_relative '../../../lib/git/git_branch.rb'
5
5
 
6
- describe 'Git::GitBranch' do
6
+ RSpec.describe 'Git::GitBranch' do
7
7
  it 'can be created' do
8
8
  last_modified_date = Time.current
9
9
  branch = Git::GitBranch.new('repository_name', 'name', last_modified_date, 'author_name', 'author@email.com')
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require_relative '../../../lib/git/git_commit.rb'
5
+
6
+ RSpec.describe Git::GitCommit do
7
+ let(:sha) { 'aabb2345' }
8
+ let(:message) { 'TECH-1234: update comments' }
9
+ let(:commit_date) { '2021-08-23 10:03:00 -0700' }
10
+ let(:author_name) { 'John Doe' }
11
+ let(:author_email) { 'john@doe.com' }
12
+ let(:repository_name) { 'repository_name' }
13
+
14
+ it 'can be created' do
15
+ commit = Git::GitCommit.new(sha, message, commit_date, author_name, author_email, repository_name: repository_name)
16
+
17
+ expect(commit.sha).to eq(sha)
18
+ expect(commit.message).to eq(message)
19
+ expect(commit.commit_date).to eq(commit_date)
20
+ expect(commit.author_name).to eq(author_name)
21
+ expect(commit.author_email).to eq(author_email)
22
+ expect(commit.repository_name).to eq(repository_name)
23
+ end
24
+ end
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
  require_relative '../../../lib/git/git_conflict.rb'
5
5
 
6
- describe 'Git::GitConflict' do
6
+ RSpec.describe 'Git::GitConflict' do
7
7
  it 'can be created' do
8
8
  conflict = Git::GitConflict.new('repository_name', 'branch_a', 'branch_b', ['file1', 'file2'])
9
9
 
@@ -3,7 +3,7 @@
3
3
  require 'spec_helper'
4
4
  require_relative '../../../lib/git/git_error.rb'
5
5
 
6
- describe 'Git::GitError' do
6
+ RSpec.describe 'Git::GitError' do
7
7
  it 'can be raised' do
8
8
  expect { raise Git::GitError.new('command', 200, 'error_message') }.to \
9
9
  raise_exception(Git::GitError, "Git command command failed with exit code 200. Message:\nerror_message")
@@ -4,7 +4,7 @@ require 'spec_helper'
4
4
  require_relative '../../../lib/git/git.rb'
5
5
 
6
6
  # rubocop:disable Metrics/LineLength
7
- describe 'Git::Git' do
7
+ RSpec.describe 'Git::Git' do
8
8
  include FakeFS::SpecHelpers
9
9
 
10
10
  def create_mock_open_status(status)
@@ -28,15 +28,17 @@ describe 'Git::Git' do
28
28
  end
29
29
  end
30
30
 
31
+ let(:repository_name) { 'repository_name' }
32
+
31
33
  it 'can be created' do
32
- git = Git::Git.new('repository_name')
34
+ git = Git::Git.new(repository_name)
33
35
 
34
36
  expect(git.repository_url).to eq('git@github.com:repository_name.git')
35
37
  expect(git.repository_path).to eq('/tmp/git/repository_name')
36
38
  end
37
39
 
38
40
  it 'can be created with a different cache path' do
39
- git = Git::Git.new('repository_name', git_cache_path: './mycache')
41
+ git = Git::Git.new(repository_name, git_cache_path: './mycache')
40
42
 
41
43
  expect(git.repository_url).to eq('git@github.com:repository_name.git')
42
44
  expect(git.repository_path).to eq('./mycache/repository_name')
@@ -44,7 +46,7 @@ describe 'Git::Git' do
44
46
 
45
47
  context 'with a git repository' do
46
48
  before do
47
- @git = Git::Git.new('repository_name')
49
+ @git = Git::Git.new(repository_name)
48
50
  end
49
51
 
50
52
  it 'can execute a command' do
@@ -145,21 +147,21 @@ describe 'Git::Git' do
145
147
 
146
148
  branch_list = []
147
149
  branch_list << Git::GitBranch.new(
148
- 'repository_name',
150
+ repository_name,
149
151
  'test_1',
150
152
  DateTime.iso8601('2015-10-19T17:58:24-0700'),
151
153
  'Nicholas Ellis',
152
154
  'nellis@invoca.com'
153
155
  )
154
156
  branch_list << Git::GitBranch.new(
155
- 'repository_name',
157
+ repository_name,
156
158
  'test_build',
157
159
  DateTime.iso8601('2015-10-19T15:03:22-0700'),
158
160
  'Bob Smith',
159
161
  'bob@invoca.com'
160
162
  )
161
163
  branch_list << Git::GitBranch.new(
162
- 'repository_name',
164
+ repository_name,
163
165
  'test_build_b',
164
166
  DateTime.iso8601('2015-10-19T16:52:40-0700'),
165
167
  'Nicholas Ellis',
@@ -186,7 +188,7 @@ describe 'Git::Git' do
186
188
  )
187
189
 
188
190
  conflict = Git::GitConflict.new(
189
- 'repository_name',
191
+ repository_name,
190
192
  '91/eb/WEB-1723_Ringswitch_DB_Conn_Loss',
191
193
  '85/t/trello_adwords_dashboard_tiles_auto_adjust_font_size',
192
194
  ['test/workers/adwords_detail_worker_test.rb', 'pegasus/backdraft/pegasus_dashboard/spec/views/call_cost_tile_spec.js']
@@ -215,7 +217,7 @@ describe 'Git::Git' do
215
217
  expect(@git).to receive(:reset)
216
218
 
217
219
  conflict = Git::GitConflict.new(
218
- 'repository_name',
220
+ repository_name,
219
221
  '91/eb/WEB-1723_Ringswitch_DB_Conn_Loss',
220
222
  '85/t/trello_adwords_dashboard_tiles_auto_adjust_font_size',
221
223
  [
@@ -377,8 +379,8 @@ describe 'Git::Git' do
377
379
  it 'can diff a branch' do
378
380
  mocked_output = ["efd778098239838c165ffab2f12ad293f32824c8\tAuthor 1\tauthor1@email.com\t2016-07-14T10:09:45-07:00\tMerge branch 'production'\n",
379
381
  "667f3e5347c48c04663209682642fd8d6d93fde2\tAuthor 2\tauthor2@email.com\t2016-07-14T16:46:35-07:00\tMerge pull request #5584 from Owner/repo/dimension_repair\n"].join
380
- expected_array = [Git::GitCommit.new('efd778098239838c165ffab2f12ad293f32824c8', "Merge branch 'production'", nil, 'Author 1', 'author1@email.com'),
381
- Git::GitCommit.new('667f3e5347c48c04663209682642fd8d6d93fde2', 'Merge pull request #5584 from Owner/repo/dimension_repair', nil, 'Author 2', 'author2@email.com')]
382
+ expected_array = [Git::GitCommit.new('efd778098239838c165ffab2f12ad293f32824c8', "Merge branch 'production'", nil, 'Author 1', 'author1@email.com', repository_name: repository_name),
383
+ Git::GitCommit.new('667f3e5347c48c04663209682642fd8d6d93fde2', 'Merge pull request #5584 from Owner/repo/dimension_repair', nil, 'Author 2', 'author2@email.com', repository_name: repository_name)]
382
384
  mock_execute(
383
385
  mocked_output,
384
386
  1,
@@ -424,6 +426,18 @@ describe 'Git::Git' do
424
426
  )
425
427
  @git.commit_diff_refs('branch`name', 'ancestor`_branch')
426
428
  end
429
+
430
+ it 'can get a list of shas given start and end refs' do
431
+ mocked_output = ["efd778098239838c165ffab2f12ad293f32824c8\tAuthor 1\tauthor1@email.com\t2016-07-14T10:09:45-07:00\tMerge branch 'production'\n",
432
+ "667f3e5347c48c04663209682642fd8d6d93fde2\tAuthor 2\tauthor2@email.com\t2016-07-14T16:46:35-07:00\tMerge pull request #5584 from Owner/repo/dimension_repair\n"].join
433
+ expected_array = ["efd778098239838c165ffab2f12ad293f32824c8", "667f3e5347c48c04663209682642fd8d6d93fde2"]
434
+ mock_execute(
435
+ mocked_output,
436
+ 1,
437
+ expected_command: "/usr/bin/git log --format=%H\t%an\t%ae\t%aI\t%s --no-color efd778098239838c165ffab2f12ad293f32824c8..667f3e5347c48c04663209682642fd8d6d93fde2"
438
+ )
439
+ expect(@git.sha_list_for_ref_range("667f3e5347c48c04663209682642fd8d6d93fde2", "efd778098239838c165ffab2f12ad293f32824c8")).to eq(expected_array)
440
+ end
427
441
  end
428
442
 
429
443
  describe 'get_current_branch_name' do
data/spec/spec_helper.rb CHANGED
@@ -7,14 +7,22 @@ require 'pp'
7
7
  require 'fakefs/spec_helpers'
8
8
  require 'rspec_junit_formatter'
9
9
  require 'climate_control'
10
+ require 'rspec/support/object_formatter'
10
11
 
11
12
  RSpec.configure do |config|
12
13
  config.add_formatter RspecJunitFormatter, ENV['JUNIT_OUTPUT'] || 'spec/reports/rspec.xml'
14
+ RSpec::Support::ObjectFormatter.default_instance.max_formatted_output_length = 2_000
15
+
16
+ # Disable RSpec exposing methods globally on `Module` and `main`
17
+ config.disable_monkey_patching!
18
+
19
+ config.filter_run_when_matching :focus
13
20
 
14
21
  # Enable flags like --only-failures and --next-failure
15
22
  config.example_status_persistence_file_path = "spec/reports/.rspec_status"
16
23
 
17
24
  config.expect_with :rspec do |expectations|
25
+ expectations.syntax = :expect
18
26
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
19
27
  end
20
28
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_lib
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca Development
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-13 00:00:00.000000000 Z
11
+ date: 2021-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -30,7 +30,7 @@ dependencies:
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7'
33
- description:
33
+ description:
34
34
  email:
35
35
  - development@invoca.com
36
36
  executables: []
@@ -38,10 +38,9 @@ extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
40
  - ".dependabot/config.yml"
41
+ - ".github/workflows/build.yml"
41
42
  - ".github/workflows/gem_release.yml"
42
43
  - ".gitignore"
43
- - ".jenkins/Jenkinsfile"
44
- - ".jenkins/ruby_build_pod.yml"
45
44
  - ".rspec"
46
45
  - ".rubocop.yml"
47
46
  - ".ruby-version"
@@ -65,6 +64,7 @@ files:
65
64
  - lib/git/version.rb
66
65
  - lib/git_lib.rb
67
66
  - spec/lib/git/git_branch_spec.rb
67
+ - spec/lib/git/git_commit_spec.rb
68
68
  - spec/lib/git/git_conflict_spec.rb
69
69
  - spec/lib/git/git_error_spec.rb
70
70
  - spec/lib/git/git_spec.rb
@@ -73,7 +73,7 @@ homepage: https://github.com/Invoca/git_lib
73
73
  licenses: []
74
74
  metadata:
75
75
  allowed_push_host: https://rubygems.org
76
- post_install_message:
76
+ post_install_message:
77
77
  rdoc_options: []
78
78
  require_paths:
79
79
  - lib
@@ -89,11 +89,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
89
89
  version: '0'
90
90
  requirements: []
91
91
  rubygems_version: 3.0.1
92
- signing_key:
92
+ signing_key:
93
93
  specification_version: 4
94
94
  summary: Git wrapper library.
95
95
  test_files:
96
96
  - spec/lib/git/git_branch_spec.rb
97
+ - spec/lib/git/git_commit_spec.rb
97
98
  - spec/lib/git/git_conflict_spec.rb
98
99
  - spec/lib/git/git_error_spec.rb
99
100
  - spec/lib/git/git_spec.rb
data/.jenkins/Jenkinsfile DELETED
@@ -1,72 +0,0 @@
1
- #!/usr/bin/groovy
2
- @Library('jenkins-pipeline@v0.4.5')
3
- import com.invoca.docker.*;
4
-
5
- pipeline {
6
- agent {
7
- kubernetes {
8
- defaultContainer "ruby"
9
- yamlFile ".jenkins/ruby_build_pod.yml"
10
- }
11
- }
12
-
13
- environment {
14
- GITHUB_TOKEN = credentials('github_token')
15
- BUNDLE_GEM__FURY__IO = credentials('gemfury_deploy_token')
16
- }
17
-
18
- stages {
19
- stage('Setup') {
20
- steps {
21
- updateGitHubStatus('clean-build', 'pending', 'Running unit tests...')
22
- sh 'bundle install'
23
- sh 'bundle exec appraisal install'
24
- }
25
- }
26
-
27
- stage('Appraisals') {
28
- parallel {
29
- stage('Current') {
30
- environment { JUNIT_OUTPUT = 'spec/reports/current/rspec.xml' }
31
- steps { sh 'bundle exec rspec' }
32
- post { always { junit JUNIT_OUTPUT } }
33
- }
34
-
35
- stage('Rails 4') {
36
- environment { JUNIT_OUTPUT = 'spec/reports/rails-4/rspec.xml' }
37
- steps { sh 'bundle exec appraisal rails-4 rspec' }
38
- post { always { junit JUNIT_OUTPUT } }
39
- }
40
-
41
- stage('Rails 5') {
42
- environment { JUNIT_OUTPUT = 'spec/reports/rails-5/rspec.xml' }
43
- steps { sh 'bundle exec appraisal rails-5 rspec' }
44
- post { always { junit JUNIT_OUTPUT } }
45
- }
46
-
47
- stage('Rails 6') {
48
- environment { JUNIT_OUTPUT = 'spec/reports/rails-6/rspec.xml' }
49
- steps { sh 'bundle exec appraisal rails-6 rspec' }
50
- post { always { junit JUNIT_OUTPUT } }
51
- }
52
- }
53
- }
54
- }
55
-
56
- post {
57
- success { updateGitHubStatus('clean-build', 'success', 'Unit tests passed') }
58
- failure { updateGitHubStatus('clean-build', 'failure', 'Unit tests failed') }
59
- }
60
- }
61
-
62
- void updateGitHubStatus(String context, String status, String description) {
63
- gitHubStatus([
64
- repoSlug: 'Invoca/git_lib',
65
- sha: env.GIT_COMMIT,
66
- description: description,
67
- context: context,
68
- targetURL: env.RUN_DISPLAY_URL,
69
- token: env.GITHUB_TOKEN,
70
- status: status
71
- ])
72
- }
@@ -1,19 +0,0 @@
1
- ---
2
- apiVersion: v1
3
- kind: Pod
4
- metadata:
5
- labels:
6
- jenkins/git-lib: 'true'
7
- namespace: jenkins
8
- name: git-lib
9
- spec:
10
- containers:
11
- - name: ruby
12
- image: ruby:2.6.1
13
- tty: true
14
- resources:
15
- requests:
16
- memory: "100Mi"
17
- command:
18
- - cat
19
-