test: use assert_greater_than util #30019

pull kevkevinpal wants to merge 3 commits into bitcoin:master from kevkevinpal:testFrameworkLessthan changing 17 files +47 −24
  1. kevkevinpal commented at 1:56 am on May 2, 2024: contributor

    In the functional tests there are lots of cases where we assert < which we now swap with assert_greater_than to be more readable

    This is motivated/uses logic from this PR which was closed #28528 This partially helps #23119

    I’ve broken it up to just assert_greater_than to keep the PR smaller as suggested in #28528 (comment)

    Similar change for assert_not_equal

    I did not use the scripted-diff for the last commit since it either included a <= or there was already a () which did not match the pattern of the rest

    if you run this command on this branch it should come back empty git grep -nri -e "assert .*< " --and --not -e "assert .*!=" -- ./test/functional

  2. DrahtBot commented at 1:56 am on May 2, 2024: contributor

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Code Coverage

    For detailed information about the code coverage, see the test coverage report.

    Reviews

    See the guideline for information on the review process.

    Type Reviewers
    Concept ACK edilmedeiros

    If your review is incorrectly listed, please react with 👎 to this comment and the bot will ignore it on the next update.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #29680 (wallet: fix unrelated parent conflict doesn’t cause child tx to be marked as conflict by Eunovo)
    • #29500 (test: create assert_not_equal util by kevkevinpal)
    • #28307 (rpc, wallet: fix incorrect segwit redeem script size limit by furszy)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  3. DrahtBot added the label Tests on May 2, 2024
  4. in test/functional/rpc_blockchain.py:343 in c51464ca39 outdated
    339@@ -339,7 +340,7 @@ def _test_gettxoutsetinfo(self):
    340         assert_equal(res['bestblock'], node.getblockhash(HEIGHT))
    341         size = res['disk_size']
    342         assert size > 6400
    343-        assert size < 64000
    344+        assert_less_than(size, 64000)
    


    paplorinc commented at 10:22 am on May 2, 2024:
    This looks worse now
  5. in test/functional/test_framework/util.py:81 in c51464ca39 outdated
    77@@ -78,6 +78,10 @@ def assert_greater_than(thing1, thing2):
    78     if thing1 <= thing2:
    79         raise AssertionError("%s <= %s" % (str(thing1), str(thing2)))
    80 
    81+def assert_less_than(*args):
    


    paplorinc commented at 10:24 am on May 2, 2024:
    why so general, the previous one was a simple operator, why obfuscate it as such?

    kevkevinpal commented at 10:07 pm on May 3, 2024:
    that is fair I initially did it like this because there was one scenario where we used two < operators but I now switched to using assert_greater_than and now broke that statement up to two statements
  6. paplorinc commented at 10:25 am on May 2, 2024: contributor
    I’m not sure I understand what’s wrong with the original operators, this seems less readable to me
  7. glozow commented at 10:34 am on May 2, 2024: member
    Why not just use assert_greater_than and assert_greater_than_or_equal?
  8. test: use assert_greater_than util and add to where imports are needed
    In the functional tests there are lots of cases where we assert < which
    this util will replace, we also are adding the imports and the
    following commit will add the assertion
    e231cc76c6
  9. scripted-diff: swapped where < was used and used assert_greater_than
    -BEGIN VERIFY SCRIPT-
    git grep -l -E "assert .*<{1} [\=\<]{0}" -- ':(exclude)*script.py' ':(exclude)*rpc_createmultisig.py' ':(exclude)*feature_taproot.py' ':(exclude)*wallet_create_tx.py' ':(exclude)*p2p.py' ./test/functional | xargs sed -i.bak -e "/assert .*< / s/assert \(.*\) <\([^#]*\)/assert\2 < \1/"
    git grep -l -E "assert .*<{1} [\=\<]{0}" -- ':(exclude)*script.py' ':(exclude)*rpc_createmultisig.py' ':(exclude)*feature_taproot.py' ':(exclude)*wallet_create_tx.py' ':(exclude)*p2p.py' ./test/functional | xargs sed -i.bak -e "/assert .*< / s/assert \(.*\) <\([^#]*\)/assert_greater_than(\1,\2)/g" -e "s/assert_greater_than(\(.*\)\(#.*\)/assert_greater_than(\1 \2/g" -e "/assert_greater_than(/ s/\ \ ,/,/g"
    -END VERIFY SCRIPT-
    04d8f07c43
  10. test: using assert_greater_than for edge cases
    For the cases which the scripted diff did not make sense these were
    manually updated, like if we had multiple operators on one line or if it
    was wrapped in () already
    fe075160f0
  11. kevkevinpal force-pushed on May 3, 2024
  12. kevkevinpal renamed this:
    test: create assert_less_than util
    test: use assert_greater_than util
    on May 3, 2024
  13. kevkevinpal commented at 10:09 pm on May 3, 2024: contributor

    pushed to fe07516

    we now use assert_greater_than instead of creating a new util

    04d8f07 contains a scripted-diff which looks for assert.*< and then swaps the two values and replaces the assert with assert_greater_than

  14. in test/functional/wallet_create_tx.py:50 in fe075160f0
    45@@ -45,7 +46,8 @@ def test_anti_fee_sniping(self):
    46         self.generate(self.nodes[0], 1)
    47         txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), 1)
    48         tx = self.nodes[0].gettransaction(txid=txid, verbose=True)['decoded']
    49-        assert 0 < tx['locktime'] <= 201
    50+        assert_greater_than(tx['locktime'], 0)
    51+        assert tx['locktime'] <= 201
    


    paplorinc commented at 4:27 pm on May 4, 2024:
    0        assert_greater_than(202, tx['locktime'])
    
  15. in test/functional/wallet_conflicts.py:109 in fe075160f0
    104@@ -104,7 +105,7 @@ def test_block_conflicts(self):
    105 
    106         self.log.info("Verify, after the reorg, that Tx_A was accepted, and tx_AB and its Child_Tx are conflicting now")
    107         # Tx A was accepted, Tx AB was not.
    108-        assert conflicted_AB_tx["confirmations"] < 0
    109+        assert_greater_than(0, conflicted_AB_tx["confirmations"])
    110         assert conflicted_A_tx["confirmations"] > 0
    


    paplorinc commented at 4:31 pm on May 4, 2024:

    this looks like an actual assert_greater_than

    0        assert_greater_than(conflicted_A_tx["confirmations"], 0)
    
  16. in test/functional/test_framework/p2p.py:749 in fe075160f0
    744@@ -744,7 +745,8 @@ def listen(cls, p2p, callback, port=None, addr=None, idx=1):
    745         for connections, call `callback`."""
    746 
    747         if port is None:
    748-            assert 0 < idx <= MAX_NODES
    749+            assert_greater_than(idx, 0)
    750+            assert idx <= MAX_NODES
    


    paplorinc commented at 4:32 pm on May 4, 2024:
    0            assert_greater_than(MAX_NODES + 1, idx)
    

    edilmedeiros commented at 9:11 pm on May 7, 2024:
    Why MAX_NODES + 1?

    paplorinc commented at 8:22 am on May 8, 2024:
    idx can equal MAX_NODES according to the code - alternatively could use assert_greater_than_or_equal, if that’s more readable
  17. in test/functional/wallet_abandonconflict.py:57 in fe075160f0
    53@@ -53,7 +54,7 @@ def run_test(self):
    54         assert_raises_rpc_error(-5, 'Transaction not eligible for abandonment', lambda: alice.abandontransaction(txid=txA))
    55 
    56         newbalance = alice.getbalance()
    57-        assert balance - newbalance < Decimal("0.001")  #no more than fees lost
    58+        assert_greater_than(Decimal("0.001"), balance - newbalance) #no more than fees lost
    



    edilmedeiros commented at 9:37 pm on May 7, 2024:

    This is needed as this specific test is full of Decimal objects. This is what you get if you take it out.

     0 test/functional/wallet_abandonconflict.py
     12024-05-07T21:36:52.495000Z TestFramework (INFO): PRNG seed is: 7791852828985173276
     22024-05-07T21:36:52.495000Z TestFramework (INFO): Initializing test directory /var/folders/pk/trlzyy614z11wn_y1t8vhsz80000gn/T/bitcoin_func_test_8oozog30
     32024-05-07T21:36:55.004000Z TestFramework (ERROR): Unexpected exception caught during testing
     4Traceback (most recent call last):
     5  File "/Users/jose.edil/2-development/bitcoin/bitcoin-core/test/functional/test_framework/test_framework.py", line 132, in main
     6    self.run_test()
     7  File "/Users/jose.edil/2-development/bitcoin/bitcoin-core/test/functional/wallet_abandonconflict.py", line 57, in run_test
     8    assert_greater_than("0.001", balance - newbalance) #no more than fees lost
     9    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    10  File "/Users/jose.edil/2-development/bitcoin/bitcoin-core/test/functional/test_framework/util.py", line 78, in assert_greater_than
    11    if thing1 <= thing2:
    12       ^^^^^^^^^^^^^^^^
    13TypeError: '<=' not supported between instances of 'str' and 'decimal.Decimal'
    142024-05-07T21:36:55.057000Z TestFramework (INFO): Stopping nodes
    152024-05-07T21:36:55.165000Z TestFramework (WARNING): Not cleaning up dir /var/folders/pk/trlzyy614z11wn_y1t8vhsz80000gn/T/bitcoin_func_test_8oozog30
    162024-05-07T21:36:55.165000Z TestFramework (ERROR): Test failed. Test logging available at /var/folders/pk/trlzyy614z11wn_y1t8vhsz80000gn/T/bitcoin_func_test_8oozog30/test_framework.log
    172024-05-07T21:36:55.165000Z TestFramework (ERROR):
    182024-05-07T21:36:55.165000Z TestFramework (ERROR): Hint: Call /Users/jose.edil/2-development/bitcoin/bitcoin-core/test/functional/combine_logs.py '/var/folders/pk/trlzyy614z11wn_y1t8vhsz80000gn/T/bitcoin_func_test_8oozog30' to consolidate all logs
    192024-05-07T21:36:55.165000Z TestFramework (ERROR):
    202024-05-07T21:36:55.165000Z TestFramework (ERROR): If this failure happened unexpectedly or intermittently, please file a bug and provide a link or upload of the combined log.
    212024-05-07T21:36:55.165000Z TestFramework (ERROR): https://github.com/bitcoin/bitcoin/issues
    222024-05-07T21:36:55.166000Z TestFramework (ERROR):
    

    edilmedeiros commented at 9:39 pm on May 7, 2024:

    I see you are a newcomer too. When reviewing code, better to open the files in the text editor and check for a broader context than what the github interface will present.

    In my case, I use emacs with ediff, but all major IDEs will have a nice diff interface to inspect the PRs.


    paplorinc commented at 11:45 am on May 8, 2024:

    I see you are a newcomer too.

    this isn’t necessary…

    0assert_greater_than("0.001", balance - newbalance)
    

    I wasn’t suggesting comparing it to a string, of course, but to a decimal, as in the example I’ve provided, i.e.:

    0assert_greater_than(0.001, balance - newbalance)
    

    This seems to be working for me, is it failing for you?


    edilmedeiros commented at 1:03 pm on May 8, 2024:

    Oh, I see.

    Still, better to leave to preserve potential bugs since this is refactoring.

  18. in test/functional/rpc_blockchain.py:341 in fe075160f0
    338@@ -339,7 +339,7 @@ def _test_gettxoutsetinfo(self):
    339         assert_equal(res['bestblock'], node.getblockhash(HEIGHT))
    340         size = res['disk_size']
    341         assert size > 6400
    


    paplorinc commented at 4:36 pm on May 4, 2024:
    0        assert_greater_than(size, 6400)
    
  19. in test/functional/test_framework/script.py:816 in fe075160f0
    813@@ -813,7 +814,7 @@ def BIP341_sha_outputs(txTo):
    814 
    815 def TaprootSignatureMsg(txTo, spent_utxos, hash_type, input_index = 0, scriptpath = False, script = CScript(), codeseparator_pos = -1, annex = None, leaf_ver = LEAF_VERSION_TAPSCRIPT):
    816     assert (len(txTo.vin) == len(spent_utxos))
    


    paplorinc commented at 4:38 pm on May 4, 2024:
    0    assert_equal(len(txTo.vin), len(spent_utxos))
    
  20. paplorinc changes_requested
  21. paplorinc commented at 4:39 pm on May 4, 2024: contributor
    The errors will improve this way, even though I wouldn’t call the code more readable. And to not make it less readable, I suggested a few other places where these changes could be applied.
  22. in test/functional/rpc_createmultisig.py:151 in fe075160f0
    143@@ -143,7 +144,8 @@ def checkbalances(self):
    144         balw = self.wallet.get_balance()
    145 
    146         height = node0.getblockchaininfo()["blocks"]
    147-        assert 150 < height < 350
    148+        assert_greater_than(350, height)
    149+        assert_greater_than(height, 150)
    150         total = 149 * 50 + (height - 149 - 100) * 25
    151         assert bal1 == 0
    152         assert bal2 == self.moved
    


    edilmedeiros commented at 9:09 pm on May 7, 2024:
    Change these to assert_equal is an easy gain here.
  23. in test/functional/feature_rbf.py:1 in fe075160f0


    edilmedeiros commented at 9:51 pm on May 7, 2024:
     0diff --git a/test/functional/feature_rbf.py b/test/functional/feature_rbf.py
     1index cf48826e6a..415e4f1b95 100755
     2--- a/test/functional/feature_rbf.py
     3+++ b/test/functional/feature_rbf.py
     4@@ -15,6 +15,7 @@ from test_framework.test_framework import BitcoinTestFramework
     5 from test_framework.util import (
     6     assert_equal,
     7     assert_greater_than,
     8+    assert_greater_than_or_equal,
     9     assert_raises_rpc_error,
    10 )
    11 from test_framework.wallet import MiniWallet
    12@@ -446,9 +447,9 @@ class ReplaceByFeeTest(BitcoinTestFramework):
    13             num_txs_invalidated = len(root_utxos) + (num_tx_graphs * txs_per_graph)
    14
    15             if failure_expected:
    16-                assert num_txs_invalidated > MAX_REPLACEMENT_LIMIT
    17+                assert_greater_than(num_txs_invalidated, MAX_REPLACEMENT_LIMIT)
    18             else:
    19-                assert num_txs_invalidated <= MAX_REPLACEMENT_LIMIT
    20+                assert_greater_than_or_equal(MAX_REPLACEMENT_LIMIT, num_txs_invalidated)
    21
    22             # Now attempt to submit a tx that double-spends all the root tx inputs, which
    23             # would invalidate `num_txs_invalidated` transactions.
    

    edilmedeiros commented at 10:04 pm on May 7, 2024:
      0index ff67207c4e..2a4cc9dfba 100755
      1--- a/test/functional/p2p_segwit.py
      2+++ b/test/functional/p2p_segwit.py
      3@@ -85,6 +85,7 @@ from test_framework.test_framework import BitcoinTestFramework
      4 from test_framework.util import (
      5     assert_equal,
      6     assert_greater_than,
      7+    assert_greater_than_or_equal,
      8     softfork_active,
      9     assert_raises_rpc_error,
     10 )
     11@@ -376,14 +377,14 @@ class SegWitTest(BitcoinTestFramework):
     12         self.test_node.send_message(msg_headers())
     13
     14         self.test_node.announce_block_and_wait_for_getdata(block1, use_header=False)
     15-        assert self.test_node.last_message["getdata"].inv[0].type == blocktype
     16+        assert_equal(self.test_node.last_message["getdata"].inv[0].type, blocktype)
     17         test_witness_block(self.nodes[0], self.test_node, block1, True)
     18
     19         block2 = self.build_next_block()
     20         block2.solve()
     21
     22         self.test_node.announce_block_and_wait_for_getdata(block2, use_header=True)
     23-        assert self.test_node.last_message["getdata"].inv[0].type == blocktype
     24+        assert_equal(self.test_node.last_message["getdata"].inv[0].type, blocktype)
     25         test_witness_block(self.nodes[0], self.test_node, block2, True)
     26
     27         # Check that we can getdata for witness blocks or regular blocks,
     28@@ -412,8 +413,8 @@ class SegWitTest(BitcoinTestFramework):
     29             block = self.build_next_block()
     30             self.update_witness_block_with_transactions(block, [])
     31             # This gives us a witness commitment.
     32-            assert len(block.vtx[0].wit.vtxinwit) == 1
     33-            assert len(block.vtx[0].wit.vtxinwit[0].scriptWitness.stack) == 1
     34+            assert_equal(len(block.vtx[0].wit.vtxinwit), 1)
     35+            assert_equal(len(block.vtx[0].wit.vtxinwit[0].scriptWitness.stack), 1)
     36             test_witness_block(self.nodes[0], self.test_node, block, accepted=True)
     37             # Now try to retrieve it...
     38             rpc_block = self.nodes[0].getblock(block.hash, False)
     39@@ -539,7 +540,7 @@ class SegWitTest(BitcoinTestFramework):
     40         # Verify that if a peer doesn't set nServices to include NODE_WITNESS,
     41         # the getdata is just for the non-witness portion.
     42         self.old_node.announce_tx_and_wait_for_getdata(tx)
     43-        assert self.old_node.last_message["getdata"].inv[0].type == MSG_TX
     44+        assert_equal(self.old_node.last_message["getdata"].inv[0].type, MSG_TX)
     45
     46         # Since we haven't delivered the tx yet, inv'ing the same tx from
     47         # a witness transaction ought not result in a getdata.
     48@@ -807,7 +808,7 @@ class SegWitTest(BitcoinTestFramework):
     49         block_3.vtx[0].vout[-1].nValue += 1
     50         block_3.vtx[0].rehash()
     51         block_3.hashMerkleRoot = block_3.calc_merkle_root()
     52-        assert len(block_3.vtx[0].vout) == 4  # 3 OP_returns
     53+        assert_equal(len(block_3.vtx[0].vout), 4)  # 3 OP_returns
     54         block_3.solve()
     55         test_witness_block(self.nodes[0], self.test_node, block_3, accepted=True)
     56
     57@@ -838,7 +839,7 @@ class SegWitTest(BitcoinTestFramework):
     58         block.solve()
     59
     60         block.vtx[0].wit.vtxinwit[0].scriptWitness.stack.append(b'a' * 5000000)
     61-        assert block.get_weight() > MAX_BLOCK_WEIGHT
     62+        assert_greater_than(block.get_weight(), MAX_BLOCK_WEIGHT)
     63
     64         # We can't send over the p2p network, because this is too big to relay
     65         # TODO: repeat this test with a block that can be relayed
     66@@ -850,7 +851,7 @@ class SegWitTest(BitcoinTestFramework):
     67         assert_greater_than(MAX_BLOCK_WEIGHT, block.get_weight())
     68         assert_equal(None, self.nodes[0].submitblock(block.serialize().hex()))
     69
     70-        assert self.nodes[0].getbestblockhash() == block.hash
     71+        assert_equal(self.nodes[0].getbestblockhash(), block.hash)
     72
     73         # Now make sure that malleating the witness reserved value doesn't
     74         # result in a block permanently marked bad.
     75@@ -875,7 +876,7 @@ class SegWitTest(BitcoinTestFramework):
     76         # Test that witness-bearing blocks are limited at ceil(base + wit/4) <= 1MB.
     77         block = self.build_next_block()
     78
     79-        assert len(self.utxo) > 0
     80+        assert_greater_than(len(self.utxo), 0)
     81
     82         # Create a P2WSH transaction.
     83         # The witness script will be a bunch of OP_2DROP's, followed by OP_TRUE.
     84@@ -896,7 +897,7 @@ class SegWitTest(BitcoinTestFramework):
     85         for _ in range(NUM_OUTPUTS):
     86             parent_tx.vout.append(CTxOut(child_value, script_pubkey))
     87         parent_tx.vout[0].nValue -= 50000
     88-        assert parent_tx.vout[0].nValue > 0
     89+        assert_greater_than(parent_tx.vout[0].nValue, 0)
     90         parent_tx.rehash()
     91
     92         child_tx = CTransaction()
     93@@ -924,7 +925,7 @@ class SegWitTest(BitcoinTestFramework):
     94         assert_equal(block.get_weight(), MAX_BLOCK_WEIGHT + 1)
     95         # Make sure that our test case would exceed the old max-network-message
     96         # limit
     97-        assert len(block.serialize()) > 2 * 1024 * 1024
     98+        assert_greater_than(len(block.serialize()), 2 * 1024 * 1024)
     99
    100         test_witness_block(self.nodes[0], self.test_node, block, accepted=False, reason='bad-blk-we
    101ight')
    102
    103@@ -934,7 +935,7 @@ class SegWitTest(BitcoinTestFramework):
    104         block.vtx[0].vout.pop()
    105         add_witness_commitment(block)
    106         block.solve()
    107-        assert block.get_weight() == MAX_BLOCK_WEIGHT
    108+        assert_equal(block.get_weight(), MAX_BLOCK_WEIGHT)
    109
    110         test_witness_block(self.nodes[0], self.test_node, block, accepted=True)
    111
    112@@ -1098,7 +1099,7 @@ class SegWitTest(BitcoinTestFramework):
    113
    114         # This script is 19 max pushes (9937 bytes), then 64 more opcode-bytes.
    115         long_witness_script = CScript([b'a' * MAX_SCRIPT_ELEMENT_SIZE] * 19 + [OP_DROP] * 63 + [OP_
    116TRUE])
    117-        assert len(long_witness_script) == MAX_WITNESS_SCRIPT_LENGTH + 1
    118+        assert_equal(len(long_witness_script), MAX_WITNESS_SCRIPT_LENGTH + 1)
    119         long_script_pubkey = script_to_p2wsh_script(long_witness_script)
    120
    121         block = self.build_next_block()
    122@@ -1122,7 +1123,7 @@ class SegWitTest(BitcoinTestFramework):
    123
    124         # Try again with one less byte in the witness script
    125         witness_script = CScript([b'a' * MAX_SCRIPT_ELEMENT_SIZE] * 19 + [OP_DROP] * 62 + [OP_TRUE]
    126)
    127-        assert len(witness_script) == MAX_WITNESS_SCRIPT_LENGTH
    128+        assert_equal(len(witness_script), MAX_WITNESS_SCRIPT_LENGTH)
    129         script_pubkey = script_to_p2wsh_script(witness_script)
    130
    131         tx.vout[0] = CTxOut(tx.vout[0].nValue, script_pubkey)
    132@@ -1151,7 +1152,7 @@ class SegWitTest(BitcoinTestFramework):
    133         for _ in range(10):
    134             tx.vout.append(CTxOut(int(value / 10), script_pubkey))
    135         tx.vout[0].nValue -= 1000
    136-        assert tx.vout[0].nValue >= 0
    137+        assert_greater_than_or_equal(tx.vout[0].nValue, 0)
    138
    139         block = self.build_next_block()
    140         self.update_witness_block_with_transactions(block, [tx])
    141@@ -1358,7 +1359,7 @@ class SegWitTest(BitcoinTestFramework):
    142             temp_utxo.append(UTXO(tx.sha256, 0, tx.vout[0].nValue))
    143
    144         self.generate(self.nodes[0], 1)  # Mine all the transactions
    145-        assert len(self.nodes[0].getrawmempool()) == 0
    146+        assert_equal(len(self.nodes[0].getrawmempool()), 0)
    147
    148         # Finally, verify that version 0 -> version 2 transactions
    149         # are standard
    150@@ -1622,7 +1623,7 @@ class SegWitTest(BitcoinTestFramework):
    151             # Create a slight bias for producing more utxos
    152             num_outputs = random.randint(1, 11)
    153             random.shuffle(temp_utxos)
    154-            assert len(temp_utxos) > num_inputs
    155+            assert_greater_than(len(temp_utxos), num_inputs)
    156             tx = CTransaction()
    157             total_value = 0
    158             for i in range(num_inputs):
    
  24. edilmedeiros changes_requested
  25. edilmedeiros commented at 10:10 pm on May 7, 2024: contributor

    Concept ACK.

    I have run all the tests that have changed, it seems ok.

    Thanks for the contribution. But, since you are already refactoring this out, I believe it would be way better to not leave any more assert behind that could be changed to assert_equal or assert_greater_than. Otherwise, looks like we are not improving the code base as there will be more than one style of asserts in some files.

    See the diffs in the comments to find some suggestions.

    To find others, grep each file for 'assert ' (with the space).

  26. edilmedeiros commented at 10:37 pm on May 7, 2024: contributor
    Another thing: I have the impression that the individual commits do not work individually. If so, think about squashing them all together. I don’t think this will break the bank for other reviewers.
  27. edilmedeiros commented at 10:42 pm on May 7, 2024: contributor
    All right, better than my review would be to convert this to a scripted diff as you are doing in #29500.
  28. DrahtBot commented at 2:19 am on June 5, 2024: contributor

    🐙 This pull request conflicts with the target branch and needs rebase.

  29. DrahtBot added the label Needs rebase on Jun 5, 2024

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-06-29 07:13 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me