eac_git 0.8.0 → 0.9.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: 666b1ea54c39fca3540650e25d754d02b665e9f66668f190b1f7bf187098edb6
4
- data.tar.gz: 606c1187283de19695be48cf13aadb345b60ac4f0625d3477e97532e763ced4a
3
+ metadata.gz: e3e59f62094b03ab4c24d4ee36a542cef813a308c797a8835482ae52174d50ea
4
+ data.tar.gz: 9c1dcb9b11dbd6cd4292f198a77efb089dae5ecc06ff077f89f94a9d6423ad9b
5
5
  SHA512:
6
- metadata.gz: 477b98b77bdefc6d1622603263eea2b60fde7736b2e44f36d201da1f6d0d37113d10c53a609876dad2338cdf48c18303105dfd3106952acb7154bff8491ca00d
7
- data.tar.gz: d2cbcd3b0f43cd10bbfc1c17bb7fad3704927aa7585ab061aa04a396002d53cbb94dc07faef5369738c09e2c260a83183cd27f7ae23ba43a0e9acbdb7b46224c
6
+ metadata.gz: dbd211017dbe7125bfdff651ca0336573a09cd37ad160ab627a61f0d5bd21a9aa73896a074af517623ea8854d525cee93651f9b23d64b799192aea2ce40a0cff
7
+ data.tar.gz: ecf155ca625baca1be22721e7dbf29807c49a3d5d3e8d4eaf26c36466f99bea708fc55ddf17d9e0c26dbb3c4c533f6d18917aab860693f14205f36055344f132
@@ -7,17 +7,23 @@ 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
21
  common_constructor :repo, :id
20
22
 
23
+ def <=>(other)
24
+ [repo, id] <=> [other.repo, other.id]
25
+ end
26
+
21
27
  def format(format)
22
28
  repo.command('--no-pager', 'log', '-1', "--pretty=format:#{format}", id).execute!.strip
23
29
  end
@@ -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
@@ -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,17 +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
10
11
 
11
12
  HEAD_REFERENCE = 'HEAD'
12
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
24
+
13
25
  common_constructor :root_path do
14
26
  self.root_path = root_path.to_pathname
15
27
  end
16
28
 
29
+ def <=>(other)
30
+ root_path <=> other.root_path
31
+ end
32
+
17
33
  def commit(ref, required = false)
18
34
  rev_parse(ref, required).if_present { |v| ::EacGit::Local::Commit.new(self, v) }
19
35
  end
20
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
+
21
47
  def descendant?(descendant, ancestor)
22
48
  base = merge_base(descendant, ancestor)
23
49
  return false if base.blank?
@@ -63,6 +89,12 @@ module EacGit
63
89
  ::EacGit::Local::Subrepo.new(self, subpath)
64
90
  end
65
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
+
66
98
  def to_s
67
99
  "#{self.class}[#{root_path}]"
68
100
  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.8.0'
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.8.0
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-09-24 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
@@ -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