From ee8c22eb6a4f04e51110156e092744318cb76700 Mon Sep 17 00:00:00 2001
From: fanquake <fanquake@gmail.com>
Date: Mon, 16 Mar 2026 19:54:10 +0800
Subject: [PATCH] contrib: fix whitespace issues in scripts

---
 contrib/init/bitcoind.openrc                  |  2 +-
 contrib/macdeploy/macdeployqtplus             | 74 +++++++++----------
 contrib/qos/tc.sh                             | 10 +--
 contrib/verify-commits/gpg.sh                 | 46 ++++++------
 test/lint/test_runner/src/lint_text_format.rs |  4 -
 5 files changed, 66 insertions(+), 70 deletions(-)

diff --git a/contrib/init/bitcoind.openrc b/contrib/init/bitcoind.openrc
index 013a1a607027cd715043b7f13fe5580e044adb18..30e7be36fcf458f93fcb38e40682f7a180ac1c9f 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 bb693e73058534206b009027e5c740af8fcb1991..c8244af1532fad92596032b5f82fa6d8f082fe4e 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 2c48fc2a268f1ea62ce3779850fc20e1ba6fa534..4e4237084e1d054e6b0308f8f527d925ae3883c3 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 3579a70a699c61183019bbf56ae63e71462d842d..bcb117f19a05de103f841f31b85880392f8915f5 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 1f7d540d9114beb2646cb7d06babf4e612138742..120e9a71db12eb034b97403b1130a85eb9fa89dc 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()
