mirror of
https://github.com/dashpay/dash.git
synced 2024-12-24 19:42:46 +01:00
Merge pull request #5718 from knst/mac-improvements
backport: bitcoin#24603, #26694, #24669, #22546, #22199, #25817 (mac build)
This commit is contained in:
parent
a8573c942f
commit
7c966c9db0
17
Makefile.am
17
Makefile.am
@ -36,7 +36,6 @@ OSX_APP=Dash-Qt.app
|
||||
OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
|
||||
OSX_DMG = $(OSX_VOLNAME).dmg
|
||||
OSX_TEMP_ISO = $(OSX_DMG:.dmg=).temp.iso
|
||||
OSX_BACKGROUND_IMAGE=$(top_srcdir)/contrib/macdeploy/background.tiff
|
||||
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
|
||||
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/dash.icns
|
||||
OSX_PLIST=$(top_builddir)/share/qt/Info.plist #not installed
|
||||
@ -60,7 +59,6 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/dash.ico \
|
||||
$(top_srcdir)/doc/README_windows.txt
|
||||
|
||||
OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_INSTALLER_ICONS) \
|
||||
$(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
|
||||
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
|
||||
|
||||
COVERAGE_INFO = baseline.info \
|
||||
@ -125,28 +123,17 @@ $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
||||
deploydir: $(OSX_DMG)
|
||||
else !BUILD_DARWIN
|
||||
APP_DIST_DIR=$(top_builddir)/dist
|
||||
APP_DIST_EXTRAS=$(APP_DIST_DIR)/.background/background.tiff $(APP_DIST_DIR)/.DS_Store $(APP_DIST_DIR)/Applications
|
||||
|
||||
$(APP_DIST_DIR)/Applications:
|
||||
@rm -f $@
|
||||
@cd $(@D); $(LN_S) /Applications $(@F)
|
||||
|
||||
$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
||||
|
||||
$(OSX_TEMP_ISO): $(APP_DIST_EXTRAS)
|
||||
$(OSX_TEMP_ISO): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
||||
$(XORRISOFS) -D -l -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -o $@ $(APP_DIST_DIR) -- $(if $(SOURCE_DATE_EPOCH),-volume_date all_file_dates =$(SOURCE_DATE_EPOCH))
|
||||
|
||||
$(OSX_DMG): $(OSX_TEMP_ISO)
|
||||
$(DMG) dmg "$<" "$@"
|
||||
|
||||
$(APP_DIST_DIR)/.background/background.tiff:
|
||||
$(MKDIR_P) $(@D)
|
||||
cp $(OSX_BACKGROUND_IMAGE) $@
|
||||
|
||||
$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
||||
INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) $(OSX_VOLNAME) -translations-dir=$(QT_TRANSLATION_DIR)
|
||||
|
||||
deploydir: $(APP_DIST_EXTRAS)
|
||||
deploydir: $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Dash-Qt
|
||||
endif !BUILD_DARWIN
|
||||
|
||||
appbundle: $(OSX_APP_BUILT)
|
||||
|
@ -15,5 +15,5 @@ export RUN_UNIT_TESTS_SEQUENTIAL="true"
|
||||
export RUN_UNIT_TESTS="false"
|
||||
export GOAL="install"
|
||||
export TEST_PREVIOUS_RELEASES=true
|
||||
export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.0.0 v0.16.1.1 v0.17.0.3 v18.2.2 v19.3.0"
|
||||
export PREVIOUS_RELEASES_TO_DOWNLOAD="v0.15.0.0 v0.16.1.1 v0.17.0.3 v18.2.2 v19.3.0 v20.0.1"
|
||||
export BITCOIN_CONFIG="--enable-zmq --enable-reduce-exports --disable-fuzz-binary LDFLAGS=-static-libstdc++"
|
||||
|
@ -328,7 +328,7 @@ mkdir -p "$DISTSRC"
|
||||
mkdir -p "unsigned-app-${HOST}"
|
||||
cp --target-directory="unsigned-app-${HOST}" \
|
||||
osx_volname \
|
||||
contrib/macdeploy/detached-sig-{apply,create}.sh \
|
||||
contrib/macdeploy/detached-sig-create.sh \
|
||||
"${BASEPREFIX}/${HOST}"/native/bin/dmg
|
||||
mv --target-directory="unsigned-app-${HOST}" dist
|
||||
(
|
||||
|
@ -1,27 +0,0 @@
|
||||
#!/bin/sh
|
||||
# Copyright (c) 2014-2015 The Bitcoin Core developers
|
||||
# Distributed under the MIT software license, see the accompanying
|
||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
||||
export LC_ALL=C
|
||||
set -e
|
||||
|
||||
UNSIGNED="$1"
|
||||
SIGNATURE="$2"
|
||||
ROOTDIR=dist
|
||||
OUTDIR=signed-app
|
||||
SIGNAPPLE=signapple
|
||||
|
||||
if [ -z "$UNSIGNED" ]; then
|
||||
echo "usage: $0 <unsigned app> <signature>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$SIGNATURE" ]; then
|
||||
echo "usage: $0 <unsigned app> <signature>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
${SIGNAPPLE} apply ${UNSIGNED} ${SIGNATURE}
|
||||
mv ${ROOTDIR} ${OUTDIR}
|
||||
echo "Signed: ${OUTDIR}"
|
@ -16,8 +16,7 @@
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
import plistlib
|
||||
import sys, re, os, shutil, stat, os.path
|
||||
import sys, re, os, platform, shutil, stat, subprocess, os.path
|
||||
from argparse import ArgumentParser
|
||||
from ds_store import DSStore
|
||||
from mac_alias import Alias
|
||||
@ -53,7 +52,7 @@ class FrameworkInfo(object):
|
||||
return False
|
||||
|
||||
def __str__(self):
|
||||
return f""" Framework name: {frameworkName}
|
||||
return f""" Framework name: {self.frameworkName}
|
||||
Framework directory: {self.frameworkDirectory}
|
||||
Framework path: {self.frameworkPath}
|
||||
Binary name: {self.binaryName}
|
||||
@ -85,8 +84,8 @@ class FrameworkInfo(object):
|
||||
if line == "":
|
||||
return None
|
||||
|
||||
# Don't deploy system libraries (exception for libQtuitools and libQtlucene).
|
||||
if line.startswith("/System/Library/") or line.startswith("@executable_path") or (line.startswith("/usr/lib/") and "libQt" not in line):
|
||||
# Don't deploy system libraries
|
||||
if line.startswith("/System/Library/") or line.startswith("@executable_path") or line.startswith("/usr/lib/"):
|
||||
return None
|
||||
|
||||
m = cls.reOLine.match(line)
|
||||
@ -246,56 +245,46 @@ def copyFramework(framework: FrameworkInfo, path: str, verbose: int) -> Optional
|
||||
toDir = os.path.join(path, framework.destinationDirectory)
|
||||
toPath = os.path.join(toDir, framework.binaryName)
|
||||
|
||||
if not os.path.exists(fromPath):
|
||||
raise RuntimeError(f"No file at {fromPath}")
|
||||
if framework.isDylib():
|
||||
if not os.path.exists(fromPath):
|
||||
raise RuntimeError(f"No file at {fromPath}")
|
||||
|
||||
if os.path.exists(toPath):
|
||||
return None # Already there
|
||||
if os.path.exists(toPath):
|
||||
return None # Already there
|
||||
|
||||
if not os.path.exists(toDir):
|
||||
os.makedirs(toDir)
|
||||
if not os.path.exists(toDir):
|
||||
os.makedirs(toDir)
|
||||
|
||||
shutil.copy2(fromPath, toPath)
|
||||
if verbose:
|
||||
print("Copied:", fromPath)
|
||||
print(" to:", toPath)
|
||||
shutil.copy2(fromPath, toPath)
|
||||
if verbose:
|
||||
print("Copied:", fromPath)
|
||||
print(" to:", toPath)
|
||||
else:
|
||||
to_dir = os.path.join(path, "Contents", "Frameworks", framework.frameworkName)
|
||||
if os.path.exists(to_dir):
|
||||
return None # Already there
|
||||
|
||||
from_dir = framework.frameworkPath
|
||||
if not os.path.exists(from_dir):
|
||||
raise RuntimeError(f"No directory at {from_dir}")
|
||||
|
||||
shutil.copytree(from_dir, to_dir, symlinks=True)
|
||||
if verbose:
|
||||
print("Copied:", from_dir)
|
||||
print(" to:", to_dir)
|
||||
|
||||
headers_link = os.path.join(to_dir, "Headers")
|
||||
if os.path.exists(headers_link):
|
||||
os.unlink(headers_link)
|
||||
|
||||
headers_dir = os.path.join(to_dir, framework.binaryDirectory, "Headers")
|
||||
if os.path.exists(headers_dir):
|
||||
shutil.rmtree(headers_dir)
|
||||
|
||||
permissions = os.stat(toPath)
|
||||
if not permissions.st_mode & stat.S_IWRITE:
|
||||
os.chmod(toPath, permissions.st_mode | stat.S_IWRITE)
|
||||
|
||||
if not framework.isDylib(): # Copy resources for real frameworks
|
||||
|
||||
linkfrom = os.path.join(path, "Contents","Frameworks", framework.frameworkName, "Versions", "Current")
|
||||
linkto = framework.version
|
||||
if not os.path.exists(linkfrom):
|
||||
os.symlink(linkto, linkfrom)
|
||||
print("Linked:", linkfrom, "->", linkto)
|
||||
fromResourcesDir = framework.sourceResourcesDirectory
|
||||
if os.path.exists(fromResourcesDir):
|
||||
toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
|
||||
shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
|
||||
if verbose:
|
||||
print("Copied resources:", fromResourcesDir)
|
||||
print(" to:", toResourcesDir)
|
||||
fromContentsDir = framework.sourceVersionContentsDirectory
|
||||
if not os.path.exists(fromContentsDir):
|
||||
fromContentsDir = framework.sourceContentsDirectory
|
||||
if os.path.exists(fromContentsDir):
|
||||
toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory)
|
||||
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
|
||||
if verbose:
|
||||
print("Copied Contents:", fromContentsDir)
|
||||
print(" to:", toContentsDir)
|
||||
elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout)
|
||||
qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib")
|
||||
qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib")
|
||||
if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath):
|
||||
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True)
|
||||
if verbose:
|
||||
print("Copied for libQtGui:", qtMenuNibSourcePath)
|
||||
print(" to:", qtMenuNibDestinationPath)
|
||||
|
||||
return toPath
|
||||
|
||||
def deployFrameworks(frameworks: List[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo:
|
||||
@ -351,115 +340,20 @@ def deployFrameworksForAppBundle(applicationBundle: ApplicationBundleInfo, strip
|
||||
return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose)
|
||||
|
||||
def deployPlugins(appBundleInfo: ApplicationBundleInfo, deploymentInfo: DeploymentInfo, strip: bool, verbose: int):
|
||||
# Lookup available plugins, exclude unneeded
|
||||
plugins = []
|
||||
if deploymentInfo.pluginPath is None:
|
||||
return
|
||||
for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath):
|
||||
pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath)
|
||||
if pluginDirectory == "designer":
|
||||
# Skip designer plugins
|
||||
|
||||
if pluginDirectory not in ['styles', 'platforms']:
|
||||
continue
|
||||
elif pluginDirectory == "printsupport":
|
||||
# Skip printsupport plugins
|
||||
continue
|
||||
elif pluginDirectory == "imageformats":
|
||||
# Skip imageformats plugins
|
||||
continue
|
||||
elif pluginDirectory == "sqldrivers":
|
||||
# Deploy the sql plugins only if QtSql is in use
|
||||
if not deploymentInfo.usesFramework("QtSql"):
|
||||
continue
|
||||
elif pluginDirectory == "script":
|
||||
# Deploy the script plugins only if QtScript is in use
|
||||
if not deploymentInfo.usesFramework("QtScript"):
|
||||
continue
|
||||
elif pluginDirectory == "qmltooling" or pluginDirectory == "qml1tooling":
|
||||
# Deploy the qml plugins only if QtDeclarative is in use
|
||||
if not deploymentInfo.usesFramework("QtDeclarative"):
|
||||
continue
|
||||
elif pluginDirectory == "bearer":
|
||||
# Deploy the bearer plugins only if QtNetwork is in use
|
||||
if not deploymentInfo.usesFramework("QtNetwork"):
|
||||
continue
|
||||
elif pluginDirectory == "position":
|
||||
# Deploy the position plugins only if QtPositioning is in use
|
||||
if not deploymentInfo.usesFramework("QtPositioning"):
|
||||
continue
|
||||
elif pluginDirectory == "sensors" or pluginDirectory == "sensorgestures":
|
||||
# Deploy the sensor plugins only if QtSensors is in use
|
||||
if not deploymentInfo.usesFramework("QtSensors"):
|
||||
continue
|
||||
elif pluginDirectory == "audio" or pluginDirectory == "playlistformats":
|
||||
# Deploy the audio plugins only if QtMultimedia is in use
|
||||
if not deploymentInfo.usesFramework("QtMultimedia"):
|
||||
continue
|
||||
elif pluginDirectory == "mediaservice":
|
||||
# Deploy the mediaservice plugins only if QtMultimediaWidgets is in use
|
||||
if not deploymentInfo.usesFramework("QtMultimediaWidgets"):
|
||||
continue
|
||||
elif pluginDirectory == "canbus":
|
||||
# Deploy the canbus plugins only if QtSerialBus is in use
|
||||
if not deploymentInfo.usesFramework("QtSerialBus"):
|
||||
continue
|
||||
elif pluginDirectory == "webview":
|
||||
# Deploy the webview plugins only if QtWebView is in use
|
||||
if not deploymentInfo.usesFramework("QtWebView"):
|
||||
continue
|
||||
elif pluginDirectory == "gamepads":
|
||||
# Deploy the webview plugins only if QtGamepad is in use
|
||||
if not deploymentInfo.usesFramework("QtGamepad"):
|
||||
continue
|
||||
elif pluginDirectory == "geoservices":
|
||||
# Deploy the webview plugins only if QtLocation is in use
|
||||
if not deploymentInfo.usesFramework("QtLocation"):
|
||||
continue
|
||||
elif pluginDirectory == "texttospeech":
|
||||
# Deploy the texttospeech plugins only if QtTextToSpeech is in use
|
||||
if not deploymentInfo.usesFramework("QtTextToSpeech"):
|
||||
continue
|
||||
elif pluginDirectory == "virtualkeyboard":
|
||||
# Deploy the virtualkeyboard plugins only if QtVirtualKeyboard is in use
|
||||
if not deploymentInfo.usesFramework("QtVirtualKeyboard"):
|
||||
continue
|
||||
elif pluginDirectory == "sceneparsers":
|
||||
# Deploy the virtualkeyboard plugins only if Qt3DCore is in use
|
||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
||||
continue
|
||||
elif pluginDirectory == "renderplugins":
|
||||
# Deploy the renderplugins plugins only if Qt3DCore is in use
|
||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
||||
continue
|
||||
elif pluginDirectory == "geometryloaders":
|
||||
# Deploy the geometryloaders plugins only if Qt3DCore is in use
|
||||
if not deploymentInfo.usesFramework("Qt3DCore"):
|
||||
continue
|
||||
|
||||
for pluginName in filenames:
|
||||
pluginPath = os.path.join(pluginDirectory, pluginName)
|
||||
if pluginName.endswith("_debug.dylib"):
|
||||
# Skip debug plugins
|
||||
|
||||
if pluginName.split('.')[0] not in ['libqminimal', 'libqcocoa', 'libqmacstyle']:
|
||||
continue
|
||||
elif pluginPath == "imageformats/libqsvg.dylib" or pluginPath == "iconengines/libqsvgicon.dylib":
|
||||
# Deploy the svg plugins only if QtSvg is in use
|
||||
if not deploymentInfo.usesFramework("QtSvg"):
|
||||
continue
|
||||
elif pluginPath == "accessible/libqtaccessiblecompatwidgets.dylib":
|
||||
# Deploy accessibility for Qt3Support only if the Qt3Support is in use
|
||||
if not deploymentInfo.usesFramework("Qt3Support"):
|
||||
continue
|
||||
elif pluginPath == "graphicssystems/libqglgraphicssystem.dylib":
|
||||
# Deploy the opengl graphicssystem plugin only if QtOpenGL is in use
|
||||
if not deploymentInfo.usesFramework("QtOpenGL"):
|
||||
continue
|
||||
elif pluginPath == "accessible/libqtaccessiblequick.dylib":
|
||||
# Deploy the accessible qtquick plugin only if QtQuick is in use
|
||||
if not deploymentInfo.usesFramework("QtQuick"):
|
||||
continue
|
||||
elif pluginPath == "platforminputcontexts/libqtvirtualkeyboardplugin.dylib":
|
||||
# Deploy the virtualkeyboardplugin plugin only if QtVirtualKeyboard is in use
|
||||
if not deploymentInfo.usesFramework("QtVirtualKeyboard"):
|
||||
continue
|
||||
|
||||
plugins.append((pluginDirectory, pluginName))
|
||||
|
||||
@ -527,6 +421,9 @@ if os.path.exists(appname + ".dmg"):
|
||||
print("+ Removing existing DMG +")
|
||||
os.unlink(appname + ".dmg")
|
||||
|
||||
if os.path.exists(appname + ".temp.dmg"):
|
||||
os.unlink(appname + ".temp.dmg")
|
||||
|
||||
# ------------------------------------------------
|
||||
|
||||
target = os.path.join("dist", "Dash-Qt.app")
|
||||
@ -644,6 +541,25 @@ ds.close()
|
||||
|
||||
# ------------------------------------------------
|
||||
|
||||
if platform.system() == "Darwin":
|
||||
subprocess.check_call(f"codesign --deep --force --sign - {target}", shell=True)
|
||||
|
||||
print("+ Installing background.tiff +")
|
||||
|
||||
bg_path = os.path.join('dist', '.background', 'background.tiff')
|
||||
os.mkdir(os.path.dirname(bg_path))
|
||||
|
||||
tiff_path = os.path.join('contrib', 'macdeploy', 'background.tiff')
|
||||
shutil.copy2(tiff_path, bg_path)
|
||||
|
||||
# ------------------------------------------------
|
||||
|
||||
print("+ Generating symlink for /Applications +")
|
||||
|
||||
os.symlink("/Applications", os.path.join('dist', "Applications"))
|
||||
|
||||
# ------------------------------------------------
|
||||
|
||||
if config.dmg is not None:
|
||||
|
||||
print("+ Preparing .dmg disk image +")
|
||||
@ -667,19 +583,6 @@ if config.dmg is not None:
|
||||
print("Attaching temp image...")
|
||||
output = run(["hdiutil", "attach", tempname, "-readwrite"], check=True, universal_newlines=True, stdout=PIPE).stdout
|
||||
|
||||
m = re.search(r"/Volumes/(.+$)", output)
|
||||
disk_root = m.group(0)
|
||||
|
||||
print("+ Applying fancy settings +")
|
||||
|
||||
bg_path = os.path.join(disk_root, ".background", os.path.basename('background.tiff'))
|
||||
os.mkdir(os.path.dirname(bg_path))
|
||||
if verbose:
|
||||
print('background.tiff', "->", bg_path)
|
||||
shutil.copy2('contrib/macdeploy/background.tiff', bg_path)
|
||||
|
||||
os.symlink("/Applications", os.path.join(disk_root, "Applications"))
|
||||
|
||||
print("+ Finalizing .dmg disk image +")
|
||||
|
||||
run(["hdiutil", "detach", f"/Volumes/{appname}"], universal_newlines=True)
|
||||
|
@ -134,6 +134,9 @@ $(package)_config_opts_darwin += -no-feature-corewlan
|
||||
$(package)_config_opts_darwin += -no-freetype
|
||||
$(package)_config_opts_darwin += QMAKE_MACOSX_DEPLOYMENT_TARGET=$(OSX_MIN_VERSION)
|
||||
|
||||
# Optimizing using > -O1 causes non-determinism when building across arches.
|
||||
$(package)_config_opts_aarch64_darwin += "QMAKE_CFLAGS_OPTIMIZE_FULL = -O1"
|
||||
|
||||
ifneq ($(build_os),darwin)
|
||||
$(package)_config_opts_darwin += -xplatform macx-clang-linux
|
||||
$(package)_config_opts_darwin += -device-option MAC_SDK_PATH=$(OSX_SDK)
|
||||
|
@ -30,11 +30,12 @@ from test_framework.util import (
|
||||
class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
def set_test_params(self):
|
||||
self.setup_clean_chain = True
|
||||
self.num_nodes = 6
|
||||
self.num_nodes = 7
|
||||
# Add new version after each release:
|
||||
self.extra_args = [
|
||||
[], # Pre-release: use to mine blocks
|
||||
["-nowallet"], # Pre-release: use to receive coins, swap wallets, etc
|
||||
["-nowallet"], # v20.0.1
|
||||
["-nowallet"], # v19.3.0
|
||||
["-nowallet"], # v18.2.2
|
||||
["-nowallet"], # v0.17.0.3
|
||||
@ -51,6 +52,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
None,
|
||||
None,
|
||||
19030000,
|
||||
19030000,
|
||||
18020200,
|
||||
170003,
|
||||
160101,
|
||||
@ -68,7 +70,8 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
res = self.nodes[self.num_nodes - 1].getblockchaininfo()
|
||||
assert_equal(res['blocks'], 101)
|
||||
|
||||
node_master = self.nodes[self.num_nodes - 5]
|
||||
node_master = self.nodes[self.num_nodes - 6]
|
||||
node_v20 = self.nodes[self.num_nodes - 5]
|
||||
node_v19 = self.nodes[self.num_nodes - 4]
|
||||
node_v18 = self.nodes[self.num_nodes - 3]
|
||||
node_v17 = self.nodes[self.num_nodes - 2]
|
||||
@ -117,6 +120,13 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
assert info['private_keys_enabled'] == False
|
||||
assert info['keypoolsize'] == 0
|
||||
|
||||
# w1_v20: regular wallet, created with v20.0
|
||||
node_v20.createwallet(wallet_name="w1_v20")
|
||||
wallet = node_v20.get_wallet_rpc("w1_v20")
|
||||
info = wallet.getwalletinfo()
|
||||
assert info['private_keys_enabled']
|
||||
assert info['keypoolsize'] > 0
|
||||
|
||||
# w2_v19: wallet with private keys disabled, created with v0.19
|
||||
node_v19.createwallet(wallet_name="w2_v19", disable_private_keys=True)
|
||||
wallet = node_v19.get_wallet_rpc("w2_v19")
|
||||
@ -155,6 +165,7 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
|
||||
# Copy the wallets to older nodes:
|
||||
node_master_wallets_dir = os.path.join(node_master.datadir, "regtest/wallets")
|
||||
node_v20_wallets_dir = os.path.join(node_v20.datadir, "regtest/wallets")
|
||||
node_v19_wallets_dir = os.path.join(node_v19.datadir, "regtest/wallets")
|
||||
node_v18_wallets_dir = os.path.join(node_v18.datadir, "regtest/wallets")
|
||||
node_v17_wallets_dir = os.path.join(node_v17.datadir, "regtest/wallets")
|
||||
@ -199,6 +210,34 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
os.path.join(node_v19_wallets_dir, wallet)
|
||||
)
|
||||
|
||||
# Copy wallets to v0.20
|
||||
for wallet in os.listdir(node_master_wallets_dir):
|
||||
shutil.copytree(
|
||||
os.path.join(node_master_wallets_dir, wallet),
|
||||
os.path.join(node_v20_wallets_dir, wallet)
|
||||
)
|
||||
|
||||
# Open the wallets in v0.20
|
||||
node_v20.loadwallet("w1")
|
||||
wallet = node_v20.get_wallet_rpc("w1")
|
||||
info = wallet.getwalletinfo()
|
||||
assert info['private_keys_enabled']
|
||||
assert info['keypoolsize'] > 0
|
||||
txs = wallet.listtransactions()
|
||||
assert_equal(len(txs), 1)
|
||||
|
||||
node_v20.loadwallet("w2")
|
||||
wallet = node_v20.get_wallet_rpc("w2")
|
||||
info = wallet.getwalletinfo()
|
||||
assert info['private_keys_enabled'] == False
|
||||
assert info['keypoolsize'] == 0
|
||||
|
||||
node_v20.loadwallet("w3")
|
||||
wallet = node_v20.get_wallet_rpc("w3")
|
||||
info = wallet.getwalletinfo()
|
||||
assert info['private_keys_enabled']
|
||||
assert info['keypoolsize'] == 0
|
||||
|
||||
# Open the wallets in v0.19
|
||||
node_v19.loadwallet("w1")
|
||||
wallet = node_v19.get_wallet_rpc("w1")
|
||||
@ -277,15 +316,15 @@ class BackwardsCompatibilityTest(BitcoinTestFramework):
|
||||
# assert_raises_rpc_error(-4, "Wallet loading failed.", node_v17.loadwallet, 'w3_v18')
|
||||
|
||||
# Instead, we stop node and try to launch it with the wallet:
|
||||
self.stop_node(4)
|
||||
self.stop_node(5)
|
||||
# it expected to fail with error 'DBErrors::TOO_NEW' but Dash Core can open v18 by version 17
|
||||
# can be implemented in future if there's any incompatible versions
|
||||
#node_v17.assert_start_raises_init_error(["-wallet=w3_v18"], "Error: Error loading w3_v18: Wallet requires newer version of Dash Core")
|
||||
#node_v17.assert_start_raises_init_error(["-wallet=w3"], "Error: Error loading w3: Wallet requires newer version of Dash Core")
|
||||
self.start_node(4)
|
||||
self.start_node(5)
|
||||
|
||||
# Open most recent wallet in v0.16 (no loadwallet RPC)
|
||||
self.restart_node(5, extra_args=["-wallet=w2"])
|
||||
self.restart_node(6, extra_args=["-wallet=w2"])
|
||||
wallet = node_v16.get_wallet_rpc("w2")
|
||||
info = wallet.getwalletinfo()
|
||||
assert info['keypoolsize'] == 1
|
||||
|
@ -21,6 +21,18 @@ import hashlib
|
||||
|
||||
|
||||
SHA256_SUMS = {
|
||||
"d1f7121a7d7bdd4077709284076860389d6a0f4481a934ad9acb85cae3d7b83e": "dashcore-20.0.1-aarch64-linux-gnu.tar.gz",
|
||||
"37375229e5ab18d7050b729fb016df24acdd72d60bc3fa074270d89030a27827": "dashcore-20.0.1-arm-linux-gnueabihf.tar.gz",
|
||||
"ab530f72d2bfbfcd7fca0644e3ea5c5b279e2204fe50ff7bd9cc452a0d413c65": "dashcore-20.0.1-arm64-apple-darwin.dmg",
|
||||
"8f4b55e4a3d6bb38a0c1f51ece14f387fd4dcffa000aeecfbbd1f751da8b4446": "dashcore-20.0.1-arm64-apple-darwin.tar.gz",
|
||||
"1d9cdb00d93e8babe9f54d0ecb04c55f2cd6fd6cfaa85466aa7f95a6976d040d": "dashcore-20.0.1-riscv64-linux-gnu.tar.gz",
|
||||
"f722954c38d5b18f8290e41ca9dd833929258dcf68c9396cbbc81d241285947b": "dashcore-20.0.1-win64-setup.exe",
|
||||
"bb6d59a3eadac316e86e073a9f7ca4d28f3a2e8a59b7109d509a7368675a6f5f": "dashcore-20.0.1-win64.zip",
|
||||
"5373a84f49e4f76bd04987806f5fcde0b537fa1408e1f98370680f3f5134970f": "dashcore-20.0.1-x86_64-apple-darwin.dmg",
|
||||
"0c9344961ae5800f54ffc90af63826cdbf61acc5c442f3fab6527d528f2d9323": "dashcore-20.0.1-x86_64-apple-darwin.tar.gz",
|
||||
"7c82bdbd1c2de515d6c7245886d8c0b0044a4a9b6f74166b8d58c82cd4ae3270": "dashcore-20.0.1-x86_64-linux-gnu.tar.gz",
|
||||
"bb898a8e4c54fd5989f114673e1fee5116bf6ffa257c63397993035c390de806": "dashcore-20.0.1.tar.gz",
|
||||
#
|
||||
"a4b555b47f5f9a5a01fc5d3b543731088bd10a65dd7fa81fb552818146e424b5": "dashcore-19.3.0-aarch64-linux-gnu.tar.gz",
|
||||
"531bb188c1aea808ef6f3533d71182a51958136f6e43d9fcadaef1a5fcdd0468": "dashcore-19.3.0-osx.dmg",
|
||||
"1b4673a2bd71f9f2b593c2d71386e60f4744b59b57142707f0045ed49c92024b": "dashcore-19.3.0-osx64.tar.gz",
|
||||
@ -105,8 +117,11 @@ def download_binary(tag, args) -> int:
|
||||
if match:
|
||||
bin_path = 'releases/download/test.{}'.format(
|
||||
match.group(1), match.group(2))
|
||||
platform = args.platform
|
||||
if tag < "v20" and platform in ["x86_64-apple-darwin", "aarch64-apple-darwin"]:
|
||||
platform = "osx64"
|
||||
tarball = 'dashcore-{tag}-{platform}.tar.gz'.format(
|
||||
tag=tag[1:], platform=args.platform)
|
||||
tag=tag[1:], platform=platform)
|
||||
tarballUrl = 'https://github.com/dashpay/dash/{bin_path}/{tarball}'.format(
|
||||
bin_path=bin_path, tarball=tarball)
|
||||
|
||||
@ -147,10 +162,39 @@ def download_binary(tag, args) -> int:
|
||||
ret = subprocess.run(['tar', '-zxf', tarball, '-C', tag,
|
||||
'--strip-components=1',
|
||||
'dashcore-{tag}'.format(tag=filename, platform=args.platform)]).returncode
|
||||
if ret:
|
||||
if ret != 0:
|
||||
print(f"Failed to extract the {tag} tarball")
|
||||
return ret
|
||||
|
||||
Path(tarball).unlink()
|
||||
|
||||
if tag >= "v19" and platform == "arm64-apple-darwin":
|
||||
# Starting with v23 there are arm64 binaries for ARM (e.g. M1, M2) macs, but they have to be signed to run
|
||||
binary_path = f'{os.getcwd()}/{tag}/bin/'
|
||||
|
||||
for arm_binary in os.listdir(binary_path):
|
||||
# Is it already signed?
|
||||
ret = subprocess.run(
|
||||
['codesign', '-v', binary_path + arm_binary],
|
||||
stderr=subprocess.DEVNULL, # Suppress expected stderr output
|
||||
).returncode
|
||||
if ret == 1:
|
||||
# Have to self-sign the binary
|
||||
ret = subprocess.run(
|
||||
['codesign', '-s', '-', binary_path + arm_binary]
|
||||
).returncode
|
||||
if ret != 0:
|
||||
print(f"Failed to self-sign {tag} {arm_binary} arm64 binary")
|
||||
return 1
|
||||
|
||||
# Confirm success
|
||||
ret = subprocess.run(
|
||||
['codesign', '-v', binary_path + arm_binary]
|
||||
).returncode
|
||||
if ret != 0:
|
||||
print(f"Failed to verify the self-signed {tag} {arm_binary} arm64 binary")
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@ -212,8 +256,8 @@ def check_host(args) -> int:
|
||||
platforms = {
|
||||
'aarch64-*-linux*': 'aarch64-linux-gnu',
|
||||
'x86_64-*-linux*': 'x86_64-linux-gnu',
|
||||
'x86_64-apple-darwin*': 'osx64',
|
||||
'aarch64-apple-darwin*': 'osx64',
|
||||
'x86_64-apple-darwin*': 'x86_64-apple-darwin',
|
||||
'aarch64-apple-darwin*': 'aarch64-apple-darwin',
|
||||
}
|
||||
args.platform = ''
|
||||
for pattern, target in platforms.items():
|
||||
|
Loading…
Reference in New Issue
Block a user