eac_git 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/eac_git.rb +7 -0
- data/lib/eac_git/executables.rb +24 -0
- data/lib/eac_git/local.rb +57 -0
- data/lib/eac_git/local/subrepo.rb +48 -0
- data/lib/eac_git/local/subrepo/config.rb +43 -0
- data/lib/eac_git/remote.rb +19 -0
- data/lib/eac_git/remote/ls_result.rb +20 -0
- data/lib/eac_git/version.rb +5 -0
- metadata +104 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 950c9a3032c7b567df429f08449a4c3cc79cf09088c34baff66a091c5e8b4cc8
|
4
|
+
data.tar.gz: 645347929c4062d2dd982909d03919629d1327790f0a707ec108f9d2715cf3b5
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 59eb9e3bd7d20d5345768ee7d6c1837169f24b7fa48cc14f4f241677ada1d770974ce90901caa04ed08323c221bd15891829f29f104ed14f4718f8b096b926d7
|
7
|
+
data.tar.gz: 368ef48ac16375e6387e1ace60f61e6e03ecb09a070af72da64b88262d6f9e19960123aea81faafece3e832e4bc38140da7a60d8780f58dbf1bc409b9c215522
|
data/lib/eac_git.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/envs'
|
4
|
+
require 'eac_ruby_utils/simple_cache'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
module Executables
|
8
|
+
class << self
|
9
|
+
include ::EacRubyUtils::SimpleCache
|
10
|
+
|
11
|
+
def env
|
12
|
+
::EacRubyUtils::Envs.local
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
%w[git].each do |program|
|
18
|
+
define_method(program.underscore + '_uncached') do
|
19
|
+
env.executable(program, '--version')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_git/executables'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
# A Git repository in local filesystem.
|
8
|
+
class Local
|
9
|
+
require_sub __FILE__
|
10
|
+
|
11
|
+
common_constructor :root_path do
|
12
|
+
self.root_path = root_path.to_pathname
|
13
|
+
end
|
14
|
+
|
15
|
+
def descendant?(descendant, ancestor)
|
16
|
+
base = merge_base(descendant, ancestor)
|
17
|
+
return false if base.blank?
|
18
|
+
|
19
|
+
revparse = command('rev-parse', '--verify', ancestor).execute!.strip
|
20
|
+
base == revparse
|
21
|
+
end
|
22
|
+
|
23
|
+
def merge_base(*commits)
|
24
|
+
refs = commits.dup
|
25
|
+
while refs.count > 1
|
26
|
+
refs[1] = merge_base_pair(refs[0], refs[1])
|
27
|
+
return nil if refs[1].blank?
|
28
|
+
|
29
|
+
refs.shift
|
30
|
+
end
|
31
|
+
refs.first
|
32
|
+
end
|
33
|
+
|
34
|
+
def command(*args)
|
35
|
+
::EacGit::Executables.git.command('-C', root_path.to_path, *args)
|
36
|
+
end
|
37
|
+
|
38
|
+
def rev_parse(ref, required = false)
|
39
|
+
r = command('rev-parse', ref).execute!(exit_outputs: { 128 => nil, 32_768 => nil })
|
40
|
+
r.strip! if r.is_a?(String)
|
41
|
+
return r if r.present?
|
42
|
+
return nil unless required
|
43
|
+
|
44
|
+
raise "Reference \"#{ref}\" not found"
|
45
|
+
end
|
46
|
+
|
47
|
+
def subrepo(subpath)
|
48
|
+
::EacGit::Local::Subrepo.new(self, subpath)
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def merge_base_pair(commit1, commit2)
|
54
|
+
command('merge-base', commit1, commit2).execute!(exit_outputs: { 256 => nil }).strip
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,48 @@
|
|
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
|
+
# A git-subrepo (https://github.com/ingydotnet/git-subrepo) in a [EacGit::Local].
|
9
|
+
class Subrepo
|
10
|
+
require_sub __FILE__
|
11
|
+
enable_simple_cache
|
12
|
+
|
13
|
+
common_constructor :local, :subpath do
|
14
|
+
self.subpath = subpath.to_pathname
|
15
|
+
raise "Config file \"#{config_absolute_path}\" not found" unless config_absolute_path.file?
|
16
|
+
end
|
17
|
+
|
18
|
+
def command(subrepo_subcommand, *subrepo_subcommand_args)
|
19
|
+
local.command('subrepo', subrepo_subcommand, subpath.to_path,
|
20
|
+
*subrepo_subcommand_args)
|
21
|
+
end
|
22
|
+
|
23
|
+
delegate(*::EacGit::Local::Subrepo::Config::MAPPING.keys, to: :config)
|
24
|
+
|
25
|
+
def write_config
|
26
|
+
config_absolute_path.write(config.to_content)
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def config_uncached
|
32
|
+
::EacGit::Local::Subrepo::Config.from_file(config_absolute_path)
|
33
|
+
end
|
34
|
+
|
35
|
+
def config_absolute_path_uncached
|
36
|
+
config_relative_path.expand_path(local.root_path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def config_relative_path_uncached
|
40
|
+
subpath.join('.gitrepo')
|
41
|
+
end
|
42
|
+
|
43
|
+
def remote_uncached
|
44
|
+
::EacGit::Remote.new(remote_uri)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
require 'parseconfig'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
class Local
|
8
|
+
class Subrepo
|
9
|
+
class Config
|
10
|
+
MAPPING = {
|
11
|
+
command_version: :cmdver, commit_id: :commit, join_method: :method,
|
12
|
+
parent_commit_id: :parent, remote_branch: :branch, remote_uri: :remote
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
class << self
|
16
|
+
def from_file(file_path)
|
17
|
+
new(
|
18
|
+
::ParseConfig.new(file_path.to_pathname)['subrepo']
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
common_constructor :values do
|
24
|
+
self.values = values.with_indifferent_access
|
25
|
+
end
|
26
|
+
|
27
|
+
MAPPING.each do |method_name, _config_key|
|
28
|
+
define_method(method_name) do
|
29
|
+
values[MAPPING.fetch(method_name)]
|
30
|
+
end
|
31
|
+
|
32
|
+
define_method("#{method_name}=") do |value|
|
33
|
+
values[MAPPING.fetch(method_name)] = value
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_content
|
38
|
+
"[subrepo]\n" + MAPPING.map { |k, v| " #{v} = #{send(k)}\n" }.join
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_git/executables'
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
5
|
+
|
6
|
+
module EacGit
|
7
|
+
# A Git remote repository referenced by URI.
|
8
|
+
class Remote
|
9
|
+
require_sub __FILE__
|
10
|
+
|
11
|
+
common_constructor :uri
|
12
|
+
|
13
|
+
def ls
|
14
|
+
::EacGit::Remote::LsResult.by_ls_remote_command_output(
|
15
|
+
::EacGit::Executables.git.command('ls-remote', uri).execute!
|
16
|
+
)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'eac_ruby_utils/core_ext'
|
4
|
+
|
5
|
+
module EacGit
|
6
|
+
class Remote
|
7
|
+
class LsResult
|
8
|
+
class << self
|
9
|
+
def by_ls_remote_command_output(output)
|
10
|
+
new(
|
11
|
+
output.each_line.map { |line| line.strip.split(/\s+/) }.map { |x| [x[1], x[0]] }.to_h
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
common_constructor :hashes
|
17
|
+
delegate :fetch, :'[]', :count, :any?, :empty?, to: :hashes
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: eac_git
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Put here the authors
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-06-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: eac_ruby_utils
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.37'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.37'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: parseconfig
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 1.0.8
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '1.0'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.0.8
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: eac_ruby_gem_support
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.1'
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.1.2
|
57
|
+
type: :development
|
58
|
+
prerelease: false
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0.1'
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.1.2
|
67
|
+
description:
|
68
|
+
email:
|
69
|
+
executables: []
|
70
|
+
extensions: []
|
71
|
+
extra_rdoc_files: []
|
72
|
+
files:
|
73
|
+
- lib/eac_git.rb
|
74
|
+
- lib/eac_git/executables.rb
|
75
|
+
- lib/eac_git/local.rb
|
76
|
+
- lib/eac_git/local/subrepo.rb
|
77
|
+
- lib/eac_git/local/subrepo/config.rb
|
78
|
+
- lib/eac_git/remote.rb
|
79
|
+
- lib/eac_git/remote/ls_result.rb
|
80
|
+
- lib/eac_git/version.rb
|
81
|
+
homepage:
|
82
|
+
licenses: []
|
83
|
+
metadata: {}
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
requirements: []
|
99
|
+
rubyforge_project:
|
100
|
+
rubygems_version: 2.7.7
|
101
|
+
signing_key:
|
102
|
+
specification_version: 4
|
103
|
+
summary: Put here de description.
|
104
|
+
test_files: []
|