eac_git 0.7.1 → 0.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cbaa3bcfa8bc46c1f611e08799e4a391d73ff3851f71ed3d076f1acd5c2f6ff
4
- data.tar.gz: 90e5a236919f519e06c8ff11321417e140a91c8f95be074d546584e8cd2d6927
3
+ metadata.gz: e3e59f62094b03ab4c24d4ee36a542cef813a308c797a8835482ae52174d50ea
4
+ data.tar.gz: 9c1dcb9b11dbd6cd4292f198a77efb089dae5ecc06ff077f89f94a9d6423ad9b
5
5
  SHA512:
6
- metadata.gz: 85545d07434e100d1ddaa58c2bdcfcaa10ea0f4faefa54a35bcaf8fc1caf75443e8eaea471d5998b24e90ba73408c5e71f8cb182a5beac12138bf4a66b90b79a
7
- data.tar.gz: 4f040b8eb11a692e63e464a53b41d84974d491db29ae4a16362940f0524cb2529fee319eaec2b41756af12e357a2a60fd5a07324436847163a530173793baf3c
6
+ metadata.gz: dbd211017dbe7125bfdff651ca0336573a09cd37ad160ab627a61f0d5bd21a9aa73896a074af517623ea8854d525cee93651f9b23d64b799192aea2ce40a0cff
7
+ data.tar.gz: ecf155ca625baca1be22721e7dbf29807c49a3d5d3e8d4eaf26c36466f99bea708fc55ddf17d9e0c26dbb3c4c533f6d18917aab860693f14205f36055344f132
@@ -9,7 +9,7 @@ module EacGit
9
9
  # @return [EacRubyUtils::Envs::Command]
10
10
  def archive_to_dir(path)
11
11
  path = path.to_pathname
12
- repo.command('archive', '--format=tar', hash).pipe(
12
+ repo.command('archive', '--format=tar', id).pipe(
13
13
  ::EacGit::Executables.tar.command('-xC', path)
14
14
  )
15
15
  end
@@ -7,19 +7,25 @@ module EacGit
7
7
  class Commit
8
8
  require_sub __FILE__, include_modules: true
9
9
  enable_simple_cache
10
+ include ::Comparable
10
11
 
11
12
  FIELDS = {
12
13
  author_name: '%an', author_email: '%ae', author_date: '%ai',
13
14
  subject: '%s',
14
15
  author_all: '%an <%ae>, %ai',
15
16
  commiter_name: '%cn', commiter_email: '%ce', commiter_date: '%ci',
16
- commiter_all: '%cn <%ce>, %ci'
17
+ commiter_all: '%cn <%ce>, %ci',
18
+ raw_body: '%B'
17
19
  }.freeze
18
20
 
19
- common_constructor :repo, :hash
21
+ common_constructor :repo, :id
22
+
23
+ def <=>(other)
24
+ [repo, id] <=> [other.repo, other.id]
25
+ end
20
26
 
21
27
  def format(format)
22
- repo.command('--no-pager', 'log', '-1', "--pretty=format:#{format}", hash).execute!.strip
28
+ repo.command('--no-pager', 'log', '-1', "--pretty=format:#{format}", id).execute!.strip
23
29
  end
24
30
 
25
31
  FIELDS.each do |field, format|
@@ -36,8 +42,21 @@ module EacGit
36
42
  changed_files.inject(0) { |a, e| a + e.dst_size }
37
43
  end
38
44
 
45
+ # @return [EacGit::Local::Commit, nil]
46
+ def parent
47
+ ps = parents
48
+ raise "#{self} has more than one parent" if ps.count > 2
49
+
50
+ ps.empty? ? nil : ps.first
51
+ end
52
+
53
+ # @return [Array<EacGit::Local::Commit>]
54
+ def parents
55
+ format('%P').each_line.map { |line| repo.commitize(line) }
56
+ end
57
+
39
58
  def root_child?
40
- format('%P').blank?
59
+ parents.empty?
41
60
  end
42
61
 
43
62
  private
@@ -45,7 +64,7 @@ module EacGit
45
64
  def diff_tree_execute
46
65
  args = []
47
66
  args << '--root' if root_child?
48
- args << hash
67
+ args << id
49
68
  repo.command(*::EacGit::Local::Commit::DiffTreeLine::GIT_COMMAND_ARGS, *args).execute!
50
69
  end
51
70
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_git/remote'
4
+ require 'eac_ruby_utils/core_ext'
5
+
6
+ module EacGit
7
+ class Local
8
+ module Log
9
+ def log(until_commit = nil, from_commit = nil)
10
+ until_commit, from_commit = [until_commit, from_commit].map { |c| commitize(c) }
11
+ from_commit ||= head
12
+ command('log', '--format=%H', "#{until_commit.id}..#{from_commit.id}")
13
+ .execute!.each_line.map { |line| commitize(line.strip) }
14
+ end
15
+ end
16
+ end
17
+ end
data/lib/eac_git/local.rb CHANGED
@@ -7,15 +7,43 @@ module EacGit
7
7
  # A Git repository in local filesystem.
8
8
  class Local
9
9
  require_sub __FILE__, include_modules: true
10
+ include ::Comparable
11
+
12
+ HEAD_REFERENCE = 'HEAD'
13
+
14
+ class << self
15
+ def find(path)
16
+ path = path.to_pathname.expand_path
17
+ if path.join('.git').exist?
18
+ new(path)
19
+ elsif path.to_path != '/'
20
+ find(path.parent)
21
+ end
22
+ end
23
+ end
10
24
 
11
25
  common_constructor :root_path do
12
26
  self.root_path = root_path.to_pathname
13
27
  end
14
28
 
29
+ def <=>(other)
30
+ root_path <=> other.root_path
31
+ end
32
+
15
33
  def commit(ref, required = false)
16
34
  rev_parse(ref, required).if_present { |v| ::EacGit::Local::Commit.new(self, v) }
17
35
  end
18
36
 
37
+ def commitize(source)
38
+ if source.is_a?(::EacGit::Local::Commit)
39
+ return source if source.repo == self
40
+
41
+ source = source.id
42
+ end
43
+
44
+ source.to_s.strip.if_present(nil) { |v| ::EacGit::Local::Commit.new(self, v) }
45
+ end
46
+
19
47
  def descendant?(descendant, ancestor)
20
48
  base = merge_base(descendant, ancestor)
21
49
  return false if base.blank?
@@ -24,6 +52,11 @@ module EacGit
24
52
  base == revparse
25
53
  end
26
54
 
55
+ # @return [EacGit::Local::Commit
56
+ def head(required = true)
57
+ commit(HEAD_REFERENCE, required)
58
+ end
59
+
27
60
  def merge_base(*commits)
28
61
  refs = commits.dup
29
62
  while refs.count > 1
@@ -56,6 +89,12 @@ module EacGit
56
89
  ::EacGit::Local::Subrepo.new(self, subpath)
57
90
  end
58
91
 
92
+ # @return [Array<EacGit::Local::Subrepo>]
93
+ def subrepos
94
+ command('subrepo', '-q', 'status').execute!.split("\n").map(&:strip).select(&:present?)
95
+ .map { |subpath| subrepo(subpath) }
96
+ end
97
+
59
98
  def to_s
60
99
  "#{self.class}[#{root_path}]"
61
100
  end
@@ -5,20 +5,18 @@ require 'eac_git/rspec/stubbed_git_local_repo'
5
5
 
6
6
  module EacGit
7
7
  module Rspec
8
- class Setup
9
- common_constructor :setup_obj
10
-
11
- def perform
12
- setup_conditional_git
13
- setup_stubbed_git_local_repo
8
+ module Setup
9
+ def self.extended(setup_obj)
10
+ setup_obj.setup_conditional_git
11
+ setup_obj.setup_stubbed_git_local_repo
14
12
  end
15
13
 
16
14
  def setup_conditional_git
17
- setup_obj.conditional(:git) { ::EacGit::Executables.git.validate }
15
+ conditional(:git) { ::EacGit::Executables.git.validate }
18
16
  end
19
17
 
20
18
  def setup_stubbed_git_local_repo
21
- setup_obj.rspec_config.include ::EacGit::Rspec::StubbedGitLocalRepo
19
+ rspec_config.include ::EacGit::Rspec::StubbedGitLocalRepo
22
20
  end
23
21
  end
24
22
  end
@@ -3,6 +3,7 @@
3
3
  require 'eac_git/local'
4
4
  require 'eac_ruby_utils/envs'
5
5
  require 'fileutils'
6
+ require 'securerandom'
6
7
  require 'tmpdir'
7
8
 
8
9
  module EacGit
@@ -29,6 +30,16 @@ module EacGit
29
30
  def file(*subpath)
30
31
  StubbedGitRepositoryFile.new(self, subpath)
31
32
  end
33
+
34
+ # @return [EacGit::Local::Commit
35
+ def random_commit
36
+ content = ::SecureRandom.hex
37
+ file = "#{content}.txt"
38
+ file(file).write(content)
39
+ command('add', file).execute!
40
+ command('commit', '-m', "Random commit: #{file}.").execute!
41
+ head
42
+ end
32
43
  end
33
44
 
34
45
  class StubbedGitRepositoryFile
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EacGit
4
- VERSION = '0.7.1'
4
+ VERSION = '0.9.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eac_git
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Put here the authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-31 00:00:00.000000000 Z
11
+ date: 2021-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eac_ruby_utils
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.72'
19
+ version: '0.74'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.72'
26
+ version: '0.74'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: parseconfig
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -53,7 +53,7 @@ dependencies:
53
53
  version: '0.8'
54
54
  - - ">="
55
55
  - !ruby/object:Gem::Version
56
- version: 0.8.1
56
+ version: 0.8.2
57
57
  type: :development
58
58
  prerelease: false
59
59
  version_requirements: !ruby/object:Gem::Requirement
@@ -63,7 +63,7 @@ dependencies:
63
63
  version: '0.8'
64
64
  - - ">="
65
65
  - !ruby/object:Gem::Version
66
- version: 0.8.1
66
+ version: 0.8.2
67
67
  - !ruby/object:Gem::Dependency
68
68
  name: eac_ruby_gem_support
69
69
  requirement: !ruby/object:Gem::Requirement
@@ -73,7 +73,7 @@ dependencies:
73
73
  version: '0.3'
74
74
  - - ">="
75
75
  - !ruby/object:Gem::Version
76
- version: 0.3.1
76
+ version: 0.3.2
77
77
  type: :development
78
78
  prerelease: false
79
79
  version_requirements: !ruby/object:Gem::Requirement
@@ -83,7 +83,7 @@ dependencies:
83
83
  version: '0.3'
84
84
  - - ">="
85
85
  - !ruby/object:Gem::Version
86
- version: 0.3.1
86
+ version: 0.3.2
87
87
  description:
88
88
  email:
89
89
  executables: []
@@ -98,6 +98,7 @@ files:
98
98
  - lib/eac_git/local/commit/changed_file.rb
99
99
  - lib/eac_git/local/commit/diff_tree_line.rb
100
100
  - lib/eac_git/local/dirty_files.rb
101
+ - lib/eac_git/local/log.rb
101
102
  - lib/eac_git/local/subrepo.rb
102
103
  - lib/eac_git/local/subrepo/config.rb
103
104
  - lib/eac_git/remote.rb