Contents ======== This directory contains tools for developers working on this repository. clang-format-diff.py =================== A script to format unified git diffs according to [.clang-format](../../src/.clang-format). For instance, to format the last commit with 0 lines of context, the script should be called from the git root folder as follows. ``` git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v ``` copyright\_header.py ==================== Provides utilities for managing copyright headers of `The Bitcoin Core developers` in repository source files. It has three subcommands: ``` $ ./copyright_header.py report [verbose] $ ./copyright_header.py update $ ./copyright_header.py insert ``` Running these subcommands without arguments displays a usage string. copyright\_header.py report \ [verbose] --------------------------------------------------------- Produces a report of all copyright header notices found inside the source files of a repository. Useful to quickly visualize the state of the headers. Specifying `verbose` will list the full filenames of files of each category. copyright\_header.py update \ [verbose] --------------------------------------------------------- Updates all the copyright headers of `The Bitcoin Core developers` which were changed in a year more recent than is listed. For example: ``` // Copyright (c) - The Bitcoin Core developers ``` will be updated to: ``` // Copyright (c) - The Bitcoin Core developers ``` where `` is obtained from the `git log` history. This subcommand also handles copyright headers that have only a single year. In those cases: ``` // Copyright (c) The Bitcoin Core developers ``` will be updated to: ``` // Copyright (c) - The Bitcoin Core developers ``` where the update is appropriate. copyright\_header.py insert \ ------------------------------------ Inserts a copyright header for `The Bitcoin Core developers` at the top of the file in either Python or C++ style as determined by the file extension. If the file is a Python file and it has `#!` starting the first line, the header is inserted in the line below it. The copyright dates will be set to be `-` where `` is according to the `git log` history. If `` is equal to ``, it will be set as a single year rather than two hyphenated years. If the file already has a copyright for `The Bitcoin Core developers`, the script will exit. gen-manpages.sh =============== A small script to automatically create manpages in ../../doc/man by running the release binaries with the -help option. This requires help2man which can be found at: https://www.gnu.org/software/help2man/ With in-tree builds this tool can be run from any directory within the repostitory. To use this tool with out-of-tree builds set `BUILDDIR`. For example: ```bash BUILDDIR=$PWD/build contrib/devtools/gen-manpages.sh ``` github-merge.py =============== A small script to automate merging pull-requests securely and sign them with GPG. For example: ./github-merge.py 3077 (in any git repository) will help you merge pull request #3077 for the bitcoin/bitcoin repository. What it does: * Fetch master and the pull request. * Locally construct a merge commit. * Show the diff that merge results in. * Ask you to verify the resulting source tree (so you can do a make check or whatever). * Ask you whether to GPG sign the merge commit. * Ask you whether to push the result upstream. This means that there are no potential race conditions (where a pullreq gets updated while you're reviewing it, but before you click merge), and when using GPG signatures, that even a compromised GitHub couldn't mess with the sources. Setup --------- Configuring the github-merge tool for the bitcoin repository is done in the following way: git config githubmerge.repository bitcoin/bitcoin git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing) git config --global user.signingkey mykeyid (if you want to GPG sign) Create and verify timestamps of merge commits --------------------------------------------- To create or verify timestamps on the merge commits, install the OpenTimestamps client via `pip3 install opentimestamps-client`. Then, dowload the gpg wrapper `ots-git-gpg-wrapper.sh` and set it as git's `gpg.program`. See [the ots git integration documentation](https://github.com/opentimestamps/opentimestamps-client/blob/master/doc/git-integration.md#usage) for further details. optimize-pngs.py ================ A script to optimize png files in the bitcoin repository (requires pngcrush). security-check.py and test-security-check.py ============================================ Perform basic ELF security checks on a series of executables. symbol-check.py =============== A script to check that the (Linux) executables produced by gitian only contain allowed gcc, glibc and libstdc++ version symbols. This makes sure they are still compatible with the minimum supported Linux distribution versions. Example usage after a gitian build: find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py If only supported symbols are used the return value will be 0 and the output will be empty. If there are 'unsupported' symbols, the return value will be 1 a list like this will be printed: .../64/test_bitcoin: symbol memcpy from unsupported version GLIBC_2.14 .../64/test_bitcoin: symbol __fdelt_chk from unsupported version GLIBC_2.15 .../64/test_bitcoin: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15 .../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15 update-translations.py ====================== Run this script from the root of the repository to update all translations from transifex. It will do the following automatically: - fetch all translations - post-process them into valid and committable format - add missing translations to the build system (TODO) See doc/translation-process.md for more information. circular-dependencies.py ======================== Run this script from the root of the source tree (`src/`) to find circular dependencies in the source code. This looks only at which files include other files, treating the `.cpp` and `.h` file as one unit. Example usage: cd .../src ../contrib/devtools/circular-dependencies.py {*,*/*,*/*/*}.{h,cpp}