eternity 0.0.2 → 0.0.3
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 +4 -4
- data/lib/eternity/commit.rb +9 -14
- data/lib/eternity/delta.rb +5 -0
- data/lib/eternity/patch.rb +36 -19
- data/lib/eternity/repository.rb +1 -1
- data/lib/eternity/version.rb +1 -1
- data/spec/commit_spec.rb +3 -1
- data/spec/delta_spec.rb +111 -2
- data/spec/minitest_helper.rb +8 -0
- data/spec/pull_spec.rb +6 -15
- data/spec/push_spec.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9bb28d44f6a6270e1aa8d7da6b66067d5a097dbb
|
4
|
+
data.tar.gz: 1b316ac4f934458b9807717928f8bfd093453a1b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4dc81d334ca41182d027060ec32d1761856f80f8ca5de8e1ad79c5aca4de91026ce439a7ee9d68da1ed32d1a833021588a65653af195881d7da5f3f3af531fcc
|
7
|
+
data.tar.gz: 72308247b234e76c85ad6428860914ed8cce6bc54c073de199c41bb94354d984542baad5dd28a28a3e577ed699ea04a1fc0a6e22f275aa8a491a7e4dcdbafb3d
|
data/lib/eternity/commit.rb
CHANGED
@@ -12,7 +12,7 @@ module Eternity
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def time
|
15
|
-
Time.parse
|
15
|
+
Time.parse data['time'] if data['time']
|
16
16
|
end
|
17
17
|
|
18
18
|
def author
|
@@ -46,10 +46,6 @@ module Eternity
|
|
46
46
|
Commit.new data['base']
|
47
47
|
end
|
48
48
|
|
49
|
-
def base_delta
|
50
|
-
data['base_delta'] ? Blob.read(:delta, data['base_delta']) : {}
|
51
|
-
end
|
52
|
-
|
53
49
|
def history_times
|
54
50
|
data['history_times'] ? Blob.read(:history_times, data['history_times']) : {}
|
55
51
|
end
|
@@ -65,14 +61,6 @@ module Eternity
|
|
65
61
|
history_times.key? commit.id
|
66
62
|
end
|
67
63
|
|
68
|
-
def base_history_at(commit)
|
69
|
-
return [] unless commit
|
70
|
-
history = [base]
|
71
|
-
history += base.base_history_at commit unless base.id == commit.id
|
72
|
-
raise "History not include commit #{commit.id}" unless history.map(&:id).include? commit.id
|
73
|
-
history
|
74
|
-
end
|
75
|
-
|
76
64
|
def first?
|
77
65
|
parent_ids.compact.empty?
|
78
66
|
end
|
@@ -91,6 +79,14 @@ module Eternity
|
|
91
79
|
end
|
92
80
|
alias_method :eql?, :==
|
93
81
|
|
82
|
+
def hash
|
83
|
+
id.hash
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
"#{time} - #{short_id} - #{author}: #{message}"
|
88
|
+
end
|
89
|
+
|
94
90
|
def self.create(options)
|
95
91
|
raise 'Author must be present' if options[:author].to_s.strip.empty?
|
96
92
|
raise 'Message must be present' if options[:message].to_s.strip.empty?
|
@@ -109,7 +105,6 @@ module Eternity
|
|
109
105
|
index: options.fetch(:index),
|
110
106
|
delta: options.fetch(:delta),
|
111
107
|
base: options[:parents].count == 2 ? options.fetch(:base) : options[:parents].first,
|
112
|
-
base_delta: options[:parents].count == 2 ? options.fetch(:base_delta) : options.fetch(:delta),
|
113
108
|
history_times: Blob.write(:history_times, history_times)
|
114
109
|
}
|
115
110
|
|
data/lib/eternity/delta.rb
CHANGED
@@ -24,6 +24,11 @@ module Eternity
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
def between(commit_1, commit_2)
|
28
|
+
commits = ([commit_2] + commit_2.history) - ([commit_1] + commit_1.history)
|
29
|
+
merge commits.reverse.map(&:delta)
|
30
|
+
end
|
31
|
+
|
27
32
|
def revert(delta, commit)
|
28
33
|
commit.with_index do |index|
|
29
34
|
delta.each_with_object({}) do |(collection, changes), hash|
|
data/lib/eternity/patch.rb
CHANGED
@@ -26,22 +26,6 @@ module Eternity
|
|
26
26
|
@delta ||= TransparentProxy.new { calculate_delta }
|
27
27
|
end
|
28
28
|
|
29
|
-
private
|
30
|
-
|
31
|
-
def current_delta
|
32
|
-
@current_delta ||= base_delta_of current_commit, base_commit
|
33
|
-
end
|
34
|
-
|
35
|
-
def target_delta
|
36
|
-
@target_delta ||= base_delta_of target_commit, base_commit
|
37
|
-
end
|
38
|
-
|
39
|
-
def base_delta_of(commit, base)
|
40
|
-
return {} if commit == base
|
41
|
-
history = [commit] + commit.base_history_at(base)[0..-2]
|
42
|
-
Delta.merge history.reverse.map(&:base_delta)
|
43
|
-
end
|
44
|
-
|
45
29
|
end
|
46
30
|
|
47
31
|
|
@@ -62,6 +46,14 @@ module Eternity
|
|
62
46
|
|
63
47
|
private
|
64
48
|
|
49
|
+
def current_delta
|
50
|
+
@current_delta ||= Delta.between target_commit, current_commit
|
51
|
+
end
|
52
|
+
|
53
|
+
def target_delta
|
54
|
+
@target_delta ||= Delta.between current_commit, target_commit
|
55
|
+
end
|
56
|
+
|
65
57
|
def calculate_delta
|
66
58
|
return {} if merged?
|
67
59
|
|
@@ -106,7 +98,6 @@ module Eternity
|
|
106
98
|
end
|
107
99
|
|
108
100
|
log :calculate_delta
|
109
|
-
|
110
101
|
end
|
111
102
|
|
112
103
|
|
@@ -117,12 +108,38 @@ module Eternity
|
|
117
108
|
|
118
109
|
private
|
119
110
|
|
111
|
+
def current_delta
|
112
|
+
@current_delta ||= Delta.between base_commit, current_commit
|
113
|
+
end
|
114
|
+
|
115
|
+
def target_delta
|
116
|
+
@target_delta ||= Delta.between base_commit, target_commit
|
117
|
+
end
|
118
|
+
|
119
|
+
def diff_delta
|
120
|
+
@diff_delta ||= Delta.merge [Delta.revert(current_delta, base_commit), target_delta]
|
121
|
+
end
|
122
|
+
|
120
123
|
def calculate_delta
|
121
|
-
|
124
|
+
target_commit.with_index do |target_index|
|
125
|
+
diff_delta.each_with_object({}) do |(collection, elements), hash|
|
126
|
+
hash[collection] = {}
|
127
|
+
|
128
|
+
elements.each do |id, change|
|
129
|
+
if change['data']
|
130
|
+
sha1 = Blob.digest(Blob.serialize(change['data']))
|
131
|
+
change['data'] = target_index[collection][id].data if target_index[collection].include?(id) && sha1 != target_index[collection][id].sha1
|
132
|
+
end
|
133
|
+
|
134
|
+
hash[collection][id] = change if change
|
135
|
+
end
|
136
|
+
|
137
|
+
hash.delete collection if hash[collection].empty?
|
138
|
+
end
|
139
|
+
end
|
122
140
|
end
|
123
141
|
|
124
142
|
log :calculate_delta
|
125
|
-
|
126
143
|
end
|
127
144
|
|
128
145
|
end
|
data/lib/eternity/repository.rb
CHANGED
@@ -189,7 +189,7 @@ module Eternity
|
|
189
189
|
|
190
190
|
raise 'Already merged' if patch.merged?
|
191
191
|
|
192
|
-
commit! message: "Merge #{target_commit.short_id} into #{current_commit.short_id}",
|
192
|
+
commit! message: "Merge #{target_commit.short_id} into #{current_commit.short_id} (#{name})",
|
193
193
|
author: 'System',
|
194
194
|
parents: [current_commit.id, target_commit.id],
|
195
195
|
index: write_index(patch.delta),
|
data/lib/eternity/version.rb
CHANGED
data/spec/commit_spec.rb
CHANGED
@@ -27,6 +27,7 @@ describe Repository, 'Commit' do
|
|
27
27
|
current_commit.wont_be :merge?
|
28
28
|
current_commit.delta.must_equal 'countries' => {'AR' => {'action' => 'insert', 'data' => {'name' => 'Argentina'}}}
|
29
29
|
current_commit.must_equal_index 'countries' => {'AR' => digest(name: 'Argentina')}
|
30
|
+
current_commit.to_s.must_equal "#{current_commit.time} - #{current_commit.short_id} - #{current_commit.author}: #{current_commit.message}"
|
30
31
|
end
|
31
32
|
end
|
32
33
|
|
@@ -42,7 +43,7 @@ describe Repository, 'Commit' do
|
|
42
43
|
current_commit.time.must_be_instance_of Time
|
43
44
|
current_commit.author.must_equal 'User'
|
44
45
|
current_commit.message.must_equal 'Commit 2'
|
45
|
-
current_commit.
|
46
|
+
current_commit.parents.must_equal [commit_1]
|
46
47
|
current_commit.wont_be :first?
|
47
48
|
current_commit.wont_be :merge?
|
48
49
|
current_commit.delta.must_equal 'countries' => {'UY' => {'action' => 'insert', 'data' => {'name' => 'Uruguay'}}}
|
@@ -50,6 +51,7 @@ describe Repository, 'Commit' do
|
|
50
51
|
'AR' => digest(name: 'Argentina'),
|
51
52
|
'UY' => digest(name: 'Uruguay')
|
52
53
|
}
|
54
|
+
current_commit.to_s.must_equal "#{current_commit.time} - #{current_commit.short_id} - #{current_commit.author}: #{current_commit.message}"
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
data/spec/delta_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'minitest_helper'
|
2
2
|
|
3
|
-
describe
|
3
|
+
describe 'Delta' do
|
4
4
|
|
5
5
|
let(:repo_1) { Repository.new :test_1 }
|
6
6
|
let(:repo_2) { Repository.new :test_2 }
|
7
7
|
let(:repo_3) { Repository.new :test_3 }
|
8
8
|
|
9
|
-
it '
|
9
|
+
it 'Merge and Checkout' do
|
10
10
|
repo_1[:countries].insert 'AR', name: 'Argentina'
|
11
11
|
commit_1 = repo_1.commit author: 'User 1', message: 'Commit 1'
|
12
12
|
repo_1.push
|
@@ -107,4 +107,113 @@ describe Repository, 'Pull' do
|
|
107
107
|
}
|
108
108
|
end
|
109
109
|
|
110
|
+
it 'Commit -> Pull -> Push (multiple times)' do
|
111
|
+
repo_1[:countries].insert 'AR', name: 'Argentina'
|
112
|
+
repo_1.commit author: 'User 1', message: 'Added Argentina'
|
113
|
+
repo_1.push
|
114
|
+
|
115
|
+
delta = repo_2.pull
|
116
|
+
delta.must_equal 'countries' => {
|
117
|
+
'AR' => {'action' => 'insert', 'data' => {'name' => 'Argentina'}}
|
118
|
+
}
|
119
|
+
|
120
|
+
repo_2.current_commit.must_equal_index 'countries' => {
|
121
|
+
'AR' => digest(name: 'Argentina')
|
122
|
+
}
|
123
|
+
|
124
|
+
repo_2[:countries].insert 'BR', name: 'Brasil'
|
125
|
+
repo_2.commit author: 'User 2', message: 'Added Brasil'
|
126
|
+
|
127
|
+
delta = repo_2.pull
|
128
|
+
delta.must_be_empty
|
129
|
+
|
130
|
+
repo_2.current_commit.must_equal_index 'countries' => {
|
131
|
+
'AR' => digest(name: 'Argentina'),
|
132
|
+
'BR' => digest(name: 'Brasil')
|
133
|
+
}
|
134
|
+
|
135
|
+
repo_2.push
|
136
|
+
|
137
|
+
repo_1[:countries].insert 'UY', name: 'Uruguay'
|
138
|
+
repo_1.commit author: 'User 1', message: 'Added Uruguay'
|
139
|
+
|
140
|
+
delta = repo_1.pull
|
141
|
+
delta.must_equal 'countries' => {
|
142
|
+
'BR' => {'action' => 'insert', 'data' => {'name' => 'Brasil'}}
|
143
|
+
}
|
144
|
+
|
145
|
+
repo_1.current_commit.must_equal_index 'countries' => {
|
146
|
+
'AR' => digest(name: 'Argentina'),
|
147
|
+
'BR' => digest(name: 'Brasil'),
|
148
|
+
'UY' => digest(name: 'Uruguay')
|
149
|
+
}
|
150
|
+
|
151
|
+
repo_1.push
|
152
|
+
|
153
|
+
repo_2[:countries].insert 'CL', name: 'Chile'
|
154
|
+
repo_2.commit author: 'User 2', message: 'Added Chile'
|
155
|
+
|
156
|
+
delta = repo_2.pull
|
157
|
+
delta.must_equal 'countries' => {
|
158
|
+
'UY' => {'action' => 'insert', 'data' => {'name' => 'Uruguay'}}
|
159
|
+
}
|
160
|
+
|
161
|
+
repo_2.current_commit.must_equal_index 'countries' => {
|
162
|
+
'AR' => digest(name: 'Argentina'),
|
163
|
+
'BR' => digest(name: 'Brasil'),
|
164
|
+
'UY' => digest(name: 'Uruguay'),
|
165
|
+
'CL' => digest(name: 'Chile')
|
166
|
+
}
|
167
|
+
|
168
|
+
repo_2.push
|
169
|
+
|
170
|
+
repo_1[:countries].update 'UY', name: 'Republica Oriental del Uruguay'
|
171
|
+
repo_1.commit author: 'User 1', message: 'Updated Uruguay'
|
172
|
+
|
173
|
+
delta = repo_1.pull
|
174
|
+
delta.must_equal 'countries' => {
|
175
|
+
'CL' => {'action' => 'insert', 'data' => {'name' => 'Chile'}}
|
176
|
+
}
|
177
|
+
|
178
|
+
repo_1.current_commit.must_equal_index 'countries' => {
|
179
|
+
'AR' => digest(name: 'Argentina'),
|
180
|
+
'BR' => digest(name: 'Brasil'),
|
181
|
+
'UY' => digest(name: 'Republica Oriental del Uruguay'),
|
182
|
+
'CL' => digest(name: 'Chile')
|
183
|
+
}
|
184
|
+
|
185
|
+
repo_1.push
|
186
|
+
|
187
|
+
repo_2[:countries].delete 'CL'
|
188
|
+
repo_2.commit author: 'User 2', message: 'Deleted Chile'
|
189
|
+
|
190
|
+
delta = repo_2.pull
|
191
|
+
delta.must_equal 'countries' => {
|
192
|
+
'UY' => {'action' => 'update', 'data' => {'name' => 'Republica Oriental del Uruguay'}}
|
193
|
+
}
|
194
|
+
|
195
|
+
repo_2.current_commit.must_equal_index 'countries' => {
|
196
|
+
'AR' => digest(name: 'Argentina'),
|
197
|
+
'BR' => digest(name: 'Brasil'),
|
198
|
+
'UY' => digest(name: 'Republica Oriental del Uruguay')
|
199
|
+
}
|
200
|
+
|
201
|
+
repo_2.push
|
202
|
+
|
203
|
+
repo_1[:countries].insert 'CO', name: 'Colombia'
|
204
|
+
repo_1.commit author: 'User 1', message: 'Added Colombia'
|
205
|
+
|
206
|
+
delta = repo_1.pull
|
207
|
+
delta.must_equal 'countries' => {
|
208
|
+
'CL' => {'action' => 'delete'}
|
209
|
+
}
|
210
|
+
|
211
|
+
repo_1.current_commit.must_equal_index 'countries' => {
|
212
|
+
'AR' => digest(name: 'Argentina'),
|
213
|
+
'BR' => digest(name: 'Brasil'),
|
214
|
+
'UY' => digest(name: 'Republica Oriental del Uruguay'),
|
215
|
+
'CO' => digest(name: 'Colombia')
|
216
|
+
}
|
217
|
+
end
|
218
|
+
|
110
219
|
end
|
data/spec/minitest_helper.rb
CHANGED
data/spec/pull_spec.rb
CHANGED
@@ -111,12 +111,8 @@ describe Repository, 'Pull' do
|
|
111
111
|
|
112
112
|
repository.current_commit.tap do |commit|
|
113
113
|
commit.must_be :merge?
|
114
|
-
commit.
|
114
|
+
commit.parents.must_equal [commit_4, commit_3]
|
115
115
|
commit.base.id.must_equal commit_1.id
|
116
|
-
commit.base_delta.must_equal 'countries' => {
|
117
|
-
'BR' => {'action' => 'insert', 'data' => {'name' => 'Brasil'}},
|
118
|
-
'UY' => {'action' => 'insert', 'data' => {'name' => 'Uruguay'}}
|
119
|
-
}
|
120
116
|
commit.delta.must_be_empty
|
121
117
|
commit.must_equal_index 'countries' => {
|
122
118
|
'AR' => digest(name: 'Argentina'),
|
@@ -150,9 +146,8 @@ describe Repository, 'Pull' do
|
|
150
146
|
|
151
147
|
repository.current_commit.tap do |commit|
|
152
148
|
commit.must_be :merge?
|
153
|
-
commit.
|
149
|
+
commit.parents.must_equal [commit_3, commit_2]
|
154
150
|
commit.base.id.must_equal commit_1.id
|
155
|
-
commit.base_delta.must_equal 'countries' => {'AR' => {'action' => 'update', 'data' => {'name' => 'Argentina 2'}}}
|
156
151
|
commit.delta.must_be_empty
|
157
152
|
commit.must_equal_index 'countries' => {'AR' => digest(name: 'Argentina 2')}
|
158
153
|
end
|
@@ -182,9 +177,8 @@ describe Repository, 'Pull' do
|
|
182
177
|
|
183
178
|
repository.current_commit.tap do |commit|
|
184
179
|
commit.must_be :merge?
|
185
|
-
commit.
|
180
|
+
commit.parents.must_equal [commit_3, commit_2]
|
186
181
|
commit.base.id.must_equal commit_1.id
|
187
|
-
commit.base_delta.must_equal 'countries' => {'AR' => {'action' => 'update', 'data' => {'name' => 'Argentina', 'code' => 'ARG', 'number' => 54}}}
|
188
182
|
commit.delta.must_be_empty
|
189
183
|
commit.must_equal_index 'countries' => {'AR' => digest(name: 'Argentina', code: 'ARG', number: 54)}
|
190
184
|
end
|
@@ -214,9 +208,8 @@ describe Repository, 'Pull' do
|
|
214
208
|
|
215
209
|
repository.current_commit.tap do |commit|
|
216
210
|
commit.must_be :merge?
|
217
|
-
commit.
|
211
|
+
commit.parents.must_equal [commit_3, commit_2]
|
218
212
|
commit.base.id.must_equal commit_1.id
|
219
|
-
commit.base_delta.must_equal 'countries' => {'X' => {'action' => 'insert', 'data' => {'name' => 'X1', 'number' => 2, 'code' => 1}}}
|
220
213
|
commit.delta.must_be_empty
|
221
214
|
commit.must_equal_index 'countries' => {
|
222
215
|
'AR' => digest(name: 'Argentina'),
|
@@ -249,9 +242,8 @@ describe Repository, 'Pull' do
|
|
249
242
|
|
250
243
|
repository.current_commit.tap do |commit|
|
251
244
|
commit.must_be :merge?
|
252
|
-
commit.
|
245
|
+
commit.parents.must_equal [commit_3, commit_2]
|
253
246
|
commit.base.id.must_equal commit_1.id
|
254
|
-
commit.base_delta.must_equal 'countries' => {'AR' => {'action' => 'delete'}}
|
255
247
|
commit.delta.must_be_empty
|
256
248
|
commit.must_have_empty_index
|
257
249
|
end
|
@@ -281,9 +273,8 @@ describe Repository, 'Pull' do
|
|
281
273
|
|
282
274
|
repository.current_commit.tap do |commit|
|
283
275
|
commit.must_be :merge?
|
284
|
-
commit.
|
276
|
+
commit.parents.must_equal [commit_3, commit_2]
|
285
277
|
commit.base.id.must_equal commit_1.id
|
286
|
-
commit.base_delta.must_equal 'countries' => {'AR' => {'action' => 'update', 'data' => {'name' => 'Argentina', 'code' => 'ARG'}}}
|
287
278
|
commit.delta.must_be_empty
|
288
279
|
commit.must_equal_index 'countries' => {'AR' => digest(name: 'Argentina', code: 'ARG')}
|
289
280
|
end
|
data/spec/push_spec.rb
CHANGED
@@ -66,7 +66,7 @@ describe Repository, 'Push' do
|
|
66
66
|
other_repository.push
|
67
67
|
|
68
68
|
Branch[:master].id.must_equal other_repository.current_commit.id
|
69
|
-
Branch[:master].
|
69
|
+
Branch[:master].parents.must_equal [commit_2, commit_1]
|
70
70
|
end
|
71
71
|
|
72
72
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eternity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gabriel Naiman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: redic
|
@@ -247,7 +247,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
247
247
|
version: '0'
|
248
248
|
requirements: []
|
249
249
|
rubyforge_project:
|
250
|
-
rubygems_version: 2.
|
250
|
+
rubygems_version: 2.4.3
|
251
251
|
signing_key:
|
252
252
|
specification_version: 4
|
253
253
|
summary: Distributed database version control system
|