gitmain 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/gitmain.rb +3 -1
- data/lib/gitmain/blob.rb +34 -1
- data/lib/gitmain/commit.rb +35 -1
- data/lib/gitmain/repository.rb +94 -1
- data/lib/gitmain/text_blob.rb +14 -0
- data/lib/gitmain/tree.rb +65 -1
- data/lib/gitmain/version.rb +1 -1
- data/test/gitmain/blob_test.rb +56 -0
- data/test/gitmain/commit_test.rb +68 -0
- data/test/gitmain/repository_test.rb +196 -0
- data/test/gitmain/subclass_test.rb +42 -0
- data/test/gitmain/text_blob_test.rb +27 -0
- data/test/gitmain/tree_test.rb +117 -0
- data/test/test_helper.rb +97 -0
- metadata +35 -9
- data/lib/gitmain/branch.rb +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0970ff8fb78602218d3bc39bb1943baf2ffabdb7
|
4
|
+
data.tar.gz: e0e669e4b88c990ca30316921730ca81f3b9e114
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ff714a52c49cbacf2498f1d28e49259e1a576ed8ec5dfc23eceff1c19353dc834849c40887c3985ffe8ca348de866b0e9a4441cc88048cf28a0fd8585ecbc41
|
7
|
+
data.tar.gz: c08cef6bf5afccf6beee51cd508e6b29aeb0659b7cf139e87328690a43d6fcf35f5ebc0b1c91fdc12614b3fada74e4806e4906396daa9a9f40db3083c50e68aa
|
data/lib/gitmain.rb
CHANGED
data/lib/gitmain/blob.rb
CHANGED
@@ -1,4 +1,37 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Blob
|
3
|
+
attr_reader :id, :name, :path, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id, path = nil, name = nil)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid blob id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
@path = path
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def changed_attributes
|
15
|
+
@changed_attributes ||= {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def content
|
19
|
+
@content ||= _blob&.content
|
20
|
+
end
|
21
|
+
|
22
|
+
def content=(value)
|
23
|
+
changed_attributes[:content] = content
|
24
|
+
@content = value
|
25
|
+
end
|
26
|
+
|
27
|
+
def file_name
|
28
|
+
File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def _blob
|
34
|
+
@_blob ||= repository.rugged(id)
|
35
|
+
end
|
3
36
|
end
|
4
37
|
end
|
data/lib/gitmain/commit.rb
CHANGED
@@ -1,4 +1,38 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Commit
|
3
|
+
attr_reader :id, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid commit id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
end
|
11
|
+
|
12
|
+
def author_email
|
13
|
+
_commit&.author[:email]
|
14
|
+
end
|
15
|
+
|
16
|
+
def author_name
|
17
|
+
_commit&.author[:name]
|
18
|
+
end
|
19
|
+
|
20
|
+
def message
|
21
|
+
_commit&.message
|
22
|
+
end
|
23
|
+
|
24
|
+
def parent_ids
|
25
|
+
_commit&.parent_ids
|
26
|
+
end
|
27
|
+
|
28
|
+
def time
|
29
|
+
_commit&.time
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def _commit
|
35
|
+
@_commit ||= repository.rugged(id)
|
36
|
+
end
|
3
37
|
end
|
4
38
|
end
|
data/lib/gitmain/repository.rb
CHANGED
@@ -1,4 +1,97 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Repository
|
3
|
+
attr_reader :branch, :name
|
4
|
+
|
5
|
+
def self.default_branch(value = nil)
|
6
|
+
@default_branch = value unless value.to_s.empty?
|
7
|
+
|
8
|
+
if @default_branch.to_s.empty?
|
9
|
+
'master'
|
10
|
+
else
|
11
|
+
@default_branch
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.dirname(value = nil)
|
16
|
+
@dirname = value unless value.to_s.empty?
|
17
|
+
|
18
|
+
if @dirname.to_s.empty?
|
19
|
+
raise ArgumentError, 'provide a value to set @dirname'
|
20
|
+
else
|
21
|
+
@dirname
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.init(name)
|
26
|
+
raise ArgumentError, 'provide a valid name' unless name.match(/\A[\w\-]+\z/)
|
27
|
+
Rugged::Repository.init_at(File.join(dirname, "#{name}.git"), :bare)
|
28
|
+
new(name)
|
29
|
+
end
|
30
|
+
|
31
|
+
def initialize(name, branch = self.class.default_branch)
|
32
|
+
raise ArgumentError, 'provide a valid name' unless name.match(/\A[\w\-]+\z/)
|
33
|
+
raise ArgumentError, 'provide a valid branch' unless branch.match(/\A[\w\-]+\z/)
|
34
|
+
|
35
|
+
begin
|
36
|
+
@_repo = Rugged::Repository.new(File.join(self.class.dirname, "#{name}.git"))
|
37
|
+
rescue
|
38
|
+
raise ArgumentError, 'could not load repository'
|
39
|
+
end
|
40
|
+
|
41
|
+
unless @_repo.bare?
|
42
|
+
raise ArgumentError, 'must be a bare repository'
|
43
|
+
end
|
44
|
+
|
45
|
+
if @_repo.branches.each_name.include?(branch)
|
46
|
+
@_branch = @_repo.branches[branch]
|
47
|
+
elsif !@_repo.empty?
|
48
|
+
raise ArgumentError, 'must provide an existing branch'
|
49
|
+
end
|
50
|
+
|
51
|
+
@name = name
|
52
|
+
@branch = branch
|
53
|
+
end
|
54
|
+
|
55
|
+
def commit(klass: Gitmain::Commit)
|
56
|
+
klass.new(self, commit_id) if commit_id
|
57
|
+
end
|
58
|
+
|
59
|
+
def commit_id
|
60
|
+
@_branch&.target&.oid
|
61
|
+
end
|
62
|
+
|
63
|
+
def checkout(branch)
|
64
|
+
if @_repo.branches.each_name.include?(branch)
|
65
|
+
@_branch = @_repo.branches[branch]
|
66
|
+
@branch = branch
|
67
|
+
elsif @_repo.branches.each_name.include?(self.class.default_branch)
|
68
|
+
@_branch = @_repo.branches.create(branch, self.class.default_branch)
|
69
|
+
@branch = branch
|
70
|
+
else
|
71
|
+
raise ArgumentError, "default branch not yet setup"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def rename(name)
|
76
|
+
FileUtils.mv(File.join(self.class.dirname, "#@name.git"), File.join(self.class.dirname, "#{name}.git"))
|
77
|
+
@_repo = Rugged::Repository.new(File.join(self.class.dirname, "#{name}.git"))
|
78
|
+
@name = name
|
79
|
+
end
|
80
|
+
|
81
|
+
def rugged(id)
|
82
|
+
@_repo&.lookup(id)
|
83
|
+
end
|
84
|
+
|
85
|
+
def setup?
|
86
|
+
@_repo && !@_repo.empty? && @_repo.branches[self.class.default_branch]
|
87
|
+
end
|
88
|
+
|
89
|
+
def tree(klass: Gitmain::Tree)
|
90
|
+
klass.new(self, tree_id) if tree_id
|
91
|
+
end
|
92
|
+
|
93
|
+
def tree_id
|
94
|
+
@_branch&.target&.tree_id
|
95
|
+
end
|
3
96
|
end
|
4
97
|
end
|
data/lib/gitmain/tree.rb
CHANGED
@@ -1,4 +1,68 @@
|
|
1
1
|
module Gitmain
|
2
|
-
|
2
|
+
class Tree
|
3
|
+
attr_reader :id, :name, :path, :repository
|
4
|
+
|
5
|
+
def initialize(repository, id, path = nil, name = nil)
|
6
|
+
raise ArgumentError, 'provide a valid repository' unless repository.kind_of?(Gitmain::Repository)
|
7
|
+
raise ArgumentError, 'provide a valid tree id' unless id.to_s.match(/\A[0-9a-f]{40}\z/)
|
8
|
+
@repository = repository
|
9
|
+
@id = id
|
10
|
+
@path = path
|
11
|
+
@name = name
|
12
|
+
end
|
13
|
+
|
14
|
+
def blobs(klass: Gitmain::Blob, recursive: false)
|
15
|
+
if recursive
|
16
|
+
_tree.walk(:postorder).map do |root, object|
|
17
|
+
if object[:type] == :blob
|
18
|
+
blob_path = File.join(*[path, name, root].map(&:to_s).reject(&:empty?))
|
19
|
+
blob_path.sub!(/\/\z/, '')
|
20
|
+
blob_path = nil if blob_path.empty?
|
21
|
+
klass.new(repository, object[:oid], blob_path, object[:name])
|
22
|
+
end
|
23
|
+
end.compact
|
24
|
+
else
|
25
|
+
_tree.each.map do |object|
|
26
|
+
if object[:type] == :blob
|
27
|
+
blob_path = File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
28
|
+
blob_path.sub!(/\/\z/, '')
|
29
|
+
blob_path = nil if blob_path.empty?
|
30
|
+
klass.new(repository, object[:oid], blob_path, object[:name])
|
31
|
+
end
|
32
|
+
end.compact
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def file_name
|
37
|
+
File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
38
|
+
end
|
39
|
+
|
40
|
+
def trees(klass: Gitmain::Tree, recursive: false)
|
41
|
+
if recursive
|
42
|
+
_tree.walk(:postorder).map do |root, object|
|
43
|
+
if object[:type] == :tree
|
44
|
+
tree_path = File.join(*[path, name, root].map(&:to_s).reject(&:empty?))
|
45
|
+
tree_path.sub!(/\/\z/, '')
|
46
|
+
tree_path = nil if tree_path.empty?
|
47
|
+
klass.new(repository, object[:oid], tree_path, object[:name])
|
48
|
+
end
|
49
|
+
end.compact
|
50
|
+
else
|
51
|
+
_tree.each.map do |object|
|
52
|
+
if object[:type] == :tree
|
53
|
+
tree_path = File.join(*[path, name].map(&:to_s).reject(&:empty?))
|
54
|
+
tree_path.sub!(/\/\z/, '')
|
55
|
+
tree_path = nil if tree_path.empty?
|
56
|
+
klass.new(repository, object[:oid], tree_path, object[:name])
|
57
|
+
end
|
58
|
+
end.compact
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def _tree
|
65
|
+
@_tree ||= repository.rugged(id)
|
66
|
+
end
|
3
67
|
end
|
4
68
|
end
|
data/lib/gitmain/version.rb
CHANGED
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::BlobTest < Minitest::Test
|
4
|
+
def test_initialize_requires_repository
|
5
|
+
assert_raises(ArgumentError) do
|
6
|
+
Gitmain::Blob.new('', '')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_initialize_requires_id
|
11
|
+
assert_raises(ArgumentError) do
|
12
|
+
empty_repository do |repository|
|
13
|
+
Gitmain::Blob.new(repository, '')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialized_values_are_retrievable
|
19
|
+
setup_repository do |repository|
|
20
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
21
|
+
assert_equal repository, blob.repository
|
22
|
+
assert_equal '3245b20dc91de6cd85203c7184430a969689ac56', blob.id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_changed_attributes
|
27
|
+
setup_repository do |repository|
|
28
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
29
|
+
assert_equal({}, blob.changed_attributes)
|
30
|
+
blob.content = 'Hello Gitmain World!'
|
31
|
+
assert_equal({ content: 'Hello World.' }, blob.changed_attributes)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_content
|
36
|
+
setup_repository do |repository|
|
37
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
38
|
+
assert_equal 'Hello World.', blob.content
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_setting_content
|
43
|
+
setup_repository do |repository|
|
44
|
+
blob = Gitmain::Blob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
45
|
+
blob.content = 'Hello Gitmain World!'
|
46
|
+
assert_equal 'Hello Gitmain World!', blob.content
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_file_name
|
51
|
+
setup_repository do |repository|
|
52
|
+
blob = Gitmain::Blob.new(repository, '5eddd8887f867c74cef97aa385448b56554b3454', 'lib', 'project.rb')
|
53
|
+
assert_equal 'lib/project.rb', blob.file_name
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class Gitmain::CommitTest < Minitest::Test
|
5
|
+
def test_initialize_requires_repository
|
6
|
+
assert_raises(ArgumentError) do
|
7
|
+
Gitmain::Commit.new('', '')
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_initialize_requires_id
|
12
|
+
assert_raises(ArgumentError) do
|
13
|
+
empty_repository do |repository|
|
14
|
+
Gitmain::Commit.new(repository, '')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_initialized_values_are_retrievable
|
20
|
+
setup_repository do |repository|
|
21
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
22
|
+
assert_equal repository, commit.repository
|
23
|
+
assert_equal 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9', commit.id
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_author_email
|
28
|
+
setup_repository do |repository|
|
29
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
30
|
+
assert_equal 'gitmain@local', commit.author_email
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_author_name
|
35
|
+
setup_repository do |repository|
|
36
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
37
|
+
assert_equal 'Gitmain', commit.author_name
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_message
|
42
|
+
setup_repository do |repository|
|
43
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
44
|
+
assert_equal 'Full Repository Commit', commit.message
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_parent_ids_with_root
|
49
|
+
setup_repository do |repository|
|
50
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
51
|
+
assert_empty commit.parent_ids
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_parent_ids
|
56
|
+
setup_repository do |repository|
|
57
|
+
commit = Gitmain::Commit.new(repository, 'fb9d8f1ad958db545cc7b3374bed2b2c92db6545')
|
58
|
+
assert_equal ['d3d5eb0dcc42e58901414e24eb8b02c8b699b2d9'], commit.parent_ids
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_time
|
63
|
+
setup_repository do |repository|
|
64
|
+
commit = Gitmain::Commit.new(repository, 'd3d5eb0dcc42e58901414e24eb8b02c8b699b2d9')
|
65
|
+
assert commit.time == Time.new(2016, 2, 15, 1, 2, 3)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,196 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::RepositoryTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
super
|
6
|
+
Gitmain::Repository.instance_variable_set(:@default_branch, nil)
|
7
|
+
Gitmain::Repository.instance_variable_set(:@dirname, nil)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_repository_default_branch_returns_default_value
|
11
|
+
assert_equal 'master', Gitmain::Repository.default_branch
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_repository_default_branch_receives_and_returns_value
|
15
|
+
assert_equal 'production', Gitmain::Repository.default_branch('production')
|
16
|
+
assert_equal 'production', Gitmain::Repository.default_branch
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_repository_dirname_must_receive_a_value
|
20
|
+
assert_raises(ArgumentError) do
|
21
|
+
Gitmain::Repository.dirname
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_repository_dirname_receives_and_returns_value
|
26
|
+
assert_equal '/test', Gitmain::Repository.dirname('/test')
|
27
|
+
assert_equal '/test', Gitmain::Repository.dirname
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_repository_init_requires_name
|
31
|
+
assert_raises(ArgumentError) do
|
32
|
+
Gitmain::Repository.init('')
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_repository_init_returns_new_instance
|
37
|
+
Gitmain::Repository.dirname(repo_dirname)
|
38
|
+
repository = Gitmain::Repository.init('asdf-123')
|
39
|
+
assert repository.is_a?(Gitmain::Repository)
|
40
|
+
assert_equal repository.name, 'asdf-123'
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_initialize_requires_name
|
44
|
+
assert_raises(ArgumentError) do
|
45
|
+
Gitmain::Repository.new('', '')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_initialize_requires_repository_name
|
50
|
+
assert_raises(ArgumentError) do
|
51
|
+
Gitmain::Repository.dirname(repo_dirname)
|
52
|
+
Gitmain::Repository.new('asdf-123', '')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_initialize_requires_bare_repository_name
|
57
|
+
assert_raises(ArgumentError) do
|
58
|
+
full_repository
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_initialize_requires_branch
|
63
|
+
assert_raises(ArgumentError) do
|
64
|
+
Gitmain::Repository.dirname(repo_dirname)
|
65
|
+
Gitmain::Repository.new('repository', '')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_initialize_empty_repository_sets_rugged_repo
|
70
|
+
empty_repository do |repository|
|
71
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
72
|
+
assert_equal rugged_repo.class, Rugged::Repository
|
73
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'repository.git/')
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_initialize_setup_repository_sets_rugged_repo_and_branch
|
78
|
+
setup_repository do |repository|
|
79
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
80
|
+
assert_equal rugged_repo.class, Rugged::Repository
|
81
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'repository.git/')
|
82
|
+
rugged_branch = repository.instance_variable_get(:@_branch)
|
83
|
+
assert_equal rugged_branch.class, Rugged::Branch
|
84
|
+
assert_equal rugged_branch.name, 'master'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def test_initialize_setup_repository_requires_known_branch
|
89
|
+
assert_raises(ArgumentError) do
|
90
|
+
setup_repository('dev')
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_initialized_values_are_retrievable
|
95
|
+
empty_repository do |repository|
|
96
|
+
assert_equal 'repository', repository.name
|
97
|
+
assert_equal 'master', repository.branch
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_initialize_allows_default_branch
|
102
|
+
empty_repository do |repository|
|
103
|
+
assert_equal Gitmain::Repository.default_branch, repository.branch
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_commit_returns_nil_if_empty
|
108
|
+
empty_repository do |repository|
|
109
|
+
assert_nil repository.commit
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_commit_returns_commit_instance
|
114
|
+
setup_repository do |repository|
|
115
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
116
|
+
assert repository.commit.is_a?(Gitmain::Commit)
|
117
|
+
assert_equal repository.commit.repository, repository
|
118
|
+
assert_equal repository.commit.id, rugged_repo.branches['master'].target.oid
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_commit_id_returns_nil_if_empty
|
123
|
+
empty_repository do |repository|
|
124
|
+
assert_nil repository.commit_id
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_commit_id_returns_commit_sha
|
129
|
+
setup_repository do |repository|
|
130
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
131
|
+
assert_equal rugged_repo.branches['master'].target.oid, repository.commit_id
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_checkout_sets_branch
|
136
|
+
setup_repository do |repository|
|
137
|
+
assert_equal 'dev', repository.checkout('dev')
|
138
|
+
assert_equal 'dev', repository.branch
|
139
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
140
|
+
assert_equal rugged_repo.branches['master'].target.tree_id, rugged_repo.branches['dev'].target.tree_id
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_rename_sets_name
|
145
|
+
empty_repository do |repository|
|
146
|
+
assert_equal 'renamed', repository.rename('renamed')
|
147
|
+
assert_equal 'renamed', repository.name
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def test_rename_affects_repository
|
152
|
+
empty_repository do |repository|
|
153
|
+
repository.rename('renamed')
|
154
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
155
|
+
assert_equal rugged_repo.path, File.join(repo_dirname, 'renamed.git/')
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_setup?
|
160
|
+
empty_repository do |repository|
|
161
|
+
refute repository.setup?
|
162
|
+
end
|
163
|
+
|
164
|
+
setup_repository do |repository|
|
165
|
+
assert repository.setup?
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_tree_returns_nil_if_empty
|
170
|
+
empty_repository do |repository|
|
171
|
+
assert_nil repository.tree
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_tree_returns_tree_instance
|
176
|
+
setup_repository do |repository|
|
177
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
178
|
+
assert repository.tree.is_a?(Gitmain::Tree)
|
179
|
+
assert_equal repository.tree.repository, repository
|
180
|
+
assert_equal repository.tree.id, rugged_repo.branches['master'].target.tree_id
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_tree_id_returns_nil_if_empty
|
185
|
+
empty_repository do |repository|
|
186
|
+
assert_nil repository.tree_id
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_tree_id_returns_tree_sha
|
191
|
+
setup_repository do |repository|
|
192
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
193
|
+
assert_equal repository.tree_id, rugged_repo.branches['master'].target.tree_id
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BlobSubclass < Gitmain::Blob
|
4
|
+
end
|
5
|
+
|
6
|
+
class CommitSubclass < Gitmain::Commit
|
7
|
+
end
|
8
|
+
|
9
|
+
class TreeSubclass < Gitmain::Tree
|
10
|
+
end
|
11
|
+
|
12
|
+
class Gitmain::SubclassTest < Minitest::Test
|
13
|
+
def test_repository_commit_returns_customizable_commit_instance
|
14
|
+
setup_repository do |repository|
|
15
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
16
|
+
assert repository.commit(klass: CommitSubclass).is_a?(CommitSubclass)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_repository_tree_returns_customizable_tree_instance
|
21
|
+
setup_repository do |repository|
|
22
|
+
rugged_repo = repository.instance_variable_get(:@_repo)
|
23
|
+
assert repository.tree(klass: TreeSubclass).is_a?(TreeSubclass)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_tree_blobs_returns_customizable_blob_instances
|
28
|
+
setup_repository do |repository|
|
29
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
30
|
+
blob = tree.blobs(klass: BlobSubclass).first
|
31
|
+
assert blob.is_a?(BlobSubclass)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_trees
|
36
|
+
setup_repository do |repository|
|
37
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
38
|
+
tree = tree.trees(klass: TreeSubclass).first
|
39
|
+
assert tree.is_a?(TreeSubclass)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::TextBlobTest < Minitest::Test
|
4
|
+
def test_text
|
5
|
+
setup_repository do |repository|
|
6
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
7
|
+
assert_equal 'Hello World.', blob.text
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_changed_attributes
|
12
|
+
setup_repository do |repository|
|
13
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
14
|
+
assert_equal({}, blob.changed_attributes)
|
15
|
+
blob.text = 'Hello Gitmain World!'
|
16
|
+
assert_equal({ text: 'Hello World.' }, blob.changed_attributes)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_setting_text
|
21
|
+
setup_repository do |repository|
|
22
|
+
blob = Gitmain::TextBlob.new(repository, '3245b20dc91de6cd85203c7184430a969689ac56')
|
23
|
+
blob.text = 'Hello Gitmain World!'
|
24
|
+
assert_equal 'Hello Gitmain World!', blob.text
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Gitmain::TreeTest < Minitest::Test
|
4
|
+
def test_initialize_requires_repository
|
5
|
+
assert_raises(ArgumentError) do
|
6
|
+
Gitmain::Tree.new('', '')
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_initialize_requires_id
|
11
|
+
assert_raises(ArgumentError) do
|
12
|
+
empty_repository do |repository|
|
13
|
+
Gitmain::Tree.new(repository, '')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_initialized_values_are_retrievable
|
19
|
+
setup_repository do |repository|
|
20
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
21
|
+
assert_equal repository, tree.repository
|
22
|
+
assert_equal repository.tree_id, tree.id
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_blobs
|
27
|
+
setup_repository do |repository|
|
28
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
29
|
+
blobs = tree.blobs
|
30
|
+
assert_equal 1, blobs.length
|
31
|
+
assert_blob blobs[0], repository, '3245b20dc91de6cd85203c7184430a969689ac56', 'README.md', nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_blobs_recursively
|
36
|
+
setup_repository do |repository|
|
37
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
38
|
+
blobs = tree.blobs(recursive: true)
|
39
|
+
assert_equal 6, blobs.length
|
40
|
+
assert_blob blobs[0], repository, '3245b20dc91de6cd85203c7184430a969689ac56', 'README.md', nil
|
41
|
+
assert_blob blobs[1], repository, '5eddd8887f867c74cef97aa385448b56554b3454', 'project.rb', 'lib'
|
42
|
+
assert_blob blobs[2], repository, '57f650530905c305e7e84554974e5c635fa89c14', 'module.rb', 'lib/project'
|
43
|
+
assert_blob blobs[3], repository, '4ffb2ae6bc8d01fc3e1e91291af58ae7e3f1d12f', 'module_test.rb', 'test/project'
|
44
|
+
assert_blob blobs[4], repository, 'f9d5f423b12dceacb756ac6770fba6267d732d8b', 'other_test.rb', 'test/project/nested'
|
45
|
+
assert_blob blobs[5], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_trees
|
50
|
+
setup_repository do |repository|
|
51
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
52
|
+
trees = tree.trees
|
53
|
+
assert_equal 2, trees.length
|
54
|
+
assert_tree trees[0], repository, 'dee8c1e1f54639d65453b72e2c698e2b84be8954', 'lib', nil
|
55
|
+
assert_tree trees[1], repository, 'd8280db63f0294724e2f95c371324be626fc3656', 'test', nil
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_trees_recursively
|
60
|
+
setup_repository do |repository|
|
61
|
+
tree = Gitmain::Tree.new(repository, repository.tree_id)
|
62
|
+
trees = tree.trees(recursive: true)
|
63
|
+
assert_equal 5, trees.length
|
64
|
+
assert_tree trees[0], repository, '3eec4e80e151a2b5ddbd688d4cd5d4cd6b09cfdc', 'project', 'lib'
|
65
|
+
assert_tree trees[1], repository, 'dee8c1e1f54639d65453b72e2c698e2b84be8954', 'lib', nil
|
66
|
+
assert_tree trees[2], repository, '6f8ea40fcbd86bf53c514ec7e2246d468dfb2b80', 'nested', 'test/project'
|
67
|
+
assert_tree trees[3], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
68
|
+
assert_tree trees[4], repository, 'd8280db63f0294724e2f95c371324be626fc3656', 'test', nil
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_non_root_blobs
|
73
|
+
setup_repository do |repository|
|
74
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
75
|
+
blobs = tree.blobs
|
76
|
+
assert_equal 1, blobs.length
|
77
|
+
assert_blob blobs[0], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_non_root_blobs_recursively
|
82
|
+
setup_repository do |repository|
|
83
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
84
|
+
blobs = tree.blobs(recursive: true)
|
85
|
+
assert_equal 3, blobs.length
|
86
|
+
assert_blob blobs[0], repository, '4ffb2ae6bc8d01fc3e1e91291af58ae7e3f1d12f', 'module_test.rb', 'test/project'
|
87
|
+
assert_blob blobs[1], repository, 'f9d5f423b12dceacb756ac6770fba6267d732d8b', 'other_test.rb', 'test/project/nested'
|
88
|
+
assert_blob blobs[2], repository, 'e912ebf3225ea67b4612e431f6eb9805615544a7', 'test_helper.rb', 'test'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_non_root_trees
|
93
|
+
setup_repository do |repository|
|
94
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
95
|
+
trees = tree.trees
|
96
|
+
assert_equal 1, trees.length
|
97
|
+
assert_tree trees[0], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_non_root_trees_recursively
|
102
|
+
setup_repository do |repository|
|
103
|
+
tree = Gitmain::Tree.new(repository, 'd8280db63f0294724e2f95c371324be626fc3656', nil, 'test')
|
104
|
+
trees = tree.trees(recursive: true)
|
105
|
+
assert_equal 2, trees.length
|
106
|
+
assert_tree trees[0], repository, '6f8ea40fcbd86bf53c514ec7e2246d468dfb2b80', 'nested', 'test/project'
|
107
|
+
assert_tree trees[1], repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'project', 'test'
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_file_name
|
112
|
+
setup_repository do |repository|
|
113
|
+
tree = Gitmain::Tree.new(repository, 'c062683857593d744b3e03671fdcf344cb4ab699', 'test', 'project')
|
114
|
+
assert_equal 'test/project', tree.file_name
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
require_relative '../lib/gitmain'
|
2
|
+
require 'minitest'
|
3
|
+
require 'minitest/autorun'
|
4
|
+
require 'minitest/pride'
|
5
|
+
require 'rugged'
|
6
|
+
|
7
|
+
class Minitest::Test
|
8
|
+
def assert_blob(blob, repository, id, name, path)
|
9
|
+
assert blob.is_a?(Gitmain::Blob)
|
10
|
+
assert_equal repository, blob.repository
|
11
|
+
assert_equal id, blob.id
|
12
|
+
assert_equal name, blob.name
|
13
|
+
assert_equal path, blob.path
|
14
|
+
end
|
15
|
+
|
16
|
+
def assert_tree(tree, repository, id, name, path)
|
17
|
+
assert tree.is_a?(Gitmain::Tree)
|
18
|
+
assert_equal repository, tree.repository
|
19
|
+
assert_equal id, tree.id
|
20
|
+
assert_equal name, tree.name
|
21
|
+
assert_equal path, tree.path
|
22
|
+
end
|
23
|
+
|
24
|
+
def repo_dirname
|
25
|
+
File.expand_path('../../../tmp', __FILE__)
|
26
|
+
end
|
27
|
+
|
28
|
+
def setup
|
29
|
+
FileUtils.rm_rf(repo_dirname)
|
30
|
+
FileUtils.mkdir(repo_dirname)
|
31
|
+
end
|
32
|
+
|
33
|
+
def teardown
|
34
|
+
FileUtils.rm_rf(repo_dirname)
|
35
|
+
end
|
36
|
+
|
37
|
+
def empty_repository
|
38
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
39
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'repository.git'), :bare)
|
40
|
+
Gitmain::Repository.dirname(repo_dirname)
|
41
|
+
repository = Gitmain::Repository.new('repository')
|
42
|
+
yield repository if block_given?
|
43
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
44
|
+
end
|
45
|
+
|
46
|
+
def full_repository
|
47
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full.git'))
|
48
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'full.git'))
|
49
|
+
Gitmain::Repository.dirname(repo_dirname)
|
50
|
+
repository = Gitmain::Repository.new('full')
|
51
|
+
yield repository if block_given?
|
52
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full.git'))
|
53
|
+
end
|
54
|
+
|
55
|
+
def setup_repository(branch = 'master')
|
56
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
57
|
+
Rugged::Repository.init_at(File.join(repo_dirname, 'repository.git'), :bare)
|
58
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full_repository'))
|
59
|
+
FileUtils.mkdir_p(File.join(repo_dirname, 'full_repository'))
|
60
|
+
repo = Rugged::Repository.init_at(File.join(repo_dirname, 'full_repository'))
|
61
|
+
index = repo.index
|
62
|
+
oid = repo.write('Hello World.', :blob)
|
63
|
+
index.add(path: 'README.md', oid: oid, mode: 0100644)
|
64
|
+
oid = repo.write('# Project Setup', :blob)
|
65
|
+
index.add(path: 'lib/project.rb', oid: oid, mode: 0100644)
|
66
|
+
oid = repo.write('# Project Module', :blob)
|
67
|
+
index.add(path: 'lib/project/module.rb', oid: oid, mode: 0100644)
|
68
|
+
oid = repo.write('# Test Helper', :blob)
|
69
|
+
index.add(path: 'test/test_helper.rb', oid: oid, mode: 0100644)
|
70
|
+
oid = repo.write('# Module Test', :blob)
|
71
|
+
index.add(path: 'test/project/module_test.rb', oid: oid, mode: 0100644)
|
72
|
+
options = {}
|
73
|
+
options[:tree] = index.write_tree(repo)
|
74
|
+
options[:author] = options[:committer] = { email: 'gitmain@local', name: 'Gitmain', time: Time.new(2016, 2, 15, 1, 2, 3) }
|
75
|
+
options[:message] = 'Full Repository Commit'
|
76
|
+
options[:parents] = []
|
77
|
+
options[:update_ref] = 'refs/heads/master'
|
78
|
+
commit_id = Rugged::Commit.create(repo, options)
|
79
|
+
index = repo.index
|
80
|
+
oid = repo.write('# Nested Other Test', :blob)
|
81
|
+
index.add(path: 'test/project/nested/other_test.rb', oid: oid, mode: 0100644)
|
82
|
+
options = {}
|
83
|
+
options[:tree] = index.write_tree(repo)
|
84
|
+
options[:author] = options[:committer] = { email: 'gitmain@local', name: 'Gitmain', time: Time.new(2016, 2, 15, 1, 2, 3) }
|
85
|
+
options[:message] = 'Second Commit'
|
86
|
+
options[:parents] = [commit_id]
|
87
|
+
options[:update_ref] = 'refs/heads/master'
|
88
|
+
commit_id = Rugged::Commit.create(repo, options)
|
89
|
+
remote = repo.remotes.create_anonymous "file://#{File.join(repo_dirname, 'repository.git')}"
|
90
|
+
remote.push 'refs/heads/master'
|
91
|
+
Gitmain::Repository.dirname(repo_dirname)
|
92
|
+
repository = Gitmain::Repository.new('repository', branch)
|
93
|
+
yield repository if block_given?
|
94
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'repository.git'))
|
95
|
+
FileUtils.rm_rf(File.join(repo_dirname, 'full_repository.git'))
|
96
|
+
end
|
97
|
+
end
|
metadata
CHANGED
@@ -1,18 +1,30 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gitmain
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theodore Kimble
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rugged
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
description: ''
|
16
28
|
email:
|
17
29
|
- mail@theodorekimble.com
|
18
30
|
executables: []
|
@@ -23,11 +35,18 @@ files:
|
|
23
35
|
- README.md
|
24
36
|
- lib/gitmain.rb
|
25
37
|
- lib/gitmain/blob.rb
|
26
|
-
- lib/gitmain/branch.rb
|
27
38
|
- lib/gitmain/commit.rb
|
28
39
|
- lib/gitmain/repository.rb
|
40
|
+
- lib/gitmain/text_blob.rb
|
29
41
|
- lib/gitmain/tree.rb
|
30
42
|
- lib/gitmain/version.rb
|
43
|
+
- test/gitmain/blob_test.rb
|
44
|
+
- test/gitmain/commit_test.rb
|
45
|
+
- test/gitmain/repository_test.rb
|
46
|
+
- test/gitmain/subclass_test.rb
|
47
|
+
- test/gitmain/text_blob_test.rb
|
48
|
+
- test/gitmain/tree_test.rb
|
49
|
+
- test/test_helper.rb
|
31
50
|
homepage: https://github.com/theodorekimble/gitmain
|
32
51
|
licenses:
|
33
52
|
- MIT
|
@@ -48,8 +67,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
67
|
version: '0'
|
49
68
|
requirements: []
|
50
69
|
rubyforge_project:
|
51
|
-
rubygems_version: 2.
|
70
|
+
rubygems_version: 2.5.1
|
52
71
|
signing_key:
|
53
72
|
specification_version: 4
|
54
73
|
summary: Build Ruby Domain Models backed by Git Repositories
|
55
|
-
test_files:
|
74
|
+
test_files:
|
75
|
+
- test/gitmain/blob_test.rb
|
76
|
+
- test/gitmain/commit_test.rb
|
77
|
+
- test/gitmain/repository_test.rb
|
78
|
+
- test/gitmain/subclass_test.rb
|
79
|
+
- test/gitmain/text_blob_test.rb
|
80
|
+
- test/gitmain/tree_test.rb
|
81
|
+
- test/test_helper.rb
|
data/lib/gitmain/branch.rb
DELETED