zold 0.22.9 → 0.23.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: 42d10a8522bef20fb7b2c55c247ecc7e5880ff8b54f3de789757a66f93ae5473
4
- data.tar.gz: 36961cafd7fb37eb88790efca940a8181b9ec57c42808bbb8b6a3d6766b70c44
3
+ metadata.gz: 95430a239fd73f041ab0fcff000ce6406b7d0ff89e4dc4b66b63c6aaa525967e
4
+ data.tar.gz: 592bf1dd34b5fbe895033565dd481b01cd4da65d4f92145f17008f8bbbac43f6
5
5
  SHA512:
6
- metadata.gz: 44792c5bec30388fd5cbaf793ab5a7ac6254aaf6e52ff2ee0574fb2d158144fc832e63bcd1c91bc349b3403e0931dc6b8db717570e4fd6ebd61be324e2574750
7
- data.tar.gz: c87eabcbd062862ef4538a50c1e4eb3da11e82bcbacb703e935e76ef3647934156f6e3d53f08171b1a753b2f953eb19ee243293d15b0cd44bdd9930714e37209
6
+ metadata.gz: 664086b5fac5d2ba9fc29fe4b31e5b6a3d542c6a314e9ec91cefeed825460b703bf8f85710e7104fb34ad9ea401b9c2d10fe46d80cfc4b7672f3c584590841b3
7
+ data.tar.gz: bcf469f972e7f2e2c960e19992a3c6d2fe098b2e1884d46bf5ffceb584c32559942a5c3aec42e0b0f5460cbd3afa83f824c2ca60b25d5d570d130d879fa70949
data/bin/zold CHANGED
@@ -81,6 +81,8 @@ Available commands:
81
81
  Remove expired local copies
82
82
  #{Rainbow('merge').green} [ID...] [options]
83
83
  Merge remote copies with the HEAD
84
+ #{Rainbow('rebase').green} [ID...] [options]
85
+ Rebase local copy of the wallet, removing all inconsistencies
84
86
  #{Rainbow('propagate').green} [ID...] [options]
85
87
  Propagate transactions to receiving wallets
86
88
  #{Rainbow('pull').green} [ID...] [options]
@@ -237,6 +239,9 @@ cmd = lambda do
237
239
  when 'merge'
238
240
  require_relative '../lib/zold/commands/merge'
239
241
  Zold::Merge.new(wallets: wallets, remotes: remotes, copies: copies, log: log).run(args)
242
+ when 'merge'
243
+ require_relative '../lib/zold/commands/rebase'
244
+ Zold::Rebase.new(wallets: wallets, log: log).run(args)
240
245
  when 'propagate'
241
246
  require_relative '../lib/zold/commands/propagate'
242
247
  Zold::Propagate.new(wallets: wallets, log: log).run(args)
@@ -56,6 +56,9 @@ module Zold
56
56
  # Raises when there are not enough successful nodes.
57
57
  class NoQuorum < StandardError; end
58
58
 
59
+ # Raises when the wallet wasn't found in all visible nodes.
60
+ class NotFound < StandardError; end
61
+
59
62
  def initialize(wallets:, remotes:, copies:, log: Log::NULL)
60
63
  @wallets = wallets
61
64
  @remotes = remotes
@@ -117,7 +120,8 @@ Available options:"
117
120
  end
118
121
  unless opts['quiet-if-absent']
119
122
  if done.value.zero?
120
- raise "No nodes out of #{nodes.value} have the wallet #{id}; run 'zold remote update' and try again"
123
+ raise NotFound, "No nodes out of #{nodes.value} have the wallet #{id}; \
124
+ run 'zold remote update' and try again"
121
125
  end
122
126
  if masters.value.zero? && !opts['tolerate-edges']
123
127
  raise EdgesOnly, "There are only edge nodes, run 'zold remote update' or use --tolerate-edges"
@@ -37,7 +37,7 @@ require_relative '../patch'
37
37
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
38
38
  # License:: MIT
39
39
  module Zold
