contrib: fix whitespace issues in scripts
What changed, and why it matters
This commit is a code cleanup that fixes inconsistent whitespace (tabs vs. spaces, trailing spaces) in several helper scripts and removes those files from a linting exclusion list. It does not change any program logic, behavior, or security settings.
No security action needed; this is a routine style/lint maintenance commit.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff is purely cosmetic: it normalizes indentation and removes trailing whitespace in contrib/init/bitcoind.openrc, contrib/macdeploy/macdeployqtplus, contrib/qos/tc.sh, contrib/verify-commits/gpg.sh, and updates test/lint/test_runner/src/lint_text_format.rs to stop excluding those files from whitespace lint checks. No functional code in Bitcoin Core’s consensus, networking, wallet, or RPC layers is modified.
Changed components
contrib/init/bitcoind.openrccontrib/macdeploy/macdeployqtpluscontrib/qos/tc.shcontrib/verify-commits/gpg.shtest/lint/test_runner/src/lint_text_format.rsInspect captured patch +66 / −70
diff --git a/contrib/init/bitcoind.openrc b/contrib/init/bitcoind.openrc
index 013a1a60..30e7be36 100644
--- a/contrib/init/bitcoind.openrc
+++ b/contrib/init/bitcoind.openrc
@@ -1,6 +1,6 @@
#!/sbin/openrc-run
-# backward compatibility for existing gentoo layout
+# backward compatibility for existing gentoo layout
#
if [ -d "/var/lib/bitcoin/.bitcoin" ]; then
BITCOIND_DEFAULT_DATADIR="/var/lib/bitcoin/.bitcoin"
diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus
index bb693e73..c8244af1 100755
--- a/contrib/macdeploy/macdeployqtplus
+++ b/contrib/macdeploy/macdeployqtplus
@@ -42,13 +42,13 @@ class FrameworkInfo(object):
self.sourceContentsDirectory = ""
self.destinationResourcesDirectory = ""
self.destinationVersionContentsDirectory = ""
-
+
def __eq__(self, other):
if self.__class__ == other.__class__:
return self.__dict__ == other.__dict__
else:
return False
-
+
def __str__(self):
return f""" Framework name: {self.frameworkName}
Framework directory: {self.frameworkDirectory}
@@ -62,51 +62,51 @@ class FrameworkInfo(object):
Source file Path: {self.sourceFilePath}
Deployed Directory (relative to bundle): {self.destinationDirectory}
"""
-
+
def isDylib(self):
return self.frameworkName.endswith(".dylib")
-
+
def isQtFramework(self):
if self.isDylib():
return self.frameworkName.startswith("libQt")
else:
return self.frameworkName.startswith("Qt")
-
+
reOLine = re.compile(r'^(.+) \(compatibility version [0-9.]+, current version [0-9.]+\)$')
bundleFrameworkDirectory = "Contents/Frameworks"
bundleBinaryDirectory = "Contents/MacOS"
-
+
@classmethod
def fromLibraryLine(cls, line: str) -> Optional['FrameworkInfo']:
# Note: line must be trimmed
if line == "":
return None
-
+
# 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)
if m is None:
raise RuntimeError(f"Line could not be parsed: {line}")
-
+
path = m.group(1)
-
+
info = cls()
info.sourceFilePath = path
info.installName = path
-
+
if path.endswith(".dylib"):
dirname, filename = os.path.split(path)
info.frameworkName = filename
info.frameworkDirectory = dirname
info.frameworkPath = path
-
+
info.binaryDirectory = dirname
info.binaryName = filename
info.binaryPath = path
info.version = "-"
-
+
info.installName = path
info.deployedInstallName = f"@executable_path/../Frameworks/{info.binaryName}"
info.sourceFilePath = path
@@ -121,25 +121,25 @@ class FrameworkInfo(object):
i += 1
if i == len(parts):
raise RuntimeError(f"Could not find .framework or .dylib in line: {line}")
-
+
info.frameworkName = parts[i]
info.frameworkDirectory = "/".join(parts[:i])
info.frameworkPath = os.path.join(info.frameworkDirectory, info.frameworkName)
-
+
info.binaryName = parts[i+3]
info.binaryDirectory = "/".join(parts[i+1:i+3])
info.binaryPath = os.path.join(info.binaryDirectory, info.binaryName)
info.version = parts[i+2]
-
+
info.deployedInstallName = f"@executable_path/../Frameworks/{os.path.join(info.frameworkName, info.binaryPath)}"
info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory)
-
+
info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources")
info.sourceContentsDirectory = os.path.join(info.frameworkPath, "Contents")
info.sourceVersionContentsDirectory = os.path.join(info.frameworkPath, "Versions", info.version, "Contents")
info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources")
info.destinationVersionContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Versions", info.version, "Contents")
-
+
return info
class ApplicationBundleInfo(object):
@@ -289,45 +289,45 @@ def copyFramework(framework: FrameworkInfo, path: str, verbose: int) -> Optional
def deployFrameworks(frameworks: list[FrameworkInfo], bundlePath: str, binaryPath: str, strip: bool, verbose: int, deploymentInfo: Optional[DeploymentInfo] = None) -> DeploymentInfo:
if deploymentInfo is None:
deploymentInfo = DeploymentInfo()
-
+
while len(frameworks) > 0:
framework = frameworks.pop(0)
deploymentInfo.deployedFrameworks.append(framework.frameworkName)
-
+
print("Processing", framework.frameworkName, "...")
-
+
# Get the Qt path from one of the Qt frameworks
if deploymentInfo.qtPath is None and framework.isQtFramework():
deploymentInfo.detectQtPath(framework.frameworkDirectory)
-
+
if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath):
print(framework.frameworkName, "already deployed, skipping.")
continue
-
+
# install_name_tool the new id into the binary
changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose)
-
+
# Copy framework to app bundle.
deployedBinaryPath = copyFramework(framework, bundlePath, verbose)
# Skip the rest if already was deployed.
if deployedBinaryPath is None:
continue
-
+
if strip:
runStrip(deployedBinaryPath, verbose)
-
+
# install_name_tool it a new id.
changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose)
# Check for framework dependencies
dependencies = getFrameworks(deployedBinaryPath, verbose, rpath=framework.frameworkDirectory)
-
+
for dependency in dependencies:
changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose)
-
+
# Deploy framework if necessary.
if dependency.frameworkName not in deploymentInfo.deployedFrameworks and dependency not in frameworks:
frameworks.append(dependency)
-
+
return deploymentInfo
def deployFrameworksForAppBundle(applicationBundle: ApplicationBundleInfo, strip: bool, verbose: int) -> DeploymentInfo:
@@ -355,29 +355,29 @@ def deployPlugins(appBundleInfo: ApplicationBundleInfo, deploymentInfo: Deployme
continue
plugins.append((pluginDirectory, pluginName))
-
+
for pluginDirectory, pluginName in plugins:
print("Processing plugin", os.path.join(pluginDirectory, pluginName), "...")
-
+
sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName)
destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory)
if not os.path.exists(destinationDirectory):
os.makedirs(destinationDirectory)
-
+
destinationPath = os.path.join(destinationDirectory, pluginName)
shutil.copy2(sourcePath, destinationPath)
if verbose:
print("Copied:", sourcePath)
print(" to:", destinationPath)
-
+
if strip:
runStrip(destinationPath, verbose)
-
+
dependencies = getFrameworks(destinationPath, verbose)
-
+
for dependency in dependencies:
changeInstallName(dependency.installName, dependency.deployedInstallName, destinationPath, verbose)
-
+
# Deploy framework if necessary.
if dependency.frameworkName not in deploymentInfo.deployedFrameworks:
deployFrameworks([dependency], appBundleInfo.path, destinationPath, strip, verbose, deploymentInfo)
@@ -446,7 +446,7 @@ except RuntimeError as e:
if config.plugins:
print("+ Deploying plugins +")
-
+
try:
deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose)
except RuntimeError as e:
diff --git a/contrib/qos/tc.sh b/contrib/qos/tc.sh
index 2c48fc2a..4e423708 100755
--- a/contrib/qos/tc.sh
+++ b/contrib/qos/tc.sh
@@ -34,9 +34,9 @@ tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10
tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11
if [ -n "${LOCALNET_V6}" ] ; then
- # v6 cannot have the same priority value as v4
- tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10
- tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11
+ # v6 cannot have the same priority value as v4
+ tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10
+ tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11
fi
#delete any existing rules
@@ -57,6 +57,6 @@ iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V4} -j M
iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2
if [ -n "${LOCALNET_V6}" ] ; then
- ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
- ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
+ ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
+ ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8333 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4
fi
diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh
index 3579a70a..bcb117f1 100755
--- a/contrib/verify-commits/gpg.sh
+++ b/contrib/verify-commits/gpg.sh
@@ -9,27 +9,27 @@ if [ "$BITCOIN_VERIFY_COMMITS_ALLOW_SHA1" = 1 ]; then
printf '%s\n' "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
exit $?
else
- # Note how we've disabled SHA1 with the --weak-digest option, disabling
- # signatures - including selfsigs - that use SHA1. While you might think that
- # collision attacks shouldn't be an issue as they'd be an attack on yourself,
- # in fact because what's being signed is a commit object that's
- # semi-deterministically generated by untrusted input (the pull-req) in theory
- # an attacker could construct a pull-req that results in a commit object that
- # they've created a collision for. Not the most likely attack, but preventing
- # it is pretty easy so we do so as a "belt-and-suspenders" measure.
- for LINE in $(gpg --version); do
- case "$LINE" in
- "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*)
- echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr
- printf '%s\n' "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
- exit $?
- ;;
- # We assume if you're running 2.1+, you're probably running 2.1.10+
- # gpg will fail otherwise
- # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+
- # gpg will fail otherwise
- esac
- done
- printf '%s\n' "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null
- exit $?
+ # Note how we've disabled SHA1 with the --weak-digest option, disabling
+ # signatures - including selfsigs - that use SHA1. While you might think that
+ # collision attacks shouldn't be an issue as they'd be an attack on yourself,
+ # in fact because what's being signed is a commit object that's
+ # semi-deterministically generated by untrusted input (the pull-req) in theory
+ # an attacker could construct a pull-req that results in a commit object that
+ # they've created a collision for. Not the most likely attack, but preventing
+ # it is pretty easy so we do so as a "belt-and-suspenders" measure.
+ for LINE in $(gpg --version); do
+ case "$LINE" in
+ "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*)
+ echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr
+ printf '%s\n' "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
+ exit $?
+ ;;
+ # We assume if you're running 2.1+, you're probably running 2.1.10+
+ # gpg will fail otherwise
+ # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+
+ # gpg will fail otherwise
+ esac
+ done
+ printf '%s\n' "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null
+ exit $?
fi
diff --git a/test/lint/test_runner/src/lint_text_format.rs b/test/lint/test_runner/src/lint_text_format.rs
index 1f7d540d..120e9a71 100644
--- a/test/lint/test_runner/src/lint_text_format.rs
+++ b/test/lint/test_runner/src/lint_text_format.rs
@@ -18,13 +18,9 @@ fn get_pathspecs_exclude_whitespace() -> Vec<String> {
"contrib/windeploy/win-codesign.cert",
"doc/README_windows.txt",
// Temporary excludes, or existing violations
- "contrib/init/bitcoind.openrc",
- "contrib/macdeploy/macdeployqtplus",
"src/qt/res/src/*.svg",
"test/functional/test_framework/crypto/ellswift_decode_test_vectors.csv",
"test/functional/test_framework/crypto/xswiftec_inv_test_vectors.csv",
- "contrib/qos/tc.sh",
- "contrib/verify-commits/gpg.sh",
"test/lint/git-subtree-check.sh",
]
.iter()
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.