This python script applies basic transformations to the Bitcoin Core codebase:
- replaces
bitcoin
withunit-e
(in various variations) - replaces names of units like
COIN → UNIT
andCENT → EEES
- renames files
- changes the name of the client from
Satoshi
toFeuerland
- fixes tests accordingly
- etc.
The idea is to apply this script every time we rebase against/merge with the Bitcoin Core repository. This way we can have things renamed nicely and save ourselves a lot of merge headaches.
We work on our fork of bitcoin. Whenever we want to merge with bitcoin upstream we fork the bitcoin branch we want to merge with again and apply the clonemachine one it. Then we merge with that adjusted fork.
# do not blindly copy n paste, this outlines the procedure
git remote add bitcoin git@github.com:bitcoin/bitcoin.git
git fetch bitcoin
git checkout -b bitcoin-integration bitcoin/master
<path>/<to>/<clonemachine>/clonemachine.py fork --unit-e-branch=master
git merge master
Clonemachine has a list of appropriated files, i.e. files which have changed so
much in unit-e that it doesn't make sense to try to merge them. They are replaced
by the version from the unit-e repository. You need to pass the branch where the
unit-e code is with the --unit-e-branch
option.
You can see the changes of all appropriated files since the last merge by
running clonemachine.py show-upstream-diff
. You need to specify the
--bitcoin-branch
option (in the scenario from above it would be
--bitcoin-branch=bitcoin/master
).
The transformations are carried out in a safe way, i.e. certain replacements
must not happen (so there is a blacklist to prevent that), as for example
the mac build downloads dependencies from bitcoincore.org
(the blacklist
item would be exactly that bitcoincore.org
, i.e. the script does not replace
some occurrences if they occur in a certain context).
Also some replacements only happen if they are not preceded or followed by
a certain regular expression (contrived example: to replace unt
safely but
not grunt
).
It does not apply certain patches which alter the behavior of the coin. All you get from applying this script is a generic altcoin which works exactly like bitcoin but is named unit-e. It helps, but it does not do everything (and it is not intended to).
Clonemachine requires Python 3.6 or later.
In order to run clonemachine and its tests you need to install its dependencies.
You can do so by running pip3 install -r requirements.txt
in the root dir of
the repository.
Clonemachine comes with a couple of unit, integration, and regression tests.
They can be run through make
. See the Makefile
for some more
details.
All but the unit tests work on checkouts of unit-e
and bitcoin
in a so it
might take a little bit to set up the initial clones. Once they are there, the
tests reuse the existing checkouts. Use make clean
to delete them and get a
clean slate again. The temporary data is stored in a directory tmp
in the
functional-tests
directory.
There is a regression test which compares the changes clonemachine creates with
a known good reference. This reference is stored as a diff file in
functional--tests/test_data
. To create or
update the reference data there is the script
create_reference_data.py
.
If the regression fails, it writes a file diff.diff
in the tmp
directory.
There you can see what changes are different from what is expected. It's a diff
of diffs so brace yourself with some abstraction when reading it ;-).
If substitutions are changed in clonemachine so that it substitutes differently
than at previous runs, there will be merge conflicts, if the code in the
unit-e
code base is not adapted accordingly. Clonemachine can be used for that
as well. See the --substitute-unit-e-naming
option for an example how to do it
and test_unit_e_substitutions.py
for how to test it.
When changing the rules of how clonemachine does substitutions you can use the following scheme to adapt the unit-e codebase and clonemachine in sync so that they yield the same results:
- Implement a
--substitute-unit-e-*
option to do the substitutions in the unit-e code base. Use the existing ones as an example. - Check that you get the desired substitutions by comparing the diff on unit-e
- Adapt the test in
test_unit_e_substitutions.py
to take the last diff as a base and compare with a newly created one after applyingclonemachine.py --substitute-unit-e-*
. - Create a new reference diff by running
./create_reference_data.py
in thefunctional-tests
directory. - Implement the corresponding changes in clonemachine in
fork.py
. - Run
pytest test_unit_e_substitutions.py
to check that the changes have the same result. If they don't you can find the diff infunctional-tests/tmp/diff.diff
. Iterate until the diff is empty and the test passes. - Submit pull request for
unit-e
after applyingclonemachine.py --substitute-unit-e-*
and for clonemachine commit the changes there.
See CONTRIBUTING.md for more information on how to contribute to unit-e-clonemachine.
The Unit-e team is committed to fostering a welcoming and harassment-free environment. All participants are expected to adhere to our code of conduct.
unit-e-clonemachine is released under the terms of the MIT license. See COPYING for more information or see https://opensource.org/licenses/MIT.