eac_git 0.7.3 → 0.11.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: 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