40
- # MERGE pulling command
40
+ # MERGE command
41
41
  class Merge
42
42
  prepend ThreadBadge
43
43
 
@@ -128,12 +128,16 @@ into #{@wallets.acq(id, &:mnemo)} in #{Age.new(start, limit: 0.1 + cps.count * 0
128
128
  start = Time.now
129
129
  @log.debug("Building a patch for #{wallet.id} from remote copy ##{name} with #{wallet.mnemo}...")
130
130
  if opts['shallow']
131
- patch.join(wallet)
131
+ patch.join(wallet) do |txn|
132
+ @log.debug("Paying wallet #{txn.bnf} file is absent but it's a \"shallow\" MERGE: #{txn.to_text}")
133
+ false
134
+ end
132
135
  else
133
- patch.join(wallet) do |id|
136
+ patch.join(wallet) do |txn|
134
137
  Pull.new(wallets: @wallets, remotes: @remotes, copies: @copies, log: @log).run(
135
- ['pull', id.to_s, "--network=#{opts['network']}", '--shallow']
138
+ ['pull', txn.bnf.to_s, "--network=#{opts['network']}", '--shallow']
136
139
  )
140
+ true
137
141
  end
138
142
  end
139
143
  @log.debug("Copy ##{name} of #{wallet.id} merged in #{Age.new(start)}: #{patch}")
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018-2019 Zerocracy, Inc.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'slop'
24
+ require 'rainbow'
25
+ require 'backtrace'
26
+ require_relative 'thread_badge'
27
+ require_relative 'args'
28
+ require_relative '../age'
29
+ require_relative '../log'
30
+ require_relative '../id'
31
+ require_relative '../wallet'
32
+ require_relative '../patch'
33
+
34
+ # REBASE command.
35
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
36
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
37
+ # License:: MIT
38
+ module Zold
39
+ # REBASE command
40
+ class Rebase
41
+ prepend ThreadBadge
42
+
43
+ def initialize(wallets:, log: Log::NULL)
44
+ @wallets = wallets
45
+ @log = log
46
+ end
47
+
48
+ # Returns the array of modified wallets (IDs)
49
+ def run(args = [])
50
+ opts = Slop.parse(args, help: true, suppress_errors: true) do |o|
51
+ o.banner = "Usage: zold rebase [ID...] [options]
52
+ Available options:"
53
+ o.bool '--help', 'Print instructions'
54
+ end
55
+ mine = Args.new(opts, @log).take || return
56
+ list = mine.empty? ? @wallets.all : mine.map { |i| Id.new(i) }
57
+ list.uniq.each do |id|
58
+ rebase(id, opts)
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ def rebase(id, _)
65
+ start = Time.now
66
+ patch = Patch.new(@wallets, log: @log)
67
+ @wallets.acq(id) do |wallet|
68
+ patch.join(wallet) do |txn|
69
+ @log.debug("Paying wallet #{txn.bnf} file is absent: #{txn.to_text}")
70
+ false
71
+ end
72
+ @log.debug("Wallet #{wallet.mnemo} rebased in #{Age.new(start)}")
73
+ end
74
+ end
75
+ end
76
+ end
@@ -28,6 +28,7 @@ require_relative '../tax'
28
28
  require_relative '../age'
29
29
  require_relative '../commands/clean'
30
30
  require_relative '../commands/merge'
31
+ require_relative '../commands/rebase'
31
32
  require_relative '../commands/fetch'
32
33
  require_relative '../commands/push'
33
34
 
@@ -86,6 +87,7 @@ module Zold
86
87
  @log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and not modified anything")
87
88
  else
88
89
  @log.info("Accepted #{id} in #{Age.new(start, limit: 1)} and modified #{modified.join(', ')}")
90
+ Rebase.new(wallets: @wallets, log: @log).run(['rebase'] + modified.map(&:to_s))
89
91
  end
90
92
  sec = (Time.now - start).round(2)
91
93
  @mutex.synchronize do
