Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 16 additions & 13 deletions Docker/Sonar/sonar.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from rich import box
from rich.text import Text
from rich.progress import Progress, SpinnerColumn, BarColumn, TextColumn
from rich.prompt import Confirm
except ImportError:
print("Error: This script requires the 'rich' library.")
print("Please install it using: pip install rich")
Expand Down Expand Up @@ -845,6 +846,7 @@ def main():
parser.add_argument("--detailed", action="store_true", help="Show detailed breakdown of digests")
parser.add_argument("--output", choices=['table', 'json'], default='table', help="Output format (default: table)")
parser.add_argument("--debug-log", action="store_true", help="Enable debug logging to file")
parser.add_argument("--force", action="store_true", help="Force deletion without interactive prompt")

args = parser.parse_args()

Expand All @@ -857,21 +859,22 @@ def main():
[ (o) ] <<< SONAR >>>
[/bold cyan]""")

parser = argparse.ArgumentParser(description="Sonar - A Docker image inspector for Cloudsmith.")
parser.add_argument("org", help="Cloudsmith Organization/User")
parser.add_argument("repo", help="Cloudsmith Repository")
parser.add_argument("img", nargs="?", help="Image Name (Optional - if omitted, scans all images)")
parser.add_argument("--untagged", action="store_true", help="Find untagged manifest lists")
parser.add_argument("--untagged-delete", action="store_true", help="Delete untagged manifest lists")
parser.add_argument("--delete-all", action="store_true", help="Delete ALL detected manifest lists")
parser.add_argument("--delete-tag", help="Delete manifest lists matching this specific tag")
parser.add_argument("--detailed", action="store_true", help="Show detailed breakdown of digests")
parser.add_argument("--output", choices=['table', 'json',], default='table', help="Output format (default: table)")
parser.add_argument("--debug-log", action="store_true", help="Enable debug logging to file")

args = parser.parse_args()
logger.info(f"Arguments: {args}")

# Interactive Confirmation for Deletion
Copy link

Copilot AI Jan 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider adding a comment above this block to explain the purpose of the interactive confirmation. For example: "Prompt user for confirmation before executing any deletion operations unless --force flag is provided."

Suggested change
# Interactive Confirmation for Deletion
# Prompt user for confirmation before executing any deletion operations unless --force flag is provided

Copilot uses AI. Check for mistakes.
if (args.untagged_delete or args.delete_all or args.delete_tag) and not args.force:
console.print(f"[bold red]WARNING: You have selected options that will DELETE packages from {args.org}/{args.repo}[/bold red]")
if args.untagged_delete:
console.print("[red] - Deleting: Untagged manifest lists[/red]")
if args.delete_all:
console.print("[red] - Deleting: ALL detected manifest lists[/red]")
if args.delete_tag:
console.print(f"[red] - Deleting: Manifest lists with tag '{args.delete_tag}'[/red]")

Copy link

Copilot AI Jan 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Trailing whitespace detected at the end of this line. Remove the extra spaces for cleaner code formatting.

Suggested change

Copilot uses AI. Check for mistakes.
if not Confirm.ask("Are you sure you want to proceed?"):
console.print("[bold red]Deletion cancelled by user.[/bold red]")
sys.exit(0)

images_to_scan = []

if args.img:
Expand Down
Loading