Module continuous_delivery_scripts.detect_secrets
Check tracked files against the project's recorded secret registry.
Expand source code
#
# Copyright (C) 2020-2026 Arm Limited or its affiliates and Contributors. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
"""Check tracked files against the project's recorded secret registry."""
import argparse
import logging
import subprocess
import sys
from pathlib import Path
from typing import List, Optional
from continuous_delivery_scripts.update_secrets_registry import (
_determine_exclude_files,
_get_secrets_baseline_file,
_get_secrets_baseline_filename,
)
from continuous_delivery_scripts.utils.git_helpers import ProjectGitWrapper
from continuous_delivery_scripts.utils.logging import log_exception, set_log_level
logger = logging.getLogger(__name__)
def _generate_detect_secrets_hook_command_list(
baseline_file: Path, exclude_files: List[str], tracked_files: List[str]
) -> List[str]:
command = ["detect-secrets-hook", "--baseline", str(baseline_file)]
for exclude_file in exclude_files:
command.extend(["--exclude-files", exclude_file])
command.extend(tracked_files)
return command
def _filter_tracked_files(tracked_files: List[str], project_root: Path, registry_file: Path) -> List[str]:
"""Remove the registry file from tracked files to avoid scanning recorded accepted findings."""
try:
registry_relative_path = registry_file.relative_to(project_root).as_posix()
except ValueError:
return tracked_files
return [path for path in tracked_files if path != registry_relative_path]
def detect_secrets(baseline_file: Optional[Path] = None) -> None:
"""Check tracked files so new secrets are not introduced."""
git = ProjectGitWrapper()
project_root = Path(str(git.root))
resolved_baseline = _get_secrets_baseline_file(baseline_file)
tracked_files = _filter_tracked_files(git.list_tracked_files(), project_root, resolved_baseline)
if not tracked_files:
logger.info("No tracked files found for detect-secrets.")
return
subprocess.check_call(
_generate_detect_secrets_hook_command_list(resolved_baseline, _determine_exclude_files(), tracked_files),
cwd=str(project_root),
)
def main() -> int:
"""Script CLI."""
parser = argparse.ArgumentParser(
description=(
"Check tracked files against the recorded secret registry so new secrets are not committed. "
"This uses Yelp detect-secrets (https://github.com/Yelp/detect-secrets)."
)
)
parser.add_argument(
"-r",
"--registry-file",
default=Path(_get_secrets_baseline_filename()),
help="Secret registry file to use.",
type=Path,
)
parser.add_argument(
"-v",
"--verbose",
action="count",
default=0,
help="Verbosity, by default errors are reported.",
)
args = parser.parse_args()
set_log_level(args.verbose)
try:
detect_secrets(args.registry_file)
return 0
except Exception as e:
log_exception(logger, e)
return 1
if __name__ == "__main__":
sys.exit(main())
Functions
def detect_secrets(baseline_file: Optional[pathlib.Path] = None) ‑> None-
Check tracked files so new secrets are not introduced.
Expand source code
def detect_secrets(baseline_file: Optional[Path] = None) -> None: """Check tracked files so new secrets are not introduced.""" git = ProjectGitWrapper() project_root = Path(str(git.root)) resolved_baseline = _get_secrets_baseline_file(baseline_file) tracked_files = _filter_tracked_files(git.list_tracked_files(), project_root, resolved_baseline) if not tracked_files: logger.info("No tracked files found for detect-secrets.") return subprocess.check_call( _generate_detect_secrets_hook_command_list(resolved_baseline, _determine_exclude_files(), tracked_files), cwd=str(project_root), ) def main() ‑> int-
Script CLI.
Expand source code
def main() -> int: """Script CLI.""" parser = argparse.ArgumentParser( description=( "Check tracked files against the recorded secret registry so new secrets are not committed. " "This uses Yelp detect-secrets (https://github.com/Yelp/detect-secrets)." ) ) parser.add_argument( "-r", "--registry-file", default=Path(_get_secrets_baseline_filename()), help="Secret registry file to use.", type=Path, ) parser.add_argument( "-v", "--verbose", action="count", default=0, help="Verbosity, by default errors are reported.", ) args = parser.parse_args() set_log_level(args.verbose) try: detect_secrets(args.registry_file) return 0 except Exception as e: log_exception(logger, e) return 1