@@ -109,20 +109,15 @@ with a new one \"#{txn.to_text}\" from #{wallet.mnemo}")
109
109
  @log.error("Payment prefix '#{txn.prefix}' doesn't match with the key of #{wallet.id}: \"#{txn.to_text}\"")
110
110
  next
111
111
  end
112
- unless @wallets.acq(txn.bnf, &:exists?)
113
- if block_given?
114
- yield(txn.bnf)
115
- unless @wallets.acq(txn.bnf, &:exists?)
116
- @log.error("Paying wallet #{txn.bnf} file is absent even after PULL: \"#{txn.to_text}\"")
117
- next
118
- end
119
- unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
120
- @log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
112
+ if !@wallets.acq(txn.bnf, &:exists?) && yield(txn)
113
+ unless @wallets.acq(txn.bnf, &:exists?)
114
+ @log.error("Paying wallet #{txn.bnf} file is absent even after PULL: \"#{txn.to_text}\"")
115
+ next
116
+ end
117
+ unless @wallets.acq(txn.bnf) { |p| p.includes_negative?(txn.id, wallet.id) }
118
+ @log.error("The beneficiary #{@wallets.acq(txn.bnf, &:mnemo)} of #{@id} \
121
119
  doesn't have this transaction: \"#{txn.to_text}\"")
122
- next
123
- end
124
- else
125
- @log.debug("Paying wallet #{txn.bnf} file is absent but it's a \"shallow\" MERGE: #{txn.to_text}")
120
+ next
126
121
  end
127
122
  end
128
123
  end
@@ -25,7 +25,7 @@
25
25
  # Copyright:: Copyright (c) 2018 Yegor Bugayenko
26
26
  # License:: MIT
27
27
  module Zold
28
- VERSION = '0.22.9'
28
+ VERSION = '0.23.0'
29
29
  PROTOCOL = 2
30
30
  REPO = 'zold-io/zold'
31
31
  end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright (c) 2018-2019 Zerocracy, Inc.
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ # of this software and associated documentation files (the 'Software'), to deal
7
+ # in the Software without restriction, including without limitation the rights
8
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ # copies of the Software, and to permit persons to whom the Software is
10
+ # furnished to do so, subject to the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be included in all
13
+ # copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFINGEMENT. IN NO EVENT SHALL THE
18
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ require 'minitest/autorun'
24
+ require 'tmpdir'
25
+ require_relative '../test__helper'
26
+ require_relative '../fake_home'
27
+ require_relative '../../lib/zold/commands/rebase'
28
+
29
+ # REBASE test.
30
+ # Author:: Yegor Bugayenko (yegor256@gmail.com)
31
+ # Copyright:: Copyright (c) 2018 Yegor Bugayenko
32
+ # License:: MIT
33
+ class TestRebase < Zold::Test
34
+ def test_rebases_wallet
35
+ FakeHome.new(log: test_log).run do |home|
36
+ wallet = home.create_wallet
37
+ Zold::Rebase.new(wallets: home.wallets, log: test_log).run(
38
+ ['rebase', wallet.id.to_s]
39
+ )
40
+ assert_equal(0, wallet.txns.count)
41
+ end
42
+ end
43
+ end
@@ -50,9 +50,9 @@ class TestPatch < Zold::Test
50
50
  t = third.sub(Zold::Amount.new(zld: 10.0), "NOPREFIX@#{Zold::Id.new}", key)
51
51
  third.add(t.inverse(Zold::Id.new))
52
52
  patch = Zold::Patch.new(home.wallets, log: test_log)
53
- patch.join(first)
54
- patch.join(second)
55
- patch.join(third)
53
+ patch.join(first) { false }
54
+ patch.join(second) { false }
55
+ patch.join(third) { false }
56
56
  assert_equal(true, patch.save(first.path, overwrite: true))
57
57
  assert_equal(Zold::Amount.new(zld: -53.0), first.balance)
58
58
  end
@@ -65,8 +65,8 @@ class TestPatch < Zold::Test
65
65
  IO.write(second.path, IO.read(first.path))
66
66
  second.add(Zold::Txn.new(1, Time.now, Zold::Amount.new(zld: 11.0), 'NOPREFIX', Zold::Id.new, 'fake'))
67
67
  patch = Zold::Patch.new(home.wallets, log: test_log)
68
- patch.join(first)
69
- patch.join(second)
68
+ patch.join(first) { false }
69
+ patch.join(second) { false }
70
70
  assert_equal(false, patch.save(first.path, overwrite: true))
71
71
  first.flush
72
72
  assert_equal(Zold::Amount::ZERO, first.balance)
@@ -82,8 +82,8 @@ class TestPatch < Zold::Test
82
82
  key = Zold::Key.new(file: 'fixtures/id_rsa')
83
83
  second.sub(amount, "NOPREFIX@#{Zold::Id.new}", key)
84
84
  patch = Zold::Patch.new(home.wallets, log: test_log)
85
- patch.join(first)
86
- patch.join(second)
85
+ patch.join(first) { false }
86
+ patch.join(second) { false }
87
87
  assert_equal(true, patch.save(first.path, overwrite: true))
88
88
  first.flush
89
89
  assert_equal(amount * -1, first.balance)
@@ -104,8 +104,8 @@ class TestPatch < Zold::Test
104
104
  )
