Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F13115495
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
40 KB
Subscribers
None
View Options
diff --git a/.arclint b/.arclint
index 8354387a5f..8ab842816b 100644
--- a/.arclint
+++ b/.arclint
@@ -1,147 +1,154 @@
{
"linters": {
"generated": {
"type": "generated"
},
"clang-format": {
"type": "clang-format",
"version": ">=7.0",
"bin": ["clang-format-7", "clang-format"],
"include": "(^src/.*\\.(h|c|cpp|mm)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"autopep8": {
"type": "autopep8",
"version": ">=1.3.4",
"include": "(\\.py$)"
},
"flake8": {
"type": "flake8",
"include": "(\\.py$)",
"flags": [
"--select=E112,E113,E115,E116,E125,E131,E133,E223,E224,E242,E266,E271,E272,E273,E274,E275,E304,E306,E401,E402,E502,E701,E702,E703,E714,E721,E741,E742,E743,E901,E902,F401,F402,F403,F404,F405,F406,F407,F601,F602,F621,F622,F631,F701,F702,F703,F704,F705,F706,F707,F811,F812,F821,F822,F823,F831,F841,W292,W293,W601,W602,W603,W604,W605,W606"
]
},
"lint-format-strings": {
"type": "lint-format-strings",
"include": "(^src/.*\\.(h|c|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"check-doc": {
"type": "check-doc",
"include": "(^src/.*\\.(h|c|cpp)$)"
},
"lint-tests": {
"type": "lint-tests",
"include": "(^src/(rpc/|wallet/)?test/.*\\.(cpp)$)"
},
"lint-python-format": {
"type": "lint-python-format",
"include": "(\\.py$)",
"exclude": [
"(^test/lint/lint-python-format\\.py$)"
]
},
"phpcs": {
"type": "phpcs",
"include": "(\\.php$)",
"exclude": [
"(^arcanist/__phutil_library_.+\\.php$)"
],
"phpcs.standard": "arcanist/phpcs.xml"
},
"lint-locale-dependence": {
"type": "lint-locale-dependence",
"include": "(^src/.*\\.(h|cpp)$)",
"exclude": [
"(^src/(crypto/ctaes/|leveldb/|secp256k1/|seeder/|tinyformat.h|univalue/))"
]
},
"lint-cheader": {
"type": "lint-cheader",
"include": "(^src/.*\\.(h|cpp)$)",
"exclude": [
"(^src/(crypto/ctaes|secp256k1|univalue|leveldb)/)"
]
},
"spelling": {
"type": "spelling",
"exclude": [
"(^build-aux/m4/)",
"(^depends/)",
"(^doc/release-notes/)",
"(^src/(qt/locale|secp256k1|univalue|leveldb)/)",
"(^test/lint/dictionary/)"
],
"spelling.dictionaries": [
"test/lint/dictionary/english.json"
]
},
"lint-assert-with-side-effects": {
"type": "lint-assert-with-side-effects",
"include": "(^src/.*\\.(h|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"lint-include-quotes": {
"type": "lint-include-quotes",
"include": "(^src/.*\\.(h|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"lint-include-guard": {
"type": "lint-include-guard",
"include": "(^src/.*\\.h$)",
"exclude": [
"(^src/(crypto/ctaes|secp256k1|univalue|leveldb)/)",
"(^src/tinyformat.h$)"
]
},
"lint-include-source": {
"type": "lint-include-source",
"include": "(^src/.*\\.(h|c|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"lint-stdint": {
"type": "lint-stdint",
"include": "(^src/.*\\.(h|c|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"lint-source-filename": {
"type": "lint-source-filename",
"include": "(^src/.*\\.(h|c|cpp)$)",
"exclude": [
"(^src/(secp256k1|univalue|leveldb)/)"
]
},
"lint-boost-dependencies": {
"type": "lint-boost-dependencies",
"include": "(^src/.*\\.(h|cpp)$)"
},
"check-rpc-mappings": {
"type": "check-rpc-mappings",
"include": "(^src/(rpc/|wallet/rpc).*\\.cpp$)"
},
"lint-python-encoding": {
"type": "lint-python-encoding",
"include": "(\\.py$)"
},
"lint-python-shebang": {
"type": "lint-python-shebang",
"include": "(\\.py$)",
"exclude": [
"(__init__\\.py$)"
]
+ },
+ "shellcheck": {
+ "type": "shellcheck",
+ "include": "(\\.sh$)",
+ "exclude": [
+ "(^src/(secp256k1|univalue)/)"
+ ]
}
}
}
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index bb47de8f72..3273ad2d84 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,216 +1,216 @@
Contributing to Bitcoin ABC
===========================
The Bitcoin ABC project welcomes contributors!
This guide is intended to help developers contribute effectively to Bitcoin ABC.
Communicating with Developers
-----------------------------
To get in contact with ABC developers, we monitor a telegram supergroup. The
intent of this group is specifically to facilitate development of Bitcoin-ABC,
and to welcome people who wish to participate.
https://t.me/joinchat/HCYr50mxRWjA2uLqii-psw
Acceptable use of this supergroup includes the following:
* Introducing yourself to other ABC developers.
* Getting help with your development environment.
* Discussing how to complete a patch.
It is not for:
* Market discussion
* Non-constructive criticism
Bitcoin ABC Development Philosophy
----------------------------------
Bitcoin ABC aims for fast iteration and continuous integration.
This means that there should be quick turnaround for patches to be proposed,
reviewed, and committed. Changes should not sit in a queue for long.
Here are some tips to help keep the development working as intended. These
are guidelines for the normal and expected development process. Developers
can use their judgement to deviate from these guidelines when they have a
good reason to do so.
- Keep each change small and self-contained.
- Reach out for a 1-on-1 review so things move quickly.
- Land the Diff quickly after it is accepted.
- Don't amend changes after the Diff accepted, new Diff for another fix.
- Review Diffs from other developers as quickly as possible.
- Large changes should be broken into logical chunks that are easy to review,
and keep the code in a functional state.
- Do not mix moving stuff around with changing stuff. Do changes with renames
on their own.
- Sometimes you want to replace one subsystem by another implementation,
in which case it is not possible to do things incrementally. In such cases,
you keep both implementations in the codebase for a while, as described
[here](https://www.gamasutra.com/view/news/128325/Opinion_Parallel_Implementations.php)
- There are no "development" branches, all Diffs apply to the master
branch, and should always improve it (no regressions).
- Don't break the build, it is important to keep master green as much as possible.
If a Diff is landed, and breaks the build, fix it quickly. If it cannot be fixed
quickly, it should be reverted, and re-applied later when it no longer breaks the build.
- As soon as you see a bug, you fix it. Do not continue on. Fixing the bug becomes the
top priority, more important than completing other tasks.
- Automate as much as possible, and spend time on things only humans can do.
Here are some handy links for development practices aligned with Bitcoin ABC:
- [Developer Notes](doc/developer-notes.md)
- [Statement of Bitcoin ABC Values and Visions](https://www.yours.org/content/bitcoin-abc---our-values-and-vision-a282afaade7c)
- [How to Do Code Reviews Like a Human - Part 1](https://mtlynch.io/human-code-reviews-1/)
- [How to Do Code Reviews Like a Human - Part 2](https://mtlynch.io/human-code-reviews-2/)
- [Large Diffs Are Hurting Your Ability To Ship](https://medium.com/@kurtisnusbaum/large-diffs-are-hurting-your-ability-to-ship-e0b2b41e8acf)
- [Stacked Diffs: Keeping Phabricator Diffs Small](https://medium.com/@kurtisnusbaum/stacked-diffs-keeping-phabricator-diffs-small-d9964f4dcfa6)
- [Parallel Implementations](https://www.gamasutra.com/view/news/128325/Opinion_Parallel_Implementations.php)
- [The Pragmatic Programmer: From Journeyman to Master](https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X)
- [Advantages of monolithic version control](https://danluu.com/monorepo/)
- [The importance of fixing bugs immediately](https://youtu.be/E2MIpi8pIvY?t=16m0s)
- [Slow Deployment Causes Meetings](https://www.facebook.com/notes/kent-beck/slow-deployment-causes-meetings/1055427371156793/)
- [Good Work, Great Work, and Right Work](https://forum.dlang.org/post/q7u6g1$94p$1@digitalmars.com)
Getting set up with the Bitcoin ABC Repository
----------------------------------------------
1. Create an account at https://reviews.bitcoinabc.org/
2. Install Git and Arcanist on your machine
Git documentation can be found at: https://git-scm.com/
Arcanist documentation can be found at:
https://secure.phabricator.com/book/phabricator/article/arcanist_quick_start/
And: https://secure.phabricator.com/book/phabricator/article/arcanist/
To install these packages on Debian or Ubuntu, type: `sudo apt-get install git arcanist`
3. If you do not already have an SSH key set up, follow these steps:
Type: `ssh-keygen -t rsa -b 4096 -C "your_email@example.com"`
Enter a file in which to save the key (/home/*username*/.ssh/id_rsa): [Press enter]
4. Upload your SSH public key to reviews.bitcoinabc.org
- Go to: `https://reviews.bitcoinabc.org/settings/user/*username*/page/ssh/`
- Under "SSH Key Actions", Select "Upload Public Key"
Paste contents from: `/home/*username*/.ssh/id_rsa.pub`
5. Clone the repository and install Arcanist certificate:
```
git clone ssh://vcs@reviews.bitcoinabc.org:2221/source/bitcoin-abc.git
cd bitcoin-abc
arc install-certificate
```
Note: Arcanist tooling will tend to fail if your remote origin is set to something other
than the above. A common mistake is to clone from Github and then forget to update
your remotes.
Follow instructions provided by `arc install-certificate` to provide your API token.
6. Code formatting tools
During submission of patches, arcanist will automatically run `arc lint` to
enforce Bitcoin ABC code formatting standards, and often suggests changes.
If code formatting tools do not install automatically on your system, you
-will have to install clang-format-7, autopep8, flake8 and phpcs.
+will have to install clang-format-7, autopep8, flake8, phpcs and shellcheck.
To install clang-format-7 on Ubuntu (>= 18.04+updates) or Debian (>= 10):
```
sudo apt-get install clang-format-7
```
If not available in the distribution, clang-format-7 can be installed from
https://releases.llvm.org/download.html or https://apt.llvm.org
To install autopep8, flake8 and phpcs on Ubuntu:
```
-sudo apt-get install python-autopep8 flake8 php-codesniffer
+sudo apt-get install python-autopep8 flake8 php-codesniffer shellcheck
```
Working with The Bitcoin ABC Repository
---------------------------------------
A typical workflow would be:
- Create a topic branch in Git for your changes
git checkout -b 'my-topic-branch'
- Make your changes, and commit them
git commit -a -m 'my-commit'
- Create a differential with Arcanist
arc diff
You should add suggested reviewers and a test plan to the commit message.
Note that Arcanist is set up to look only at the most-recent commit message,
So all you changes for this Diff should be in one Git commit.
- For large changes, break them into several Diffs, as described in this
[guide](https://medium.com/@kurtisnusbaum/stacked-diffs-keeping-phabricator-diffs-small-d9964f4dcfa6).
You can also include "Depends on Dxxx" in the Arcanist message to indicate
dependence on other Diffs.
- Log into Phabricator to see review and feedback.
- Make changes as suggested by the reviewers. You can simply edit the files
with my-topic-branch checked out, and then type `arc diff`. Arcanist will
give you the option to add uncommited changes. Or, alternatively, you can
commit the changes using `git commit -a --am` to add them to the last commit,
or squash multiple commits by typing `git rebase -i master`. If you squash,
make sure the commit message has the information needed for arcanist (such
as the Diff number, reviewers, etc.).
- Update your Diff by typing `arc diff` again.
- When reviewers approve your Diff, it should be listed as "ready to Land"
in Phabricator. When you want to commit your diff to the repository, check out
type my-topic-branch in git, then type `arc land`. You have now successfully
committed a change to the Bitcoin ABC repository.
- When reviewing a Diff, apply the changeset on your local by using
`arc patch D{NNNN}`
- You will likely be re-writing git histories multiple times, which causes
timestamp changes that require re-building a significant number of files. It's
highly recommended to install `ccache` (re-run ./configure if you install it
later), as this will help cut your re-build times from several minutes to under
a minute, in many cases.
What to work on
---------------
If you are looking for a useful task to contribute to the project, a good place
to start is the list of tasks at https://reviews.bitcoinabc.org/maniphest/
You could also try [backporting](doc/backporting.md) some code from Bitcoin Core.
Copyright
---------
By contributing to this repository, you agree to license your work under the
MIT license unless specified otherwise in `contrib/debian/copyright` or at
the top of the file itself. Any work contributed where you are not the original
author must contain its license header with the original author(s) and source.
Disclosure Policy
-----------------
See [DISCLOSURE_POLICY](DISCLOSURE_POLICY).
diff --git a/arcanist/.phutil_module_cache b/arcanist/.phutil_module_cache
index 1d737f5ddc..48891034c9 100644
--- a/arcanist/.phutil_module_cache
+++ b/arcanist/.phutil_module_cache
@@ -1 +1 @@
-{"__symbol_cache_version__":11,"ae5b7d3d6b8cf9598ce4abaf0cd56b21":{"have":{"class":{"ExtendedConfigurationDrivenLintEngine":19}},"need":{"function":{"newv":159,"pht":933},"class":{"ArcanistLintEngine":65,"ArcanistConfigurationDrivenLintEngine":171,"PhutilConsole":866},"class\/interface":{"ILintOnce":634}},"xmap":{"ExtendedConfigurationDrivenLintEngine":["ArcanistLintEngine"]}},"2809b09d2021203b43c57da33d1fe8bf":{"have":{"class":{"AssertWithSideEffectsLinter":210}},"need":{"function":{"pht":439},"class":{"ArcanistLinter":246,"ArcanistLintSeverity":926,"Filesystem":1170}},"xmap":{"AssertWithSideEffectsLinter":["ArcanistLinter"]}},"90a8b110dc475955f15bb81d37268cb5":{"have":{"class":{"AutoPEP8FormatLinter":75}},"need":{"function":{"pht":297,"execx":769,"id":1903},"class":{"ArcanistExternalLinter":104,"ArcanistLintMessage":1910,"Filesystem":1754,"ArcanistLinter":2017,"ArcanistLintSeverity":2095}},"xmap":{"AutoPEP8FormatLinter":["ArcanistExternalLinter"]}},"5ea58c19df0397ed8ee0f463d90d6c72":{"have":{"class":{"BoostDependenciesLinter":145}},"need":{"function":{"pht":330,"id":1440},"class":{"GlobalExternalLinter":177,"ArcanistLintMessage":1447,"Filesystem":609,"ArcanistLinter":1524,"ArcanistLintSeverity":1624}},"xmap":{"BoostDependenciesLinter":["GlobalExternalLinter"]}},"38f0c676bff5192a344464142caaa253":{"have":{"class":{"CHeaderLinter":99}},"need":{"function":{"pht":611},"class":{"ArcanistLinter":121,"ArcanistLintSeverity":1060,"Filesystem":1307}},"xmap":{"CHeaderLinter":["ArcanistLinter"]}},"9bb48ec0fe2e9ced8e27d42540d0571c":{"have":{"class":{"CheckDocLinter":106}},"need":{"function":{"pht":321,"id":1845},"class":{"GlobalExternalLinter":129,"ArcanistLintMessage":1852,"Filesystem":729,"ArcanistLinter":1900,"ArcanistLintSeverity":1986}},"xmap":{"CheckDocLinter":["GlobalExternalLinter"]}},"63d19a8745cb2e1200cc26488dc7ad25":{"have":{"class":{"CheckRpcMappingsLinter":131}},"need":{"function":{"pht":310,"id":1386},"class":{"GlobalExternalLinter":162,"ArcanistLintMessage":1393,"Filesystem":573,"ArcanistLinter":1443,"ArcanistLintSeverity":1544}},"xmap":{"CheckRpcMappingsLinter":["GlobalExternalLinter"]}},"75579a609dd975aa0226add52700c622":{"have":{"class":{"FileNameLinter":103}},"need":{"function":{"pht":307},"class":{"ArcanistLinter":126,"ArcanistLintSeverity":662,"Filesystem":968}},"xmap":{"FileNameLinter":["ArcanistLinter"]}},"9285ad9415f8ebe564f7119e5a72c559":{"have":{"class":{"FormatStringLinter":146}},"need":{"function":{"pht":377,"csprintf":1492,"id":1872},"class":{"ArcanistExternalLinter":173,"ArcanistLintMessage":1879,"Filesystem":827,"ArcanistLinter":1956,"ArcanistLintSeverity":2044}},"xmap":{"FormatStringLinter":["ArcanistExternalLinter"]}},"2e11dd9ad67e594f863bc46ac59ea37e":{"have":{"class":{"GlobalExternalLinter":199}},"need":{"class":{"ArcanistExternalLinter":228},"interface":{"ILintOnce":262}},"xmap":{"GlobalExternalLinter":["ArcanistExternalLinter","ILintOnce"]}},"b2403124ec3e8be6cb4d10bf0f6c4134":{"have":{"interface":{"ILintOnce":69}},"need":[],"xmap":[]},"1f9bac7956f4f948a187828dcc6ba2d0":{"have":{"class":{"IncludeGuardLinter":98}},"need":{"function":{"pht":368},"class":{"ArcanistLinter":125,"ArcanistLintSeverity":721,"Filesystem":970}},"xmap":{"IncludeGuardLinter":["ArcanistLinter"]}},"2cbb6e7228d81557f777ad648704f343":{"have":{"class":{"IncludeQuotesLinter":100}},"need":{"function":{"pht":306},"class":{"ArcanistLinter":128,"ArcanistLintSeverity":663,"Filesystem":964}},"xmap":{"IncludeQuotesLinter":["ArcanistLinter"]}},"f151089cf79fdb8257b2272ed4782d88":{"have":{"class":{"IncludeSourceLinter":99}},"need":{"function":{"pht":391},"class":{"ArcanistLinter":127,"ArcanistLintSeverity":699,"Filesystem":938}},"xmap":{"IncludeSourceLinter":["ArcanistLinter"]}},"ce5dee893bedb5d93466655eede8ac47":{"have":{"class":{"LocaleDependenceLinter":160}},"need":{"function":{"pht":5429},"class":{"ArcanistLinter":191,"ArcanistLintSeverity":5932,"Filesystem":6178}},"xmap":{"LocaleDependenceLinter":["ArcanistLinter"]}},"6f2f22dd0f259fb2eaa284b4fab3bc29":{"have":{"class":{"PythonFormatLinter":123}},"need":{"function":{"pht":353,"id":1838},"class":{"ArcanistExternalLinter":150,"ArcanistLintMessage":1845,"Filesystem":776,"ArcanistLinter":1970,"ArcanistLintSeverity":2053}},"xmap":{"PythonFormatLinter":["ArcanistExternalLinter"]}},"03cf226fe177a9fce7dc046816cc466b":{"have":{"class":{"PythonOpenFileEncodingLinter":111}},"need":{"function":{"pht":325},"class":{"ArcanistLinter":148,"ArcanistLintSeverity":687,"Filesystem":991}},"xmap":{"PythonOpenFileEncodingLinter":["ArcanistLinter"]}},"09a933fbbf135320585be52750d93831":{"have":{"class":{"StdintLinter":90}},"need":{"function":{"pht":280},"class":{"ArcanistLinter":111,"ArcanistLintSeverity":589,"Filesystem":897}},"xmap":{"StdintLinter":["ArcanistLinter"]}},"25781df78f6eebfb223296b8265e9d19":{"have":{"class":{"TestsLinter":103}},"need":{"function":{"pht":318,"id":2629},"class":{"ArcanistExternalLinter":123,"ArcanistLintMessage":2636,"Filesystem":776,"ArcanistLinter":2684,"ArcanistLintSeverity":2792}},"xmap":{"TestsLinter":["ArcanistExternalLinter"]}},"454160ed72e88797129d84ee589de304":{"have":{"class":{"PythonShebangLinter":87}},"need":{"function":{"pht":290},"class":{"ArcanistLinter":115,"ArcanistLintSeverity":614,"Filesystem":854}},"xmap":{"PythonShebangLinter":["ArcanistLinter"]}},"1c03a4631b02b8e1ebcc3a078dc1e4af":{"have":{"class":{"ClangFormatLinter":79}},"need":{"function":{"pht":302,"execx":781,"id":2235},"class":{"ArcanistExternalLinter":105,"ArcanistLintMessage":2242,"Filesystem":2086,"ArcanistLinter":2349,"ArcanistLintSeverity":2427}},"xmap":{"ClangFormatLinter":["ArcanistExternalLinter"]}}}
\ No newline at end of file
+{"__symbol_cache_version__":11,"ae5b7d3d6b8cf9598ce4abaf0cd56b21":{"have":{"class":{"ExtendedConfigurationDrivenLintEngine":19}},"need":{"function":{"newv":159,"pht":933},"class":{"ArcanistLintEngine":65,"ArcanistConfigurationDrivenLintEngine":171,"PhutilConsole":866},"class\/interface":{"ILintOnce":634}},"xmap":{"ExtendedConfigurationDrivenLintEngine":["ArcanistLintEngine"]}},"2809b09d2021203b43c57da33d1fe8bf":{"have":{"class":{"AssertWithSideEffectsLinter":210}},"need":{"function":{"pht":439},"class":{"ArcanistLinter":246,"ArcanistLintSeverity":926,"Filesystem":1170}},"xmap":{"AssertWithSideEffectsLinter":["ArcanistLinter"]}},"90a8b110dc475955f15bb81d37268cb5":{"have":{"class":{"AutoPEP8FormatLinter":75}},"need":{"function":{"pht":297,"execx":769,"id":1903},"class":{"ArcanistExternalLinter":104,"ArcanistLintMessage":1910,"Filesystem":1754,"ArcanistLinter":2017,"ArcanistLintSeverity":2095}},"xmap":{"AutoPEP8FormatLinter":["ArcanistExternalLinter"]}},"5ea58c19df0397ed8ee0f463d90d6c72":{"have":{"class":{"BoostDependenciesLinter":145}},"need":{"function":{"pht":330,"id":1440},"class":{"GlobalExternalLinter":177,"ArcanistLintMessage":1447,"Filesystem":609,"ArcanistLinter":1524,"ArcanistLintSeverity":1624}},"xmap":{"BoostDependenciesLinter":["GlobalExternalLinter"]}},"38f0c676bff5192a344464142caaa253":{"have":{"class":{"CHeaderLinter":99}},"need":{"function":{"pht":611},"class":{"ArcanistLinter":121,"ArcanistLintSeverity":1060,"Filesystem":1307}},"xmap":{"CHeaderLinter":["ArcanistLinter"]}},"9bb48ec0fe2e9ced8e27d42540d0571c":{"have":{"class":{"CheckDocLinter":106}},"need":{"function":{"pht":321,"id":1845},"class":{"GlobalExternalLinter":129,"ArcanistLintMessage":1852,"Filesystem":729,"ArcanistLinter":1900,"ArcanistLintSeverity":1986}},"xmap":{"CheckDocLinter":["GlobalExternalLinter"]}},"63d19a8745cb2e1200cc26488dc7ad25":{"have":{"class":{"CheckRpcMappingsLinter":131}},"need":{"function":{"pht":310,"id":1386},"class":{"GlobalExternalLinter":162,"ArcanistLintMessage":1393,"Filesystem":573,"ArcanistLinter":1443,"ArcanistLintSeverity":1544}},"xmap":{"CheckRpcMappingsLinter":["GlobalExternalLinter"]}},"1c03a4631b02b8e1ebcc3a078dc1e4af":{"have":{"class":{"ClangFormatLinter":79}},"need":{"function":{"pht":302,"execx":781,"id":2235},"class":{"ArcanistExternalLinter":105,"ArcanistLintMessage":2242,"Filesystem":2086,"ArcanistLinter":2349,"ArcanistLintSeverity":2427}},"xmap":{"ClangFormatLinter":["ArcanistExternalLinter"]}},"75579a609dd975aa0226add52700c622":{"have":{"class":{"FileNameLinter":103}},"need":{"function":{"pht":307},"class":{"ArcanistLinter":126,"ArcanistLintSeverity":662,"Filesystem":968}},"xmap":{"FileNameLinter":["ArcanistLinter"]}},"9285ad9415f8ebe564f7119e5a72c559":{"have":{"class":{"FormatStringLinter":146}},"need":{"function":{"pht":377,"csprintf":1492,"id":1872},"class":{"ArcanistExternalLinter":173,"ArcanistLintMessage":1879,"Filesystem":827,"ArcanistLinter":1956,"ArcanistLintSeverity":2044}},"xmap":{"FormatStringLinter":["ArcanistExternalLinter"]}},"2e11dd9ad67e594f863bc46ac59ea37e":{"have":{"class":{"GlobalExternalLinter":199}},"need":{"class":{"ArcanistExternalLinter":228},"interface":{"ILintOnce":262}},"xmap":{"GlobalExternalLinter":["ArcanistExternalLinter","ILintOnce"]}},"b2403124ec3e8be6cb4d10bf0f6c4134":{"have":{"interface":{"ILintOnce":69}},"need":[],"xmap":[]},"1f9bac7956f4f948a187828dcc6ba2d0":{"have":{"class":{"IncludeGuardLinter":98}},"need":{"function":{"pht":368},"class":{"ArcanistLinter":125,"ArcanistLintSeverity":721,"Filesystem":970}},"xmap":{"IncludeGuardLinter":["ArcanistLinter"]}},"2cbb6e7228d81557f777ad648704f343":{"have":{"class":{"IncludeQuotesLinter":100}},"need":{"function":{"pht":306},"class":{"ArcanistLinter":128,"ArcanistLintSeverity":663,"Filesystem":964}},"xmap":{"IncludeQuotesLinter":["ArcanistLinter"]}},"f151089cf79fdb8257b2272ed4782d88":{"have":{"class":{"IncludeSourceLinter":99}},"need":{"function":{"pht":391},"class":{"ArcanistLinter":127,"ArcanistLintSeverity":699,"Filesystem":938}},"xmap":{"IncludeSourceLinter":["ArcanistLinter"]}},"6f2f22dd0f259fb2eaa284b4fab3bc29":{"have":{"class":{"PythonFormatLinter":123}},"need":{"function":{"pht":353,"id":1838},"class":{"ArcanistExternalLinter":150,"ArcanistLintMessage":1845,"Filesystem":776,"ArcanistLinter":1970,"ArcanistLintSeverity":2053}},"xmap":{"PythonFormatLinter":["ArcanistExternalLinter"]}},"03cf226fe177a9fce7dc046816cc466b":{"have":{"class":{"PythonOpenFileEncodingLinter":111}},"need":{"function":{"pht":325},"class":{"ArcanistLinter":148,"ArcanistLintSeverity":687,"Filesystem":991}},"xmap":{"PythonOpenFileEncodingLinter":["ArcanistLinter"]}},"454160ed72e88797129d84ee589de304":{"have":{"class":{"PythonShebangLinter":87}},"need":{"function":{"pht":290},"class":{"ArcanistLinter":115,"ArcanistLintSeverity":614,"Filesystem":854}},"xmap":{"PythonShebangLinter":["ArcanistLinter"]}},"09a933fbbf135320585be52750d93831":{"have":{"class":{"StdintLinter":90}},"need":{"function":{"pht":280},"class":{"ArcanistLinter":111,"ArcanistLintSeverity":589,"Filesystem":897}},"xmap":{"StdintLinter":["ArcanistLinter"]}},"25781df78f6eebfb223296b8265e9d19":{"have":{"class":{"TestsLinter":103}},"need":{"function":{"pht":318,"id":2629},"class":{"ArcanistExternalLinter":123,"ArcanistLintMessage":2636,"Filesystem":776,"ArcanistLinter":2684,"ArcanistLintSeverity":2792}},"xmap":{"TestsLinter":["ArcanistExternalLinter"]}},"899b8be78da0be470965682eaa31f00a":{"have":{"class":{"ShellCheckLinter":95}},"need":{"function":{"pht":1835,"id":3051},"class":{"ArcanistExternalLinter":120,"ArcanistLintMessage":3058,"ArcanistLintSeverity":1560,"ArcanistLinter":3106}},"xmap":{"ShellCheckLinter":["ArcanistExternalLinter"]}},"8a0f2ba683e96feeb9d9564af01fe3e7":{"have":{"class":{"LocaleDependenceLinter":160}},"need":{"function":{"pht":5460},"class":{"ArcanistLinter":191,"ArcanistLintSeverity":5963,"Filesystem":6209}},"xmap":{"LocaleDependenceLinter":["ArcanistLinter"]}}}
\ No newline at end of file
diff --git a/arcanist/__phutil_library_map__.php b/arcanist/__phutil_library_map__.php
index dd2d9dc029..edb9a66490 100644
--- a/arcanist/__phutil_library_map__.php
+++ b/arcanist/__phutil_library_map__.php
@@ -1,60 +1,62 @@
<?php
/**
* This file is automatically generated. Use 'arc liberate' to rebuild it.
*
* @generated
* @phutil-library-version 2
*/
phutil_register_library_map(array(
'__library_version__' => 2,
'class' => array(
'AssertWithSideEffectsLinter' => 'linter/AssertWithSideEffectsLinter.php',
'AutoPEP8FormatLinter' => 'linter/AutoPEP8Linter.php',
'BoostDependenciesLinter' => 'linter/BoostDependenciesLinter.php',
'CHeaderLinter' => 'linter/CHeaderLinter.php',
'CheckDocLinter' => 'linter/CheckDocLinter.php',
'CheckRpcMappingsLinter' => 'linter/CheckRpcMappingsLinter.php',
'ClangFormatLinter' => 'linter/ClangFormatLinter.php',
'ExtendedConfigurationDrivenLintEngine' => 'engine/ExtendedConfigurationDrivenLintEngine.php',
'FileNameLinter' => 'linter/FileNameLinter.php',
'FormatStringLinter' => 'linter/FormatStringLinter.php',
'GlobalExternalLinter' => 'linter/GlobalExternalLinter.php',
'ILintOnce' => 'linter/ILintOnce.php',
'IncludeGuardLinter' => 'linter/IncludeGuardLinter.php',
'IncludeQuotesLinter' => 'linter/IncludeQuotesLinter.php',
'IncludeSourceLinter' => 'linter/IncludeSourceLinter.php',
'LocaleDependenceLinter' => 'linter/LocaleDependenceLinter.php',
'PythonFormatLinter' => 'linter/PythonFormatLinter.php',
'PythonOpenFileEncodingLinter' => 'linter/PythonOpenFileEncodingLinter.php',
'PythonShebangLinter' => 'linter/PythonShebangLinter.php',
+ 'ShellCheckLinter' => 'linter/ShellCheckLinter.php',
'StdintLinter' => 'linter/StdintLinter.php',
'TestsLinter' => 'linter/TestsLinter.php',
),
'function' => array(),
'xmap' => array(
'AssertWithSideEffectsLinter' => 'ArcanistLinter',
'AutoPEP8FormatLinter' => 'ArcanistExternalLinter',
'BoostDependenciesLinter' => 'GlobalExternalLinter',
'CHeaderLinter' => 'ArcanistLinter',
'CheckDocLinter' => 'GlobalExternalLinter',
'CheckRpcMappingsLinter' => 'GlobalExternalLinter',
'ClangFormatLinter' => 'ArcanistExternalLinter',
'ExtendedConfigurationDrivenLintEngine' => 'ArcanistLintEngine',
'FileNameLinter' => 'ArcanistLinter',
'FormatStringLinter' => 'ArcanistExternalLinter',
'GlobalExternalLinter' => array(
'ArcanistExternalLinter',
'ILintOnce',
),
'IncludeGuardLinter' => 'ArcanistLinter',
'IncludeQuotesLinter' => 'ArcanistLinter',
'IncludeSourceLinter' => 'ArcanistLinter',
'LocaleDependenceLinter' => 'ArcanistLinter',
'PythonFormatLinter' => 'ArcanistExternalLinter',
'PythonOpenFileEncodingLinter' => 'ArcanistLinter',
'PythonShebangLinter' => 'ArcanistLinter',
+ 'ShellCheckLinter' => 'ArcanistExternalLinter',
'StdintLinter' => 'ArcanistLinter',
'TestsLinter' => 'ArcanistExternalLinter',
),
));
diff --git a/arcanist/linter/ShellCheckLinter.php b/arcanist/linter/ShellCheckLinter.php
new file mode 100644
index 0000000000..5edc7b9eaa
--- /dev/null
+++ b/arcanist/linter/ShellCheckLinter.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Uses the ShellCheck tool to run static analysis on shell scripts
+ */
+final class ShellCheckLinter extends ArcanistExternalLinter {
+ const SHELLCHECK_EXCLUDED_RULES = array(
+ // phpcs:disable Generic.Files.LineLength.TooLong
+ // phpcs:disable Generic.Files.LineLength.MaxExceeded
+ 'SC2001', // See if you can use ${variable//search/replace} instead.
+ 'SC2004', // $/${} is unnecessary on arithmetic variables.
+ 'SC2005', // Useless echo? Instead of 'echo $(cmd)', just use 'cmd'.
+ 'SC2006', // Use $(..) instead of legacy `..`.
+ 'SC2016', // Expressions don't expand in single quotes, use double quotes for that.
+ 'SC2028', // echo won't expand escape sequences. Consider printf.
+ 'SC2046', // Quote this to prevent word splitting.
+ 'SC2048', // Use "$@" (with quotes) to prevent whitespace problems.
+ 'SC2066', // Since you double quoted this, it will not word split, and the loop will only run once.
+ 'SC2086', // Double quote to prevent globbing and word splitting.
+ 'SC2116', // Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
+ 'SC2148', // Tips depend on target shell and yours is unknown. Add a shebang.
+ 'SC2162', // read without -r will mangle backslashes.
+ 'SC2166', // Prefer [ p ] && [ q ] as [ p -a q ] is not well defined.
+ 'SC2166', // Prefer [ p ] || [ q ] as [ p -o q ] is not well defined.
+ 'SC2181', // Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.
+ // phpcs:enable
+ );
+
+ const SHELLCHECK_SEVERITY_MAP = array(
+ 'note' => ArcanistLintSeverity::SEVERITY_ADVICE,
+ 'warning' => ArcanistLintSeverity::SEVERITY_WARNING,
+ 'error' => ArcanistLintSeverity::SEVERITY_ERROR,
+ );
+
+ public function getInfoName() {
+ return 'shellcheck';
+ }
+
+ public function getInfoDescription() {
+ return pht('Use shellcheck for processing specified files.');
+ }
+
+ public function getLinterName() {
+ return 'SHELLCHECK';
+ }
+
+ public function getLinterConfigurationName() {
+ return 'shellcheck';
+ }
+
+ public function getDefaultBinary() {
+ return 'shellcheck';
+ }
+
+ public function getInstallInstructions() {
+ return pht('Make sure shellcheck is in directory specified by $PATH');
+ }
+
+ public function shouldExpectCommandErrors() {
+ return true;
+ }
+
+ protected function getMandatoryFlags() {
+ return array(
+ '--format=gcc',
+ '--exclude='.implode(',', self::SHELLCHECK_EXCLUDED_RULES));
+ }
+
+ private function getSeverity($severity) {
+ if (array_key_exists($severity, self::SHELLCHECK_SEVERITY_MAP)) {
+ return self::SHELLCHECK_SEVERITY_MAP[$severity];
+ }
+
+ return ArcanistLintSeverity::SEVERITY_ERROR;
+ }
+
+ protected function parseLinterOutput($path, $err, $stdout, $stderr) {
+ $messages = array();
+
+ $pattern = '/(.+):(\d+):(\d+): (.+): (.+) \[(SC\d+)\]/';
+ if (preg_match_all($pattern, $stdout, $errors, PREG_SET_ORDER)) {
+ foreach ($errors as $error) {
+ list(, $file, $line, $char, $severity, $message, $code) = $error;
+
+ $messages[] = id(new ArcanistLintMessage())
+ ->setGranularity(ArcanistLinter::GRANULARITY_FILE)
+ ->setPath($path)
+ ->setLine($line)
+ ->setChar($char)
+ ->setCode($code)
+ ->setSeverity($this->getSeverity($severity))
+ ->setName('ShellCheck found an issue:')
+ ->setDescription($message);
+ }
+ }
+
+ return $messages;
+ }
+}
diff --git a/contrib/gitian-signing/check-keys.sh b/contrib/gitian-signing/check-keys.sh
index 6b512d779b..82afe51666 100755
--- a/contrib/gitian-signing/check-keys.sh
+++ b/contrib/gitian-signing/check-keys.sh
@@ -1,5 +1,5 @@
# Fetch latest signers' keys. We do this in order to check if a key was revoked.
-while read fingerprint keyholder
+while read fingerprint _
do
gpg --recv-keys ${fingerprint}
done < ./keys.txt
diff --git a/contrib/gitian/provisioner.sh b/contrib/gitian/provisioner.sh
index 5f1b4dfd47..da2d99fb77 100644
--- a/contrib/gitian/provisioner.sh
+++ b/contrib/gitian/provisioner.sh
@@ -1,60 +1,64 @@
#!/bin/bash -e
# User to setup for building. Vagrant is the default
export BUILDUSER=${BUILDUSER:-vagrant}
apt-get update
apt-get install -y git ruby sudo apt-cacher-ng qemu-utils debootstrap \
lxc python-cheetah parted kpartx bridge-utils make curl
# the version of lxc-start in Debian needs to run as root, so make sure
# that the build script can execute it without providing a password
echo "%sudo ALL=NOPASSWD: /usr/bin/lxc-start" > /etc/sudoers.d/gitian-lxc
echo "%sudo ALL=NOPASSWD: /usr/bin/lxc-execute" >> /etc/sudoers.d/gitian-lxc
# make sure that USE_LXC is always set when logging in as vagrant,
# and configure LXC IP addresses
-echo 'export USE_LXC=1' >> /home/${BUILDUSER}/.profile
-echo 'export LXC_BRIDGE=lxcbr0' >> /home/${BUILDUSER}/.profile
-echo 'export GITIAN_HOST_IP=10.0.3.1' >> /home/${BUILDUSER}/.profile
-echo 'export LXC_GUEST_IP=10.0.3.5' >> /home/${BUILDUSER}/.profile
+{
+ echo 'export USE_LXC=1'
+ echo 'export LXC_BRIDGE=lxcbr0'
+ echo 'export GITIAN_HOST_IP=10.0.3.1'
+ echo 'export LXC_GUEST_IP=10.0.3.5'
+} >> /home/${BUILDUSER}/.profile
# Setup bridge
echo 'USE_LXC_BRIDGE="true"' > /etc/default/lxc-net
-echo 'lxc.network.type = veth' > /etc/lxc/default.conf
-echo 'lxc.network.link = lxcbr0' >> /etc/lxc/default.conf
-echo 'lxc.network.flags = up' >> /etc/lxc/default.conf
-echo 'lxc.network.hwaddr = 00:16:3e:xx:xx:xx' >> /etc/lxc/default.conf
+{
+ echo 'lxc.network.type = veth'
+ echo 'lxc.network.link = lxcbr0'
+ echo 'lxc.network.flags = up'
+ echo 'lxc.network.hwaddr = 00:16:3e:xx:xx:xx'
+} > /etc/lxc/default.conf
service lxc-net restart
# chdir into build user home directory
cd /home/${BUILDUSER}/
## Install vm-builder
wget http://archive.ubuntu.com/ubuntu/pool/universe/v/vm-builder/vm-builder_0.12.4+bzr494.orig.tar.gz
echo "76cbf8c52c391160b2641e7120dbade5afded713afaa6032f733a261f13e6a8e vm-builder_0.12.4+bzr494.orig.tar.gz" | sha256sum -c
# (verification -- must return OK)
tar -zxvf vm-builder_0.12.4+bzr494.orig.tar.gz
cd vm-builder-0.12.4+bzr494
sudo python setup.py install
cd ..
## Install Gitian
git clone https://github.com/devrandom/gitian-builder.git
cd gitian-builder
git config --global user.email "vagrant@vagrant.com"
git config --global user.name "vagrant"
chown -R ${BUILDUSER}:${BUILDUSER} /home/${BUILDUSER}
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo "!!! Provisioning Complete !!!!"
echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
echo
echo "As the user ${BUILDUSER} run the following commands to produce a linux build:"
echo "export COMMIT=v0.18.3"
echo "export URL=https://github.com/Bitcoin-ABC/bitcoin-abc.git"
echo "cd gitian-builder"
echo './bin/make-base-vm --lxc --distro debian --suite stretch --arch amd64'
echo './bin/gbuild --commit bitcoin=${COMMIT} --url bitcoin=${URL} /vagrant/contrib/gitian-descriptors/gitian-linux.yml'
diff --git a/contrib/teamcity/build.sh b/contrib/teamcity/build.sh
index 81acdde9a2..dcf50897ab 100755
--- a/contrib/teamcity/build.sh
+++ b/contrib/teamcity/build.sh
@@ -1,88 +1,88 @@
#!/bin/bash
set -eu
TOPLEVEL=`git rev-parse --show-toplevel`
if [[ -z "${TOPLEVEL}" ]]; then
echo "No .git directory found, assuming pwd"
TOPLEVEL=`pwd -P`
fi
BUILD_DIR="${TOPLEVEL}/build"
mkdir -p ${BUILD_DIR}
## Generate necessary autoconf files
cd ${TOPLEVEL}
./autogen.sh
cd ${BUILD_DIR}
rm -f build.status test_bitcoin.xml
## Determine the number of build threads
THREADS=$(nproc || sysctl -n hw.ncpu)
# Default to nothing
: ${DISABLE_WALLET:=}
: ${CONFIGURE_FLAGS:=}
CONFIGURE_FLAGS=($CONFIGURE_FLAGS "--prefix=`pwd`")
if [[ ! -z "${DISABLE_WALLET}" ]]; then
echo "*** Building without wallet"
CONFIGURE_FLAGS+=("--disable-wallet")
fi
../configure "${CONFIGURE_FLAGS[@]}"
# Base directories for sanitizer related files
SAN_SUPP_DIR="${TOPLEVEL}/test/sanitizer_suppressions"
SAN_LOG_DIR="${BUILD_DIR}/sanitizer_logs"
# Create the log directory if it doesn't exist and clear it
mkdir -p "${SAN_LOG_DIR}"
-rm -rf "${SAN_LOG_DIR}"/*
+rm -rf "${SAN_LOG_DIR:?}"/*
# Sanitizers options, not used if sanitizers are not enabled
export ASAN_OPTIONS="malloc_context_size=0:log_path=${SAN_LOG_DIR}/asan.log"
export LSAN_OPTIONS="suppressions=${SAN_SUPP_DIR}/lsan:log_path=${SAN_LOG_DIR}/lsan.log"
export TSAN_OPTIONS="suppressions=${SAN_SUPP_DIR}/tsan:log_path=${SAN_LOG_DIR}/tsan.log"
export UBSAN_OPTIONS="suppressions=${SAN_SUPP_DIR}/ubsan:print_stacktrace=1:halt_on_error=1:log_path=${SAN_LOG_DIR}/ubsan.log"
function print_sanitizers_log() {
for log in "${SAN_LOG_DIR}"/*.log.*
do
echo "*** Output of ${log} ***"
cat "${log}"
done
}
# Run build
make -j ${THREADS}
# Default to nothing
: ${DISABLE_TESTS:=}
# If DISABLE_TESTS is unset (default), run the tests
if [[ -z "${DISABLE_TESTS}" ]]; then
echo "*** Running tests"
# Run unit tests
make -j ${THREADS} check || (print_sanitizers_log && exit 1)
mkdir -p output/
BRANCH=$(git rev-parse --abbrev-ref HEAD)
JUNIT_DEFAULT="junit_results_default.xml"
JUNIT_NEXT_UPGRADE="junit_results_next_upgrade.xml"
if [[ ! -z "${DISABLE_WALLET}" ]]; then
echo "Skipping rpc testing due to disabled wallet functionality."
elif [[ "${BRANCH}" == "master" ]]; then
./test/functional/test_runner.py -J="${JUNIT_DEFAULT}" --cutoff=600 --tmpdirprefix=output
./test/functional/test_runner.py -J="${JUNIT_NEXT_UPGRADE}" --cutoff=600 --tmpdirprefix=output --with-gravitonactivation
else
./test/functional/test_runner.py -J="${JUNIT_DEFAULT}" --tmpdirprefix=output
./test/functional/test_runner.py -J="${JUNIT_NEXT_UPGRADE}" --tmpdirprefix=output --with-gravitonactivation
fi
else
echo "*** Tests have been skipped"
fi
diff --git a/contrib/teamcity/gitian.sh b/contrib/teamcity/gitian.sh
index cc77e80c30..f35d10dac7 100755
--- a/contrib/teamcity/gitian.sh
+++ b/contrib/teamcity/gitian.sh
@@ -1,31 +1,33 @@
#!/bin/bash -e
cd "$(dirname "$0")"
-export COMMIT=`git rev-parse HEAD`
-export PROJECT_ROOT=`git rev-parse --show-toplevel`
+COMMIT=`git rev-parse HEAD`
+export COMMIT
+PROJECT_ROOT=`git rev-parse --show-toplevel`
+export PROJECT_ROOT
export USE_LXC=1
export GITIAN_HOST_IP=10.0.3.1
export LXC_BRIDGE=lxcbr0
export LXC_GUEST_IP=10.0.3.5
cd ~/gitian-builder
if [[ "${OS_NAME}" == "osx" ]]; then
wget https://storage.googleapis.com/f4936e83b2dcbca742be51fb9692b153/MacOSX10.11.sdk.tar.gz
echo "4732b52b5ebe300c8c91cbeed6d19d59c1ff9c56c7a1dd6cfa518b9c2c72abde MacOSX10.11.sdk.tar.gz" | sha256sum -c
mkdir -p inputs
echo "Downloaded"
mv MacOSX10.11.sdk.tar.gz inputs
fi
## Determine the number of build threads
THREADS=$(nproc || sysctl -n hw.ncpu)
./bin/gbuild -j${THREADS} -m3500 --commit bitcoin=${COMMIT} --url bitcoin="${PROJECT_ROOT}" "${PROJECT_ROOT}/contrib/gitian-descriptors/gitian-${OS_NAME}.yml"
RESULT_DIR="${PROJECT_ROOT}/gitian-results/${OS_NAME}"
mkdir -p "${RESULT_DIR}"
mv var/build.log "${PROJECT_ROOT}/gitian-results/"
mv result/*.yml "${RESULT_DIR}/"
mv build/out/* "${RESULT_DIR}/"
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sun, Mar 2, 11:13 (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5187544
Default Alt Text
(40 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment