Some checks failed
AITBC CI/CD Pipeline / lint-and-test (3.11) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.12) (push) Has been cancelled
AITBC CI/CD Pipeline / lint-and-test (3.13) (push) Has been cancelled
AITBC CI/CD Pipeline / test-cli (push) Has been cancelled
AITBC CI/CD Pipeline / test-services (push) Has been cancelled
AITBC CI/CD Pipeline / test-production-services (push) Has been cancelled
AITBC CI/CD Pipeline / security-scan (push) Has been cancelled
AITBC CI/CD Pipeline / build (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-staging (push) Has been cancelled
AITBC CI/CD Pipeline / deploy-production (push) Has been cancelled
AITBC CI/CD Pipeline / performance-test (push) Has been cancelled
AITBC CI/CD Pipeline / docs (push) Has been cancelled
AITBC CI/CD Pipeline / release (push) Has been cancelled
AITBC CI/CD Pipeline / notify (push) Has been cancelled
Security Scanning / Bandit Security Scan (apps/coordinator-api/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (cli/aitbc_cli) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-core/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-crypto/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (packages/py/aitbc-sdk/src) (push) Has been cancelled
Security Scanning / Bandit Security Scan (tests) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (javascript) (push) Has been cancelled
Security Scanning / CodeQL Security Analysis (python) (push) Has been cancelled
Security Scanning / Dependency Security Scan (push) Has been cancelled
Security Scanning / Container Security Scan (push) Has been cancelled
Security Scanning / OSSF Scorecard (push) Has been cancelled
Security Scanning / Security Summary Report (push) Has been cancelled
AITBC CLI Level 1 Commands Test / test-cli-level1 (3.11) (push) Has been cancelled
AITBC CLI Level 1 Commands Test / test-cli-level1 (3.12) (push) Has been cancelled
AITBC CLI Level 1 Commands Test / test-cli-level1 (3.13) (push) Has been cancelled
AITBC CLI Level 1 Commands Test / test-summary (push) Has been cancelled
- Refactor _InProcessBroadcast.subscribe to use asynccontextmanager for cleaner resource cleanup - Remove manual release callback in _InProcessSubscriber - Update file-based wallet send to submit transactions via blockchain RPC - Fetch balance and nonce from chain before sending transactions - Add tx_hash and status tracking to local transaction history - Enhance run_subprocess to support additional kwargs and return Comp
32 lines
1.3 KiB
Python
32 lines
1.3 KiB
Python
import subprocess
|
|
import sys
|
|
from typing import List, Optional, Union, Any
|
|
from . import error, output
|
|
|
|
def run_subprocess(cmd: List[str], check: bool = True, capture_output: bool = True, shell: bool = False, **kwargs: Any) -> Optional[Union[str, subprocess.CompletedProcess]]:
|
|
"""Run a subprocess command safely with logging"""
|
|
try:
|
|
if shell:
|
|
# When shell=True, cmd should be a string
|
|
cmd_str = " ".join(cmd) if isinstance(cmd, list) else cmd
|
|
result = subprocess.run(cmd_str, shell=True, check=check, capture_output=capture_output, text=True, **kwargs)
|
|
else:
|
|
result = subprocess.run(cmd, check=check, capture_output=capture_output, text=True, **kwargs)
|
|
|
|
if capture_output:
|
|
return result.stdout.strip()
|
|
return result
|
|
|
|
except subprocess.CalledProcessError as e:
|
|
error(f"Command failed with exit code {e.returncode}")
|
|
if capture_output and getattr(e, 'stderr', None):
|
|
print(e.stderr, file=sys.stderr)
|
|
if check:
|
|
sys.exit(e.returncode)
|
|
return getattr(e, 'stdout', None) if capture_output else None
|
|
except Exception as e:
|
|
error(f"Failed to execute command: {e}")
|
|
if check:
|
|
sys.exit(1)
|
|
return None
|