105
105
  )
106
106
  patch = Zold::Patch.new(home.wallets, log: test_log)
107
- patch.join(first)
108
- patch.join(second)
107
+ patch.join(first) { false }
108
+ patch.join(second) { false }
109
109
  assert_equal(true, patch.save(first.path, overwrite: true))
110
110
  first.flush
111
111
  assert_equal(Zold::Amount.new(zld: 2.0).to_s, first.balance.to_s)
@@ -138,8 +138,8 @@ class TestPatch < Zold::Test
138
138
  ).signed(key, first.id)
139
139
  )
140
140
  patch = Zold::Patch.new(home.wallets, log: test_log)
141
- patch.join(first)
142
- patch.join(second)
141
+ patch.join(first) { false }
142
+ patch.join(second) { false }
143
143
  assert_equal(true, patch.save(first.path, overwrite: true))
144
144
  first.flush
145
145
  assert_equal(3, first.txns.count)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zold
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.22.9
4
+ version: 0.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yegor Bugayenko
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-10 00:00:00.000000000 Z
11
+ date: 2019-02-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backtrace
@@ -620,6 +620,7 @@ files:
620
620
  - lib/zold/commands/propagate.rb
621
621
  - lib/zold/commands/pull.rb
622
622
  - lib/zold/commands/push.rb
623
+ - lib/zold/commands/rebase.rb
623
624
  - lib/zold/commands/remote.rb
624
625
  - lib/zold/commands/remove.rb
625
626
  - lib/zold/commands/routines/audit.rb
@@ -690,6 +691,7 @@ files:
690
691
  - test/commands/test_propagate.rb
691
692
  - test/commands/test_pull.rb
692
693
  - test/commands/test_push.rb
694
+ - test/commands/test_rebase.rb
693
695
  - test/commands/test_remote.rb
694
696
  - test/commands/test_remove.rb
695
697
  - test/commands/test_show.rb
@@ -751,7 +753,7 @@ licenses:
751
753
  - MIT
752
754
  metadata: {}
753
755
  post_install_message: |-
754
- Thanks for installing Zold 0.22.9!
756
+ Thanks for installing Zold 0.23.0!
755
757
  Study our White Paper: https://papers.zold.io/wp.pdf
756
758
  Read our blog posts: https://blog.zold.io
757
759
  Try ZLD online wallet at: https://wts.zold.io
@@ -799,6 +801,7 @@ test_files:
799
801
  - test/commands/test_propagate.rb
800
802
  - test/commands/test_pull.rb
801
803
  - test/commands/test_push.rb
804
+ - test/commands/test_rebase.rb
802
805
  - test/commands/test_remote.rb
803
806
  - test/commands/test_remove.rb
804
807
  - test/commands/test_show.rb