mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 11:32:46 +01:00
Merge pull request #4259 from PastaPastaPasta/backport-triv-pr13
backport: 'trivial' pr14
This commit is contained in:
commit
84769e128a
@ -30,7 +30,7 @@
|
|||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 32
|
#serial 33
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_THREAD],
|
AC_DEFUN([AX_BOOST_THREAD],
|
||||||
[
|
[
|
||||||
@ -67,13 +67,24 @@ AC_DEFUN([AX_BOOST_THREAD],
|
|||||||
[AC_LANG_PUSH([C++])
|
[AC_LANG_PUSH([C++])
|
||||||
CXXFLAGS_SAVE=$CXXFLAGS
|
CXXFLAGS_SAVE=$CXXFLAGS
|
||||||
|
|
||||||
if test "x$host_os" = "xsolaris" ; then
|
case "x$host_os" in
|
||||||
CXXFLAGS="-pthreads $CXXFLAGS"
|
xsolaris )
|
||||||
elif test "x$host_os" = "xmingw32" ; then
|
CXXFLAGS="-pthreads $CXXFLAGS"
|
||||||
CXXFLAGS="-mthreads $CXXFLAGS"
|
break;
|
||||||
else
|
;;
|
||||||
CXXFLAGS="-pthread $CXXFLAGS"
|
xmingw32 )
|
||||||
fi
|
CXXFLAGS="-mthreads $CXXFLAGS"
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
*android* )
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
CXXFLAGS="-pthread $CXXFLAGS"
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_COMPILE_IFELSE([
|
AC_COMPILE_IFELSE([
|
||||||
AC_LANG_PROGRAM(
|
AC_LANG_PROGRAM(
|
||||||
[[@%:@include <boost/thread/thread.hpp>]],
|
[[@%:@include <boost/thread/thread.hpp>]],
|
||||||
@ -84,13 +95,23 @@ AC_DEFUN([AX_BOOST_THREAD],
|
|||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
])
|
])
|
||||||
if test "x$ax_cv_boost_thread" = "xyes"; then
|
if test "x$ax_cv_boost_thread" = "xyes"; then
|
||||||
if test "x$host_os" = "xsolaris" ; then
|
case "x$host_os" in
|
||||||
BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
|
xsolaris )
|
||||||
elif test "x$host_os" = "xmingw32" ; then
|
BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS"
|
||||||
BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
|
break;
|
||||||
else
|
;;
|
||||||
BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
|
xmingw32 )
|
||||||
fi
|
BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS"
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
*android* )
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS"
|
||||||
|
break;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_SUBST(BOOST_CPPFLAGS)
|
AC_SUBST(BOOST_CPPFLAGS)
|
||||||
|
|
||||||
@ -148,6 +169,9 @@ AC_DEFUN([AX_BOOST_THREAD],
|
|||||||
xmingw32 )
|
xmingw32 )
|
||||||
break;
|
break;
|
||||||
;;
|
;;
|
||||||
|
*android* )
|
||||||
|
break;
|
||||||
|
;;
|
||||||
* )
|
* )
|
||||||
BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread"
|
BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread"
|
||||||
break;
|
break;
|
||||||
|
@ -79,10 +79,19 @@ AC_DEFUN([BITCOIN_QT_INIT],[
|
|||||||
|
|
||||||
AC_ARG_WITH([qtdbus],
|
AC_ARG_WITH([qtdbus],
|
||||||
[AS_HELP_STRING([--with-qtdbus],
|
[AS_HELP_STRING([--with-qtdbus],
|
||||||
[enable DBus support (default is yes if qt is enabled and QtDBus is found)])],
|
[enable DBus support (default is yes if qt is enabled and QtDBus is found, except on Android)])],
|
||||||
[use_dbus=$withval],
|
[use_dbus=$withval],
|
||||||
[use_dbus=auto])
|
[use_dbus=auto])
|
||||||
|
|
||||||
|
dnl Android doesn't support D-Bus and certainly doesn't use it for notifications
|
||||||
|
case $host in
|
||||||
|
*android*)
|
||||||
|
if test "x$use_dbus" != xyes; then
|
||||||
|
use_dbus=no
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path)
|
AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -110,9 +110,6 @@ AC_PATH_TOOL(CPPFILT, c++filt)
|
|||||||
AC_PATH_TOOL(OBJCOPY, objcopy)
|
AC_PATH_TOOL(OBJCOPY, objcopy)
|
||||||
AC_PATH_TOOL(DSYMUTIL, dsymutil)
|
AC_PATH_TOOL(DSYMUTIL, dsymutil)
|
||||||
AC_PATH_PROG(DOXYGEN, doxygen)
|
AC_PATH_PROG(DOXYGEN, doxygen)
|
||||||
if test -z "$DOXYGEN"; then
|
|
||||||
AC_MSG_WARN([Doxygen not found])
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"])
|
AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"])
|
||||||
|
|
||||||
AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files)
|
AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files)
|
||||||
@ -635,6 +632,7 @@ case $host in
|
|||||||
BUILD_OS=darwin
|
BUILD_OS=darwin
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
|
AC_PATH_TOOL([DSYMUTIL], [dsymutil], dsymutil)
|
||||||
AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
|
AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
|
||||||
AC_PATH_TOOL([OTOOL], [otool], otool)
|
AC_PATH_TOOL([OTOOL], [otool], otool)
|
||||||
AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
|
AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
|
||||||
|
0
contrib/zmq/zmq_sub.py
Normal file → Executable file
0
contrib/zmq/zmq_sub.py
Normal file → Executable file
@ -1,6 +1,6 @@
|
|||||||
# Block and Transaction Broadcasting with ZeroMQ
|
# Block and Transaction Broadcasting with ZeroMQ
|
||||||
|
|
||||||
[ZeroMQ](http://zeromq.org/) is a lightweight wrapper around TCP
|
[ZeroMQ](https://zeromq.org/) is a lightweight wrapper around TCP
|
||||||
connections, inter-process communication, and shared-memory,
|
connections, inter-process communication, and shared-memory,
|
||||||
providing various message-oriented semantics such as publish/subscribe,
|
providing various message-oriented semantics such as publish/subscribe,
|
||||||
request/reply, and push/pull.
|
request/reply, and push/pull.
|
||||||
@ -37,8 +37,9 @@ The ZeroMQ feature in Dash Core requires ZeroMQ API version 4.x or
|
|||||||
newer. Typically, it is packaged by distributions as something like
|
newer. Typically, it is packaged by distributions as something like
|
||||||
*libzmq3-dev*. The C++ wrapper for ZeroMQ is *not* needed.
|
*libzmq3-dev*. The C++ wrapper for ZeroMQ is *not* needed.
|
||||||
|
|
||||||
In order to run the example Python client scripts in contrib/ one must
|
In order to run the example Python client scripts in the `contrib/zmq/`
|
||||||
also install *python3-zmq*, though this is not necessary for daemon
|
directory, one must also install [PyZMQ](https://github.com/zeromq/pyzmq)
|
||||||
|
(generally with `pip install pyzmq`), though this is not necessary for daemon
|
||||||
operation.
|
operation.
|
||||||
|
|
||||||
## Enabling
|
## Enabling
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
Language: Cpp
|
Language: Cpp
|
||||||
AccessModifierOffset: -4
|
AccessModifierOffset: -4
|
||||||
AlignAfterOpenBracket: false
|
AlignAfterOpenBracket: true
|
||||||
AlignEscapedNewlinesLeft: true
|
AlignEscapedNewlinesLeft: true
|
||||||
AlignTrailingComments: true
|
AlignTrailingComments: true
|
||||||
AllowAllParametersOfDeclarationOnNextLine: false
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
AllowShortBlocksOnASingleLine: false
|
AllowShortBlocksOnASingleLine: false
|
||||||
AllowShortFunctionsOnASingleLine: All
|
AllowShortFunctionsOnASingleLine: All
|
||||||
AllowShortIfStatementsOnASingleLine: true
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
|
@ -424,12 +424,6 @@ public:
|
|||||||
return vChain[nHeight];
|
return vChain[nHeight];
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Compare two chains efficiently. */
|
|
||||||
friend bool operator==(const CChain &a, const CChain &b) {
|
|
||||||
return a.vChain.size() == b.vChain.size() &&
|
|
||||||
a.vChain[a.vChain.size() - 1] == b.vChain[b.vChain.size() - 1];
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Efficiently check whether a block is present in this chain. */
|
/** Efficiently check whether a block is present in this chain. */
|
||||||
bool Contains(const CBlockIndex *pindex) const {
|
bool Contains(const CBlockIndex *pindex) const {
|
||||||
return (*this)[pindex->nHeight] == pindex;
|
return (*this)[pindex->nHeight] == pindex;
|
||||||
|
@ -120,8 +120,9 @@ std::string ScriptToAsmStr(const CScript& script, const bool fAttemptSighashDeco
|
|||||||
// checks in CheckSignatureEncoding.
|
// checks in CheckSignatureEncoding.
|
||||||
if (CheckSignatureEncoding(vch, SCRIPT_VERIFY_STRICTENC, nullptr)) {
|
if (CheckSignatureEncoding(vch, SCRIPT_VERIFY_STRICTENC, nullptr)) {
|
||||||
const unsigned char chSigHashType = vch.back();
|
const unsigned char chSigHashType = vch.back();
|
||||||
if (mapSigHashTypes.count(chSigHashType)) {
|
const auto it = mapSigHashTypes.find(chSigHashType);
|
||||||
strSigHashDecode = "[" + mapSigHashTypes.find(chSigHashType)->second + "]";
|
if (it != mapSigHashTypes.end()) {
|
||||||
|
strSigHashDecode = "[" + it->second + "]";
|
||||||
vch.pop_back(); // remove the sighash type byte. it will be replaced by the decode.
|
vch.pop_back(); // remove the sighash type byte. it will be replaced by the decode.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -345,18 +345,6 @@ public:
|
|||||||
// Get an estimate of LevelDB memory usage (in bytes).
|
// Get an estimate of LevelDB memory usage (in bytes).
|
||||||
size_t DynamicMemoryUsage() const;
|
size_t DynamicMemoryUsage() const;
|
||||||
|
|
||||||
// not available for LevelDB; provide for compatibility with BDB
|
|
||||||
bool Flush()
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Sync()
|
|
||||||
{
|
|
||||||
CDBBatch batch(*this);
|
|
||||||
return WriteBatch(batch, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
CDBIterator *NewIterator()
|
CDBIterator *NewIterator()
|
||||||
{
|
{
|
||||||
return new CDBIterator(*this, pdb->NewIterator(iteroptions));
|
return new CDBIterator(*this, pdb->NewIterator(iteroptions));
|
||||||
|
@ -118,7 +118,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
|
|||||||
|
|
||||||
if(!pblocktemplate.get())
|
if(!pblocktemplate.get())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
pblock = &pblocktemplate->block; // pointer for convenience
|
CBlock* const pblock = &pblocktemplate->block; // pointer for convenience
|
||||||
|
|
||||||
// Add dummy coinbase tx as first transaction
|
// Add dummy coinbase tx as first transaction
|
||||||
pblock->vtx.emplace_back();
|
pblock->vtx.emplace_back();
|
||||||
@ -281,7 +281,7 @@ bool BlockAssembler::TestPackageTransactions(const CTxMemPool::setEntries& packa
|
|||||||
|
|
||||||
void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
|
void BlockAssembler::AddToBlock(CTxMemPool::txiter iter)
|
||||||
{
|
{
|
||||||
pblock->vtx.emplace_back(iter->GetSharedTx());
|
pblocktemplate->block.vtx.emplace_back(iter->GetSharedTx());
|
||||||
pblocktemplate->vTxFees.push_back(iter->GetFee());
|
pblocktemplate->vTxFees.push_back(iter->GetFee());
|
||||||
pblocktemplate->vTxSigOps.push_back(iter->GetSigOpCount());
|
pblocktemplate->vTxSigOps.push_back(iter->GetSigOpCount());
|
||||||
nBlockSize += iter->GetTxSize();
|
nBlockSize += iter->GetTxSize();
|
||||||
|
@ -129,8 +129,6 @@ class BlockAssembler
|
|||||||
private:
|
private:
|
||||||
// The constructed block template
|
// The constructed block template
|
||||||
std::unique_ptr<CBlockTemplate> pblocktemplate;
|
std::unique_ptr<CBlockTemplate> pblocktemplate;
|
||||||
// A convenience pointer that always refers to the CBlock in pblocktemplate
|
|
||||||
CBlock* pblock;
|
|
||||||
|
|
||||||
// Configuration parameters for the block size
|
// Configuration parameters for the block size
|
||||||
unsigned int nBlockMaxSize;
|
unsigned int nBlockMaxSize;
|
||||||
|
@ -1400,7 +1400,6 @@ bool static AlreadyHave(const CInv& inv) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
|
|||||||
|
|
||||||
static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connman)
|
static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connman)
|
||||||
{
|
{
|
||||||
unsigned int nRelayNodes = fReachable ? 2 : 1; // limited relaying of addresses outside our network(s)
|
|
||||||
|
|
||||||
// Relay to a limited number of other nodes
|
// Relay to a limited number of other nodes
|
||||||
// Use deterministic randomness to send to the same nodes for 24 hours
|
// Use deterministic randomness to send to the same nodes for 24 hours
|
||||||
@ -1409,6 +1408,9 @@ static void RelayAddress(const CAddress& addr, bool fReachable, CConnman* connma
|
|||||||
const CSipHasher hasher = connman->GetDeterministicRandomizer(RANDOMIZER_ID_ADDRESS_RELAY).Write(hashAddr << 32).Write((GetTime() + hashAddr) / (24*60*60));
|
const CSipHasher hasher = connman->GetDeterministicRandomizer(RANDOMIZER_ID_ADDRESS_RELAY).Write(hashAddr << 32).Write((GetTime() + hashAddr) / (24*60*60));
|
||||||
FastRandomContext insecure_rand;
|
FastRandomContext insecure_rand;
|
||||||
|
|
||||||
|
// Relay reachable addresses to 2 peers. Unreachable addresses are relayed randomly to 1 or 2 peers.
|
||||||
|
unsigned int nRelayNodes = (fReachable || (hasher.Finalize() & 1)) ? 2 : 1;
|
||||||
|
|
||||||
std::array<std::pair<uint64_t, CNode*>,2> best{{{0, nullptr}, {0, nullptr}}};
|
std::array<std::pair<uint64_t, CNode*>,2> best{{{0, nullptr}, {0, nullptr}}};
|
||||||
assert(nRelayNodes <= best.size());
|
assert(nRelayNodes <= best.size());
|
||||||
|
|
||||||
|
@ -419,17 +419,6 @@ bool CNetAddr::IsLocal() const
|
|||||||
|
|
||||||
bool CNetAddr::IsValid() const
|
bool CNetAddr::IsValid() const
|
||||||
{
|
{
|
||||||
// Cleanup 3-byte shifted addresses caused by garbage in size field
|
|
||||||
// of addr messages from versions before 0.2.9 checksum.
|
|
||||||
// Two consecutive addr messages look like this:
|
|
||||||
// header20 vectorlen3 addr26 addr26 addr26 header20 vectorlen3 addr26 addr26 addr26...
|
|
||||||
// so if the first length field is garbled, it reads the second batch
|
|
||||||
// of addr misaligned by 3 bytes.
|
|
||||||
if (IsIPv6() && memcmp(m_addr.data(), IPV4_IN_IPV6_PREFIX.data() + 3,
|
|
||||||
sizeof(IPV4_IN_IPV6_PREFIX) - 3) == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// unspecified IPv6 address (::/128)
|
// unspecified IPv6 address (::/128)
|
||||||
unsigned char ipNone6[16] = {};
|
unsigned char ipNone6[16] = {};
|
||||||
if (IsIPv6() && memcmp(m_addr.data(), ipNone6, sizeof(ipNone6)) == 0) {
|
if (IsIPv6() && memcmp(m_addr.data(), ipNone6, sizeof(ipNone6)) == 0) {
|
||||||
|
@ -8,10 +8,6 @@
|
|||||||
#include <util/system.h>
|
#include <util/system.h>
|
||||||
#include <util/strencodings.h>
|
#include <util/strencodings.h>
|
||||||
|
|
||||||
#ifndef WIN32
|
|
||||||
# include <arpa/inet.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static std::atomic<bool> g_initial_block_download_completed(false);
|
static std::atomic<bool> g_initial_block_download_completed(false);
|
||||||
|
|
||||||
namespace NetMsgType {
|
namespace NetMsgType {
|
||||||
|
@ -60,19 +60,16 @@ namespace NetMsgType {
|
|||||||
/**
|
/**
|
||||||
* The version message provides information about the transmitting node to the
|
* The version message provides information about the transmitting node to the
|
||||||
* receiving node at the beginning of a connection.
|
* receiving node at the beginning of a connection.
|
||||||
* @see https://bitcoin.org/en/developer-reference#version
|
|
||||||
*/
|
*/
|
||||||
extern const char *VERSION;
|
extern const char *VERSION;
|
||||||
/**
|
/**
|
||||||
* The verack message acknowledges a previously-received version message,
|
* The verack message acknowledges a previously-received version message,
|
||||||
* informing the connecting node that it can begin to send other messages.
|
* informing the connecting node that it can begin to send other messages.
|
||||||
* @see https://bitcoin.org/en/developer-reference#verack
|
|
||||||
*/
|
*/
|
||||||
extern const char *VERACK;
|
extern const char *VERACK;
|
||||||
/**
|
/**
|
||||||
* The addr (IP address) message relays connection information for peers on the
|
* The addr (IP address) message relays connection information for peers on the
|
||||||
* network.
|
* network.
|
||||||
* @see https://bitcoin.org/en/developer-reference#addr
|
|
||||||
*/
|
*/
|
||||||
extern const char *ADDR;
|
extern const char *ADDR;
|
||||||
/**
|
/**
|
||||||
@ -90,82 +87,69 @@ extern const char *SENDADDRV2;
|
|||||||
/**
|
/**
|
||||||
* The inv message (inventory message) transmits one or more inventories of
|
* The inv message (inventory message) transmits one or more inventories of
|
||||||
* objects known to the transmitting peer.
|
* objects known to the transmitting peer.
|
||||||
* @see https://bitcoin.org/en/developer-reference#inv
|
|
||||||
*/
|
*/
|
||||||
extern const char *INV;
|
extern const char *INV;
|
||||||
/**
|
/**
|
||||||
* The getdata message requests one or more data objects from another node.
|
* The getdata message requests one or more data objects from another node.
|
||||||
* @see https://bitcoin.org/en/developer-reference#getdata
|
|
||||||
*/
|
*/
|
||||||
extern const char *GETDATA;
|
extern const char *GETDATA;
|
||||||
/**
|
/**
|
||||||
* The merkleblock message is a reply to a getdata message which requested a
|
* The merkleblock message is a reply to a getdata message which requested a
|
||||||
* block using the inventory type MSG_MERKLEBLOCK.
|
* block using the inventory type MSG_MERKLEBLOCK.
|
||||||
* @since protocol version 70001 as described by BIP37.
|
* @since protocol version 70001 as described by BIP37.
|
||||||
* @see https://bitcoin.org/en/developer-reference#merkleblock
|
|
||||||
*/
|
*/
|
||||||
extern const char *MERKLEBLOCK;
|
extern const char *MERKLEBLOCK;
|
||||||
/**
|
/**
|
||||||
* The getblocks message requests an inv message that provides block header
|
* The getblocks message requests an inv message that provides block header
|
||||||
* hashes starting from a particular point in the block chain.
|
* hashes starting from a particular point in the block chain.
|
||||||
* @see https://bitcoin.org/en/developer-reference#getblocks
|
|
||||||
*/
|
*/
|
||||||
extern const char *GETBLOCKS;
|
extern const char *GETBLOCKS;
|
||||||
/**
|
/**
|
||||||
* The getheaders message requests a headers message that provides block
|
* The getheaders message requests a headers message that provides block
|
||||||
* headers starting from a particular point in the block chain.
|
* headers starting from a particular point in the block chain.
|
||||||
* @since protocol version 31800.
|
* @since protocol version 31800.
|
||||||
* @see https://bitcoin.org/en/developer-reference#getheaders
|
|
||||||
*/
|
*/
|
||||||
extern const char *GETHEADERS;
|
extern const char *GETHEADERS;
|
||||||
/**
|
/**
|
||||||
* The tx message transmits a single transaction.
|
* The tx message transmits a single transaction.
|
||||||
* @see https://bitcoin.org/en/developer-reference#tx
|
|
||||||
*/
|
*/
|
||||||
extern const char *TX;
|
extern const char *TX;
|
||||||
/**
|
/**
|
||||||
* The headers message sends one or more block headers to a node which
|
* The headers message sends one or more block headers to a node which
|
||||||
* previously requested certain headers with a getheaders message.
|
* previously requested certain headers with a getheaders message.
|
||||||
* @since protocol version 31800.
|
* @since protocol version 31800.
|
||||||
* @see https://bitcoin.org/en/developer-reference#headers
|
|
||||||
*/
|
*/
|
||||||
extern const char *HEADERS;
|
extern const char *HEADERS;
|
||||||
/**
|
/**
|
||||||
* The block message transmits a single serialized block.
|
* The block message transmits a single serialized block.
|
||||||
* @see https://bitcoin.org/en/developer-reference#block
|
|
||||||
*/
|
*/
|
||||||
extern const char *BLOCK;
|
extern const char *BLOCK;
|
||||||
/**
|
/**
|
||||||
* The getaddr message requests an addr message from the receiving node,
|
* The getaddr message requests an addr message from the receiving node,
|
||||||
* preferably one with lots of IP addresses of other receiving nodes.
|
* preferably one with lots of IP addresses of other receiving nodes.
|
||||||
* @see https://bitcoin.org/en/developer-reference#getaddr
|
|
||||||
*/
|
*/
|
||||||
extern const char *GETADDR;
|
extern const char *GETADDR;
|
||||||
/**
|
/**
|
||||||
* The mempool message requests the TXIDs of transactions that the receiving
|
* The mempool message requests the TXIDs of transactions that the receiving
|
||||||
* node has verified as valid but which have not yet appeared in a block.
|
* node has verified as valid but which have not yet appeared in a block.
|
||||||
* @since protocol version 60002.
|
* @since protocol version 60002.
|
||||||
* @see https://bitcoin.org/en/developer-reference#mempool
|
|
||||||
*/
|
*/
|
||||||
extern const char *MEMPOOL;
|
extern const char *MEMPOOL;
|
||||||
/**
|
/**
|
||||||
* The ping message is sent periodically to help confirm that the receiving
|
* The ping message is sent periodically to help confirm that the receiving
|
||||||
* peer is still connected.
|
* peer is still connected.
|
||||||
* @see https://bitcoin.org/en/developer-reference#ping
|
|
||||||
*/
|
*/
|
||||||
extern const char *PING;
|
extern const char *PING;
|
||||||
/**
|
/**
|
||||||
* The pong message replies to a ping message, proving to the pinging node that
|
* The pong message replies to a ping message, proving to the pinging node that
|
||||||
* the ponging node is still alive.
|
* the ponging node is still alive.
|
||||||
* @since protocol version 60001 as described by BIP31.
|
* @since protocol version 60001 as described by BIP31.
|
||||||
* @see https://bitcoin.org/en/developer-reference#pong
|
|
||||||
*/
|
*/
|
||||||
extern const char *PONG;
|
extern const char *PONG;
|
||||||
/**
|
/**
|
||||||
* The notfound message is a reply to a getdata message which requested an
|
* The notfound message is a reply to a getdata message which requested an
|
||||||
* object the receiving node does not have available for relay.
|
* object the receiving node does not have available for relay.
|
||||||
* @since protocol version 70001.
|
* @since protocol version 70001.
|
||||||
* @see https://bitcoin.org/en/developer-reference#notfound
|
|
||||||
*/
|
*/
|
||||||
extern const char *NOTFOUND;
|
extern const char *NOTFOUND;
|
||||||
/**
|
/**
|
||||||
@ -174,7 +158,6 @@ extern const char *NOTFOUND;
|
|||||||
* @since protocol version 70001 as described by BIP37.
|
* @since protocol version 70001 as described by BIP37.
|
||||||
* Only available with service bit NODE_BLOOM since protocol version
|
* Only available with service bit NODE_BLOOM since protocol version
|
||||||
* 70011 as described by BIP111.
|
* 70011 as described by BIP111.
|
||||||
* @see https://bitcoin.org/en/developer-reference#filterload
|
|
||||||
*/
|
*/
|
||||||
extern const char *FILTERLOAD;
|
extern const char *FILTERLOAD;
|
||||||
/**
|
/**
|
||||||
@ -183,7 +166,6 @@ extern const char *FILTERLOAD;
|
|||||||
* @since protocol version 70001 as described by BIP37.
|
* @since protocol version 70001 as described by BIP37.
|
||||||
* Only available with service bit NODE_BLOOM since protocol version
|
* Only available with service bit NODE_BLOOM since protocol version
|
||||||
* 70011 as described by BIP111.
|
* 70011 as described by BIP111.
|
||||||
* @see https://bitcoin.org/en/developer-reference#filteradd
|
|
||||||
*/
|
*/
|
||||||
extern const char *FILTERADD;
|
extern const char *FILTERADD;
|
||||||
/**
|
/**
|
||||||
@ -192,7 +174,6 @@ extern const char *FILTERADD;
|
|||||||
* @since protocol version 70001 as described by BIP37.
|
* @since protocol version 70001 as described by BIP37.
|
||||||
* Only available with service bit NODE_BLOOM since protocol version
|
* Only available with service bit NODE_BLOOM since protocol version
|
||||||
* 70011 as described by BIP111.
|
* 70011 as described by BIP111.
|
||||||
* @see https://bitcoin.org/en/developer-reference#filterclear
|
|
||||||
*/
|
*/
|
||||||
extern const char *FILTERCLEAR;
|
extern const char *FILTERCLEAR;
|
||||||
/**
|
/**
|
||||||
@ -206,7 +187,6 @@ extern const char *REJECT;
|
|||||||
* Indicates that a node prefers to receive new block announcements via a
|
* Indicates that a node prefers to receive new block announcements via a
|
||||||
* "headers" message rather than an "inv".
|
* "headers" message rather than an "inv".
|
||||||
* @since protocol version 70012 as described by BIP130.
|
* @since protocol version 70012 as described by BIP130.
|
||||||
* @see https://bitcoin.org/en/developer-reference#sendheaders
|
|
||||||
*/
|
*/
|
||||||
extern const char *SENDHEADERS;
|
extern const char *SENDHEADERS;
|
||||||
|
|
||||||
|
@ -307,7 +307,7 @@
|
|||||||
<item row="11" column="0">
|
<item row="11" column="0">
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Current number of blocks</string>
|
<string>Current block height</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
@ -110,6 +110,12 @@
|
|||||||
<property name="text">
|
<property name="text">
|
||||||
<string>&Request payment</string>
|
<string>&Request payment</string>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="autoDefault">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="default">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
@ -194,22 +194,6 @@ void ReceiveCoinsDialog::resizeEvent(QResizeEvent *event)
|
|||||||
columnResizingFixer->stretchColumnWidth(RecentRequestsTableModel::Message);
|
columnResizingFixer->stretchColumnWidth(RecentRequestsTableModel::Message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReceiveCoinsDialog::keyPressEvent(QKeyEvent *event)
|
|
||||||
{
|
|
||||||
if (event->key() == Qt::Key_Return)
|
|
||||||
{
|
|
||||||
// press return -> submit form
|
|
||||||
if (ui->reqLabel->hasFocus() || ui->reqAmount->hasFocus() || ui->reqMessage->hasFocus())
|
|
||||||
{
|
|
||||||
event->ignore();
|
|
||||||
on_receiveButton_clicked();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this->QDialog::keyPressEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
QModelIndex ReceiveCoinsDialog::selectedRow()
|
QModelIndex ReceiveCoinsDialog::selectedRow()
|
||||||
{
|
{
|
||||||
if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
|
if(!model || !model->getRecentRequestsTableModel() || !ui->recentRequestsView->selectionModel())
|
||||||
|
@ -48,9 +48,6 @@ public Q_SLOTS:
|
|||||||
void reject() override;
|
void reject() override;
|
||||||
void accept() override;
|
void accept() override;
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void keyPressEvent(QKeyEvent *event) override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::ReceiveCoinsDialog *ui;
|
Ui::ReceiveCoinsDialog *ui;
|
||||||
GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer;
|
GUIUtil::TableViewLastColumnResizingFixer *columnResizingFixer;
|
||||||
|
@ -482,6 +482,7 @@ RPCConsole::RPCConsole(interfaces::Node& node, QWidget* parent, Qt::WindowFlags
|
|||||||
|
|
||||||
// Install event filter for up and down arrow
|
// Install event filter for up and down arrow
|
||||||
ui->lineEdit->installEventFilter(this);
|
ui->lineEdit->installEventFilter(this);
|
||||||
|
ui->lineEdit->setMaxLength(16 * 1024 * 1024);
|
||||||
ui->messagesWidget->installEventFilter(this);
|
ui->messagesWidget->installEventFilter(this);
|
||||||
|
|
||||||
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
|
connect(ui->clearButton, SIGNAL(clicked()), this, SLOT(clear()));
|
||||||
|
@ -193,17 +193,12 @@ public:
|
|||||||
|
|
||||||
TransactionRecord *index(interfaces::Wallet& wallet, int numBlocks, int idx)
|
TransactionRecord *index(interfaces::Wallet& wallet, int numBlocks, int idx)
|
||||||
{
|
{
|
||||||
if(idx >= 0 && idx < cachedWallet.size())
|
if (idx >= 0 && idx < cachedWallet.size()) {
|
||||||
{
|
|
||||||
TransactionRecord *rec = &cachedWallet[idx];
|
TransactionRecord *rec = &cachedWallet[idx];
|
||||||
|
|
||||||
// Get required locks upfront. This avoids the GUI from getting
|
|
||||||
// stuck if the core is holding the locks for a longer time - for
|
|
||||||
// example, during a wallet rescan.
|
|
||||||
//
|
|
||||||
// If a status update is needed (blocks came in since last check),
|
// If a status update is needed (blocks came in since last check),
|
||||||
// update the status of this transaction from the wallet. Otherwise,
|
// try to update the status of this transaction from the wallet.
|
||||||
// simply re-use the cached status.
|
// Otherwise, simply re-use the cached status.
|
||||||
interfaces::WalletTxStatus wtx;
|
interfaces::WalletTxStatus wtx;
|
||||||
int64_t adjustedTime;
|
int64_t adjustedTime;
|
||||||
if (rec->statusUpdateNeeded(numBlocks, parent->getChainLockHeight()) && wallet.tryGetTxStatus(rec->hash, wtx, adjustedTime)) {
|
if (rec->statusUpdateNeeded(numBlocks, parent->getChainLockHeight()) && wallet.tryGetTxStatus(rec->hash, wtx, adjustedTime)) {
|
||||||
|
@ -245,6 +245,8 @@ void GetOSRand(unsigned char *ent32)
|
|||||||
if (getentropy(ent32, NUM_OS_RANDOM_BYTES) != 0) {
|
if (getentropy(ent32, NUM_OS_RANDOM_BYTES) != 0) {
|
||||||
RandFailure();
|
RandFailure();
|
||||||
}
|
}
|
||||||
|
// Silence a compiler warning about unused function.
|
||||||
|
(void)GetDevURandom;
|
||||||
#elif defined(HAVE_GETENTROPY_RAND) && defined(MAC_OSX)
|
#elif defined(HAVE_GETENTROPY_RAND) && defined(MAC_OSX)
|
||||||
// We need a fallback for OSX < 10.12
|
// We need a fallback for OSX < 10.12
|
||||||
if (&getentropy != nullptr) {
|
if (&getentropy != nullptr) {
|
||||||
@ -254,6 +256,8 @@ void GetOSRand(unsigned char *ent32)
|
|||||||
} else {
|
} else {
|
||||||
GetDevURandom(ent32);
|
GetDevURandom(ent32);
|
||||||
}
|
}
|
||||||
|
// Silence a compiler warning about unused function.
|
||||||
|
(void)GetDevURandom;
|
||||||
#elif defined(HAVE_SYSCTL_ARND)
|
#elif defined(HAVE_SYSCTL_ARND)
|
||||||
/* FreeBSD and similar. It is possible for the call to return less
|
/* FreeBSD and similar. It is possible for the call to return less
|
||||||
* bytes than requested, so need to read in a loop.
|
* bytes than requested, so need to read in a loop.
|
||||||
@ -267,6 +271,8 @@ void GetOSRand(unsigned char *ent32)
|
|||||||
}
|
}
|
||||||
have += len;
|
have += len;
|
||||||
} while (have < NUM_OS_RANDOM_BYTES);
|
} while (have < NUM_OS_RANDOM_BYTES);
|
||||||
|
// Silence a compiler warning about unused function.
|
||||||
|
(void)GetDevURandom;
|
||||||
#else
|
#else
|
||||||
/* Fall back to /dev/urandom if there is no specific method implemented to
|
/* Fall back to /dev/urandom if there is no specific method implemented to
|
||||||
* get system entropy for this OS.
|
* get system entropy for this OS.
|
||||||
|
@ -18,9 +18,7 @@
|
|||||||
#define LOCKABLE __attribute__((lockable))
|
#define LOCKABLE __attribute__((lockable))
|
||||||
#define SCOPED_LOCKABLE __attribute__((scoped_lockable))
|
#define SCOPED_LOCKABLE __attribute__((scoped_lockable))
|
||||||
#define GUARDED_BY(x) __attribute__((guarded_by(x)))
|
#define GUARDED_BY(x) __attribute__((guarded_by(x)))
|
||||||
#define GUARDED_VAR __attribute__((guarded_var))
|
|
||||||
#define PT_GUARDED_BY(x) __attribute__((pt_guarded_by(x)))
|
#define PT_GUARDED_BY(x) __attribute__((pt_guarded_by(x)))
|
||||||
#define PT_GUARDED_VAR __attribute__((pt_guarded_var))
|
|
||||||
#define ACQUIRED_AFTER(...) __attribute__((acquired_after(__VA_ARGS__)))
|
#define ACQUIRED_AFTER(...) __attribute__((acquired_after(__VA_ARGS__)))
|
||||||
#define ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__)))
|
#define ACQUIRED_BEFORE(...) __attribute__((acquired_before(__VA_ARGS__)))
|
||||||
#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__((exclusive_lock_function(__VA_ARGS__)))
|
#define EXCLUSIVE_LOCK_FUNCTION(...) __attribute__((exclusive_lock_function(__VA_ARGS__)))
|
||||||
@ -33,14 +31,12 @@
|
|||||||
#define EXCLUSIVE_LOCKS_REQUIRED(...) __attribute__((exclusive_locks_required(__VA_ARGS__)))
|
#define EXCLUSIVE_LOCKS_REQUIRED(...) __attribute__((exclusive_locks_required(__VA_ARGS__)))
|
||||||
#define SHARED_LOCKS_REQUIRED(...) __attribute__((shared_locks_required(__VA_ARGS__)))
|
#define SHARED_LOCKS_REQUIRED(...) __attribute__((shared_locks_required(__VA_ARGS__)))
|
||||||
#define NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
|
#define NO_THREAD_SAFETY_ANALYSIS __attribute__((no_thread_safety_analysis))
|
||||||
#define ASSERT_EXCLUSIVE_LOCK(...) __attribute((assert_exclusive_lock(__VA_ARGS__)))
|
#define ASSERT_EXCLUSIVE_LOCK(...) __attribute__((assert_exclusive_lock(__VA_ARGS__)))
|
||||||
#else
|
#else
|
||||||
#define LOCKABLE
|
#define LOCKABLE
|
||||||
#define SCOPED_LOCKABLE
|
#define SCOPED_LOCKABLE
|
||||||
#define GUARDED_BY(x)
|
#define GUARDED_BY(x)
|
||||||
#define GUARDED_VAR
|
|
||||||
#define PT_GUARDED_BY(x)
|
#define PT_GUARDED_BY(x)
|
||||||
#define PT_GUARDED_VAR
|
|
||||||
#define ACQUIRED_AFTER(...)
|
#define ACQUIRED_AFTER(...)
|
||||||
#define ACQUIRED_BEFORE(...)
|
#define ACQUIRED_BEFORE(...)
|
||||||
#define EXCLUSIVE_LOCK_FUNCTION(...)
|
#define EXCLUSIVE_LOCK_FUNCTION(...)
|
||||||
|
@ -4877,7 +4877,6 @@ bool LoadExternalBlockFile(const CChainParams& chainparams, FILE* fileIn, CDiskB
|
|||||||
if (dbp)
|
if (dbp)
|
||||||
dbp->nPos = nBlockPos;
|
dbp->nPos = nBlockPos;
|
||||||
blkdat.SetLimit(nBlockPos + nSize);
|
blkdat.SetLimit(nBlockPos + nSize);
|
||||||
blkdat.SetPos(nBlockPos);
|
|
||||||
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
|
std::shared_ptr<CBlock> pblock = std::make_shared<CBlock>();
|
||||||
CBlock& block = *pblock;
|
CBlock& block = *pblock;
|
||||||
blkdat >> block;
|
blkdat >> block;
|
||||||
|
@ -81,7 +81,7 @@ bool EnsureWalletIsAvailable(CWallet * const pwallet, bool avoidException)
|
|||||||
if (avoidException) return false;
|
if (avoidException) return false;
|
||||||
if (!HasWallets()) {
|
if (!HasWallets()) {
|
||||||
throw JSONRPCError(
|
throw JSONRPCError(
|
||||||
RPC_METHOD_NOT_FOUND, "Method not found (wallet method is disabled because no wallet is loaded)");
|
RPC_WALLET_NOT_FOUND, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)");
|
||||||
}
|
}
|
||||||
throw JSONRPCError(RPC_WALLET_NOT_SPECIFIED,
|
throw JSONRPCError(RPC_WALLET_NOT_SPECIFIED,
|
||||||
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
|
"Wallet file not specified (must request wallet RPC through /wallet/<filename> uri-path).");
|
||||||
|
@ -37,6 +37,8 @@ from test_framework.blocktools import (
|
|||||||
create_coinbase,
|
create_coinbase,
|
||||||
)
|
)
|
||||||
from test_framework.messages import (
|
from test_framework.messages import (
|
||||||
|
CBlockHeader,
|
||||||
|
FromHex,
|
||||||
msg_block,
|
msg_block,
|
||||||
)
|
)
|
||||||
from test_framework.mininode import (
|
from test_framework.mininode import (
|
||||||
@ -234,6 +236,14 @@ class BlockchainTest(BitcoinTestFramework):
|
|||||||
assert isinstance(int(header['versionHex'], 16), int)
|
assert isinstance(int(header['versionHex'], 16), int)
|
||||||
assert isinstance(header['difficulty'], Decimal)
|
assert isinstance(header['difficulty'], Decimal)
|
||||||
|
|
||||||
|
# Test with verbose=False, which should return the header as hex.
|
||||||
|
header_hex = node.getblockheader(blockhash=besthash, verbose=False)
|
||||||
|
assert_is_hex_string(header_hex)
|
||||||
|
|
||||||
|
header = FromHex(CBlockHeader(), header_hex)
|
||||||
|
header.calc_sha256()
|
||||||
|
assert_equal(header.hash, besthash)
|
||||||
|
|
||||||
def _test_getdifficulty(self):
|
def _test_getdifficulty(self):
|
||||||
difficulty = self.nodes[0].getdifficulty()
|
difficulty = self.nodes[0].getdifficulty()
|
||||||
# 1 hash in 2 should be valid, so difficulty should be 1/2**31
|
# 1 hash in 2 should be valid, so difficulty should be 1/2**31
|
||||||
|
@ -486,6 +486,9 @@ class WalletTest(BitcoinTestFramework):
|
|||||||
timeout -= 0.5
|
timeout -= 0.5
|
||||||
assert_equal(len(self.nodes[0].getrawmempool()), chainlimit * 2)
|
assert_equal(len(self.nodes[0].getrawmempool()), chainlimit * 2)
|
||||||
|
|
||||||
|
# Prevent potential race condition when calling wallet RPCs right after restart
|
||||||
|
self.nodes[0].syncwithvalidationinterfacequeue()
|
||||||
|
|
||||||
node0_balance = self.nodes[0].getbalance()
|
node0_balance = self.nodes[0].getbalance()
|
||||||
# With walletrejectlongchains we will not create the tx and store it in our wallet.
|
# With walletrejectlongchains we will not create the tx and store it in our wallet.
|
||||||
assert_raises_rpc_error(-4, "Transaction has too long of a mempool chain", self.nodes[0].sendtoaddress, sending_addr, node0_balance - Decimal('0.01'))
|
assert_raises_rpc_error(-4, "Transaction has too long of a mempool chain", self.nodes[0].sendtoaddress, sending_addr, node0_balance - Decimal('0.01'))
|
||||||
|
@ -183,7 +183,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
self.restart_node(0, ['-nowallet'])
|
self.restart_node(0, ['-nowallet'])
|
||||||
assert_equal(node.listwallets(), [])
|
assert_equal(node.listwallets(), [])
|
||||||
assert_raises_rpc_error(-32601, "Method not found", node.getwalletinfo)
|
assert_raises_rpc_error(-18, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)", node.getwalletinfo)
|
||||||
|
|
||||||
self.log.info("Load first wallet")
|
self.log.info("Load first wallet")
|
||||||
loadwallet_name = node.loadwallet(wallet_names[0])
|
loadwallet_name = node.loadwallet(wallet_names[0])
|
||||||
@ -278,7 +278,7 @@ class MultiWalletTest(BitcoinTestFramework):
|
|||||||
for wallet_name in self.nodes[0].listwallets():
|
for wallet_name in self.nodes[0].listwallets():
|
||||||
self.nodes[0].unloadwallet(wallet_name)
|
self.nodes[0].unloadwallet(wallet_name)
|
||||||
assert_equal(self.nodes[0].listwallets(), [])
|
assert_equal(self.nodes[0].listwallets(), [])
|
||||||
assert_raises_rpc_error(-32601, "Method not found (wallet method is disabled because no wallet is loaded)", self.nodes[0].getwalletinfo)
|
assert_raises_rpc_error(-18, "No wallet is loaded. Load a wallet using loadwallet or create a new one with createwallet. (Note: A default wallet is no longer automatically created)", self.nodes[0].getwalletinfo)
|
||||||
|
|
||||||
# Successfully load a previously unloaded wallet
|
# Successfully load a previously unloaded wallet
|
||||||
self.nodes[0].loadwallet('w1')
|
self.nodes[0].loadwallet('w1')
|
||||||
|
47
test/lint/lint-git-commit-check.sh
Executable file
47
test/lint/lint-git-commit-check.sh
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright (c) 2020 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
#
|
||||||
|
# Linter to check that commit messages have a new line before the body
|
||||||
|
# or no body at all
|
||||||
|
|
||||||
|
export LC_ALL=C
|
||||||
|
|
||||||
|
EXIT_CODE=0
|
||||||
|
|
||||||
|
while getopts "?" opt; do
|
||||||
|
case $opt in
|
||||||
|
?)
|
||||||
|
echo "Usage: $0 [N]"
|
||||||
|
echo " COMMIT_RANGE='<commit range>' $0"
|
||||||
|
echo " $0 -?"
|
||||||
|
echo "Checks unmerged commits, the previous N commits, or a commit range."
|
||||||
|
echo "COMMIT_RANGE='47ba2c3...ee50c9e' $0"
|
||||||
|
exit ${EXIT_CODE}
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${COMMIT_RANGE}" ]; then
|
||||||
|
if [ -n "$1" ]; then
|
||||||
|
COMMIT_RANGE="HEAD~$1...HEAD"
|
||||||
|
else
|
||||||
|
MERGE_BASE=$(git merge-base HEAD master)
|
||||||
|
COMMIT_RANGE="$MERGE_BASE..HEAD"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
while IFS= read -r commit_hash || [[ -n "$commit_hash" ]]; do
|
||||||
|
n_line=0
|
||||||
|
while IFS= read -r line || [[ -n "$line" ]]; do
|
||||||
|
n_line=$((n_line+1))
|
||||||
|
length=${#line}
|
||||||
|
if [ $n_line -eq 2 ] && [ $length -ne 0 ]; then
|
||||||
|
echo "The subject line of commit hash ${commit_hash} is followed by a non-empty line. Subject lines should always be followed by a blank line."
|
||||||
|
EXIT_CODE=1
|
||||||
|
fi
|
||||||
|
done < <(git log --format=%B -n 1 "$commit_hash")
|
||||||
|
done < <(git log "${COMMIT_RANGE}" --format=%H)
|
||||||
|
|
||||||
|
exit ${EXIT_CODE}
|
Loading…
Reference in New Issue
Block a user