eac_git 0.7.3 → 0.11.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: ea0ec8dfe1a1b3cf7fdad28298c2eec04945cfcf3424bf39b1a3c4c9b5f0a9df
4
- data.tar.gz: f1b66e2d4f98f75a8768ae9e9cd773f4630e7d966e2762fbd540a36df28772bc
3
+ metadata.gz: 5583900c213a539c619f4d6e7fca1ee9ad8d0c2188549097e572e2c69160aa63
4
+ data.tar.gz: 9de7fa274c112090871bcc160d54bf3cc3b9730f8bc603852044d1d20145c8da
5
5
  SHA512:
6
- metadata.gz: 501347637df536d4bf23ad9c724a19eb289ff1efb80570226528f7f246844c66dbf124cdd004a7fe35f0c5c089e054a536a2d56a67134bba207d796953402d40
7
- data.tar.gz: 59c40599027f0c05d7a24a50e161b31e311cf0bd3383c1fe8dd07f0ec821f3a0176c85e38f25de29bd3de3dfd19e72d108a9b6b4608d3976e3cf78e9adce2cc1
6
+ metadata.gz: abf9630280dce2fd8252797e7c15620d0d2ae017e0d856ddb21ff96158812a3d95fb20f4a068e6d338690a40510cd3dafd60c207a208f1d1dea1f0bf80812102
7
+ data.tar.gz: 6839845a4a856bd6d01cc5642bc03bc44afa29a1f7623cb19e226b49ee1c763ddcacce19c2da56c41eb2d096fda61349edcd020e400e7b6255d4623a9dec768b
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'eac_ruby_utils/core_ext'
4
+
5
+ module EacGit
6
+ class Local
7
+ class Branch
8
+ REFS_PREFIX = 'refs/heads/'
9
+
10
+ common_constructor :local, :name
11
+
12
+ # @return [String]
13
+ def current_commit_id
14
+ local.rev_parse(full_ref_name, true)
15
+ end
16
+
17
+ # @return [Boolean]
18
+ def exist?
19
+ local.command('show-ref', '--quiet', full_ref_name).execute.fetch(:exit_code).zero?
20
+ end
21
+
22
+ def full_ref_name
23
+ "#{REFS_PREFIX}#{name}"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -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
@@ -0,0 +1,27 @@
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
+ class Remote
9
+ NO_SUCH_REMOTE_CODE = 128
10
+
11
+ enable_simple_cache
12
+
13
+ common_constructor :local, :name
14
+
15
+ def exist?
16
+ url
17
+ end
18
+
19
+ # @return [String, nil]
20
+ def url
21
+ local.command('remote', 'get-url', name)
22
+ .execute!(exit_outputs: { NO_SUCH_REMOTE_CODE => nil })
23
+ .if_present(nil, &:strip)
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/eac_git/local.rb CHANGED
@@ -7,15 +7,61 @@ 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
+
33
+ # Retrieves a local branch.
34
+ #
35
+ # @param name [String] Ex.: for "refs/heads/master", name should be "master".
36
+ # @return [EacGit::Local::Branch]
37
+ def branch(name)
38
+ ::EacGit::Local::Branch.new(self, name)
39
+ end
40
+
15
41
  def commit(ref, required = false)
16
42
  rev_parse(ref, required).if_present { |v| ::EacGit::Local::Commit.new(self, v) }
17
43
  end
18
44
 
45
+ def commitize(source)
46
+ if source.is_a?(::EacGit::Local::Commit)
47
+ return source if source.repo == self
48
+
49
+ source = source.id
50
+ end
51
+
52
+ source.to_s.strip.if_present(nil) { |v| ::EacGit::Local::Commit.new(self, v) }
53
+ end
54
+
55
+ # Retrieves the current local branch.
56
+ #
57
+ # @return [EacGit::Local::Branch, nil]
58
+ def current_branch
59
+ command('symbolic-ref', '--quiet', HEAD_REFERENCE)
60
+ .execute!(exit_outputs: { 256 => '' })
61
+ .gsub(%r{\Arefs/heads/}, '').strip
62
+ .if_present { |v| branch(v) }
63
+ end
64
+
19
65
  def descendant?(descendant, ancestor)
20
66
  base = merge_base(descendant, ancestor)
21
67
  return false if base.blank?
@@ -24,6 +70,11 @@ module EacGit
24
70
  base == revparse
25
71
  end
26
72
 
73
+ # @return [EacGit::Local::Commit
74
+ def head(required = true)
75
+ commit(HEAD_REFERENCE, required)
76
+ end
77
+
27
78
  def merge_base(*commits)
28
79
  refs = commits.dup
29
80
  while refs.count > 1
@@ -56,6 +107,12 @@ module EacGit
56
107
  ::EacGit::Local::Subrepo.new(self, subpath)
57
108
  end
58
109
 
110
+ # @return [Array<EacGit::Local::Subrepo>]
111
+ def subrepos
112
+ command('subrepo', '-q', 'status').execute!.split("\n").map(&:strip).select(&:present?)
113
+ .map { |subpath| subrepo(subpath) }
114
+ end
115
+
59
116
  def to_s
60
117
  "#{self.class}[#{root_path}]"
61
118
  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.3'
4
+ VERSION = '0.11.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.3
4
+ version: 0.11.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-08-24 00:00:00.000000000 Z
11
+ date: 2022-01-17 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.74'
19
+ version: '0.83'
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.74'
26
+ version: '0.83'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: parseconfig
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -93,11 +93,14 @@ files:
93
93
  - lib/eac_git.rb
94
94
  - lib/eac_git/executables.rb
95
95
  - lib/eac_git/local.rb
96
+ - lib/eac_git/local/branch.rb
96
97
  - lib/eac_git/local/commit.rb
97
98
  - lib/eac_git/local/commit/archive.rb
98
99
  - lib/eac_git/local/commit/changed_file.rb
99
100
  - lib/eac_git/local/commit/diff_tree_line.rb
100
101
  - lib/eac_git/local/dirty_files.rb
102
+ - lib/eac_git/local/log.rb
103
+ - lib/eac_git/local/remote.rb
101
104
  - lib/eac_git/local/subrepo.rb
102
105
  - lib/eac_git/local/subrepo/config.rb
103
106
  - lib/eac_git/remote.rb