Copy disabled (too large)
Download .txt
Showing preview only (26,616K chars total). Download the full file to get everything.
Repository: anchore/syft
Branch: main
Commit: 860126c650c2
Files: 2510
Total size: 24.9 MB
Directory structure:
gitextract_49r_9_lv/
├── .binny.yaml
├── .bouncer.yaml
├── .chronicle.yaml
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── actions/
│ │ └── bootstrap/
│ │ └── action.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── scripts/
│ │ ├── capability-drift-check.sh
│ │ ├── check_binary_fixture_size.sh
│ │ ├── ci-check.sh
│ │ ├── coverage.py
│ │ ├── find_cache_paths.py
│ │ ├── fingerprint_docker_fixtures.py
│ │ ├── go-mod-tidy-check.sh
│ │ ├── json-schema-drift-check.sh
│ │ ├── labeler.py
│ │ ├── labeler_test.py
│ │ └── trigger-release.sh
│ ├── workflows/
│ │ ├── codeql-analysis.yml
│ │ ├── dependabot-automation.yaml
│ │ ├── detect-schema-changes.yaml
│ │ ├── oss-project-board-add.yaml
│ │ ├── release.yaml
│ │ ├── remove-awaiting-response-label.yaml
│ │ ├── test-fixture-cache-publish.yaml
│ │ ├── update-anchore-dependencies.yml
│ │ ├── update-bootstrap-tools.yml
│ │ ├── update-cpe-dictionary-index.yml
│ │ ├── update-spdx-license-list.yaml
│ │ ├── validate-github-actions.yaml
│ │ └── validations.yaml
│ └── zizmor.yml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTORS.md
├── Dockerfile
├── Dockerfile.debug
├── Dockerfile.nonroot
├── LICENSE
├── Makefile
├── README.md
├── RELEASE.md
├── SECURITY.md
├── Taskfile.yaml
├── artifacthub-repo.yml
├── cmd/
│ └── syft/
│ ├── cli/
│ │ ├── cli.go
│ │ └── ui/
│ │ ├── __snapshots__/
│ │ │ ├── handle_attestation_test.snap
│ │ │ ├── handle_cataloger_task_test.snap
│ │ │ ├── handle_fetch_image_test.snap
│ │ │ ├── handle_file_indexing_test.snap
│ │ │ ├── handle_pull_docker_image_test.snap
│ │ │ ├── handle_pull_source_test.snap
│ │ │ └── handle_read_image_test.snap
│ │ ├── handle_attestation.go
│ │ ├── handle_attestation_test.go
│ │ ├── handle_cataloger_task.go
│ │ ├── handle_cataloger_task_test.go
│ │ ├── handle_fetch_image.go
│ │ ├── handle_fetch_image_test.go
│ │ ├── handle_file_indexing.go
│ │ ├── handle_file_indexing_test.go
│ │ ├── handle_pull_containerd_image.go
│ │ ├── handle_pull_docker_image.go
│ │ ├── handle_pull_docker_image_test.go
│ │ ├── handle_pull_source.go
│ │ ├── handle_pull_source_test.go
│ │ ├── handle_read_image.go
│ │ ├── handle_read_image_test.go
│ │ ├── handler.go
│ │ ├── new_task_progress.go
│ │ └── util_test.go
│ ├── internal/
│ │ ├── clio_setup_config.go
│ │ ├── commands/
│ │ │ ├── attest.go
│ │ │ ├── attest_test.go
│ │ │ ├── cataloger.go
│ │ │ ├── cataloger_info.go
│ │ │ ├── cataloger_info_test.go
│ │ │ ├── cataloger_list.go
│ │ │ ├── cataloger_list_test.go
│ │ │ ├── commands_test.go
│ │ │ ├── convert.go
│ │ │ ├── packages.go
│ │ │ ├── packages_test.go
│ │ │ ├── root.go
│ │ │ ├── scan.go
│ │ │ ├── scan_test.go
│ │ │ ├── testdata/
│ │ │ │ └── scan-configs/
│ │ │ │ ├── no-legacy-options.yaml
│ │ │ │ ├── with-base-path.yaml
│ │ │ │ ├── with-default-pull-source.yaml
│ │ │ │ ├── with-exclude-binary-overlap-by-ownership.yaml
│ │ │ │ ├── with-file-section.yaml
│ │ │ │ └── with-file-string.yaml
│ │ │ ├── update.go
│ │ │ ├── update_test.go
│ │ │ └── utils.go
│ │ ├── constants.go
│ │ ├── options/
│ │ │ ├── attest.go
│ │ │ ├── cache.go
│ │ │ ├── cache_test.go
│ │ │ ├── catalog.go
│ │ │ ├── catalog_test.go
│ │ │ ├── cataloger_selection.go
│ │ │ ├── cataloger_selection_test.go
│ │ │ ├── compliance.go
│ │ │ ├── config.go
│ │ │ ├── dotnet.go
│ │ │ ├── file.go
│ │ │ ├── file_test.go
│ │ │ ├── format.go
│ │ │ ├── format_cyclonedx_json.go
│ │ │ ├── format_cyclonedx_json_test.go
│ │ │ ├── format_cyclonedx_xml.go
│ │ │ ├── format_cyclonedx_xml_test.go
│ │ │ ├── format_spdx_json.go
│ │ │ ├── format_spdx_json_test.go
│ │ │ ├── format_syft_json.go
│ │ │ ├── format_syft_json_test.go
│ │ │ ├── format_template.go
│ │ │ ├── golang.go
│ │ │ ├── java.go
│ │ │ ├── javascript.go
│ │ │ ├── license.go
│ │ │ ├── linux_kernel.go
│ │ │ ├── nix.go
│ │ │ ├── output.go
│ │ │ ├── output_file.go
│ │ │ ├── output_test.go
│ │ │ ├── pkg.go
│ │ │ ├── python.go
│ │ │ ├── registry.go
│ │ │ ├── registry_test.go
│ │ │ ├── relationships.go
│ │ │ ├── secret.go
│ │ │ ├── source.go
│ │ │ ├── source_test.go
│ │ │ ├── unknowns.go
│ │ │ ├── update_check.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── test/
│ │ │ └── integration/
│ │ │ ├── .gitignore
│ │ │ ├── all_layers_squashed_comparison_test.go
│ │ │ ├── catalog_packages_cases_test.go
│ │ │ ├── catalog_packages_test.go
│ │ │ ├── distro_test.go
│ │ │ ├── encode_decode_cycle_test.go
│ │ │ ├── files_test.go
│ │ │ ├── go_compiler_detection_test.go
│ │ │ ├── java_purl_test.go
│ │ │ ├── mariner_distroless_test.go
│ │ │ ├── node_packages_test.go
│ │ │ ├── package_binary_elf_relationships_test.go
│ │ │ ├── package_cataloger_convention_test.go
│ │ │ ├── package_catalogers_represented_test.go
│ │ │ ├── package_deduplication_test.go
│ │ │ ├── package_ownership_relationship_test.go
│ │ │ ├── regression_apk_scanner_buffer_size_test.go
│ │ │ ├── regression_go_bin_scanner_arch_test.go
│ │ │ ├── regression_java_no_main_package_test.go
│ │ │ ├── regression_java_virtualpath_test.go
│ │ │ ├── regression_photon_package_test.go
│ │ │ ├── regression_sbom_duplicate_relationships_test.go
│ │ │ ├── rust_audit_binary_test.go
│ │ │ ├── sbom_cataloger_test.go
│ │ │ ├── sbom_metadata_component_test.go
│ │ │ ├── sqlite_rpmdb_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── files/
│ │ │ │ │ └── somewhere/
│ │ │ │ │ └── there/
│ │ │ │ │ └── is/
│ │ │ │ │ ├── a/
│ │ │ │ │ │ └── file
│ │ │ │ │ └── a-small-file
│ │ │ │ ├── image-distro-id/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-go-bin-arch-coverage/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── app.go
│ │ │ │ │ ├── go.mod
│ │ │ │ │ └── test
│ │ │ │ ├── image-golang-compiler/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-no-main-package/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-virtualpath-regression/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── extract.py
│ │ │ │ ├── image-large-apk-data/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-mariner-distroless/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-os-binary-overlap/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-owning-package/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-photon-all-layers/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-pkg-coverage/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── conan/
│ │ │ │ │ │ └── conanfile.txt
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── os-release
│ │ │ │ │ ├── hackage/
│ │ │ │ │ │ ├── cabal.project.freeze
│ │ │ │ │ │ └── stack.yaml
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ └── apk/
│ │ │ │ │ │ └── db/
│ │ │ │ │ │ └── installed
│ │ │ │ │ ├── pkgs/
│ │ │ │ │ │ ├── dotnet/
│ │ │ │ │ │ │ └── TestLibrary.deps.json
│ │ │ │ │ │ ├── erlang/
│ │ │ │ │ │ │ └── accept.app
│ │ │ │ │ │ ├── github-actions/
│ │ │ │ │ │ │ └── .github/
│ │ │ │ │ │ │ └── workflows/
│ │ │ │ │ │ │ └── validations.yaml
│ │ │ │ │ │ ├── go/
│ │ │ │ │ │ │ └── go.mod
│ │ │ │ │ │ ├── homebrew/
│ │ │ │ │ │ │ └── Cellar/
│ │ │ │ │ │ │ └── afflib/
│ │ │ │ │ │ │ └── 1.2.3/
│ │ │ │ │ │ │ └── .brew/
│ │ │ │ │ │ │ └── afflib.rb
│ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ ├── generate-fixtures.md
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── javascript/
│ │ │ │ │ │ │ └── package-json/
│ │ │ │ │ │ │ └── package.json
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ └── apk/
│ │ │ │ │ │ │ └── db/
│ │ │ │ │ │ │ └── installed
│ │ │ │ │ │ ├── nix/
│ │ │ │ │ │ │ └── store/
│ │ │ │ │ │ │ └── h0cnbmfcn93xm5dg2x27ixhag1cwndga-glibc-2.34-210-bin/
│ │ │ │ │ │ │ └── share/
│ │ │ │ │ │ │ └── man/
│ │ │ │ │ │ │ └── glibc.1
│ │ │ │ │ │ ├── opam/
│ │ │ │ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ │ │ │ └── opam
│ │ │ │ │ │ ├── php/
│ │ │ │ │ │ │ ├── .registry/
│ │ │ │ │ │ │ │ └── .channel.pecl.php.net/
│ │ │ │ │ │ │ │ └── memcached.reg
│ │ │ │ │ │ │ └── vendor/
│ │ │ │ │ │ │ └── composer/
│ │ │ │ │ │ │ └── installed.json
│ │ │ │ │ │ ├── python/
│ │ │ │ │ │ │ ├── dist-info/
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ ├── egg-info/
│ │ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ ├── requires/
│ │ │ │ │ │ │ │ ├── requirements-dev.txt
│ │ │ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ │ │ └── test-requirements.txt
│ │ │ │ │ │ │ ├── setup/
│ │ │ │ │ │ │ │ └── setup.py
│ │ │ │ │ │ │ ├── someotherpkg-3.19.0-py3.8.egg-info/
│ │ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── somerequests-3.22.0.dist-info/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── r/
│ │ │ │ │ │ │ └── base/
│ │ │ │ │ │ │ └── DESCRIPTION
│ │ │ │ │ │ ├── rockspec/
│ │ │ │ │ │ │ └── kong-3.7.0-0.rockspec
│ │ │ │ │ │ ├── ruby/
│ │ │ │ │ │ │ └── specifications/
│ │ │ │ │ │ │ ├── bundler.gemspec
│ │ │ │ │ │ │ └── default/
│ │ │ │ │ │ │ └── unbundler.gemspec
│ │ │ │ │ │ ├── var/
│ │ │ │ │ │ │ ├── db/
│ │ │ │ │ │ │ │ └── pkg/
│ │ │ │ │ │ │ │ └── app-containers/
│ │ │ │ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ │ │ │ ├── CONTENTS
│ │ │ │ │ │ │ │ ├── LICENSE
│ │ │ │ │ │ │ │ └── SIZE
│ │ │ │ │ │ │ └── lib/
│ │ │ │ │ │ │ ├── dpkg/
│ │ │ │ │ │ │ │ ├── status
│ │ │ │ │ │ │ │ └── status.d/
│ │ │ │ │ │ │ │ ├── dash
│ │ │ │ │ │ │ │ └── netbase
│ │ │ │ │ │ │ ├── pacman/
│ │ │ │ │ │ │ │ └── local/
│ │ │ │ │ │ │ │ ├── ALPM_DB_VERSION
│ │ │ │ │ │ │ │ └── pacman-6.0.1-5/
│ │ │ │ │ │ │ │ ├── desc
│ │ │ │ │ │ │ │ ├── files
│ │ │ │ │ │ │ │ └── mtree
│ │ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ │ ├── Packages
│ │ │ │ │ │ │ └── generate-fixture.sh
│ │ │ │ │ │ └── wordpress/
│ │ │ │ │ │ └── wp-content/
│ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ └── akismet/
│ │ │ │ │ │ └── akismet.php
│ │ │ │ │ ├── swift/
│ │ │ │ │ │ └── Package.resolved
│ │ │ │ │ ├── swipl/
│ │ │ │ │ │ └── pack/
│ │ │ │ │ │ └── hdt/
│ │ │ │ │ │ └── pack.pl
│ │ │ │ │ └── terraform/
│ │ │ │ │ └── .terraform.lock.hcl
│ │ │ │ ├── image-rust-auditable/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-sbom-cataloger/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── go.mod
│ │ │ │ │ └── test.spdx.json
│ │ │ │ ├── image-sbom-metadata-component/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── test.cdx.json
│ │ │ │ ├── image-sqlite-rpmdb/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-suse-all-layers/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-test-java-purls/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── extract.py
│ │ │ │ ├── image-vertical-package-dups/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── npm-lock/
│ │ │ │ │ └── package.json
│ │ │ │ └── yarn-lock/
│ │ │ │ ├── package.json
│ │ │ │ └── packages/
│ │ │ │ └── nested-package/
│ │ │ │ └── package.json
│ │ │ └── utils_test.go
│ │ └── ui/
│ │ ├── __snapshots__/
│ │ │ └── event_writer_test.snap
│ │ ├── capture.go
│ │ ├── capture_test.go
│ │ ├── event_writer.go
│ │ ├── event_writer_test.go
│ │ ├── log_writer.go
│ │ ├── log_writer_test.go
│ │ ├── no_ui.go
│ │ └── ui.go
│ └── main.go
├── examples/
│ ├── README.md
│ ├── create_custom_sbom/
│ │ ├── alpine_configuration_cataloger.go
│ │ └── main.go
│ ├── create_simple_sbom/
│ │ └── main.go
│ ├── decode_sbom/
│ │ ├── alpine.syft.json
│ │ └── main.go
│ ├── select_catalogers/
│ │ └── main.go
│ ├── source_detection/
│ │ └── main.go
│ ├── source_from_image/
│ │ └── main.go
│ └── source_from_registry/
│ └── main.go
├── go.mod
├── go.sum
├── install.sh
├── internal/
│ ├── buffered_seek_reader.go
│ ├── buffered_seek_reader_test.go
│ ├── bus/
│ │ ├── bus.go
│ │ └── helpers.go
│ ├── cache/
│ │ ├── README.md
│ │ ├── bypass.go
│ │ ├── bypass_test.go
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── error_resolver.go
│ │ ├── error_resolver_test.go
│ │ ├── filesystem.go
│ │ ├── filesystem_test.go
│ │ ├── hash_type.go
│ │ ├── hash_type_test.go
│ │ ├── memory.go
│ │ ├── memory_test.go
│ │ ├── resolver.go
│ │ └── resolver_test.go
│ ├── capabilities/
│ │ ├── README.md
│ │ ├── appconfig.yaml
│ │ ├── capabilities.go
│ │ ├── evaluation.go
│ │ ├── evaluation_test.go
│ │ ├── generate/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── cataloger_config_linking.go
│ │ │ ├── cataloger_config_linking_test.go
│ │ │ ├── discover_app_config.go
│ │ │ ├── discover_app_config_test.go
│ │ │ ├── discover_cataloger_configs.go
│ │ │ ├── discover_cataloger_configs_test.go
│ │ │ ├── discover_catalogers.go
│ │ │ ├── discover_catalogers_test.go
│ │ │ ├── discover_metadata.go
│ │ │ ├── discover_metadata_test.go
│ │ │ ├── io.go
│ │ │ ├── io_test.go
│ │ │ ├── main.go
│ │ │ ├── merge.go
│ │ │ ├── merge_test.go
│ │ │ ├── metadata_check.go
│ │ │ ├── overrides.go
│ │ │ ├── testdata/
│ │ │ │ ├── cataloger/
│ │ │ │ │ ├── cataloger-with-constant/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── python/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── conflicting-names/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ ├── duplicate1/
│ │ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ │ └── duplicate2/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── custom-cataloger-different-file/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── dotnet/
│ │ │ │ │ │ ├── cataloger.go
│ │ │ │ │ │ └── types.go
│ │ │ │ │ ├── custom-cataloger-same-file/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── imported-config-type/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── kernel/
│ │ │ │ │ │ ├── cataloger.go
│ │ │ │ │ │ └── config.go
│ │ │ │ │ ├── mixed-naming-patterns/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── ruby/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── no-config-cataloger/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── javascript/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── non-config-first-param/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── binary/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── selector-expression-config/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── rust/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ └── simple-generic-cataloger/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── golang/
│ │ │ │ │ └── cataloger.go
│ │ │ │ └── config-discovery/
│ │ │ │ ├── multiple-configs/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── config.go
│ │ │ │ │ └── python/
│ │ │ │ │ └── config.go
│ │ │ │ ├── nested-config/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── golang/
│ │ │ │ │ └── config.go
│ │ │ │ ├── no-annotations/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── javascript/
│ │ │ │ │ └── config.go
│ │ │ │ └── simple-config/
│ │ │ │ └── cataloger/
│ │ │ │ └── golang/
│ │ │ │ └── config.go
│ │ │ └── util_test.go
│ │ ├── internal/
│ │ │ ├── cataloger_names.go
│ │ │ ├── fixtures.go
│ │ │ ├── load_capabilities.go
│ │ │ ├── load_capabilities_test.go
│ │ │ ├── paths.go
│ │ │ ├── repo_root.go
│ │ │ └── util_test.go
│ │ ├── model.go
│ │ ├── model_test.go
│ │ ├── pkgtestobservation/
│ │ │ └── model.go
│ │ └── util_test.go
│ ├── cmptest/
│ │ ├── common_options.go
│ │ ├── diff_reporter.go
│ │ ├── license.go
│ │ ├── location.go
│ │ ├── relationship.go
│ │ └── set.go
│ ├── constants.go
│ ├── docs.go
│ ├── err_helper.go
│ ├── evidence/
│ │ └── constants.go
│ ├── file/
│ │ ├── archive_aliases.go
│ │ ├── archive_aliases_test.go
│ │ ├── copy.go
│ │ ├── digest.go
│ │ ├── digest_test.go
│ │ ├── getter.go
│ │ ├── getter_test.go
│ │ ├── normalize_hashes.go
│ │ ├── normalize_hashes_test.go
│ │ ├── opener.go
│ │ ├── squashfs.go
│ │ ├── squashfs_test.go
│ │ ├── tar_file_traversal.go
│ │ ├── testdata/
│ │ │ ├── digest.txt
│ │ │ ├── empty.txt
│ │ │ ├── generate-zip-fixture-from-source-dir.sh
│ │ │ └── zip-source/
│ │ │ ├── b-file/
│ │ │ │ └── in-subdir.txt
│ │ │ ├── b-file.txt
│ │ │ └── some-dir/
│ │ │ └── a-file.txt
│ │ ├── zip_file_helpers_test.go
│ │ ├── zip_file_manifest.go
│ │ ├── zip_file_manifest_test.go
│ │ ├── zip_file_traversal.go
│ │ └── zip_file_traversal_test.go
│ ├── generate.go
│ ├── input.go
│ ├── jsonschema/
│ │ ├── README.md
│ │ ├── comments.go
│ │ ├── comments_test.go
│ │ └── main.go
│ ├── licenses/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── find_evidence.go
│ │ ├── find_evidence_test.go
│ │ ├── list.go
│ │ ├── scanner.go
│ │ └── testdata/
│ │ ├── Knuth-CTAN
│ │ ├── apache-license-2.0
│ │ ├── multi-license
│ │ └── nvidia-software-and-cuda-supplement
│ ├── log/
│ │ └── log.go
│ ├── mimetype/
│ │ ├── mimetype_helper.go
│ │ └── mimetype_helper_test.go
│ ├── os/
│ │ ├── feature_detection.go
│ │ ├── feature_detection_test.go
│ │ └── testdata/
│ │ ├── not_rhel/
│ │ │ ├── Dockerfile
│ │ │ ├── etc/
│ │ │ │ └── os-release
│ │ │ └── root/
│ │ │ └── buildinfo/
│ │ │ └── content_manifests/
│ │ │ └── driver-toolkit-container-v4.16.0-202411210647.p0.g1d5732f.assembly.stream.el9.json
│ │ ├── rhel_content_manifests/
│ │ │ ├── Dockerfile
│ │ │ ├── etc/
│ │ │ │ └── os-release
│ │ │ └── root/
│ │ │ └── buildinfo/
│ │ │ └── content_manifests/
│ │ │ ├── driver-toolkit-container-v4.16.0-202411210647.p0.g1d5732f.assembly.stream.el9.json
│ │ │ └── openshift-base-rhel9-container-v4.16.0-202411190033.p0.gb45ea65.assembly.stream.el9.json
│ │ └── rhel_no_manifests/
│ │ ├── Dockerfile
│ │ └── etc/
│ │ └── os-release
│ ├── packagemetadata/
│ │ ├── completion_tester.go
│ │ ├── discover_type_names.go
│ │ ├── discover_type_names_test.go
│ │ ├── generate/
│ │ │ └── main.go
│ │ ├── generated.go
│ │ ├── names.go
│ │ └── names_test.go
│ ├── redact/
│ │ └── redact.go
│ ├── regex_helpers.go
│ ├── regex_helpers_test.go
│ ├── relationship/
│ │ ├── binary/
│ │ │ ├── binary_dependencies.go
│ │ │ ├── binary_dependencies_test.go
│ │ │ ├── shared_library_index.go
│ │ │ └── shared_library_index_test.go
│ │ ├── by_file_ownership.go
│ │ ├── by_file_ownership_test.go
│ │ ├── evident_by.go
│ │ ├── evident_by_test.go
│ │ ├── exclude_binaries_by_file_ownership_overlap.go
│ │ ├── exclude_binaries_by_file_ownership_overlap_test.go
│ │ ├── index.go
│ │ ├── index_test.go
│ │ ├── remove.go
│ │ ├── sort.go
│ │ └── to_source.go
│ ├── sbomsync/
│ │ ├── builder.go
│ │ └── builder_test.go
│ ├── set.go
│ ├── set_test.go
│ ├── sourcemetadata/
│ │ ├── completion_tester.go
│ │ ├── discover_type_names.go
│ │ ├── generate/
│ │ │ └── main.go
│ │ ├── generated.go
│ │ ├── names.go
│ │ └── names_test.go
│ ├── spdxlicense/
│ │ ├── generate/
│ │ │ ├── generate_license_list.go
│ │ │ ├── generate_license_list_test.go
│ │ │ ├── license.go
│ │ │ ├── license_test.go
│ │ │ └── testdata/
│ │ │ └── licenses.json
│ │ ├── license.go
│ │ ├── license_list.go
│ │ ├── license_list_test.go
│ │ ├── license_test.go
│ │ └── license_url_test.go
│ ├── string_helpers.go
│ ├── string_helpers_test.go
│ ├── task/
│ │ ├── cataloging_config.go
│ │ ├── environment_tasks.go
│ │ ├── executor.go
│ │ ├── executor_test.go
│ │ ├── expression.go
│ │ ├── expression_test.go
│ │ ├── factory.go
│ │ ├── feature_detection.go
│ │ ├── file_tasks.go
│ │ ├── file_tasks_test.go
│ │ ├── package_task_factory.go
│ │ ├── package_task_factory_test.go
│ │ ├── package_tasks.go
│ │ ├── relationship_tasks.go
│ │ ├── scope_tasks.go
│ │ ├── selection.go
│ │ ├── selection_test.go
│ │ ├── set.go
│ │ ├── set_test.go
│ │ ├── task.go
│ │ └── unknowns_tasks.go
│ ├── testutils/
│ │ └── golden_files.go
│ ├── tmpdir/
│ │ ├── tmpdir.go
│ │ └── tmpdir_test.go
│ ├── tprint.go
│ └── unknown/
│ ├── coordinate_error.go
│ ├── coordinate_error_test.go
│ ├── path_error.go
│ └── path_error_test.go
├── schema/
│ ├── cyclonedx/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cyclonedx.json
│ │ ├── cyclonedx.xsd
│ │ ├── spdx.schema.json
│ │ └── spdx.xsd
│ ├── json/
│ │ ├── README.md
│ │ ├── schema-1.0.0.json
│ │ ├── schema-1.0.1.json
│ │ ├── schema-1.0.2.json
│ │ ├── schema-1.0.3.json
│ │ ├── schema-1.0.4.json
│ │ ├── schema-1.0.5.json
│ │ ├── schema-1.1.0.json
│ │ ├── schema-10.0.0.json
│ │ ├── schema-10.0.1.json
│ │ ├── schema-10.0.2.json
│ │ ├── schema-11.0.0.json
│ │ ├── schema-11.0.1.json
│ │ ├── schema-11.0.2.json
│ │ ├── schema-12.0.0.json
│ │ ├── schema-12.0.1.json
│ │ ├── schema-13.0.0.json
│ │ ├── schema-14.0.0.json
│ │ ├── schema-15.0.0.json
│ │ ├── schema-16.0.0.json
│ │ ├── schema-16.0.1.json
│ │ ├── schema-16.0.11.json
│ │ ├── schema-16.0.12.json
│ │ ├── schema-16.0.13.json
│ │ ├── schema-16.0.14.json
│ │ ├── schema-16.0.15.json
│ │ ├── schema-16.0.16.json
│ │ ├── schema-16.0.17.json
│ │ ├── schema-16.0.18.json
│ │ ├── schema-16.0.19.json
│ │ ├── schema-16.0.2.json
│ │ ├── schema-16.0.20.json
│ │ ├── schema-16.0.21.json
│ │ ├── schema-16.0.22.json
│ │ ├── schema-16.0.23.json
│ │ ├── schema-16.0.24.json
│ │ ├── schema-16.0.25.json
│ │ ├── schema-16.0.26.json
│ │ ├── schema-16.0.27.json
│ │ ├── schema-16.0.28.json
│ │ ├── schema-16.0.29.json
│ │ ├── schema-16.0.3.json
│ │ ├── schema-16.0.30.json
│ │ ├── schema-16.0.31.json
│ │ ├── schema-16.0.32.json
│ │ ├── schema-16.0.33.json
│ │ ├── schema-16.0.34.json
│ │ ├── schema-16.0.35.json
│ │ ├── schema-16.0.36.json
│ │ ├── schema-16.0.37.json
│ │ ├── schema-16.0.38.json
│ │ ├── schema-16.0.39.json
│ │ ├── schema-16.0.4.json
│ │ ├── schema-16.0.40.json
│ │ ├── schema-16.0.41.json
│ │ ├── schema-16.0.42.json
│ │ ├── schema-16.0.43.json
│ │ ├── schema-16.0.5.json
│ │ ├── schema-16.0.6.json
│ │ ├── schema-16.0.7.json
│ │ ├── schema-16.0.8.json
│ │ ├── schema-16.0.9.json
│ │ ├── schema-16.1.0.json
│ │ ├── schema-16.1.1.json
│ │ ├── schema-16.1.2.json
│ │ ├── schema-16.1.3.json
│ │ ├── schema-2.0.0.json
│ │ ├── schema-2.0.1.json
│ │ ├── schema-2.0.2.json
│ │ ├── schema-3.0.0.json
│ │ ├── schema-3.0.1.json
│ │ ├── schema-3.1.0.json
│ │ ├── schema-3.1.1.json
│ │ ├── schema-3.2.1.json
│ │ ├── schema-3.2.2.json
│ │ ├── schema-3.2.3.json
│ │ ├── schema-3.2.4.json
│ │ ├── schema-3.3.0.json
│ │ ├── schema-3.3.1.json
│ │ ├── schema-3.3.2.json
│ │ ├── schema-4.0.0.json
│ │ ├── schema-4.1.0.json
│ │ ├── schema-5.0.0.json
│ │ ├── schema-5.0.1.json
│ │ ├── schema-5.1.0.json
│ │ ├── schema-6.0.0.json
│ │ ├── schema-6.1.0.json
│ │ ├── schema-6.2.0.json
│ │ ├── schema-7.0.0.json
│ │ ├── schema-7.0.1.json
│ │ ├── schema-7.1.0.json
│ │ ├── schema-7.1.1.json
│ │ ├── schema-7.1.2.json
│ │ ├── schema-7.1.3.json
│ │ ├── schema-7.1.4.json
│ │ ├── schema-7.1.5.json
│ │ ├── schema-7.1.6.json
│ │ ├── schema-8.0.0.json
│ │ ├── schema-8.0.1.json
│ │ ├── schema-9.0.0.json
│ │ ├── schema-9.0.1.json
│ │ ├── schema-9.0.2.json
│ │ ├── schema-latest.json
│ │ └── vnd.syft+json
│ └── spdx-json/
│ └── spdx-schema-2.3.json
├── syft/
│ ├── artifact/
│ │ ├── id.go
│ │ └── relationship.go
│ ├── cataloging/
│ │ ├── archive_search.go
│ │ ├── compliance.go
│ │ ├── data_generation.go
│ │ ├── executor.go
│ │ ├── filecataloging/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ └── tags.go
│ │ ├── license.go
│ │ ├── pkgcataloging/
│ │ │ ├── cataloger_reference.go
│ │ │ ├── config.go
│ │ │ ├── selection.go
│ │ │ └── tags.go
│ │ ├── relationships.go
│ │ ├── search.go
│ │ ├── selection.go
│ │ └── unknowns.go
│ ├── configuration_audit_trail.go
│ ├── configuration_audit_trail_test.go
│ ├── cpe/
│ │ ├── by_source_then_specificity.go
│ │ ├── by_source_then_specificity_test.go
│ │ ├── by_specificity.go
│ │ ├── by_specificity_test.go
│ │ ├── cpe.go
│ │ ├── cpe_test.go
│ │ ├── merge_cpes.go
│ │ ├── merge_cpes_test.go
│ │ └── testdata/
│ │ └── cpe-data.json
│ ├── create_sbom.go
│ ├── create_sbom_config.go
│ ├── create_sbom_config_test.go
│ ├── event/
│ │ ├── event.go
│ │ ├── monitor/
│ │ │ └── generic_task.go
│ │ └── parsers/
│ │ └── parsers.go
│ ├── file/
│ │ ├── cataloger/
│ │ │ ├── executable/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── elf.go
│ │ │ │ ├── elf_test.go
│ │ │ │ ├── macho.go
│ │ │ │ ├── macho_test.go
│ │ │ │ ├── pe.go
│ │ │ │ ├── pe_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── elf/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── differ/
│ │ │ │ │ │ └── __main__.py
│ │ │ │ │ ├── expected_verify
│ │ │ │ │ └── project/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── lib.c
│ │ │ │ │ ├── lib.h
│ │ │ │ │ └── main.c
│ │ │ │ └── shared-info/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Makefile
│ │ │ │ └── project/
│ │ │ │ ├── Makefile
│ │ │ │ ├── hello/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ └── hello.c
│ │ │ │ └── libhello/
│ │ │ │ ├── Makefile
│ │ │ │ ├── hello.c
│ │ │ │ └── hello.h
│ │ │ ├── filecontent/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── a-path.txt
│ │ │ │ ├── another-path.txt
│ │ │ │ └── last/
│ │ │ │ ├── empty/
│ │ │ │ │ └── empty
│ │ │ │ └── path.txt
│ │ │ ├── filedigest/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── image-file-type-mix/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── file-1.txt
│ │ │ │ └── last/
│ │ │ │ ├── empty/
│ │ │ │ │ └── empty
│ │ │ │ └── path.txt
│ │ │ ├── filemetadata/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ └── image-file-type-mix/
│ │ │ │ ├── Dockerfile
│ │ │ │ └── file-1.txt
│ │ │ └── internal/
│ │ │ ├── all_regular_files.go
│ │ │ ├── all_regular_files_test.go
│ │ │ └── testdata/
│ │ │ ├── image-file-type-mix/
│ │ │ │ ├── Dockerfile
│ │ │ │ └── file-1.txt
│ │ │ └── symlinked-root/
│ │ │ └── real-root/
│ │ │ ├── file1.txt
│ │ │ └── nested/
│ │ │ └── file2.txt
│ │ ├── coordinate_set.go
│ │ ├── coordinate_set_test.go
│ │ ├── coordinates.go
│ │ ├── digest.go
│ │ ├── executable.go
│ │ ├── license.go
│ │ ├── location.go
│ │ ├── location_read_closer.go
│ │ ├── location_set.go
│ │ ├── location_set_test.go
│ │ ├── location_test.go
│ │ ├── locations.go
│ │ ├── locations_test.go
│ │ ├── metadata.go
│ │ ├── mock_resolver.go
│ │ ├── resolver.go
│ │ ├── search_result.go
│ │ ├── selection.go
│ │ └── testdata/
│ │ └── req-resp/
│ │ ├── .gitignore
│ │ ├── path/
│ │ │ └── to/
│ │ │ └── the/
│ │ │ └── file.txt
│ │ └── somewhere/
│ │ └── outside.txt
│ ├── format/
│ │ ├── common/
│ │ │ ├── cyclonedxhelpers/
│ │ │ │ ├── to_format_model.go
│ │ │ │ └── to_format_model_test.go
│ │ │ └── spdxhelpers/
│ │ │ ├── to_format_model.go
│ │ │ ├── to_format_model_test.go
│ │ │ ├── to_syft_model.go
│ │ │ └── to_syft_model_test.go
│ │ ├── cpes/
│ │ │ ├── decoder.go
│ │ │ └── decoder_test.go
│ │ ├── cyclonedxjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 1.2.json
│ │ │ │ ├── 1.3.json
│ │ │ │ ├── 1.4.json
│ │ │ │ ├── 1.5.json
│ │ │ │ ├── 1.6.json
│ │ │ │ ├── micronaut-1.4.json
│ │ │ │ ├── micronaut-1.5.json
│ │ │ │ └── micronaut-1.6.json
│ │ │ └── snapshot/
│ │ │ ├── TestCycloneDxDirectoryEncoder.golden
│ │ │ └── TestCycloneDxImageEncoder.golden
│ │ ├── cyclonedxxml/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 1.0.xml
│ │ │ │ ├── 1.1.xml
│ │ │ │ ├── 1.2.xml
│ │ │ │ ├── 1.3.xml
│ │ │ │ ├── 1.4.xml
│ │ │ │ ├── 1.5.xml
│ │ │ │ └── 1.6.xml
│ │ │ └── snapshot/
│ │ │ ├── TestCycloneDxDirectoryEncoder.golden
│ │ │ └── TestCycloneDxImageEncoder.golden
│ │ ├── decoders.go
│ │ ├── decoders_collection.go
│ │ ├── decoders_collection_test.go
│ │ ├── encoders.go
│ │ ├── encoders_collection.go
│ │ ├── encoders_collection_test.go
│ │ ├── encoders_test.go
│ │ ├── github/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ ├── internal/
│ │ │ │ └── model/
│ │ │ │ ├── github_dependency_api.go
│ │ │ │ ├── model.go
│ │ │ │ └── model_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ ├── TestGithubDirectoryEncoder.golden
│ │ │ └── TestGithubImageEncoder.golden
│ │ ├── internal/
│ │ │ ├── backfill.go
│ │ │ ├── backfill_test.go
│ │ │ ├── cyclonedxutil/
│ │ │ │ ├── decoder.go
│ │ │ │ ├── decoder_test.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── author.go
│ │ │ │ │ ├── author_test.go
│ │ │ │ │ ├── component.go
│ │ │ │ │ ├── component_test.go
│ │ │ │ │ ├── cpe.go
│ │ │ │ │ ├── cpe_test.go
│ │ │ │ │ ├── decoder.go
│ │ │ │ │ ├── decoder_test.go
│ │ │ │ │ ├── description.go
│ │ │ │ │ ├── description_test.go
│ │ │ │ │ ├── external_references.go
│ │ │ │ │ ├── external_references_test.go
│ │ │ │ │ ├── group.go
│ │ │ │ │ ├── group_test.go
│ │ │ │ │ ├── licenses.go
│ │ │ │ │ ├── licenses_test.go
│ │ │ │ │ ├── properties.go
│ │ │ │ │ ├── property_encoder.go
│ │ │ │ │ ├── property_encoder_test.go
│ │ │ │ │ ├── publisher.go
│ │ │ │ │ └── publisher_test.go
│ │ │ │ └── versions.go
│ │ │ ├── location_sorter.go
│ │ │ ├── spdxutil/
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── description.go
│ │ │ │ │ ├── description_test.go
│ │ │ │ │ ├── document_name.go
│ │ │ │ │ ├── document_name_test.go
│ │ │ │ │ ├── document_namespace.go
│ │ │ │ │ ├── document_namespace_test.go
│ │ │ │ │ ├── download_location.go
│ │ │ │ │ ├── download_location_test.go
│ │ │ │ │ ├── external_ref.go
│ │ │ │ │ ├── external_refs.go
│ │ │ │ │ ├── external_refs_test.go
│ │ │ │ │ ├── file_type.go
│ │ │ │ │ ├── h_digest.go
│ │ │ │ │ ├── h_digest_test.go
│ │ │ │ │ ├── homepage.go
│ │ │ │ │ ├── homepage_test.go
│ │ │ │ │ ├── license.go
│ │ │ │ │ ├── license_test.go
│ │ │ │ │ ├── originator_supplier.go
│ │ │ │ │ ├── originator_supplier_test.go
│ │ │ │ │ ├── relationship_type.go
│ │ │ │ │ ├── source_info.go
│ │ │ │ │ ├── source_info_test.go
│ │ │ │ │ ├── spdxid.go
│ │ │ │ │ └── spdxid_test.go
│ │ │ │ └── versions.go
│ │ │ ├── stream/
│ │ │ │ ├── seekable_reader.go
│ │ │ │ └── seekable_reader_test.go
│ │ │ └── testutil/
│ │ │ ├── directory_input.go
│ │ │ ├── file_relationships.go
│ │ │ ├── image_input.go
│ │ │ ├── redactor.go
│ │ │ ├── snapshot.go
│ │ │ └── testdata/
│ │ │ ├── image-simple/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── file-1.txt
│ │ │ │ └── file-2.txt
│ │ │ └── snapshot/
│ │ │ ├── TestImageEncoder.golden
│ │ │ ├── TestSPDXTagValueImageEncoder.golden
│ │ │ └── stereoscope-fixture-image-simple.golden
│ │ ├── purls/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ └── Test_Encoder.golden
│ │ ├── spdxjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── identify/
│ │ │ │ ├── 2.2.json
│ │ │ │ └── 2.3.json
│ │ │ ├── snapshot/
│ │ │ │ ├── TestSPDX22JSONRequredProperties.golden
│ │ │ │ ├── TestSPDXJSONDirectoryEncoder.golden
│ │ │ │ ├── TestSPDXJSONImageEncoder.golden
│ │ │ │ └── TestSPDXRelationshipOrder.golden
│ │ │ └── spdx/
│ │ │ ├── alpine-3.10.syft.spdx.json
│ │ │ ├── alpine-3.10.vendor.spdx.json
│ │ │ ├── bad/
│ │ │ │ ├── bad-sbom
│ │ │ │ ├── example7-bin.spdx.json
│ │ │ │ ├── example7-go-module.spdx.json
│ │ │ │ ├── example7-golang.spdx.json
│ │ │ │ └── example7-third-party-modules.spdx.json
│ │ │ ├── example7-bin.spdx.json
│ │ │ ├── example7-go-module.spdx.json
│ │ │ ├── example7-golang.spdx.json
│ │ │ └── example7-third-party-modules.spdx.json
│ │ ├── spdxtagvalue/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 2.1.sbom
│ │ │ │ ├── 2.2.sbom
│ │ │ │ └── 2.3.sbom
│ │ │ ├── snapshot/
│ │ │ │ ├── TestSPDXJSONSPDXIDs.golden
│ │ │ │ ├── TestSPDXRelationshipOrder.golden
│ │ │ │ ├── TestSPDXTagValueDirectoryEncoder.golden
│ │ │ │ └── TestSPDXTagValueImageEncoder.golden
│ │ │ └── tag-value.spdx
│ │ ├── syftjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ ├── model/
│ │ │ │ ├── document.go
│ │ │ │ ├── document_test.go
│ │ │ │ ├── file.go
│ │ │ │ ├── file_test.go
│ │ │ │ ├── linux_release.go
│ │ │ │ ├── linux_release_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── relationship.go
│ │ │ │ ├── secrets.go
│ │ │ │ ├── source.go
│ │ │ │ └── source_test.go
│ │ │ ├── schema_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── identify/
│ │ │ │ │ └── 11.0.0.json
│ │ │ │ ├── image-alpine/
│ │ │ │ │ └── Dockerfile
│ │ │ │ └── snapshot/
│ │ │ │ ├── TestDirectoryEncoder.golden
│ │ │ │ ├── TestEncodeFullJSONDocument.golden
│ │ │ │ └── TestImageEncoder.golden
│ │ │ ├── to_format_model.go
│ │ │ ├── to_format_model_test.go
│ │ │ ├── to_syft_model.go
│ │ │ └── to_syft_model_test.go
│ │ ├── table/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ └── TestTableEncoder.golden
│ │ ├── template/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── csv-hasField.template
│ │ │ ├── csv.template
│ │ │ ├── legacy/
│ │ │ │ ├── csv-hasField.template
│ │ │ │ └── csv.template
│ │ │ └── snapshot/
│ │ │ ├── TestFormatWithOption.golden
│ │ │ ├── TestFormatWithOptionAndHasField.golden
│ │ │ ├── TestFormatWithOptionAndHasField_Legacy.golden
│ │ │ └── TestFormatWithOption_Legacy.golden
│ │ ├── testdata/
│ │ │ └── alpine-syft.json
│ │ └── text/
│ │ ├── encoder.go
│ │ ├── encoder_test.go
│ │ └── testdata/
│ │ └── snapshot/
│ │ ├── TestTextDirectoryEncoder.golden
│ │ ├── TestTextImageEncoder.golden
│ │ └── stereoscope-fixture-image-simple.golden
│ ├── get_source.go
│ ├── get_source_config.go
│ ├── get_source_config_test.go
│ ├── get_source_test.go
│ ├── internal/
│ │ ├── fileresolver/
│ │ │ ├── chroot_context.go
│ │ │ ├── chroot_context_test.go
│ │ │ ├── container_image_all_layers.go
│ │ │ ├── container_image_all_layers_test.go
│ │ │ ├── container_image_deep_squash.go
│ │ │ ├── container_image_deep_squash_test.go
│ │ │ ├── container_image_model.go
│ │ │ ├── container_image_model_test.go
│ │ │ ├── container_image_squash.go
│ │ │ ├── container_image_squash_test.go
│ │ │ ├── deferred.go
│ │ │ ├── deferred_test.go
│ │ │ ├── directory.go
│ │ │ ├── directory_indexer.go
│ │ │ ├── directory_indexer_test.go
│ │ │ ├── directory_test.go
│ │ │ ├── directory_windows_test.go
│ │ │ ├── empty.go
│ │ │ ├── excluding_file.go
│ │ │ ├── excluding_file_test.go
│ │ │ ├── file.go
│ │ │ ├── file_indexer.go
│ │ │ ├── file_indexer_test.go
│ │ │ ├── file_metadata_by_location.go
│ │ │ ├── filetree_resolver.go
│ │ │ ├── filetree_resolver_test.go
│ │ │ ├── get_xid.go
│ │ │ ├── get_xid_win.go
│ │ │ ├── metadata.go
│ │ │ ├── metadata_test.go
│ │ │ ├── path_skipper.go
│ │ │ ├── path_skipper_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── generate-tar-fixture-from-source-dir.sh
│ │ │ │ ├── image-duplicate-path/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ └── file-2.txt
│ │ │ │ ├── image-files-deleted/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ └── target/
│ │ │ │ │ └── file-2.txt
│ │ │ │ ├── image-simple/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ └── target/
│ │ │ │ │ └── really/
│ │ │ │ │ └── nested/
│ │ │ │ │ └── file-3.txt
│ │ │ │ ├── image-symlinks/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ ├── nested/
│ │ │ │ │ │ └── nested/
│ │ │ │ │ │ └── file-3.txt
│ │ │ │ │ ├── new-file-2.txt
│ │ │ │ │ ├── new-file-4.txt
│ │ │ │ │ └── parent/
│ │ │ │ │ └── file-4.txt
│ │ │ │ ├── path-detected/
│ │ │ │ │ ├── .vimrc
│ │ │ │ │ └── empty
│ │ │ │ ├── path-detected-2/
│ │ │ │ │ ├── .vimrc
│ │ │ │ │ └── empty
│ │ │ │ ├── req-resp/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── path/
│ │ │ │ │ │ └── to/
│ │ │ │ │ │ └── the/
│ │ │ │ │ │ └── file.txt
│ │ │ │ │ └── somewhere/
│ │ │ │ │ └── outside.txt
│ │ │ │ ├── symlinked-root/
│ │ │ │ │ └── real-root/
│ │ │ │ │ ├── file1.txt
│ │ │ │ │ └── nested/
│ │ │ │ │ └── file2.txt
│ │ │ │ ├── symlinks-base/
│ │ │ │ │ ├── base
│ │ │ │ │ └── sub/
│ │ │ │ │ └── item
│ │ │ │ ├── symlinks-from-image-symlinks-fixture/
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ ├── file-3.txt
│ │ │ │ │ └── parent/
│ │ │ │ │ └── file-4.txt
│ │ │ │ ├── symlinks-loop/
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── devices/
│ │ │ │ │ └── loop0/
│ │ │ │ │ └── file.target
│ │ │ │ ├── symlinks-multiple-roots/
│ │ │ │ │ └── root/
│ │ │ │ │ └── readme
│ │ │ │ ├── symlinks-prune-indexing/
│ │ │ │ │ └── path/
│ │ │ │ │ ├── 1/
│ │ │ │ │ │ └── 2/
│ │ │ │ │ │ └── 3/
│ │ │ │ │ │ └── 4/
│ │ │ │ │ │ └── dont-index-me-twice.txt
│ │ │ │ │ ├── 5/
│ │ │ │ │ │ └── 6/
│ │ │ │ │ │ └── 7/
│ │ │ │ │ │ └── 8/
│ │ │ │ │ │ └── dont-index-me-twice-either.txt
│ │ │ │ │ └── file.txt
│ │ │ │ ├── symlinks-simple/
│ │ │ │ │ └── readme
│ │ │ │ └── system_paths/
│ │ │ │ ├── outside_root/
│ │ │ │ │ └── link_target/
│ │ │ │ │ └── place
│ │ │ │ └── target/
│ │ │ │ ├── dev/
│ │ │ │ │ └── place
│ │ │ │ ├── hierarchical-dev/
│ │ │ │ │ └── module_1/
│ │ │ │ │ └── module_1_1/
│ │ │ │ │ └── place
│ │ │ │ ├── home/
│ │ │ │ │ └── place
│ │ │ │ ├── proc/
│ │ │ │ │ └── place
│ │ │ │ └── sys/
│ │ │ │ └── place
│ │ │ ├── unindexed_directory.go
│ │ │ └── unindexed_directory_test.go
│ │ ├── parsing/
│ │ │ └── basic_parsing.go
│ │ ├── testutil/
│ │ │ └── chdir.go
│ │ ├── unionreader/
│ │ │ ├── union_reader.go
│ │ │ └── union_reader_test.go
│ │ └── windows/
│ │ ├── path.go
│ │ └── path_test.go
│ ├── lib.go
│ ├── lib_test.go
│ ├── license/
│ │ ├── license.go
│ │ └── license_test.go
│ ├── linux/
│ │ ├── identify_release.go
│ │ ├── identify_release_test.go
│ │ ├── release.go
│ │ ├── supplement_release.go
│ │ └── testdata/
│ │ ├── bad-redhat-release
│ │ ├── bad-system-release-cpe
│ │ ├── centos-8
│ │ ├── debian-8
│ │ ├── os/
│ │ │ ├── almalinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── alpine/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── amazon/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── arch/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── busybox/
│ │ │ │ ├── .gitignore
│ │ │ │ └── bin/
│ │ │ │ ├── .gitignore
│ │ │ │ └── busybox
│ │ │ ├── centos/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── centos5/
│ │ │ │ └── etc/
│ │ │ │ └── redhat-release
│ │ │ ├── centos6/
│ │ │ │ └── etc/
│ │ │ │ └── system-release-cpe
│ │ │ ├── custom/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── debian/
│ │ │ │ ├── from-debian_version/
│ │ │ │ │ └── etc/
│ │ │ │ │ ├── debian_version
│ │ │ │ │ └── os-release
│ │ │ │ └── from-os-release/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── empty/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── fedora/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── mariner/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── opensuse-leap/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── oraclelinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── photon/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── redhat/
│ │ │ │ ├── from-os-release/
│ │ │ │ │ └── usr/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── os-release
│ │ │ │ └── from-redhat-release/
│ │ │ │ └── etc/
│ │ │ │ └── redhat-release
│ │ │ ├── rockylinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── sles/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── ubuntu/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ └── wolfi/
│ │ │ └── etc/
│ │ │ └── os-release
│ │ ├── partial-fields/
│ │ │ ├── missing-id/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── missing-version/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ └── unknown-id/
│ │ │ └── usr/
│ │ │ └── lib/
│ │ │ └── os-release
│ │ ├── rhel-8
│ │ ├── ubuntu-20.04
│ │ └── unprintable
│ ├── pkg/
│ │ ├── alpm.go
│ │ ├── apk.go
│ │ ├── apk_test.go
│ │ ├── binary.go
│ │ ├── bitnami.go
│ │ ├── cataloger/
│ │ │ ├── .gitignore
│ │ │ ├── ai/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_gguf.go
│ │ │ │ ├── parse_gguf_model.go
│ │ │ │ ├── processor.go
│ │ │ │ ├── processor_test.go
│ │ │ │ ├── test_helpers_test.go
│ │ │ │ └── testdata/
│ │ │ │ └── glob-paths/
│ │ │ │ └── models/
│ │ │ │ └── model.gguf
│ │ │ ├── alpine/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_apk_db.go
│ │ │ │ ├── parse_apk_db_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── base
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── empty-deps-and-provides
│ │ │ │ ├── extra-file-attributes
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── multiple-1/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── multiple-2/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── single
│ │ │ │ └── very-large-entries
│ │ │ ├── arch/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_alpm_db.go
│ │ │ │ ├── parse_alpm_db_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── files
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── pacman/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── base-1.0/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ └── files
│ │ │ │ │ └── dive-0.10.0/
│ │ │ │ │ └── desc
│ │ │ │ ├── installed/
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── pacman/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── corrupt-0.2.1-3/
│ │ │ │ │ │ └── desc
│ │ │ │ │ ├── emacs-29.3-3/
│ │ │ │ │ │ └── desc
│ │ │ │ │ ├── fuzzy-1.2-3/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ └── files
│ │ │ │ │ ├── gmp-6.2.1-2/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ ├── files
│ │ │ │ │ │ └── mtree
│ │ │ │ │ ├── madeup-20.30-4/
│ │ │ │ │ │ └── desc
│ │ │ │ │ └── tree-sitter-0.22.6-1/
│ │ │ │ │ └── desc
│ │ │ │ └── mtree
│ │ │ ├── binary/
│ │ │ │ ├── README.md
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── classifier_cataloger.go
│ │ │ │ ├── classifier_cataloger_test.go
│ │ │ │ ├── classifiers.go
│ │ │ │ ├── classifiers_java.go
│ │ │ │ ├── classifiers_java_test.go
│ │ │ │ ├── deprecated.go
│ │ │ │ ├── elf_package.go
│ │ │ │ ├── elf_package_cataloger.go
│ │ │ │ ├── elf_package_cataloger_test.go
│ │ │ │ ├── elf_package_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── manager/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ ├── cli/
│ │ │ │ │ │ │ ├── cli.go
│ │ │ │ │ │ │ └── commands/
│ │ │ │ │ │ │ ├── add_snippet.go
│ │ │ │ │ │ │ ├── download.go
│ │ │ │ │ │ │ ├── list.go
│ │ │ │ │ │ │ ├── root.go
│ │ │ │ │ │ │ └── write_snippet.go
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── application.go
│ │ │ │ │ │ │ ├── application_test.go
│ │ │ │ │ │ │ ├── binary_from_image.go
│ │ │ │ │ │ │ ├── binary_from_image_test.go
│ │ │ │ │ │ │ └── testdata/
│ │ │ │ │ │ │ └── app-configs/
│ │ │ │ │ │ │ ├── bad-image-collision.yaml
│ │ │ │ │ │ │ ├── bad-implicit-name-collision.yaml
│ │ │ │ │ │ │ ├── bad-missing-image-platform.yaml
│ │ │ │ │ │ │ ├── bad-missing-image-ref.yaml
│ │ │ │ │ │ │ ├── bad-missing-image.yaml
│ │ │ │ │ │ │ ├── bad-missing-paths.yaml
│ │ │ │ │ │ │ ├── bad-missing-version.yaml
│ │ │ │ │ │ │ ├── bad-no-name.yaml
│ │ │ │ │ │ │ ├── valid-1.yaml
│ │ │ │ │ │ │ └── valid-2.yaml
│ │ │ │ │ │ ├── download_from_image.go
│ │ │ │ │ │ ├── download_from_image_test.go
│ │ │ │ │ │ ├── list_entries.go
│ │ │ │ │ │ ├── list_entries_test.go
│ │ │ │ │ │ ├── snippet_metadata.go
│ │ │ │ │ │ ├── snippet_metadata_test.go
│ │ │ │ │ │ ├── testdata/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── bin/
│ │ │ │ │ │ │ │ └── busybox/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ └── snippets/
│ │ │ │ │ │ │ ├── busybox/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ └── postgres/
│ │ │ │ │ │ │ └── 9.6.10/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── ui/
│ │ │ │ │ │ │ ├── action.go
│ │ │ │ │ │ │ ├── ansi.go
│ │ │ │ │ │ │ ├── binary_list.go
│ │ │ │ │ │ │ ├── error.go
│ │ │ │ │ │ │ └── title.go
│ │ │ │ │ │ ├── utils.go
│ │ │ │ │ │ └── utils_test.go
│ │ │ │ │ ├── main.go
│ │ │ │ │ └── testutil/
│ │ │ │ │ ├── snippet_or_binary.go
│ │ │ │ │ └── snippet_or_binary_test.go
│ │ │ │ ├── pe_package.go
│ │ │ │ ├── pe_package_cataloger.go
│ │ │ │ ├── pe_package_cataloger_test.go
│ │ │ │ ├── pe_package_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── capture-snippet.sh
│ │ │ │ ├── classifiers/
│ │ │ │ │ ├── negative/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── busybox
│ │ │ │ │ │ ├── go
│ │ │ │ │ │ ├── python2.6
│ │ │ │ │ │ └── traefik/
│ │ │ │ │ │ └── traefik
│ │ │ │ │ └── snippets/
│ │ │ │ │ ├── arangodb/
│ │ │ │ │ │ ├── 3.11.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── arangosh
│ │ │ │ │ │ └── 3.12.0-2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── arangosh
│ │ │ │ │ ├── bash/
│ │ │ │ │ │ └── 5.1.16/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── bash
│ │ │ │ │ ├── busybox/
│ │ │ │ │ │ └── 1.36.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── [
│ │ │ │ │ ├── chrome/
│ │ │ │ │ │ ├── 126.0.6478.182/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── chrome
│ │ │ │ │ │ └── 127.0.6533.119/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── chrome
│ │ │ │ │ ├── consul/
│ │ │ │ │ │ └── 1.15.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── consul
│ │ │ │ │ ├── dart/
│ │ │ │ │ │ ├── 2.12.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ ├── 3.0.0/
│ │ │ │ │ │ │ └── linux-arm/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ ├── 3.5.2/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ └── 3.6.0-216.1.beta/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── dart
│ │ │ │ │ ├── elixir/
│ │ │ │ │ │ └── 1.19.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── elixir
│ │ │ │ │ │ └── lib/
│ │ │ │ │ │ └── elixir/
│ │ │ │ │ │ └── ebin/
│ │ │ │ │ │ └── elixir.app
│ │ │ │ │ ├── envoy/
│ │ │ │ │ │ ├── 1.11.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.14.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.18.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.20.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.22.11/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.28.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.34.5/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.36.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ └── 1.6.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── envoy
│ │ │ │ │ ├── erlang/
│ │ │ │ │ │ ├── 25.3.2.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── erlexec
│ │ │ │ │ │ ├── 26.1.2/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── beam.smp
│ │ │ │ │ │ ├── 26.2.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── erlexec
│ │ │ │ │ │ ├── 26.2.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── liberts_internal.a
│ │ │ │ │ │ └── 27.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── beam.smp
│ │ │ │ │ ├── ffmpeg/
│ │ │ │ │ │ ├── 6.1.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── ffmpeg
│ │ │ │ │ │ └── 7.1.1/
│ │ │ │ │ │ └── darwin-arm64/
│ │ │ │ │ │ └── ffmpeg
│ │ │ │ │ ├── ffmpeg-shared-libs/
│ │ │ │ │ │ └── 5.1.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libavcodec-9aae324f.so.59.37.100
│ │ │ │ │ ├── fluent-bit/
│ │ │ │ │ │ ├── 1.3.10/
│ │ │ │ │ │ │ └── linux-arm/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ ├── 1.7.0-dev-3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ ├── 2.2.1/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ └── 3.0.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ ├── gcc/
│ │ │ │ │ │ └── 12.3.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── gcc
│ │ │ │ │ ├── go/
│ │ │ │ │ │ └── 1.21.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── go
│ │ │ │ │ ├── go-version-hint/
│ │ │ │ │ │ ├── 1.15/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION
│ │ │ │ │ │ ├── 1.15w/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION
│ │ │ │ │ │ ├── 1.21/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ ├── VERSION
│ │ │ │ │ │ │ └── go
│ │ │ │ │ │ ├── 1.25/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION.cache
│ │ │ │ │ │ └── 1.25w/
│ │ │ │ │ │ └── any/
│ │ │ │ │ │ └── VERSION
│ │ │ │ │ ├── grafana/
│ │ │ │ │ │ ├── 10.3.12/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 10.4.19/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 11.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 11.0.0-preview/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.2.0-258092/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.3.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.3.2-security-01/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.4.0-22081664032/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 6.0.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 6.7.0-test/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 6.7.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 7.5.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.2.13/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 9.2.20/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 9.3.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.4.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ └── 9.5.21/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── grafana
│ │ │ │ │ ├── gzip/
│ │ │ │ │ │ └── 1.12/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── gzip
│ │ │ │ │ ├── haproxy/
│ │ │ │ │ │ ├── 1.5.14/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 1.8.22/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 2.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 2.7.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ └── 3.1-dev0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── haproxy
│ │ │ │ │ ├── haskell-cabal/
│ │ │ │ │ │ └── 3.10.3.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── cabal
│ │ │ │ │ ├── haskell-ghc/
│ │ │ │ │ │ └── 9.6.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── ghc-9.6.5
│ │ │ │ │ ├── helm/
│ │ │ │ │ │ ├── 3.10.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── helm
│ │ │ │ │ │ └── 3.11.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── helm
│ │ │ │ │ ├── httpd/
│ │ │ │ │ │ └── 2.4.54/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── httpd
│ │ │ │ │ ├── istio_pilot-agent/
│ │ │ │ │ │ ├── 1.1.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ │ ├── 1.26.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ │ └── 1.8.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ ├── istio_pilot-discovery/
│ │ │ │ │ │ ├── 1.1.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ ├── 1.26.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ ├── 1.3.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ └── 1.8.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ ├── java-graal-openjdk/
│ │ │ │ │ │ └── 17.0.3+7-jvmci-22.1-b06/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jdk-openjdk/
│ │ │ │ │ │ └── 21.0.2+13-LTS/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── jdb
│ │ │ │ │ ├── java-jdk-oracle/
│ │ │ │ │ │ └── 1.8.0_451-b10/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── java
│ │ │ │ │ │ └── jdb
│ │ │ │ │ ├── java-jre-openjdk/
│ │ │ │ │ │ ├── 1.8.0_352-b08/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── 11.0.17/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-openjdk-arm64-eclipse/
│ │ │ │ │ │ └── 11.0.22/
│ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-openjdk-eclipse/
│ │ │ │ │ │ └── 11.0.22/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-oracle/
│ │ │ │ │ │ ├── 1.8.0_451-b10/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── 19.0.1/
│ │ │ │ │ │ ├── darwin/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-oracle-sdk/
│ │ │ │ │ │ └── 1.8.0_451-b10/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── jq/
│ │ │ │ │ │ └── 1.7.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── jq
│ │ │ │ │ ├── lighttpd/
│ │ │ │ │ │ └── 1.4.76/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── lighttpd
│ │ │ │ │ ├── mariadb/
│ │ │ │ │ │ └── 10.6.15/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mariadb
│ │ │ │ │ ├── memcached/
│ │ │ │ │ │ └── 1.6.18/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── memcached
│ │ │ │ │ ├── mongodb/
│ │ │ │ │ │ ├── 4.4.30/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 5.0.32/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 6.0.27/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 7.0.28/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ └── 8.0.17/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mongod
│ │ │ │ │ ├── mysql/
│ │ │ │ │ │ ├── 5.6.51/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mysql
│ │ │ │ │ │ ├── 8.0.34/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mysql
│ │ │ │ │ │ └── 8.0.37/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── nginx/
│ │ │ │ │ │ └── 1.25.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── nginx
│ │ │ │ │ ├── nginx-openresty/
│ │ │ │ │ │ └── 1.21.4.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── nginx
│ │ │ │ │ ├── node/
│ │ │ │ │ │ ├── 0.10.48/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ ├── 0.12.18/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ ├── 19.2.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ └── 4.9.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── node
│ │ │ │ │ ├── openssl/
│ │ │ │ │ │ ├── 1.1.1w/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── openssl
│ │ │ │ │ │ ├── 1.1.1zb/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── openssl
│ │ │ │ │ │ └── 3.1.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── openssl
│ │ │ │ │ ├── percona-server/
│ │ │ │ │ │ └── 8.0.35/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── percona-xtrabackup/
│ │ │ │ │ │ └── 8.0.35/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── xtrabackup
│ │ │ │ │ ├── percona-xtradb-cluster/
│ │ │ │ │ │ └── 8.0.34/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── perl/
│ │ │ │ │ │ ├── 5.12.5/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── perl
│ │ │ │ │ │ ├── 5.20.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── perl
│ │ │ │ │ │ └── 5.37.8/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── perl
│ │ │ │ │ ├── postgres/
│ │ │ │ │ │ ├── 15.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── 15beta4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── 9.5alpha1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ └── 9.6.24/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── postgres
│ │ │ │ │ ├── proftpd/
│ │ │ │ │ │ └── 1.3.8b/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── proftpd
│ │ │ │ │ ├── python/
│ │ │ │ │ │ └── 3.6.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── python3.6
│ │ │ │ │ ├── python-duplicates/
│ │ │ │ │ │ └── 3.8.16/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── dir/
│ │ │ │ │ │ │ └── python3.8
│ │ │ │ │ │ ├── patchlevel.h
│ │ │ │ │ │ └── python3.8
│ │ │ │ │ ├── python-shared-lib/
│ │ │ │ │ │ └── 3.7.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libpython3.7m.so.1.0
│ │ │ │ │ ├── python-with-incorrect-match/
│ │ │ │ │ │ └── 3.5.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── python3.5
│ │ │ │ │ ├── qt/
│ │ │ │ │ │ ├── 4.8.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── libQtCore.so.4.8.6
│ │ │ │ │ │ ├── 5.15.2/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── libQt5Core.so.5.15.2
│ │ │ │ │ │ └── 6.5.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libQt6Core.so.6.5.0
│ │ │ │ │ ├── redis-server/
│ │ │ │ │ │ ├── 2.8.23/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 4.0.11/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 5.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 6.0.16/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.0.14/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.2.3/
│ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ └── 7.2.5/
│ │ │ │ │ │ └── linux-unknown-454d5f333836/
│ │ │ │ │ │ └── redis-server
│ │ │ │ │ ├── ruby/
│ │ │ │ │ │ └── 1.9.3p551/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── ruby
│ │ │ │ │ ├── sqlcipher/
│ │ │ │ │ │ └── 4.5.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── sqlcipher
│ │ │ │ │ ├── swipl/
│ │ │ │ │ │ └── 9.3.8/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── swipl
│ │ │ │ │ ├── traefik/
│ │ │ │ │ │ ├── 1.7.34/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 2.10.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 2.9.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 3.0.4/
│ │ │ │ │ │ │ └── linux-riscv64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ └── 3.6.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── traefik
│ │ │ │ │ ├── util-linux/
│ │ │ │ │ │ └── 2.37.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── getopt
│ │ │ │ │ ├── valkey-server/
│ │ │ │ │ │ └── 9.0.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── valkey-server
│ │ │ │ │ ├── vault/
│ │ │ │ │ │ ├── 1.19.4/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── vault
│ │ │ │ │ │ └── 1.20.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── vault
│ │ │ │ │ ├── wp/
│ │ │ │ │ │ └── 2.9.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── wp
│ │ │ │ │ ├── xz/
│ │ │ │ │ │ └── 5.6.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── xz
│ │ │ │ │ └── zstd/
│ │ │ │ │ └── 1.5.6/
│ │ │ │ │ └── linux-amd64/
│ │ │ │ │ └── zstd
│ │ │ │ ├── config.yaml
│ │ │ │ ├── custom/
│ │ │ │ │ ├── extra/
│ │ │ │ │ │ └── foo
│ │ │ │ │ └── go-1.14/
│ │ │ │ │ └── go
│ │ │ │ ├── elf-testdata/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── elfbinwithcorrupt/
│ │ │ │ │ │ ├── elfsrc/
│ │ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ │ └── makefile
│ │ │ │ │ ├── elfbinwithnestedlib/
│ │ │ │ │ │ ├── elfsrc/
│ │ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ │ └── makefile
│ │ │ │ │ └── elfbinwithsisterlib/
│ │ │ │ │ ├── elfsrc1/
│ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ ├── elfsrc2/
│ │ │ │ │ │ ├── hello_world2.cpp
│ │ │ │ │ │ ├── hello_world2.h
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── testbin2.cpp
│ │ │ │ │ └── makefile
│ │ │ │ ├── image-busybox/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-dotnet-app/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-fedora-32bit/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-fedora-64bit/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-binary/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-jre-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-sdk-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-zulu-21/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-zulu-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-jruby/
│ │ │ │ │ └── Dockerfile
│ │ │ │ └── image-wolfi-64bit-without-version/
│ │ │ │ └── Dockerfile
│ │ │ ├── bitnami/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_components.go
│ │ │ │ └── testdata/
│ │ │ │ ├── components-json-mongodb/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── .bitnami_components.json
│ │ │ │ ├── components-json-postgresql/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── .bitnami_components.json
│ │ │ │ ├── invalid/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── redis/
│ │ │ │ │ └── .spdx-redis.spdx
│ │ │ │ ├── json/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── postgresql/
│ │ │ │ │ ├── .spdx-postgresql.spdx
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── mix/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── render-template/
│ │ │ │ │ └── .spdx-render-template.spdx
│ │ │ │ ├── no-rel/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── redis/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .spdx-redis.spdx
│ │ │ │ │ └── bin/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ └── redis-server
│ │ │ │ └── tag-value/
│ │ │ │ └── opt/
│ │ │ │ └── bitnami/
│ │ │ │ └── redis/
│ │ │ │ └── .spdx-apache.spdx
│ │ │ ├── capabilities.go
│ │ │ ├── common/
│ │ │ │ └── cpe/
│ │ │ │ ├── create.go
│ │ │ │ └── target_software_to_pkg_type.go
│ │ │ ├── conda/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── conda-meta-bad-json/
│ │ │ │ │ └── conda-meta/
│ │ │ │ │ └── package-1.2.3-pyhd8ed1ab_0.json
│ │ │ │ └── conda-meta-python-c-etc/
│ │ │ │ └── conda-meta/
│ │ │ │ ├── jupyterlab-4.4.3-pyhd8ed1ab_0.json
│ │ │ │ └── zlib-1.2.11-h90dfc92_1014.json
│ │ │ ├── cpp/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_conanfile.go
│ │ │ │ ├── parse_conanfile_test.go
│ │ │ │ ├── parse_conaninfo.go
│ │ │ │ ├── parse_conaninfo_test.go
│ │ │ │ ├── parse_conanlock.go
│ │ │ │ ├── parse_conanlock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── README.md
│ │ │ │ ├── conanfile.txt
│ │ │ │ ├── conaninfo/
│ │ │ │ │ └── mfast/
│ │ │ │ │ └── 1.2.2/
│ │ │ │ │ └── my_user/
│ │ │ │ │ └── my_channel/
│ │ │ │ │ └── package/
│ │ │ │ │ └── 9d1f076b471417647c2022a78d5e2c1f834289ac/
│ │ │ │ │ └── conaninfo.txt
│ │ │ │ └── glob-paths/
│ │ │ │ └── somewhere/
│ │ │ │ └── src/
│ │ │ │ ├── conanfile.txt
│ │ │ │ └── conaninfo.txt
│ │ │ ├── dart/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_pubspec.go
│ │ │ │ ├── parse_pubspec_lock.go
│ │ │ │ ├── parse_pubspec_lock_test.go
│ │ │ │ ├── parse_pubspec_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── spec/
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ └── pubspec.yml
│ │ │ │ └── pubspecs/
│ │ │ │ ├── appainter.pubspec.yaml
│ │ │ │ └── macros.pubspec.yaml
│ │ │ ├── debian/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_copyright.go
│ │ │ │ ├── parse_copyright_test.go
│ │ │ │ ├── parse_deb_archive.go
│ │ │ │ ├── parse_deb_archive_test.go
│ │ │ │ ├── parse_dpkg_db.go
│ │ │ │ ├── parse_dpkg_db_test.go
│ │ │ │ ├── parse_dpkg_info_files.go
│ │ │ │ ├── parse_dpkg_info_files_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── copyright/
│ │ │ │ │ ├── cuda
│ │ │ │ │ ├── dev-kit
│ │ │ │ │ ├── libaudit-common
│ │ │ │ │ ├── libc6
│ │ │ │ │ ├── liblzma5
│ │ │ │ │ ├── microsoft
│ │ │ │ │ ├── python
│ │ │ │ │ └── trilicense
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ ├── dpkg/
│ │ │ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ │ │ ├── libpam-runtime.conffiles
│ │ │ │ │ │ │ │ │ ├── libpam-runtime.md5sums
│ │ │ │ │ │ │ │ │ └── libpam-runtime.preinst
│ │ │ │ │ │ │ │ ├── status
│ │ │ │ │ │ │ │ └── status.d/
│ │ │ │ │ │ │ │ └── pkg-1.0
│ │ │ │ │ │ │ └── opkg/
│ │ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ │ └── pkg-1.0.control
│ │ │ │ │ │ │ └── status
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libpam-runtime/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ ├── status
│ │ │ │ │ └── status.d/
│ │ │ │ │ └── pkg-1.0
│ │ │ │ ├── image-distroless-deb/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libsqlite3-0/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ └── status.d/
│ │ │ │ │ ├── libsqlite3-0
│ │ │ │ │ ├── libsqlite3-0.md5sums
│ │ │ │ │ └── libsqlite3-0.preinst
│ │ │ │ ├── image-dpkg/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── os-release
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libpam-runtime/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── libpam-runtime.conffiles
│ │ │ │ │ │ ├── libpam-runtime.md5sums
│ │ │ │ │ │ └── libpam-runtime.preinst
│ │ │ │ │ └── status
│ │ │ │ ├── image-single-dpkg/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── info/
│ │ │ │ │ ├── util-linux.conffiles
│ │ │ │ │ └── zlib1g.md5sums
│ │ │ │ └── var/
│ │ │ │ └── lib/
│ │ │ │ └── dpkg/
│ │ │ │ └── status.d/
│ │ │ │ ├── coreutils-relationships
│ │ │ │ ├── corrupt
│ │ │ │ ├── deinstall
│ │ │ │ ├── doc-examples
│ │ │ │ ├── empty
│ │ │ │ ├── installed-size-4KB
│ │ │ │ ├── libpam-runtime
│ │ │ │ ├── multiple
│ │ │ │ └── single
│ │ │ ├── dotnet/
│ │ │ │ ├── binary_cataloger.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── deps_binary_cataloger.go
│ │ │ │ ├── deps_cataloger.go
│ │ │ │ ├── deps_json.go
│ │ │ │ ├── deps_json_test.go
│ │ │ │ ├── libman_json.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_packages_lock.go
│ │ │ │ ├── parse_packages_lock_test.go
│ │ │ │ ├── pe.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── dir-example-1/
│ │ │ │ │ └── TestLibrary.deps.json
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── packages.lock.json
│ │ │ │ │ └── something.deps.json
│ │ │ │ ├── image-net2-app/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── helloworld.csproj
│ │ │ │ ├── image-net6-asp-libman/
│ │ │ │ │ ├── .dockerignore
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── LibManSample.csproj
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── Startup.cs
│ │ │ │ │ ├── libman.json
│ │ │ │ │ └── vendor/
│ │ │ │ │ └── lodash.js
│ │ │ │ ├── image-net8-app/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-no-depjson/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-self-contained/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-single-file/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-with-runtime/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-with-runtime-nodepsjson/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-compile-target/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── helloworld.csproj
│ │ │ │ ├── image-net8-ilrepack/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── dotnetapp.csproj
│ │ │ │ ├── image-net8-privateassets/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── dotnetapp.csproj
│ │ │ │ └── packages.lock.json
│ │ │ ├── elixir/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_mix_lock.go
│ │ │ │ └── parse_mix_lock_test.go
│ │ │ ├── erlang/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── erlang_parser.go
│ │ │ │ ├── erlang_parser_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_otp_app.go
│ │ │ │ ├── parse_otp_app_test.go
│ │ │ │ ├── parse_rebar_lock.go
│ │ │ │ ├── parse_rebar_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── rabbitmq.app
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ └── rabbitmq.app
│ │ │ │ └── rabbitmq.app
│ │ │ ├── generic/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── parser.go
│ │ │ │ └── testdata/
│ │ │ │ ├── a-path.txt
│ │ │ │ ├── another-path.txt
│ │ │ │ ├── empty.txt
│ │ │ │ └── last/
│ │ │ │ └── path.txt
│ │ │ ├── gentoo/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── license.go
│ │ │ │ ├── license_test.go
│ │ │ │ ├── parse_portage_contents.go
│ │ │ │ ├── purl.go
│ │ │ │ ├── purl_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── x/
│ │ │ │ │ └── y/
│ │ │ │ │ └── CONTENTS
│ │ │ │ ├── layout/
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── app-containers/
│ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ ├── CONTENTS
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── SIZE
│ │ │ │ ├── layout-license-groups/
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── portage/
│ │ │ │ │ │ └── license_groups
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── app-containers/
│ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ ├── CONTENTS
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── SIZE
│ │ │ │ └── license-groups/
│ │ │ │ ├── cycle
│ │ │ │ ├── example1
│ │ │ │ ├── missing
│ │ │ │ └── self
│ │ │ ├── githubactions/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_composite_action.go
│ │ │ │ ├── parse_composite_action_test.go
│ │ │ │ ├── parse_workflow.go
│ │ │ │ ├── parse_workflow_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── call-shared-workflow.yaml
│ │ │ │ ├── composite-action.yaml
│ │ │ │ ├── corrupt/
│ │ │ │ │ ├── composite-action.yaml
│ │ │ │ │ └── workflow-multi-job.yaml
│ │ │ │ ├── glob/
│ │ │ │ │ └── .github/
│ │ │ │ │ ├── actions/
│ │ │ │ │ │ ├── bootstrap/
│ │ │ │ │ │ │ └── action.yaml
│ │ │ │ │ │ └── unbootstrap/
│ │ │ │ │ │ └── action.yml
│ │ │ │ │ └── workflows/
│ │ │ │ │ ├── release.yml
│ │ │ │ │ └── validations.yaml
│ │ │ │ ├── workflow-multi-job.yaml
│ │ │ │ └── workflow-with-version-comments.yaml
│ │ │ ├── golang/
│ │ │ │ ├── billy_adapter.go
│ │ │ │ ├── billy_adapter_test.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── gotestdata/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── go-source/
│ │ │ │ │ │ ├── cmd/
│ │ │ │ │ │ │ ├── bin1/
│ │ │ │ │ │ │ │ └── main.go
│ │ │ │ │ │ │ └── bin2/
│ │ │ │ │ │ │ └── main.go
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ ├── pk1/
│ │ │ │ │ │ │ ├── pk1.go
│ │ │ │ │ │ │ └── pk1_test.go
│ │ │ │ │ │ ├── pk2/
│ │ │ │ │ │ │ └── pk2.go
│ │ │ │ │ │ └── pk3/
│ │ │ │ │ │ └── pk3.go
│ │ │ │ │ └── xcoff/
│ │ │ │ │ ├── file.go
│ │ │ │ │ ├── file_test.go
│ │ │ │ │ ├── testdata/
│ │ │ │ │ │ ├── gcc-ppc32-aix-dwarf2-exec
│ │ │ │ │ │ └── gcc-ppc64-aix-dwarf2-exec
│ │ │ │ │ └── xcoff.go
│ │ │ │ ├── license_finder.go
│ │ │ │ ├── license_finder_test.go
│ │ │ │ ├── licenses.go
│ │ │ │ ├── licenses_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_go_binary.go
│ │ │ │ ├── parse_go_binary_test.go
│ │ │ │ ├── parse_go_mod.go
│ │ │ │ ├── parse_go_mod_test.go
│ │ │ │ ├── scan_binary.go
│ │ │ │ ├── scan_binary_test.go
│ │ │ │ ├── stdlib_package.go
│ │ │ │ ├── stdlib_package_test.go
│ │ │ │ ├── subfs.go
│ │ │ │ ├── subfs_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── archs/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── build.sh
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── corrupt/
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── go.sum
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── partial-binary
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── go.mod
│ │ │ │ │ ├── go-mod-fixtures/
│ │ │ │ │ │ ├── many-packages/
│ │ │ │ │ │ │ └── go.mod
│ │ │ │ │ │ ├── one-package/
│ │ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ │ └── go.sum
│ │ │ │ │ │ └── relative-replace/
│ │ │ │ │ │ └── go.mod
│ │ │ │ │ ├── go-sum-hashes/
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── go.sum
│ │ │ │ │ ├── image-not-a-module/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── image-small/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── image-small-upx/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── licenses/
│ │ │ │ │ │ └── pkg/
│ │ │ │ │ │ └── mod/
│ │ │ │ │ │ └── github.com/
│ │ │ │ │ │ ├── !cap!o!r!g/
│ │ │ │ │ │ │ └── !cap!project@v4.111.5/
│ │ │ │ │ │ │ └── LICENSE.txt
│ │ │ │ │ │ └── someorg/
│ │ │ │ │ │ ├── somename@v0.3.2/
│ │ │ │ │ │ │ └── LICENSE
│ │ │ │ │ │ └── strangelicense@v1.2.3/
│ │ │ │ │ │ └── LiCeNsE.tXt
│ │ │ │ │ ├── licenses-vendor/
│ │ │ │ │ │ └── github.com/
│ │ │ │ │ │ ├── !cap!o!r!g/
│ │ │ │ │ │ │ └── !cap!project/
│ │ │ │ │ │ │ └── LICENSE.txt
│ │ │ │ │ │ └── someorg/
│ │ │ │ │ │ ├── somename/
│ │ │ │ │ │ │ └── LICENSE
│ │ │ │ │ │ └── strangelicense/
│ │ │ │ │ │ └── LiCeNsE.tXt
│ │ │ │ │ ├── repo/
│ │ │ │ │ │ └── LICENSE
│ │ │ │ │ └── zip-fs/
│ │ │ │ │ └── github.com/
│ │ │ │ │ └── someorg/
│ │ │ │ │ └── somepkg@version/
│ │ │ │ │ ├── a-file
│ │ │ │ │ └── subdir/
│ │ │ │ │ └── subfile
│ │ │ │ ├── upx.go
│ │ │ │ └── upx_test.go
│ │ │ ├── haskell/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_cabal_freeze.go
│ │ │ │ ├── parse_cabal_freeze_test.go
│ │ │ │ ├── parse_stack_lock.go
│ │ │ │ ├── parse_stack_lock_test.go
│ │ │ │ ├── parse_stack_yaml.go
│ │ │ │ ├── parse_stack_yaml_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── cabal.project.freeze
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── stack.yaml
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── cabal.project.freeze
│ │ │ │ │ └── stack.yaml
│ │ │ │ └── stack.yaml
│ │ │ ├── homebrew/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_homebrew_formula.go
│ │ │ │ ├── parse_homebrew_formula_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── formulas/
│ │ │ │ │ ├── crazy/
│ │ │ │ │ │ └── 1.0.0/
│ │ │ │ │ │ └── .brew/
│ │ │ │ │ │ └── crazy.rb
│ │ │ │ │ └── syft/
│ │ │ │ │ └── 1.23.1/
│ │ │ │ │ └── .brew/
│ │ │ │ │ └── syft.rb
│ │ │ │ └── install-example/
│ │ │ │ └── opt/
│ │ │ │ └── homebrew/
│ │ │ │ ├── Cellar/
│ │ │ │ │ └── foo/
│ │ │ │ │ └── 1.2.3/
│ │ │ │ │ └── .brew/
│ │ │ │ │ └── foo.rb
│ │ │ │ └── Library/
│ │ │ │ └── Taps/
│ │ │ │ └── testorg/
│ │ │ │ └── sometap/
│ │ │ │ └── Formula/
│ │ │ │ └── bar.rb
│ │ │ ├── internal/
│ │ │ │ ├── binutils/
│ │ │ │ │ ├── branching_matcher.go
│ │ │ │ │ ├── branching_matcher_test.go
│ │ │ │ │ ├── classifier.go
│ │ │ │ │ ├── classifier_package.go
│ │ │ │ │ ├── classifier_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── subdir/
│ │ │ │ │ │ └── some-binary
│ │ │ │ │ ├── version-parts.txt
│ │ │ │ │ └── version.txt
│ │ │ │ ├── cpegenerate/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── apk.go
│ │ │ │ │ ├── apk_test.go
│ │ │ │ │ ├── candidate_by_package_type.go
│ │ │ │ │ ├── candidate_by_package_type_test.go
│ │ │ │ │ ├── candidate_for_pe.go
│ │ │ │ │ ├── dictionary/
│ │ │ │ │ │ ├── data/
│ │ │ │ │ │ │ └── cpe-index.json
│ │ │ │ │ │ └── types.go
│ │ │ │ │ ├── dotnet.go
│ │ │ │ │ ├── field_candidate.go
│ │ │ │ │ ├── field_candidate_filter.go
│ │ │ │ │ ├── field_candidate_test.go
│ │ │ │ │ ├── filter.go
│ │ │ │ │ ├── filter_test.go
│ │ │ │ │ ├── generate.go
│ │ │ │ │ ├── generate_test.go
│ │ │ │ │ ├── go.go
│ │ │ │ │ ├── go_test.go
│ │ │ │ │ ├── java.go
│ │ │ │ │ ├── java_groupid_map.go
│ │ │ │ │ ├── java_test.go
│ │ │ │ │ ├── javascript.go
│ │ │ │ │ ├── pe_test.go
│ │ │ │ │ ├── python.go
│ │ │ │ │ ├── rpm.go
│ │ │ │ │ ├── ruby.go
│ │ │ │ │ ├── utils.go
│ │ │ │ │ ├── utils_test.go
│ │ │ │ │ ├── vendors_from_url.go
│ │ │ │ │ ├── vendors_from_url_test.go
│ │ │ │ │ ├── wordpress.go
│ │ │ │ │ └── wordpress_test.go
│ │ │ │ ├── dependency/
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ └── resolver_test.go
│ │ │ │ ├── licenses/
│ │ │ │ │ ├── find_licenses.go
│ │ │ │ │ ├── find_licenses_test.go
│ │ │ │ │ ├── names.go
│ │ │ │ │ ├── names_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── source.txt
│ │ │ │ ├── pe/
│ │ │ │ │ ├── bundle.go
│ │ │ │ │ ├── bundle_test.go
│ │ │ │ │ ├── pe.go
│ │ │ │ │ ├── pe_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── image-dotnet31-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ ├── image-dotnet5-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ ├── image-dotnet6-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ └── net8-app-single-file.deps.json
│ │ │ │ └── pkgtest/
│ │ │ │ ├── metadata_tracker.go
│ │ │ │ ├── observing_resolver.go
│ │ │ │ └── test_generic_parser.go
│ │ │ ├── java/
│ │ │ │ ├── archive_filename.go
│ │ │ │ ├── archive_filename_test.go
│ │ │ │ ├── archive_parser.go
│ │ │ │ ├── archive_parser_test.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── graalvm_native_image_cataloger.go
│ │ │ │ ├── graalvm_native_image_cataloger_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── maven/
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── config_test.go
│ │ │ │ │ ├── pom_parser.go
│ │ │ │ │ ├── pom_parser_test.go
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ ├── resolver_test.go
│ │ │ │ │ ├── test/
│ │ │ │ │ │ └── mock_repo.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── declared-iso-8859-encoded-pom.xml.base64
│ │ │ │ │ ├── local/
│ │ │ │ │ │ ├── child-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── child-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── child-3/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── circular-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── circular-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── contains-child-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── parent-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── parent-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ └── parent-3/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── local-repository-settings/
│ │ │ │ │ │ └── .m2/
│ │ │ │ │ │ └── settings.xml
│ │ │ │ │ ├── maven-repo/
│ │ │ │ │ │ ├── my/
│ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ ├── child-one/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ └── child-one-1.3.6.pom
│ │ │ │ │ │ │ ├── child-two/
│ │ │ │ │ │ │ │ └── 2.1.90/
│ │ │ │ │ │ │ │ └── child-two-2.1.90.pom
│ │ │ │ │ │ │ ├── circular/
│ │ │ │ │ │ │ │ └── 1.2.3/
│ │ │ │ │ │ │ │ └── circular-1.2.3.pom
│ │ │ │ │ │ │ ├── parent-one/
│ │ │ │ │ │ │ │ └── 3.11.0/
│ │ │ │ │ │ │ │ └── parent-one-3.11.0.pom
│ │ │ │ │ │ │ └── parent-two/
│ │ │ │ │ │ │ └── 13.7.8/
│ │ │ │ │ │ │ └── parent-two-13.7.8.pom
│ │ │ │ │ │ ├── net/
│ │ │ │ │ │ │ └── shibboleth/
│ │ │ │ │ │ │ └── parent/
│ │ │ │ │ │ │ └── 7.11.2/
│ │ │ │ │ │ │ └── parent-7.11.2.pom
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ ├── apache/
│ │ │ │ │ │ │ └── commons/
│ │ │ │ │ │ │ └── commons-parent/
│ │ │ │ │ │ │ └── 54/
│ │ │ │ │ │ │ └── commons-parent-54.pom
│ │ │ │ │ │ ├── junit/
│ │ │ │ │ │ │ └── junit-bom/
│ │ │ │ │ │ │ ├── 5.9.0/
│ │ │ │ │ │ │ │ └── junit-bom-5.9.0.pom
│ │ │ │ │ │ │ └── 5.9.1/
│ │ │ │ │ │ │ └── junit-bom-5.9.1.pom
│ │ │ │ │ │ └── opensaml/
│ │ │ │ │ │ └── opensaml-parent/
│ │ │ │ │ │ └── 3.4.6/
│ │ │ │ │ │ └── opensaml-parent-3.4.6.pom
│ │ │ │ │ └── undeclared-iso-8859-encoded-pom.xml.base64
│ │ │ │ ├── package_url.go
│ │ │ │ ├── package_url_test.go
│ │ │ │ ├── parse_gradle_lockfile.go
│ │ │ │ ├── parse_gradle_lockfile_test.go
│ │ │ │ ├── parse_java_manifest.go
│ │ │ │ ├── parse_java_manifest_test.go
│ │ │ │ ├── parse_jvm_release.go
│ │ │ │ ├── parse_jvm_release_test.go
│ │ │ │ ├── parse_pom_properties.go
│ │ │ │ ├── parse_pom_properties_test.go
│ │ │ │ ├── parse_pom_xml.go
│ │ │ │ ├── parse_pom_xml_test.go
│ │ │ │ ├── save_archive_to_tmp.go
│ │ │ │ ├── tar_wrapped_archive_parser.go
│ │ │ │ ├── tar_wrapped_archive_parser_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── corrupt/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── example.jar
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── archives/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── example.tar.br
│ │ │ │ │ │ │ ├── example.tar.bz
│ │ │ │ │ │ │ ├── example.tar.bz2
│ │ │ │ │ │ │ ├── example.tar.lz4
│ │ │ │ │ │ │ ├── example.tar.sz
│ │ │ │ │ │ │ ├── example.tar.xz
│ │ │ │ │ │ │ ├── example.tar.zst
│ │ │ │ │ │ │ ├── example.tar.zstd
│ │ │ │ │ │ │ ├── example.tbr
│ │ │ │ │ │ │ ├── example.tbz
│ │ │ │ │ │ │ ├── example.tbz2
│ │ │ │ │ │ │ ├── example.tgz
│ │ │ │ │ │ │ ├── example.tlz4
│ │ │ │ │ │ │ ├── example.tsz
│ │ │ │ │ │ │ ├── example.txz
│ │ │ │ │ │ │ ├── example.tzst
│ │ │ │ │ │ │ └── example.tzstd
│ │ │ │ │ │ ├── java-archives/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── example.ear
│ │ │ │ │ │ │ ├── example.far
│ │ │ │ │ │ │ ├── example.hpi
│ │ │ │ │ │ │ ├── example.jar
│ │ │ │ │ │ │ ├── example.jpi
│ │ │ │ │ │ │ ├── example.kar
│ │ │ │ │ │ │ ├── example.lpkg
│ │ │ │ │ │ │ ├── example.nar
│ │ │ │ │ │ │ ├── example.par
│ │ │ │ │ │ │ ├── example.sar
│ │ │ │ │ │ │ └── example.war
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── graalvm-sbom/
│ │ │ │ │ │ └── micronaut.json
│ │ │ │ │ ├── gradle/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ └── gradle.lockfile
│ │ │ │ │ ├── jar-metadata/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── api-all-2.0.0-sources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.apache.directory.api/
│ │ │ │ │ │ │ ├── api-all/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── api-asn1-api/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── com.fasterxml.jackson.core.jackson-core-2.15.2/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── com.fasterxml.jackson.core/
│ │ │ │ │ │ │ └── jackson-core/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── commons-lang3-3.12.0/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.apache.commons-lang3/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── jackson-core-2.15.2/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── com.fasterxml.jackson.core/
│ │ │ │ │ │ │ └── jackson-core/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── jenkins-plugins/
│ │ │ │ │ │ │ └── gradle/
│ │ │ │ │ │ │ └── 2.11/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── MANIFEST.MF
│ │ │ │ │ │ ├── micronaut-aop-4.9.11/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── io.micronaut/
│ │ │ │ │ │ │ └── micronaut-aop/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── multiple-matching-2.11.5/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.multiple/
│ │ │ │ │ │ │ ├── multiple-matching-1/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ ├── multiple-matching-2/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── multiple-matching-3/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── opensaml-core-3.4.6/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── INDEX.LIST
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.opensaml/
│ │ │ │ │ │ │ └── opensaml-core/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── org.multiple-thename/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ ├── com.multiple/
│ │ │ │ │ │ │ │ └── thename/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── org.multiple/
│ │ │ │ │ │ │ └── thename/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ └── spring-instrumentation-4.3.0-1.0/
│ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ └── MANIFEST.MF
│ │ │ │ │ ├── java-builds/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── build-example-java-app-gradle.sh
│ │ │ │ │ │ ├── build-example-java-app-maven.sh
│ │ │ │ │ │ ├── build-example-java-app-native-image.sh
│ │ │ │ │ │ ├── build-example-jenkins-plugin.sh
│ │ │ │ │ │ ├── build-example-macho-binary.sh
│ │ │ │ │ │ ├── build-example-sb-app-nestedjar.sh
│ │ │ │ │ │ ├── example-java-app/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ │ ├── gradle.lockfile
│ │ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ └── main/
│ │ │ │ │ │ │ └── java/
│ │ │ │ │ │ │ └── hello/
│ │ │ │ │ │ │ ├── Greeter.java
│ │ │ │ │ │ │ └── HelloWorld.java
│ │ │ │ │ │ ├── example-jenkins-plugin/
│ │ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ └── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── io/
│ │ │ │ │ │ │ │ └── jenkins/
│ │ │ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ │ │ └── sample/
│ │ │ │ │ │ │ │ └── HelloWorldBuilder.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ ├── index.jelly
│ │ │ │ │ │ │ └── io/
│ │ │ │ │ │ │ └── jenkins/
│ │ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ │ └── sample/
│ │ │ │ │ │ │ ├── HelloWorldBuilder/
│ │ │ │ │ │ │ │ ├── config.jelly
│ │ │ │ │ │ │ │ ├── config.properties
│ │ │ │ │ │ │ │ ├── config_fr.properties
│ │ │ │ │ │ │ │ ├── help-name.html
│ │ │ │ │ │ │ │ ├── help-name_fr.html
│ │ │ │ │ │ │ │ ├── help-useFrench.html
│ │ │ │ │ │ │ │ └── help-useFrench_fr.html
│ │ │ │ │ │ │ ├── Messages.properties
│ │ │ │ │ │ │ └── Messages_fr.properties
│ │ │ │ │ │ └── example-sb-app/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ └── java/
│ │ │ │ │ │ │ └── com/
│ │ │ │ │ │ │ └── example/
│ │ │ │ │ │ │ └── springboot/
│ │ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ │ └── HelloController.java
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── example/
│ │ │ │ │ │ └── springboot/
│ │ │ │ │ │ ├── HelloControllerIT.java
│ │ │ │ │ │ └── HelloControllerTest.java
│ │ │ │ │ ├── jvm-installs/
│ │ │ │ │ │ ├── oracle-jdk-se-8/
│ │ │ │ │ │ │ └── usr/
│ │ │ │ │ │ │ └── lib/
│ │ │ │ │ │ │ └── jvm/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ └── jdk-1.8-oracle-x64/
│ │ │ │ │ │ │ └── release
│ │ │ │ │ │ └── valid-post-jep223/
│ │ │ │ │ │ └── jvm/
│ │ │ │ │ │ └── openjdk/
│ │ │ │ │ │ ├── release
│ │ │ │ │ │ └── sibling/
│ │ │ │ │ │ └── child/
│ │ │ │ │ │ └── file1.txt
│ │ │ │ │ ├── manifest/
│ │ │ │ │ │ ├── continuation
│ │ │ │ │ │ ├── extra-empty-lines
│ │ │ │ │ │ ├── extra-info
│ │ │ │ │ │ ├── leading-space
│ │ │ │ │ │ ├── small
│ │ │ │ │ │ ├── standard-info
│ │ │ │ │ │ └── version-with-date
│ │ │ │ │ └── pom/
│ │ │ │ │ ├── colon-delimited-with-equals.pom.properties
│ │ │ │ │ ├── colon-delimited.pom.properties
│ │ │ │ │ ├── commons-codec.pom.xml
│ │ │ │ │ ├── commons-text-1.10.0/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── equals-delimited-with-colons.pom.properties
│ │ │ │ │ ├── example-java-app-maven/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── extra.pom.properties
│ │ │ │ │ ├── neo4j-license-maven-plugin.pom.xml
│ │ │ │ │ ├── small.pom.properties
│ │ │ │ │ └── transitive-top-level/
│ │ │ │ │ └── pom.xml
│ │ │ │ ├── zip_wrapped_archive_parser.go
│ │ │ │ └── zip_wrapped_archive_parser_test.go
│ │ │ ├── javascript/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_package_json.go
│ │ │ │ ├── parse_package_json_test.go
│ │ │ │ ├── parse_package_lock.go
│ │ │ │ ├── parse_package_lock_test.go
│ │ │ │ ├── parse_pnpm_lock.go
│ │ │ │ ├── parse_pnpm_lock_test.go
│ │ │ │ ├── parse_yarn_lock.go
│ │ │ │ ├── parse_yarn_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── package.json
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pkg-json/
│ │ │ │ │ ├── package-all-author-fields.json
│ │ │ │ │ ├── package-author-non-standard.json
│ │ │ │ │ ├── package-authors-array.json
│ │ │ │ │ ├── package-authors-objects.json
│ │ │ │ │ ├── package-both-author-and-authors.json
│ │ │ │ │ ├── package-contributors.json
│ │ │ │ │ ├── package-license-object.json
│ │ │ │ │ ├── package-license-objects.json
│ │ │ │ │ ├── package-maintainers.json
│ │ │ │ │ ├── package-malformed-license.json
│ │ │ │ │ ├── package-nested-author.json
│ │ │ │ │ ├── package-no-license.json
│ │ │ │ │ ├── package-partial.json
│ │ │ │ │ ├── package-private.json
│ │ │ │ │ ├── package-repo-string.json
│ │ │ │ │ └── package.json
│ │ │ │ ├── pkg-lock/
│ │ │ │ │ ├── alias-package-lock-1.json
│ │ │ │ │ ├── alias-package-lock-2.json
│ │ │ │ │ ├── array-license-package-lock.json
│ │ │ │ │ ├── package-lock-2.json
│ │ │ │ │ └── package-lock-3.json
│ │ │ │ ├── pnpm-remote/
│ │ │ │ │ └── registry_response.json
│ │ │ │ ├── yarn-berry-dev-deps/
│ │ │ │ │ └── package.json
│ │ │ │ ├── yarn-dev-deps/
│ │ │ │ │ └── package.json
│ │ │ │ └── yarn-remote/
│ │ │ │ └── registry_response.json
│ │ │ ├── kernel/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_linux_kernel_file.go
│ │ │ │ ├── parse_linux_kernel_module_file.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Makefile
│ │ │ │ └── image-kernel-and-modules/
│ │ │ │ └── Dockerfile
│ │ │ ├── lua/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_rockspec.go
│ │ │ │ ├── parse_rockspec_test.go
│ │ │ │ ├── rockspec_parser.go
│ │ │ │ ├── rockspec_parser_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── bad-1.23.0-0.rockspec
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── lua/
│ │ │ │ │ └── package.rockspec
│ │ │ │ └── rockspec/
│ │ │ │ ├── kong-3.7.0-0.rockspec
│ │ │ │ ├── kong-pgmoon-1.16.2-1.rockspec
│ │ │ │ ├── lpeg-1.0.2-1.rockspec
│ │ │ │ └── luasyslog-2.0.1-1.rockspec
│ │ │ ├── nix/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── db_cataloger.go
│ │ │ │ ├── db_cataloger_v10.go
│ │ │ │ ├── derivation.go
│ │ │ │ ├── derivation_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_store_path.go
│ │ │ │ ├── parse_store_path_test.go
│ │ │ │ ├── store_cataloger.go
│ │ │ │ ├── store_cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── fixture-1/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ └── nix/
│ │ │ │ │ └── store/
│ │ │ │ │ ├── 5av396z8xa13jg89g9jws145c0k26k2x-glibc-2.34-210.drv
│ │ │ │ │ └── h0cnbmfcn93xm5dg2x27ixhag1cwndga-glibc-2.34-210-bin/
│ │ │ │ │ └── share/
│ │ │ │ │ └── man/
│ │ │ │ │ └── glibc.1
│ │ │ │ ├── image-nixos-jq-pkg-db/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── clean_db.sql
│ │ │ │ └── image-nixos-jq-pkg-store/
│ │ │ │ └── Dockerfile
│ │ │ ├── ocaml/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_opam.go
│ │ │ │ ├── parse_opam_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── alcotest.opam
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── opam/
│ │ │ │ │ ├── alcotest.opam
│ │ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ │ └── opam
│ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ └── opam
│ │ │ ├── php/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── interpreter_cataloger.go
│ │ │ │ ├── interpreter_cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_composer_lock.go
│ │ │ │ ├── parse_composer_lock_test.go
│ │ │ │ ├── parse_installed_json.go
│ │ │ │ ├── parse_installed_json_test.go
│ │ │ │ ├── parse_pecl_pear.go
│ │ │ │ ├── parse_pecl_pear_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── php/
│ │ │ │ │ │ └── .registry/
│ │ │ │ │ │ └── .channel.pecl.php.net/
│ │ │ │ │ │ └── memcached.reg
│ │ │ │ │ └── src/
│ │ │ │ │ └── installed.json
│ │ │ │ ├── image-apache/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-extensions/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── memcached-v5-format.reg
│ │ │ │ ├── memcached-v6-format.reg
│ │ │ │ └── vendor/
│ │ │ │ ├── composer_1/
│ │ │ │ │ └── installed.json
│ │ │ │ └── composer_2/
│ │ │ │ └── installed.json
│ │ │ ├── python/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── license.go
│ │ │ │ ├── license_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_pdm_lock.go
│ │ │ │ ├── parse_pdm_lock_test.go
│ │ │ │ ├── parse_pipfile_lock.go
│ │ │ │ ├── parse_pipfile_lock_test.go
│ │ │ │ ├── parse_poetry_lock.go
│ │ │ │ ├── parse_poetry_lock_test.go
│ │ │ │ ├── parse_requirements.go
│ │ │ │ ├── parse_requirements_test.go
│ │ │ │ ├── parse_setup.go
│ │ │ │ ├── parse_setup_test.go
│ │ │ │ ├── parse_uv_lock.go
│ │ │ │ ├── parse_uv_lock_test.go
│ │ │ │ ├── parse_wheel_egg.go
│ │ │ │ ├── parse_wheel_egg_metadata.go
│ │ │ │ ├── parse_wheel_egg_metadata_test.go
│ │ │ │ ├── parse_wheel_egg_record.go
│ │ │ │ ├── parse_wheel_egg_record_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Python-2.7.egg-info
│ │ │ │ │ ├── empty-1.0.0-py3.8.egg-info
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── site-packages/
│ │ │ │ │ │ │ ├── v.DIST-INFO/
│ │ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ │ ├── w.EGG-INFO/
│ │ │ │ │ │ │ │ └── PKG-INFO
│ │ │ │ │ │ │ ├── x.dist-info/
│ │ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ │ ├── y.egg-info/
│ │ │ │ │ │ │ │ └── PKG-INFO
│ │ │ │ │ │ │ └── z.egg-info
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── 1-requirements-dev.txt
│ │ │ │ │ │ ├── extra-requirements.txt
│ │ │ │ │ │ ├── requirements-dev.txt
│ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── image-multi-site-package/
│ │ │ │ │ │ └── Dockerfile
│ │ │ │ │ ├── installed-files/
│ │ │ │ │ │ └── installed-files.txt
│ │ │ │ │ ├── poetry/
│ │ │ │ │ │ ├── conflicting-with-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ ├── multiple-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ ├── nested-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ └── simple-deps/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── pyenv/
│ │ │ │ │ │ ├── good-config
│ │ │ │ │ │ └── trixy-config
│ │ │ │ │ ├── pypi-remote/
│ │ │ │ │ │ ├── pyproject.toml
│ │ │ │ │ │ ├── registry_response.json
│ │ │ │ │ │ ├── registry_response_bad.json
│ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── requires/
│ │ │ │ │ │ └── requirements.txt
│ │ │ │ │ ├── setup/
│ │ │ │ │ │ ├── dynamic-setup.py
│ │ │ │ │ │ ├── mixed-format-setup.py
│ │ │ │ │ │ ├── multiline-split-setup.py
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── site-packages/
│ │ │ │ │ │ ├── license/
│ │ │ │ │ │ │ ├── with-license-file-declared.dist-info/
│ │ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── without-license-file-declared.dist-info/
│ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── malformed-record/
│ │ │ │ │ │ │ └── dist-info/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ └── RECORD
│ │ │ │ │ │ ├── nested/
│ │ │ │ │ │ │ ├── dist-name/
│ │ │ │ │ │ │ │ └── dist-info/
│ │ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── egg-name/
│ │ │ │ │ │ │ └── egg-info/
│ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ ├── PKG-INFO-INVALID
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── no-version/
│ │ │ │ │ │ │ └── no-version-py3.8.egg-info
│ │ │ │ │ │ ├── partial.dist-info/
│ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ ├── test/
│ │ │ │ │ │ │ └── test.egg-info
│ │ │ │ │ │ └── uppercase/
│ │ │ │ │ │ ├── dist-name/
│ │ │ │ │ │ │ └── DIST-INFO/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ └── egg-name/
│ │ │ │ │ │ └── EGG-INFO/
│ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ ├── PKG-INFO-INVALID
│ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ └── uv/
│ │ │ │ │ ├── conflicting-with-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── multiple-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── nested-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ └── simple-deps/
│ │ │ │ │ └── pyproject.toml
│ │ │ │ ├── virtual_env.go
│ │ │ │ └── virtual_env_test.go
│ │ │ ├── r/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_description.go
│ │ │ │ ├── parse_description_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── DESCRIPTION
│ │ │ │ ├── installed/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ └── DESCRIPTION
│ │ │ │ │ └── stringr/
│ │ │ │ │ └── DESCRIPTION
│ │ │ │ └── map-parse/
│ │ │ │ ├── bad
│ │ │ │ ├── eof-multiline
│ │ │ │ ├── multiline
│ │ │ │ ├── no-name
│ │ │ │ ├── no-version
│ │ │ │ └── simple
│ │ │ ├── redhat/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_rpm_archive.go
│ │ │ │ ├── parse_rpm_archive_test.go
│ │ │ │ ├── parse_rpm_db.go
│ │ │ │ ├── parse_rpm_db_test.go
│ │ │ │ ├── parse_rpm_manifest.go
│ │ │ │ ├── parse_rpm_manifest_test.go
│ │ │ │ ├── sqlitetest/
│ │ │ │ │ └── no_sqlite_driver_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── Packages
│ │ │ │ ├── bad/
│ │ │ │ │ └── bad.rpm
│ │ │ │ ├── container-manifest-2
│ │ │ │ ├── generate-fixture.sh
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── dive-0.10.0.rpm
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ └── sysimage/
│ │ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ │ └── Packages
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ └── Packages
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ ├── rpm/
│ │ │ │ │ │ └── Packages
│ │ │ │ │ └── rpmmanifest/
│ │ │ │ │ └── container-manifest-2
│ │ │ │ ├── image-minimal/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── remove.sh
│ │ │ │ └── image-rpm-archive/
│ │ │ │ └── Dockerfile
│ │ │ ├── ruby/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_gemfile_lock.go
│ │ │ │ ├── parse_gemfile_lock_test.go
│ │ │ │ ├── parse_gemspec.go
│ │ │ │ ├── parse_gemspec_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── bundler.gemspec
│ │ │ │ └── glob-paths/
│ │ │ │ └── specifications/
│ │ │ │ ├── pkg/
│ │ │ │ │ └── nested.gemspec
│ │ │ │ └── root.gemspec
│ │ │ ├── rust/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_audit_binary.go
│ │ │ │ ├── parse_cargo_lock.go
│ │ │ │ ├── parse_cargo_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Cargo.lock-with-git-deps
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── partial-binary
│ │ │ │ └── image-audit/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── Dockerfile
│ │ │ │ └── src/
│ │ │ │ └── main.rs
│ │ │ ├── sbom/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── alpine/
│ │ │ │ │ └── syft-json/
│ │ │ │ │ └── sbom.syft.json
│ │ │ │ └── glob-paths/
│ │ │ │ ├── app.bom
│ │ │ │ ├── app.bom.json
│ │ │ │ ├── app.cdx
│ │ │ │ ├── app.cdx.json
│ │ │ │ ├── app.sbom
│ │ │ │ ├── app.sbom.json
│ │ │ │ ├── app.spdx
│ │ │ │ ├── app.spdx.json
│ │ │ │ ├── app.syft.json
│ │ │ │ ├── bom
│ │ │ │ └── sbom
│ │ │ ├── snap/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── integration_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_base_dpkg.go
│ │ │ │ ├── parse_base_dpkg_test.go
│ │ │ │ ├── parse_integration_test.go
│ │ │ │ ├── parse_kernel_changelog.go
│ │ │ │ ├── parse_kernel_changelog_test.go
│ │ │ │ ├── parse_snapd_snapcraft.go
│ │ │ │ ├── parse_system_manifest.go
│ │ │ │ └── testdata/
│ │ │ │ ├── dpkg.yaml
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ └── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── snappy/
│ │ │ │ │ │ └── dpkg.yaml
│ │ │ │ │ └── system/
│ │ │ │ │ └── snap/
│ │ │ │ │ └── manifest.yaml
│ │ │ │ ├── manifest.yaml
│ │ │ │ └── real-dpkg.yaml
│ │ │ ├── swift/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_package_resolved.go
│ │ │ │ ├── parse_package_resolved_test.go
│ │ │ │ ├── parse_podfile_lock.go
│ │ │ │ ├── parse_podfile_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Package.resolved
│ │ │ │ ├── PackageV3.resolved
│ │ │ │ ├── bad-version-packages.resolved
│ │ │ │ └── empty-packages.resolved
│ │ │ ├── swipl/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_pack.go
│ │ │ │ ├── parse_pack_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── pack.pl
│ │ │ │ └── pack.pl
│ │ │ ├── terraform/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── parse_tf_lock.go
│ │ │ │ └── testdata/
│ │ │ │ └── two-providers/
│ │ │ │ └── .terraform.lock.hcl
│ │ │ └── wordpress/
│ │ │ ├── capabilities.yaml
│ │ │ ├── cataloger.go
│ │ │ ├── cataloger_test.go
│ │ │ ├── package.go
│ │ │ ├── parse_plugin.go
│ │ │ ├── parse_plugin_test.go
│ │ │ └── testdata/
│ │ │ └── glob-paths/
│ │ │ ├── wp-admin/
│ │ │ │ └── index.php
│ │ │ ├── wp-content/
│ │ │ │ └── plugins/
│ │ │ │ ├── akismet/
│ │ │ │ │ └── akismet.php
│ │ │ │ └── all-in-one-wp-migration/
│ │ │ │ └── all-in-one-wp-migration.php
│ │ │ └── wp-includes/
│ │ │ └── index.php
│ │ ├── cataloger.go
│ │ ├── cocoapods.go
│ │ ├── collection.go
│ │ ├── collection_test.go
│ │ ├── conan.go
│ │ ├── conda.go
│ │ ├── dart.go
│ │ ├── dotnet.go
│ │ ├── dpkg.go
│ │ ├── elixir.go
│ │ ├── erlang.go
│ │ ├── evidence.go
│ │ ├── file_owner.go
│ │ ├── gguf.go
│ │ ├── github.go
│ │ ├── golang.go
│ │ ├── hackage.go
│ │ ├── homebrew.go
│ │ ├── java.go
│ │ ├── java_test.go
│ │ ├── key_value.go
│ │ ├── language.go
│ │ ├── language_test.go
│ │ ├── license.go
│ │ ├── license_deprecated.go
│ │ ├── license_set.go
│ │ ├── license_set_test.go
│ │ ├── license_test.go
│ │ ├── license_url_enrichment_test.go
│ │ ├── linux_kernel.go
│ │ ├── microsoft.go
│ │ ├── nix.go
│ │ ├── npm.go
│ │ ├── ocaml.go
│ │ ├── package.go
│ │ ├── package_test.go
│ │ ├── php.go
│ │ ├── portage.go
│ │ ├── python.go
│ │ ├── python_test.go
│ │ ├── r.go
│ │ ├── rockspec.go
│ │ ├── rpm.go
│ │ ├── rpm_test.go
│ │ ├── ruby.go
│ │ ├── rust.go
│ │ ├── snap.go
│ │ ├── swift.go
│ │ ├── swipl.go
│ │ ├── terraform.go
│ │ ├── type.go
│ │ ├── type_test.go
│ │ ├── url.go
│ │ └── wordpress.go
│ ├── sbom/
│ │ ├── format.go
│ │ ├── sbom.go
│ │ └── writer.go
│ ├── source/
│ │ ├── alias.go
│ │ ├── description.go
│ │ ├── directory_metadata.go
│ │ ├── directorysource/
│ │ │ ├── cache_excludes.go
│ │ │ ├── directory_source.go
│ │ │ ├── directory_source_provider.go
│ │ │ ├── directory_source_test.go
│ │ │ └── directory_source_win_test.go
│ │ ├── exclude.go
│ │ ├── file_metadata.go
│ │ ├── filesource/
│ │ │ ├── file_source.go
│ │ │ ├── file_source_provider.go
│ │ │ └── file_source_test.go
│ │ ├── image_metadata.go
│ │ ├── internal/
│ │ │ ├── digest_utils.go
│ │ │ ├── image_id.go
│ │ │ └── image_id_test.go
│ │ ├── oci_model_metadata.go
│ │ ├── ocimodelsource/
│ │ │ ├── oci_model_source.go
│ │ │ ├── oci_model_source_provider.go
│ │ │ ├── registry_client.go
│ │ │ └── registry_client_test.go
│ │ ├── provider.go
│ │ ├── scope.go
│ │ ├── scope_test.go
│ │ ├── snap_metadata.go
│ │ ├── snapsource/
│ │ │ ├── manifest.go
│ │ │ ├── snap.go
│ │ │ ├── snap_source.go
│ │ │ ├── snap_source_provider.go
│ │ │ ├── snap_source_test.go
│ │ │ ├── snap_test.go
│ │ │ ├── snapcraft_api.go
│ │ │ └── snapcraft_api_test.go
│ │ ├── source.go
│ │ ├── sourceproviders/
│ │ │ ├── source_provider_config.go
│ │ │ └── source_providers.go
│ │ ├── stereoscopesource/
│ │ │ ├── image_source.go
│ │ │ ├── image_source_provider.go
│ │ │ └── image_source_test.go
│ │ └── testdata/
│ │ ├── actual-path/
│ │ │ └── empty
│ │ ├── file-index-filter/
│ │ │ ├── .1/
│ │ │ │ └── something
│ │ │ ├── .2
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ ├── generate-tar-fixture-from-source-dir.sh
│ │ ├── image-simple/
│ │ │ ├── Dockerfile
│ │ │ ├── file-1.txt
│ │ │ ├── file-2.txt
│ │ │ └── target/
│ │ │ └── really/
│ │ │ └── nested/
│ │ │ └── file-3.txt
│ │ ├── path-detected/
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ ├── path-detected-2/
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ └── system_paths/
│ │ ├── outside_root/
│ │ │ └── link_target/
│ │ │ └── place
│ │ └── target/
│ │ ├── dev/
│ │ │ └── place
│ │ ├── home/
│ │ │ └── place
│ │ ├── link/
│ │ │ └── a-symlink/
│ │ │ └── place
│ │ ├── proc/
│ │ │ └── place
│ │ └── sys/
│ │ └── place
│ └── testutil/
│ ├── README.md
│ └── completion_testing.go
├── task.d/
│ └── generate/
│ └── cpe-index.yaml
└── test/
├── cli/
│ ├── .gitignore
│ ├── all_formats_convertible_test.go
│ ├── all_formats_expressible_test.go
│ ├── archive_test.go
│ ├── cataloger_info_test.go
│ ├── config_test.go
│ ├── convert_cmd_test.go
│ ├── cyclonedx_valid_test.go
│ ├── dir_root_scan_regression_test.go
│ ├── json_schema_test.go
│ ├── license_test.go
│ ├── root_cmd_test.go
│ ├── scan_cmd_test.go
│ ├── spdx_json_schema_test.go
│ ├── spdx_tooling_validation_test.go
│ ├── symlink_test.go
│ ├── testdata/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── archive/
│ │ │ └── dist-info/
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── top_level.txt
│ │ ├── attestation/
│ │ │ ├── Dockerfile.ctfe_init
│ │ │ ├── config/
│ │ │ │ ├── config.json
│ │ │ │ ├── ctfe/
│ │ │ │ │ ├── ct_server.cfg
│ │ │ │ │ ├── privkey.pem
│ │ │ │ │ └── pubkey.pem
│ │ │ │ ├── dex/
│ │ │ │ │ └── docker-compose-config.yaml
│ │ │ │ └── logid.sh
│ │ │ ├── docker-compose-config.yaml
│ │ │ └── docker-compose.yaml
│ │ ├── configs/
│ │ │ ├── dir1/
│ │ │ │ └── .syft.yaml
│ │ │ └── dir2/
│ │ │ └── .syft.yaml
│ │ ├── csv.template
│ │ ├── image-bad-binaries/
│ │ │ ├── Dockerfile
│ │ │ └── sources.list
│ │ ├── image-hidden-packages/
│ │ │ └── Dockerfile
│ │ ├── image-java-spdx-tools/
│ │ │ ├── Dockerfile
│ │ │ └── Makefile
│ │ ├── image-node-binary/
│ │ │ └── Dockerfile
│ │ ├── image-unknowns/
│ │ │ ├── Dockerfile
│ │ │ ├── exe
│ │ │ └── executable-script
│ │ └── registry/
│ │ ├── .dockerignore
│ │ ├── Dockerfile
│ │ └── Makefile
│ ├── trait_assertions_test.go
│ ├── unknowns_test.go
│ ├── utils_test.go
│ └── version_cmd_test.go
├── compare/
│ ├── compare.py
│ ├── deb.sh
│ ├── mac.sh
│ ├── rpm.sh
│ └── testdata/
│ └── acceptance-centos-8.2.2004.json
├── install/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── 0_checksums_test.sh
│ ├── 1_download_snapshot_asset_test.sh
│ ├── 2_download_release_asset_test.sh
│ ├── 3_install_asset_test.sh
│ ├── 4_prep_signature_verification_test.sh
│ ├── Makefile
│ ├── environments/
│ │ ├── Dockerfile-alpine-3.6
│ │ ├── Dockerfile-busybox-1.36
│ │ └── Dockerfile-ubuntu-20.04
│ ├── github_test.sh
│ ├── test_harness.sh
│ └── testdata/
│ ├── assets/
│ │ ├── invalid/
│ │ │ ├── .gitignore
│ │ │ └── checksums.txt
│ │ └── valid/
│ │ ├── .gitignore
│ │ └── checksums.txt
│ ├── github-api-syft-v0.36.0-release.json
│ ├── syft_0.35.1-SNAPSHOT-d461f63_checksums.txt
│ └── syft_0.36.0_checksums.txt
└── rules/
└── rules.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .binny.yaml
================================================
tools:
# we want to use a pinned version of binny to manage the toolchain (so binny manages itself!)
- name: binny
version:
want: v0.12.0
method: github-release
with:
repo: anchore/binny
# used to produce SBOMs during release
- name: syft
version:
want: latest
method: github-release
with:
repo: anchore/syft
# used to sign mac binaries at release
- name: quill
version:
want: v0.7.1
method: github-release
with:
repo: anchore/quill
# used for linting
- name: golangci-lint
version:
want: v2.11.3
method: github-release
with:
repo: golangci/golangci-lint
# used for showing the changelog at release
- name: glow
version:
want: v2.1.1
method: github-release
with:
repo: charmbracelet/glow
# used for signing the checksums file at release
- name: cosign
version:
want: v3.0.5
method: github-release
with:
repo: sigstore/cosign
# used in integration tests to verify JSON schemas
- name: yajsv
version:
want: v1.4.1
method: github-release
with:
repo: neilpa/yajsv
# used to release all artifacts
- name: goreleaser
version:
want: v2.14.3
method: github-release
with:
repo: goreleaser/goreleaser
# used for organizing imports during static analysis
- name: gosimports
version:
want: v0.3.8
method: github-release
with:
repo: rinchsan/gosimports
# used at release to generate the changelog
- name: chronicle
version:
want: v0.8.0
method: github-release
with:
repo: anchore/chronicle
# used during static analysis for license compliance
- name: bouncer
version:
want: v0.4.0
method: github-release
with:
repo: wagoodman/go-bouncer
# used for running all local and CI tasks
- name: task
version:
want: v3.49.1
method: github-release
with:
repo: go-task/task
# used for triggering a release
- name: gh
version:
want: v2.88.1
method: github-release
with:
repo: cli/cli
# used to upload test fixture cache
- name: oras
version:
want: v1.3.1
method: github-release
with:
repo: oras-project/oras
# used to upload test fixture cache
- name: yq
version:
want: v4.52.4
method: github-release
with:
repo: mikefarah/yq
================================================
FILE: .bouncer.yaml
================================================
permit:
- BSD.*
- CC0.*
- MIT.*
- Apache.*
- MPL.*
- ISC
- WTFPL
- Unlicense
ignore-packages:
# https://github.com/sorairolake/lzip-go/blob/34a2615d2abf740175c6b0a835baa08364e09430/go.sum.license#L3
# has `SPDX-License-Identifier: Apache-2.0 OR MIT`, both of which are acceptable
- github.com/sorairolake/lzip-go
# packageurl-go is released under the MIT license located in the root of the repo at /mit.LICENSE
- github.com/anchore/packageurl-go
# both of these dependencies are specified as Apache-2.0 in their respective GitHub READMEs
- github.com/alibabacloud-go/cr-20160607/client
- github.com/alibabacloud-go/tea-xml/service
# crypto/internal/boring is released under the openSSL license as a part of the Golang Standard Libary
- crypto/internal/boring
# from: https://github.com/spdx/tools-golang/blob/main/LICENSE.code
# The tools-golang source code is provided and may be used, at your option,
# under either:
# * Apache License, version 2.0 (Apache-2.0), OR
# * GNU General Public License, version 2.0 or later (GPL-2.0-or-later).
# (we choose Apache-2.0)
- github.com/spdx/tools-golang
# from: https://github.com/xi2/xz/blob/master/LICENSE
# All these files have been put into the public domain.
# You can do whatever you want with these files.
- github.com/xi2/xz
# from: https://gitlab.com/cznic/sqlite/-/blob/v1.15.4/LICENSE
# This is a BSD-3-Clause license
- modernc.org/libc
- modernc.org/libc/errno
- modernc.org/libc/fcntl
- modernc.org/libc/fts
- modernc.org/libc/grp
- modernc.org/libc/langinfo
- modernc.org/libc/limits
- modernc.org/libc/netdb
- modernc.org/libc/netinet/in
- modernc.org/libc/poll
- modernc.org/libc/pthread
- modernc.org/libc/pwd
- modernc.org/libc/signal
- modernc.org/libc/stdio
- modernc.org/libc/stdlib
- modernc.org/libc/sys/socket
- modernc.org/libc/sys/stat
- modernc.org/libc/sys/types
- modernc.org/libc/termios
- modernc.org/libc/time
- modernc.org/libc/unistd
- modernc.org/libc/utime
- modernc.org/libc/uuid/uuid
- modernc.org/libc/wctype
- modernc.org/mathutil
- modernc.org/memory
================================================
FILE: .chronicle.yaml
================================================
enforce-v0: false
title: ""
github:
host: github.com
include-issue-pr-authors: true
include-issue-prs: true
include-issues-not-planned: false
include-prs: true
include-issues: true
include-unlabeled-issues: true
include-unlabeled-prs: true
issues-require-linked-prs: false
consider-pr-merge-commits: true
exclude-labels:
- duplicate
- question
- invalid
- wontfix
- wont-fix
- release-ignore
- changelog-ignore
- ignore
changes:
- name: security-fixes
title: Security Fixes
semver-field: patch
labels:
- security
- vulnerability
- name: added-feature
title: Added Features
semver-field: minor
labels:
- enhancement
- feature
- minor
- name: bug-fix
title: Bug Fixes
semver-field: patch
labels:
- bug
- fix
- bug-fix
- patch
- name: breaking-feature
title: Breaking Changes
semver-field: major
labels:
- breaking
- backwards-incompatible
- breaking-change
- breaking-feature
- major
- detected-breaking-change
- name: removed-feature
title: Removed Features
semver-field: major
labels:
- removed
- name: deprecated-feature
title: Deprecated Features
semver-field: minor
labels:
- deprecated
- name: unknown
title: Additional Changes
semver-field: ""
labels: []
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**What happened**:
**What you expected to happen**:
**Steps to reproduce the issue**:
**Anything else we need to know?**:
**Environment**:
- Output of `syft version`:
- OS (e.g: `cat /etc/os-release` or similar):
================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
contact_links:
- name: Join our Discourse community 💬
# link to our community Discourse site
url: https://anchore.com/discourse
about: 'Come chat with us! Ask for help, join our software development efforts, or just give us feedback!'
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**What would you like to be added**:
**Why is this needed**:
**Additional context**:
<!-- Add any other context or screenshots about the feature request here. -->
================================================
FILE: .github/actions/bootstrap/action.yaml
================================================
name: "Bootstrap"
description: "Bootstrap all tools and dependencies"
inputs:
go-version:
description: "Go version to install"
required: true
default: "1.26.x"
go-dependencies:
description: "Download go dependencies"
required: true
default: "true"
cache-key-prefix:
description: "Prefix all cache keys with this value"
required: true
default: "53ac821810"
download-test-fixture-cache:
description: "Download test fixture cache from OCI and github actions"
required: true
default: "false"
tools:
description: "whether to install tools"
default: "true"
bootstrap-apt-packages:
description: "Space delimited list of tools to install via apt"
default: "libxml2-utils"
runs:
using: "composite"
steps:
# note: go mod and build is automatically cached on default with v4+
- uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
if: inputs.go-version != ''
with:
go-version: ${{ inputs.go-version }}
check-latest: true
- name: Restore tool cache
if: inputs.tools == 'true'
id: tool-cache
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ${{ github.workspace }}/.tool
key: ${{ inputs.cache-key-prefix }}-${{ runner.os }}-tool-${{ hashFiles('.binny.yaml') }}
- name: Install project tools
shell: bash
if: inputs.tools == 'true'
run: |
make tools
.tool/binny list
.tool/binny check
- name: Install go dependencies
if: inputs.go-dependencies == 'true'
shell: bash
run: make ci-bootstrap-go
- name: Install apt packages
if: inputs.bootstrap-apt-packages != ''
shell: bash
env:
APT_PACKAGES: ${{ inputs.bootstrap-apt-packages }}
run: |
IFS=' ' read -ra packages <<< "$APT_PACKAGES"
DEBIAN_FRONTEND=noninteractive sudo apt update && sudo -E apt install -y "${packages[@]}"
- name: Restore ORAS cache from github actions
if: inputs.download-test-fixture-cache == 'true'
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
with:
path: ${{ github.workspace }}/.tmp/oras-cache
key: ${{ inputs.cache-key-prefix }}-oras-cache
- name: Download test fixture cache
if: inputs.download-test-fixture-cache == 'true'
shell: bash
run: make download-test-fixture-cache
================================================
FILE: .github/dependabot.yml
================================================
# Dependabot configuration
#
# Grouping behavior (see inline comments for details):
# - Minor + patch updates: grouped into a single PR per ecosystem
# - Major version bumps: individual PR per dependency
# - Security updates: individual PR per dependency
#
# Note: "patch" refers to semver version bumps (1.2.3 -> 1.2.4), not security fixes.
# Security updates are identified separately via GitHub's Advisory Database and
# can be any version bump (patch, minor, or major) that fixes a known CVE.
version: 2
updates:
- package-ecosystem: gomod
directory: "/"
cooldown:
default-days: 7
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 10
labels:
- "dependencies"
groups:
go-minor-patch:
applies-to: version-updates # security updates get individual PRs
patterns:
- "*"
update-types: # major omitted, gets individual PRs
- "minor"
- "patch"
- package-ecosystem: "github-actions"
directories:
- "/"
- "/.github/actions/bootstrap"
cooldown:
default-days: 7
schedule:
interval: "weekly"
day: "friday"
open-pull-requests-limit: 10
labels:
- "dependencies"
groups:
actions-minor-patch:
applies-to: version-updates # security updates get individual PRs
patterns:
- "*"
update-types: # major omitted, gets individual PRs
- "minor"
- "patch"
================================================
FILE: .github/pull_request_template.md
================================================
## Description
<!-- Please include a summary of the changes along with any relevant motivation and context -->
<!-- If CLI output changed, show an example (before/after if helpful) -->
<!-- If this changes application or API configuration, describe new/changed/removed options -->
## Type of change
<!-- Delete any that are not relevant -->
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (please discuss with the team first; Syft is 1.0 software and we won't accept breaking changes without going to 2.0)
- [ ] Documentation (updates the documentation)
- [ ] Chore (improve the developer experience, fix a test flake, etc, without changing the visible behavior of Syft)
- [ ] Performance (make Syft run faster or use less memory, without changing visible behavior much)
## Checklist
- [ ] I have added unit tests that cover changed behavior
- [ ] I have tested my code in common scenarios and confirmed there are no regressions
- [ ] I have added comments to my code, particularly in hard-to-understand sections
## Issue references
<!-- If this fixes an issue, include "Fixes #<issue-number>" or otherwise list the issue references -->
================================================
FILE: .github/scripts/capability-drift-check.sh
================================================
#!/usr/bin/env bash
set -u
if [ "$(git status --porcelain | wc -l)" -ne "0" ]; then
echo " 🔴 there are uncommitted changes, please commit them before running this check"
exit 1
fi
if ! make generate-capabilities REFRESH=false; then
echo "Generating capability descriptions failed"
exit 1
fi
if [ "$(git status --porcelain | wc -l)" -ne "0" ]; then
echo " 🔴 there is drift in capability descriptions! Please run 'make generate-capabilities' and commit the changes."
exit 1
fi
================================================
FILE: .github/scripts/check_binary_fixture_size.sh
================================================
#!/bin/bash
# current limit for fixture size
size=1000
if [ $# -eq 0 ]; then
echo "Usage: $0 <directory>"
exit 1
fi
directory="$1"
# Remove trailing slash using parameter expansion
directory="${directory%/}"
if [ ! -d "$directory" ]; then
echo "Directory not found: $directory"
exit 1
fi
found_large_files=0
while IFS= read -r -d '' file; do
if [ $(wc -c < "$file") -gt $size ]; then
echo "File $file is greater than ${size} bytes."
found_large_files=1
fi
done < <(git ls-files -z "$directory")
if [ "$found_large_files" -eq 1 ]; then
echo "Script failed: Some files are greater than ${size} bytes."
exit 1
else
echo "All files in $directory and its subdirectories are ${size} bytes or smaller. Check passed."
exit 0
fi
================================================
FILE: .github/scripts/ci-check.sh
================================================
#!/usr/bin/env bash
red=$(tput setaf 1)
bold=$(tput bold)
normal=$(tput sgr0)
# assert we are running in CI (or die!)
if [[ -z "$CI" ]]; then
echo "${bold}${red}This step should ONLY be run in CI. Exiting...${normal}"
exit 1
fi
================================================
FILE: .github/scripts/coverage.py
================================================
#!/usr/bin/env python3
import subprocess
import sys
import shlex
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKCYAN = '\033[96m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
if len(sys.argv) < 3:
print("Usage: coverage.py [threshold] [go-coverage-report]")
sys.exit(1)
threshold = float(sys.argv[1])
report = sys.argv[2]
args = shlex.split(f"go tool cover -func {report}")
p = subprocess.run(args, capture_output=True, text=True)
percent_coverage = float(p.stdout.splitlines()[-1].split()[-1].replace("%", ""))
print(f"{bcolors.BOLD}Coverage: {percent_coverage}%{bcolors.ENDC}")
if percent_coverage < threshold:
print(f"{bcolors.BOLD}{bcolors.FAIL}Coverage below threshold of {threshold}%{bcolors.ENDC}")
sys.exit(1)
================================================
FILE: .github/scripts/find_cache_paths.py
================================================
#!/usr/bin/env python3
from __future__ import annotations
import os
import glob
import sys
import json
import hashlib
IGNORED_PREFIXES = []
def find_fingerprints_and_check_dirs(base_dir):
all_fingerprints = set(glob.glob(os.path.join(base_dir, '**', 'test*', '**', '*.fingerprint'), recursive=True))
all_fingerprints = {os.path.relpath(fp) for fp in all_fingerprints
if not any(fp.startswith(prefix) for prefix in IGNORED_PREFIXES)}
if not all_fingerprints:
show("No .fingerprint files or cache directories found.")
exit(1)
missing_content = []
valid_paths = set()
fingerprint_contents = []
for fingerprint in all_fingerprints:
path = fingerprint.replace('.fingerprint', '')
if not os.path.exists(path):
missing_content.append(path)
continue
if not os.path.isdir(path):
valid_paths.add(path)
continue
if os.listdir(path):
valid_paths.add(path)
else:
missing_content.append(path)
with open(fingerprint, 'r') as f:
content = f.read().strip()
fingerprint_contents.append((fingerprint, content))
return sorted(valid_paths), missing_content, fingerprint_contents
def parse_fingerprint_contents(fingerprint_content):
input_map = {}
for line in fingerprint_content.splitlines():
digest, path = line.split()
input_map[path] = digest
return input_map
def calculate_sha256(fingerprint_contents):
sorted_fingerprint_contents = sorted(fingerprint_contents, key=lambda x: x[0])
concatenated_contents = ''.join(content for _, content in sorted_fingerprint_contents)
sha256_hash = hashlib.sha256(concatenated_contents.encode()).hexdigest()
return sha256_hash
def calculate_file_sha256(file_path):
sha256_hash = hashlib.sha256()
with open(file_path, 'rb') as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
def show(*s: str):
print(*s, file=sys.stderr)
def main(file_path: str | None):
base_dir = '.'
valid_paths, missing_content, fingerprint_contents = find_fingerprints_and_check_dirs(base_dir)
if missing_content:
show("The following paths are missing or have no content, but have corresponding .fingerprint files:")
for path in sorted(missing_content):
show(f"- {path}")
# when adding new cache directories there is a time where it is not possible to have this directory without
# running the tests first... but this step is a prerequisite for running the tests. We should not block on this.
# show("Please ensure these paths exist and have content if they are directories.")
# exit(1)
sha256_hash = calculate_sha256(fingerprint_contents)
paths_with_digests = []
for path in sorted(valid_paths):
fingerprint_file = f"{path}.fingerprint"
try:
if os.path.exists(fingerprint_file):
file_digest = calculate_file_sha256(fingerprint_file)
# Parse the fingerprint file to get the digest/path tuples
with open(fingerprint_file, 'r') as f:
fingerprint_content = f.read().strip()
input_map = parse_fingerprint_contents(fingerprint_content)
paths_with_digests.append({
"path": path,
"digest": file_digest,
"input": input_map
})
except Exception as e:
show(f"Error processing {fingerprint_file}: {e}")
raise e
output = {
"digest": sha256_hash,
"paths": paths_with_digests
}
content = json.dumps(output, indent=2, sort_keys=True)
if file_path:
with open(file_path, 'w') as f:
f.write(content)
print(content)
if __name__ == "__main__":
file_path = None
if len(sys.argv) > 1:
file_path = sys.argv[1]
main(file_path)
================================================
FILE: .github/scripts/fingerprint_docker_fixtures.py
================================================
#!/usr/bin/env python3
import os
import subprocess
import hashlib
BOLD = '\033[1m'
YELLOW = '\033[0;33m'
RESET = '\033[0m'
def print_message(message):
print(f"{YELLOW}{message}{RESET}")
def sha256sum(filepath):
h = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b""):
h.update(chunk)
return h.hexdigest()
def is_git_tracked_or_untracked(directory):
"""Returns a sorted list of files in the directory that are tracked or not ignored by Git."""
result = subprocess.run(
["git", "ls-files", "--cached", "--others", "--exclude-standard"],
cwd=directory,
stdout=subprocess.PIPE,
text=True
)
return sorted(result.stdout.strip().splitlines())
def find_test_fixture_dirs_with_images(base_dir):
"""Find directories that contain 'testdata' and at least one 'image-*' directory."""
for root, dirs, files in os.walk(base_dir):
if 'testdata' in root:
image_dirs = [d for d in dirs if d.startswith('image-')]
if image_dirs:
yield os.path.realpath(root)
def generate_fingerprints():
print_message("creating fingerprint files for docker fixtures...")
for test_fixture_dir in find_test_fixture_dirs_with_images('.'):
cache_fingerprint_path = os.path.join(test_fixture_dir, 'cache.fingerprint')
with open(cache_fingerprint_path, 'w') as fingerprint_file:
for image_dir in find_image_dirs(test_fixture_dir):
for file in is_git_tracked_or_untracked(image_dir):
file_path = os.path.join(image_dir, file)
checksum = sha256sum(file_path)
path_from_fixture_dir = os.path.relpath(file_path, test_fixture_dir)
fingerprint_file.write(f"{checksum} {path_from_fixture_dir}\n")
def find_image_dirs(test_fixture_dir):
"""Find all 'image-*' directories inside a given test-fixture directory."""
result = []
for root, dirs, files in os.walk(test_fixture_dir):
for dir_name in dirs:
if dir_name.startswith('image-'):
result.append(os.path.join(root, dir_name))
return sorted(result)
if __name__ == "__main__":
generate_fingerprints()
================================================
FILE: .github/scripts/go-mod-tidy-check.sh
================================================
#!/usr/bin/env bash
set -eu
ORIGINAL_STATE_DIR=$(mktemp -d "TEMP-original-state-XXXXXXXXX")
TIDY_STATE_DIR=$(mktemp -d "TEMP-tidy-state-XXXXXXXXX")
trap "cp -p ${ORIGINAL_STATE_DIR}/* ./ && git update-index -q --refresh && rm -fR ${ORIGINAL_STATE_DIR} ${TIDY_STATE_DIR}" EXIT
# capturing original state of files...
cp go.mod go.sum "${ORIGINAL_STATE_DIR}"
# capturing state of go.mod and go.sum after running go mod tidy...
go mod tidy
cp go.mod go.sum "${TIDY_STATE_DIR}"
set +e
# detect difference between the git HEAD state and the go mod tidy state
DIFF_MOD=$(diff -u "${ORIGINAL_STATE_DIR}/go.mod" "${TIDY_STATE_DIR}/go.mod")
DIFF_SUM=$(diff -u "${ORIGINAL_STATE_DIR}/go.sum" "${TIDY_STATE_DIR}/go.sum")
if [[ -n "${DIFF_MOD}" || -n "${DIFF_SUM}" ]]; then
echo "go.mod diff:"
echo "${DIFF_MOD}"
echo "go.sum diff:"
echo "${DIFF_SUM}"
echo ""
printf "FAILED! go.mod and/or go.sum are NOT tidy; please run 'go mod tidy'.\n\n"
exit 1
fi
================================================
FILE: .github/scripts/json-schema-drift-check.sh
================================================
#!/usr/bin/env bash
set -u
if [ "$(git status --porcelain | wc -l)" -ne "0" ]; then
echo " 🔴 there are uncommitted changes, please commit them before running this check"
exit 1
fi
if ! make generate-json-schema; then
echo "Generating json schema failed"
exit 1
fi
if [ "$(git status --porcelain | wc -l)" -ne "0" ]; then
echo " 🔴 there is drift in json schema! Please run 'make generate-json-schema' and commit the changes."
exit 1
fi
================================================
FILE: .github/scripts/labeler.py
================================================
#!/usr/bin/env python3
from __future__ import annotations
import sys
import glob
import subprocess
import os
import re
DRY_RUN = False
JSON_SCHEMA_LABEL = "json-schema"
# note: we can't use "breaking-change" as the label since that might be applied manually by a user. This is a
# distinct label that we can use to indicate that the label was applied (or removed) by automation.
BREAKING_CHANGE_LABEL = "detected-breaking-change"
def main(changed_files: str | None = None, merge_base_schema_files: str | None = None):
global DRY_RUN
pr_number = os.environ.get("GITHUB_PR_NUMBER")
comment_file_path = os.environ.get("CI_COMMENT_FILE")
if not comment_file_path:
print("CI_COMMENT_FILE not set")
sys.exit(1)
if not pr_number:
DRY_RUN = True
if changed_files:
DRY_RUN = True
# read lines from file... this is useful for local testing
with open(changed_files) as f:
pr_changed_files = f.read().splitlines()
with open(merge_base_schema_files) as f:
og_json_schema_files = sort_json_schema_files(f.read().splitlines())
else:
if not is_ci():
print("Not in CI")
sys.exit(1)
if not pr_number:
print("Not a PR")
sys.exit(1)
pr_changed_files = get_pr_changed_files(pr_number)
# since we are running this in the context of the pull_request_target, the checkout is the merge base..
# that is the main branch of the original repo, NOT the branch in the forked repo (or branch in the target
# repo for non-forked PRs). This means we just need to list the current checkedout files to get a sense of
# the changes before a merge.
og_json_schema_files = list_json_schema_files()
pr_json_schema_files = filter_to_schema_files(pr_changed_files)
pr_labels = get_pr_labels(pr_number)
# print("schema files in pr: ", summarize_schema_files(pr_json_schema_files))
# print("og schema files: ", summarize_schema_files(og_json_schema_files))
if not og_json_schema_files:
print("No schema files found in merge base")
sys.exit(1)
# pr_json_schema_files = set of PR files are added, removed, and changed files
new_schema_files = set(pr_json_schema_files) - set(og_json_schema_files)
removed_or_modified_schema_files = set(pr_json_schema_files) - set(new_schema_files)
print("new schemas: ", summarize_schema_files(new_schema_files))
print("removed or modified schemas:", summarize_schema_files(removed_or_modified_schema_files))
# if there is a new or modified schema, we should add the "json-schema" label to the PR...
if new_schema_files or removed_or_modified_schema_files:
print("\nAdding json-schema label...")
add_label(pr_number, JSON_SCHEMA_LABEL)
else:
if JSON_SCHEMA_LABEL in pr_labels:
remove_label(pr_number, JSON_SCHEMA_LABEL)
# new schema files should be scrutinized, comparing the latest and added versions to see if it's a breaking
# change (major version bump). Warn about it on the PR via adding a breaking-change label...
if is_breaking_change(new_schema_files, og_json_schema_files[-1]):
print("\nBreaking change detected...")
add_label(pr_number, BREAKING_CHANGE_LABEL)
else:
if BREAKING_CHANGE_LABEL in pr_labels:
remove_label(pr_number, BREAKING_CHANGE_LABEL)
# modifying an existing schema could be a breaking change, we should warn about it on the PR via a comment...
# removing schema files should never be allowed, we should warn about it on the PR via a comment...
if removed_or_modified_schema_files:
print("\nRemoved or modified schema detected...")
schemas = sort_json_schema_files(list(removed_or_modified_schema_files))
schemas_str = "\n".join([f" - {schema}" for schema in schemas])
add_comment(comment_file_path, f"Detected modification or removal of existing json schemas:\n{schemas_str}", warning=True)
def add_comment(comment_file_path: str, comment: str, warning: bool = False, important: bool = False):
if warning or important:
comment_lines = comment.splitlines()
comment = "\n".join([f"> {line}" for line in comment_lines])
if warning:
comment = f"> [!WARNING]\n{comment}"
elif important:
comment = f"> [!IMPORTANT]\n{comment}"
# create any parent directories if they don't exist
os.makedirs(os.path.dirname(comment_file_path), exist_ok=True)
with open(comment_file_path, "w") as f:
f.write(comment)
print(f"Comment file contents: {comment_file_path}")
print(comment)
def add_label(pr_number: str, label: str):
# run "gh pr edit --add-label <label>"
result = run(f"gh pr edit {pr_number} --add-label {label}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
print(f"Unable to add '{label!r}' label to PR, error:")
print(str(result.stderr))
sys.exit(1)
def remove_label(pr_number: str, label: str):
# run "gh pr edit --remove-label <label>"
result = run(f"gh pr edit {pr_number} --remove-label {label}", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
if result.returncode != 0:
print(f"Unable to remove '{label!r}' label from PR, error:")
print(str(result.stderr))
sys.exit(1)
def major_version(semver: str) -> int:
return int(semver.split(".")[0])
def is_breaking_change(new_schema_files: set[str], latest_schema_file: str) -> bool:
latest_major_version = major_version(get_semver(latest_schema_file))
for file in new_schema_files:
change_major_version = major_version(get_semver(file))
if change_major_version > latest_major_version:
return True
return False
def summarize_schema_files(files: list[str]) -> list[str]:
return [get_semver(file) for file in files]
def is_ci() -> bool:
return "CI" in os.environ
def get_pr_changed_files(pr_number: str) -> list[str]:
result = run(f"gh pr view {pr_number} --json files --jq '.files.[].path'", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode != 0:
print("Unable to get list of changed files in PR")
print(str(result.stderr))
sys.exit(1)
list_of_files = result.stdout.splitlines()
return list_of_files
def get_pr_labels(pr_number: str) -> list[str]:
result = run(f"gh pr view {pr_number} --json labels --jq '.labels[].name'", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if result.returncode != 0:
print("Unable to get list of labels on PR")
print(str(result.stderr))
sys.exit(1)
list_of_labels = result.stdout.splitlines()
return list_of_labels
def filter_to_schema_files(list_of_files: list[str]) -> list[str]:
# get files matching "schema/json/schema-*.json"
files = []
for file in list_of_files:
if re.match(r"^schema/json/schema-\d+\.\d+\.\d+\.json$", file):
files.append(file)
return sort_json_schema_files(files)
def list_json_schema_files() -> list[str]:
# list files in "schema/json" directory matching the pattern of "schema-*.json"
# special case: always ignore the "latest" schema file
return sort_json_schema_files([f for f in glob.glob("schema/json/schema-*.json") if "latest" not in f])
def run(command: str, **kwargs) -> subprocess.CompletedProcess:
if DRY_RUN:
print(f"[DRY RUN] {command}")
return subprocess.CompletedProcess(args=[command], returncode=0)
print(f"[RUN] {command}")
return subprocess.run(command, **kwargs)
def get_semver(input_file: str) -> str:
return input_file.split("-")[1].split(".json")[0]
def sort_json_schema_files(files: list[str]) -> list[str]:
# sort files by schema version, where the input looks like "schema/json/schema-1.12.1.json"
# we should sort by the semantic version embedded within the basename, not the string
# so that "schema/json/schema-1.2.1.json" comes before "schema/json/schema-1.12.1.json".
versions = [get_semver(file) for file in files if file]
versions = sorted(versions, key=lambda s: [int(u) for u in s.split('.') if "." in s])
return [f"schema/json/schema-{version}.json" for version in versions]
# allow for test files that have line-by-line list of files:
# .binny.yaml
# .github/actions/bootstrap/action.yaml
# .github/scripts/goreleaser-install.sh
# .github/workflows/release.yaml
# .github/workflows/update-bootstrap-tools.yml
# .github/workflows/update-cpe-dictionary-index.yml
# .github/workflows/update-stereoscope-release.yml
# .github/workflows/validations.yaml
# .gitignore
# .goreleaser.yaml
# Makefile
# Taskfile.yaml
# schema/cyclonedx/Makefile
if __name__ == "__main__":
# these are variables for a single file name that contains a list of files (line separated)
changed_files = None
merge_base_schema_files = None
if len(sys.argv) > 2:
changed_files = sys.argv[1]
merge_base_schema_files = sys.argv[2]
main(changed_files, merge_base_schema_files)
================================================
FILE: .github/scripts/labeler_test.py
================================================
#!/usr/bin/env python3
import unittest
from unittest.mock import patch
import subprocess
import labeler
class Labeler(unittest.TestCase):
def test_major_version(self):
self.assertEqual(labeler.major_version("1.2.3"), 1)
self.assertEqual(labeler.major_version("2.0.0"), 2)
def test_is_breaking_change(self):
new_schema_files = ["schema/json/schema-2.0.0.json"]
latest_schema_file = "schema/json/schema-1.2.0.json"
self.assertTrue(labeler.is_breaking_change(new_schema_files, latest_schema_file))
new_schema_files = ["schema/json/schema-1.3.0.json"]
latest_schema_file = "schema/json/schema-1.2.0.json"
self.assertFalse(labeler.is_breaking_change(new_schema_files, latest_schema_file))
def test_summarize_schema_files(self):
files = ["schema/json/schema-1.0.0.json", "schema/json/schema-2.0.0.json"]
expected = ["1.0.0", "2.0.0"]
self.assertEqual(labeler.summarize_schema_files(files), expected)
def test_is_ci(self):
# Mock os.environ to simulate CI environment
with patch.dict("os.environ", {"CI": "true"}):
self.assertTrue(labeler.is_ci())
def test_get_pr_changed_files(self):
expected_command = "gh pr view 123 --json files --jq '.files.[].path'"
expected_output = "file1.json\nfile2.json\n"
subprocess.CompletedProcess.returncode = 0
subprocess.CompletedProcess.stdout = expected_output
with patch("labeler.run", return_value=subprocess.CompletedProcess) as mock_run:
result = labeler.get_pr_changed_files("123")
mock_run.assert_called_with(expected_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
self.assertEqual(result, ["file1.json", "file2.json"])
def test_filter_to_schema_files(self):
input_files = ["schema/json/schema-1.0.0.json", "not_schema.txt", "schema/json/schema-2.0.0.json"]
expected_files = ["schema/json/schema-1.0.0.json", "schema/json/schema-2.0.0.json"]
self.assertEqual(labeler.filter_to_schema_files(input_files), expected_files)
# we should be strict about what files are allowed to be processed
input_files = ["schema/json/schema-1.0.0extracontent.json", "schema/json/schema-1.0.0.md", "schema/json/schema-1.0.0.json.extracontent"]
expected_files = []
self.assertEqual(labeler.filter_to_schema_files(input_files), expected_files)
def test_get_semver(self):
input_file = "schema/json/schema-1.0.0.json"
expected_semver = "1.0.0"
self.assertEqual(labeler.get_semver(input_file), expected_semver)
def test_sort_json_schema_files(self):
files = ["schema/json/schema-1.12.1.json", "schema/json/schema-1.2.1.json"]
expected_sorted_files = ["schema/json/schema-1.2.1.json", "schema/json/schema-1.12.1.json"]
self.assertEqual(labeler.sort_json_schema_files(files), expected_sorted_files)
# ensure that "latest" doesn't cause a problem and is ultimately ignored
files = ["schema/json/schema-1.12.1.json", "schema/json/schema-_bogus.json"]
expected_sorted_files = ["schema/json/schema-_bogus.json", "schema/json/schema-1.12.1.json"]
self.assertEqual(labeler.sort_json_schema_files(files), expected_sorted_files)
if __name__ == "__main__":
unittest.main()
================================================
FILE: .github/scripts/trigger-release.sh
================================================
#!/usr/bin/env bash
set -eu
bold=$(tput bold)
normal=$(tput sgr0)
GH_CLI=.tool/gh
if ! [ -x "$(command -v $GH_CLI)" ]; then
echo "The GitHub CLI could not be found. run: make bootstrap"
exit 1
fi
$GH_CLI auth status
# set the default repo in cases where multiple remotes are defined
$GH_CLI repo set-default anchore/syft
export GITHUB_TOKEN="${GITHUB_TOKEN-"$($GH_CLI auth token)"}"
# we need all of the git state to determine the next version. Since tagging is done by
# the release pipeline it is possible to not have all of the tags from previous releases.
git fetch --tags
# populates the CHANGELOG.md and VERSION files
echo "${bold}Generating changelog...${normal}"
make changelog 2> /dev/null
NEXT_VERSION=$(cat VERSION)
if [[ "$NEXT_VERSION" == "" || "${NEXT_VERSION}" == "(Unreleased)" ]]; then
echo "Could not determine the next version to release. Exiting..."
exit 1
fi
while true; do
read -p "${bold}Do you want to trigger a release for version '${NEXT_VERSION}'?${normal} [y/n] " yn
case $yn in
[Yy]* ) echo; break;;
[Nn]* ) echo; echo "Cancelling release..."; exit;;
* ) echo "Please answer yes or no.";;
esac
done
echo "${bold}Kicking off release for ${NEXT_VERSION}${normal}..."
echo
$GH_CLI workflow run release.yaml -f version=${NEXT_VERSION}
echo
echo "${bold}Waiting for release to start...${normal}"
sleep 10
set +e
echo "${bold}Head to the release workflow to monitor the release:${normal} $($GH_CLI run list --workflow=release.yaml --limit=1 --json url --jq '.[].url')"
id=$($GH_CLI run list --workflow=release.yaml --limit=1 --json databaseId --jq '.[].databaseId')
$GH_CLI run watch $id --exit-status || (echo ; echo "${bold}Logs of failed step:${normal}" && GH_PAGER="" $GH_CLI run view $id --log-failed)
================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
name: "CodeQL Security Scan"
on:
push:
branches:
# only run when there are pushes to the main branch (not on PRs)
- main
schedule:
- cron: '0 0 * * 3'
permissions:
contents: read
jobs:
analyze:
name: Analyze
runs-on: ubuntu-22.04-4core-16gb
if: github.repository == 'anchore/syft' # only run for main repo
permissions:
security-events: write
strategy:
fail-fast: false
matrix:
# Override automatic language detection by changing the below list
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
language: ['go', 'python']
# Learn more...
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Install Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 #v6.3.0
with:
go-version-file: go.mod
check-latest: true
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
# ℹ️ Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
================================================
FILE: .github/workflows/dependabot-automation.yaml
================================================
name: Dependabot Automation
on:
pull_request:
permissions:
pull-requests: write
jobs:
run:
uses: anchore/workflows/.github/workflows/dependabot-automation.yaml@main
================================================
FILE: .github/workflows/detect-schema-changes.yaml
================================================
name: "Detect schema changes"
on:
# IMPORTANT! This workflow is triggered by the `pull_request_target` event
# which means that forked PRs will run with access secrets from the repo
# it's forked from (the "target" repo).
#
# For this reason we only NEVER checkout the code from the pull request
# (e.g. "ref: ${{ github.event.pull_request.head.sha }}") to prevent
# accidentally running potentially untrusted code.
#
# By default the checkout will be:
# - GITHUB_SHA: Last commit on the PR base branch
# - GITHUB_REF: PR base branch
#
# ...unlike a typical PR where:
# - GITHUB_SHA: Last merge commit on the GITHUB_REF branch
# - GITHUB_REF: PR merge branch refs/pull/:prNumber/merge
pull_request_target:
env:
# note: this is used within hashFiles() so must be within the GITHUB_WORKSPACE path (or will silently fail)
CI_COMMENT_FILE: .tmp/labeler-comment.txt
# needs to be any string to uniquely identify the comment on a PR across multiple runs
COMMENT_HEADER: "label-commentary"
jobs:
label:
name: "Label changes"
runs-on: ubuntu-22.04
permissions:
contents: read
pull-requests: write
issues: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- run: python .github/scripts/labeler.py
env:
# note: this token has write access to the repo
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_PR_NUMBER: ${{ github.event.number }}
- name: Delete existing comment
if: ${{ hashFiles( env.CI_COMMENT_FILE ) == '' }}
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 #v2.9.4
with:
header: ${{ env.COMMENT_HEADER }}
hide: true
hide_classify: "OUTDATED"
- name: Add comment
if: ${{ hashFiles( env.CI_COMMENT_FILE ) != '' }}
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 #v2.9.4
with:
header: ${{ env.COMMENT_HEADER }}
path: ${{ env.CI_COMMENT_FILE }}
================================================
FILE: .github/workflows/oss-project-board-add.yaml
================================================
name: Add to OSS board
permissions:
contents: read
on:
issues:
types:
- opened
- reopened
- transferred
- labeled
jobs:
run:
uses: "anchore/workflows/.github/workflows/oss-project-board-add.yaml@main"
secrets:
token: ${{ secrets.OSS_PROJECT_GH_TOKEN }}
================================================
FILE: .github/workflows/release.yaml
================================================
name: "Release"
permissions:
contents: read
on:
workflow_dispatch:
inputs:
version:
description: tag the latest commit on main with the given version (prefixed with v)
required: true
phase:
description: the specific workflow phase to run or all
required: true
default: "all"
type: choice
options:
- "all"
- "install-script-only"
jobs:
quality-gate:
environment: release
if: ${{ github.event.inputs.phase == 'all' }}
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
- name: Validate Apple notarization credentials
run: .tool/quill submission list
env:
QUILL_NOTARY_ISSUER: ${{ secrets.APPLE_NOTARY_ISSUER }}
QUILL_NOTARY_KEY_ID: ${{ secrets.APPLE_NOTARY_KEY_ID }}
QUILL_NOTARY_KEY: ${{ secrets.APPLE_NOTARY_KEY }}
- name: Check if running on main
if: github.ref != 'refs/heads/main'
# we are using the following flag when running `cosign blob-verify` for checksum signature verification:
# --certificate-identity-regexp "https://github.com/anchore/.github/workflows/release.yaml@refs/heads/main"
# if we are not on the main branch, the signature will not be verifiable since the suffix requires the main branch
# at the time of when the OIDC token was issued on the Github Actions runner.
run: echo "This can only be run on the main branch otherwise releases produced will not be verifiable with cosign" && exit 1
- name: Check if tag already exists
# note: this will fail if the tag already exists
run: |
[[ "$VERSION" == v* ]] || (echo "version '$VERSION' does not have a 'v' prefix" && exit 1)
git tag "$VERSION"
env:
VERSION: ${{ github.event.inputs.version }}
- name: Check static analysis results
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: static-analysis
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "Static analysis"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Check unit test results
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: unit
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "Unit tests"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Check integration test results
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: integration
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "Integration tests"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Check acceptance test results (linux)
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: acceptance-linux
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "Acceptance tests (Linux)"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Check acceptance test results (mac)
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: acceptance-mac
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "Acceptance tests (Mac)"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Check cli test results (linux)
uses: fountainhead/action-wait-for-check@5a908a24814494009c4bb27c242ea38c93c593be # v1.2.0
id: cli-linux
with:
token: ${{ secrets.GITHUB_TOKEN }}
# This check name is defined as the github action job name (in .github/workflows/testing.yaml)
checkName: "CLI tests (Linux)"
ref: ${{ github.event.pull_request.head.sha || github.sha }}
- name: Quality gate
if: steps.static-analysis.outputs.conclusion != 'success' || steps.unit.outputs.conclusion != 'success' || steps.integration.outputs.conclusion != 'success' || steps.cli-linux.outputs.conclusion != 'success' || steps.acceptance-linux.outputs.conclusion != 'success' || steps.acceptance-mac.outputs.conclusion != 'success'
env:
STATIC_ANALYSIS_STATUS: ${{ steps.static-analysis.conclusion }}
UNIT_TEST_STATUS: ${{ steps.unit.outputs.conclusion }}
INTEGRATION_TEST_STATUS: ${{ steps.integration.outputs.conclusion }}
ACCEPTANCE_LINUX_STATUS: ${{ steps.acceptance-linux.outputs.conclusion }}
ACCEPTANCE_MAC_STATUS: ${{ steps.acceptance-mac.outputs.conclusion }}
CLI_LINUX_STATUS: ${{ steps.cli-linux.outputs.conclusion }}
run: |
echo "Static Analysis Status: $STATIC_ANALYSIS_STATUS"
echo "Unit Test Status: $UNIT_TEST_STATUS"
echo "Integration Test Status: $INTEGRATION_TEST_STATUS"
echo "Acceptance Test (Linux) Status: $ACCEPTANCE_LINUX_STATUS"
echo "Acceptance Test (Mac) Status: $ACCEPTANCE_MAC_STATUS"
echo "CLI Test (Linux) Status: $CLI_LINUX_STATUS"
false
release:
needs: [ quality-gate ]
if: ${{ github.event.inputs.phase == 'all' }}
# runs-on.com: compute instances for parallel builds
# spot disabled: reliability for build workflows (used for releases too)
# goreleaser uses parallelism of 12, so we need more CPUs
# s3-cache: faster actions cache
# tmpfs: faster io-intensive workflows
runs-on: runs-on=${{ github.run_id }}/cpu=16+32/ram=32+128/family=c5+c6+c7+c8/spot=false/extras=s3-cache+tmpfs
permissions:
contents: write
packages: write
# required for goreleaser signs section with cosign
id-token: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
fetch-depth: 0
persist-credentials: true
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
- name: Login to Docker Hub
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 #v4.0.0
with:
username: ${{ secrets.ANCHOREOSSWRITE_DH_USERNAME }}
password: ${{ secrets.ANCHOREOSSWRITE_DH_PAT }}
- name: Login to GitHub Container Registry
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 #v4.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Tag release
run: |
git config --global user.name "anchoreci"
git config --global user.email "anchoreci@users.noreply.github.com"
git tag -a "$VERSION" -m "Release $VERSION"
git push origin --tags
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
VERSION: ${{ github.event.inputs.version }}
- name: Build & publish release artifacts
run: make ci-release
env:
# for mac signing and notarization...
QUILL_SIGN_P12: ${{ secrets.ANCHORE_APPLE_DEVELOPER_ID_CERT_CHAIN }}
QUILL_SIGN_PASSWORD: ${{ secrets.ANCHORE_APPLE_DEVELOPER_ID_CERT_PASS }}
QUILL_NOTARY_ISSUER: ${{ secrets.APPLE_NOTARY_ISSUER }}
QUILL_NOTARY_KEY_ID: ${{ secrets.APPLE_NOTARY_KEY_ID }}
QUILL_NOTARY_KEY: ${{ secrets.APPLE_NOTARY_KEY }}
# for creating the release (requires write access to packages and content)
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# for updating brew formula in anchore/homebrew-syft
GITHUB_BREW_TOKEN: ${{ secrets.ANCHOREOPS_GITHUB_OSS_WRITE_TOKEN }}
- uses: anchore/sbom-action@17ae1740179002c89186b61233e0f892c3118b11 #v0.23.0
continue-on-error: true
with:
file: go.mod
artifact-name: sbom.spdx.json
- name: Notify Slack of new release
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a #v2.1.1
continue-on-error: true
with:
webhook: ${{ secrets.SLACK_TOOLBOX_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
text: "A new Syft release has been published: https://github.com/anchore/syft/releases/tag/${{ github.event.inputs.version }}"
blocks:
- type: section
text:
type: mrkdwn
text: |
*A new Syft release has been published* :rocket:
• Release: <https://github.com/anchore/syft/releases/tag/${{ github.event.inputs.version }}|${{ github.event.inputs.version }}>
• Repo: `${{ github.repository }}`
• Workflow: `${{ github.workflow }}`
• Event: `${{ github.event_name }}`
if: ${{ success() }}
release-install-script:
needs: [ release ]
if: ${{ always() && (needs.release.result == 'success' || github.event.inputs.phase == 'install-script-only') }}
uses: "anchore/workflows/.github/workflows/release-install-script.yaml@main"
with:
tag: ${{ github.event.inputs.version }}
secrets:
# needed for r2...
R2_INSTALL_ACCESS_KEY_ID: ${{ secrets.OSS_R2_INSTALL_ACCESS_KEY_ID }}
R2_INSTALL_SECRET_ACCESS_KEY: ${{ secrets.OSS_R2_INSTALL_SECRET_ACCESS_KEY }}
R2_ENDPOINT: ${{ secrets.TOOLBOX_CLOUDFLARE_R2_ENDPOINT }}
# needed for s3...
S3_INSTALL_AWS_ACCESS_KEY_ID: ${{ secrets.TOOLBOX_AWS_ACCESS_KEY_ID }}
S3_INSTALL_AWS_SECRET_ACCESS_KEY: ${{ secrets.TOOLBOX_AWS_SECRET_ACCESS_KEY }}
================================================
FILE: .github/workflows/remove-awaiting-response-label.yaml
================================================
name: "Manage Awaiting Response Label"
on:
issue_comment:
types: [created]
jobs:
run:
permissions:
contents: read
issues: write
pull-requests: write
uses: "anchore/workflows/.github/workflows/remove-awaiting-response-label.yaml@main"
secrets:
token: ${{ secrets.OSS_PROJECT_GH_TOKEN }}
================================================
FILE: .github/workflows/test-fixture-cache-publish.yaml
================================================
name: "Test fixture cache: publish"
on:
workflow_dispatch:
schedule:
# run nightly at 4AM UTC
- cron: "0 4 * * *"
permissions:
contents: read
jobs:
Publish:
name: "Publish test fixture image cache"
# runs-on.com: general purpose instances for building test fixture cache
# spot disabled: can run up to an hour, avoid interruptions
# s3-cache: faster actions cache
# family: note that m*d instances have local nvme storage which is beneficial for building large test fixture images
runs-on: "runs-on=${{ github.run_id }}/cpu=8+16/ram=32+64/family=m5d+m5ad+m5dn+m6gd+m6id+m6idn+m7gd+m8gd/spot=false/extras=s3-cache"
if: github.repository == 'anchore/syft' # only run for main repo
permissions:
packages: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
# we want to rebuild the cache with no previous state
download-test-fixture-cache: false
- name: Run all tests
run: |
make test
env:
# we want to rebuild the cache with no previous state
DOWNLOAD_TEST_FIXTURE_CACHE: "false"
- name: Login to GitHub Container Registry (ORAS)
run: echo "${{ secrets.GITHUB_TOKEN }}" | .tool/oras login ghcr.io -u "$ACTOR" --password-stdin
env:
ACTOR: ${{ github.actor }}
- name: Publish test fixture cache
run: make upload-test-fixture-cache
================================================
FILE: .github/workflows/update-anchore-dependencies.yml
================================================
name: PR to update Anchore dependencies
on:
workflow_dispatch:
inputs:
repos:
description: "List of dependencies to update"
required: true
type: string
permissions:
contents: read
jobs:
update:
runs-on: ubuntu-latest
if: github.repository_owner == 'anchore' # only run for main repo (not forks)
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
tools: false
bootstrap-apt-packages: ""
- name: Update dependencies
id: update
uses: anchore/workflows/.github/actions/update-go-dependencies@main
with:
repos: ${{ github.event.inputs.repos }}
- uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf #v2.2.1
id: generate-token
with:
app-id: ${{ secrets.TOKEN_APP_ID }}
private-key: ${{ secrets.TOKEN_APP_PRIVATE_KEY }}
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
signoff: true
delete-branch: true
draft: ${{ steps.update.outputs.draft }}
# do not change this branch, as other workflows depend on it
branch: auto/integration
labels: dependencies,pre-release
commit-message: "chore(deps): update anchore dependencies"
title: "chore(deps): update anchore dependencies"
body: ${{ steps.update.outputs.summary }}
token: ${{ steps.generate-token.outputs.token }}
================================================
FILE: .github/workflows/update-bootstrap-tools.yml
================================================
name: PR for latest versions of tools
on:
schedule:
- cron: "0 8 * * *" # 3 AM EST
workflow_dispatch:
permissions:
contents: read
jobs:
update-bootstrap-tools:
runs-on: ubuntu-latest
if: github.repository == 'anchore/syft' # only run for main repo
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
bootstrap-apt-packages: ""
go-dependencies: false
- name: "Update tool versions"
id: latest-versions
run: |
make update-tools
make list-tools
export NO_COLOR=1
delimiter="$(openssl rand -hex 8)"
{
echo "status<<${delimiter}"
make list-tool-updates
echo "${delimiter}"
} >> $GITHUB_OUTPUT
{
echo "### Tool version status"
echo "\`\`\`"
make list-tool-updates
echo "\`\`\`"
} >> $GITHUB_STEP_SUMMARY
- uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf #v2.2.1
id: generate-token
with:
app-id: ${{ secrets.TOKEN_APP_ID }}
private-key: ${{ secrets.TOKEN_APP_PRIVATE_KEY }}
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
signoff: true
delete-branch: true
branch: auto/latest-tools
labels: dependencies
commit-message: 'chore(deps): update tools to latest versions'
title: 'chore(deps): update tools to latest versions'
body: |
```
${{ steps.latest-versions.outputs.status }}
```
This is an auto-generated pull request to update all of the tools to the latest versions.
token: ${{ steps.generate-token.outputs.token }}
================================================
FILE: .github/workflows/update-cpe-dictionary-index.yml
================================================
name: PR to update CPE dictionary index
on:
schedule:
- cron: "0 1 * * 1" # every monday at 1 AM
workflow_dispatch:
permissions:
contents: read
env:
SLACK_NOTIFICATIONS: true
jobs:
upgrade-cpe-dictionary-index:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
if: github.repository == 'anchore/syft' # only run for main repo
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
id: bootstrap
- name: Login to GitHub Container Registry
run: echo "${{ secrets.GITHUB_TOKEN }}" | .tool/oras login ghcr.io -u "$ACTOR" --password-stdin
env:
ACTOR: ${{ github.actor }}
- name: Pull CPE cache from registry
run: make generate:cpe-index:cache:pull
- name: Update CPE cache from NVD API
run: make generate:cpe-index:cache:update
env:
NVD_API_KEY: ${{ secrets.NVD_API_KEY }}
- name: Generate CPE dictionary index
run: make generate:cpe-index:build
- name: Push updated CPE cache to registry
run: make generate:cpe-index:cache:push
- uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf #v2.2.1
id: generate-token
with:
app-id: ${{ secrets.TOKEN_APP_ID }}
private-key: ${{ secrets.TOKEN_APP_PRIVATE_KEY }}
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
signoff: true
delete-branch: true
branch: auto/latest-cpe-dictionary-index
labels: dependencies
commit-message: "chore(deps): update CPE dictionary index"
title: "chore(deps): update CPE dictionary index"
body: |
Update CPE dictionary index based on the latest available CPE dictionary
token: ${{ steps.generate-token.outputs.token }}
- name: Notify Slack on failure
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a #v2.1.1
with:
webhook: ${{ secrets.SLACK_TOOLBOX_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
text: "Syft CPE dictionary index update failed"
blocks:
- type: section
text:
type: mrkdwn
text: |
*Syft CPE dictionary index update failed*
• Workflow: `${{ github.workflow }}`
• Event: `${{ github.event_name }}`
• Job Status: `${{ job.status }}`
• <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>
if: ${{ failure() && env.SLACK_NOTIFICATIONS == 'true' }}
================================================
FILE: .github/workflows/update-spdx-license-list.yaml
================================================
name: PR to update SPDX license list
on:
schedule:
- cron: "0 6 * * 1" # every monday at 6 AM UTC
workflow_dispatch:
permissions:
contents: read
env:
SLACK_NOTIFICATIONS: true
jobs:
upgrade-spdx-license-list:
runs-on: ubuntu-latest
if: github.repository == 'anchore/syft' # only run for main repo
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
- run: |
make generate-license-list
- uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a #v2.1.0
id: generate-token
with:
app_id: ${{ secrets.TOKEN_APP_ID }}
private_key: ${{ secrets.TOKEN_APP_PRIVATE_KEY }}
- uses: peter-evans/create-pull-request@c0f553fe549906ede9cf27b5156039d195d2ece0 #v8.1.0
with:
signoff: true
delete-branch: true
branch: auto/latest-spdx-license-list
labels: dependencies
commit-message: "chore(deps): update SPDX license list"
title: "chore(deps): update SPDX license list"
body: |
Update SPDX license list based on the latest available list from spdx.org
token: ${{ steps.generate-token.outputs.token }}
- name: Notify Slack on failure
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a #v2.1.1
with:
webhook: ${{ secrets.SLACK_TOOLBOX_WEBHOOK_URL }}
webhook-type: incoming-webhook
payload: |
text: "Syft SPDX license list update failed"
blocks:
- type: section
text:
type: mrkdwn
text: |
*Syft SPDX license list update failed*
• Workflow: `${{ github.workflow }}`
• Event: `${{ github.event_name }}`
• Job Status: `${{ job.status }}`
• <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View Run>
if: ${{ failure() && env.SLACK_NOTIFICATIONS == 'true' }}
================================================
FILE: .github/workflows/validate-github-actions.yaml
================================================
name: "Validate GitHub Actions"
on:
pull_request:
paths:
- '.github/workflows/**'
- '.github/actions/**'
push:
branches:
- main
paths:
- '.github/workflows/**'
- '.github/actions/**'
permissions:
contents: read
jobs:
zizmor:
name: "Lint"
runs-on: ubuntu-latest
permissions:
contents: read
security-events: write # for uploading SARIF results
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: "Run zizmor"
uses: zizmorcore/zizmor-action@0dce2577a4760a2749d8cfb7a84b7d5585ebcb7d # v0.5.0
with:
config: .github/zizmor.yml
# Disable SARIF upload so the step is a simple pass/fail gate
advanced-security: false
inputs: .github
================================================
FILE: .github/workflows/validations.yaml
================================================
name: "Validations"
# we should cancel any in-progress runs for the same workflow + PR/ref
# so that we can avoid redundant work / save on CI minutes
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
on:
workflow_dispatch:
pull_request:
push:
branches:
- main
permissions:
contents: read
jobs:
Static-Analysis:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "Static analysis"
# runs-on.com: memory & general purpose instances for testing
# spot enabled: ok to interrupt non-production workloads
# s3-cache: faster actions cache
# tmpfs: faster io-intensive workflows
runs-on: &test-runner "runs-on=${{ github.run_id }}/cpu=4+8/ram=32+128/family=r5+r6+r7+r8+m4+m5+m6+m7+m8/spot=price-capacity-optimized/extras=s3-cache+tmpfs"
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
# the self-consistency tests for the output of the capabilities code generation depends on unit test
# output from ./syft/pkg/... packages. Therefore we need to download the test fixture cache here
# so that running the few unit tests as part of static analysis works correctly.
download-test-fixture-cache: true
- name: Run static analysis
run: make static-analysis
Unit-Test:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "Unit tests"
runs-on: *test-runner
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
download-test-fixture-cache: true
- name: Run unit tests
run: make unit
- name: Check for capability drift
run: make check-capability-drift
Integration-Test:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "Integration tests"
runs-on: *test-runner
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
download-test-fixture-cache: true
- name: Validate syft output against the CycloneDX schema
run: make validate-cyclonedx-schema
- name: Run integration tests
run: make integration
Build-Snapshot-Artifacts:
name: "Build snapshot artifacts"
# runs-on.com: compute instances for parallel builds
# spot disabled: reliability for build workflows (used for releases too)
# goreleaser uses parallelism of 12, so we need more CPUs
# s3-cache: faster actions cache
# tmpfs: faster io-intensive workflows
runs-on: "runs-on=${{ github.run_id }}/cpu=16+32/ram=32+128/family=c5+c6+c7+c8/spot=false/extras=s3-cache+tmpfs"
steps:
# required for magic-cache from runs-on to function with artifact upload/download (see https://runs-on.com/caching/magic-cache/#actionsupload-artifact-compatibility)
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # v2.0.3
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
bootstrap-apt-packages: ""
- name: Build snapshot artifacts
run: make snapshot
- name: Smoke test snapshot build
run: make snapshot-smoke-test
- name: Upload snapshot artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
with:
name: snapshot
path: snapshot/
retention-days: 30
Acceptance-Linux:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "Acceptance tests (Linux)"
needs: [Build-Snapshot-Artifacts]
runs-on: *test-runner
steps:
# required for magic-cache from runs-on to function with artifact upload/download (see https://runs-on.com/caching/magic-cache/#actionsupload-artifact-compatibility)
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # v2.0.3
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
download-test-fixture-cache: true
- name: Download snapshot artifacts
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 #v8.0.0
with:
name: snapshot
path: snapshot
- name: Restore binary permissions
run: chmod +x snapshot/*/syft snapshot/*/*.exe 2>/dev/null || true
- name: Run comparison tests (Linux)
run: make compare-linux
- name: Load test image cache
if: steps.install-test-image-cache.outputs.cache-hit == 'true'
run: make install-test-cache-load
- name: Run install.sh tests (Linux)
run: make install-test
- name: (cache-miss) Create test image cache
if: steps.install-test-image-cache.outputs.cache-hit != 'true'
run: make install-test-cache-save
Acceptance-Mac:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "Acceptance tests (Mac)"
needs: [Build-Snapshot-Artifacts]
# note: macos runners aren't supported yet for runs-on managed runners.
runs-on: macos-latest
steps:
- name: Install Cosign
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
bootstrap-apt-packages: ""
go-dependencies: false
download-test-fixture-cache: true
- name: Download snapshot artifacts
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 #v8.0.0
with:
name: snapshot
path: snapshot
- name: Restore binary permissions
run: chmod +x snapshot/*/syft 2>/dev/null || true
- name: Run comparison tests (Mac)
run: make compare-mac
- name: Run install.sh tests (Mac)
run: make install-test-ci-mac
Cli-Linux:
# Note: changing this job name requires making the same update in the .github/workflows/release.yaml pipeline
name: "CLI tests (Linux)"
needs: [Build-Snapshot-Artifacts]
runs-on: *test-runner
steps:
# required for magic-cache from runs-on to function with artifact upload/download (see https://runs-on.com/caching/magic-cache/#actionsupload-artifact-compatibility)
- uses: runs-on/action@cd2b598b0515d39d78c38a02d529db87d2196d1e # v2.0.3
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd #v6.0.2
with:
persist-credentials: false
- name: Bootstrap environment
uses: ./.github/actions/bootstrap
with:
download-test-fixture-cache: true
- name: Download snapshot artifacts
uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 #v8.0.0
with:
name: snapshot
path: snapshot
- name: Restore binary permissions
run: chmod +x snapshot/*/syft snapshot/*/*.exe 2>/dev/null || true
- name: Run CLI Tests (Linux)
run: make cli
================================================
FILE: .github/zizmor.yml
================================================
rules:
unpinned-uses:
config:
policies:
# anchore/workflows is an internal repository; using @main is acceptable
anchore/*: any
dangerous-triggers:
ignore:
# Safe use of pull_request_target - only runs trusted scripts from base repo,
# never checks out PR code, needs secrets for labeling PRs from forks
- detect-schema-changes.yaml
================================================
FILE: .gitignore
================================================
# local development tailoring
go.work
go.work.sum
.tool-versions
.python-version
# app configuration
/.syft.yaml
# tool and bin directories
.tmp/
bin/
/bin
/.bin
/build
/dist
/snapshot
/.tool
/.task
/generate
/specs
mise.toml
# changelog generation
CHANGELOG.md
VERSION
# IDE configuration
.vscode/
.idea/
.server/
.history/
# test related
*.fingerprint
/test/results
coverage.txt
*.log
**/test-fixtures/test-observations.json
**/testdata/test-observations.json
# probable archives
.images
*.tar
*.jar
*.war
*.ear
*.jpi
*.hpi
*.zip
*.iml
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, build with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# macOS Finder metadata
.DS_STORE
*.profile
# attestation
cosign.key
cosign.pub
# Byte-compiled object files for python
__pycache__/
*.py[cod]
*$py.class
================================================
FILE: .golangci.yaml
================================================
version: "2"
run:
tests: false
linters:
default: none
enable:
- asciicheck
- bodyclose
- copyloopvar
- dogsled
- dupl
- errcheck
- funlen
- gocognit
- goconst
- gocritic
- gocyclo
- goprintffuncname
- gosec
- govet
- ineffassign
- misspell
- nakedret
- nolintlint
- revive
- staticcheck
- unconvert
- unparam
- unused
- whitespace
settings:
funlen:
lines: 70
statements: 50
gocritic:
enabled-checks:
- deferInLoop
- ruleguard
settings:
ruleguard:
rules: test/rules/rules.go
gosec:
excludes:
- G115
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
# we have multiple packages in syft that might overlap with the stblib; their names reflect their purpose
- linters:
- revive
text: "var-naming: avoid package names that conflict"
paths:
- third_party$
- builtin$
- examples$
# do not enable...
# - deadcode # The owner seems to have abandoned the linter. Replaced by "unused".
# - depguard # We don't have a configuration for this yet
# - goprintffuncname # does not catch all cases and there are exceptions
# - nakedret # does not catch all cases and should not fail a build
# - gochecknoglobals
# - gochecknoinits # this is too aggressive
# - rowserrcheck disabled per generics https://github.com/golangci/golangci-lint/issues/2649
# - godot
# - godox
# - goerr113
# - goimports # we're using gosimports now instead to account for extra whitespaces (see https://github.com/golang/go/issues/20818)
# - golint # deprecated
# - gomnd # this is too aggressive
# - interfacer # this is a good idea, but is no longer supported and is prone to false positives
# - lll # without a way to specify per-line exception cases, this is not usable
# - maligned # this is an excellent linter, but tricky to optimize and we are not sensitive to memory layout optimizations
# - nestif
# - prealloc # following this rule isn't consistently a good idea, as it sometimes forces unnecessary allocations that result in less idiomatic code
# - rowserrcheck # not in a repo with sql, so this is not useful
# - scopelint # deprecated
# - structcheck # The owner seems to have abandoned the linter. Replaced by "unused".
# - testpackage
# - varcheck # The owner seems to have abandoned the linter. Replaced by "unused".
# - wsl # this doens't have an auto-fixer yet and is pretty noisy (https://github.com/bombsimon/wsl/issues/90)
issues:
max-same-issues: 25
uniq-by-line: false
# TODO: enable this when we have coverage on docstring comments
# # The list of ids of default excludes to include or disable.
# include:
# - EXC0002 # disable excluding of issues about comments from golint
formatters:
enable:
- gofmt
- goimports
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
================================================
FILE: .goreleaser.yaml
================================================
version: 2
project_name: syft
release:
prerelease: auto
draft: false
env:
- DOCKER_CLI_EXPERIMENTAL=enabled
- CGO_ENABLED=0
builds:
- id: linux-build
dir: ./cmd/syft
binary: syft
goos: [linux]
goarch: [amd64, arm64, ppc64le, s390x]
mod_timestamp: &build-timestamp '{{ .CommitTimestamp }}'
ldflags: &build-ldflags |
-w
-s
-extldflags '-static'
-X main.version={{.Version}}
-X main.gitCommit={{.Commit}}
-X main.buildDate={{.Date}}
-X main.gitDescription={{.Summary}}
- id: darwin-build
dir: ./cmd/syft
binary: syft
goos: [darwin]
goarch: [amd64, arm64]
mod_timestamp: *build-timestamp
ldflags: *build-ldflags
hooks:
post:
- cmd: .tool/quill sign-and-notarize "{{ .Path }}" --dry-run={{ .IsSnapshot }} --ad-hoc={{ .IsSnapshot }} -vv
env:
- QUILL_LOG_FILE=/tmp/quill-{{ .Target }}.log
- id: windows-build
dir: ./cmd/syft
binary: syft
goos: [windows]
goarch: [amd64, arm64]
mod_timestamp: *build-timestamp
ldflags: *build-ldflags
archives:
- id: linux-archives
ids: [linux-build]
- id: darwin-archives
ids: [darwin-build]
- id: windows-archives
formats:
- zip
ids: [windows-build]
nfpms:
- license: "Apache 2.0"
maintainer: "Anchore, Inc"
homepage: &website "https://github.com/anchore/syft"
description: &description "A tool that generates a Software Bill Of Materials (SBOM) from container images and filesystems"
formats: [rpm, deb]
brews:
- repository:
owner: anchore
name: homebrew-syft
token: "{{.Env.GITHUB_BREW_TOKEN}}"
ids: [darwin-archives, linux-archives]
homepage: *website
description: *description
license: "Apache License 2.0"
dockers:
# production images...
- image_templates:
- anchore/syft:{{.Tag}}-amd64
- ghcr.io/anchore/syft:{{.Tag}}-amd64
goarch: amd64
dockerfile: Dockerfile
use: buildx
build_flag_templates:
- "--platform=linux/amd64"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-arm64v8
goarch: arm64
dockerfile: Dockerfile
use: buildx
build_flag_templates:
- "--platform=linux/arm64/v8"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-ppc64le
goarch: ppc64le
dockerfile: Dockerfile
use: buildx
build_flag_templates:
- "--platform=linux/ppc64le"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-s390x
- ghcr.io/anchore/syft:{{.Tag}}-s390x
goarch: s390x
dockerfile: Dockerfile
use: buildx
build_flag_templates:
- "--platform=linux/s390x"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
# nonroot images...
- image_templates:
- anchore/syft:{{.Tag}}-nonroot-amd64
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-amd64
goarch: amd64
dockerfile: Dockerfile.nonroot
use: buildx
build_flag_templates:
- "--platform=linux/amd64"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-nonroot-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-arm64v8
goarch: arm64
dockerfile: Dockerfile.nonroot
use: buildx
build_flag_templates:
- "--platform=linux/arm64/v8"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-nonroot-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-ppc64le
goarch: ppc64le
dockerfile: Dockerfile.nonroot
use: buildx
build_flag_templates:
- "--platform=linux/ppc64le"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-nonroot-s390x
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-s390x
goarch: s390x
dockerfile: Dockerfile.nonroot
use: buildx
build_flag_templates:
- "--platform=linux/s390x"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
# debug images...
- image_templates:
- anchore/syft:{{.Tag}}-debug-amd64
- ghcr.io/anchore/syft:{{.Tag}}-debug-amd64
goarch: amd64
dockerfile: Dockerfile.debug
use: buildx
build_flag_templates:
- "--platform=linux/amd64"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-debug-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-debug-arm64v8
goarch: arm64
dockerfile: Dockerfile.debug
use: buildx
build_flag_templates:
- "--platform=linux/arm64/v8"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-debug-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-debug-ppc64le
goarch: ppc64le
dockerfile: Dockerfile.debug
use: buildx
build_flag_templates:
- "--platform=linux/ppc64le"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
- image_templates:
- anchore/syft:{{.Tag}}-debug-s390x
- ghcr.io/anchore/syft:{{.Tag}}-debug-s390x
goarch: s390x
dockerfile: Dockerfile.debug
use: buildx
build_flag_templates:
- "--platform=linux/s390x"
- "--build-arg=BUILD_DATE={{.Date}}"
- "--build-arg=BUILD_VERSION={{.Version}}"
- "--build-arg=VCS_REF={{.FullCommit}}"
- "--build-arg=VCS_URL={{.GitURL}}"
docker_manifests:
- name_template: anchore/syft:latest
image_templates:
- anchore/syft:{{.Tag}}-amd64
- anchore/syft:{{.Tag}}-arm64v8
- anchore/syft:{{.Tag}}-ppc64le
- anchore/syft:{{.Tag}}-s390x
- name_template: ghcr.io/anchore/syft:latest
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-amd64
- ghcr.io/anchore/syft:{{.Tag}}-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-s390x
- name_template: anchore/syft:{{.Tag}}
image_templates:
- anchore/syft:{{.Tag}}-amd64
- anchore/syft:{{.Tag}}-arm64v8
- anchore/syft:{{.Tag}}-ppc64le
- anchore/syft:{{.Tag}}-s390x
- name_template: ghcr.io/anchore/syft:{{.Tag}}
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-amd64
- ghcr.io/anchore/syft:{{.Tag}}-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-s390x
# nonroot images...
- name_template: anchore/syft:nonroot
image_templates:
- anchore/syft:{{.Tag}}-nonroot-amd64
- anchore/syft:{{.Tag}}-nonroot-arm64v8
- anchore/syft:{{.Tag}}-nonroot-ppc64le
- anchore/syft:{{.Tag}}-nonroot-s390x
- name_template: ghcr.io/anchore/syft:nonroot
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-amd64
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-s390x
- name_template: anchore/syft:{{.Tag}}-nonroot
image_templates:
- anchore/syft:{{.Tag}}-nonroot-amd64
- anchore/syft:{{.Tag}}-nonroot-arm64v8
- anchore/syft:{{.Tag}}-nonroot-ppc64le
- anchore/syft:{{.Tag}}-nonroot-s390x
- name_template: ghcr.io/anchore/syft:{{.Tag}}-nonroot
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-amd64
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-nonroot-s390x
# debug images...
- name_template: anchore/syft:debug
image_templates:
- anchore/syft:{{.Tag}}-debug-amd64
- anchore/syft:{{.Tag}}-debug-arm64v8
- anchore/syft:{{.Tag}}-debug-ppc64le
- anchore/syft:{{.Tag}}-debug-s390x
- name_template: ghcr.io/anchore/syft:debug
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-debug-amd64
- ghcr.io/anchore/syft:{{.Tag}}-debug-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-debug-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-debug-s390x
- name_template: anchore/syft:{{.Tag}}-debug
image_templates:
- anchore/syft:{{.Tag}}-debug-amd64
- anchore/syft:{{.Tag}}-debug-arm64v8
- anchore/syft:{{.Tag}}-debug-ppc64le
- anchore/syft:{{.Tag}}-debug-s390x
- name_template: ghcr.io/anchore/syft:{{.Tag}}-debug
image_templates:
- ghcr.io/anchore/syft:{{.Tag}}-debug-amd64
- ghcr.io/anchore/syft:{{.Tag}}-debug-arm64v8
- ghcr.io/anchore/syft:{{.Tag}}-debug-ppc64le
- ghcr.io/anchore/syft:{{.Tag}}-debug-s390x
sboms:
- artifacts: archive
cmd: ../.tool/syft
documents:
- "{{ .Binary }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}.sbom"
args:
- "scan"
- "$artifact"
- "--output"
- "json=$document"
signs:
- cmd: .tool/cosign
signature: "${artifact}.sig"
certificate: "${artifact}.pem"
args:
- "sign-blob"
- "--use-signing-config=false"
- "--oidc-issuer=https://token.actions.githubusercontent.com"
- "--output-certificate=${certificate}"
- "--output-signature=${signature}"
- "${artifact}"
- "--yes"
artifacts: checksum
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
All contributors for any Anchore project must follow the [Contributor Covenant Code of Conduct](https://oss.anchore.com/docs/contributing/code-of-conduct/).
**TLDR:** Be kind, be respectful, and assume good intentions. We're all here to build great software together.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
Thank you for your interest in contributing to Syft!
Please see the [contribution guide](https://oss.anchore.com/docs/contributing/syft/) for development requirements and helpful tips to get started developing in the repo. For a deeper dive, please see the [architecture docs](https://oss.anchore.com/docs/architecture/syft/).
**Have a question or need help?** Check out our [issues and discussions guide](https://oss.anchore.com/docs/contributing/issues-and-discussions/) to find the right place to start a conversation.
**Ready to submit code?** Our [pull request guide](https://oss.anchore.com/docs/contributing/pull-requests/) covers everything from title conventions to the review process. Don't forget that ***all commits require a [sign-off](https://oss.anchore.com/docs/contributing/sign-off/)***.
**Found a security issue?** Please do **not** open a public issue. Instead, see our [security policy](https://oss.anchore.com/docs/contributing/security/) for how to report vulnerabilities responsibly.
**Want to help improve the docs?** Check out the [anchore/oss-docs](https://github.com/anchore/oss-docs) repository.
================================================
FILE: CONTRIBUTORS.md
================================================
# Syft Contributors
The following Syft components were contributed by external authors/organizations.
## GraalVM Native Image
A cataloger contributed by Oracle Corporation that extracts packages given within GraalVM Native Image SBOMs.
## Swift Package Manager
A cataloger contributed by Axis Communications that catalogs packages resolved by Swift Package Manager.
## Bitnami Packages
A cataloger contributed by Bitnami developer that catalogs packages described in Bitnami SBOMs.
================================================
FILE: Dockerfile
================================================
FROM gcr.io/distroless/static-debian12:latest AS build
FROM scratch
# needed for version check HTTPS request
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
# create the /tmp dir, which is needed for image content cache
WORKDIR /tmp
COPY syft /
ARG BUILD_DATE
ARG BUILD_VERSION
ARG VCS_REF
ARG VCS_URL
LABEL org.opencontainers.image.created=$BUILD_DATE
LABEL org.opencontainers.image.title="syft"
LABEL org.opencontainers.image.description="CLI tool and library for generating a Software Bill of Materials from container images and filesystems"
LABEL org.opencontainers.image.source=$VCS_URL
LABEL org.opencontainers.image.revision=$VCS_REF
LABEL org.opencontainers.image.vendor="Anchore, Inc."
LABEL org.opencontainers.image.version=$BUILD_VERSION
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL io.artifacthub.package.readme-url="https://raw.githubusercontent.com/anchore/syft/main/README.md"
LABEL io.artifacthub.package.logo-url="https://user-images.githubusercontent.com/5199289/136844524-1527b09f-c5cb-4aa9-be54-5aa92a6086c1.png"
LABEL io.artifacthub.package.license="Apache-2.0"
ENTRYPOINT ["/syft"]
================================================
FILE: Dockerfile.debug
================================================
FROM gcr.io/distroless/static-debian12:debug-nonroot
# create the /tmp dir, which is needed for image content cache
WORKDIR /tmp
COPY syft /
USER nonroot
ARG BUILD_DATE
ARG BUILD_VERSION
ARG VCS_REF
ARG VCS_URL
LABEL org.opencontainers.image.created=$BUILD_DATE
LABEL org.opencontainers.image.title="syft"
LABEL org.opencontainers.image.description="CLI tool and library for generating a Software Bill of Materials from container images and filesystems"
LABEL org.opencontainers.image.source=$VCS_URL
LABEL org.opencontainers.image.revision=$VCS_REF
LABEL org.opencontainers.image.vendor="Anchore, Inc."
LABEL org.opencontainers.image.version=$BUILD_VERSION
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL io.artifacthub.package.readme-url="https://raw.githubusercontent.com/anchore/syft/main/README.md"
LABEL io.artifacthub.package.logo-url="https://user-images.githubusercontent.com/5199289/136844524-1527b09f-c5cb-4aa9-be54-5aa92a6086c1.png"
LABEL io.artifacthub.package.license="Apache-2.0"
ENTRYPOINT ["/syft"]
================================================
FILE: Dockerfile.nonroot
================================================
FROM gcr.io/distroless/static-debian12:nonroot
# create the /tmp dir, which is needed for image content cache
WORKDIR /tmp
COPY syft /
USER nonroot
ARG BUILD_DATE
ARG BUILD_VERSION
ARG VCS_REF
ARG VCS_URL
LABEL org.opencontainers.image.created=$BUILD_DATE
LABEL org.opencontainers.image.title="syft"
LABEL org.opencontainers.image.description="CLI tool and library for generating a Software Bill of Materials from container images and filesystems"
LABEL org.opencontainers.image.source=$VCS_URL
LABEL org.opencontainers.image.revision=$VCS_REF
LABEL org.opencontainers.image.vendor="Anchore, Inc."
LABEL org.opencontainers.image.version=$BUILD_VERSION
LABEL org.opencontainers.image.licenses="Apache-2.0"
LABEL io.artifacthub.package.readme-url="https://raw.githubusercontent.com/anchore/syft/main/README.md"
LABEL io.artifacthub.package.logo-url="https://user-images.githubusercontent.com/5199289/136844524-1527b09f-c5cb-4aa9-be54-5aa92a6086c1.png"
LABEL io.artifacthub.package.license="Apache-2.0"
ENTRYPOINT ["/syft"]
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: Makefile
================================================
OWNER = anchore
PROJECT = syft
TOOL_DIR = .tool
BINNY = $(TOOL_DIR)/binny
TASK = $(TOOL_DIR)/task
.DEFAULT_GOAL := make-default
## Bootstrapping targets #################################
# note: we need to assume that binny and task have not already been installed
$(BINNY):
@mkdir -p $(TOOL_DIR)
@curl -sSfL https://get.anchore.io/binny | sh -s -- -b $(TOOL_DIR)
# note: we need to assume that binny and task have not already been installed
.PHONY: task
$(TASK) task: $(BINNY)
@$(BINNY) install task -q
.PHONY: ci-bootstrap-go
ci-bootstrap-go:
go mod download
# this is a bootstrapping catch-all, where if the target doesn't exist, we'll ensure the tools are installed and then try again
%:
@make --silent $(TASK)
@$(TASK) $@
## Shim targets #################################
.PHONY: make-default
make-default: $(TASK)
@# run the default task in the taskfile
@$(TASK)
# for those of us that can't seem to kick the habit of typing `make ...` lets wrap the superior `task` tool
TASKS := $(shell bash -c "test -f $(TASK) && NO_COLOR=1 $(TASK) -l | grep '^\* ' | cut -d' ' -f2 | tr -d ':' | tr '\n' ' '" ) $(shell bash -c "test -f $(TASK) && NO_COLOR=1 $(TASK) -l | grep 'aliases:' | cut -d ':' -f 3 | tr '\n' ' ' | tr -d ','")
.PHONY: $(TASKS)
$(TASKS): $(TASK)
@$(TASK) $@
help: $(TASK)
@$(TASK) -l
================================================
FILE: README.md
================================================
<p align="center">
<img src="https://user-images.githubusercontent.com/5199289/136844524-1527b09f-c5cb-4aa9-be54-5aa92a6086c1.png" width="271" alt="Cute pink owl syft logo">
</p>
# Syft
**A CLI tool and Go library for generating a Software Bill of Materials (SBOM) from container images and filesystems. Exceptional for vulnerability detection when used with a scanner like [Grype](https://github.com/anchore/grype).**
<p align="center">
<a href="https://github.com/anchore/syft/actions/workflows/validations.yaml" target="_blank"><img alt="Validations" src="https://github.com/anchore/syft/actions/workflows/validations.yaml/badge.svg"></a>
<a href="https://goreportcard.com/report/github.com/anchore/syft" target="_blank"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/anchore/syft"></a>
<a href="https://github.com/anchore/syft/releases/latest" target="_blank"><img alt="GitHub release" src="https://img.shields.io/github/release/anchore/syft.svg"></a>
<a href="https://github.com/anchore/syft" target="_blank"><img alt="GitHub go.mod Go version" src="https://img.shields.io/github/go-mod/go-version/anchore/syft.svg"></a>
<a href="" target="_blank"><img alt="License: Apache-2.0" src="https://img.shields.io/badge/License-Apache%202.0-blue.svg"></a>
<a href="https://anchore.com/discourse" target="_blank"><img alt="Join our Discourse" src="https://img.shields.io/badge/Discourse-Join-blue?logo=discourse"/></a>
<a rel="me" href="https://fosstodon.org/@syft"><img alt="Follow on Mastodon" src="https://img.shields.io/badge/Mastodon-Follow-blue?logoColor=white&logo=mastodon"/></a>
</p>

## Features
- Generates SBOMs for **container images**, **filesystems**, **archives** (see the docs for a full list of [supported scan targets](https://oss.anchore.com/docs/guides/sbom/scan-targets/))
- Supports dozens of packaging ecosystems (e.g. Alpine (apk), Debian (dpkg), RPM, Go, Python, Java, JavaScript, Ruby, Rust, PHP, .NET, and [many more](https://oss.anchore.com/docs/capabilities/all-packages/))
- Supports OCI, Docker, [Singularity](https://github.com/sylabs/singularity), and [more image formats](https://oss.anchore.com/docs/guides/sbom/scan-targets/)
- Works seamlessly with [Grype](https://github.com/anchore/grype) for vulnerability scanning
- Multiple output formats (**CycloneDX**, **SPDX**, **Syft JSON**, and [more](https://oss.anchore.com/docs/guides/sbom/formats/)) including the ability to [convert between SBOM formats](https://oss.anchore.com/docs/guides/sbom/conversion/)
- Create signed SBOM attestations using the [in-toto specification](https://github.com/in-toto/attestation/blob/main/spec/README.md)
> [!TIP]
> **New to Syft? Check out the [Getting Started guide](https://oss.anchore.com/docs/guides/sbom/getting-started/) for a walkthrough!**
## Installation
The quickest way to get up and going:
```bash
curl -sSfL https://get.anchore.io/syft | sudo sh -s -- -b /usr/local/bin
```
> [!TIP]
> **See [Installation docs](https://oss.anchore.com/docs/installation/syft/) for more ways to get Syft, including Homebrew, Docker, Scoop, Chocolatey, Nix, and more!**
## The basics
See the packages within a container image or directory:
```bash
# container image
syft alpine:latest
# directory
syft ./my-project
```
To get an SBOM, specify one or more output formats:
```bash
# SBOM to stdout
syft <image> -o cyclonedx-json
# Multiple SBOMs to files
syft <image> -o spdx-json=./spdx.json -o cyclonedx-json=./cdx.json
```
> [!TIP]
> **Check out the [Getting Started guide](https://oss.anchore.com/docs/guides/sbom/getting-started/)** to explore all of the capabilities and features.
>
> **Want to know all of the ins-and-outs of Syft?** Check out the [CLI docs](https://oss.anchore.com/docs/reference/syft/cli/), [configuration docs](https://oss.anchore.com/docs/reference/syft/configuration/), and [JSON schema](https://oss.anchore.com/docs/reference/syft/json/latest/).
## Contributing
We encourage users to help make these tools better by [submitting issues](https://github.com/anchore/syft/issues) when you find a bug or want a new feature.
Check out our [contributing overview](https://oss.anchore.com/docs/contributing/) and [developer-specific documentation](https://oss.anchore.com/docs/contributing/syft/) if you are interested in providing code contributions.
<p xmlns:cc="http://creativecommons.org/ns#" xmlns:dct="http://purl.org/dc/terms/">
Syft development is sponsored by <a href="https://anchore.com/">Anchore</a>, and is released under the <a href="https://github.com/anchore/syft?tab=Apache-2.0-1-ov-file">Apache-2.0 License</a>.
The <a property="dct:title" rel="cc:attributionURL" href="https://anchore.com/wp-content/uploads/2024/11/syft-logo.svg">Syft logo</a> by <a rel="cc:attributionURL dct:creator" property="cc:attributionName" href="https://anchore.com/">Anchore</a> is licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank" rel="license noopener noreferrer" style="display:inline-block;">CC BY 4.0<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt=""><img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt=""></a>
</p>
For commercial support options with Syft or Grype, please [contact Anchore](https://get.anchore.com/contact/).
## Come talk to us!
The Syft Team holds regular community meetings online. All are welcome to join to bring topics for discussion.
- Check the [calendar](https://calendar.google.com/calendar/u/0/r?cid=Y182OTM4dGt0MjRtajI0NnNzOThiaGtnM29qNEBncm91cC5jYWxlbmRhci5nb29nbGUuY29t) for the next meeting date.
- Add items to the [agenda](https://docs.google.com/document/d/1ZtSAa6fj2a6KRWviTn3WoJm09edvrNUp4Iz_dOjjyY8/edit?usp=sharing) (join [this group](https://groups.google.com/g/anchore-oss-community) for write access to the [agenda](https://docs.google.com/document/d/1ZtSAa6fj2a6KRWviTn3WoJm09edvrNUp4Iz_dOjjyY8/edit?usp=sharing))
- See you there!
================================================
FILE: RELEASE.md
================================================
# Release
A release of syft comprises:
- a new semver git tag from the current tip of the main branch
- a new [github release](https://github.com/anchore/syft/releases) with a changelog and archived binary assets
- docker images published to `ghcr.io` and `dockerhub`, including multi architecture images + manifest
- [`anchore/homebrew-syft`](https://github.com/anchore/homebrew-syft) tap updated to point to assets in the latest github release
Ideally releasing should be done often with small increments when possible. Unless a
breaking change is blocking the release, or no fixes/features have been merged, a good
target release cadence is between every 1 or 2 weeks.
## Creating a release
This release process itself should be as automated as possible, and has only a few steps:
1. **Trigger a new release with `make release`**. At this point you'll see a preview
changelog in the terminal. If you're happy with the changelog, press `y` to continue, otherwise
you can abort and adjust the labels on the PRs and issues to be included in the release and
re-run the release trigger command.
1. A release admin must approve the release on the GitHub Actions [release pipeline](https://github.com/anchore/syft/actions/workflows/release.yaml) run page.
Once approved, the release pipeline will generate all assets and publish a GitHub Release.
## Retracting a release
If a release is found to be problematic, it can be retracted with the following steps:
- Deleting the GitHub Release
- Untag the docker images in the `ghcr.io` and `docker.io` registries
- Revert the brew formula in [`anchore/homebrew-syft`](https://github.com/anchore/homebrew-syft) to point to the previous release
- Add a new `retract` entry in the go.mod for the versioned release
**Note**: do not delete release tags from the git repository since there may already be references to the release
in the go proxy, which will cause confusion when trying to reuse the tag later (the H1 hash will not match and there
will be a warning when users try to pull the new release).
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
Security updates are applied only to the most recent release, try to always be up to date.
## Reporting a Vulnerability
To report a security issue, please email
[security@anchore.com](mailto:security@anchore.com)
with a description of the issue, the steps you took to create the issue,
affected versions, and, if known, mitigations for the issue.
All support will be made on a best effort basis, so please indicate the "urgency level" of the vulnerability as Critical, High, Medium or Low.
For more details, see our [security policy documentation](https://oss.anchore.com/docs/contributing/security/).
================================================
FILE: Taskfile.yaml
================================================
version: "3"
includes:
generate:cpe-index: ./task.d/generate/cpe-index.yaml
vars:
OWNER: anchore
PROJECT: syft
# v1: when fixtures were located at test-fixtures dirs
# v2: migration to testdata dirs
CACHE_IMAGE: ghcr.io/{{ .OWNER }}/{{ .PROJECT }}/test-fixture-cache:v2
# static file dirs
TOOL_DIR: .tool
TMP_DIR: .tmp
ORAS_CACHE: "{{ .TMP_DIR }}/oras-cache"
CACHE_PATHS_FILE: "{{ .TMP_DIR }}/cache_paths.json"
LAST_CACHE_PULL_FILE: "{{ .TMP_DIR }}/last_cache_paths.json"
# TOOLS
ORAS: "{{ .TOOL_DIR }}/oras"
YQ: "{{ .TOOL_DIR }}/yq"
TASK: "{{ .TOOL_DIR }}/task"
# used for changelog generation
CHANGELOG: CHANGELOG.md
NEXT_VERSION: VERSION
# used for snapshot builds
OS:
sh: uname -s | tr '[:upper:]' '[:lower:]'
ARCH:
sh: |
[ "$(uname -m)" = "x86_64" ] && echo "amd64_v1" || { [ "$(uname -m)" = "aarch64" ] && echo "arm64_v8.0" || [ "$(uname -m)" = "arm64" ] && echo "arm64_v8.0" || echo $(uname -m); }
PROJECT_ROOT:
sh: echo $PWD
# note: the snapshot dir must be a relative path starting with ./
# e.g. when installing snapshot debs from a local path, ./ forces the deb to be installed in the current working directory instead of referencing a package name
SNAPSHOT_DIR: ./snapshot
SNAPSHOT_BIN: "{{ .PROJECT_ROOT }}/{{ .SNAPSHOT_DIR }}/{{ .OS }}-build_{{ .OS }}_{{ .ARCH }}/{{ .PROJECT }}"
SNAPSHOT_CMD: "{{ .TOOL_DIR }}/goreleaser release --config {{ .TMP_DIR }}/goreleaser.yaml --clean --snapshot --skip=publish --skip=sign"
BUILD_CMD: "{{ .TOOL_DIR }}/goreleaser build --config {{ .TMP_DIR }}/goreleaser.yaml --clean --snapshot --single-target"
RELEASE_CMD: "{{ .TOOL_DIR }}/goreleaser release --clean --release-notes {{ .CHANGELOG }}"
VERSION:
sh: git describe --dirty --always --tags
# used for install and acceptance testing
COMPARE_DIR: ./test/compare
COMPARE_TEST_IMAGE: centos:8.2.2004
env:
GNUMAKEFLAGS: '--no-print-directory'
tasks:
## High-level tasks #################################
default:
desc: Run all validation tasks
aliases:
- pr-validations
- validations
cmds:
- task: static-analysis
- task: test
- task: install-test
static-analysis:
desc: Run all static analysis tasks
cmds:
- task: check-go-mod-tidy
- task: check-licenses
- task: lint
- task: check-json-schema-drift
- task: check-binary-fixture-size
test:
desc: Run all levels of test
cmds:
- task: unit
- task: integration
- task: validate-cyclonedx-schema
- task: test-utils
- task: snapshot
- task: cli
- task: check-docker-cache
## Bootstrap tasks #################################
binny:
internal: true
# desc: Get the binny tool
generates:
- "{{ .TOOL_DIR }}/binny"
status:
- "test -f {{ .TOOL_DIR }}/binny"
cmd: "curl -sSfL https://get.anchore.io/binny | sh -s -- -b .tool"
silent: true
tools:
desc: Install all tools needed for CI and local development
deps: [binny]
aliases:
- bootstrap
generates:
- ".binny.yaml"
- "{{ .TOOL_DIR }}/*"
status:
- "{{ .TOOL_DIR }}/binny check -v"
cmd: "{{ .TOOL_DIR }}/binny install -v"
silent: true
update-tools:
desc: Update pinned versions of all tools to their latest available versions
deps: [binny]
generates:
- ".binny.yaml"
- "{{ .TOOL_DIR }}/*"
cmd: "{{ .TOOL_DIR }}/binny update -v"
silent: true
list-tools:
desc: List all tools needed for CI and local development
deps: [binny]
cmd: "{{ .TOOL_DIR }}/binny list"
silent: true
list-tool-updates:
desc: List all tools that are not up to date relative to the binny config
deps: [binny]
cmd: "{{ .TOOL_DIR }}/binny list --updates"
silent: true
tmpdir:
silent: true
generates:
- "{{ .TMP_DIR }}"
cmd: "mkdir -p {{ .TMP_DIR }}"
## Static analysis tasks #################################
format:
desc: Auto-format all source code
deps: [tools]
cmds:
- gofmt -w -s .
- "{{ .TOOL_DIR }}/gosimports -local github.com/anchore -w ."
- go mod tidy
lint-fix:
desc: Auto-format all source code + run golangci lint fixers
deps: [tools]
cmds:
- task: format
- "{{ .TOOL_DIR }}/golangci-lint run --tests=false --fix"
lint:
desc: Run gofmt + golangci lint checks
vars:
BAD_FMT_FILES:
sh: gofmt -l -s .
BAD_FILE_NAMES:
sh: "find . | grep -e ':' || true"
deps: [tools]
cmds:
# ensure there are no go fmt differences
- cmd: 'test -z "{{ .BAD_FMT_FILES }}" || (echo "files with gofmt issues: [{{ .BAD_FMT_FILES }}]"; exit 1)'
silent: true
# ensure there are no files with ":" in it (a known back case in the go ecosystem)
- cmd: 'test -z "{{ .BAD_FILE_NAMES }}" || (echo "files with bad names: [{{ .BAD_FILE_NAMES }}]"; exit 1)'
silent: true
# run linting
- "{{ .TOOL_DIR }}/golangci-lint run --tests=false"
check-licenses:
# desc: Ensure transitive dependencies are compliant with the current license policy
deps: [tools]
cmd: "{{ .TOOL_DIR }}/bouncer check ./..."
check-go-mod-tidy:
# desc: Ensure go.mod and go.sum are up to date
cmds:
- cmd: .github/scripts/go-mod-tidy-check.sh && echo "go.mod and go.sum are tidy!"
silent: true
check-json-schema-drift:
desc: Ensure there is no drift between the JSON schema and the code
cmds:
- .github/scripts/json-schema-drift-check.sh
check-capability-drift:
desc: Ensure there is no drift between the capabilities data and the code
cmds:
- .github/scripts/capability-drift-check.sh
check-binary-fixture-size:
desc: Ensure that the binary test fixtures are not too large
cmds:
- .github/scripts/check_binary_fixture_size.sh syft/pkg/cataloger/binary/testdata/classifiers/snippets
## Testing tasks #################################
update-format-golden-files:
desc: "Update golden (i.e. snapshot) files used by unit tests"
cmds:
- go test ./syft/format/spdxjson -update-spdx-json
- go test ./syft/format/spdxtagvalue -update-spdx-tv
- go test ./syft/format/cyclonedxxml -update-cyclonedx-xml
- go test ./syft/format/cyclonedxjson -update-cyclonedx-json
- go test ./syft/format/syftjson -update-json
unit:
desc: Run unit tests
deps:
- tmpdir
- fixtures
vars:
TEST_PKGS:
sh: "go list ./... | grep -v {{ .OWNER }}/{{ .PROJECT }}/test | grep -v {{ .OWNER }}/{{ .PROJECT }}/cmd/syft/internal/test | tr '\n' ' '"
# unit test coverage threshold (in % coverage)
COVERAGE_THRESHOLD: 62
cmds:
- task: clean-test-observations
- "go test -coverprofile {{ .TMP_DIR }}/unit-coverage-details.txt {{ .TEST_PKGS }}"
- cmd: ".github/scripts/coverage.py {{ .COVERAGE_THRESHOLD }} {{ .TMP_DIR }}/unit-coverage-details.txt"
silent: true
integration:
desc: Run integration tests
cmds:
- "go test -v ./cmd/syft/internal/test/integration"
# exercise most of the CLI with the data race detector
# we use a larger image to ensure we're using multiple catalogers at a time
- "go run -race cmd/syft/main.go anchore/test_images:grype-quality-dotnet-69f15d2"
validate-cyclonedx-schema:
desc: Validate that Syft produces valid CycloneDX documents
cmds:
- "cd schema/cyclonedx && make"
cli:
desc: Run CLI tests
deps: [tools]
cmds:
- cmd: "echo 'testing binary: {{ .SNAPSHOT_BIN }}'"
silent: true
- cmd: "test -f {{ .SNAPSHOT_BIN }} || (find {{ .SNAPSHOT_DIR }} && echo '\nno snapshot found for {{ .SNAPSHOT_BIN }}' && false)"
silent: true
- "go test -count=1 -timeout=15m -v ./test/cli"
env:
SYFT_BINARY_LOCATION: "{{ .SNAPSHOT_BIN }}"
test-utils:
desc: Run tests for pipeline utils
cmds:
- cmd: .github/scripts/labeler_test.py
## Test-fixture-related targets #################################
fingerprints:
desc: Generate fingerprints for all non-docker test fixture
silent: true
# this will look for `testdata/Makefile` and invoke the `fingerprint` target to calculate all cache input fingerprint files
generates:
- '**/testdata/**/*.fingerprint'
- test/install/cache.fingerprint
cmds:
- |
BOLD='\033[1m'
YELLOW='\033[0;33m'
RESET='\033[0m'
echo -e "${YELLOW}creating fingerprint files for non-docker fixtures...${RESET}"
for dir in $(find . -type d -name 'testdata'); do
if [ -f "$dir/Makefile" ]; then
# for debugging...
#echo -e "${YELLOW}• calculating fingerprints in $dir... ${RESET}"
(make -C "$dir" fingerprint)
fi
done
# for debugging...
# echo -e "generated all fixture fingerprints"
- .github/scripts/fingerprint_docker_fixtures.py
- |
# if DOWNLOAD_TEST_FIXTURE_CACHE is set to 'false', then we don't need to calculate the fingerprint for the cache
if [ "$DOWNLOAD_TEST_FIXTURE_CACHE" = "false" ]; then
exit 0
fi
.github/scripts/find_cache_paths.py {{ .CACHE_PATHS_FILE }} > /dev/null
refresh-fixtures:
desc: Clear and fetch all test fixture cache
aliases:
- fixtures
silent: true
deps:
- tools
cmds:
- |
BOLD='\033[1m'
PURPLE='\033[0;35m'
RESET='\033[0m'
# if DOWNLOAD_TEST_FIXTURE_CACHE is set to 'false', then skip the cache download and always build
if [ "$DOWNLOAD_TEST_FIXTURE_CACHE" = "false" ]; then
echo -e "${BOLD}${PURPLE}skipping cache download, rebuilding cache...${RESET}"
{{ .TASK }} build-fixtures
exit 0
fi
LATEST_FINGERPRINT=$(docker manifest inspect {{ .CACHE_IMAGE }} | {{ .YQ }} -r '.annotations.fingerprint')
echo "latest cache: $LATEST_FINGERPRINT"
if [ -f {{ .LAST_CACHE_PULL_FILE }} ]; then
LAST_PULL_FINGERPRINT=$(cat {{ .LAST_CACHE_PULL_FILE }} | {{ .YQ }} -r '.digest')
else
echo -e "${BOLD}${PURPLE}empty cache, downloading cache...${RESET}"
{{ .TASK }} download-test-fixture-cache
exit 0
fi
{{ .TASK }} fingerprints
WANT_FINGERPRINT=$(cat {{ .CACHE_PATHS_FILE }} | {{ .YQ }} -r '.digest')
echo "desired cache: $WANT_FINGERPRINT"
echo "last pulled cache: $LAST_PULL_FINGERPRINT"
# if we already have the latest cache, skip the refresh
if [ "$LAST_PULL_FINGERPRINT" = "$WANT_FINGERPRINT" ]; then
echo -e "${BOLD}${PURPLE}already have the latest cache (skipping cache download)${RESET}"
exit 0
fi
# at this point we only refresh the cache if we want the same cache that is currently available.
# we don't by default refresh the cache if the cache if it is simply different from what we have,
# because we may be working on a code change that doesn't require a cache refresh (but could trigger one,
# which would be annoying to deal with in a development workflow).
if [ "$LATEST_FINGERPRINT" = "$WANT_FINGERPRINT" ]; then
echo -e "${BOLD}${PURPLE}found newer cache! downloading cache...${RESET}"
{{ .TASK }} download-test-fixture-cache
else
echo -e "${BOLD}${PURPLE}found different cache, but isn't clear if it's newer (skipping cache download and manually building)${RESET}"
{{ .YQ }} eval '.paths[] | "\(.digest) \(.path)"' {{ .LAST_CACHE_PULL_FILE }} > .tmp/last_cache_lines
{{ .YQ }} eval '.paths[] | "\(.digest) \(.path)"' {{ .CACHE_PATHS_FILE }} > .tmp/cache_lines
diff .tmp/last_cache_lines .tmp/cache_lines || true
echo -e "${BOLD}${PURPLE}diff with more context...${RESET}"
diff -U10000 {{ .LAST_CACHE_PULL_FILE }} {{ .CACHE_PATHS_FILE }} || true
echo -e "${BOLD}${PURPLE}detected changes to input material, manually building fixtures...${RESET}"
{{ .TASK }} build-fixtures
fi
build-fixtures:
desc: Generate all non-docker test fixtures
silent: true
# this will look for `testdata/Makefile` and invoke the `fixtures` target to generate any and all test fixtures
cmds:
- |
# we want to stop on the first build error
set -e
BOLD='\033[1m'
YELLOW='\033[0;33m'
RESET='\033[0m'
# Use a for loop with command substitution to avoid subshell issues
for dir in $(find . -type d -name 'testdata'); do
if [ -f "$dir/Makefile" ]; then
echo -e "${YELLOW}${BOLD}generating fixtures in $dir${RESET}"
make -C "$dir" fixtures
fi
done
echo -e "${BOLD}generated all fixtures${RESET}"
download-test-fixture-cache:
desc: Download test fixture cache from ghcr.io
deps: [tools, clean-cache]
vars:
CACHE_DIGEST:
sh: docker manifest inspect {{ .CACHE_IMAGE }} | {{ .YQ }} -r '.annotations.fingerprint'
cmds:
- silent: true
cmd: |
# if oras cache is > 4 GB, delete it
if [ -d {{ .ORAS_CACHE }} ]; then
total_size=$(du -c {{ .ORAS_CACHE }} | grep total | awk '{print $1}')
if [ "$total_size" -gt 4194304 ]; then
echo 'deleting oras cache'
rm -rf {{ .ORAS_CACHE }}
fi
fi
- "ORAS_CACHE={{ .ORAS_CACHE }} {{ .ORAS }} pull {{ .CACHE_IMAGE }}"
- "cp {{ .CACHE_PATHS_FILE }} {{ .LAST_CACHE_PULL_FILE }}"
upload-test-fixture-cache:
desc: Upload the test fixture cache to ghcr.io
deps: [tools, fingerprints]
silent: true
cmd: |
set -eu
oras_command="{{ .ORAS }} push {{ .CACHE_IMAGE }}"
paths=$(cat {{ .CACHE_PATHS_FILE }} | {{ .YQ }} -r '.paths[].path')
for path in $paths; do
oras_command+=" $path"
done
oras_command+=" {{ .CACHE_PATHS_FILE }}"
oras_command+=" --annotation org.opencontainers.image.source=https://github.com/{{ .OWNER }}/{{ .PROJECT }}"
oras_command+=" --annotation fingerprint=$(cat {{ .CACHE_PATHS_FILE }} | {{ .YQ }} -r '.digest')"
echo "Executing: $oras_command"
eval $oras_command
show-test-image-cache:
silent: true
cmds:
- "echo 'Docker daemon cache:'"
- "docker images --format '{{`{{.ID}}`}} {{`{{.Repository}}`}}:{{`{{.Tag}}`}}' | grep stereoscope-fixture- | sort"
- "echo '\nTar cache:'"
- 'find . -type f -wholename "**/testdata/cache/stereoscope-fixture-*.tar" | sort'
check-docker-cache:
desc: Ensure docker caches aren't using too much disk space
silent: true
cmd: |
total_size=$(find . | grep cache | grep tar | xargs du -c | grep total | awk '{print $1}')
find . | grep cache | grep tar | xargs du
echo "total $total_size KB"
if [ "$total_size" -gt 5242880 ]; then
echo 'docker cache is larger than 5GB'
exit 1
fi
## install.sh testing targets #################################
install-test:
cmds:
- "cd test/install && make"
install-test-cache-save:
cmds:
- "cd test/install && make save"
install-test-cache-load:
cmds:
- "cd test/install && make load"
install-test-ci-mac:
cmds:
- "cd test/install && make ci-test-mac"
generate-compare-file:
cmd: "go run ./cmd/syft {{ .COMPARE_TEST_IMAGE }} -o json > {{ .COMPARE_DIR }}/testdata/acceptance-{{ .COMPARE_TEST_IMAGE }}.json"
compare-mac:
deps: [tmpdir]
cmd: |
{{ .COMPARE_DIR }}/mac.sh \
{{ .SNAPSHOT_DIR }} \
{{ .COMPARE_DIR }} \
{{ .COMPARE_TEST_IMAGE }} \
{{ .TMP_DIR }}
compare-linux:
cmds:
- task: compare-test-deb-package-install
- task: compare-test-rpm-package-install
compare-test-deb-package-install:
deps: [tmpdir]
cmd: |
{{ .COMPARE_DIR }}/deb.sh \
{{ .SNAPSHOT_DIR }} \
{{ .COMPARE_DIR }} \
{{ .COMPARE_TEST_IMAGE }} \
{{ .TMP_DIR }}
compare-test-rpm-package-install:
deps: [tmpdir]
cmd: |
{{ .COMPARE_DIR }}/rpm.sh \
{{ .SNAPSHOT_DIR }} \
{{ .COMPARE_DIR }} \
{{ .COMPARE_TEST_IMAGE }} \
{{ .TMP_DIR }}
## Code and data generation targets #################################
generate:
desc: Add data generation tasks
cmds:
- task: generate-json-schema
- task: generate-capabilities
- task: generate-license-list
- task: generate-cpe-dictionary-index
generate-json-schema:
desc: Generate a new JSON schema
cmds:
- "cd ./internal && go generate . && cd ./jsonschema && go run . && go fmt ../..."
generate-license-list:
desc: Generate an updated license processing code off of the latest available SPDX license list
cmds:
- "go generate ./internal/spdxlicense/..."
- "gofmt -s -w ./internal/spdxlicense"
generate-cpe-dictionary-index:
desc: Generate the CPE index from local cache
cmds:
- task: generate:cpe-index:cache:pull
- task: generate:cpe-index:cache:update
- task: generate:cpe-index:build
generate-capabilities:
desc: Generate the capabilities data file
deps:
- tmpdir
- fixtures
vars:
# set REFRESH=true to run package tests first and refresh test observations (default: true)
REFRESH: '{{ .REFRESH | default "true" }}'
cmds:
# remove all test observations prior to regenerating
- task: clean-test-observations
if: '{{ eq .REFRESH "true" }}'
# this is required to update test observations; such evidence is used to update the packages/*.yaml
- cmd: "go test ./syft/pkg/... -count=1"
if: '{{ eq .REFRESH "true" }}'
- "go generate ./internal/capabilities/..."
- "gofmt -s -w ./internal/capabilities"
# now that we have the latest capabilities, run completeness tests to ensure this is self-consistent
# note: -p 1 forces sequential package execution to avoid race between generate (writes) and internal (reads)
- "SYFT_ENABLE_COMPLETENESS_TESTS=true go test -p 1 ./internal/capabilities/... -count=1"
## Build-related targets #################################
build:
desc: Build the project
deps: [tools, tmpdir]
generates:
- "{{ .PROJECT }}"
cmds:
- silent: true
cmd: |
echo "dist: {{ .SNAPSHOT_DIR }}" > {{ .TMP_DIR }}/goreleaser.yaml
cat .goreleaser.yaml >> {{ .TMP_DIR }}/goreleaser.yaml
- "{{ .BUILD_CMD }}"
snapshot:
desc: Create a snapshot release
aliases:
- build
deps: [tools, tmpdir]
sources:
- cmd/**/*.go
- syft/**/*.go
- internal/**/*.go
method: checksum
generates:
- "{{ .SNAPSHOT_BIN }}"
cmds:
- silent: true
cmd: |
echo "dist: {{ .SNAPSHOT_DIR }}" > {{ .TMP_DIR }}/goreleaser.yaml
cat .goreleaser.yaml >> {{ .TMP_DIR }}/goreleaser.yaml
- "{{ .SNAPSHOT_CMD }}"
snapshot-smoke-test:
desc: Run a smoke test on the snapshot builds + docker images
cmds:
- cmd: "echo 'testing snapshot binary: {{ .SNAPSHOT_BIN }}'"
silent: true
- cmd: "test -f {{ .SNAPSHOT_BIN }} || (find {{ .SNAPSHOT_DIR }} && echo '\nno snapshot found for {{ .SNAPSHOT_BIN }}' && false)"
silent: true
- "{{ .SNAPSHOT_BIN }} version"
- "{{ .SNAPSHOT_BIN }} scan alpine:latest"
- docker run --rm anchore/syft:latest version
- docker run --rm anchore/syft:latest scan alpine:latest
changelog:
desc: Generate a changelog
deps: [tools]
generates:
- "{{ .CHANGELOG }}"
- "{{ .NEXT_VERSION }}"
cmds:
- "{{ .TOOL_DIR }}/chronicle -vv -n --version-file {{ .NEXT_VERSION }} > {{ .CHANGELOG }}"
- "{{ .TOOL_DIR }}/glow -w 0 {{ .CHANGELOG }}"
## Release targets #################################
release:
desc: Create a release
interactive: true
deps: [tools]
cmds:
- cmd: .github/scripts/trigger-release.sh
silent: true
## CI-only targets #################################
ci-check:
# desc: "[CI only] Are you in CI?"
cmds:
- cmd: .github/scripts/ci-check.sh
silent: true
ci-release:
# desc: "[CI only] Create a release"
deps: [tools]
cmds:
- task: ci-check
- "{{ .TOOL_DIR }}/chronicle -vvv > CHANGELOG.md"
- cmd: "cat CHANGELOG.md"
silent: true
- "{{ .RELEASE_CMD }}"
## Cleanup targets #################################
clean:
desc: Remove all cache files and old builds
cmds:
- task: clean-snapshot
- task: clean-cache
- task: clean-test-observations
- task: clean-docker-cache
- task: clean-oras-cache
clean-snapshot:
desc: Remove any snapshot builds
cmds:
- "rm -rf {{ .SNAPSHOT_DIR }}"
- "rm -rf {{ .TMP_DIR }}/goreleaser.yaml"
clean-docker-cache:
desc: Remove all docker cache tars and images from the daemon
cmds:
- find . -type d -wholename "**/testdata/cache" | xargs rm -rf
- docker images --format '{{`{{.ID}}`}} {{`{{.Repository}}`}}' | grep stereoscope-fixture- | awk '{print $1}' | uniq | xargs -r docker rmi --force
clean-oras-cache:
desc: Remove all cache for oras commands
cmd: rm -rf {{ .ORAS_CACHE }}
clean-cache:
desc: Remove all image docker tar cache, images from the docker daemon, and ephemeral test fixtures
cmds:
- task: clean-docker-cache
- |
BOLD='\033[1m'
YELLOW='\033[0;33m'
RESET='\033[0m'
# Use a for loop with command substitution to avoid subshell issues
for dir in $(find . -type d -name 'testdata'); do
if [ -f "$dir/Makefile" ]; then
echo -e "${YELLOW}${BOLD}deleting ephemeral test fixtures in $dir${RESET}"
(make -C "$dir" clean)
fi
done
echo -e "${BOLD}Deleted all ephemeral test fixtures${RESET}"
- rm -f {{ .LAST_CACHE_PULL_FILE }} {{ .CACHE_PATHS_FILE }}
clean-test-observations:
desc: Remove all test observations (i.e. testdata/test-observations.json)
cmds:
- find . -type f -wholename "**/testdata/test-observations.json" | xargs rm -f
================================================
FILE: artifacthub-repo.yml
================================================
# See documentation here: https://github.com/artifacthub/hub/blob/v1.6.0/docs/metadata/artifacthub-repo.yml
repositoryID: eced152f-b15d-4879-8b3b-1175397192ba
owners:
- name: wagoodman
email: wagoodman@gmail.com
================================================
FILE: cmd/syft/cli/cli.go
================================================
package cli
import (
"io"
"os"
cranecmd "github.com/google/go-containerregistry/cmd/crane/cmd"
"github.com/spf13/cobra"
"github.com/anchore/clio"
"github.com/anchore/syft/cmd/syft/internal"
"github.com/anchore/syft/cmd/syft/internal/commands"
constants "github.com/anchore/syft/internal"
)
// Application constructs the `syft packages` command and aliases the root command to `syft packages`.
// It is also responsible for organizing flag usage and injecting the application config for each command.
// It also constructs the syft attest command and the syft version command.
// `RunE` is the earliest that the complete application configuration can be loaded.
func Application(id clio.Identification) clio.Application {
app, _ := create(id, os.Stdout)
return app
}
// Command returns the root command for the syft CLI application. This is useful for embedding the entire syft CLI
// into an existing application.
func Command(id clio.Identification) *cobra.Command {
_, cmd := create(id, os.Stdout)
return cmd
}
func create(id clio.Identification, out io.Writer) (clio.Application, *cobra.Command) {
clioCfg := internal.AppClioSetupConfig(id, out)
app := clio.New(*clioCfg)
// since root is aliased as the packages cmd we need to construct this command first
// we also need the command to have information about the `root` options because of this alias
scanCmd := commands.Scan(app)
// root is currently an alias for the scan command
rootCmd := commands.Root(app, scanCmd)
// add sub-commands
rootCmd.AddCommand(
scanCmd,
commands.Packages(app, scanCmd), // this is currently an alias for the scan command
commands.Cataloger(app),
commands.Attest(app),
commands.Convert(app),
clio.VersionCommand(id, schemaVersion),
clio.ConfigCommand(app, nil),
cranecmd.NewCmdAuthLogin(id.Name), // syft login uses the same command as crane
)
// note: we would direct cobra to use our writer explicitly with rootCmd.SetOut(out) , however this causes
// deprecation warnings to be shown to stdout via the writer instead of stderr. This is unfortunate since this
// does not appear to be the correct behavior on cobra's part https://github.com/spf13/cobra/issues/1708 .
// In the future this functionality should be restored.
return app, rootCmd
}
func schemaVersion() (string, any) {
return "SchemaVersion", constants.JSONSchemaVersion
}
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_attestation_test.snap
================================================
[TestHandler_handleAttestationStarted/attesting_in_progress/task_line - 1]
⠋ Creating a thing running a thing
---
[TestHandler_handleAttestationStarted/attesting_in_progress/log - 1]
░░ contents
░░ of
░░ stuff!
---
[TestHandler_handleAttestationStarted/attesting_complete/task_line - 1]
✔ Created a thing running a thing
---
[TestHandler_handleAttestationStarted/attesting_complete/log - 1]
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_cataloger_task_test.snap
================================================
[TestHandler_handleCatalogerTaskStarted/cataloging_task_in_progress - 1]
⠙ Cataloging contents
⠙ some task title ━━━━━━━━━━━━━━━━━━━━ [some stage]
---
[TestHandler_handleCatalogerTaskStarted/cataloging_sub_task_in_progress - 1]
⠙ Cataloging contents
└── ⠙ some task title ━━━━━━━━━━━━━━━━━━━━ [some stage]
---
[TestHandler_handleCatalogerTaskStarted/cataloging_sub_task_complete - 1]
⠙ Cataloging contents
└── ✔ some task done [some stage]
---
[TestHandler_handleCatalogerTaskStarted/cataloging_sub_task_complete_--_hide_stage - 1]
⠙ Cataloging contents
└── ✔ some task done
---
[TestHandler_handleCatalogerTaskStarted/cataloging_sub_task_complete_with_removal - 1]
⠙ Cataloging contents
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_fetch_image_test.snap
================================================
[TestHandler_handleFetchImage/fetch_image_in_progress - 1]
⠋ Loading image ━━━━━━━━━━━━━━━━━━━━ [current] the-image
---
[TestHandler_handleFetchImage/fetch_image_complete - 1]
✔ Loaded image the-image
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_file_indexing_test.snap
================================================
[TestHandler_handleFileIndexingStarted/cataloging_in_progress - 1]
⠋ Indexing file system ━━━━━━━━━━━━━━━━━━━━ [current] /some/path
---
[TestHandler_handleFileIndexingStarted/cataloging_complete - 1]
✔ Indexed file system /some/path
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_pull_docker_image_test.snap
================================================
[Test_dockerPullStatusFormatter_Render/pulling - 1]
3 Layers▕▅▃ ▏[12 B / 30 B]
---
[Test_dockerPullStatusFormatter_Render/download_complete - 1]
3 Layers▕█▃ ▏[30 B] Extracting...
---
[Test_dockerPullStatusFormatter_Render/complete - 1]
3 Layers▕███▏[30 B] Extracting...
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_pull_source_test.snap
================================================
[TestHandler_handlePullSourceStarted/snap_download_in_progress - 1]
⠋ Downloading snap file... ━━━━━━━━━━━━━━━━━━━━ example-app_1.0_amd64.snap
---
[TestHandler_handlePullSourceStarted/snap_download_complete - 1]
✔ Snap downloaded successfully example-app_1.0_amd64.snap
---
================================================
FILE: cmd/syft/cli/ui/__snapshots__/handle_read_image_test.snap
================================================
[TestHandler_handleReadImage/read_image_in_progress - 1]
⠋ Parsing image ━━━━━━━━━━━━━━━━━━━━ id
---
[TestHandler_handleReadImage/read_image_complete - 1]
✔ Parsed image id
---
================================================
FILE: cmd/syft/cli/ui/handle_attestation.go
================================================
package ui
import (
"bufio"
"fmt"
"io"
"strings"
"sync"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/google/uuid"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/zyedidia/generic/queue"
"github.com/anchore/bubbly/bubbles/taskprogress"
"github.com/anchore/syft/internal/log"
syftEventParsers "github.com/anchore/syft/syft/event/parsers"
)
var (
_ tea.Model = (*attestLogFrame)(nil)
)
type attestLogFrame struct {
reader *backgroundLineReader
prog progress.Progressable
lines []string
completed bool
failed bool
windowSize tea.WindowSizeMsg
id uint32
sequence int
updateDuration time.Duration
borderStype lipgloss.Style
}
// attestLogFrameTickMsg indicates that the timer has ticked and we should render a frame.
type attestLogFrameTickMsg struct {
Time time.Time
Sequence int
ID uint32
}
type backgroundLineReader struct {
limit int
lines *queue.Queue[string]
lock *sync.RWMutex
// This is added specifically for tests to assert when the background reader is done.
// The main UI uses the global ui wait group from the handler to otherwise block
// Shared concerns among multiple model made it difficult to test using the global wait group
// so this is added to allow tests to assert when the background reader is done.
running *sync.WaitGroup
}
func (m *Handler) handleAttestationStarted(e partybus.Event) []tea.Model {
reader, prog, taskInfo, err := syftEventParsers.ParseAttestationStartedEvent(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
stage := progress.Stage{}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: taskInfo.Title.Default,
Running: taskInfo.Title.WhileRunning,
Success: taskInfo.Title.OnSuccess,
},
taskprogress.WithStagedProgressable(
struct {
progress.Progressable
progress.Stager
}{
Progressable: prog,
Stager: &stage,
},
),
)
tsk.HideStageOnSuccess = false
if taskInfo.Context != "" {
tsk.Context = []string{taskInfo.Context}
}
borderStyle := tsk.HintStyle
return []tea.Model{
tsk,
newLogFrame(newBackgroundLineReader(m.Running, reader, &stage), prog, borderStyle),
}
}
func newLogFrame(reader *backgroundLineReader, prog progress.Progressable, borderStyle lipgloss.Style) attestLogFrame {
return attestLogFrame{
reader: reader,
prog: prog,
id: uuid.Must(uuid.NewUUID()).ID(),
updateDuration: 250 * time.Millisecond,
borderStype: borderStyle,
}
}
func newBackgroundLineReader(wg *sync.WaitGroup, reader io.Reader, stage *progress.Stage) *backgroundLineReader {
r := &backgroundLineReader{
limit: 7,
lock: &sync.RWMutex{},
lines: queue.New[string](),
running: &sync.WaitGroup{},
}
// tracks the background reader for the global handler wait group
wg.Add(1)
// tracks the background reader for the local wait group (used in tests to decouple from the global handler wait group)
r.running.Add(1)
go func() {
r.read(reader, stage)
wg.Done()
r.running.Done()
}()
return r
}
func (l *backgroundLineReader) read(reader io.Reader, stage *progress.Stage) {
s := bufio.NewScanner(reader)
for s.Scan() {
l.lock.Lock()
text := s.Text()
l.lines.Enqueue(text)
if strings.Contains(text, "tlog entry created with index") {
fields := strings.SplitN(text, ":", 2)
present := text
if len(fields) == 2 {
present = fmt.Sprintf("transparency log index: %s", fields[1])
}
stage.Current = present
} else if strings.Contains(text, "WARNING: skipping transparency log upload") {
stage.Current = "transparency log upload skipped"
}
// only show the last X lines of the shell output
for l.lines.Len() > l.limit {
l.lines.Dequeue()
}
l.lock.Unlock()
}
}
func (l backgroundLineReader) Lines() []string {
l.lock.RLock()
defer l.lock.RUnlock()
var lines []string
l.lines.Each(func(line string) {
lines = append(lines, line)
})
return lines
}
func (l attestLogFrame) Init() tea.Cmd {
// this is the periodic update of state information
return func() tea.Msg {
return attestLogFrameTickMsg{
// The time at which the tick occurred.
Time: time.Now(),
// The ID of the log frame that this message belongs to. This can be
// helpful when routing messages, however bear in mind that log frames
// will ignore messages that don't contain ID by default.
ID: l.id,
Sequence: l.sequence,
}
}
}
func (l attestLogFrame) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
l.windowSize = msg
return l, nil
case attestLogFrameTickMsg:
l.lines = l.reader.Lines()
l.completed = progress.IsCompleted(l.prog)
err := l.prog.Error()
l.failed = err != nil && !progress.IsErrCompleted(err)
tickCmd := l.handleTick(msg)
return l, tickCmd
}
return l, nil
}
func (l attestLogFrame) View() string {
if l.completed && !l.failed {
return ""
}
sb := strings.Builder{}
for _, line := range l.lines {
fmt.Fprintf(&sb, " %s %s\n", l.borderStype.Render("░░"), line)
}
return sb.String()
}
func (l attestLogFrame) queueNextTick() tea.Cmd {
return tea.Tick(l.updateDuration, func(t time.Time) tea.Msg {
return attestLogFrameTickMsg{
Time: t,
ID: l.id,
Sequence: l.sequence,
}
})
}
func (l *attestLogFrame) handleTick(msg attestLogFrameTickMsg) tea.Cmd {
// If an ID is set, and the ID doesn't belong to this log frame, reject the message.
if msg.ID > 0 && msg.ID != l.id {
return nil
}
// If a sequence is set, and it's not the one we expect, reject the message.
// This prevents the log frame from receiving too many messages and
// thus updating too frequently.
if msg.Sequence > 0 && msg.Sequence != l.sequence {
return nil
}
l.sequence++
// note: even if the log is completed we should still respond to stage changes and window size events
return l.queueNextTick()
}
================================================
FILE: cmd/syft/cli/ui/handle_attestation_test.go
================================================
package ui
import (
"strings"
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
syftEvent "github.com/anchore/syft/syft/event"
"github.com/anchore/syft/syft/event/monitor"
)
func TestHandler_handleAttestationStarted(t *testing.T) {
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "attesting in progress",
// note: this model depends on a background reader. Multiple iterations ensures that the
// reader has time to at least start and process the test fixture before the runModel
// test harness completes (which is a fake event loop anyway).
iterations: 1,
eventFn: func(t *testing.T) partybus.Event {
reader := strings.NewReader("contents\nof\nstuff!")
src := monitor.GenericTask{
Title: monitor.Title{
Default: "Create a thing",
WhileRunning: "Creating a thing",
OnSuccess: "Created a thing",
},
Context: "running a thing",
}
mon := progress.NewManual(-1)
mon.Set(50)
value := &monitor.ShellProgress{
Reader: reader,
Progressable: mon,
}
return partybus.Event{
Type: syftEvent.AttestationStarted,
Source: src,
Value: value,
}
},
},
{
name: "attesting complete",
// note: this model depends on a background reader. Multiple iterations ensures that the
// reader has time to at least start and process the test fixture before the runModel
// test harness completes (which is a fake event loop anyway).
iterations: 1,
eventFn: func(t *testing.T) partybus.Event {
reader := strings.NewReader("contents\nof\nstuff!")
src := monitor.GenericTask{
Title: monitor.Title{
Default: "Create a thing",
WhileRunning: "Creating a thing",
OnSuccess: "Created a thing",
},
Context: "running a thing",
}
mon := progress.NewManual(-1)
mon.Set(50)
mon.SetCompleted()
value := &monitor.ShellProgress{
Reader: reader,
Progressable: mon,
}
return partybus.Event{
Type: syftEvent.AttestationStarted,
Source: src,
Value: value,
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
models, _ := handler.Handle(event)
require.Len(t, models, 2)
t.Run("task line", func(t *testing.T) {
tsk, ok := models[0].(taskprogress.Model)
require.True(t, ok)
gotModel := runModel(t, tsk, tt.iterations, taskprogress.TickMsg{
Time: time.Now(),
Sequence: tsk.Sequence(),
ID: tsk.ID(),
})
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
t.Run("log", func(t *testing.T) {
log, ok := models[1].(attestLogFrame)
require.True(t, ok)
gotModel := runModel(t, log, tt.iterations, attestLogFrameTickMsg{
Time: time.Now(),
Sequence: log.sequence,
ID: log.id,
}, log.reader.running)
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_cataloger_task.go
================================================
package ui
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/google/uuid"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
"github.com/anchore/bubbly/bubbles/tree"
"github.com/anchore/syft/internal/log"
"github.com/anchore/syft/syft/event/monitor"
syftEventParsers "github.com/anchore/syft/syft/event/parsers"
)
// we standardize how rows are instantiated to ensure consistency in the appearance across the UI
type taskModelFactory func(title taskprogress.Title, opts ...taskprogress.Option) taskprogress.Model
var _ tea.Model = (*catalogerTaskModel)(nil)
type catalogerTaskModel struct {
model tree.Model
modelFactory taskModelFactory
}
func newCatalogerTaskTreeModel(f taskModelFactory) *catalogerTaskModel {
t := tree.NewModel()
t.Padding = " "
t.RootsWithoutPrefix = true
return &catalogerTaskModel{
modelFactory: f,
model: t,
}
}
type newCatalogerTaskRowEvent struct {
info monitor.GenericTask
prog progress.StagedProgressable
}
func (cts catalogerTaskModel) Init() tea.Cmd {
return cts.model.Init()
}
func (cts catalogerTaskModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
event, ok := msg.(newCatalogerTaskRowEvent)
if !ok {
model, cmd := cts.model.Update(msg)
cts.model = model.(tree.Model)
return cts, cmd
}
info, prog := event.info, event.prog
tsk := cts.modelFactory(
taskprogress.Title{
Default: info.Title.Default,
Running: info.Title.WhileRunning,
Success: info.Title.OnSuccess,
},
taskprogress.WithStagedProgressable(prog),
)
if info.Context != "" {
tsk.Context = []string{info.Context}
}
tsk.HideOnSuccess = info.HideOnSuccess
tsk.HideStageOnSuccess = info.HideStageOnSuccess
tsk.HideProgressOnSuccess = true
if info.ParentID != "" {
tsk.TitleStyle = lipgloss.NewStyle()
}
if err := cts.model.Add(info.ParentID, info.ID, tsk); err != nil {
log.WithFields("error", err).Error("unable to add cataloger task to tree model")
}
return cts, tsk.Init()
}
func (cts catalogerTaskModel) View() string {
return cts.model.View()
}
func (m *Handler) handleCatalogerTaskStarted(e partybus.Event) ([]tea.Model, tea.Cmd) {
mon, info, err := syftEventParsers.ParseCatalogerTaskStarted(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil, nil
}
var models []tea.Model
// only create the new cataloger task tree once to manage all cataloger task events
m.onNewCatalogerTask.Do(func() {
models = append(models, newCatalogerTaskTreeModel(m.newTaskProgress))
})
// we need to update the cataloger task model with a new row. We should never update the model outside of the
// bubbletea update-render event loop. Instead, we return a command that will be executed by the bubbletea runtime,
// producing a message that is passed to the cataloger task model. This is the prescribed way to update models
// in bubbletea.
if info.ID == "" {
// ID is optional from the consumer perspective, but required internally
info.ID = uuid.Must(uuid.NewRandom()).String()
}
cmd := func() tea.Msg {
// this message will cause the cataloger task model to add a new row to the output based on the given task
// information and progress data.
return newCatalogerTaskRowEvent{
info: *info,
prog: mon,
}
}
return models, cmd
}
================================================
FILE: cmd/syft/cli/ui/handle_cataloger_task_test.go
================================================
package ui
import (
"testing"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
syftEvent "github.com/anchore/syft/syft/event"
"github.com/anchore/syft/syft/event/monitor"
)
func TestHandler_handleCatalogerTaskStarted(t *testing.T) {
title := monitor.Title{
Default: "some task title",
OnSuccess: "some task done",
}
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "cataloging task in progress",
eventFn: func(t *testing.T) partybus.Event {
value := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage("some stage"),
Manual: progress.NewManual(100),
}
value.Manual.Add(50)
return partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: monitor.GenericTask{
Title: title,
HideOnSuccess: false,
HideStageOnSuccess: false,
ID: "my-id",
},
Value: value,
}
},
},
{
name: "cataloging sub task in progress",
eventFn: func(t *testing.T) partybus.Event {
value := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage("some stage"),
Manual: progress.NewManual(100),
}
value.Manual.Add(50)
return partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: monitor.GenericTask{
Title: title,
HideOnSuccess: false,
HideStageOnSuccess: false,
ID: "my-id",
ParentID: "top-level-task",
},
Value: value,
}
},
},
{
name: "cataloging sub task complete",
eventFn: func(t *testing.T) partybus.Event {
value := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage("some stage"),
Manual: progress.NewManual(100),
}
value.SetCompleted()
return partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: monitor.GenericTask{
Title: title,
HideOnSuccess: false,
HideStageOnSuccess: false,
ID: "my-id",
ParentID: "top-level-task",
},
Value: value,
}
},
},
{
name: "cataloging sub task complete -- hide stage",
eventFn: func(t *testing.T) partybus.Event {
value := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage("some stage"),
Manual: progress.NewManual(100),
}
value.SetCompleted()
return partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: monitor.GenericTask{
Title: title,
HideOnSuccess: false,
HideStageOnSuccess: true,
ID: "my-id",
ParentID: "top-level-task",
},
Value: value,
}
},
},
{
name: "cataloging sub task complete with removal",
eventFn: func(t *testing.T) partybus.Event {
value := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage("some stage"),
Manual: progress.NewManual(100),
}
value.SetCompleted()
return partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: monitor.GenericTask{
Title: title,
HideOnSuccess: true,
HideStageOnSuccess: false,
ID: "my-id",
ParentID: "top-level-task",
},
Value: value,
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// need to be able to get the initial newCatalogerTaskRowEvent + initialize the nested taskprogress model
if tt.iterations == 0 {
tt.iterations = 2
}
e := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
info := monitor.GenericTask{
Title: monitor.Title{
Default: "Catalog contents",
WhileRunning: "Cataloging contents",
OnSuccess: "Cataloged contents",
},
ID: "top-level-task",
}
// note: this line / event is not under test, only needed to show a sub status
kickoffEvent := &monitor.TaskProgress{
AtomicStage: progress.NewAtomicStage(""),
Manual: progress.NewManual(-1),
}
models, cmd := handler.Handle(
partybus.Event{
Type: syftEvent.CatalogerTaskStarted,
Source: info,
Value: progress.StagedProgressable(kickoffEvent),
},
)
require.Len(t, models, 1)
require.NotNil(t, cmd)
model := models[0]
tr, ok := model.(*catalogerTaskModel)
require.True(t, ok)
gotModel := runModel(t, tr, tt.iterations, cmd())
models, cmd = handler.Handle(e)
require.Len(t, models, 0)
require.NotNil(t, cmd)
gotModel = runModel(t, gotModel, tt.iterations, cmd())
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_fetch_image.go
================================================
package ui
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/wagoodman/go-partybus"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoEventParsers "github.com/anchore/stereoscope/pkg/event/parsers"
"github.com/anchore/syft/internal/log"
)
func (m *Handler) handleFetchImage(e partybus.Event) []tea.Model {
imgName, prog, err := stereoEventParsers.ParseFetchImage(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: "Load image",
Running: "Loading image",
Success: "Loaded image",
},
taskprogress.WithStagedProgressable(prog),
)
if imgName != "" {
tsk.Context = []string{imgName}
}
return []tea.Model{tsk}
}
================================================
FILE: cmd/syft/cli/ui/handle_fetch_image_test.go
================================================
package ui
import (
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoscopeEvent "github.com/anchore/stereoscope/pkg/event"
)
func TestHandler_handleFetchImage(t *testing.T) {
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "fetch image in progress",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(50)
mon := struct {
progress.Progressable
progress.Stager
}{
Progressable: prog,
Stager: &progress.Stage{
Current: "current",
},
}
return partybus.Event{
Type: stereoscopeEvent.FetchImage,
Source: "the-image",
Value: mon,
}
},
},
{
name: "fetch image complete",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(100)
prog.SetCompleted()
mon := struct {
progress.Progressable
progress.Stager
}{
Progressable: prog,
Stager: &progress.Stage{
Current: "current",
},
}
return partybus.Event{
Type: stereoscopeEvent.FetchImage,
Source: "the-image",
Value: mon,
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
models, _ := handler.Handle(event)
require.Len(t, models, 1)
model := models[0]
tsk, ok := model.(taskprogress.Model)
require.True(t, ok)
gotModel := runModel(t, tsk, tt.iterations, taskprogress.TickMsg{
Time: time.Now(),
Sequence: tsk.Sequence(),
ID: tsk.ID(),
})
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_file_indexing.go
================================================
package ui
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/wagoodman/go-partybus"
"github.com/anchore/bubbly/bubbles/taskprogress"
"github.com/anchore/syft/internal/log"
syftEventParsers "github.com/anchore/syft/syft/event/parsers"
)
func (m *Handler) handleFileIndexingStarted(e partybus.Event) []tea.Model {
path, prog, err := syftEventParsers.ParseFileIndexingStarted(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: "Index files system",
Running: "Indexing file system",
Success: "Indexed file system",
},
taskprogress.WithStagedProgressable(prog),
)
tsk.Context = []string{path}
return []tea.Model{tsk}
}
================================================
FILE: cmd/syft/cli/ui/handle_file_indexing_test.go
================================================
package ui
import (
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
syftEvent "github.com/anchore/syft/syft/event"
)
func TestHandler_handleFileIndexingStarted(t *testing.T) {
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "cataloging in progress",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(50)
mon := struct {
progress.Progressable
progress.Stager
}{
Progressable: prog,
Stager: &progress.Stage{
Current: "current",
},
}
return partybus.Event{
Type: syftEvent.FileIndexingStarted,
Source: "/some/path",
Value: mon,
}
},
},
{
name: "cataloging complete",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(100)
prog.SetCompleted()
mon := struct {
progress.Progressable
progress.Stager
}{
Progressable: prog,
Stager: &progress.Stage{
Current: "current",
},
}
return partybus.Event{
Type: syftEvent.FileIndexingStarted,
Source: "/some/path",
Value: mon,
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
models, _ := handler.Handle(event)
require.Len(t, models, 1)
model := models[0]
tsk, ok := model.(taskprogress.Model)
require.True(t, ok)
gotModel := runModel(t, tsk, tt.iterations, taskprogress.TickMsg{
Time: time.Now(),
Sequence: tsk.Sequence(),
ID: tsk.ID(),
})
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_pull_containerd_image.go
================================================
package ui
import (
"fmt"
"strings"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/dustin/go-humanize"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoscopeParsers "github.com/anchore/stereoscope/pkg/event/parsers"
"github.com/anchore/stereoscope/pkg/image/containerd"
"github.com/anchore/syft/internal/log"
)
var _ interface {
progress.Stager
progress.Progressable
} = (*containerdPullProgressAdapter)(nil)
type containerdPullStatus interface {
Complete() bool
Layers() []containerd.LayerID
Current(containerd.LayerID) progress.Progressable
}
type containerdPullProgressAdapter struct {
status containerdPullStatus
formatter containerdPullStatusFormatter
}
type containerdPullStatusFormatter struct {
auxInfoStyle lipgloss.Style
pullCompletedStyle lipgloss.Style
pullDownloadStyle lipgloss.Style
pullStageChars []string
layerCaps []string
}
func (m *Handler) handlePullContainerdImage(e partybus.Event) []tea.Model {
_, pullStatus, err := stereoscopeParsers.ParsePullContainerdImage(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
if pullStatus == nil {
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: "Pull image",
Running: "Pulling image",
Success: "Pulled image",
},
taskprogress.WithStagedProgressable(
newContainerdPullProgressAdapter(pullStatus),
),
)
tsk.HintStyle = lipgloss.NewStyle()
tsk.HintEndCaps = nil
return []tea.Model{tsk}
}
func newContainerdPullProgressAdapter(status *containerd.PullStatus) *containerdPullProgressAdapter {
return &containerdPullProgressAdapter{
status: status,
formatter: newContainerdPullStatusFormatter(),
}
}
func newContainerdPullStatusFormatter() containerdPullStatusFormatter {
return containerdPullStatusFormatter{
auxInfoStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#777777")),
pullCompletedStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#fcba03")),
pullDownloadStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#777777")),
pullStageChars: strings.Split("▁▃▄▅▆▇█", ""),
layerCaps: strings.Split("▕▏", ""),
}
}
func (d containerdPullProgressAdapter) Size() int64 {
return -1
}
func (d containerdPullProgressAdapter) Current() int64 {
return 1
}
func (d containerdPullProgressAdapter) Error() error {
if d.status.Complete() {
return progress.ErrCompleted
}
// TODO: return intermediate error indications
return nil
}
func (d containerdPullProgressAdapter) Stage() string {
return d.formatter.Render(d.status)
}
// Render crafts the given docker image pull status summarized into a single line.
func (f containerdPullStatusFormatter) Render(pullStatus containerdPullStatus) string {
var size, current uint64
layers := pullStatus.Layers()
status := make(map[containerd.LayerID]progress.Progressable)
completed := make([]string, len(layers))
// fetch the current state
for idx, layer := range layers {
completed[idx] = " "
status[layer] = pullStatus.Current(layer)
}
numCompleted := 0
for idx, layer := range layers {
prog := status[layer]
curN := prog.Current()
curSize := prog.Size()
if progress.IsCompleted(prog) {
input := f.pullStageChars[len(f.pullStageChars)-1]
completed[idx] = f.formatPullPhase(prog.Error() != nil, input)
} else if curN != 0 {
var ratio float64
switch {
case curN == 0 || curSize < 0:
ratio = 0
case curN >= curSize:
ratio = 1
default:
ratio = float64(curN) / float64(curSize)
}
i := int(ratio * float64(len(f.pullStageChars)-1))
input := f.pullStageChars[i]
completed[idx] = f.formatPullPhase(status[layer].Error() != nil, input)
}
if progress.IsErrCompleted(status[layer].Error()) {
numCompleted++
}
}
for _, layer := range layers {
prog := status[layer]
size += uint64(prog.Size())
current += uint64(prog.Current())
}
var progStr, auxInfo string
if len(layers) > 0 {
render := strings.Join(completed, "")
prefix := f.pullCompletedStyle.Render(fmt.Sprintf("%d Layers", len(layers)))
auxInfo = f.auxInfoStyle.Render(fmt.Sprintf("[%s / %s]", humanize.Bytes(current), humanize.Bytes(size)))
if len(layers) == numCompleted {
auxInfo = f.auxInfoStyle.Render(fmt.Sprintf("[%s] Extracting...", humanize.Bytes(size)))
}
progStr = fmt.Sprintf("%s%s%s%s", prefix, f.layerCap(false), render, f.layerCap(true))
}
return progStr + auxInfo
}
// formatPullPhase returns a single character that represents the status of a layer pull.
func (f containerdPullStatusFormatter) formatPullPhase(completed bool, inputStr string) string {
if completed {
return f.pullCompletedStyle.Render(f.pullStageChars[len(f.pullStageChars)-1])
}
return f.pullDownloadStyle.Render(inputStr)
}
func (f containerdPullStatusFormatter) layerCap(end bool) string {
l := len(f.layerCaps)
if l == 0 {
return ""
}
if end {
return f.layerCaps[l-1]
}
return f.layerCaps[0]
}
================================================
FILE: cmd/syft/cli/ui/handle_pull_docker_image.go
================================================
package ui
import (
"fmt"
"strings"
tea "github.com/charmbracelet/bubbletea"
"github.com/charmbracelet/lipgloss"
"github.com/dustin/go-humanize"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoscopeParsers "github.com/anchore/stereoscope/pkg/event/parsers"
"github.com/anchore/stereoscope/pkg/image/docker"
"github.com/anchore/syft/internal/log"
)
var _ interface {
progress.Stager
progress.Progressable
} = (*dockerPullProgressAdapter)(nil)
type dockerPullStatus interface {
Complete() bool
Layers() []docker.LayerID
Current(docker.LayerID) docker.LayerState
}
type dockerPullProgressAdapter struct {
status dockerPullStatus
formatter dockerPullStatusFormatter
}
type dockerPullStatusFormatter struct {
auxInfoStyle lipgloss.Style
dockerPullCompletedStyle lipgloss.Style
dockerPullDownloadStyle lipgloss.Style
dockerPullExtractStyle lipgloss.Style
dockerPullStageChars []string
layerCaps []string
}
func (m *Handler) handlePullDockerImage(e partybus.Event) []tea.Model {
_, pullStatus, err := stereoscopeParsers.ParsePullDockerImage(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: "Pull image",
Running: "Pulling image",
Success: "Pulled image",
},
taskprogress.WithStagedProgressable(
newDockerPullProgressAdapter(pullStatus),
),
)
tsk.HintStyle = lipgloss.NewStyle()
tsk.HintEndCaps = nil
return []tea.Model{tsk}
}
func newDockerPullProgressAdapter(status dockerPullStatus) *dockerPullProgressAdapter {
return &dockerPullProgressAdapter{
status: status,
formatter: newDockerPullStatusFormatter(),
}
}
func newDockerPullStatusFormatter() dockerPullStatusFormatter {
return dockerPullStatusFormatter{
auxInfoStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#777777")),
dockerPullCompletedStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#fcba03")),
dockerPullDownloadStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#777777")),
dockerPullExtractStyle: lipgloss.NewStyle().Foreground(lipgloss.Color("#ffffff")),
dockerPullStageChars: strings.Split("▁▃▄▅▆▇█", ""),
layerCaps: strings.Split("▕▏", ""),
}
}
func (d dockerPullProgressAdapter) Size() int64 {
return -1
}
func (d dockerPullProgressAdapter) Current() int64 {
return 1
}
func (d dockerPullProgressAdapter) Error() error {
if d.status.Complete() {
return progress.ErrCompleted
}
// TODO: return intermediate error indications
return nil
}
func (d dockerPullProgressAdapter) Stage() string {
return d.formatter.Render(d.status)
}
// Render crafts the given docker image pull status summarized into a single line.
func (f dockerPullStatusFormatter) Render(pullStatus dockerPullStatus) string {
var size, current uint64
layers := pullStatus.Layers()
status := make(map[docker.LayerID]docker.LayerState)
completed := make([]string, len(layers))
// fetch the current state
for idx, layer := range layers {
completed[idx] = " "
status[layer] = pullStatus.Current(layer)
}
numCompleted := 0
for idx, layer := range layers {
prog := status[layer].PhaseProgress
curN := prog.Current()
curSize := prog.Size()
if progress.IsCompleted(prog) {
input := f.dockerPullStageChars[len(f.dockerPullStageChars)-1]
completed[idx] = f.formatDockerPullPhase(status[layer].Phase, input)
} else if curN != 0 {
var ratio float64
switch {
case curN == 0 || curSize < 0:
ratio = 0
case curN >= curSize:
ratio = 1
default:
ratio = float64(curN) / float64(curSize)
}
i := int(ratio * float64(len(f.dockerPullStageChars)-1))
input := f.dockerPullStageChars[i]
completed[idx] = f.formatDockerPullPhase(status[layer].Phase, input)
}
if progress.IsErrCompleted(status[layer].DownloadProgress.Error()) {
numCompleted++
}
}
for _, layer := range layers {
prog := status[layer].DownloadProgress
size += uint64(prog.Size())
current += uint64(prog.Current())
}
var progStr, auxInfo string
if len(layers) > 0 {
render := strings.Join(completed, "")
prefix := f.dockerPullCompletedStyle.Render(fmt.Sprintf("%d Layers", len(layers)))
auxInfo = f.auxInfoStyle.Render(fmt.Sprintf("[%s / %s]", humanize.Bytes(current), humanize.Bytes(size)))
if len(layers) == numCompleted {
auxInfo = f.auxInfoStyle.Render(fmt.Sprintf("[%s] Extracting...", humanize.Bytes(size)))
}
progStr = fmt.Sprintf("%s%s%s%s", prefix, f.layerCap(false), render, f.layerCap(true))
}
return progStr + auxInfo
}
// formatDockerPullPhase returns a single character that represents the status of a layer pull.
func (f dockerPullStatusFormatter) formatDockerPullPhase(phase docker.PullPhase, inputStr string) string {
switch phase {
case docker.WaitingPhase:
// ignore any progress related to waiting
return " "
case docker.PullingFsPhase, docker.DownloadingPhase:
return f.dockerPullDownloadStyle.Render(inputStr)
case docker.DownloadCompletePhase:
return f.dockerPullDownloadStyle.Render(f.dockerPullStageChars[len(f.dockerPullStageChars)-1])
case docker.ExtractingPhase:
return f.dockerPullExtractStyle.Render(inputStr)
case docker.VerifyingChecksumPhase, docker.PullCompletePhase:
return f.dockerPullCompletedStyle.Render(inputStr)
case docker.AlreadyExistsPhase:
return f.dockerPullCompletedStyle.Render(f.dockerPullStageChars[len(f.dockerPullStageChars)-1])
default:
return inputStr
}
}
func (f dockerPullStatusFormatter) layerCap(end bool) string {
l := len(f.layerCaps)
if l == 0 {
return ""
}
if end {
return f.layerCaps[l-1]
}
return f.layerCaps[0]
}
================================================
FILE: cmd/syft/cli/ui/handle_pull_docker_image_test.go
================================================
package ui
import (
"testing"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/wagoodman/go-progress"
"github.com/anchore/stereoscope/pkg/image/docker"
)
var _ dockerPullStatus = (*mockDockerPullStatus)(nil)
type mockDockerPullStatus struct {
complete bool
layers []docker.LayerID
current map[docker.LayerID]docker.LayerState
}
func (m mockDockerPullStatus) Complete() bool {
return m.complete
}
func (m mockDockerPullStatus) Layers() []docker.LayerID {
return m.layers
}
func (m mockDockerPullStatus) Current(id docker.LayerID) docker.LayerState {
return m.current[id]
}
func Test_dockerPullStatusFormatter_Render(t *testing.T) {
tests := []struct {
name string
status dockerPullStatus
}{
{
name: "pulling",
status: func() dockerPullStatus {
complete := progress.NewManual(10)
complete.Set(10)
complete.SetCompleted()
quarter := progress.NewManual(10)
quarter.Set(2)
half := progress.NewManual(10)
half.Set(6)
empty := progress.NewManual(10)
return mockDockerPullStatus{
complete: false,
layers: []docker.LayerID{
"sha256:1",
"sha256:2",
"sha256:3",
},
current: map[docker.LayerID]docker.LayerState{
"sha256:1": {
Phase: docker.ExtractingPhase,
PhaseProgress: half,
DownloadProgress: complete,
},
"sha256:2": {
Phase: docker.DownloadingPhase,
PhaseProgress: quarter,
DownloadProgress: quarter,
},
"sha256:3": {
Phase: docker.WaitingPhase,
PhaseProgress: empty,
DownloadProgress: empty,
},
},
}
}(),
},
{
name: "download complete",
status: func() dockerPullStatus {
complete := progress.NewManual(10)
complete.Set(10)
complete.SetCompleted()
quarter := progress.NewManual(10)
quarter.Set(2)
half := progress.NewManual(10)
half.Set(6)
empty := progress.NewManual(10)
return mockDockerPullStatus{
complete: false,
layers: []docker.LayerID{
"sha256:1",
"sha256:2",
"sha256:3",
},
current: map[docker.LayerID]docker.LayerState{
"sha256:1": {
Phase: docker.ExtractingPhase,
PhaseProgress: complete,
DownloadProgress: complete,
},
"sha256:2": {
Phase: docker.ExtractingPhase,
PhaseProgress: quarter,
DownloadProgress: complete,
},
"sha256:3": {
Phase: docker.ExtractingPhase,
PhaseProgress: empty,
DownloadProgress: complete,
},
},
}
}(),
},
{
name: "complete",
status: func() dockerPullStatus {
complete := progress.NewManual(10)
complete.Set(10)
complete.SetCompleted()
return mockDockerPullStatus{
complete: true,
layers: []docker.LayerID{
"sha256:1",
"sha256:2",
"sha256:3",
},
current: map[docker.LayerID]docker.LayerState{
"sha256:1": {
Phase: docker.PullCompletePhase,
PhaseProgress: complete,
DownloadProgress: complete,
},
"sha256:2": {
Phase: docker.PullCompletePhase,
PhaseProgress: complete,
DownloadProgress: complete,
},
"sha256:3": {
Phase: docker.PullCompletePhase,
PhaseProgress: complete,
DownloadProgress: complete,
},
},
}
}(),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
f := newDockerPullStatusFormatter()
snaps.MatchSnapshot(t, f.Render(tt.status))
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_pull_source.go
================================================
package ui
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/wagoodman/go-partybus"
"github.com/anchore/bubbly/bubbles/taskprogress"
"github.com/anchore/syft/internal/log"
syftEventParsers "github.com/anchore/syft/syft/event/parsers"
)
func (m *Handler) handlePullSourceStarted(e partybus.Event) []tea.Model {
prog, info, err := syftEventParsers.ParsePullSourceStarted(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: info.Title.Default,
Running: info.Title.WhileRunning,
Success: info.Title.OnSuccess,
},
taskprogress.WithStagedProgressable(prog),
)
tsk.HideOnSuccess = info.HideOnSuccess
tsk.HideStageOnSuccess = info.HideStageOnSuccess
tsk.HideProgressOnSuccess = true
if info.Context != "" {
tsk.Context = []string{info.Context}
}
return []tea.Model{tsk}
}
================================================
FILE: cmd/syft/cli/ui/handle_pull_source_test.go
================================================
package ui
import (
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
"github.com/anchore/syft/syft/event"
"github.com/anchore/syft/syft/event/monitor"
)
func TestHandler_handlePullSourceStarted(t *testing.T) {
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "snap download in progress",
eventFn: func(t *testing.T) partybus.Event {
stage := progress.NewAtomicStage("")
manual := progress.NewManual(0)
manual.SetTotal(1000000) // 1MB file
manual.Set(250000) // 25% downloaded
taskProg := &monitor.TaskProgress{
AtomicStage: stage,
Manual: manual,
}
genericTask := monitor.GenericTask{
Title: monitor.Title{
Default: "Downloading snap",
WhileRunning: "Downloading snap file...",
OnSuccess: "Snap downloaded",
},
Context: "example-app_1.0_amd64.snap",
HideOnSuccess: false,
HideStageOnSuccess: true,
ID: "snap-download-123",
}
return partybus.Event{
Type: event.PullSourceStarted,
Source: genericTask,
Value: taskProg,
}
},
iterations: 5,
},
{
name: "snap download complete",
eventFn: func(t *testing.T) partybus.Event {
stage := progress.NewAtomicStage("")
manual := progress.NewManual(0)
manual.SetTotal(1000000) // 1MB file
manual.Set(1000000) // 100% downloaded
manual.SetCompleted()
taskProg := &monitor.TaskProgress{
AtomicStage: stage,
Manual: manual,
}
genericTask := monitor.GenericTask{
Title: monitor.Title{
Default: "Downloading snap",
WhileRunning: "Downloading snap file...",
OnSuccess: "Snap downloaded successfully",
},
Context: "example-app_1.0_amd64.snap",
HideOnSuccess: false,
HideStageOnSuccess: true,
ID: "snap-download-123",
}
return partybus.Event{
Type: event.PullSourceStarted,
Source: genericTask,
Value: taskProg,
}
},
iterations: 3,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
models := handler.handlePullSourceStarted(event)
require.Len(t, models, 1)
model := models[0]
tsk, ok := model.(taskprogress.Model)
require.True(t, ok)
gotModel := runModel(t, tsk, tt.iterations, taskprogress.TickMsg{
Time: time.Now(),
Sequence: tsk.Sequence(),
ID: tsk.ID(),
})
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
}
}
================================================
FILE: cmd/syft/cli/ui/handle_read_image.go
================================================
package ui
import (
tea "github.com/charmbracelet/bubbletea"
"github.com/wagoodman/go-partybus"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoEventParsers "github.com/anchore/stereoscope/pkg/event/parsers"
"github.com/anchore/syft/internal/log"
)
func (m *Handler) handleReadImage(e partybus.Event) []tea.Model {
imgMetadata, prog, err := stereoEventParsers.ParseReadImage(e)
if err != nil {
log.WithFields("error", err).Debug("unable to parse event")
return nil
}
tsk := m.newTaskProgress(
taskprogress.Title{
Default: "Parse image",
Running: "Parsing image",
Success: "Parsed image",
},
taskprogress.WithProgress(prog),
)
if imgMetadata != nil {
tsk.Context = []string{imgMetadata.ID}
}
return []tea.Model{tsk}
}
================================================
FILE: cmd/syft/cli/ui/handle_read_image_test.go
================================================
package ui
import (
"testing"
"time"
tea "github.com/charmbracelet/bubbletea"
"github.com/gkampitakis/go-snaps/snaps"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/stretchr/testify/require"
"github.com/wagoodman/go-partybus"
"github.com/wagoodman/go-progress"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoscopeEvent "github.com/anchore/stereoscope/pkg/event"
"github.com/anchore/stereoscope/pkg/image"
)
func TestHandler_handleReadImage(t *testing.T) {
tests := []struct {
name string
eventFn func(*testing.T) partybus.Event
iterations int
}{
{
name: "read image in progress",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(50)
src := image.Metadata{
ID: "id",
Size: 42,
Config: v1.ConfigFile{
Architecture: "arch",
Author: "auth",
Container: "cont",
OS: "os",
OSVersion: "os-ver",
Variant: "vari",
},
MediaType: "media",
ManifestDigest: "digest",
Architecture: "arch",
Variant: "var",
OS: "os",
}
return partybus.Event{
Type: stereoscopeEvent.ReadImage,
Source: src,
Value: prog,
}
},
},
{
name: "read image complete",
eventFn: func(t *testing.T) partybus.Event {
prog := &progress.Manual{}
prog.SetTotal(100)
prog.Set(100)
prog.SetCompleted()
src := image.Metadata{
ID: "id",
Size: 42,
Config: v1.ConfigFile{
Architecture: "arch",
Author: "auth",
Container: "cont",
OS: "os",
OSVersion: "os-ver",
Variant: "vari",
},
MediaType: "media",
ManifestDigest: "digest",
Architecture: "arch",
Variant: "var",
OS: "os",
}
return partybus.Event{
Type: stereoscopeEvent.ReadImage,
Source: src,
Value: prog,
}
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
event := tt.eventFn(t)
handler := New(DefaultHandlerConfig())
handler.WindowSize = tea.WindowSizeMsg{
Width: 100,
Height: 80,
}
models, _ := handler.Handle(event)
require.Len(t, models, 1)
model := models[0]
tsk, ok := model.(taskprogress.Model)
require.True(t, ok)
gotModel := runModel(t, tsk, tt.iterations, taskprogress.TickMsg{
Time: time.Now(),
Sequence: tsk.Sequence(),
ID: tsk.ID(),
})
got := gotModel.View()
t.Log(got)
snaps.MatchSnapshot(t, got)
})
}
}
================================================
FILE: cmd/syft/cli/ui/handler.go
================================================
package ui
import (
"sync"
tea "github.com/charmbracelet/bubbletea"
"github.com/wagoodman/go-partybus"
"github.com/anchore/bubbly"
"github.com/anchore/bubbly/bubbles/taskprogress"
stereoscopeEvent "github.com/anchore/stereoscope/pkg/event"
syftEvent "github.com/anchore/syft/syft/event"
)
var _ interface {
bubbly.EventHandler
bubbly.MessageListener
bubbly.HandleWaiter
} = (*Handler)(nil)
type HandlerConfig struct {
TitleWidth int
AdjustDefaultTask func(taskprogress.Model) taskprogress.Model
}
type Handler struct {
WindowSize tea.WindowSizeMsg
Running *sync.WaitGroup
Config HandlerConfig
bubbly.EventHandler
onNewCatalogerTask *sync.Once
}
func DefaultHandlerConfig() HandlerConfig {
return HandlerConfig{
TitleWidth: 30,
}
}
func New(cfg HandlerConfig) *Handler {
d := bubbly.NewEventDispatcher()
h := &Handler{
EventHandler: d,
Running: &sync.WaitGroup{},
Config: cfg,
onNewCatalogerTask: &sync.Once{},
}
// register all supported event types with the respective handler functions
d.AddHandlers(map[partybus.EventType]bubbly.EventHandlerFn{
stereoscopeEvent.PullDockerImage: simpleHandler(h.handlePullDockerImage),
stereoscopeEvent.PullContainerdImage: simpleHandler(h.handlePullContainerdImage),
stereoscopeEvent.ReadImage: simpleHandler(h.handleReadImage),
stereoscopeEvent.FetchImage: simpleHandler(h.handleFetchImage),
syftEvent.FileIndexingStarted: simpleHandler(h.handleFileIndexingStarted),
syftEvent.AttestationStarted: simpleHandler(h.handleAttestationStarted),
syftEvent.PullSourceStarted: simpleHandler(h.handlePullSourceStarted),
syftEvent.CatalogerTaskStarted: h.handleCatalogerTaskStarted,
})
return h
}
func simpleHandler(fn func(partybus.Event) []tea.Model) bubbly.EventHandlerFn {
return func(e partybus.Event) ([]tea.Model, tea.Cmd) {
return fn(e), nil
}
}
func (m *Handler) OnMessage(msg tea.Msg) {
if msg, ok := msg.(tea.WindowSizeMsg); ok {
m.WindowSize = msg
}
}
func (m *Handler) Wait() {
m.Running.Wait()
}
=======
gitextract_49r_9_lv/
├── .binny.yaml
├── .bouncer.yaml
├── .chronicle.yaml
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ ├── config.yml
│ │ └── feature_request.md
│ ├── actions/
│ │ └── bootstrap/
│ │ └── action.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ ├── scripts/
│ │ ├── capability-drift-check.sh
│ │ ├── check_binary_fixture_size.sh
│ │ ├── ci-check.sh
│ │ ├── coverage.py
│ │ ├── find_cache_paths.py
│ │ ├── fingerprint_docker_fixtures.py
│ │ ├── go-mod-tidy-check.sh
│ │ ├── json-schema-drift-check.sh
│ │ ├── labeler.py
│ │ ├── labeler_test.py
│ │ └── trigger-release.sh
│ ├── workflows/
│ │ ├── codeql-analysis.yml
│ │ ├── dependabot-automation.yaml
│ │ ├── detect-schema-changes.yaml
│ │ ├── oss-project-board-add.yaml
│ │ ├── release.yaml
│ │ ├── remove-awaiting-response-label.yaml
│ │ ├── test-fixture-cache-publish.yaml
│ │ ├── update-anchore-dependencies.yml
│ │ ├── update-bootstrap-tools.yml
│ │ ├── update-cpe-dictionary-index.yml
│ │ ├── update-spdx-license-list.yaml
│ │ ├── validate-github-actions.yaml
│ │ └── validations.yaml
│ └── zizmor.yml
├── .gitignore
├── .golangci.yaml
├── .goreleaser.yaml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTORS.md
├── Dockerfile
├── Dockerfile.debug
├── Dockerfile.nonroot
├── LICENSE
├── Makefile
├── README.md
├── RELEASE.md
├── SECURITY.md
├── Taskfile.yaml
├── artifacthub-repo.yml
├── cmd/
│ └── syft/
│ ├── cli/
│ │ ├── cli.go
│ │ └── ui/
│ │ ├── __snapshots__/
│ │ │ ├── handle_attestation_test.snap
│ │ │ ├── handle_cataloger_task_test.snap
│ │ │ ├── handle_fetch_image_test.snap
│ │ │ ├── handle_file_indexing_test.snap
│ │ │ ├── handle_pull_docker_image_test.snap
│ │ │ ├── handle_pull_source_test.snap
│ │ │ └── handle_read_image_test.snap
│ │ ├── handle_attestation.go
│ │ ├── handle_attestation_test.go
│ │ ├── handle_cataloger_task.go
│ │ ├── handle_cataloger_task_test.go
│ │ ├── handle_fetch_image.go
│ │ ├── handle_fetch_image_test.go
│ │ ├── handle_file_indexing.go
│ │ ├── handle_file_indexing_test.go
│ │ ├── handle_pull_containerd_image.go
│ │ ├── handle_pull_docker_image.go
│ │ ├── handle_pull_docker_image_test.go
│ │ ├── handle_pull_source.go
│ │ ├── handle_pull_source_test.go
│ │ ├── handle_read_image.go
│ │ ├── handle_read_image_test.go
│ │ ├── handler.go
│ │ ├── new_task_progress.go
│ │ └── util_test.go
│ ├── internal/
│ │ ├── clio_setup_config.go
│ │ ├── commands/
│ │ │ ├── attest.go
│ │ │ ├── attest_test.go
│ │ │ ├── cataloger.go
│ │ │ ├── cataloger_info.go
│ │ │ ├── cataloger_info_test.go
│ │ │ ├── cataloger_list.go
│ │ │ ├── cataloger_list_test.go
│ │ │ ├── commands_test.go
│ │ │ ├── convert.go
│ │ │ ├── packages.go
│ │ │ ├── packages_test.go
│ │ │ ├── root.go
│ │ │ ├── scan.go
│ │ │ ├── scan_test.go
│ │ │ ├── testdata/
│ │ │ │ └── scan-configs/
│ │ │ │ ├── no-legacy-options.yaml
│ │ │ │ ├── with-base-path.yaml
│ │ │ │ ├── with-default-pull-source.yaml
│ │ │ │ ├── with-exclude-binary-overlap-by-ownership.yaml
│ │ │ │ ├── with-file-section.yaml
│ │ │ │ └── with-file-string.yaml
│ │ │ ├── update.go
│ │ │ ├── update_test.go
│ │ │ └── utils.go
│ │ ├── constants.go
│ │ ├── options/
│ │ │ ├── attest.go
│ │ │ ├── cache.go
│ │ │ ├── cache_test.go
│ │ │ ├── catalog.go
│ │ │ ├── catalog_test.go
│ │ │ ├── cataloger_selection.go
│ │ │ ├── cataloger_selection_test.go
│ │ │ ├── compliance.go
│ │ │ ├── config.go
│ │ │ ├── dotnet.go
│ │ │ ├── file.go
│ │ │ ├── file_test.go
│ │ │ ├── format.go
│ │ │ ├── format_cyclonedx_json.go
│ │ │ ├── format_cyclonedx_json_test.go
│ │ │ ├── format_cyclonedx_xml.go
│ │ │ ├── format_cyclonedx_xml_test.go
│ │ │ ├── format_spdx_json.go
│ │ │ ├── format_spdx_json_test.go
│ │ │ ├── format_syft_json.go
│ │ │ ├── format_syft_json_test.go
│ │ │ ├── format_template.go
│ │ │ ├── golang.go
│ │ │ ├── java.go
│ │ │ ├── javascript.go
│ │ │ ├── license.go
│ │ │ ├── linux_kernel.go
│ │ │ ├── nix.go
│ │ │ ├── output.go
│ │ │ ├── output_file.go
│ │ │ ├── output_test.go
│ │ │ ├── pkg.go
│ │ │ ├── python.go
│ │ │ ├── registry.go
│ │ │ ├── registry_test.go
│ │ │ ├── relationships.go
│ │ │ ├── secret.go
│ │ │ ├── source.go
│ │ │ ├── source_test.go
│ │ │ ├── unknowns.go
│ │ │ ├── update_check.go
│ │ │ ├── writer.go
│ │ │ └── writer_test.go
│ │ ├── test/
│ │ │ └── integration/
│ │ │ ├── .gitignore
│ │ │ ├── all_layers_squashed_comparison_test.go
│ │ │ ├── catalog_packages_cases_test.go
│ │ │ ├── catalog_packages_test.go
│ │ │ ├── distro_test.go
│ │ │ ├── encode_decode_cycle_test.go
│ │ │ ├── files_test.go
│ │ │ ├── go_compiler_detection_test.go
│ │ │ ├── java_purl_test.go
│ │ │ ├── mariner_distroless_test.go
│ │ │ ├── node_packages_test.go
│ │ │ ├── package_binary_elf_relationships_test.go
│ │ │ ├── package_cataloger_convention_test.go
│ │ │ ├── package_catalogers_represented_test.go
│ │ │ ├── package_deduplication_test.go
│ │ │ ├── package_ownership_relationship_test.go
│ │ │ ├── regression_apk_scanner_buffer_size_test.go
│ │ │ ├── regression_go_bin_scanner_arch_test.go
│ │ │ ├── regression_java_no_main_package_test.go
│ │ │ ├── regression_java_virtualpath_test.go
│ │ │ ├── regression_photon_package_test.go
│ │ │ ├── regression_sbom_duplicate_relationships_test.go
│ │ │ ├── rust_audit_binary_test.go
│ │ │ ├── sbom_cataloger_test.go
│ │ │ ├── sbom_metadata_component_test.go
│ │ │ ├── sqlite_rpmdb_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── files/
│ │ │ │ │ └── somewhere/
│ │ │ │ │ └── there/
│ │ │ │ │ └── is/
│ │ │ │ │ ├── a/
│ │ │ │ │ │ └── file
│ │ │ │ │ └── a-small-file
│ │ │ │ ├── image-distro-id/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-go-bin-arch-coverage/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── app.go
│ │ │ │ │ ├── go.mod
│ │ │ │ │ └── test
│ │ │ │ ├── image-golang-compiler/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-no-main-package/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-virtualpath-regression/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── extract.py
│ │ │ │ ├── image-large-apk-data/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-mariner-distroless/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-os-binary-overlap/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-owning-package/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-photon-all-layers/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-pkg-coverage/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── conan/
│ │ │ │ │ │ └── conanfile.txt
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── os-release
│ │ │ │ │ ├── hackage/
│ │ │ │ │ │ ├── cabal.project.freeze
│ │ │ │ │ │ └── stack.yaml
│ │ │ │ │ ├── lib/
│ │ │ │ │ │ └── apk/
│ │ │ │ │ │ └── db/
│ │ │ │ │ │ └── installed
│ │ │ │ │ ├── pkgs/
│ │ │ │ │ │ ├── dotnet/
│ │ │ │ │ │ │ └── TestLibrary.deps.json
│ │ │ │ │ │ ├── erlang/
│ │ │ │ │ │ │ └── accept.app
│ │ │ │ │ │ ├── github-actions/
│ │ │ │ │ │ │ └── .github/
│ │ │ │ │ │ │ └── workflows/
│ │ │ │ │ │ │ └── validations.yaml
│ │ │ │ │ │ ├── go/
│ │ │ │ │ │ │ └── go.mod
│ │ │ │ │ │ ├── homebrew/
│ │ │ │ │ │ │ └── Cellar/
│ │ │ │ │ │ │ └── afflib/
│ │ │ │ │ │ │ └── 1.2.3/
│ │ │ │ │ │ │ └── .brew/
│ │ │ │ │ │ │ └── afflib.rb
│ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ ├── generate-fixtures.md
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── javascript/
│ │ │ │ │ │ │ └── package-json/
│ │ │ │ │ │ │ └── package.json
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ └── apk/
│ │ │ │ │ │ │ └── db/
│ │ │ │ │ │ │ └── installed
│ │ │ │ │ │ ├── nix/
│ │ │ │ │ │ │ └── store/
│ │ │ │ │ │ │ └── h0cnbmfcn93xm5dg2x27ixhag1cwndga-glibc-2.34-210-bin/
│ │ │ │ │ │ │ └── share/
│ │ │ │ │ │ │ └── man/
│ │ │ │ │ │ │ └── glibc.1
│ │ │ │ │ │ ├── opam/
│ │ │ │ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ │ │ │ └── opam
│ │ │ │ │ │ ├── php/
│ │ │ │ │ │ │ ├── .registry/
│ │ │ │ │ │ │ │ └── .channel.pecl.php.net/
│ │ │ │ │ │ │ │ └── memcached.reg
│ │ │ │ │ │ │ └── vendor/
│ │ │ │ │ │ │ └── composer/
│ │ │ │ │ │ │ └── installed.json
│ │ │ │ │ │ ├── python/
│ │ │ │ │ │ │ ├── dist-info/
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ ├── egg-info/
│ │ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ ├── requires/
│ │ │ │ │ │ │ │ ├── requirements-dev.txt
│ │ │ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ │ │ └── test-requirements.txt
│ │ │ │ │ │ │ ├── setup/
│ │ │ │ │ │ │ │ └── setup.py
│ │ │ │ │ │ │ ├── someotherpkg-3.19.0-py3.8.egg-info/
│ │ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── somerequests-3.22.0.dist-info/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── r/
│ │ │ │ │ │ │ └── base/
│ │ │ │ │ │ │ └── DESCRIPTION
│ │ │ │ │ │ ├── rockspec/
│ │ │ │ │ │ │ └── kong-3.7.0-0.rockspec
│ │ │ │ │ │ ├── ruby/
│ │ │ │ │ │ │ └── specifications/
│ │ │ │ │ │ │ ├── bundler.gemspec
│ │ │ │ │ │ │ └── default/
│ │ │ │ │ │ │ └── unbundler.gemspec
│ │ │ │ │ │ ├── var/
│ │ │ │ │ │ │ ├── db/
│ │ │ │ │ │ │ │ └── pkg/
│ │ │ │ │ │ │ │ └── app-containers/
│ │ │ │ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ │ │ │ ├── CONTENTS
│ │ │ │ │ │ │ │ ├── LICENSE
│ │ │ │ │ │ │ │ └── SIZE
│ │ │ │ │ │ │ └── lib/
│ │ │ │ │ │ │ ├── dpkg/
│ │ │ │ │ │ │ │ ├── status
│ │ │ │ │ │ │ │ └── status.d/
│ │ │ │ │ │ │ │ ├── dash
│ │ │ │ │ │ │ │ └── netbase
│ │ │ │ │ │ │ ├── pacman/
│ │ │ │ │ │ │ │ └── local/
│ │ │ │ │ │ │ │ ├── ALPM_DB_VERSION
│ │ │ │ │ │ │ │ └── pacman-6.0.1-5/
│ │ │ │ │ │ │ │ ├── desc
│ │ │ │ │ │ │ │ ├── files
│ │ │ │ │ │ │ │ └── mtree
│ │ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ │ ├── Packages
│ │ │ │ │ │ │ └── generate-fixture.sh
│ │ │ │ │ │ └── wordpress/
│ │ │ │ │ │ └── wp-content/
│ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ └── akismet/
│ │ │ │ │ │ └── akismet.php
│ │ │ │ │ ├── swift/
│ │ │ │ │ │ └── Package.resolved
│ │ │ │ │ ├── swipl/
│ │ │ │ │ │ └── pack/
│ │ │ │ │ │ └── hdt/
│ │ │ │ │ │ └── pack.pl
│ │ │ │ │ └── terraform/
│ │ │ │ │ └── .terraform.lock.hcl
│ │ │ │ ├── image-rust-auditable/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-sbom-cataloger/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── go.mod
│ │ │ │ │ └── test.spdx.json
│ │ │ │ ├── image-sbom-metadata-component/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── test.cdx.json
│ │ │ │ ├── image-sqlite-rpmdb/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-suse-all-layers/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-test-java-purls/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── extract.py
│ │ │ │ ├── image-vertical-package-dups/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── npm-lock/
│ │ │ │ │ └── package.json
│ │ │ │ └── yarn-lock/
│ │ │ │ ├── package.json
│ │ │ │ └── packages/
│ │ │ │ └── nested-package/
│ │ │ │ └── package.json
│ │ │ └── utils_test.go
│ │ └── ui/
│ │ ├── __snapshots__/
│ │ │ └── event_writer_test.snap
│ │ ├── capture.go
│ │ ├── capture_test.go
│ │ ├── event_writer.go
│ │ ├── event_writer_test.go
│ │ ├── log_writer.go
│ │ ├── log_writer_test.go
│ │ ├── no_ui.go
│ │ └── ui.go
│ └── main.go
├── examples/
│ ├── README.md
│ ├── create_custom_sbom/
│ │ ├── alpine_configuration_cataloger.go
│ │ └── main.go
│ ├── create_simple_sbom/
│ │ └── main.go
│ ├── decode_sbom/
│ │ ├── alpine.syft.json
│ │ └── main.go
│ ├── select_catalogers/
│ │ └── main.go
│ ├── source_detection/
│ │ └── main.go
│ ├── source_from_image/
│ │ └── main.go
│ └── source_from_registry/
│ └── main.go
├── go.mod
├── go.sum
├── install.sh
├── internal/
│ ├── buffered_seek_reader.go
│ ├── buffered_seek_reader_test.go
│ ├── bus/
│ │ ├── bus.go
│ │ └── helpers.go
│ ├── cache/
│ │ ├── README.md
│ │ ├── bypass.go
│ │ ├── bypass_test.go
│ │ ├── cache.go
│ │ ├── cache_test.go
│ │ ├── error_resolver.go
│ │ ├── error_resolver_test.go
│ │ ├── filesystem.go
│ │ ├── filesystem_test.go
│ │ ├── hash_type.go
│ │ ├── hash_type_test.go
│ │ ├── memory.go
│ │ ├── memory_test.go
│ │ ├── resolver.go
│ │ └── resolver_test.go
│ ├── capabilities/
│ │ ├── README.md
│ │ ├── appconfig.yaml
│ │ ├── capabilities.go
│ │ ├── evaluation.go
│ │ ├── evaluation_test.go
│ │ ├── generate/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── cataloger_config_linking.go
│ │ │ ├── cataloger_config_linking_test.go
│ │ │ ├── discover_app_config.go
│ │ │ ├── discover_app_config_test.go
│ │ │ ├── discover_cataloger_configs.go
│ │ │ ├── discover_cataloger_configs_test.go
│ │ │ ├── discover_catalogers.go
│ │ │ ├── discover_catalogers_test.go
│ │ │ ├── discover_metadata.go
│ │ │ ├── discover_metadata_test.go
│ │ │ ├── io.go
│ │ │ ├── io_test.go
│ │ │ ├── main.go
│ │ │ ├── merge.go
│ │ │ ├── merge_test.go
│ │ │ ├── metadata_check.go
│ │ │ ├── overrides.go
│ │ │ ├── testdata/
│ │ │ │ ├── cataloger/
│ │ │ │ │ ├── cataloger-with-constant/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── python/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── conflicting-names/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ ├── duplicate1/
│ │ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ │ └── duplicate2/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── custom-cataloger-different-file/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── dotnet/
│ │ │ │ │ │ ├── cataloger.go
│ │ │ │ │ │ └── types.go
│ │ │ │ │ ├── custom-cataloger-same-file/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── imported-config-type/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── kernel/
│ │ │ │ │ │ ├── cataloger.go
│ │ │ │ │ │ └── config.go
│ │ │ │ │ ├── mixed-naming-patterns/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── ruby/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── no-config-cataloger/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── javascript/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── non-config-first-param/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── binary/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ ├── selector-expression-config/
│ │ │ │ │ │ └── cataloger/
│ │ │ │ │ │ └── rust/
│ │ │ │ │ │ └── cataloger.go
│ │ │ │ │ └── simple-generic-cataloger/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── golang/
│ │ │ │ │ └── cataloger.go
│ │ │ │ └── config-discovery/
│ │ │ │ ├── multiple-configs/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ ├── java/
│ │ │ │ │ │ └── config.go
│ │ │ │ │ └── python/
│ │ │ │ │ └── config.go
│ │ │ │ ├── nested-config/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── golang/
│ │ │ │ │ └── config.go
│ │ │ │ ├── no-annotations/
│ │ │ │ │ └── cataloger/
│ │ │ │ │ └── javascript/
│ │ │ │ │ └── config.go
│ │ │ │ └── simple-config/
│ │ │ │ └── cataloger/
│ │ │ │ └── golang/
│ │ │ │ └── config.go
│ │ │ └── util_test.go
│ │ ├── internal/
│ │ │ ├── cataloger_names.go
│ │ │ ├── fixtures.go
│ │ │ ├── load_capabilities.go
│ │ │ ├── load_capabilities_test.go
│ │ │ ├── paths.go
│ │ │ ├── repo_root.go
│ │ │ └── util_test.go
│ │ ├── model.go
│ │ ├── model_test.go
│ │ ├── pkgtestobservation/
│ │ │ └── model.go
│ │ └── util_test.go
│ ├── cmptest/
│ │ ├── common_options.go
│ │ ├── diff_reporter.go
│ │ ├── license.go
│ │ ├── location.go
│ │ ├── relationship.go
│ │ └── set.go
│ ├── constants.go
│ ├── docs.go
│ ├── err_helper.go
│ ├── evidence/
│ │ └── constants.go
│ ├── file/
│ │ ├── archive_aliases.go
│ │ ├── archive_aliases_test.go
│ │ ├── copy.go
│ │ ├── digest.go
│ │ ├── digest_test.go
│ │ ├── getter.go
│ │ ├── getter_test.go
│ │ ├── normalize_hashes.go
│ │ ├── normalize_hashes_test.go
│ │ ├── opener.go
│ │ ├── squashfs.go
│ │ ├── squashfs_test.go
│ │ ├── tar_file_traversal.go
│ │ ├── testdata/
│ │ │ ├── digest.txt
│ │ │ ├── empty.txt
│ │ │ ├── generate-zip-fixture-from-source-dir.sh
│ │ │ └── zip-source/
│ │ │ ├── b-file/
│ │ │ │ └── in-subdir.txt
│ │ │ ├── b-file.txt
│ │ │ └── some-dir/
│ │ │ └── a-file.txt
│ │ ├── zip_file_helpers_test.go
│ │ ├── zip_file_manifest.go
│ │ ├── zip_file_manifest_test.go
│ │ ├── zip_file_traversal.go
│ │ └── zip_file_traversal_test.go
│ ├── generate.go
│ ├── input.go
│ ├── jsonschema/
│ │ ├── README.md
│ │ ├── comments.go
│ │ ├── comments_test.go
│ │ └── main.go
│ ├── licenses/
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── find_evidence.go
│ │ ├── find_evidence_test.go
│ │ ├── list.go
│ │ ├── scanner.go
│ │ └── testdata/
│ │ ├── Knuth-CTAN
│ │ ├── apache-license-2.0
│ │ ├── multi-license
│ │ └── nvidia-software-and-cuda-supplement
│ ├── log/
│ │ └── log.go
│ ├── mimetype/
│ │ ├── mimetype_helper.go
│ │ └── mimetype_helper_test.go
│ ├── os/
│ │ ├── feature_detection.go
│ │ ├── feature_detection_test.go
│ │ └── testdata/
│ │ ├── not_rhel/
│ │ │ ├── Dockerfile
│ │ │ ├── etc/
│ │ │ │ └── os-release
│ │ │ └── root/
│ │ │ └── buildinfo/
│ │ │ └── content_manifests/
│ │ │ └── driver-toolkit-container-v4.16.0-202411210647.p0.g1d5732f.assembly.stream.el9.json
│ │ ├── rhel_content_manifests/
│ │ │ ├── Dockerfile
│ │ │ ├── etc/
│ │ │ │ └── os-release
│ │ │ └── root/
│ │ │ └── buildinfo/
│ │ │ └── content_manifests/
│ │ │ ├── driver-toolkit-container-v4.16.0-202411210647.p0.g1d5732f.assembly.stream.el9.json
│ │ │ └── openshift-base-rhel9-container-v4.16.0-202411190033.p0.gb45ea65.assembly.stream.el9.json
│ │ └── rhel_no_manifests/
│ │ ├── Dockerfile
│ │ └── etc/
│ │ └── os-release
│ ├── packagemetadata/
│ │ ├── completion_tester.go
│ │ ├── discover_type_names.go
│ │ ├── discover_type_names_test.go
│ │ ├── generate/
│ │ │ └── main.go
│ │ ├── generated.go
│ │ ├── names.go
│ │ └── names_test.go
│ ├── redact/
│ │ └── redact.go
│ ├── regex_helpers.go
│ ├── regex_helpers_test.go
│ ├── relationship/
│ │ ├── binary/
│ │ │ ├── binary_dependencies.go
│ │ │ ├── binary_dependencies_test.go
│ │ │ ├── shared_library_index.go
│ │ │ └── shared_library_index_test.go
│ │ ├── by_file_ownership.go
│ │ ├── by_file_ownership_test.go
│ │ ├── evident_by.go
│ │ ├── evident_by_test.go
│ │ ├── exclude_binaries_by_file_ownership_overlap.go
│ │ ├── exclude_binaries_by_file_ownership_overlap_test.go
│ │ ├── index.go
│ │ ├── index_test.go
│ │ ├── remove.go
│ │ ├── sort.go
│ │ └── to_source.go
│ ├── sbomsync/
│ │ ├── builder.go
│ │ └── builder_test.go
│ ├── set.go
│ ├── set_test.go
│ ├── sourcemetadata/
│ │ ├── completion_tester.go
│ │ ├── discover_type_names.go
│ │ ├── generate/
│ │ │ └── main.go
│ │ ├── generated.go
│ │ ├── names.go
│ │ └── names_test.go
│ ├── spdxlicense/
│ │ ├── generate/
│ │ │ ├── generate_license_list.go
│ │ │ ├── generate_license_list_test.go
│ │ │ ├── license.go
│ │ │ ├── license_test.go
│ │ │ └── testdata/
│ │ │ └── licenses.json
│ │ ├── license.go
│ │ ├── license_list.go
│ │ ├── license_list_test.go
│ │ ├── license_test.go
│ │ └── license_url_test.go
│ ├── string_helpers.go
│ ├── string_helpers_test.go
│ ├── task/
│ │ ├── cataloging_config.go
│ │ ├── environment_tasks.go
│ │ ├── executor.go
│ │ ├── executor_test.go
│ │ ├── expression.go
│ │ ├── expression_test.go
│ │ ├── factory.go
│ │ ├── feature_detection.go
│ │ ├── file_tasks.go
│ │ ├── file_tasks_test.go
│ │ ├── package_task_factory.go
│ │ ├── package_task_factory_test.go
│ │ ├── package_tasks.go
│ │ ├── relationship_tasks.go
│ │ ├── scope_tasks.go
│ │ ├── selection.go
│ │ ├── selection_test.go
│ │ ├── set.go
│ │ ├── set_test.go
│ │ ├── task.go
│ │ └── unknowns_tasks.go
│ ├── testutils/
│ │ └── golden_files.go
│ ├── tmpdir/
│ │ ├── tmpdir.go
│ │ └── tmpdir_test.go
│ ├── tprint.go
│ └── unknown/
│ ├── coordinate_error.go
│ ├── coordinate_error_test.go
│ ├── path_error.go
│ └── path_error_test.go
├── schema/
│ ├── cyclonedx/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── cyclonedx.json
│ │ ├── cyclonedx.xsd
│ │ ├── spdx.schema.json
│ │ └── spdx.xsd
│ ├── json/
│ │ ├── README.md
│ │ ├── schema-1.0.0.json
│ │ ├── schema-1.0.1.json
│ │ ├── schema-1.0.2.json
│ │ ├── schema-1.0.3.json
│ │ ├── schema-1.0.4.json
│ │ ├── schema-1.0.5.json
│ │ ├── schema-1.1.0.json
│ │ ├── schema-10.0.0.json
│ │ ├── schema-10.0.1.json
│ │ ├── schema-10.0.2.json
│ │ ├── schema-11.0.0.json
│ │ ├── schema-11.0.1.json
│ │ ├── schema-11.0.2.json
│ │ ├── schema-12.0.0.json
│ │ ├── schema-12.0.1.json
│ │ ├── schema-13.0.0.json
│ │ ├── schema-14.0.0.json
│ │ ├── schema-15.0.0.json
│ │ ├── schema-16.0.0.json
│ │ ├── schema-16.0.1.json
│ │ ├── schema-16.0.11.json
│ │ ├── schema-16.0.12.json
│ │ ├── schema-16.0.13.json
│ │ ├── schema-16.0.14.json
│ │ ├── schema-16.0.15.json
│ │ ├── schema-16.0.16.json
│ │ ├── schema-16.0.17.json
│ │ ├── schema-16.0.18.json
│ │ ├── schema-16.0.19.json
│ │ ├── schema-16.0.2.json
│ │ ├── schema-16.0.20.json
│ │ ├── schema-16.0.21.json
│ │ ├── schema-16.0.22.json
│ │ ├── schema-16.0.23.json
│ │ ├── schema-16.0.24.json
│ │ ├── schema-16.0.25.json
│ │ ├── schema-16.0.26.json
│ │ ├── schema-16.0.27.json
│ │ ├── schema-16.0.28.json
│ │ ├── schema-16.0.29.json
│ │ ├── schema-16.0.3.json
│ │ ├── schema-16.0.30.json
│ │ ├── schema-16.0.31.json
│ │ ├── schema-16.0.32.json
│ │ ├── schema-16.0.33.json
│ │ ├── schema-16.0.34.json
│ │ ├── schema-16.0.35.json
│ │ ├── schema-16.0.36.json
│ │ ├── schema-16.0.37.json
│ │ ├── schema-16.0.38.json
│ │ ├── schema-16.0.39.json
│ │ ├── schema-16.0.4.json
│ │ ├── schema-16.0.40.json
│ │ ├── schema-16.0.41.json
│ │ ├── schema-16.0.42.json
│ │ ├── schema-16.0.43.json
│ │ ├── schema-16.0.5.json
│ │ ├── schema-16.0.6.json
│ │ ├── schema-16.0.7.json
│ │ ├── schema-16.0.8.json
│ │ ├── schema-16.0.9.json
│ │ ├── schema-16.1.0.json
│ │ ├── schema-16.1.1.json
│ │ ├── schema-16.1.2.json
│ │ ├── schema-16.1.3.json
│ │ ├── schema-2.0.0.json
│ │ ├── schema-2.0.1.json
│ │ ├── schema-2.0.2.json
│ │ ├── schema-3.0.0.json
│ │ ├── schema-3.0.1.json
│ │ ├── schema-3.1.0.json
│ │ ├── schema-3.1.1.json
│ │ ├── schema-3.2.1.json
│ │ ├── schema-3.2.2.json
│ │ ├── schema-3.2.3.json
│ │ ├── schema-3.2.4.json
│ │ ├── schema-3.3.0.json
│ │ ├── schema-3.3.1.json
│ │ ├── schema-3.3.2.json
│ │ ├── schema-4.0.0.json
│ │ ├── schema-4.1.0.json
│ │ ├── schema-5.0.0.json
│ │ ├── schema-5.0.1.json
│ │ ├── schema-5.1.0.json
│ │ ├── schema-6.0.0.json
│ │ ├── schema-6.1.0.json
│ │ ├── schema-6.2.0.json
│ │ ├── schema-7.0.0.json
│ │ ├── schema-7.0.1.json
│ │ ├── schema-7.1.0.json
│ │ ├── schema-7.1.1.json
│ │ ├── schema-7.1.2.json
│ │ ├── schema-7.1.3.json
│ │ ├── schema-7.1.4.json
│ │ ├── schema-7.1.5.json
│ │ ├── schema-7.1.6.json
│ │ ├── schema-8.0.0.json
│ │ ├── schema-8.0.1.json
│ │ ├── schema-9.0.0.json
│ │ ├── schema-9.0.1.json
│ │ ├── schema-9.0.2.json
│ │ ├── schema-latest.json
│ │ └── vnd.syft+json
│ └── spdx-json/
│ └── spdx-schema-2.3.json
├── syft/
│ ├── artifact/
│ │ ├── id.go
│ │ └── relationship.go
│ ├── cataloging/
│ │ ├── archive_search.go
│ │ ├── compliance.go
│ │ ├── data_generation.go
│ │ ├── executor.go
│ │ ├── filecataloging/
│ │ │ ├── config.go
│ │ │ ├── config_test.go
│ │ │ └── tags.go
│ │ ├── license.go
│ │ ├── pkgcataloging/
│ │ │ ├── cataloger_reference.go
│ │ │ ├── config.go
│ │ │ ├── selection.go
│ │ │ └── tags.go
│ │ ├── relationships.go
│ │ ├── search.go
│ │ ├── selection.go
│ │ └── unknowns.go
│ ├── configuration_audit_trail.go
│ ├── configuration_audit_trail_test.go
│ ├── cpe/
│ │ ├── by_source_then_specificity.go
│ │ ├── by_source_then_specificity_test.go
│ │ ├── by_specificity.go
│ │ ├── by_specificity_test.go
│ │ ├── cpe.go
│ │ ├── cpe_test.go
│ │ ├── merge_cpes.go
│ │ ├── merge_cpes_test.go
│ │ └── testdata/
│ │ └── cpe-data.json
│ ├── create_sbom.go
│ ├── create_sbom_config.go
│ ├── create_sbom_config_test.go
│ ├── event/
│ │ ├── event.go
│ │ ├── monitor/
│ │ │ └── generic_task.go
│ │ └── parsers/
│ │ └── parsers.go
│ ├── file/
│ │ ├── cataloger/
│ │ │ ├── executable/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── elf.go
│ │ │ │ ├── elf_test.go
│ │ │ │ ├── macho.go
│ │ │ │ ├── macho_test.go
│ │ │ │ ├── pe.go
│ │ │ │ ├── pe_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── elf/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── differ/
│ │ │ │ │ │ └── __main__.py
│ │ │ │ │ ├── expected_verify
│ │ │ │ │ └── project/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── lib.c
│ │ │ │ │ ├── lib.h
│ │ │ │ │ └── main.c
│ │ │ │ └── shared-info/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── Makefile
│ │ │ │ └── project/
│ │ │ │ ├── Makefile
│ │ │ │ ├── hello/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ └── hello.c
│ │ │ │ └── libhello/
│ │ │ │ ├── Makefile
│ │ │ │ ├── hello.c
│ │ │ │ └── hello.h
│ │ │ ├── filecontent/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── a-path.txt
│ │ │ │ ├── another-path.txt
│ │ │ │ └── last/
│ │ │ │ ├── empty/
│ │ │ │ │ └── empty
│ │ │ │ └── path.txt
│ │ │ ├── filedigest/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── image-file-type-mix/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── file-1.txt
│ │ │ │ └── last/
│ │ │ │ ├── empty/
│ │ │ │ │ └── empty
│ │ │ │ └── path.txt
│ │ │ ├── filemetadata/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ └── image-file-type-mix/
│ │ │ │ ├── Dockerfile
│ │ │ │ └── file-1.txt
│ │ │ └── internal/
│ │ │ ├── all_regular_files.go
│ │ │ ├── all_regular_files_test.go
│ │ │ └── testdata/
│ │ │ ├── image-file-type-mix/
│ │ │ │ ├── Dockerfile
│ │ │ │ └── file-1.txt
│ │ │ └── symlinked-root/
│ │ │ └── real-root/
│ │ │ ├── file1.txt
│ │ │ └── nested/
│ │ │ └── file2.txt
│ │ ├── coordinate_set.go
│ │ ├── coordinate_set_test.go
│ │ ├── coordinates.go
│ │ ├── digest.go
│ │ ├── executable.go
│ │ ├── license.go
│ │ ├── location.go
│ │ ├── location_read_closer.go
│ │ ├── location_set.go
│ │ ├── location_set_test.go
│ │ ├── location_test.go
│ │ ├── locations.go
│ │ ├── locations_test.go
│ │ ├── metadata.go
│ │ ├── mock_resolver.go
│ │ ├── resolver.go
│ │ ├── search_result.go
│ │ ├── selection.go
│ │ └── testdata/
│ │ └── req-resp/
│ │ ├── .gitignore
│ │ ├── path/
│ │ │ └── to/
│ │ │ └── the/
│ │ │ └── file.txt
│ │ └── somewhere/
│ │ └── outside.txt
│ ├── format/
│ │ ├── common/
│ │ │ ├── cyclonedxhelpers/
│ │ │ │ ├── to_format_model.go
│ │ │ │ └── to_format_model_test.go
│ │ │ └── spdxhelpers/
│ │ │ ├── to_format_model.go
│ │ │ ├── to_format_model_test.go
│ │ │ ├── to_syft_model.go
│ │ │ └── to_syft_model_test.go
│ │ ├── cpes/
│ │ │ ├── decoder.go
│ │ │ └── decoder_test.go
│ │ ├── cyclonedxjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 1.2.json
│ │ │ │ ├── 1.3.json
│ │ │ │ ├── 1.4.json
│ │ │ │ ├── 1.5.json
│ │ │ │ ├── 1.6.json
│ │ │ │ ├── micronaut-1.4.json
│ │ │ │ ├── micronaut-1.5.json
│ │ │ │ └── micronaut-1.6.json
│ │ │ └── snapshot/
│ │ │ ├── TestCycloneDxDirectoryEncoder.golden
│ │ │ └── TestCycloneDxImageEncoder.golden
│ │ ├── cyclonedxxml/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 1.0.xml
│ │ │ │ ├── 1.1.xml
│ │ │ │ ├── 1.2.xml
│ │ │ │ ├── 1.3.xml
│ │ │ │ ├── 1.4.xml
│ │ │ │ ├── 1.5.xml
│ │ │ │ └── 1.6.xml
│ │ │ └── snapshot/
│ │ │ ├── TestCycloneDxDirectoryEncoder.golden
│ │ │ └── TestCycloneDxImageEncoder.golden
│ │ ├── decoders.go
│ │ ├── decoders_collection.go
│ │ ├── decoders_collection_test.go
│ │ ├── encoders.go
│ │ ├── encoders_collection.go
│ │ ├── encoders_collection_test.go
│ │ ├── encoders_test.go
│ │ ├── github/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ ├── internal/
│ │ │ │ └── model/
│ │ │ │ ├── github_dependency_api.go
│ │ │ │ ├── model.go
│ │ │ │ └── model_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ ├── TestGithubDirectoryEncoder.golden
│ │ │ └── TestGithubImageEncoder.golden
│ │ ├── internal/
│ │ │ ├── backfill.go
│ │ │ ├── backfill_test.go
│ │ │ ├── cyclonedxutil/
│ │ │ │ ├── decoder.go
│ │ │ │ ├── decoder_test.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── author.go
│ │ │ │ │ ├── author_test.go
│ │ │ │ │ ├── component.go
│ │ │ │ │ ├── component_test.go
│ │ │ │ │ ├── cpe.go
│ │ │ │ │ ├── cpe_test.go
│ │ │ │ │ ├── decoder.go
│ │ │ │ │ ├── decoder_test.go
│ │ │ │ │ ├── description.go
│ │ │ │ │ ├── description_test.go
│ │ │ │ │ ├── external_references.go
│ │ │ │ │ ├── external_references_test.go
│ │ │ │ │ ├── group.go
│ │ │ │ │ ├── group_test.go
│ │ │ │ │ ├── licenses.go
│ │ │ │ │ ├── licenses_test.go
│ │ │ │ │ ├── properties.go
│ │ │ │ │ ├── property_encoder.go
│ │ │ │ │ ├── property_encoder_test.go
│ │ │ │ │ ├── publisher.go
│ │ │ │ │ └── publisher_test.go
│ │ │ │ └── versions.go
│ │ │ ├── location_sorter.go
│ │ │ ├── spdxutil/
│ │ │ │ ├── helpers/
│ │ │ │ │ ├── description.go
│ │ │ │ │ ├── description_test.go
│ │ │ │ │ ├── document_name.go
│ │ │ │ │ ├── document_name_test.go
│ │ │ │ │ ├── document_namespace.go
│ │ │ │ │ ├── document_namespace_test.go
│ │ │ │ │ ├── download_location.go
│ │ │ │ │ ├── download_location_test.go
│ │ │ │ │ ├── external_ref.go
│ │ │ │ │ ├── external_refs.go
│ │ │ │ │ ├── external_refs_test.go
│ │ │ │ │ ├── file_type.go
│ │ │ │ │ ├── h_digest.go
│ │ │ │ │ ├── h_digest_test.go
│ │ │ │ │ ├── homepage.go
│ │ │ │ │ ├── homepage_test.go
│ │ │ │ │ ├── license.go
│ │ │ │ │ ├── license_test.go
│ │ │ │ │ ├── originator_supplier.go
│ │ │ │ │ ├── originator_supplier_test.go
│ │ │ │ │ ├── relationship_type.go
│ │ │ │ │ ├── source_info.go
│ │ │ │ │ ├── source_info_test.go
│ │ │ │ │ ├── spdxid.go
│ │ │ │ │ └── spdxid_test.go
│ │ │ │ └── versions.go
│ │ │ ├── stream/
│ │ │ │ ├── seekable_reader.go
│ │ │ │ └── seekable_reader_test.go
│ │ │ └── testutil/
│ │ │ ├── directory_input.go
│ │ │ ├── file_relationships.go
│ │ │ ├── image_input.go
│ │ │ ├── redactor.go
│ │ │ ├── snapshot.go
│ │ │ └── testdata/
│ │ │ ├── image-simple/
│ │ │ │ ├── Dockerfile
│ │ │ │ ├── file-1.txt
│ │ │ │ └── file-2.txt
│ │ │ └── snapshot/
│ │ │ ├── TestImageEncoder.golden
│ │ │ ├── TestSPDXTagValueImageEncoder.golden
│ │ │ └── stereoscope-fixture-image-simple.golden
│ │ ├── purls/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ └── Test_Encoder.golden
│ │ ├── spdxjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── identify/
│ │ │ │ ├── 2.2.json
│ │ │ │ └── 2.3.json
│ │ │ ├── snapshot/
│ │ │ │ ├── TestSPDX22JSONRequredProperties.golden
│ │ │ │ ├── TestSPDXJSONDirectoryEncoder.golden
│ │ │ │ ├── TestSPDXJSONImageEncoder.golden
│ │ │ │ └── TestSPDXRelationshipOrder.golden
│ │ │ └── spdx/
│ │ │ ├── alpine-3.10.syft.spdx.json
│ │ │ ├── alpine-3.10.vendor.spdx.json
│ │ │ ├── bad/
│ │ │ │ ├── bad-sbom
│ │ │ │ ├── example7-bin.spdx.json
│ │ │ │ ├── example7-go-module.spdx.json
│ │ │ │ ├── example7-golang.spdx.json
│ │ │ │ └── example7-third-party-modules.spdx.json
│ │ │ ├── example7-bin.spdx.json
│ │ │ ├── example7-go-module.spdx.json
│ │ │ ├── example7-golang.spdx.json
│ │ │ └── example7-third-party-modules.spdx.json
│ │ ├── spdxtagvalue/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── bad-sbom
│ │ │ ├── identify/
│ │ │ │ ├── 2.1.sbom
│ │ │ │ ├── 2.2.sbom
│ │ │ │ └── 2.3.sbom
│ │ │ ├── snapshot/
│ │ │ │ ├── TestSPDXJSONSPDXIDs.golden
│ │ │ │ ├── TestSPDXRelationshipOrder.golden
│ │ │ │ ├── TestSPDXTagValueDirectoryEncoder.golden
│ │ │ │ └── TestSPDXTagValueImageEncoder.golden
│ │ │ └── tag-value.spdx
│ │ ├── syftjson/
│ │ │ ├── decoder.go
│ │ │ ├── decoder_test.go
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ ├── model/
│ │ │ │ ├── document.go
│ │ │ │ ├── document_test.go
│ │ │ │ ├── file.go
│ │ │ │ ├── file_test.go
│ │ │ │ ├── linux_release.go
│ │ │ │ ├── linux_release_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── relationship.go
│ │ │ │ ├── secrets.go
│ │ │ │ ├── source.go
│ │ │ │ └── source_test.go
│ │ │ ├── schema_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── identify/
│ │ │ │ │ └── 11.0.0.json
│ │ │ │ ├── image-alpine/
│ │ │ │ │ └── Dockerfile
│ │ │ │ └── snapshot/
│ │ │ │ ├── TestDirectoryEncoder.golden
│ │ │ │ ├── TestEncodeFullJSONDocument.golden
│ │ │ │ └── TestImageEncoder.golden
│ │ │ ├── to_format_model.go
│ │ │ ├── to_format_model_test.go
│ │ │ ├── to_syft_model.go
│ │ │ └── to_syft_model_test.go
│ │ ├── table/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ └── snapshot/
│ │ │ └── TestTableEncoder.golden
│ │ ├── template/
│ │ │ ├── encoder.go
│ │ │ ├── encoder_test.go
│ │ │ └── testdata/
│ │ │ ├── csv-hasField.template
│ │ │ ├── csv.template
│ │ │ ├── legacy/
│ │ │ │ ├── csv-hasField.template
│ │ │ │ └── csv.template
│ │ │ └── snapshot/
│ │ │ ├── TestFormatWithOption.golden
│ │ │ ├── TestFormatWithOptionAndHasField.golden
│ │ │ ├── TestFormatWithOptionAndHasField_Legacy.golden
│ │ │ └── TestFormatWithOption_Legacy.golden
│ │ ├── testdata/
│ │ │ └── alpine-syft.json
│ │ └── text/
│ │ ├── encoder.go
│ │ ├── encoder_test.go
│ │ └── testdata/
│ │ └── snapshot/
│ │ ├── TestTextDirectoryEncoder.golden
│ │ ├── TestTextImageEncoder.golden
│ │ └── stereoscope-fixture-image-simple.golden
│ ├── get_source.go
│ ├── get_source_config.go
│ ├── get_source_config_test.go
│ ├── get_source_test.go
│ ├── internal/
│ │ ├── fileresolver/
│ │ │ ├── chroot_context.go
│ │ │ ├── chroot_context_test.go
│ │ │ ├── container_image_all_layers.go
│ │ │ ├── container_image_all_layers_test.go
│ │ │ ├── container_image_deep_squash.go
│ │ │ ├── container_image_deep_squash_test.go
│ │ │ ├── container_image_model.go
│ │ │ ├── container_image_model_test.go
│ │ │ ├── container_image_squash.go
│ │ │ ├── container_image_squash_test.go
│ │ │ ├── deferred.go
│ │ │ ├── deferred_test.go
│ │ │ ├── directory.go
│ │ │ ├── directory_indexer.go
│ │ │ ├── directory_indexer_test.go
│ │ │ ├── directory_test.go
│ │ │ ├── directory_windows_test.go
│ │ │ ├── empty.go
│ │ │ ├── excluding_file.go
│ │ │ ├── excluding_file_test.go
│ │ │ ├── file.go
│ │ │ ├── file_indexer.go
│ │ │ ├── file_indexer_test.go
│ │ │ ├── file_metadata_by_location.go
│ │ │ ├── filetree_resolver.go
│ │ │ ├── filetree_resolver_test.go
│ │ │ ├── get_xid.go
│ │ │ ├── get_xid_win.go
│ │ │ ├── metadata.go
│ │ │ ├── metadata_test.go
│ │ │ ├── path_skipper.go
│ │ │ ├── path_skipper_test.go
│ │ │ ├── testdata/
│ │ │ │ ├── generate-tar-fixture-from-source-dir.sh
│ │ │ │ ├── image-duplicate-path/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ └── file-2.txt
│ │ │ │ ├── image-files-deleted/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ └── target/
│ │ │ │ │ └── file-2.txt
│ │ │ │ ├── image-simple/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ └── target/
│ │ │ │ │ └── really/
│ │ │ │ │ └── nested/
│ │ │ │ │ └── file-3.txt
│ │ │ │ ├── image-symlinks/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ ├── nested/
│ │ │ │ │ │ └── nested/
│ │ │ │ │ │ └── file-3.txt
│ │ │ │ │ ├── new-file-2.txt
│ │ │ │ │ ├── new-file-4.txt
│ │ │ │ │ └── parent/
│ │ │ │ │ └── file-4.txt
│ │ │ │ ├── path-detected/
│ │ │ │ │ ├── .vimrc
│ │ │ │ │ └── empty
│ │ │ │ ├── path-detected-2/
│ │ │ │ │ ├── .vimrc
│ │ │ │ │ └── empty
│ │ │ │ ├── req-resp/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── path/
│ │ │ │ │ │ └── to/
│ │ │ │ │ │ └── the/
│ │ │ │ │ │ └── file.txt
│ │ │ │ │ └── somewhere/
│ │ │ │ │ └── outside.txt
│ │ │ │ ├── symlinked-root/
│ │ │ │ │ └── real-root/
│ │ │ │ │ ├── file1.txt
│ │ │ │ │ └── nested/
│ │ │ │ │ └── file2.txt
│ │ │ │ ├── symlinks-base/
│ │ │ │ │ ├── base
│ │ │ │ │ └── sub/
│ │ │ │ │ └── item
│ │ │ │ ├── symlinks-from-image-symlinks-fixture/
│ │ │ │ │ ├── file-1.txt
│ │ │ │ │ ├── file-2.txt
│ │ │ │ │ ├── file-3.txt
│ │ │ │ │ └── parent/
│ │ │ │ │ └── file-4.txt
│ │ │ │ ├── symlinks-loop/
│ │ │ │ │ ├── README.md
│ │ │ │ │ └── devices/
│ │ │ │ │ └── loop0/
│ │ │ │ │ └── file.target
│ │ │ │ ├── symlinks-multiple-roots/
│ │ │ │ │ └── root/
│ │ │ │ │ └── readme
│ │ │ │ ├── symlinks-prune-indexing/
│ │ │ │ │ └── path/
│ │ │ │ │ ├── 1/
│ │ │ │ │ │ └── 2/
│ │ │ │ │ │ └── 3/
│ │ │ │ │ │ └── 4/
│ │ │ │ │ │ └── dont-index-me-twice.txt
│ │ │ │ │ ├── 5/
│ │ │ │ │ │ └── 6/
│ │ │ │ │ │ └── 7/
│ │ │ │ │ │ └── 8/
│ │ │ │ │ │ └── dont-index-me-twice-either.txt
│ │ │ │ │ └── file.txt
│ │ │ │ ├── symlinks-simple/
│ │ │ │ │ └── readme
│ │ │ │ └── system_paths/
│ │ │ │ ├── outside_root/
│ │ │ │ │ └── link_target/
│ │ │ │ │ └── place
│ │ │ │ └── target/
│ │ │ │ ├── dev/
│ │ │ │ │ └── place
│ │ │ │ ├── hierarchical-dev/
│ │ │ │ │ └── module_1/
│ │ │ │ │ └── module_1_1/
│ │ │ │ │ └── place
│ │ │ │ ├── home/
│ │ │ │ │ └── place
│ │ │ │ ├── proc/
│ │ │ │ │ └── place
│ │ │ │ └── sys/
│ │ │ │ └── place
│ │ │ ├── unindexed_directory.go
│ │ │ └── unindexed_directory_test.go
│ │ ├── parsing/
│ │ │ └── basic_parsing.go
│ │ ├── testutil/
│ │ │ └── chdir.go
│ │ ├── unionreader/
│ │ │ ├── union_reader.go
│ │ │ └── union_reader_test.go
│ │ └── windows/
│ │ ├── path.go
│ │ └── path_test.go
│ ├── lib.go
│ ├── lib_test.go
│ ├── license/
│ │ ├── license.go
│ │ └── license_test.go
│ ├── linux/
│ │ ├── identify_release.go
│ │ ├── identify_release_test.go
│ │ ├── release.go
│ │ ├── supplement_release.go
│ │ └── testdata/
│ │ ├── bad-redhat-release
│ │ ├── bad-system-release-cpe
│ │ ├── centos-8
│ │ ├── debian-8
│ │ ├── os/
│ │ │ ├── almalinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── alpine/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── amazon/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── arch/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── busybox/
│ │ │ │ ├── .gitignore
│ │ │ │ └── bin/
│ │ │ │ ├── .gitignore
│ │ │ │ └── busybox
│ │ │ ├── centos/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── centos5/
│ │ │ │ └── etc/
│ │ │ │ └── redhat-release
│ │ │ ├── centos6/
│ │ │ │ └── etc/
│ │ │ │ └── system-release-cpe
│ │ │ ├── custom/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── debian/
│ │ │ │ ├── from-debian_version/
│ │ │ │ │ └── etc/
│ │ │ │ │ ├── debian_version
│ │ │ │ │ └── os-release
│ │ │ │ └── from-os-release/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── empty/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── fedora/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── mariner/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── opensuse-leap/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── oraclelinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── photon/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── redhat/
│ │ │ │ ├── from-os-release/
│ │ │ │ │ └── usr/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── os-release
│ │ │ │ └── from-redhat-release/
│ │ │ │ └── etc/
│ │ │ │ └── redhat-release
│ │ │ ├── rockylinux/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── sles/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ ├── ubuntu/
│ │ │ │ └── etc/
│ │ │ │ └── os-release
│ │ │ └── wolfi/
│ │ │ └── etc/
│ │ │ └── os-release
│ │ ├── partial-fields/
│ │ │ ├── missing-id/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ ├── missing-version/
│ │ │ │ └── usr/
│ │ │ │ └── lib/
│ │ │ │ └── os-release
│ │ │ └── unknown-id/
│ │ │ └── usr/
│ │ │ └── lib/
│ │ │ └── os-release
│ │ ├── rhel-8
│ │ ├── ubuntu-20.04
│ │ └── unprintable
│ ├── pkg/
│ │ ├── alpm.go
│ │ ├── apk.go
│ │ ├── apk_test.go
│ │ ├── binary.go
│ │ ├── bitnami.go
│ │ ├── cataloger/
│ │ │ ├── .gitignore
│ │ │ ├── ai/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_gguf.go
│ │ │ │ ├── parse_gguf_model.go
│ │ │ │ ├── processor.go
│ │ │ │ ├── processor_test.go
│ │ │ │ ├── test_helpers_test.go
│ │ │ │ └── testdata/
│ │ │ │ └── glob-paths/
│ │ │ │ └── models/
│ │ │ │ └── model.gguf
│ │ │ ├── alpine/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_apk_db.go
│ │ │ │ ├── parse_apk_db_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── base
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── empty-deps-and-provides
│ │ │ │ ├── extra-file-attributes
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── multiple-1/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── multiple-2/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── apk/
│ │ │ │ │ └── db/
│ │ │ │ │ └── installed
│ │ │ │ ├── single
│ │ │ │ └── very-large-entries
│ │ │ ├── arch/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_alpm_db.go
│ │ │ │ ├── parse_alpm_db_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── files
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── pacman/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── base-1.0/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ └── files
│ │ │ │ │ └── dive-0.10.0/
│ │ │ │ │ └── desc
│ │ │ │ ├── installed/
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── pacman/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── corrupt-0.2.1-3/
│ │ │ │ │ │ └── desc
│ │ │ │ │ ├── emacs-29.3-3/
│ │ │ │ │ │ └── desc
│ │ │ │ │ ├── fuzzy-1.2-3/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ └── files
│ │ │ │ │ ├── gmp-6.2.1-2/
│ │ │ │ │ │ ├── desc
│ │ │ │ │ │ ├── files
│ │ │ │ │ │ └── mtree
│ │ │ │ │ ├── madeup-20.30-4/
│ │ │ │ │ │ └── desc
│ │ │ │ │ └── tree-sitter-0.22.6-1/
│ │ │ │ │ └── desc
│ │ │ │ └── mtree
│ │ │ ├── binary/
│ │ │ │ ├── README.md
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── classifier_cataloger.go
│ │ │ │ ├── classifier_cataloger_test.go
│ │ │ │ ├── classifiers.go
│ │ │ │ ├── classifiers_java.go
│ │ │ │ ├── classifiers_java_test.go
│ │ │ │ ├── deprecated.go
│ │ │ │ ├── elf_package.go
│ │ │ │ ├── elf_package_cataloger.go
│ │ │ │ ├── elf_package_cataloger_test.go
│ │ │ │ ├── elf_package_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── manager/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ ├── cli/
│ │ │ │ │ │ │ ├── cli.go
│ │ │ │ │ │ │ └── commands/
│ │ │ │ │ │ │ ├── add_snippet.go
│ │ │ │ │ │ │ ├── download.go
│ │ │ │ │ │ │ ├── list.go
│ │ │ │ │ │ │ ├── root.go
│ │ │ │ │ │ │ └── write_snippet.go
│ │ │ │ │ │ ├── config/
│ │ │ │ │ │ │ ├── application.go
│ │ │ │ │ │ │ ├── application_test.go
│ │ │ │ │ │ │ ├── binary_from_image.go
│ │ │ │ │ │ │ ├── binary_from_image_test.go
│ │ │ │ │ │ │ └── testdata/
│ │ │ │ │ │ │ └── app-configs/
│ │ │ │ │ │ │ ├── bad-image-collision.yaml
│ │ │ │ │ │ │ ├── bad-implicit-name-collision.yaml
│ │ │ │ │ │ │ ├── bad-missing-image-platform.yaml
│ │ │ │ │ │ │ ├── bad-missing-image-ref.yaml
│ │ │ │ │ │ │ ├── bad-missing-image.yaml
│ │ │ │ │ │ │ ├── bad-missing-paths.yaml
│ │ │ │ │ │ │ ├── bad-missing-version.yaml
│ │ │ │ │ │ │ ├── bad-no-name.yaml
│ │ │ │ │ │ │ ├── valid-1.yaml
│ │ │ │ │ │ │ └── valid-2.yaml
│ │ │ │ │ │ ├── download_from_image.go
│ │ │ │ │ │ ├── download_from_image_test.go
│ │ │ │ │ │ ├── list_entries.go
│ │ │ │ │ │ ├── list_entries_test.go
│ │ │ │ │ │ ├── snippet_metadata.go
│ │ │ │ │ │ ├── snippet_metadata_test.go
│ │ │ │ │ │ ├── testdata/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── bin/
│ │ │ │ │ │ │ │ └── busybox/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ └── snippets/
│ │ │ │ │ │ │ ├── busybox/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ │ └── busybox
│ │ │ │ │ │ │ └── postgres/
│ │ │ │ │ │ │ └── 9.6.10/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── ui/
│ │ │ │ │ │ │ ├── action.go
│ │ │ │ │ │ │ ├── ansi.go
│ │ │ │ │ │ │ ├── binary_list.go
│ │ │ │ │ │ │ ├── error.go
│ │ │ │ │ │ │ └── title.go
│ │ │ │ │ │ ├── utils.go
│ │ │ │ │ │ └── utils_test.go
│ │ │ │ │ ├── main.go
│ │ │ │ │ └── testutil/
│ │ │ │ │ ├── snippet_or_binary.go
│ │ │ │ │ └── snippet_or_binary_test.go
│ │ │ │ ├── pe_package.go
│ │ │ │ ├── pe_package_cataloger.go
│ │ │ │ ├── pe_package_cataloger_test.go
│ │ │ │ ├── pe_package_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── capture-snippet.sh
│ │ │ │ ├── classifiers/
│ │ │ │ │ ├── negative/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── busybox
│ │ │ │ │ │ ├── go
│ │ │ │ │ │ ├── python2.6
│ │ │ │ │ │ └── traefik/
│ │ │ │ │ │ └── traefik
│ │ │ │ │ └── snippets/
│ │ │ │ │ ├── arangodb/
│ │ │ │ │ │ ├── 3.11.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── arangosh
│ │ │ │ │ │ └── 3.12.0-2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── arangosh
│ │ │ │ │ ├── bash/
│ │ │ │ │ │ └── 5.1.16/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── bash
│ │ │ │ │ ├── busybox/
│ │ │ │ │ │ └── 1.36.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── [
│ │ │ │ │ ├── chrome/
│ │ │ │ │ │ ├── 126.0.6478.182/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── chrome
│ │ │ │ │ │ └── 127.0.6533.119/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── chrome
│ │ │ │ │ ├── consul/
│ │ │ │ │ │ └── 1.15.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── consul
│ │ │ │ │ ├── dart/
│ │ │ │ │ │ ├── 2.12.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ ├── 3.0.0/
│ │ │ │ │ │ │ └── linux-arm/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ ├── 3.5.2/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── dart
│ │ │ │ │ │ └── 3.6.0-216.1.beta/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── dart
│ │ │ │ │ ├── elixir/
│ │ │ │ │ │ └── 1.19.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── elixir
│ │ │ │ │ │ └── lib/
│ │ │ │ │ │ └── elixir/
│ │ │ │ │ │ └── ebin/
│ │ │ │ │ │ └── elixir.app
│ │ │ │ │ ├── envoy/
│ │ │ │ │ │ ├── 1.11.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.14.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.18.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.20.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.22.11/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.28.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.34.5/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ ├── 1.36.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── envoy
│ │ │ │ │ │ └── 1.6.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── envoy
│ │ │ │ │ ├── erlang/
│ │ │ │ │ │ ├── 25.3.2.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── erlexec
│ │ │ │ │ │ ├── 26.1.2/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── beam.smp
│ │ │ │ │ │ ├── 26.2.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── erlexec
│ │ │ │ │ │ ├── 26.2.4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── liberts_internal.a
│ │ │ │ │ │ └── 27.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── beam.smp
│ │ │ │ │ ├── ffmpeg/
│ │ │ │ │ │ ├── 6.1.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── ffmpeg
│ │ │ │ │ │ └── 7.1.1/
│ │ │ │ │ │ └── darwin-arm64/
│ │ │ │ │ │ └── ffmpeg
│ │ │ │ │ ├── ffmpeg-shared-libs/
│ │ │ │ │ │ └── 5.1.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libavcodec-9aae324f.so.59.37.100
│ │ │ │ │ ├── fluent-bit/
│ │ │ │ │ │ ├── 1.3.10/
│ │ │ │ │ │ │ └── linux-arm/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ ├── 1.7.0-dev-3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ ├── 2.2.1/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ │ └── 3.0.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── fluent-bit
│ │ │ │ │ ├── gcc/
│ │ │ │ │ │ └── 12.3.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── gcc
│ │ │ │ │ ├── go/
│ │ │ │ │ │ └── 1.21.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── go
│ │ │ │ │ ├── go-version-hint/
│ │ │ │ │ │ ├── 1.15/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION
│ │ │ │ │ │ ├── 1.15w/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION
│ │ │ │ │ │ ├── 1.21/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ ├── VERSION
│ │ │ │ │ │ │ └── go
│ │ │ │ │ │ ├── 1.25/
│ │ │ │ │ │ │ └── any/
│ │ │ │ │ │ │ └── VERSION.cache
│ │ │ │ │ │ └── 1.25w/
│ │ │ │ │ │ └── any/
│ │ │ │ │ │ └── VERSION
│ │ │ │ │ ├── grafana/
│ │ │ │ │ │ ├── 10.3.12/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 10.4.19/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 11.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 11.0.0-preview/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.2.0-258092/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.3.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.3.2-security-01/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 12.4.0-22081664032/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 6.0.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 6.7.0-test/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 6.7.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 7.5.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.2.13/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 9.2.20/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ ├── 9.3.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana-server
│ │ │ │ │ │ ├── 9.4.0-beta1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── grafana
│ │ │ │ │ │ └── 9.5.21/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── grafana
│ │ │ │ │ ├── gzip/
│ │ │ │ │ │ └── 1.12/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── gzip
│ │ │ │ │ ├── haproxy/
│ │ │ │ │ │ ├── 1.5.14/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 1.8.22/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 2.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ ├── 2.7.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── haproxy
│ │ │ │ │ │ └── 3.1-dev0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── haproxy
│ │ │ │ │ ├── haskell-cabal/
│ │ │ │ │ │ └── 3.10.3.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── cabal
│ │ │ │ │ ├── haskell-ghc/
│ │ │ │ │ │ └── 9.6.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── ghc-9.6.5
│ │ │ │ │ ├── helm/
│ │ │ │ │ │ ├── 3.10.3/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── helm
│ │ │ │ │ │ └── 3.11.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── helm
│ │ │ │ │ ├── httpd/
│ │ │ │ │ │ └── 2.4.54/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── httpd
│ │ │ │ │ ├── istio_pilot-agent/
│ │ │ │ │ │ ├── 1.1.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ │ ├── 1.26.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ │ └── 1.8.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── pilot-agent
│ │ │ │ │ ├── istio_pilot-discovery/
│ │ │ │ │ │ ├── 1.1.17/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ ├── 1.26.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ ├── 1.3.8/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ │ └── 1.8.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── pilot-discovery
│ │ │ │ │ ├── java-graal-openjdk/
│ │ │ │ │ │ └── 17.0.3+7-jvmci-22.1-b06/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jdk-openjdk/
│ │ │ │ │ │ └── 21.0.2+13-LTS/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── jdb
│ │ │ │ │ ├── java-jdk-oracle/
│ │ │ │ │ │ └── 1.8.0_451-b10/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── java
│ │ │ │ │ │ └── jdb
│ │ │ │ │ ├── java-jre-openjdk/
│ │ │ │ │ │ ├── 1.8.0_352-b08/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── 11.0.17/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-openjdk-arm64-eclipse/
│ │ │ │ │ │ └── 11.0.22/
│ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-openjdk-eclipse/
│ │ │ │ │ │ └── 11.0.22/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-oracle/
│ │ │ │ │ │ ├── 1.8.0_451-b10/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── 19.0.1/
│ │ │ │ │ │ ├── darwin/
│ │ │ │ │ │ │ └── java
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── java-jre-oracle-sdk/
│ │ │ │ │ │ └── 1.8.0_451-b10/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── java
│ │ │ │ │ ├── jq/
│ │ │ │ │ │ └── 1.7.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── jq
│ │ │ │ │ ├── lighttpd/
│ │ │ │ │ │ └── 1.4.76/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── lighttpd
│ │ │ │ │ ├── mariadb/
│ │ │ │ │ │ └── 10.6.15/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mariadb
│ │ │ │ │ ├── memcached/
│ │ │ │ │ │ └── 1.6.18/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── memcached
│ │ │ │ │ ├── mongodb/
│ │ │ │ │ │ ├── 4.4.30/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 5.0.32/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 6.0.27/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ ├── 7.0.28/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mongod
│ │ │ │ │ │ └── 8.0.17/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mongod
│ │ │ │ │ ├── mysql/
│ │ │ │ │ │ ├── 5.6.51/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mysql
│ │ │ │ │ │ ├── 8.0.34/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── mysql
│ │ │ │ │ │ └── 8.0.37/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── nginx/
│ │ │ │ │ │ └── 1.25.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── nginx
│ │ │ │ │ ├── nginx-openresty/
│ │ │ │ │ │ └── 1.21.4.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── nginx
│ │ │ │ │ ├── node/
│ │ │ │ │ │ ├── 0.10.48/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ ├── 0.12.18/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ ├── 19.2.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── node
│ │ │ │ │ │ └── 4.9.1/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── node
│ │ │ │ │ ├── openssl/
│ │ │ │ │ │ ├── 1.1.1w/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── openssl
│ │ │ │ │ │ ├── 1.1.1zb/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── openssl
│ │ │ │ │ │ └── 3.1.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── openssl
│ │ │ │ │ ├── percona-server/
│ │ │ │ │ │ └── 8.0.35/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── percona-xtrabackup/
│ │ │ │ │ │ └── 8.0.35/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── xtrabackup
│ │ │ │ │ ├── percona-xtradb-cluster/
│ │ │ │ │ │ └── 8.0.34/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── mysql
│ │ │ │ │ ├── perl/
│ │ │ │ │ │ ├── 5.12.5/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── perl
│ │ │ │ │ │ ├── 5.20.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── perl
│ │ │ │ │ │ └── 5.37.8/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── perl
│ │ │ │ │ ├── postgres/
│ │ │ │ │ │ ├── 15.1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── 15beta4/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ ├── 9.5alpha1/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── postgres
│ │ │ │ │ │ └── 9.6.24/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── postgres
│ │ │ │ │ ├── proftpd/
│ │ │ │ │ │ └── 1.3.8b/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── proftpd
│ │ │ │ │ ├── python/
│ │ │ │ │ │ └── 3.6.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── python3.6
│ │ │ │ │ ├── python-duplicates/
│ │ │ │ │ │ └── 3.8.16/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ ├── dir/
│ │ │ │ │ │ │ └── python3.8
│ │ │ │ │ │ ├── patchlevel.h
│ │ │ │ │ │ └── python3.8
│ │ │ │ │ ├── python-shared-lib/
│ │ │ │ │ │ └── 3.7.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libpython3.7m.so.1.0
│ │ │ │ │ ├── python-with-incorrect-match/
│ │ │ │ │ │ └── 3.5.3/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── python3.5
│ │ │ │ │ ├── qt/
│ │ │ │ │ │ ├── 4.8.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── libQtCore.so.4.8.6
│ │ │ │ │ │ ├── 5.15.2/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── libQt5Core.so.5.15.2
│ │ │ │ │ │ └── 6.5.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── libQt6Core.so.6.5.0
│ │ │ │ │ ├── redis-server/
│ │ │ │ │ │ ├── 2.8.23/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 4.0.11/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 5.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 6.0.16/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.0.0/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.0.14/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ ├── 7.2.3/
│ │ │ │ │ │ │ ├── linux-amd64/
│ │ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── redis-server
│ │ │ │ │ │ └── 7.2.5/
│ │ │ │ │ │ └── linux-unknown-454d5f333836/
│ │ │ │ │ │ └── redis-server
│ │ │ │ │ ├── ruby/
│ │ │ │ │ │ └── 1.9.3p551/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── ruby
│ │ │ │ │ ├── sqlcipher/
│ │ │ │ │ │ └── 4.5.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── sqlcipher
│ │ │ │ │ ├── swipl/
│ │ │ │ │ │ └── 9.3.8/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── swipl
│ │ │ │ │ ├── traefik/
│ │ │ │ │ │ ├── 1.7.34/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 2.10.7/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 2.9.6/
│ │ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ ├── 3.0.4/
│ │ │ │ │ │ │ └── linux-riscv64/
│ │ │ │ │ │ │ └── traefik
│ │ │ │ │ │ └── 3.6.5/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── traefik
│ │ │ │ │ ├── util-linux/
│ │ │ │ │ │ └── 2.37.4/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── getopt
│ │ │ │ │ ├── valkey-server/
│ │ │ │ │ │ └── 9.0.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── valkey-server
│ │ │ │ │ ├── vault/
│ │ │ │ │ │ ├── 1.19.4/
│ │ │ │ │ │ │ └── linux-arm64/
│ │ │ │ │ │ │ └── vault
│ │ │ │ │ │ └── 1.20.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── vault
│ │ │ │ │ ├── wp/
│ │ │ │ │ │ └── 2.9.0/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── wp
│ │ │ │ │ ├── xz/
│ │ │ │ │ │ └── 5.6.2/
│ │ │ │ │ │ └── linux-amd64/
│ │ │ │ │ │ └── xz
│ │ │ │ │ └── zstd/
│ │ │ │ │ └── 1.5.6/
│ │ │ │ │ └── linux-amd64/
│ │ │ │ │ └── zstd
│ │ │ │ ├── config.yaml
│ │ │ │ ├── custom/
│ │ │ │ │ ├── extra/
│ │ │ │ │ │ └── foo
│ │ │ │ │ └── go-1.14/
│ │ │ │ │ └── go
│ │ │ │ ├── elf-testdata/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── elfbinwithcorrupt/
│ │ │ │ │ │ ├── elfsrc/
│ │ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ │ └── makefile
│ │ │ │ │ ├── elfbinwithnestedlib/
│ │ │ │ │ │ ├── elfsrc/
│ │ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ │ └── makefile
│ │ │ │ │ └── elfbinwithsisterlib/
│ │ │ │ │ ├── elfsrc1/
│ │ │ │ │ │ ├── hello_world.cpp
│ │ │ │ │ │ ├── hello_world.h
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── testbin.cpp
│ │ │ │ │ ├── elfsrc2/
│ │ │ │ │ │ ├── hello_world2.cpp
│ │ │ │ │ │ ├── hello_world2.h
│ │ │ │ │ │ ├── makefile
│ │ │ │ │ │ └── testbin2.cpp
│ │ │ │ │ └── makefile
│ │ │ │ ├── image-busybox/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-dotnet-app/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-fedora-32bit/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-fedora-64bit/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-binary/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-jre-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-ibm-sdk-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-zulu-21/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-java-zulu-8/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-jruby/
│ │ │ │ │ └── Dockerfile
│ │ │ │ └── image-wolfi-64bit-without-version/
│ │ │ │ └── Dockerfile
│ │ │ ├── bitnami/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_components.go
│ │ │ │ └── testdata/
│ │ │ │ ├── components-json-mongodb/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── .bitnami_components.json
│ │ │ │ ├── components-json-postgresql/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── .bitnami_components.json
│ │ │ │ ├── invalid/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── redis/
│ │ │ │ │ └── .spdx-redis.spdx
│ │ │ │ ├── json/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── postgresql/
│ │ │ │ │ ├── .spdx-postgresql.spdx
│ │ │ │ │ └── readme.txt
│ │ │ │ ├── mix/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── render-template/
│ │ │ │ │ └── .spdx-render-template.spdx
│ │ │ │ ├── no-rel/
│ │ │ │ │ └── opt/
│ │ │ │ │ └── bitnami/
│ │ │ │ │ └── redis/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── .spdx-redis.spdx
│ │ │ │ │ └── bin/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ └── redis-server
│ │ │ │ └── tag-value/
│ │ │ │ └── opt/
│ │ │ │ └── bitnami/
│ │ │ │ └── redis/
│ │ │ │ └── .spdx-apache.spdx
│ │ │ ├── capabilities.go
│ │ │ ├── common/
│ │ │ │ └── cpe/
│ │ │ │ ├── create.go
│ │ │ │ └── target_software_to_pkg_type.go
│ │ │ ├── conda/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── conda-meta-bad-json/
│ │ │ │ │ └── conda-meta/
│ │ │ │ │ └── package-1.2.3-pyhd8ed1ab_0.json
│ │ │ │ └── conda-meta-python-c-etc/
│ │ │ │ └── conda-meta/
│ │ │ │ ├── jupyterlab-4.4.3-pyhd8ed1ab_0.json
│ │ │ │ └── zlib-1.2.11-h90dfc92_1014.json
│ │ │ ├── cpp/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_conanfile.go
│ │ │ │ ├── parse_conanfile_test.go
│ │ │ │ ├── parse_conaninfo.go
│ │ │ │ ├── parse_conaninfo_test.go
│ │ │ │ ├── parse_conanlock.go
│ │ │ │ ├── parse_conanlock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── README.md
│ │ │ │ ├── conanfile.txt
│ │ │ │ ├── conaninfo/
│ │ │ │ │ └── mfast/
│ │ │ │ │ └── 1.2.2/
│ │ │ │ │ └── my_user/
│ │ │ │ │ └── my_channel/
│ │ │ │ │ └── package/
│ │ │ │ │ └── 9d1f076b471417647c2022a78d5e2c1f834289ac/
│ │ │ │ │ └── conaninfo.txt
│ │ │ │ └── glob-paths/
│ │ │ │ └── somewhere/
│ │ │ │ └── src/
│ │ │ │ ├── conanfile.txt
│ │ │ │ └── conaninfo.txt
│ │ │ ├── dart/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_pubspec.go
│ │ │ │ ├── parse_pubspec_lock.go
│ │ │ │ ├── parse_pubspec_lock_test.go
│ │ │ │ ├── parse_pubspec_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── spec/
│ │ │ │ │ ├── pubspec.yaml
│ │ │ │ │ └── pubspec.yml
│ │ │ │ └── pubspecs/
│ │ │ │ ├── appainter.pubspec.yaml
│ │ │ │ └── macros.pubspec.yaml
│ │ │ ├── debian/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_copyright.go
│ │ │ │ ├── parse_copyright_test.go
│ │ │ │ ├── parse_deb_archive.go
│ │ │ │ ├── parse_deb_archive_test.go
│ │ │ │ ├── parse_dpkg_db.go
│ │ │ │ ├── parse_dpkg_db_test.go
│ │ │ │ ├── parse_dpkg_info_files.go
│ │ │ │ ├── parse_dpkg_info_files_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── copyright/
│ │ │ │ │ ├── cuda
│ │ │ │ │ ├── dev-kit
│ │ │ │ │ ├── libaudit-common
│ │ │ │ │ ├── libc6
│ │ │ │ │ ├── liblzma5
│ │ │ │ │ ├── microsoft
│ │ │ │ │ ├── python
│ │ │ │ │ └── trilicense
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ ├── dpkg/
│ │ │ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ │ │ ├── libpam-runtime.conffiles
│ │ │ │ │ │ │ │ │ ├── libpam-runtime.md5sums
│ │ │ │ │ │ │ │ │ └── libpam-runtime.preinst
│ │ │ │ │ │ │ │ ├── status
│ │ │ │ │ │ │ │ └── status.d/
│ │ │ │ │ │ │ │ └── pkg-1.0
│ │ │ │ │ │ │ └── opkg/
│ │ │ │ │ │ │ ├── info/
│ │ │ │ │ │ │ │ └── pkg-1.0.control
│ │ │ │ │ │ │ └── status
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libpam-runtime/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ ├── status
│ │ │ │ │ └── status.d/
│ │ │ │ │ └── pkg-1.0
│ │ │ │ ├── image-distroless-deb/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libsqlite3-0/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ └── status.d/
│ │ │ │ │ ├── libsqlite3-0
│ │ │ │ │ ├── libsqlite3-0.md5sums
│ │ │ │ │ └── libsqlite3-0.preinst
│ │ │ │ ├── image-dpkg/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── os-release
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── doc/
│ │ │ │ │ │ └── libpam-runtime/
│ │ │ │ │ │ └── copyright
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ └── dpkg/
│ │ │ │ │ ├── info/
│ │ │ │ │ │ ├── libpam-runtime.conffiles
│ │ │ │ │ │ ├── libpam-runtime.md5sums
│ │ │ │ │ │ └── libpam-runtime.preinst
│ │ │ │ │ └── status
│ │ │ │ ├── image-single-dpkg/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── info/
│ │ │ │ │ ├── util-linux.conffiles
│ │ │ │ │ └── zlib1g.md5sums
│ │ │ │ └── var/
│ │ │ │ └── lib/
│ │ │ │ └── dpkg/
│ │ │ │ └── status.d/
│ │ │ │ ├── coreutils-relationships
│ │ │ │ ├── corrupt
│ │ │ │ ├── deinstall
│ │ │ │ ├── doc-examples
│ │ │ │ ├── empty
│ │ │ │ ├── installed-size-4KB
│ │ │ │ ├── libpam-runtime
│ │ │ │ ├── multiple
│ │ │ │ └── single
│ │ │ ├── dotnet/
│ │ │ │ ├── binary_cataloger.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── deps_binary_cataloger.go
│ │ │ │ ├── deps_cataloger.go
│ │ │ │ ├── deps_json.go
│ │ │ │ ├── deps_json_test.go
│ │ │ │ ├── libman_json.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_packages_lock.go
│ │ │ │ ├── parse_packages_lock_test.go
│ │ │ │ ├── pe.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── dir-example-1/
│ │ │ │ │ └── TestLibrary.deps.json
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── packages.lock.json
│ │ │ │ │ └── something.deps.json
│ │ │ │ ├── image-net2-app/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── helloworld.csproj
│ │ │ │ ├── image-net6-asp-libman/
│ │ │ │ │ ├── .dockerignore
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── LibManSample.csproj
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── Startup.cs
│ │ │ │ │ ├── libman.json
│ │ │ │ │ └── vendor/
│ │ │ │ │ └── lodash.js
│ │ │ │ ├── image-net8-app/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-no-depjson/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-self-contained/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-single-file/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-with-runtime/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-app-with-runtime-nodepsjson/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ ├── dotnetapp.csproj
│ │ │ │ │ └── packages.lock.json
│ │ │ │ ├── image-net8-compile-target/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── helloworld.csproj
│ │ │ │ ├── image-net8-ilrepack/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── dotnetapp.csproj
│ │ │ │ ├── image-net8-privateassets/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── src/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ ├── Program.cs
│ │ │ │ │ └── dotnetapp.csproj
│ │ │ │ └── packages.lock.json
│ │ │ ├── elixir/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_mix_lock.go
│ │ │ │ └── parse_mix_lock_test.go
│ │ │ ├── erlang/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── erlang_parser.go
│ │ │ │ ├── erlang_parser_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_otp_app.go
│ │ │ │ ├── parse_otp_app_test.go
│ │ │ │ ├── parse_rebar_lock.go
│ │ │ │ ├── parse_rebar_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── rabbitmq.app
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ └── rabbitmq.app
│ │ │ │ └── rabbitmq.app
│ │ │ ├── generic/
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── parser.go
│ │ │ │ └── testdata/
│ │ │ │ ├── a-path.txt
│ │ │ │ ├── another-path.txt
│ │ │ │ ├── empty.txt
│ │ │ │ └── last/
│ │ │ │ └── path.txt
│ │ │ ├── gentoo/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── license.go
│ │ │ │ ├── license_test.go
│ │ │ │ ├── parse_portage_contents.go
│ │ │ │ ├── purl.go
│ │ │ │ ├── purl_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── x/
│ │ │ │ │ └── y/
│ │ │ │ │ └── CONTENTS
│ │ │ │ ├── layout/
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── app-containers/
│ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ ├── CONTENTS
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── SIZE
│ │ │ │ ├── layout-license-groups/
│ │ │ │ │ ├── etc/
│ │ │ │ │ │ └── portage/
│ │ │ │ │ │ └── license_groups
│ │ │ │ │ └── var/
│ │ │ │ │ └── db/
│ │ │ │ │ └── pkg/
│ │ │ │ │ └── app-containers/
│ │ │ │ │ └── skopeo-1.5.1/
│ │ │ │ │ ├── CONTENTS
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── SIZE
│ │ │ │ └── license-groups/
│ │ │ │ ├── cycle
│ │ │ │ ├── example1
│ │ │ │ ├── missing
│ │ │ │ └── self
│ │ │ ├── githubactions/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_composite_action.go
│ │ │ │ ├── parse_composite_action_test.go
│ │ │ │ ├── parse_workflow.go
│ │ │ │ ├── parse_workflow_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── call-shared-workflow.yaml
│ │ │ │ ├── composite-action.yaml
│ │ │ │ ├── corrupt/
│ │ │ │ │ ├── composite-action.yaml
│ │ │ │ │ └── workflow-multi-job.yaml
│ │ │ │ ├── glob/
│ │ │ │ │ └── .github/
│ │ │ │ │ ├── actions/
│ │ │ │ │ │ ├── bootstrap/
│ │ │ │ │ │ │ └── action.yaml
│ │ │ │ │ │ └── unbootstrap/
│ │ │ │ │ │ └── action.yml
│ │ │ │ │ └── workflows/
│ │ │ │ │ ├── release.yml
│ │ │ │ │ └── validations.yaml
│ │ │ │ ├── workflow-multi-job.yaml
│ │ │ │ └── workflow-with-version-comments.yaml
│ │ │ ├── golang/
│ │ │ │ ├── billy_adapter.go
│ │ │ │ ├── billy_adapter_test.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── config_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── gotestdata/
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ └── go-source/
│ │ │ │ │ │ ├── cmd/
│ │ │ │ │ │ │ ├── bin1/
│ │ │ │ │ │ │ │ └── main.go
│ │ │ │ │ │ │ └── bin2/
│ │ │ │ │ │ │ └── main.go
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ ├── pk1/
│ │ │ │ │ │ │ ├── pk1.go
│ │ │ │ │ │ │ └── pk1_test.go
│ │ │ │ │ │ ├── pk2/
│ │ │ │ │ │ │ └── pk2.go
│ │ │ │ │ │ └── pk3/
│ │ │ │ │ │ └── pk3.go
│ │ │ │ │ └── xcoff/
│ │ │ │ │ ├── file.go
│ │ │ │ │ ├── file_test.go
│ │ │ │ │ ├── testdata/
│ │ │ │ │ │ ├── gcc-ppc32-aix-dwarf2-exec
│ │ │ │ │ │ └── gcc-ppc64-aix-dwarf2-exec
│ │ │ │ │ └── xcoff.go
│ │ │ │ ├── license_finder.go
│ │ │ │ ├── license_finder_test.go
│ │ │ │ ├── licenses.go
│ │ │ │ ├── licenses_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_go_binary.go
│ │ │ │ ├── parse_go_binary_test.go
│ │ │ │ ├── parse_go_mod.go
│ │ │ │ ├── parse_go_mod_test.go
│ │ │ │ ├── scan_binary.go
│ │ │ │ ├── scan_binary_test.go
│ │ │ │ ├── stdlib_package.go
│ │ │ │ ├── stdlib_package_test.go
│ │ │ │ ├── subfs.go
│ │ │ │ ├── subfs_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── archs/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── build.sh
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── corrupt/
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── go.sum
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── partial-binary
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── go.mod
│ │ │ │ │ ├── go-mod-fixtures/
│ │ │ │ │ │ ├── many-packages/
│ │ │ │ │ │ │ └── go.mod
│ │ │ │ │ │ ├── one-package/
│ │ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ │ └── go.sum
│ │ │ │ │ │ └── relative-replace/
│ │ │ │ │ │ └── go.mod
│ │ │ │ │ ├── go-sum-hashes/
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ └── go.sum
│ │ │ │ │ ├── image-not-a-module/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── image-small/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── image-small-upx/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ ├── go.mod
│ │ │ │ │ │ ├── go.sum
│ │ │ │ │ │ └── main.go
│ │ │ │ │ ├── licenses/
│ │ │ │ │ │ └── pkg/
│ │ │ │ │ │ └── mod/
│ │ │ │ │ │ └── github.com/
│ │ │ │ │ │ ├── !cap!o!r!g/
│ │ │ │ │ │ │ └── !cap!project@v4.111.5/
│ │ │ │ │ │ │ └── LICENSE.txt
│ │ │ │ │ │ └── someorg/
│ │ │ │ │ │ ├── somename@v0.3.2/
│ │ │ │ │ │ │ └── LICENSE
│ │ │ │ │ │ └── strangelicense@v1.2.3/
│ │ │ │ │ │ └── LiCeNsE.tXt
│ │ │ │ │ ├── licenses-vendor/
│ │ │ │ │ │ └── github.com/
│ │ │ │ │ │ ├── !cap!o!r!g/
│ │ │ │ │ │ │ └── !cap!project/
│ │ │ │ │ │ │ └── LICENSE.txt
│ │ │ │ │ │ └── someorg/
│ │ │ │ │ │ ├── somename/
│ │ │ │ │ │ │ └── LICENSE
│ │ │ │ │ │ └── strangelicense/
│ │ │ │ │ │ └── LiCeNsE.tXt
│ │ │ │ │ ├── repo/
│ │ │ │ │ │ └── LICENSE
│ │ │ │ │ └── zip-fs/
│ │ │ │ │ └── github.com/
│ │ │ │ │ └── someorg/
│ │ │ │ │ └── somepkg@version/
│ │ │ │ │ ├── a-file
│ │ │ │ │ └── subdir/
│ │ │ │ │ └── subfile
│ │ │ │ ├── upx.go
│ │ │ │ └── upx_test.go
│ │ │ ├── haskell/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_cabal_freeze.go
│ │ │ │ ├── parse_cabal_freeze_test.go
│ │ │ │ ├── parse_stack_lock.go
│ │ │ │ ├── parse_stack_lock_test.go
│ │ │ │ ├── parse_stack_yaml.go
│ │ │ │ ├── parse_stack_yaml_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── cabal.project.freeze
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── stack.yaml
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ ├── cabal.project.freeze
│ │ │ │ │ └── stack.yaml
│ │ │ │ └── stack.yaml
│ │ │ ├── homebrew/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_homebrew_formula.go
│ │ │ │ ├── parse_homebrew_formula_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── formulas/
│ │ │ │ │ ├── crazy/
│ │ │ │ │ │ └── 1.0.0/
│ │ │ │ │ │ └── .brew/
│ │ │ │ │ │ └── crazy.rb
│ │ │ │ │ └── syft/
│ │ │ │ │ └── 1.23.1/
│ │ │ │ │ └── .brew/
│ │ │ │ │ └── syft.rb
│ │ │ │ └── install-example/
│ │ │ │ └── opt/
│ │ │ │ └── homebrew/
│ │ │ │ ├── Cellar/
│ │ │ │ │ └── foo/
│ │ │ │ │ └── 1.2.3/
│ │ │ │ │ └── .brew/
│ │ │ │ │ └── foo.rb
│ │ │ │ └── Library/
│ │ │ │ └── Taps/
│ │ │ │ └── testorg/
│ │ │ │ └── sometap/
│ │ │ │ └── Formula/
│ │ │ │ └── bar.rb
│ │ │ ├── internal/
│ │ │ │ ├── binutils/
│ │ │ │ │ ├── branching_matcher.go
│ │ │ │ │ ├── branching_matcher_test.go
│ │ │ │ │ ├── classifier.go
│ │ │ │ │ ├── classifier_package.go
│ │ │ │ │ ├── classifier_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── subdir/
│ │ │ │ │ │ └── some-binary
│ │ │ │ │ ├── version-parts.txt
│ │ │ │ │ └── version.txt
│ │ │ │ ├── cpegenerate/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── apk.go
│ │ │ │ │ ├── apk_test.go
│ │ │ │ │ ├── candidate_by_package_type.go
│ │ │ │ │ ├── candidate_by_package_type_test.go
│ │ │ │ │ ├── candidate_for_pe.go
│ │ │ │ │ ├── dictionary/
│ │ │ │ │ │ ├── data/
│ │ │ │ │ │ │ └── cpe-index.json
│ │ │ │ │ │ └── types.go
│ │ │ │ │ ├── dotnet.go
│ │ │ │ │ ├── field_candidate.go
│ │ │ │ │ ├── field_candidate_filter.go
│ │ │ │ │ ├── field_candidate_test.go
│ │ │ │ │ ├── filter.go
│ │ │ │ │ ├── filter_test.go
│ │ │ │ │ ├── generate.go
│ │ │ │ │ ├── generate_test.go
│ │ │ │ │ ├── go.go
│ │ │ │ │ ├── go_test.go
│ │ │ │ │ ├── java.go
│ │ │ │ │ ├── java_groupid_map.go
│ │ │ │ │ ├── java_test.go
│ │ │ │ │ ├── javascript.go
│ │ │ │ │ ├── pe_test.go
│ │ │ │ │ ├── python.go
│ │ │ │ │ ├── rpm.go
│ │ │ │ │ ├── ruby.go
│ │ │ │ │ ├── utils.go
│ │ │ │ │ ├── utils_test.go
│ │ │ │ │ ├── vendors_from_url.go
│ │ │ │ │ ├── vendors_from_url_test.go
│ │ │ │ │ ├── wordpress.go
│ │ │ │ │ └── wordpress_test.go
│ │ │ │ ├── dependency/
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ └── resolver_test.go
│ │ │ │ ├── licenses/
│ │ │ │ │ ├── find_licenses.go
│ │ │ │ │ ├── find_licenses_test.go
│ │ │ │ │ ├── names.go
│ │ │ │ │ ├── names_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── source.txt
│ │ │ │ ├── pe/
│ │ │ │ │ ├── bundle.go
│ │ │ │ │ ├── bundle_test.go
│ │ │ │ │ ├── pe.go
│ │ │ │ │ ├── pe_test.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── image-dotnet31-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ ├── image-dotnet5-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ ├── image-dotnet6-single-file/
│ │ │ │ │ │ ├── Dockerfile
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── Program.cs
│ │ │ │ │ │ └── hello.csproj
│ │ │ │ │ └── net8-app-single-file.deps.json
│ │ │ │ └── pkgtest/
│ │ │ │ ├── metadata_tracker.go
│ │ │ │ ├── observing_resolver.go
│ │ │ │ └── test_generic_parser.go
│ │ │ ├── java/
│ │ │ │ ├── archive_filename.go
│ │ │ │ ├── archive_filename_test.go
│ │ │ │ ├── archive_parser.go
│ │ │ │ ├── archive_parser_test.go
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── graalvm_native_image_cataloger.go
│ │ │ │ ├── graalvm_native_image_cataloger_test.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── maven/
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── config_test.go
│ │ │ │ │ ├── pom_parser.go
│ │ │ │ │ ├── pom_parser_test.go
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ ├── resolver_test.go
│ │ │ │ │ ├── test/
│ │ │ │ │ │ └── mock_repo.go
│ │ │ │ │ └── testdata/
│ │ │ │ │ ├── declared-iso-8859-encoded-pom.xml.base64
│ │ │ │ │ ├── local/
│ │ │ │ │ │ ├── child-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── child-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── child-3/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── circular-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── circular-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── contains-child-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── parent-1/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── parent-2/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ └── parent-3/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── local-repository-settings/
│ │ │ │ │ │ └── .m2/
│ │ │ │ │ │ └── settings.xml
│ │ │ │ │ ├── maven-repo/
│ │ │ │ │ │ ├── my/
│ │ │ │ │ │ │ └── org/
│ │ │ │ │ │ │ ├── child-one/
│ │ │ │ │ │ │ │ └── 1.3.6/
│ │ │ │ │ │ │ │ └── child-one-1.3.6.pom
│ │ │ │ │ │ │ ├── child-two/
│ │ │ │ │ │ │ │ └── 2.1.90/
│ │ │ │ │ │ │ │ └── child-two-2.1.90.pom
│ │ │ │ │ │ │ ├── circular/
│ │ │ │ │ │ │ │ └── 1.2.3/
│ │ │ │ │ │ │ │ └── circular-1.2.3.pom
│ │ │ │ │ │ │ ├── parent-one/
│ │ │ │ │ │ │ │ └── 3.11.0/
│ │ │ │ │ │ │ │ └── parent-one-3.11.0.pom
│ │ │ │ │ │ │ └── parent-two/
│ │ │ │ │ │ │ └── 13.7.8/
│ │ │ │ │ │ │ └── parent-two-13.7.8.pom
│ │ │ │ │ │ ├── net/
│ │ │ │ │ │ │ └── shibboleth/
│ │ │ │ │ │ │ └── parent/
│ │ │ │ │ │ │ └── 7.11.2/
│ │ │ │ │ │ │ └── parent-7.11.2.pom
│ │ │ │ │ │ └── org/
│ │ │ │ │ │ ├── apache/
│ │ │ │ │ │ │ └── commons/
│ │ │ │ │ │ │ └── commons-parent/
│ │ │ │ │ │ │ └── 54/
│ │ │ │ │ │ │ └── commons-parent-54.pom
│ │ │ │ │ │ ├── junit/
│ │ │ │ │ │ │ └── junit-bom/
│ │ │ │ │ │ │ ├── 5.9.0/
│ │ │ │ │ │ │ │ └── junit-bom-5.9.0.pom
│ │ │ │ │ │ │ └── 5.9.1/
│ │ │ │ │ │ │ └── junit-bom-5.9.1.pom
│ │ │ │ │ │ └── opensaml/
│ │ │ │ │ │ └── opensaml-parent/
│ │ │ │ │ │ └── 3.4.6/
│ │ │ │ │ │ └── opensaml-parent-3.4.6.pom
│ │ │ │ │ └── undeclared-iso-8859-encoded-pom.xml.base64
│ │ │ │ ├── package_url.go
│ │ │ │ ├── package_url_test.go
│ │ │ │ ├── parse_gradle_lockfile.go
│ │ │ │ ├── parse_gradle_lockfile_test.go
│ │ │ │ ├── parse_java_manifest.go
│ │ │ │ ├── parse_java_manifest_test.go
│ │ │ │ ├── parse_jvm_release.go
│ │ │ │ ├── parse_jvm_release_test.go
│ │ │ │ ├── parse_pom_properties.go
│ │ │ │ ├── parse_pom_properties_test.go
│ │ │ │ ├── parse_pom_xml.go
│ │ │ │ ├── parse_pom_xml_test.go
│ │ │ │ ├── save_archive_to_tmp.go
│ │ │ │ ├── tar_wrapped_archive_parser.go
│ │ │ │ ├── tar_wrapped_archive_parser_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Makefile
│ │ │ │ │ ├── corrupt/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── example.jar
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── archives/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── example.tar.br
│ │ │ │ │ │ │ ├── example.tar.bz
│ │ │ │ │ │ │ ├── example.tar.bz2
│ │ │ │ │ │ │ ├── example.tar.lz4
│ │ │ │ │ │ │ ├── example.tar.sz
│ │ │ │ │ │ │ ├── example.tar.xz
│ │ │ │ │ │ │ ├── example.tar.zst
│ │ │ │ │ │ │ ├── example.tar.zstd
│ │ │ │ │ │ │ ├── example.tbr
│ │ │ │ │ │ │ ├── example.tbz
│ │ │ │ │ │ │ ├── example.tbz2
│ │ │ │ │ │ │ ├── example.tgz
│ │ │ │ │ │ │ ├── example.tlz4
│ │ │ │ │ │ │ ├── example.tsz
│ │ │ │ │ │ │ ├── example.txz
│ │ │ │ │ │ │ ├── example.tzst
│ │ │ │ │ │ │ └── example.tzstd
│ │ │ │ │ │ ├── java-archives/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── example.ear
│ │ │ │ │ │ │ ├── example.far
│ │ │ │ │ │ │ ├── example.hpi
│ │ │ │ │ │ │ ├── example.jar
│ │ │ │ │ │ │ ├── example.jpi
│ │ │ │ │ │ │ ├── example.kar
│ │ │ │ │ │ │ ├── example.lpkg
│ │ │ │ │ │ │ ├── example.nar
│ │ │ │ │ │ │ ├── example.par
│ │ │ │ │ │ │ ├── example.sar
│ │ │ │ │ │ │ └── example.war
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── graalvm-sbom/
│ │ │ │ │ │ └── micronaut.json
│ │ │ │ │ ├── gradle/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ └── gradle.lockfile
│ │ │ │ │ ├── jar-metadata/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── README.md
│ │ │ │ │ │ ├── api-all-2.0.0-sources/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.apache.directory.api/
│ │ │ │ │ │ │ ├── api-all/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── api-asn1-api/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── com.fasterxml.jackson.core.jackson-core-2.15.2/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── com.fasterxml.jackson.core/
│ │ │ │ │ │ │ └── jackson-core/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── commons-lang3-3.12.0/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.apache.commons-lang3/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── jackson-core-2.15.2/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── com.fasterxml.jackson.core/
│ │ │ │ │ │ │ └── jackson-core/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── jenkins-plugins/
│ │ │ │ │ │ │ └── gradle/
│ │ │ │ │ │ │ └── 2.11/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ └── MANIFEST.MF
│ │ │ │ │ │ ├── micronaut-aop-4.9.11/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── io.micronaut/
│ │ │ │ │ │ │ └── micronaut-aop/
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── multiple-matching-2.11.5/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.multiple/
│ │ │ │ │ │ │ ├── multiple-matching-1/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ ├── multiple-matching-2/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── multiple-matching-3/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── opensaml-core-3.4.6/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── INDEX.LIST
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ └── org.opensaml/
│ │ │ │ │ │ │ └── opensaml-core/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ ├── org.multiple-thename/
│ │ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ │ ├── MANIFEST.MF
│ │ │ │ │ │ │ └── maven/
│ │ │ │ │ │ │ ├── com.multiple/
│ │ │ │ │ │ │ │ └── thename/
│ │ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ │ └── org.multiple/
│ │ │ │ │ │ │ └── thename/
│ │ │ │ │ │ │ ├── pom.properties
│ │ │ │ │ │ │ └── pom.xml
│ │ │ │ │ │ └── spring-instrumentation-4.3.0-1.0/
│ │ │ │ │ │ └── META-INF/
│ │ │ │ │ │ └── MANIFEST.MF
│ │ │ │ │ ├── java-builds/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── Makefile
│ │ │ │ │ │ ├── build-example-java-app-gradle.sh
│ │ │ │ │ │ ├── build-example-java-app-maven.sh
│ │ │ │ │ │ ├── build-example-java-app-native-image.sh
│ │ │ │ │ │ ├── build-example-jenkins-plugin.sh
│ │ │ │ │ │ ├── build-example-macho-binary.sh
│ │ │ │ │ │ ├── build-example-sb-app-nestedjar.sh
│ │ │ │ │ │ ├── example-java-app/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ ├── build.gradle
│ │ │ │ │ │ │ ├── gradle.lockfile
│ │ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ └── main/
│ │ │ │ │ │ │ └── java/
│ │ │ │ │ │ │ └── hello/
│ │ │ │ │ │ │ ├── Greeter.java
│ │ │ │ │ │ │ └── HelloWorld.java
│ │ │ │ │ │ ├── example-jenkins-plugin/
│ │ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ │ └── src/
│ │ │ │ │ │ │ └── main/
│ │ │ │ │ │ │ ├── java/
│ │ │ │ │ │ │ │ └── io/
│ │ │ │ │ │ │ │ └── jenkins/
│ │ │ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ │ │ └── sample/
│ │ │ │ │ │ │ │ └── HelloWorldBuilder.java
│ │ │ │ │ │ │ └── resources/
│ │ │ │ │ │ │ ├── index.jelly
│ │ │ │ │ │ │ └── io/
│ │ │ │ │ │ │ └── jenkins/
│ │ │ │ │ │ │ └── plugins/
│ │ │ │ │ │ │ └── sample/
│ │ │ │ │ │ │ ├── HelloWorldBuilder/
│ │ │ │ │ │ │ │ ├── config.jelly
│ │ │ │ │ │ │ │ ├── config.properties
│ │ │ │ │ │ │ │ ├── config_fr.properties
│ │ │ │ │ │ │ │ ├── help-name.html
│ │ │ │ │ │ │ │ ├── help-name_fr.html
│ │ │ │ │ │ │ │ ├── help-useFrench.html
│ │ │ │ │ │ │ │ └── help-useFrench_fr.html
│ │ │ │ │ │ │ ├── Messages.properties
│ │ │ │ │ │ │ └── Messages_fr.properties
│ │ │ │ │ │ └── example-sb-app/
│ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ ├── pom.xml
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── main/
│ │ │ │ │ │ │ └── java/
│ │ │ │ │ │ │ └── com/
│ │ │ │ │ │ │ └── example/
│ │ │ │ │ │ │ └── springboot/
│ │ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ │ └── HelloController.java
│ │ │ │ │ │ └── test/
│ │ │ │ │ │ └── java/
│ │ │ │ │ │ └── com/
│ │ │ │ │ │ └── example/
│ │ │ │ │ │ └── springboot/
│ │ │ │ │ │ ├── HelloControllerIT.java
│ │ │ │ │ │ └── HelloControllerTest.java
│ │ │ │ │ ├── jvm-installs/
│ │ │ │ │ │ ├── oracle-jdk-se-8/
│ │ │ │ │ │ │ └── usr/
│ │ │ │ │ │ │ └── lib/
│ │ │ │ │ │ │ └── jvm/
│ │ │ │ │ │ │ ├── .gitignore
│ │ │ │ │ │ │ └── jdk-1.8-oracle-x64/
│ │ │ │ │ │ │ └── release
│ │ │ │ │ │ └── valid-post-jep223/
│ │ │ │ │ │ └── jvm/
│ │ │ │ │ │ └── openjdk/
│ │ │ │ │ │ ├── release
│ │ │ │ │ │ └── sibling/
│ │ │ │ │ │ └── child/
│ │ │ │ │ │ └── file1.txt
│ │ │ │ │ ├── manifest/
│ │ │ │ │ │ ├── continuation
│ │ │ │ │ │ ├── extra-empty-lines
│ │ │ │ │ │ ├── extra-info
│ │ │ │ │ │ ├── leading-space
│ │ │ │ │ │ ├── small
│ │ │ │ │ │ ├── standard-info
│ │ │ │ │ │ └── version-with-date
│ │ │ │ │ └── pom/
│ │ │ │ │ ├── colon-delimited-with-equals.pom.properties
│ │ │ │ │ ├── colon-delimited.pom.properties
│ │ │ │ │ ├── commons-codec.pom.xml
│ │ │ │ │ ├── commons-text-1.10.0/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── equals-delimited-with-colons.pom.properties
│ │ │ │ │ ├── example-java-app-maven/
│ │ │ │ │ │ └── pom.xml
│ │ │ │ │ ├── extra.pom.properties
│ │ │ │ │ ├── neo4j-license-maven-plugin.pom.xml
│ │ │ │ │ ├── small.pom.properties
│ │ │ │ │ └── transitive-top-level/
│ │ │ │ │ └── pom.xml
│ │ │ │ ├── zip_wrapped_archive_parser.go
│ │ │ │ └── zip_wrapped_archive_parser_test.go
│ │ │ ├── javascript/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_package_json.go
│ │ │ │ ├── parse_package_json_test.go
│ │ │ │ ├── parse_package_lock.go
│ │ │ │ ├── parse_package_lock_test.go
│ │ │ │ ├── parse_pnpm_lock.go
│ │ │ │ ├── parse_pnpm_lock_test.go
│ │ │ │ ├── parse_yarn_lock.go
│ │ │ │ ├── parse_yarn_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── package.json
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── src/
│ │ │ │ │ └── package.json
│ │ │ │ ├── pkg-json/
│ │ │ │ │ ├── package-all-author-fields.json
│ │ │ │ │ ├── package-author-non-standard.json
│ │ │ │ │ ├── package-authors-array.json
│ │ │ │ │ ├── package-authors-objects.json
│ │ │ │ │ ├── package-both-author-and-authors.json
│ │ │ │ │ ├── package-contributors.json
│ │ │ │ │ ├── package-license-object.json
│ │ │ │ │ ├── package-license-objects.json
│ │ │ │ │ ├── package-maintainers.json
│ │ │ │ │ ├── package-malformed-license.json
│ │ │ │ │ ├── package-nested-author.json
│ │ │ │ │ ├── package-no-license.json
│ │ │ │ │ ├── package-partial.json
│ │ │ │ │ ├── package-private.json
│ │ │ │ │ ├── package-repo-string.json
│ │ │ │ │ └── package.json
│ │ │ │ ├── pkg-lock/
│ │ │ │ │ ├── alias-package-lock-1.json
│ │ │ │ │ ├── alias-package-lock-2.json
│ │ │ │ │ ├── array-license-package-lock.json
│ │ │ │ │ ├── package-lock-2.json
│ │ │ │ │ └── package-lock-3.json
│ │ │ │ ├── pnpm-remote/
│ │ │ │ │ └── registry_response.json
│ │ │ │ ├── yarn-berry-dev-deps/
│ │ │ │ │ └── package.json
│ │ │ │ ├── yarn-dev-deps/
│ │ │ │ │ └── package.json
│ │ │ │ └── yarn-remote/
│ │ │ │ └── registry_response.json
│ │ │ ├── kernel/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_linux_kernel_file.go
│ │ │ │ ├── parse_linux_kernel_module_file.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Makefile
│ │ │ │ └── image-kernel-and-modules/
│ │ │ │ └── Dockerfile
│ │ │ ├── lua/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_rockspec.go
│ │ │ │ ├── parse_rockspec_test.go
│ │ │ │ ├── rockspec_parser.go
│ │ │ │ ├── rockspec_parser_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── corrupt/
│ │ │ │ │ └── bad-1.23.0-0.rockspec
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── lua/
│ │ │ │ │ └── package.rockspec
│ │ │ │ └── rockspec/
│ │ │ │ ├── kong-3.7.0-0.rockspec
│ │ │ │ ├── kong-pgmoon-1.16.2-1.rockspec
│ │ │ │ ├── lpeg-1.0.2-1.rockspec
│ │ │ │ └── luasyslog-2.0.1-1.rockspec
│ │ │ ├── nix/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── db_cataloger.go
│ │ │ │ ├── db_cataloger_v10.go
│ │ │ │ ├── derivation.go
│ │ │ │ ├── derivation_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_store_path.go
│ │ │ │ ├── parse_store_path_test.go
│ │ │ │ ├── store_cataloger.go
│ │ │ │ ├── store_cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── fixture-1/
│ │ │ │ │ ├── .gitignore
│ │ │ │ │ └── nix/
│ │ │ │ │ └── store/
│ │ │ │ │ ├── 5av396z8xa13jg89g9jws145c0k26k2x-glibc-2.34-210.drv
│ │ │ │ │ └── h0cnbmfcn93xm5dg2x27ixhag1cwndga-glibc-2.34-210-bin/
│ │ │ │ │ └── share/
│ │ │ │ │ └── man/
│ │ │ │ │ └── glibc.1
│ │ │ │ ├── image-nixos-jq-pkg-db/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── clean_db.sql
│ │ │ │ └── image-nixos-jq-pkg-store/
│ │ │ │ └── Dockerfile
│ │ │ ├── ocaml/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_opam.go
│ │ │ │ ├── parse_opam_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── alcotest.opam
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── opam/
│ │ │ │ │ ├── alcotest.opam
│ │ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ │ └── opam
│ │ │ │ └── ocaml-base-compiler.4.14.0/
│ │ │ │ └── opam
│ │ │ ├── php/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── interpreter_cataloger.go
│ │ │ │ ├── interpreter_cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_composer_lock.go
│ │ │ │ ├── parse_composer_lock_test.go
│ │ │ │ ├── parse_installed_json.go
│ │ │ │ ├── parse_installed_json_test.go
│ │ │ │ ├── parse_pecl_pear.go
│ │ │ │ ├── parse_pecl_pear_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── php/
│ │ │ │ │ │ └── .registry/
│ │ │ │ │ │ └── .channel.pecl.php.net/
│ │ │ │ │ │ └── memcached.reg
│ │ │ │ │ └── src/
│ │ │ │ │ └── installed.json
│ │ │ │ ├── image-apache/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── image-extensions/
│ │ │ │ │ └── Dockerfile
│ │ │ │ ├── memcached-v5-format.reg
│ │ │ │ ├── memcached-v6-format.reg
│ │ │ │ └── vendor/
│ │ │ │ ├── composer_1/
│ │ │ │ │ └── installed.json
│ │ │ │ └── composer_2/
│ │ │ │ └── installed.json
│ │ │ ├── python/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── config.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── license.go
│ │ │ │ ├── license_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_pdm_lock.go
│ │ │ │ ├── parse_pdm_lock_test.go
│ │ │ │ ├── parse_pipfile_lock.go
│ │ │ │ ├── parse_pipfile_lock_test.go
│ │ │ │ ├── parse_poetry_lock.go
│ │ │ │ ├── parse_poetry_lock_test.go
│ │ │ │ ├── parse_requirements.go
│ │ │ │ ├── parse_requirements_test.go
│ │ │ │ ├── parse_setup.go
│ │ │ │ ├── parse_setup_test.go
│ │ │ │ ├── parse_uv_lock.go
│ │ │ │ ├── parse_uv_lock_test.go
│ │ │ │ ├── parse_wheel_egg.go
│ │ │ │ ├── parse_wheel_egg_metadata.go
│ │ │ │ ├── parse_wheel_egg_metadata_test.go
│ │ │ │ ├── parse_wheel_egg_record.go
│ │ │ │ ├── parse_wheel_egg_record_test.go
│ │ │ │ ├── testdata/
│ │ │ │ │ ├── Python-2.7.egg-info
│ │ │ │ │ ├── empty-1.0.0-py3.8.egg-info
│ │ │ │ │ ├── glob-paths/
│ │ │ │ │ │ ├── site-packages/
│ │ │ │ │ │ │ ├── v.DIST-INFO/
│ │ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ │ ├── w.EGG-INFO/
│ │ │ │ │ │ │ │ └── PKG-INFO
│ │ │ │ │ │ │ ├── x.dist-info/
│ │ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ │ ├── y.egg-info/
│ │ │ │ │ │ │ │ └── PKG-INFO
│ │ │ │ │ │ │ └── z.egg-info
│ │ │ │ │ │ └── src/
│ │ │ │ │ │ ├── 1-requirements-dev.txt
│ │ │ │ │ │ ├── extra-requirements.txt
│ │ │ │ │ │ ├── requirements-dev.txt
│ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── image-multi-site-package/
│ │ │ │ │ │ └── Dockerfile
│ │ │ │ │ ├── installed-files/
│ │ │ │ │ │ └── installed-files.txt
│ │ │ │ │ ├── poetry/
│ │ │ │ │ │ ├── conflicting-with-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ ├── multiple-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ ├── nested-extras/
│ │ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ │ └── simple-deps/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── pyenv/
│ │ │ │ │ │ ├── good-config
│ │ │ │ │ │ └── trixy-config
│ │ │ │ │ ├── pypi-remote/
│ │ │ │ │ │ ├── pyproject.toml
│ │ │ │ │ │ ├── registry_response.json
│ │ │ │ │ │ ├── registry_response_bad.json
│ │ │ │ │ │ ├── requirements.txt
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── requires/
│ │ │ │ │ │ └── requirements.txt
│ │ │ │ │ ├── setup/
│ │ │ │ │ │ ├── dynamic-setup.py
│ │ │ │ │ │ ├── mixed-format-setup.py
│ │ │ │ │ │ ├── multiline-split-setup.py
│ │ │ │ │ │ └── setup.py
│ │ │ │ │ ├── site-packages/
│ │ │ │ │ │ ├── license/
│ │ │ │ │ │ │ ├── with-license-file-declared.dist-info/
│ │ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── without-license-file-declared.dist-info/
│ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── malformed-record/
│ │ │ │ │ │ │ └── dist-info/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ └── RECORD
│ │ │ │ │ │ ├── nested/
│ │ │ │ │ │ │ ├── dist-name/
│ │ │ │ │ │ │ │ └── dist-info/
│ │ │ │ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ │ └── egg-name/
│ │ │ │ │ │ │ └── egg-info/
│ │ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ │ ├── PKG-INFO-INVALID
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ ├── no-version/
│ │ │ │ │ │ │ └── no-version-py3.8.egg-info
│ │ │ │ │ │ ├── partial.dist-info/
│ │ │ │ │ │ │ └── METADATA
│ │ │ │ │ │ ├── test/
│ │ │ │ │ │ │ └── test.egg-info
│ │ │ │ │ │ └── uppercase/
│ │ │ │ │ │ ├── dist-name/
│ │ │ │ │ │ │ └── DIST-INFO/
│ │ │ │ │ │ │ ├── METADATA
│ │ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ │ ├── direct_url.json
│ │ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ │ └── egg-name/
│ │ │ │ │ │ └── EGG-INFO/
│ │ │ │ │ │ ├── PKG-INFO
│ │ │ │ │ │ ├── PKG-INFO-INVALID
│ │ │ │ │ │ ├── RECORD
│ │ │ │ │ │ └── top_level.txt
│ │ │ │ │ └── uv/
│ │ │ │ │ ├── conflicting-with-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── multiple-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ ├── nested-extras/
│ │ │ │ │ │ └── pyproject.toml
│ │ │ │ │ └── simple-deps/
│ │ │ │ │ └── pyproject.toml
│ │ │ │ ├── virtual_env.go
│ │ │ │ └── virtual_env_test.go
│ │ │ ├── r/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_description.go
│ │ │ │ ├── parse_description_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── DESCRIPTION
│ │ │ │ ├── installed/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ └── DESCRIPTION
│ │ │ │ │ └── stringr/
│ │ │ │ │ └── DESCRIPTION
│ │ │ │ └── map-parse/
│ │ │ │ ├── bad
│ │ │ │ ├── eof-multiline
│ │ │ │ ├── multiline
│ │ │ │ ├── no-name
│ │ │ │ ├── no-version
│ │ │ │ └── simple
│ │ │ ├── redhat/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── dependency.go
│ │ │ │ ├── dependency_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_rpm_archive.go
│ │ │ │ ├── parse_rpm_archive_test.go
│ │ │ │ ├── parse_rpm_db.go
│ │ │ │ ├── parse_rpm_db_test.go
│ │ │ │ ├── parse_rpm_manifest.go
│ │ │ │ ├── parse_rpm_manifest_test.go
│ │ │ │ ├── sqlitetest/
│ │ │ │ │ └── no_sqlite_driver_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── .gitignore
│ │ │ │ ├── Makefile
│ │ │ │ ├── Packages
│ │ │ │ ├── bad/
│ │ │ │ │ └── bad.rpm
│ │ │ │ ├── container-manifest-2
│ │ │ │ ├── generate-fixture.sh
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── dive-0.10.0.rpm
│ │ │ │ │ ├── usr/
│ │ │ │ │ │ ├── lib/
│ │ │ │ │ │ │ └── sysimage/
│ │ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ │ └── Packages
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── rpm/
│ │ │ │ │ │ └── Packages
│ │ │ │ │ └── var/
│ │ │ │ │ └── lib/
│ │ │ │ │ ├── rpm/
│ │ │ │ │ │ └── Packages
│ │ │ │ │ └── rpmmanifest/
│ │ │ │ │ └── container-manifest-2
│ │ │ │ ├── image-minimal/
│ │ │ │ │ ├── Dockerfile
│ │ │ │ │ └── remove.sh
│ │ │ │ └── image-rpm-archive/
│ │ │ │ └── Dockerfile
│ │ │ ├── ruby/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_gemfile_lock.go
│ │ │ │ ├── parse_gemfile_lock_test.go
│ │ │ │ ├── parse_gemspec.go
│ │ │ │ ├── parse_gemspec_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── bundler.gemspec
│ │ │ │ └── glob-paths/
│ │ │ │ └── specifications/
│ │ │ │ ├── pkg/
│ │ │ │ │ └── nested.gemspec
│ │ │ │ └── root.gemspec
│ │ │ ├── rust/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_audit_binary.go
│ │ │ │ ├── parse_cargo_lock.go
│ │ │ │ ├── parse_cargo_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Cargo.lock-with-git-deps
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── partial-binary
│ │ │ │ └── image-audit/
│ │ │ │ ├── Cargo.toml
│ │ │ │ ├── Dockerfile
│ │ │ │ └── src/
│ │ │ │ └── main.rs
│ │ │ ├── sbom/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── alpine/
│ │ │ │ │ └── syft-json/
│ │ │ │ │ └── sbom.syft.json
│ │ │ │ └── glob-paths/
│ │ │ │ ├── app.bom
│ │ │ │ ├── app.bom.json
│ │ │ │ ├── app.cdx
│ │ │ │ ├── app.cdx.json
│ │ │ │ ├── app.sbom
│ │ │ │ ├── app.sbom.json
│ │ │ │ ├── app.spdx
│ │ │ │ ├── app.spdx.json
│ │ │ │ ├── app.syft.json
│ │ │ │ ├── bom
│ │ │ │ └── sbom
│ │ │ ├── snap/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── integration_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── parse_base_dpkg.go
│ │ │ │ ├── parse_base_dpkg_test.go
│ │ │ │ ├── parse_integration_test.go
│ │ │ │ ├── parse_kernel_changelog.go
│ │ │ │ ├── parse_kernel_changelog_test.go
│ │ │ │ ├── parse_snapd_snapcraft.go
│ │ │ │ ├── parse_system_manifest.go
│ │ │ │ └── testdata/
│ │ │ │ ├── dpkg.yaml
│ │ │ │ ├── glob-paths/
│ │ │ │ │ ├── base/
│ │ │ │ │ │ └── usr/
│ │ │ │ │ │ └── share/
│ │ │ │ │ │ └── snappy/
│ │ │ │ │ │ └── dpkg.yaml
│ │ │ │ │ └── system/
│ │ │ │ │ └── snap/
│ │ │ │ │ └── manifest.yaml
│ │ │ │ ├── manifest.yaml
│ │ │ │ └── real-dpkg.yaml
│ │ │ ├── swift/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_package_resolved.go
│ │ │ │ ├── parse_package_resolved_test.go
│ │ │ │ ├── parse_podfile_lock.go
│ │ │ │ ├── parse_podfile_lock_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── Package.resolved
│ │ │ │ ├── PackageV3.resolved
│ │ │ │ ├── bad-version-packages.resolved
│ │ │ │ └── empty-packages.resolved
│ │ │ ├── swipl/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── package.go
│ │ │ │ ├── package_test.go
│ │ │ │ ├── parse_pack.go
│ │ │ │ ├── parse_pack_test.go
│ │ │ │ └── testdata/
│ │ │ │ ├── glob-paths/
│ │ │ │ │ └── pack.pl
│ │ │ │ └── pack.pl
│ │ │ ├── terraform/
│ │ │ │ ├── capabilities.yaml
│ │ │ │ ├── cataloger.go
│ │ │ │ ├── cataloger_test.go
│ │ │ │ ├── parse_tf_lock.go
│ │ │ │ └── testdata/
│ │ │ │ └── two-providers/
│ │ │ │ └── .terraform.lock.hcl
│ │ │ └── wordpress/
│ │ │ ├── capabilities.yaml
│ │ │ ├── cataloger.go
│ │ │ ├── cataloger_test.go
│ │ │ ├── package.go
│ │ │ ├── parse_plugin.go
│ │ │ ├── parse_plugin_test.go
│ │ │ └── testdata/
│ │ │ └── glob-paths/
│ │ │ ├── wp-admin/
│ │ │ │ └── index.php
│ │ │ ├── wp-content/
│ │ │ │ └── plugins/
│ │ │ │ ├── akismet/
│ │ │ │ │ └── akismet.php
│ │ │ │ └── all-in-one-wp-migration/
│ │ │ │ └── all-in-one-wp-migration.php
│ │ │ └── wp-includes/
│ │ │ └── index.php
│ │ ├── cataloger.go
│ │ ├── cocoapods.go
│ │ ├── collection.go
│ │ ├── collection_test.go
│ │ ├── conan.go
│ │ ├── conda.go
│ │ ├── dart.go
│ │ ├── dotnet.go
│ │ ├── dpkg.go
│ │ ├── elixir.go
│ │ ├── erlang.go
│ │ ├── evidence.go
│ │ ├── file_owner.go
│ │ ├── gguf.go
│ │ ├── github.go
│ │ ├── golang.go
│ │ ├── hackage.go
│ │ ├── homebrew.go
│ │ ├── java.go
│ │ ├── java_test.go
│ │ ├── key_value.go
│ │ ├── language.go
│ │ ├── language_test.go
│ │ ├── license.go
│ │ ├── license_deprecated.go
│ │ ├── license_set.go
│ │ ├── license_set_test.go
│ │ ├── license_test.go
│ │ ├── license_url_enrichment_test.go
│ │ ├── linux_kernel.go
│ │ ├── microsoft.go
│ │ ├── nix.go
│ │ ├── npm.go
│ │ ├── ocaml.go
│ │ ├── package.go
│ │ ├── package_test.go
│ │ ├── php.go
│ │ ├── portage.go
│ │ ├── python.go
│ │ ├── python_test.go
│ │ ├── r.go
│ │ ├── rockspec.go
│ │ ├── rpm.go
│ │ ├── rpm_test.go
│ │ ├── ruby.go
│ │ ├── rust.go
│ │ ├── snap.go
│ │ ├── swift.go
│ │ ├── swipl.go
│ │ ├── terraform.go
│ │ ├── type.go
│ │ ├── type_test.go
│ │ ├── url.go
│ │ └── wordpress.go
│ ├── sbom/
│ │ ├── format.go
│ │ ├── sbom.go
│ │ └── writer.go
│ ├── source/
│ │ ├── alias.go
│ │ ├── description.go
│ │ ├── directory_metadata.go
│ │ ├── directorysource/
│ │ │ ├── cache_excludes.go
│ │ │ ├── directory_source.go
│ │ │ ├── directory_source_provider.go
│ │ │ ├── directory_source_test.go
│ │ │ └── directory_source_win_test.go
│ │ ├── exclude.go
│ │ ├── file_metadata.go
│ │ ├── filesource/
│ │ │ ├── file_source.go
│ │ │ ├── file_source_provider.go
│ │ │ └── file_source_test.go
│ │ ├── image_metadata.go
│ │ ├── internal/
│ │ │ ├── digest_utils.go
│ │ │ ├── image_id.go
│ │ │ └── image_id_test.go
│ │ ├── oci_model_metadata.go
│ │ ├── ocimodelsource/
│ │ │ ├── oci_model_source.go
│ │ │ ├── oci_model_source_provider.go
│ │ │ ├── registry_client.go
│ │ │ └── registry_client_test.go
│ │ ├── provider.go
│ │ ├── scope.go
│ │ ├── scope_test.go
│ │ ├── snap_metadata.go
│ │ ├── snapsource/
│ │ │ ├── manifest.go
│ │ │ ├── snap.go
│ │ │ ├── snap_source.go
│ │ │ ├── snap_source_provider.go
│ │ │ ├── snap_source_test.go
│ │ │ ├── snap_test.go
│ │ │ ├── snapcraft_api.go
│ │ │ └── snapcraft_api_test.go
│ │ ├── source.go
│ │ ├── sourceproviders/
│ │ │ ├── source_provider_config.go
│ │ │ └── source_providers.go
│ │ ├── stereoscopesource/
│ │ │ ├── image_source.go
│ │ │ ├── image_source_provider.go
│ │ │ └── image_source_test.go
│ │ └── testdata/
│ │ ├── actual-path/
│ │ │ └── empty
│ │ ├── file-index-filter/
│ │ │ ├── .1/
│ │ │ │ └── something
│ │ │ ├── .2
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ ├── generate-tar-fixture-from-source-dir.sh
│ │ ├── image-simple/
│ │ │ ├── Dockerfile
│ │ │ ├── file-1.txt
│ │ │ ├── file-2.txt
│ │ │ └── target/
│ │ │ └── really/
│ │ │ └── nested/
│ │ │ └── file-3.txt
│ │ ├── path-detected/
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ ├── path-detected-2/
│ │ │ ├── .vimrc
│ │ │ └── empty
│ │ └── system_paths/
│ │ ├── outside_root/
│ │ │ └── link_target/
│ │ │ └── place
│ │ └── target/
│ │ ├── dev/
│ │ │ └── place
│ │ ├── home/
│ │ │ └── place
│ │ ├── link/
│ │ │ └── a-symlink/
│ │ │ └── place
│ │ ├── proc/
│ │ │ └── place
│ │ └── sys/
│ │ └── place
│ └── testutil/
│ ├── README.md
│ └── completion_testing.go
├── task.d/
│ └── generate/
│ └── cpe-index.yaml
└── test/
├── cli/
│ ├── .gitignore
│ ├── all_formats_convertible_test.go
│ ├── all_formats_expressible_test.go
│ ├── archive_test.go
│ ├── cataloger_info_test.go
│ ├── config_test.go
│ ├── convert_cmd_test.go
│ ├── cyclonedx_valid_test.go
│ ├── dir_root_scan_regression_test.go
│ ├── json_schema_test.go
│ ├── license_test.go
│ ├── root_cmd_test.go
│ ├── scan_cmd_test.go
│ ├── spdx_json_schema_test.go
│ ├── spdx_tooling_validation_test.go
│ ├── symlink_test.go
│ ├── testdata/
│ │ ├── .gitignore
│ │ ├── Makefile
│ │ ├── archive/
│ │ │ └── dist-info/
│ │ │ ├── METADATA
│ │ │ ├── RECORD
│ │ │ └── top_level.txt
│ │ ├── attestation/
│ │ │ ├── Dockerfile.ctfe_init
│ │ │ ├── config/
│ │ │ │ ├── config.json
│ │ │ │ ├── ctfe/
│ │ │ │ │ ├── ct_server.cfg
│ │ │ │ │ ├── privkey.pem
│ │ │ │ │ └── pubkey.pem
│ │ │ │ ├── dex/
│ │ │ │ │ └── docker-compose-config.yaml
│ │ │ │ └── logid.sh
│ │ │ ├── docker-compose-config.yaml
│ │ │ └── docker-compose.yaml
│ │ ├── configs/
│ │ │ ├── dir1/
│ │ │ │ └── .syft.yaml
│ │ │ └── dir2/
│ │ │ └── .syft.yaml
│ │ ├── csv.template
│ │ ├── image-bad-binaries/
│ │ │ ├── Dockerfile
│ │ │ └── sources.list
│ │ ├── image-hidden-packages/
│ │ │ └── Dockerfile
│ │ ├── image-java-spdx-tools/
│ │ │ ├── Dockerfile
│ │ │ └── Makefile
│ │ ├── image-node-binary/
│ │ │ └── Dockerfile
│ │ ├── image-unknowns/
│ │ │ ├── Dockerfile
│ │ │ ├── exe
│ │ │ └── executable-script
│ │ └── registry/
│ │ ├── .dockerignore
│ │ ├── Dockerfile
│ │ └── Makefile
│ ├── trait_assertions_test.go
│ ├── unknowns_test.go
│ ├── utils_test.go
│ └── version_cmd_test.go
├── compare/
│ ├── compare.py
│ ├── deb.sh
│ ├── mac.sh
│ ├── rpm.sh
│ └── testdata/
│ └── acceptance-centos-8.2.2004.json
├── install/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── 0_checksums_test.sh
│ ├── 1_download_snapshot_asset_test.sh
│ ├── 2_download_release_asset_test.sh
│ ├── 3_install_asset_test.sh
│ ├── 4_prep_signature_verification_test.sh
│ ├── Makefile
│ ├── environments/
│ │ ├── Dockerfile-alpine-3.6
│ │ ├── Dockerfile-busybox-1.36
│ │ └── Dockerfile-ubuntu-20.04
│ ├── github_test.sh
│ ├── test_harness.sh
│ └── testdata/
│ ├── assets/
│ │ ├── invalid/
│ │ │ ├── .gitignore
│ │ │ └── checksums.txt
│ │ └── valid/
│ │ ├── .gitignore
│ │ └── checksums.txt
│ ├── github-api-syft-v0.36.0-release.json
│ ├── syft_0.35.1-SNAPSHOT-d461f63_checksums.txt
│ └── syft_0.36.0_checksums.txt
└── rules/
└── rules.go
Showing preview only (636K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6319 symbols across 1157 files)
FILE: .github/scripts/coverage.py
class bcolors (line 7) | class bcolors:
FILE: .github/scripts/find_cache_paths.py
function find_fingerprints_and_check_dirs (line 14) | def find_fingerprints_and_check_dirs(base_dir):
function parse_fingerprint_contents (line 51) | def parse_fingerprint_contents(fingerprint_content):
function calculate_sha256 (line 59) | def calculate_sha256(fingerprint_contents):
function calculate_file_sha256 (line 69) | def calculate_file_sha256(file_path):
function show (line 77) | def show(*s: str):
function main (line 81) | def main(file_path: str | None):
FILE: .github/scripts/fingerprint_docker_fixtures.py
function print_message (line 12) | def print_message(message):
function sha256sum (line 16) | def sha256sum(filepath):
function is_git_tracked_or_untracked (line 24) | def is_git_tracked_or_untracked(directory):
function find_test_fixture_dirs_with_images (line 35) | def find_test_fixture_dirs_with_images(base_dir):
function generate_fingerprints (line 44) | def generate_fingerprints():
function find_image_dirs (line 59) | def find_image_dirs(test_fixture_dir):
FILE: .github/scripts/labeler.py
function main (line 20) | def main(changed_files: str | None = None, merge_base_schema_files: str ...
function add_comment (line 104) | def add_comment(comment_file_path: str, comment: str, warning: bool = Fa...
function add_label (line 124) | def add_label(pr_number: str, label: str):
function remove_label (line 133) | def remove_label(pr_number: str, label: str):
function major_version (line 142) | def major_version(semver: str) -> int:
function is_breaking_change (line 146) | def is_breaking_change(new_schema_files: set[str], latest_schema_file: s...
function summarize_schema_files (line 155) | def summarize_schema_files(files: list[str]) -> list[str]:
function is_ci (line 159) | def is_ci() -> bool:
function get_pr_changed_files (line 163) | def get_pr_changed_files(pr_number: str) -> list[str]:
function get_pr_labels (line 174) | def get_pr_labels(pr_number: str) -> list[str]:
function filter_to_schema_files (line 185) | def filter_to_schema_files(list_of_files: list[str]) -> list[str]:
function list_json_schema_files (line 194) | def list_json_schema_files() -> list[str]:
function run (line 200) | def run(command: str, **kwargs) -> subprocess.CompletedProcess:
function get_semver (line 208) | def get_semver(input_file: str) -> str:
function sort_json_schema_files (line 212) | def sort_json_schema_files(files: list[str]) -> list[str]:
FILE: .github/scripts/labeler_test.py
class Labeler (line 9) | class Labeler(unittest.TestCase):
method test_major_version (line 11) | def test_major_version(self):
method test_is_breaking_change (line 15) | def test_is_breaking_change(self):
method test_summarize_schema_files (line 24) | def test_summarize_schema_files(self):
method test_is_ci (line 29) | def test_is_ci(self):
method test_get_pr_changed_files (line 34) | def test_get_pr_changed_files(self):
method test_filter_to_schema_files (line 45) | def test_filter_to_schema_files(self):
method test_get_semver (line 55) | def test_get_semver(self):
method test_sort_json_schema_files (line 60) | def test_sort_json_schema_files(self):
FILE: cmd/syft/cli/cli.go
function Application (line 20) | func Application(id clio.Identification) clio.Application {
function Command (line 27) | func Command(id clio.Identification) *cobra.Command {
function create (line 32) | func create(id clio.Identification, out io.Writer) (clio.Application, *c...
function schemaVersion (line 64) | func schemaVersion() (string, any) {
FILE: cmd/syft/cli/ui/handle_attestation.go
type attestLogFrame (line 27) | type attestLogFrame struct
method Init (line 176) | func (l attestLogFrame) Init() tea.Cmd {
method Update (line 193) | func (l attestLogFrame) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
method View (line 214) | func (l attestLogFrame) View() string {
method queueNextTick (line 228) | func (l attestLogFrame) queueNextTick() tea.Cmd {
method handleTick (line 238) | func (l *attestLogFrame) handleTick(msg attestLogFrameTickMsg) tea.Cmd {
type attestLogFrameTickMsg (line 43) | type attestLogFrameTickMsg struct
type backgroundLineReader (line 49) | type backgroundLineReader struct
method read (line 134) | func (l *backgroundLineReader) read(reader io.Reader, stage *progress....
method Lines (line 163) | func (l backgroundLineReader) Lines() []string {
method handleAttestationStarted (line 61) | func (m *Handler) handleAttestationStarted(e partybus.Event) []tea.Model {
function newLogFrame (line 101) | func newLogFrame(reader *backgroundLineReader, prog progress.Progressabl...
function newBackgroundLineReader (line 111) | func newBackgroundLineReader(wg *sync.WaitGroup, reader io.Reader, stage...
FILE: cmd/syft/cli/ui/handle_attestation_test.go
function TestHandler_handleAttestationStarted (line 19) | func TestHandler_handleAttestationStarted(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_cataloger_task.go
type taskModelFactory (line 18) | type taskModelFactory
type catalogerTaskModel (line 22) | type catalogerTaskModel struct
method Init (line 42) | func (cts catalogerTaskModel) Init() tea.Cmd {
method Update (line 46) | func (cts catalogerTaskModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
method View (line 85) | func (cts catalogerTaskModel) View() string {
function newCatalogerTaskTreeModel (line 27) | func newCatalogerTaskTreeModel(f taskModelFactory) *catalogerTaskModel {
type newCatalogerTaskRowEvent (line 37) | type newCatalogerTaskRowEvent struct
method handleCatalogerTaskStarted (line 89) | func (m *Handler) handleCatalogerTaskStarted(e partybus.Event) ([]tea.Mo...
FILE: cmd/syft/cli/ui/handle_cataloger_task_test.go
function TestHandler_handleCatalogerTaskStarted (line 16) | func TestHandler_handleCatalogerTaskStarted(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_fetch_image.go
method handleFetchImage (line 12) | func (m *Handler) handleFetchImage(e partybus.Event) []tea.Model {
FILE: cmd/syft/cli/ui/handle_fetch_image_test.go
function TestHandler_handleFetchImage (line 17) | func TestHandler_handleFetchImage(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_file_indexing.go
method handleFileIndexingStarted (line 12) | func (m *Handler) handleFileIndexingStarted(e partybus.Event) []tea.Model {
FILE: cmd/syft/cli/ui/handle_file_indexing_test.go
function TestHandler_handleFileIndexingStarted (line 17) | func TestHandler_handleFileIndexingStarted(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_pull_containerd_image.go
type containerdPullStatus (line 24) | type containerdPullStatus interface
type containerdPullProgressAdapter (line 30) | type containerdPullProgressAdapter struct
method Size (line 88) | func (d containerdPullProgressAdapter) Size() int64 {
method Current (line 92) | func (d containerdPullProgressAdapter) Current() int64 {
method Error (line 96) | func (d containerdPullProgressAdapter) Error() error {
method Stage (line 104) | func (d containerdPullProgressAdapter) Stage() string {
type containerdPullStatusFormatter (line 35) | type containerdPullStatusFormatter struct
method Render (line 109) | func (f containerdPullStatusFormatter) Render(pullStatus containerdPul...
method formatPullPhase (line 174) | func (f containerdPullStatusFormatter) formatPullPhase(completed bool,...
method layerCap (line 181) | func (f containerdPullStatusFormatter) layerCap(end bool) string {
method handlePullContainerdImage (line 43) | func (m *Handler) handlePullContainerdImage(e partybus.Event) []tea.Model {
function newContainerdPullProgressAdapter (line 71) | func newContainerdPullProgressAdapter(status *containerd.PullStatus) *co...
function newContainerdPullStatusFormatter (line 78) | func newContainerdPullStatusFormatter() containerdPullStatusFormatter {
FILE: cmd/syft/cli/ui/handle_pull_docker_image.go
type dockerPullStatus (line 24) | type dockerPullStatus interface
type dockerPullProgressAdapter (line 30) | type dockerPullProgressAdapter struct
method Size (line 86) | func (d dockerPullProgressAdapter) Size() int64 {
method Current (line 90) | func (d dockerPullProgressAdapter) Current() int64 {
method Error (line 94) | func (d dockerPullProgressAdapter) Error() error {
method Stage (line 102) | func (d dockerPullProgressAdapter) Stage() string {
type dockerPullStatusFormatter (line 35) | type dockerPullStatusFormatter struct
method Render (line 107) | func (f dockerPullStatusFormatter) Render(pullStatus dockerPullStatus)...
method formatDockerPullPhase (line 172) | func (f dockerPullStatusFormatter) formatDockerPullPhase(phase docker....
method layerCap (line 192) | func (f dockerPullStatusFormatter) layerCap(end bool) string {
method handlePullDockerImage (line 44) | func (m *Handler) handlePullDockerImage(e partybus.Event) []tea.Model {
function newDockerPullProgressAdapter (line 68) | func newDockerPullProgressAdapter(status dockerPullStatus) *dockerPullPr...
function newDockerPullStatusFormatter (line 75) | func newDockerPullStatusFormatter() dockerPullStatusFormatter {
FILE: cmd/syft/cli/ui/handle_pull_docker_image_test.go
type mockDockerPullStatus (line 14) | type mockDockerPullStatus struct
method Complete (line 20) | func (m mockDockerPullStatus) Complete() bool {
method Layers (line 24) | func (m mockDockerPullStatus) Layers() []docker.LayerID {
method Current (line 28) | func (m mockDockerPullStatus) Current(id docker.LayerID) docker.LayerS...
function Test_dockerPullStatusFormatter_Render (line 32) | func Test_dockerPullStatusFormatter_Render(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_pull_source.go
method handlePullSourceStarted (line 12) | func (m *Handler) handlePullSourceStarted(e partybus.Event) []tea.Model {
FILE: cmd/syft/cli/ui/handle_pull_source_test.go
function TestHandler_handlePullSourceStarted (line 18) | func TestHandler_handlePullSourceStarted(t *testing.T) {
FILE: cmd/syft/cli/ui/handle_read_image.go
method handleReadImage (line 12) | func (m *Handler) handleReadImage(e partybus.Event) []tea.Model {
FILE: cmd/syft/cli/ui/handle_read_image_test.go
function TestHandler_handleReadImage (line 19) | func TestHandler_handleReadImage(t *testing.T) {
FILE: cmd/syft/cli/ui/handler.go
type HandlerConfig (line 21) | type HandlerConfig struct
type Handler (line 26) | type Handler struct
method OnMessage (line 73) | func (m *Handler) OnMessage(msg tea.Msg) {
method Wait (line 79) | func (m *Handler) Wait() {
function DefaultHandlerConfig (line 36) | func DefaultHandlerConfig() HandlerConfig {
function New (line 42) | func New(cfg HandlerConfig) *Handler {
function simpleHandler (line 67) | func simpleHandler(fn func(partybus.Event) []tea.Model) bubbly.EventHand...
FILE: cmd/syft/cli/ui/new_task_progress.go
method newTaskProgress (line 5) | func (m Handler) newTaskProgress(title taskprogress.Title, opts ...taskp...
FILE: cmd/syft/cli/ui/util_test.go
function runModel (line 11) | func runModel(t testing.TB, m tea.Model, iterations int, message tea.Msg...
function flatten (line 42) | func flatten(ps ...tea.Msg) (msgs []tea.Msg) {
FILE: cmd/syft/internal/clio_setup_config.go
function AppClioSetupConfig (line 16) | func AppClioSetupConfig(id clio.Identification, out io.Writer) *clio.Set...
FILE: cmd/syft/internal/commands/attest.go
constant attestExample (line 33) | attestExample = ` {{.appName}} {{.command}} --output [FORMAT] alpine:la...
constant attestSchemeHelp (line 35) | attestSchemeHelp = "\n " + schemeHelpHeader + "\n" + imageSchemeHelp
constant attestHelp (line 36) | attestHelp = attestExample + attestSchemeHelp
constant cosignBinName (line 37) | cosignBinName = "cosign"
constant jsonFormat (line 38) | jsonFormat = "json"
type attestOptions (line 41) | type attestOptions struct
function Attest (line 50) | func Attest(app clio.Application) *cobra.Command {
function defaultAttestOptions (line 77) | func defaultAttestOptions() attestOptions {
function defaultAttestOutputOptions (line 86) | func defaultAttestOutputOptions() options.Output {
function runAttest (line 102) | func runAttest(ctx context.Context, id clio.Identification, opts *attest...
function writeSBOMToFormattedFile (line 133) | func writeSBOMToFormattedFile(s *sbom.SBOM, sbomFile io.Writer, opts *at...
function createAttestation (line 156) | func createAttestation(sbomFilepath string, opts *attestOptions, userInp...
function attestCommand (line 205) | func attestCommand(sbomFilepath string, opts *attestOptions, userInput s...
function predicateType (line 234) | func predicateType(outputName string) string {
function generateSBOMForAttestation (line 249) | func generateSBOMForAttestation(ctx context.Context, id clio.Identificat...
function commandExists (line 279) | func commandExists(cmd string) bool {
FILE: cmd/syft/internal/commands/attest_test.go
function Test_writeSBOMToFormattedFile (line 27) | func Test_writeSBOMToFormattedFile(t *testing.T) {
function Test_attestCommand (line 101) | func Test_attestCommand(t *testing.T) {
function Test_predicateType (line 199) | func Test_predicateType(t *testing.T) {
function Test_buildSBOMForAttestation (line 236) | func Test_buildSBOMForAttestation(t *testing.T) {
function Test_attestCLIWiring (line 276) | func Test_attestCLIWiring(t *testing.T) {
function hasAttestOpts (line 322) | func hasAttestOpts(wantOpts options.Attest) cliotestutils.AssertionFunc {
FILE: cmd/syft/internal/commands/cataloger.go
function Cataloger (line 11) | func Cataloger(app clio.Application) *cobra.Command {
function isCapabilitiesExperimentEnabled (line 29) | func isCapabilitiesExperimentEnabled() bool {
FILE: cmd/syft/internal/commands/cataloger_info.go
type configFieldInfo (line 36) | type configFieldInfo struct
type configInfo (line 42) | type configInfo struct
type detectorPackageInfo (line 47) | type detectorPackageInfo struct
type patternInfo (line 55) | type patternInfo struct
type catalogerInfo (line 66) | type catalogerInfo struct
type catalogerInfoOptions (line 78) | type catalogerInfoOptions struct
method setNames (line 84) | func (o *catalogerInfoOptions) setNames(args []string) error {
method AddFlags (line 127) | func (o *catalogerInfoOptions) AddFlags(flags clio.FlagSet) {
function defaultCatalogerCapsOptions (line 131) | func defaultCatalogerCapsOptions() *catalogerInfoOptions {
function CatalogerCaps (line 140) | func CatalogerCaps(app clio.Application) *cobra.Command {
function runCatalogerInfo (line 158) | func runCatalogerInfo(opts *catalogerInfoOptions) error {
function filterCatalogersByName (line 181) | func filterCatalogersByName(catalogers []capabilities.CatalogerEntry, na...
function catalogerInfoReport (line 196) | func catalogerInfoReport(opts *catalogerInfoOptions, doc *capabilities.D...
function renderCatalogerInfoJSON (line 207) | func renderCatalogerInfoJSON(doc *capabilities.Document, catalogers []ca...
function isDeprecatedCataloger (line 250) | func isDeprecatedCataloger(selectors []string) bool {
function convertDetectorPackages (line 260) | func convertDetectorPackages(pkgs []capabilities.DetectorPackageInfo) []...
function convertParsersToPatterns (line 275) | func convertParsersToPatterns(parsers []capabilities.Parser) []patternIn...
function convertDetectorsToPatterns (line 293) | func convertDetectorsToPatterns(detectors []capabilities.Detector, packa...
function getConfigInfoFromDocument (line 310) | func getConfigInfoFromDocument(doc *capabilities.Document, configType st...
function renderCatalogerInfoTable (line 331) | func renderCatalogerInfoTable(_ *capabilities.Document, catalogers []cap...
function buildTableRowFromCapabilities (line 392) | func buildTableRowFromCapabilities(ecosystem, name, criteria string, cap...
function extractBoolCapability (line 417) | func extractBoolCapability(caps capabilities.CapabilitySet, name string)...
function extractStringCapability (line 433) | func extractStringCapability(caps capabilities.CapabilitySet, name strin...
function extractArrayCapability (line 446) | func extractArrayCapability(caps capabilities.CapabilitySet, name string...
function extractNodesCapability (line 472) | func extractNodesCapability(caps capabilities.CapabilitySet) string {
function formatDepthStringArray (line 488) | func formatDepthStringArray(v []string) string {
function formatDepthInterfaceArray (line 499) | func formatDepthInterfaceArray(v []interface{}) string {
function hasBothDirectAndIndirect (line 514) | func hasBothDirectAndIndirect(items []string) bool {
function formatCriteria (line 528) | func formatCriteria(detectors []capabilities.Detector) string {
FILE: cmd/syft/internal/commands/cataloger_info_test.go
function Test_isDeprecatedCataloger (line 14) | func Test_isDeprecatedCataloger(t *testing.T) {
function Test_hasBothDirectAndIndirect (line 50) | func Test_hasBothDirectAndIndirect(t *testing.T) {
function Test_filterCatalogersByName (line 96) | func Test_filterCatalogersByName(t *testing.T) {
function Test_formatCriteria (line 159) | func Test_formatCriteria(t *testing.T) {
function testDocument (line 234) | func testDocument() *capabilities.Document {
function Test_catalogerInfoReport (line 246) | func Test_catalogerInfoReport(t *testing.T) {
function Test_formatCriteria_wordWrapping (line 353) | func Test_formatCriteria_wordWrapping(t *testing.T) {
FILE: cmd/syft/internal/commands/cataloger_list.go
type catalogerListOptions (line 31) | type catalogerListOptions struct
method AddFlags (line 37) | func (o *catalogerListOptions) AddFlags(flags clio.FlagSet) {
function defaultCatalogerListOptions (line 43) | func defaultCatalogerListOptions() *catalogerListOptions {
function CatalogerList (line 52) | func CatalogerList(app clio.Application) *cobra.Command {
function runCatalogerList (line 65) | func runCatalogerList(opts *catalogerListOptions) error {
function catalogerListReport (line 88) | func catalogerListReport(opts *catalogerListOptions, allTaskGroups [][]t...
function flattenTaskGroups (line 120) | func flattenTaskGroups(taskGroups [][]task.Task) []task.Task {
function renderCatalogerListJSON (line 128) | func renderCatalogerListJSON(tasks []task.Task, selection task.Selection...
function renderCatalogerListTables (line 188) | func renderCatalogerListTables(taskGroups [][]task.Task, selection task....
function renderCatalogerListTable (line 230) | func renderCatalogerListTable(tasks []task.Task, selection task.Selectio...
function formatRow (line 256) | func formatRow(name string, tags []string, selection task.Selection) tab...
function formatToken (line 284) | func formatToken(token string, selection *task.TokenSelection, included ...
function extractTaskInfo (line 307) | func extractTaskInfo(tasks []task.Task) ([]string, map[string][]string) {
FILE: cmd/syft/internal/commands/cataloger_list_test.go
type dummyTask (line 22) | type dummyTask struct
method HasAllSelectors (line 27) | func (d dummyTask) HasAllSelectors(s ...string) bool {
method Selectors (line 31) | func (d dummyTask) Selectors() []string {
method Name (line 35) | func (d dummyTask) Name() string {
method Execute (line 39) | func (d dummyTask) Execute(_ context.Context, _ file.Resolver, _ sboms...
function testTasks (line 43) | func testTasks() [][]task.Task {
function Test_catalogerListReport (line 76) | func Test_catalogerListReport(t *testing.T) {
FILE: cmd/syft/internal/commands/commands_test.go
function TestMain (line 11) | func TestMain(m *testing.M) {
FILE: cmd/syft/internal/commands/convert.go
constant convertExample (line 19) | convertExample = ` {{.appName}} {{.command}} img.syft.json -o spdx-json...
type ConvertOptions (line 25) | type ConvertOptions struct
function Convert (line 31) | func Convert(app clio.Application) *cobra.Command {
function validateConvertArgs (line 58) | func validateConvertArgs(cmd *cobra.Command, args []string) error {
function RunConvert (line 62) | func RunConvert(opts *ConvertOptions, userInput string) error {
FILE: cmd/syft/internal/commands/packages.go
function Packages (line 11) | func Packages(app clio.Application, scanCmd *cobra.Command) *cobra.Comma...
FILE: cmd/syft/internal/commands/packages_test.go
function Test_filterExpressionErrors_expressionErrorsHelp (line 14) | func Test_filterExpressionErrors_expressionErrorsHelp(t *testing.T) {
function Test_expressionSuggestions (line 216) | func Test_expressionSuggestions(t *testing.T) {
FILE: cmd/syft/internal/commands/root.go
function Root (line 12) | func Root(app clio.Application, packagesCmd *cobra.Command) *cobra.Comma...
FILE: cmd/syft/internal/commands/scan.go
constant scanExample (line 34) | scanExample = ` {{.appName}} {{.command}} alpine:latest ...
constant schemeHelpHeader (line 50) | schemeHelpHeader = "You can also explicitly specify the scheme to use:"
constant imageSchemeHelp (line 51) | imageSchemeHelp = ` {{.appName}} {{.command}} docker:yourrepo/yourim...
constant nonImageSchemeHelp (line 59) | nonImageSchemeHelp = ` {{.appName}} {{.command}} dir:path/to/yourproj...
constant modelSchemeHelp (line 62) | modelSchemeHelp = ` {{.appName}} {{.command}} oci-model-registry:ai/l...
constant scanSchemeHelp (line 64) | scanSchemeHelp = "\n " + schemeHelpHeader + "\n" + imageSchemeHelp + mo...
constant scanHelp (line 66) | scanHelp = scanExample + scanSchemeHelp
type scanOptions (line 69) | type scanOptions struct
method PostLoad (line 110) | func (o *scanOptions) PostLoad() error {
method validateLegacyOptionsNotUsed (line 114) | func (o *scanOptions) validateLegacyOptionsNotUsed() error {
function defaultScanOptions (line 77) | func defaultScanOptions() *scanOptions {
function Scan (line 86) | func Scan(app clio.Application) *cobra.Command {
function validateScanArgs (line 157) | func validateScanArgs(cmd *cobra.Command, args []string) error {
function validateArgs (line 161) | func validateArgs(cmd *cobra.Command, args []string, err string) error {
function runScan (line 173) | func runScan(ctx context.Context, id clio.Identification, opts *scanOpti...
function getSource (line 218) | func getSource(ctx context.Context, opts *options.Catalog, userInput str...
function generateSBOM (line 260) | func generateSBOM(ctx context.Context, id clio.Identification, src sourc...
function filterExpressionErrors (line 270) | func filterExpressionErrors(err error) []task.ErrInvalidExpression {
function processErrors (line 281) | func processErrors(err error) []task.ErrInvalidExpression {
function notifyExpressionErrors (line 305) | func notifyExpressionErrors(expErrs []task.ErrInvalidExpression) {
function expressionErrorsHelp (line 314) | func expressionErrorsHelp(expErrs []task.ErrInvalidExpression) string {
constant expressionHelpTemplate (line 344) | expressionHelpTemplate = " ❖ Given expression %q\n%s%s"
function expressionSuggetions (line 346) | func expressionSuggetions(expErr task.ErrInvalidExpression) string {
function indentMsg (line 363) | func indentMsg(msg string) string {
function getExpression (line 376) | func getExpression(expErr task.ErrInvalidExpression) string {
function getExplanation (line 384) | func getExplanation(expErr task.ErrInvalidExpression) string {
function getHintPhrase (line 422) | func getHintPhrase(expErr task.ErrInvalidExpression) string {
function trimOperation (line 446) | func trimOperation(x string) string {
function allSourceProviderTags (line 450) | func allSourceProviderTags() []string {
FILE: cmd/syft/internal/commands/scan_test.go
function Test_scanOptions_validateLegacyOptionsNotUsed (line 11) | func Test_scanOptions_validateLegacyOptionsNotUsed(t *testing.T) {
function assertErrorContains (line 62) | func assertErrorContains(contains string) assert.ErrorAssertionFunc {
FILE: cmd/syft/internal/commands/update.go
function applicationUpdateCheck (line 30) | func applicationUpdateCheck(id clio.Identification, check *options.Updat...
function checkForApplicationUpdate (line 39) | func checkForApplicationUpdate(id clio.Identification) {
function isUpdateAvailable (line 62) | func isUpdateAvailable(id clio.Identification) (bool, string, error) {
function isProductionBuild (line 85) | func isProductionBuild(version string) bool {
function fetchLatestApplicationVersion (line 92) | func fetchLatestApplicationVersion(id clio.Identification) (*hashiVersio...
FILE: cmd/syft/internal/commands/update_test.go
function TestIsUpdateAvailable (line 13) | func TestIsUpdateAvailable(t *testing.T) {
function TestFetchLatestApplicationVersion (line 140) | func TestFetchLatestApplicationVersion(t *testing.T) {
FILE: cmd/syft/internal/commands/utils.go
function disableUI (line 12) | func disableUI(app clio.Application, out io.Writer) func(*cobra.Command,...
FILE: cmd/syft/internal/constants.go
constant NotProvided (line 4) | NotProvided = "[not provided]"
FILE: cmd/syft/internal/options/attest.go
type Attest (line 9) | type Attest struct
method AddFlags (line 20) | func (o *Attest) AddFlags(flags clio.FlagSet) {
method DescribeFields (line 24) | func (o *Attest) DescribeFields(descriptions clio.FieldDescriptionSet) {
FILE: cmd/syft/internal/options/cache.go
type Cache (line 21) | type Cache struct
method DescribeFields (line 26) | func (c *Cache) DescribeFields(descriptions clio.FieldDescriptionSet) {
method PostLoad (line 31) | func (c *Cache) PostLoad() error {
function DefaultCache (line 68) | func DefaultCache() Cache {
function defaultTTL (line 75) | func defaultTTL() time.Duration {
function defaultDir (line 79) | func defaultDir() string {
function durationToString (line 95) | func durationToString(duration time.Duration) string {
function parseDuration (line 111) | func parseDuration(duration string) (time.Duration, error) {
FILE: cmd/syft/internal/options/cache_test.go
function Test_defaultDir (line 19) | func Test_defaultDir(t *testing.T) {
function Test_cacheOptions (line 76) | func Test_cacheOptions(t *testing.T) {
function Test_parseDuration (line 183) | func Test_parseDuration(t *testing.T) {
function Test_durationToString (line 257) | func Test_durationToString(t *testing.T) {
function restoreCache (line 294) | func restoreCache(t testing.TB) {
function patchEnv (line 305) | func patchEnv(t testing.TB, key, value string) {
FILE: cmd/syft/internal/options/catalog.go
type Catalog (line 32) | type Catalog struct
method ToSBOMConfig (line 93) | func (cfg Catalog) ToSBOMConfig(id clio.Identification) *syft.CreateSB...
method ToSearchConfig (line 111) | func (cfg Catalog) ToSearchConfig() cataloging.SearchConfig {
method ToRelationshipsConfig (line 117) | func (cfg Catalog) ToRelationshipsConfig() cataloging.RelationshipsCon...
method ToComplianceConfig (line 126) | func (cfg Catalog) ToComplianceConfig() cataloging.ComplianceConfig {
method ToUnknownsConfig (line 133) | func (cfg Catalog) ToUnknownsConfig() cataloging.UnknownsConfig {
method ToFilesConfig (line 140) | func (cfg Catalog) ToFilesConfig() filecataloging.Config {
method ToLicenseConfig (line 160) | func (cfg Catalog) ToLicenseConfig() cataloging.LicenseConfig {
method ToPackagesConfig (line 167) | func (cfg Catalog) ToPackagesConfig() pkgcataloging.Config {
method AddFlags (line 217) | func (cfg *Catalog) AddFlags(flags clio.FlagSet) {
method DescribeFields (line 253) | func (cfg *Catalog) DescribeFields(descriptions fangs.FieldDescription...
method PostLoad (line 262) | func (cfg *Catalog) PostLoad() error {
function DefaultCatalog (line 71) | func DefaultCatalog() Catalog {
function Flatten (line 279) | func Flatten(commaSeparatedEntries []string) []string {
function FlattenAndSort (line 289) | func FlattenAndSort(commaSeparatedEntries []string) []string {
function enrichmentEnabled (line 303) | func enrichmentEnabled(enrichDirectives []string, features ...string) *b...
function ptr (line 346) | func ptr[T any](val T) *T {
FILE: cmd/syft/internal/options/catalog_test.go
function TestCatalog_PostLoad (line 10) | func TestCatalog_PostLoad(t *testing.T) {
function TestFlatten (line 39) | func TestFlatten(t *testing.T) {
function TestFlattenAndSort (line 85) | func TestFlattenAndSort(t *testing.T) {
function Test_enrichmentEnabled (line 131) | func Test_enrichmentEnabled(t *testing.T) {
FILE: cmd/syft/internal/options/cataloger_selection.go
type CatalogerSelection (line 10) | type CatalogerSelection struct
method AddFlags (line 22) | func (cfg *CatalogerSelection) AddFlags(flags clio.FlagSet) {
method PostLoad (line 41) | func (cfg *CatalogerSelection) PostLoad() error {
FILE: cmd/syft/internal/options/cataloger_selection_test.go
function TestCatalogerSelection_PostLoad (line 10) | func TestCatalogerSelection_PostLoad(t *testing.T) {
FILE: cmd/syft/internal/options/compliance.go
type complianceConfig (line 13) | type complianceConfig struct
method DescribeFields (line 26) | func (r *complianceConfig) DescribeFields(descriptions fangs.FieldDesc...
method PostLoad (line 31) | func (r *complianceConfig) PostLoad() error {
function defaultComplianceConfig (line 18) | func defaultComplianceConfig() complianceConfig {
FILE: cmd/syft/internal/options/config.go
type Config (line 6) | type Config struct
method DescribeFields (line 10) | func (cfg *Config) DescribeFields(descriptions fangs.FieldDescriptionS...
FILE: cmd/syft/internal/options/dotnet.go
type dotnetConfig (line 8) | type dotnetConfig struct
method DescribeFields (line 24) | func (o *dotnetConfig) DescribeFields(descriptions clio.FieldDescripti...
function defaultDotnetConfig (line 32) | func defaultDotnetConfig() dotnetConfig {
FILE: cmd/syft/internal/options/file.go
type fileConfig (line 14) | type fileConfig struct
method PostLoad (line 54) | func (c *fileConfig) PostLoad() error {
method DescribeFields (line 66) | func (c *fileConfig) DescribeFields(descriptions clio.FieldDescription...
type fileMetadata (line 20) | type fileMetadata struct
type fileContent (line 25) | type fileContent struct
type fileExecutable (line 30) | type fileExecutable struct
function defaultFileConfig (line 34) | func defaultFileConfig() fileConfig {
FILE: cmd/syft/internal/options/file_test.go
function Test_fileConfig_PostLoad (line 11) | func Test_fileConfig_PostLoad(t *testing.T) {
FILE: cmd/syft/internal/options/format.go
type Format (line 16) | type Format struct
method PostLoad (line 25) | func (o *Format) PostLoad() error {
method DescribeFields (line 34) | func (o *Format) DescribeFields(descriptions clio.FieldDescriptionSet) {
method Encoders (line 71) | func (o Format) Encoders() ([]sbom.FormatEncoder, error) {
function DefaultFormat (line 61) | func DefaultFormat() Format {
function multiLevelOption (line 82) | func multiLevelOption[T any](defaultValue T, option ...*T) *T {
FILE: cmd/syft/internal/options/format_cyclonedx_json.go
type FormatCyclonedxJSON (line 7) | type FormatCyclonedxJSON struct
method config (line 15) | func (o FormatCyclonedxJSON) config(version string) cyclonedxjson.Enco...
function DefaultFormatCyclonedxJSON (line 11) | func DefaultFormatCyclonedxJSON() FormatCyclonedxJSON {
FILE: cmd/syft/internal/options/format_cyclonedx_json_test.go
function TestFormatCyclonedxJSON_buildConfig (line 10) | func TestFormatCyclonedxJSON_buildConfig(t *testing.T) {
function setAllToNonZero (line 20) | func setAllToNonZero(t testing.TB, structPtr any) any {
function getNonZeroExampleValue (line 35) | func getNonZeroExampleValue(t testing.TB, v any, name string) any {
function assertExpectedValue (line 49) | func assertExpectedValue(t *testing.T, structTy any) {
FILE: cmd/syft/internal/options/format_cyclonedx_xml.go
type FormatCyclonedxXML (line 7) | type FormatCyclonedxXML struct
method config (line 15) | func (o FormatCyclonedxXML) config(version string) cyclonedxxml.Encode...
function DefaultFormatCyclonedxXML (line 11) | func DefaultFormatCyclonedxXML() FormatCyclonedxXML {
FILE: cmd/syft/internal/options/format_cyclonedx_xml_test.go
function TestFormatCyclonedxXML_buildConfig (line 7) | func TestFormatCyclonedxXML_buildConfig(t *testing.T) {
FILE: cmd/syft/internal/options/format_spdx_json.go
type FormatSPDXJSON (line 7) | type FormatSPDXJSON struct
method config (line 15) | func (o FormatSPDXJSON) config(v string) spdxjson.EncoderConfig {
function DefaultFormatSPDXJSON (line 11) | func DefaultFormatSPDXJSON() FormatSPDXJSON {
FILE: cmd/syft/internal/options/format_spdx_json_test.go
function TestFormatSPDXJSON_buildConfig (line 7) | func TestFormatSPDXJSON_buildConfig(t *testing.T) {
FILE: cmd/syft/internal/options/format_syft_json.go
type FormatSyftJSON (line 7) | type FormatSyftJSON struct
method config (line 18) | func (o FormatSyftJSON) config() syftjson.EncoderConfig {
function DefaultFormatJSON (line 12) | func DefaultFormatJSON() FormatSyftJSON {
FILE: cmd/syft/internal/options/format_syft_json_test.go
function TestFormatSyftJSON_buildConfig (line 7) | func TestFormatSyftJSON_buildConfig(t *testing.T) {
FILE: cmd/syft/internal/options/format_template.go
type FormatTemplate (line 10) | type FormatTemplate struct
method AddFlags (line 22) | func (o *FormatTemplate) AddFlags(flags clio.FlagSet) {
method config (line 29) | func (o FormatTemplate) config() template.EncoderConfig {
function DefaultFormatTemplate (line 16) | func DefaultFormatTemplate() FormatTemplate {
FILE: cmd/syft/internal/options/golang.go
type golangConfig (line 10) | type golangConfig struct
method DescribeFields (line 26) | func (o *golangConfig) DescribeFields(descriptions clio.FieldDescripti...
type golangMainModuleVersionConfig (line 48) | type golangMainModuleVersionConfig struct
function defaultGolangConfig (line 54) | func defaultGolangConfig() golangConfig {
FILE: cmd/syft/internal/options/java.go
type javaConfig (line 8) | type javaConfig struct
method DescribeFields (line 34) | func (o *javaConfig) DescribeFields(descriptions clio.FieldDescription...
function defaultJavaConfig (line 17) | func defaultJavaConfig() javaConfig {
FILE: cmd/syft/internal/options/javascript.go
type javaScriptConfig (line 8) | type javaScriptConfig struct
method DescribeFields (line 36) | func (o *javaScriptConfig) DescribeFields(descriptions clio.FieldDescr...
function defaultJavaScriptConfig (line 18) | func defaultJavaScriptConfig() javaScriptConfig {
FILE: cmd/syft/internal/options/license.go
type licenseConfig (line 11) | type licenseConfig struct
method DescribeFields (line 21) | func (o *licenseConfig) DescribeFields(descriptions clio.FieldDescript...
method PostLoad (line 28) | func (o *licenseConfig) PostLoad() error {
function defaultLicenseConfig (line 36) | func defaultLicenseConfig() licenseConfig {
FILE: cmd/syft/internal/options/linux_kernel.go
type linuxKernelConfig (line 8) | type linuxKernelConfig struct
method DescribeFields (line 23) | func (o *linuxKernelConfig) DescribeFields(descriptions clio.FieldDesc...
function defaultLinuxKernelConfig (line 12) | func defaultLinuxKernelConfig() linuxKernelConfig {
FILE: cmd/syft/internal/options/nix.go
type nixConfig (line 8) | type nixConfig struct
method DescribeFields (line 23) | func (o *nixConfig) DescribeFields(descriptions clio.FieldDescriptionS...
function defaultNixConfig (line 12) | func defaultNixConfig() nixConfig {
FILE: cmd/syft/internal/options/output.go
type Output (line 32) | type Output struct
method PostLoad (line 53) | func (o *Output) PostLoad() error {
method AddFlags (line 64) | func (o *Output) AddFlags(flags clio.FlagSet) {
method DescribeFields (line 75) | func (o *Output) DescribeFields(descriptions clio.FieldDescriptionSet) {
method SBOMWriter (line 84) | func (o Output) SBOMWriter() (sbom.Writer, error) {
method OutputNameSet (line 113) | func (o Output) OutputNameSet() *strset.Set {
function DefaultOutput (line 41) | func DefaultOutput() Output {
function supportedIDs (line 123) | func supportedIDs() []sbom.FormatID {
FILE: cmd/syft/internal/options/output_file.go
type OutputFile (line 18) | type OutputFile struct
method AddFlags (line 23) | func (o *OutputFile) AddFlags(flags clio.FlagSet) {
method PostLoad (line 35) | func (o *OutputFile) PostLoad() error {
method SBOMWriter (line 49) | func (o *OutputFile) SBOMWriter(f sbom.FormatEncoder) (sbom.Writer, er...
function expandFilePath (line 61) | func expandFilePath(file string) (string, error) {
FILE: cmd/syft/internal/options/output_test.go
function Test_getEncoders (line 23) | func Test_getEncoders(t *testing.T) {
function Test_EncoderCollection_ByString_IDOnly_Defaults (line 45) | func Test_EncoderCollection_ByString_IDOnly_Defaults(t *testing.T) {
function Test_OutputHonorsAllowFile (line 183) | func Test_OutputHonorsAllowFile(t *testing.T) {
FILE: cmd/syft/internal/options/pkg.go
type packageConfig (line 8) | type packageConfig struct
method DescribeFields (line 18) | func (o *packageConfig) DescribeFields(descriptions clio.FieldDescript...
function defaultPackageConfig (line 28) | func defaultPackageConfig() packageConfig {
FILE: cmd/syft/internal/options/python.go
type pythonConfig (line 8) | type pythonConfig struct
method DescribeFields (line 25) | func (o *pythonConfig) DescribeFields(descriptions clio.FieldDescripti...
function defaultPythonConfig (line 18) | func defaultPythonConfig() pythonConfig {
FILE: cmd/syft/internal/options/registry.go
type RegistryCredentials (line 10) | type RegistryCredentials struct
type registryConfig (line 21) | type registryConfig struct
method PostLoad (line 33) | func (cfg *registryConfig) PostLoad() error {
method DescribeFields (line 61) | func (cfg *registryConfig) DescribeFields(descriptions clio.FieldDescr...
method ToOptions (line 82) | func (cfg *registryConfig) ToOptions() *image.RegistryOptions {
function hasNonEmptyCredentials (line 75) | func hasNonEmptyCredentials(username, password, token, tlsCert, tlsKey s...
FILE: cmd/syft/internal/options/registry_test.go
function TestHasNonEmptyCredentials (line 12) | func TestHasNonEmptyCredentials(t *testing.T) {
function Test_registry_ToOptions (line 72) | func Test_registry_ToOptions(t *testing.T) {
FILE: cmd/syft/internal/options/relationships.go
type relationshipsConfig (line 7) | type relationshipsConfig struct
method DescribeFields (line 19) | func (r *relationshipsConfig) DescribeFields(descriptions fangs.FieldD...
function defaultRelationshipsConfig (line 12) | func defaultRelationshipsConfig() relationshipsConfig {
FILE: cmd/syft/internal/options/secret.go
type secret (line 10) | type secret
method PostLoad (line 18) | func (r *secret) PostLoad() error {
method String (line 23) | func (r secret) String() string {
FILE: cmd/syft/internal/options/source.go
type sourceConfig (line 16) | type sourceConfig struct
method DescribeFields (line 36) | func (o *sourceConfig) DescribeFields(descriptions clio.FieldDescripti...
type fileSource (line 26) | type fileSource struct
method PostLoad (line 59) | func (c *fileSource) PostLoad() error {
type imageSource (line 42) | type imageSource struct
method PostLoad (line 66) | func (c *imageSource) PostLoad() error {
function defaultSourceConfig (line 47) | func defaultSourceConfig() sourceConfig {
function checkDefaultSourceValues (line 79) | func checkDefaultSourceValues(source string) error {
FILE: cmd/syft/internal/options/source_test.go
function Test_fileSource_PostLoad (line 9) | func Test_fileSource_PostLoad(t *testing.T) {
FILE: cmd/syft/internal/options/unknowns.go
type unknownsConfig (line 8) | type unknownsConfig struct
method DescribeFields (line 18) | func (o *unknownsConfig) DescribeFields(descriptions clio.FieldDescrip...
function defaultUnknowns (line 24) | func defaultUnknowns() unknownsConfig {
FILE: cmd/syft/internal/options/update_check.go
type UpdateCheck (line 5) | type UpdateCheck struct
method DescribeFields (line 15) | func (cfg *UpdateCheck) DescribeFields(descriptions fangs.FieldDescrip...
function DefaultUpdateCheck (line 9) | func DefaultUpdateCheck() UpdateCheck {
FILE: cmd/syft/internal/options/writer.go
function makeSBOMWriter (line 32) | func makeSBOMWriter(outputs []string, defaultFile string, encoders []sbo...
function parseSBOMOutputFlags (line 47) | func parseSBOMOutputFlags(outputs []string, defaultFile string, encoders...
function formatVersionOptions (line 96) | func formatVersionOptions(nameVersionPairs []string) string {
type sbomWriterDescription (line 137) | type sbomWriterDescription struct
function newSBOMWriterDescription (line 142) | func newSBOMWriterDescription(f sbom.FormatEncoder, p string) sbomWriter...
type sbomMultiWriter (line 156) | type sbomMultiWriter struct
method Write (line 203) | func (m *sbomMultiWriter) Write(s sbom.SBOM) (errs error) {
function newSBOMMultiWriter (line 161) | func newSBOMMultiWriter(options ...sbomWriterDescription) (_ *sbomMultiW...
type sbomStreamWriter (line 214) | type sbomStreamWriter struct
method Write (line 220) | func (w *sbomStreamWriter) Write(s sbom.SBOM) error {
method Close (line 226) | func (w *sbomStreamWriter) Close() error {
type sbomPublisher (line 234) | type sbomPublisher struct
method Write (line 239) | func (w *sbomPublisher) Write(s sbom.SBOM) error {
FILE: cmd/syft/internal/options/writer_test.go
function Test_MakeSBOMWriter (line 16) | func Test_MakeSBOMWriter(t *testing.T) {
function dummyFormat (line 53) | func dummyFormat(name string) sbom.FormatEncoder {
type dummyEncoder (line 59) | type dummyEncoder struct
method ID (line 63) | func (d dummyEncoder) ID() sbom.FormatID {
method Aliases (line 67) | func (d dummyEncoder) Aliases() []string {
method Version (line 71) | func (d dummyEncoder) Version() string {
method Encode (line 75) | func (d dummyEncoder) Encode(writer io.Writer, s sbom.SBOM) error {
function Test_newSBOMMultiWriter (line 79) | func Test_newSBOMMultiWriter(t *testing.T) {
function Test_newSBOMWriterDescription (line 230) | func Test_newSBOMWriterDescription(t *testing.T) {
function Test_formatVersionOptions (line 262) | func Test_formatVersionOptions(t *testing.T) {
FILE: cmd/syft/internal/test/integration/all_layers_squashed_comparison_test.go
function Test_AllLayersIncludesSquashed (line 9) | func Test_AllLayersIncludesSquashed(t *testing.T) {
FILE: cmd/syft/internal/test/integration/catalog_packages_cases_test.go
type testCase (line 5) | type testCase struct
FILE: cmd/syft/internal/test/integration/catalog_packages_test.go
function BenchmarkImagePackageCatalogers (line 19) | func BenchmarkImagePackageCatalogers(b *testing.B) {
function TestPkgCoverageImage (line 40) | func TestPkgCoverageImage(t *testing.T) {
function TestPkgCoverageDirectory (line 127) | func TestPkgCoverageDirectory(t *testing.T) {
function assertPackages (line 180) | func assertPackages(t *testing.T, sbom sbom.SBOM, test testCase, observe...
function TestPkgCoverageImage_HasEvidence (line 235) | func TestPkgCoverageImage_HasEvidence(t *testing.T) {
function TestPkgCoverageDirectory_HasEvidence (line 263) | func TestPkgCoverageDirectory_HasEvidence(t *testing.T) {
FILE: cmd/syft/internal/test/integration/distro_test.go
function TestDistroImage (line 12) | func TestDistroImage(t *testing.T) {
FILE: cmd/syft/internal/test/integration/encode_decode_cycle_test.go
function TestEncodeDecodeEncodeCycleComparison (line 27) | func TestEncodeDecodeEncodeCycleComparison(t *testing.T) {
FILE: cmd/syft/internal/test/integration/files_test.go
function TestFileCataloging_Default (line 22) | func TestFileCataloging_Default(t *testing.T) {
function TestFileCataloging_AllFiles (line 36) | func TestFileCataloging_AllFiles(t *testing.T) {
function assertFileData (line 120) | func assertFileData(t testing.TB, metadata map[file.Coordinates]file.Met...
FILE: cmd/syft/internal/test/integration/go_compiler_detection_test.go
function TestGolangCompilerDetection (line 10) | func TestGolangCompilerDetection(t *testing.T) {
FILE: cmd/syft/internal/test/integration/java_purl_test.go
function TestJavaPURLs (line 12) | func TestJavaPURLs(t *testing.T) {
FILE: cmd/syft/internal/test/integration/mariner_distroless_test.go
function TestMarinerDistroless (line 10) | func TestMarinerDistroless(t *testing.T) {
FILE: cmd/syft/internal/test/integration/node_packages_test.go
function TestNpmPackageLockDirectory (line 13) | func TestNpmPackageLockDirectory(t *testing.T) {
function TestYarnPackageLockDirectory (line 34) | func TestYarnPackageLockDirectory(t *testing.T) {
FILE: cmd/syft/internal/test/integration/package_binary_elf_relationships_test.go
function TestBinaryElfRelationships (line 13) | func TestBinaryElfRelationships(t *testing.T) {
FILE: cmd/syft/internal/test/integration/package_cataloger_convention_test.go
function Test_packageCatalogerExports (line 21) | func Test_packageCatalogerExports(t *testing.T) {
function Test_validatePackageCatalogerExport (line 41) | func Test_validatePackageCatalogerExport(t *testing.T) {
function Test_PackageCatalogerConventions (line 133) | func Test_PackageCatalogerConventions(t *testing.T) {
function validatePackageCatalogerExport (line 171) | func validatePackageCatalogerExport(t *testing.T, pkg string, export exp...
type exportToken (line 210) | type exportToken struct
method isFunction (line 217) | func (e exportToken) isFunction() bool {
method isStruct (line 221) | func (e exportToken) isStruct() bool {
type exportTokenSet (line 225) | type exportTokenSet
method Names (line 227) | func (s exportTokenSet) Names() *strset.Set {
method Has (line 235) | func (s exportTokenSet) Has(name string) bool {
method Add (line 240) | func (s exportTokenSet) Add(tokens ...exportToken) {
method Remove (line 249) | func (s exportTokenSet) Remove(names ...string) {
method List (line 255) | func (s exportTokenSet) List() []exportToken {
function packageCatalogerExports (line 263) | func packageCatalogerExports(t *testing.T) map[string]exportTokenSet {
FILE: cmd/syft/internal/test/integration/package_catalogers_represented_test.go
function TestAllPackageCatalogersReachableInTasks (line 22) | func TestAllPackageCatalogersReachableInTasks(t *testing.T) {
function TestAllPackageCatalogersRepresentedInSource (line 76) | func TestAllPackageCatalogersRepresentedInSource(t *testing.T) {
function getCatalogerConstructors (line 92) | func getCatalogerConstructors(t *testing.T) map[string]*strset.Set {
function getConstructorsFromExpectedFile (line 126) | func getConstructorsFromExpectedFile(t *testing.T, path string, info os....
function getCatalogerConstructorsFromPackage (line 150) | func getCatalogerConstructorsFromPackage(t *testing.T, path string, info...
function assertAllPackageCatalogersRepresented (line 174) | func assertAllPackageCatalogersRepresented(t *testing.T, constructorsPer...
function repoRoot (line 192) | func repoRoot(t testing.TB) string {
function mergeConstructors (line 205) | func mergeConstructors(constructorsPerPackage map[string]*strset.Set, pa...
FILE: cmd/syft/internal/test/integration/package_deduplication_test.go
function TestPackageDeduplication (line 12) | func TestPackageDeduplication(t *testing.T) {
FILE: cmd/syft/internal/test/integration/package_ownership_relationship_test.go
function TestPackageOwnershipRelationships (line 16) | func TestPackageOwnershipRelationships(t *testing.T) {
function TestPackageOwnershipExclusions (line 49) | func TestPackageOwnershipExclusions(t *testing.T) {
FILE: cmd/syft/internal/test/integration/regression_apk_scanner_buffer_size_test.go
function TestRegression212ApkBufferSize (line 10) | func TestRegression212ApkBufferSize(t *testing.T) {
FILE: cmd/syft/internal/test/integration/regression_go_bin_scanner_arch_test.go
function TestRegressionGoArchDiscovery (line 11) | func TestRegressionGoArchDiscovery(t *testing.T) {
FILE: cmd/syft/internal/test/integration/regression_java_no_main_package_test.go
function TestRegressionJavaNoMainPackage (line 9) | func TestRegressionJavaNoMainPackage(t *testing.T) { // Regression: http...
FILE: cmd/syft/internal/test/integration/regression_java_virtualpath_test.go
function TestWarCatalogedCorrectlyIfRenamed (line 13) | func TestWarCatalogedCorrectlyIfRenamed(t *testing.T) {
FILE: cmd/syft/internal/test/integration/regression_photon_package_test.go
function TestPhotonPackageRegression (line 12) | func TestPhotonPackageRegression(t *testing.T) { // Regression: https://...
FILE: cmd/syft/internal/test/integration/regression_sbom_duplicate_relationships_test.go
function TestRelationshipsUnique (line 12) | func TestRelationshipsUnique(t *testing.T) {
FILE: cmd/syft/internal/test/integration/rust_audit_binary_test.go
function TestRustAudit (line 10) | func TestRustAudit(t *testing.T) {
FILE: cmd/syft/internal/test/integration/sbom_cataloger_test.go
function TestSbomCataloger (line 11) | func TestSbomCataloger(t *testing.T) {
FILE: cmd/syft/internal/test/integration/sbom_metadata_component_test.go
function TestSbomMetadataComponent (line 11) | func TestSbomMetadataComponent(t *testing.T) {
FILE: cmd/syft/internal/test/integration/sqlite_rpmdb_test.go
function TestSqliteRpm (line 12) | func TestSqliteRpm(t *testing.T) {
FILE: cmd/syft/internal/test/integration/testdata/image-go-bin-arch-coverage/app.go
function main (line 14) | func main() {
FILE: cmd/syft/internal/test/integration/testdata/image-java-virtualpath-regression/extract.py
function slim_archive (line 9) | def slim_archive(archive, output_dir, base_path="", archive_name=""):
function walk_directory_and_slim_jars (line 50) | def walk_directory_and_slim_jars(base_dir, output_dir):
FILE: cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/python/setup/setup.py
function main (line 19) | def main():
FILE: cmd/syft/internal/test/integration/testdata/image-test-java-purls/extract.py
function slim_archive (line 9) | def slim_archive(archive, output_dir, base_path="", archive_name=""):
function walk_directory_and_slim_jars (line 50) | def walk_directory_and_slim_jars(base_dir, output_dir):
FILE: cmd/syft/internal/test/integration/utils_test.go
function catalogFixtureImage (line 19) | func catalogFixtureImage(t *testing.T, fixtureImageName string, scope so...
function catalogFixtureImageWithConfig (line 32) | func catalogFixtureImageWithConfig(t *testing.T, fixtureImageName string...
function catalogDirectory (line 54) | func catalogDirectory(t *testing.T, dir string, catalogerSelection ...st...
function catalogDirectoryWithConfig (line 66) | func catalogDirectoryWithConfig(t *testing.T, dir string, cfg *syft.Crea...
FILE: cmd/syft/internal/ui/capture.go
constant defaultStdoutLogBufferSize (line 11) | defaultStdoutLogBufferSize = 1024
function CaptureStdoutToTraceLog (line 20) | func CaptureStdoutToTraceLog() func() {
function capture (line 24) | func capture(target **os.File, writer io.Writer, bufSize int) func() {
FILE: cmd/syft/internal/ui/capture_test.go
function Test_capture (line 12) | func Test_capture(t *testing.T) {
function Test_captureBufSizes (line 63) | func Test_captureBufSizes(t *testing.T) {
FILE: cmd/syft/internal/ui/event_writer.go
function writeEvents (line 17) | func writeEvents(out, err io.Writer, quiet bool, events ...partybus.Even...
function writeReports (line 63) | func writeReports(writer io.Writer, events ...partybus.Event) error {
function writeNotifications (line 85) | func writeNotifications(writer io.Writer, events ...partybus.Event) error {
function writeAppUpdate (line 104) | func writeAppUpdate(writer io.Writer, events ...partybus.Event) error {
FILE: cmd/syft/internal/ui/event_writer_test.go
function Test_writeEvents (line 15) | func Test_writeEvents(t *testing.T) {
FILE: cmd/syft/internal/ui/log_writer.go
function newLogWriter (line 12) | func newLogWriter() io.Writer {
type logWriter (line 18) | type logWriter struct
method Write (line 23) | func (l *logWriter) Write(data []byte) (n int, err error) {
FILE: cmd/syft/internal/ui/log_writer_test.go
function Test_logWriter (line 13) | func Test_logWriter(t *testing.T) {
type bufferLogger (line 37) | type bufferLogger struct
method Tracef (line 39) | func (l *bufferLogger) Tracef(_ string, _ ...interface{}) {}
method Debugf (line 41) | func (l *bufferLogger) Debugf(_ string, _ ...interface{}) {}
method Infof (line 43) | func (l *bufferLogger) Infof(_ string, _ ...interface{}) {}
method Warnf (line 45) | func (l *bufferLogger) Warnf(_ string, _ ...interface{}) {}
method Errorf (line 47) | func (l *bufferLogger) Errorf(_ string, _ ...interface{}) {}
method Trace (line 49) | func (l *bufferLogger) Trace(vals ...interface{}) {
method Debug (line 53) | func (l *bufferLogger) Debug(_ ...interface{}) {}
method Info (line 55) | func (l *bufferLogger) Info(_ ...interface{}) {}
method Warn (line 57) | func (l *bufferLogger) Warn(vals ...interface{}) {
method Error (line 61) | func (l *bufferLogger) Error(_ ...interface{}) {}
method WithFields (line 63) | func (l *bufferLogger) WithFields(_ ...interface{}) logger.MessageLogg...
method Nested (line 65) | func (l *bufferLogger) Nested(_ ...interface{}) logger.Logger { return...
method SetOutput (line 67) | func (l *bufferLogger) SetOutput(_ io.Writer) {}
method GetOutput (line 69) | func (l *bufferLogger) GetOutput() io.Writer { return nil }
FILE: cmd/syft/internal/ui/no_ui.go
type NoUI (line 15) | type NoUI struct
method Setup (line 31) | func (n *NoUI) Setup(subscription partybus.Unsubscribable) error {
method Handle (line 36) | func (n *NoUI) Handle(e partybus.Event) error {
method Teardown (line 45) | func (n NoUI) Teardown(_ bool) error {
function None (line 23) | func None(out io.Writer, quiet bool) *NoUI {
FILE: cmd/syft/internal/ui/ui.go
type UI (line 28) | type UI struct
method Setup (line 52) | func (m *UI) Setup(subscription partybus.Unsubscribable) error {
method Handle (line 73) | func (m *UI) Handle(e partybus.Event) error {
method Teardown (line 80) | func (m *UI) Teardown(force bool) error {
method Init (line 119) | func (m UI) Init() tea.Cmd {
method RespondsTo (line 123) | func (m UI) RespondsTo() []partybus.EventType {
method Update (line 131) | func (m *UI) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
method View (line 186) | func (m UI) View() string {
function New (line 41) | func New(out io.Writer, quiet bool, handlers ...bubbly.EventHandler) *UI {
function runWithTimeout (line 190) | func runWithTimeout(timeout time.Duration, fn func() error) (err error) {
FILE: cmd/syft/main.go
constant applicationName (line 12) | applicationName = "syft"
function main (line 22) | func main() {
FILE: examples/create_custom_sbom/alpine_configuration_cataloger.go
type alpineConfigurationCataloger (line 22) | type alpineConfigurationCataloger struct
method Name (line 29) | func (m alpineConfigurationCataloger) Name() string {
method Catalog (line 33) | func (m alpineConfigurationCataloger) Catalog(_ context.Context, resol...
function newAlpineConfigurationCataloger (line 25) | func newAlpineConfigurationCataloger() pkg.Cataloger {
function newPackage (line 57) | func newPackage(version string, metadata AlpineConfiguration, locations ...
function newAlpineConfiguration (line 67) | func newAlpineConfiguration(resolver file.Resolver) (*AlpineConfiguratio...
function getVersion (line 82) | func getVersion(resolver file.Resolver) (string, []file.Location, error) {
function getAPKKeys (line 105) | func getAPKKeys(resolver file.Resolver) (map[string]string, []file.Locat...
type AlpineConfiguration (line 129) | type AlpineConfiguration struct
FILE: examples/create_custom_sbom/main.go
constant defaultImage (line 21) | defaultImage = "alpine:3.19"
function main (line 23) | func main() {
function imageReference (line 38) | func imageReference() string {
function getSource (line 46) | func getSource(input string) source.Source {
function getSBOM (line 57) | func getSBOM(src source.Source) sbom.SBOM {
function summarize (line 105) | func summarize(s sbom.SBOM) {
function showAlpineConfiguration (line 113) | func showAlpineConfiguration(s sbom.SBOM) {
FILE: examples/create_simple_sbom/main.go
constant defaultImage (line 17) | defaultImage = "alpine:3.19"
function main (line 19) | func main() {
function imageReference (line 34) | func imageReference() string {
function getSource (line 42) | func getSource(input string) source.Source {
function getSBOM (line 51) | func getSBOM(src source.Source) sbom.SBOM {
function formatSBOM (line 60) | func formatSBOM(s sbom.SBOM) []byte {
FILE: examples/decode_sbom/main.go
function main (line 16) | func main() {
function sbomReader (line 40) | func sbomReader() io.Reader {
FILE: examples/select_catalogers/main.go
constant defaultImage (line 17) | defaultImage = "alpine:3.19"
function main (line 19) | func main() {
function imageReference (line 38) | func imageReference() string {
function getSource (line 46) | func getSource(input string) source.Source {
function getSBOM (line 55) | func getSBOM(src source.Source, defaultTags ...string) sbom.SBOM {
FILE: examples/source_detection/main.go
constant defaultImage (line 33) | defaultImage = "alpine:3.19"
function main (line 35) | func main() {
function imageReference (line 61) | func imageReference() string {
function allSourceTags (line 69) | func allSourceTags() []string {
FILE: examples/source_from_image/main.go
constant defaultImage (line 18) | defaultImage = "alpine:3.19"
function main (line 20) | func main() {
function imageReference (line 39) | func imageReference() string {
FILE: examples/source_from_registry/main.go
function main (line 14) | func main() {
FILE: internal/buffered_seek_reader.go
type bufferedSeekReader (line 15) | type bufferedSeekReader struct
method Read (line 29) | func (bs *bufferedSeekReader) Read(p []byte) (int, error) {
method Seek (line 56) | func (bs *bufferedSeekReader) Seek(offset int64, whence int) (int64, e...
method Close (line 81) | func (bs *bufferedSeekReader) Close() error {
function NewBufferedSeeker (line 23) | func NewBufferedSeeker(rc io.ReadCloser) io.ReadSeekCloser {
FILE: internal/buffered_seek_reader_test.go
function TestBufferedSeeker_Read (line 12) | func TestBufferedSeeker_Read(t *testing.T) {
function TestBufferedSeeker_Seek (line 53) | func TestBufferedSeeker_Seek(t *testing.T) {
function TestBufferedSeeker_Close (line 134) | func TestBufferedSeeker_Close(t *testing.T) {
FILE: internal/bus/bus.go
function Set (line 22) | func Set(p partybus.Publisher) {
function Get (line 26) | func Get() partybus.Publisher {
function Publish (line 31) | func Publish(e partybus.Event) {
FILE: internal/bus/helpers.go
function Exit (line 13) | func Exit() {
function ExitWithInterrupt (line 17) | func ExitWithInterrupt() {
function Report (line 21) | func Report(report string) {
function Notify (line 32) | func Notify(message string) {
function StartCatalogerTask (line 39) | func StartCatalogerTask(info monitor.GenericTask, size int64, initialSta...
function StartPullSourceTask (line 54) | func StartPullSourceTask(info monitor.GenericTask, size int64, initialSt...
function StartIndexingFiles (line 69) | func StartIndexingFiles(path string) *monitor.TaskProgress {
FILE: internal/cache/bypass.go
type bypassedCache (line 5) | type bypassedCache struct
method Read (line 7) | func (b *bypassedCache) Read(_ string) (ReaderAtCloser, error) {
method Write (line 11) | func (b *bypassedCache) Write(_ string, contents io.Reader) error {
method GetCache (line 18) | func (b *bypassedCache) GetCache(_, _ string) Cache {
method RootDirs (line 22) | func (b *bypassedCache) RootDirs() []string {
FILE: internal/cache/bypass_test.go
function Test_bypassedCache (line 10) | func Test_bypassedCache(t *testing.T) {
FILE: internal/cache/cache.go
type Manager (line 8) | type Manager interface
type ReaderAtCloser (line 17) | type ReaderAtCloser interface
type Cache (line 24) | type Cache interface
function GetManager (line 35) | func GetManager() Manager {
function SetManager (line 41) | func SetManager(m Manager) {
FILE: internal/cache/cache_test.go
function Test_SetManager (line 10) | func Test_SetManager(t *testing.T) {
FILE: internal/cache/error_resolver.go
function GetResolverCachingErrors (line 7) | func GetResolverCachingErrors[T any](name, version string) Resolver[T] {
type errResponse (line 13) | type errResponse struct
type errorResolver (line 18) | type errorResolver struct
method Resolve (line 22) | func (r *errorResolver[T]) Resolve(key string, resolver resolverFunc[T])...
FILE: internal/cache/error_resolver_test.go
function Test_errorResolver (line 11) | func Test_errorResolver(t *testing.T) {
FILE: internal/cache/filesystem.go
function NewFromDir (line 20) | func NewFromDir(dir string, ttl time.Duration) (Manager, error) {
constant filePermissions (line 33) | filePermissions = 0700
constant dirPermissions (line 34) | dirPermissions = os.ModeDir | filePermissions
type filesystemCache (line 36) | type filesystemCache struct
method GetCache (line 42) | func (d *filesystemCache) GetCache(name, version string) Cache {
method RootDirs (line 55) | func (d *filesystemCache) RootDirs() []string {
method Read (line 62) | func (d *filesystemCache) Read(key string) (ReaderAtCloser, error) {
method Write (line 76) | func (d *filesystemCache) Write(key string, contents io.Reader) error {
function subFs (line 83) | func subFs(fsys afero.Fs, subDirs ...string) (afero.Fs, error) {
function makeDiskKey (line 107) | func makeDiskKey(key string) string {
FILE: internal/cache/filesystem_test.go
function Test_filesystemCache (line 18) | func Test_filesystemCache(t *testing.T) {
function Test_makeDiskKey (line 50) | func Test_makeDiskKey(t *testing.T) {
function Test_errors (line 97) | func Test_errors(t *testing.T) {
FILE: internal/cache/hash_type.go
function hashType (line 11) | func hashType[T any]() string {
function emptyValue (line 27) | func emptyValue(t reflect.Type) reflect.Value {
function isIgnored (line 62) | func isIgnored(f reflect.StructField) bool {
FILE: internal/cache/hash_type_test.go
function Test_hashType (line 11) | func Test_hashType(t *testing.T) {
function Test_hashIgnores (line 100) | func Test_hashIgnores(t *testing.T) {
FILE: internal/cache/memory.go
function NewInMemory (line 10) | func NewInMemory(ttl time.Duration) Manager {
FILE: internal/cache/memory_test.go
function Test_NewInMemory (line 14) | func Test_NewInMemory(t *testing.T) {
FILE: internal/cache/resolver.go
type Resolver (line 15) | type Resolver interface
function GetResolver (line 23) | func GetResolver[T any](name, version string) Resolver[T] {
constant resolverKeySuffix (line 32) | resolverKeySuffix = ".json"
type resolverFunc (line 34) | type resolverFunc
type cacheResolver (line 36) | type cacheResolver struct
method Resolve (line 45) | func (r *cacheResolver[T]) Resolve(key string, resolver resolverFunc[T])...
method resolveAndCache (line 69) | func (r *cacheResolver[T]) resolveAndCache(key string, resolver func() (...
FILE: internal/cache/resolver_test.go
function Test_Resolver (line 12) | func Test_Resolver(t *testing.T) {
FILE: internal/capabilities/capabilities.go
function RegisterCatalogerFiles (line 24) | func RegisterCatalogerFiles(f embed.FS) {
function LoadDocument (line 29) | func LoadDocument() (*Document, error) {
function Packages (line 96) | func Packages() ([]CatalogerEntry, error) {
type CatalogerInfo (line 105) | type CatalogerInfo struct
function ExtractCatalogerInfo (line 111) | func ExtractCatalogerInfo(tasks []task.Task) []CatalogerInfo {
FILE: internal/capabilities/evaluation.go
function EvaluateCapabilities (line 8) | func EvaluateCapabilities(caps CapabilitySet, config map[string]interfac...
function EvaluateField (line 19) | func EvaluateField(capField CapabilityField, config map[string]interface...
function ConditionMatches (line 33) | func ConditionMatches(when map[string]interface{}, config map[string]int...
function valuesEqual (line 49) | func valuesEqual(a, b interface{}) bool {
FILE: internal/capabilities/evaluation_test.go
function Test_valuesEqual (line 10) | func Test_valuesEqual(t *testing.T) {
function TestConditionMatches (line 123) | func TestConditionMatches(t *testing.T) {
function TestEvaluateField (line 224) | func TestEvaluateField(t *testing.T) {
function TestEvaluateCapabilities (line 411) | func TestEvaluateCapabilities(t *testing.T) {
FILE: internal/capabilities/generate/cataloger_config_linking.go
function LinkCatalogersToConfigs (line 18) | func LinkCatalogersToConfigs(repoRoot string) (map[string]string, error) {
function LinkCatalogersToConfigsFromPath (line 30) | func LinkCatalogersToConfigsFromPath(catalogerRoot, baseRoot string) (ma...
function linkCatalogersInFile (line 65) | func linkCatalogersInFile(path, repoRoot string) (map[string]string, err...
function extractCatalogerName (line 123) | func extractCatalogerName(funcDecl *ast.FuncDecl, file *ast.File, filePa...
function inferCatalogerNameFromCustomImpl (line 174) | func inferCatalogerNameFromCustomImpl(funcDecl *ast.FuncDecl, file *ast....
function extractReturnTypeName (line 183) | func extractReturnTypeName(funcDecl *ast.FuncDecl) string {
function findNameMethodReturn (line 219) | func findNameMethodReturn(file *ast.File, typeName string, ctx *parseCon...
function extractReceiverTypeName (line 247) | func extractReceiverTypeName(recvType ast.Expr) string {
function extractNameFromMethodBody (line 261) | func extractNameFromMethodBody(body *ast.BlockStmt, ctx *parseContext) s...
function extractConfigParameter (line 289) | func extractConfigParameter(funcDecl *ast.FuncDecl, localPackageName str...
function extractConfigTypeName (line 313) | func extractConfigTypeName(typeExpr ast.Expr, localPackageName string) s...
function looksLikeConfigType (line 328) | func looksLikeConfigType(typeName string) bool {
FILE: internal/capabilities/generate/cataloger_config_linking_test.go
function TestLinkCatalogersToConfigsFromPath (line 13) | func TestLinkCatalogersToConfigsFromPath(t *testing.T) {
function TestExtractConfigTypeName (line 110) | func TestExtractConfigTypeName(t *testing.T) {
function TestLooksLikeConfigType (line 183) | func TestLooksLikeConfigType(t *testing.T) {
function TestExtractReceiverTypeName (line 244) | func TestExtractReceiverTypeName(t *testing.T) {
function TestExtractConfigTypeNameHelper (line 286) | func TestExtractConfigTypeNameHelper(t *testing.T) {
function TestExtractReturnTypeName (line 343) | func TestExtractReturnTypeName(t *testing.T) {
FILE: internal/capabilities/generate/discover_app_config.go
type AppConfigField (line 17) | type AppConfigField struct
function extractEcosystemConfigFieldsFromCatalog (line 25) | func extractEcosystemConfigFieldsFromCatalog(catalogFilePath string) (ma...
function findFilesWithCatalogerImports (line 90) | func findFilesWithCatalogerImports(optionsDir string) ([]string, error) {
function extractConfigStructTypes (line 125) | func extractConfigStructTypes(filePath string) ([]string, error) {
function discoverCatalogerConfigs (line 160) | func discoverCatalogerConfigs(repoRoot string) (map[string]string, map[s...
function DiscoverAppConfigs (line 224) | func DiscoverAppConfigs(repoRoot string) ([]AppConfigField, error) {
function extractAppConfigFields (line 250) | func extractAppConfigFields(filePath, topLevelKey string, keyToStruct ma...
function findAppConfigStructAndDescriptions (line 311) | func findAppConfigStructAndDescriptions(f *ast.File, topLevelKey string,...
function findConfigStruct (line 319) | func findConfigStruct(f *ast.File, expectedName string) *ast.StructType {
function extractDescriptionsFromDescribeFields (line 346) | func extractDescriptionsFromDescribeFields(f *ast.File) map[string]string {
function extractNestedAppConfigs (line 393) | func extractNestedAppConfigs(f *ast.File, parentKey, parentFieldName str...
function extractAppDefaultValues (line 468) | func extractAppDefaultValues(f *ast.File) map[string]interface{} {
function extractAppValue (line 521) | func extractAppValue(expr ast.Expr) interface{} {
function extractYAMLTag (line 566) | func extractYAMLTag(field *ast.Field) string {
function extractFieldPathFromRef (line 584) | func extractFieldPathFromRef(expr ast.Expr) string {
function extractStringLiteral (line 617) | func extractStringLiteral(expr ast.Expr) string {
function cleanDescription (line 629) | func cleanDescription(desc string) string {
function isNestedStruct (line 636) | func isNestedStruct(expr ast.Expr) bool {
FILE: internal/capabilities/generate/discover_app_config_test.go
function TestAppConfigFieldsHaveDescriptions (line 16) | func TestAppConfigFieldsHaveDescriptions(t *testing.T) {
function TestAppConfigKeyFormat (line 38) | func TestAppConfigKeyFormat(t *testing.T) {
function TestCleanDescription (line 58) | func TestCleanDescription(t *testing.T) {
function TestExtractYAMLTag (line 109) | func TestExtractYAMLTag(t *testing.T) {
function TestIsNestedStruct (line 169) | func TestIsNestedStruct(t *testing.T) {
function TestExtractStringLiteral (line 238) | func TestExtractStringLiteral(t *testing.T) {
function TestExtractFieldPathFromRef (line 299) | func TestExtractFieldPathFromRef(t *testing.T) {
function TestExtractAppValue (line 339) | func TestExtractAppValue(t *testing.T) {
function TestExtractAppValue_NestedStruct (line 394) | func TestExtractAppValue_NestedStruct(t *testing.T) {
FILE: internal/capabilities/generate/discover_cataloger_configs.go
type ConfigField (line 18) | type ConfigField struct
type ConfigInfo (line 26) | type ConfigInfo struct
function DiscoverConfigs (line 36) | func DiscoverConfigs(repoRoot string) (map[string]ConfigInfo, error) {
function DiscoverConfigsFromPath (line 43) | func DiscoverConfigsFromPath(catalogerRoot string) (map[string]ConfigInf...
function discoverConfigsInFile (line 78) | func discoverConfigsInFile(path string) (map[string]ConfigInfo, error) {
function isConfigStruct (line 140) | func isConfigStruct(name string) bool {
function extractCatalogerConfigFields (line 146) | func extractCatalogerConfigFields(structType *ast.StructType) []ConfigFi...
function extractCatalogerConfigFieldsRecursive (line 155) | func extractCatalogerConfigFieldsRecursive(structType *ast.StructType, v...
function resolveEmbeddedStructFields (line 199) | func resolveEmbeddedStructFields(fieldType ast.Expr, visitedTypes map[st...
function findStructInFile (line 273) | func findStructInFile(filePath, structName string) *ast.StructType {
function extractFieldComments (line 306) | func extractFieldComments(commentGroup *ast.CommentGroup) (description s...
function formatFieldType (line 338) | func formatFieldType(expr ast.Expr) string {
function DiscoverAllowedConfigStructs (line 369) | func DiscoverAllowedConfigStructs(repoRoot string) (map[string]bool, err...
FILE: internal/capabilities/generate/discover_cataloger_configs_test.go
function TestDiscoverConfigs (line 13) | func TestDiscoverConfigs(t *testing.T) {
function TestExtractPackageNameFromPath (line 135) | func TestExtractPackageNameFromPath(t *testing.T) {
function TestFormatFieldType (line 181) | func TestFormatFieldType(t *testing.T) {
function TestExtractFieldComments (line 310) | func TestExtractFieldComments(t *testing.T) {
function TestDiscoverAllowedConfigStructs (line 430) | func TestDiscoverAllowedConfigStructs(t *testing.T) {
FILE: internal/capabilities/generate/discover_catalogers.go
type DiscoveredCataloger (line 18) | type DiscoveredCataloger struct
type DiscoveredParser (line 28) | type DiscoveredParser struct
function discoverGenericCatalogers (line 39) | func discoverGenericCatalogers(repoRoot string) (map[string]DiscoveredCa...
function discoverGenericCatalogersInFile (line 76) | func discoverGenericCatalogersInFile(path, repoRoot string) (map[string]...
function returnsPackageCataloger (line 117) | func returnsPackageCataloger(funcDecl *ast.FuncDecl) bool {
function parseGenericCatalogerFunction (line 139) | func parseGenericCatalogerFunction(funcDecl *ast.FuncDecl, filePath, rep...
function extractPackageNameFromPath (line 214) | func extractPackageNameFromPath(filePath string) string {
function isGenericNewCatalogerCall (line 234) | func isGenericNewCatalogerCall(callExpr *ast.CallExpr) bool {
type parseContext (line 248) | type parseContext struct
function parseWithParserByCall (line 254) | func parseWithParserByCall(callExpr *ast.CallExpr, ctx *parseContext) *D...
function resolveCriteriaValues (line 311) | func resolveCriteriaValues(arg ast.Expr, ctx *parseContext) []string {
function resolveMethodCallValues (line 348) | func resolveMethodCallValues(callExpr *ast.CallExpr, ctx *parseContext) ...
function resolveImportedVariable (line 385) | func resolveImportedVariable(pkgName, varName string, ctx *parseContext)...
function resolveLocalVariable (line 418) | func resolveLocalVariable(varName string, ctx *parseContext) []string {
function findVariableStringSlice (line 423) | func findVariableStringSlice(pkgDir, varName string) []string {
function extractStringSliceFromFile (line 450) | func extractStringSliceFromFile(file *ast.File, varName string) []string {
function extractStringSliceFromExpr (line 476) | func extractStringSliceFromExpr(expr ast.Expr) []string {
function resolveLocalConstant (line 506) | func resolveLocalConstant(name string, ctx *parseContext) string {
function resolveImportedConstant (line 533) | func resolveImportedConstant(pkgName, constName string, ctx *parseContex...
function resolveImportPath (line 568) | func resolveImportPath(importPath, repoRoot string) string {
function findConstantInPackage (line 579) | func findConstantInPackage(pkgDir, constName string) string {
function findConstantInFile (line 598) | func findConstantInFile(filePath, constName string) string {
function searchConstInDecl (line 614) | func searchConstInDecl(decl ast.Decl, constName string) string {
function getConstValue (line 634) | func getConstValue(valueSpec *ast.ValueSpec, constName string) string {
function extractBinaryClassifiers (line 646) | func extractBinaryClassifiers() []binary.Classifier { //nolint:staticcheck
FILE: internal/capabilities/generate/discover_catalogers_test.go
function TestReturnsPackageCataloger (line 12) | func TestReturnsPackageCataloger(t *testing.T) {
function TestIsGenericNewCatalogerCall (line 74) | func TestIsGenericNewCatalogerCall(t *testing.T) {
function TestExtractStringSliceFromExpr (line 121) | func TestExtractStringSliceFromExpr(t *testing.T) {
function TestSearchConstInDecl (line 168) | func TestSearchConstInDecl(t *testing.T) {
function TestGetConstValue (line 228) | func TestGetConstValue(t *testing.T) {
function TestResolveImportPath (line 297) | func TestResolveImportPath(t *testing.T) {
function parseFuncDecl (line 348) | func parseFuncDecl(t *testing.T, code string) *ast.FuncDecl {
function parseCallExpr (line 360) | func parseCallExpr(t *testing.T, code string) *ast.CallExpr {
function parseCompositeLit (line 370) | func parseCompositeLit(t *testing.T, code string) *ast.CompositeLit {
function parseConstDecl (line 380) | func parseConstDecl(t *testing.T, code string) *ast.GenDecl {
FILE: internal/capabilities/generate/discover_metadata.go
type TestObservationIndex (line 18) | type TestObservationIndex struct
method getParserObservations (line 41) | func (idx *TestObservationIndex) getParserObservations(packageName, pa...
method getCatalogerObservations (line 49) | func (idx *TestObservationIndex) getCatalogerObservations(catalogerNam...
method setParserObservations (line 54) | func (idx *TestObservationIndex) setParserObservations(packageName, pa...
method setCatalogerObservations (line 62) | func (idx *TestObservationIndex) setCatalogerObservations(catalogerNam...
method extractCustomCatalogerData (line 67) | func (idx *TestObservationIndex) extractCustomCatalogerData() (map[str...
type TypeObservation (line 26) | type TypeObservation struct
function newTestObservationIndex (line 33) | func newTestObservationIndex() *TestObservationIndex {
function discoverMetadataTypes (line 85) | func discoverMetadataTypes(repoRoot string, discovered map[string]Discov...
function mergeAndDeduplicateStrings (line 119) | func mergeAndDeduplicateStrings(existing, additional []string) []string {
function convertToJSONSchemaTypes (line 137) | func convertToJSONSchemaTypes(metadataTypes []string) []string {
function mergeTestObservations (line 155) | func mergeTestObservations(observations *pkgtestobservation.Test, index ...
function applyParserObservations (line 200) | func applyParserObservations(cataloger *DiscoveredCataloger, index *Test...
function applySingleParserCatalogerObservations (line 223) | func applySingleParserCatalogerObservations(cataloger *DiscoveredCatalog...
function applyMultiParserCatalogerObservations (line 248) | func applyMultiParserCatalogerObservations(cataloger *DiscoveredCataloge...
function applyTypesToCatalogers (line 295) | func applyTypesToCatalogers(discovered map[string]DiscoveredCataloger, i...
FILE: internal/capabilities/generate/discover_metadata_test.go
function TestApplyParserObservations (line 9) | func TestApplyParserObservations(t *testing.T) {
function TestApplySingleParserCatalogerObservations (line 96) | func TestApplySingleParserCatalogerObservations(t *testing.T) {
function TestApplyMultiParserCatalogerObservations (line 171) | func TestApplyMultiParserCatalogerObservations(t *testing.T) {
function TestMergeAndDeduplicateStrings (line 281) | func TestMergeAndDeduplicateStrings(t *testing.T) {
FILE: internal/capabilities/generate/io.go
constant autoGeneratedComment (line 15) | autoGeneratedComment = "AUTO-GENERATED"
function writeYAMLToFile (line 18) | func writeYAMLToFile(path string, rootNode *yaml.Node) error {
function addFieldComments (line 45) | func addFieldComments(rootNode *yaml.Node) {
function saveCapabilities (line 85) | func saveCapabilities(catalogerDir, repoRoot string, doc *capabilities.D...
function groupCatalogersByEcosystem (line 106) | func groupCatalogersByEcosystem(doc *capabilities.Document) (map[string]...
function writeEcosystemFile (line 129) | func writeEcosystemFile(catalogerDir, ecosystem string, catalogers []cap...
function writeAppconfigFile (line 169) | func writeAppconfigFile(repoRoot string, appConfig []capabilities.Applic...
function mapCatalogerToEcosystem (line 202) | func mapCatalogerToEcosystem(cat capabilities.CatalogerEntry) string {
function updateNodeTreeEcosystem (line 217) | func updateNodeTreeEcosystem(rootNode *yaml.Node, doc interface{}) error {
function updateNodeTreeAppConfig (line 245) | func updateNodeTreeAppConfig(rootNode *yaml.Node, doc interface{}) error {
function addCatalogerFieldComment (line 250) | func addCatalogerFieldComment(keyNode, valueNode *yaml.Node, catalogerNa...
function findFieldValue (line 314) | func findFieldValue(node *yaml.Node, fieldName string) string {
function addCatalogerComments (line 330) | func addCatalogerComments(catalogersNode *yaml.Node) {
function addParserComments (line 353) | func addParserComments(parsersNode *yaml.Node) {
function addDetectorComments (line 391) | func addDetectorComments(detectorNode *yaml.Node) {
FILE: internal/capabilities/generate/io_test.go
function TestFindFieldValue (line 10) | func TestFindFieldValue(t *testing.T) {
function TestAddCatalogerFieldComment (line 80) | func TestAddCatalogerFieldComment(t *testing.T) {
FILE: internal/capabilities/generate/main.go
function main (line 23) | func main() {
function printSummary (line 44) | func printSummary(stats *Statistics) {
function checkIncompleteCapabilities (line 75) | func checkIncompleteCapabilities(catalogerDir, repoRoot string) {
function hasEmptyCapabilities (line 127) | func hasEmptyCapabilities(caps capabilities.CapabilitySet) bool {
function printSuccessASCII (line 133) | func printSuccessASCII() {
function printFailureASCII (line 143) | func printFailureASCII() {
FILE: internal/capabilities/generate/merge.go
constant genericCatalogerType (line 16) | genericCatalogerType = "generic"
function stripPURLVersion (line 20) | func stripPURLVersion(purl string) string {
type ecosystemMapping (line 56) | type ecosystemMapping struct
function inferEcosystem (line 107) | func inferEcosystem(catalogerName string) string {
type Statistics (line 123) | type Statistics struct
function RegenerateCapabilities (line 135) | func RegenerateCapabilities(catalogerDir string, repoRoot string) (*Stat...
function discoverAllCatalogerData (line 206) | func discoverAllCatalogerData(repoRoot string, stats *Statistics) (
function discoverAndFilterConfigs (line 253) | func discoverAndFilterConfigs(repoRoot string) (map[string]capabilities....
function discoverAndConvertAppConfigs (line 296) | func discoverAndConvertAppConfigs(repoRoot string) ([]capabilities.Appli...
function applyConfigMappingFilters (line 318) | func applyConfigMappingFilters(catalogerConfigMappings map[string]string...
type orphanInfo (line 355) | type orphanInfo struct
type mergeStatistics (line 360) | type mergeStatistics struct
type CatalogerRegistry (line 367) | type CatalogerRegistry struct
method IsGeneric (line 388) | func (r *CatalogerRegistry) IsGeneric(name string) (DiscoveredCataloge...
method GetInfo (line 394) | func (r *CatalogerRegistry) GetInfo(name string) *capabilities.Catalog...
method DiscoveredCatalogers (line 399) | func (r *CatalogerRegistry) DiscoveredCatalogers() map[string]Discover...
method AllCatalogers (line 404) | func (r *CatalogerRegistry) AllCatalogers() []capabilities.CatalogerIn...
function NewCatalogerRegistry (line 374) | func NewCatalogerRegistry(discovered map[string]DiscoveredCataloger, all...
type EnrichmentData (line 409) | type EnrichmentData struct
method GetMetadataTypes (line 425) | func (e *EnrichmentData) GetMetadataTypes(catalogerName string) ([]str...
method GetPackageTypes (line 431) | func (e *EnrichmentData) GetPackageTypes(catalogerName string) ([]stri...
method EnrichEntry (line 437) | func (e *EnrichmentData) EnrichEntry(catalogerName string, entry *capa...
method EnrichWithBinaryClassifier (line 468) | func (e *EnrichmentData) EnrichWithBinaryClassifier(catalogerName stri...
function NewEnrichmentData (line 416) | func NewEnrichmentData(metadata, packageTypes map[string][]string, binar...
function convertToJSONSchemaTypesFromMetadata (line 451) | func convertToJSONSchemaTypesFromMetadata(metadataTypes []string) []stri...
type CatalogerMerger (line 513) | type CatalogerMerger struct
method Merge (line 542) | func (m *CatalogerMerger) Merge() (*capabilities.Document, []orphanInf...
method processExistingCatalogers (line 551) | func (m *CatalogerMerger) processExistingCatalogers() {
method addNewGenericCatalogers (line 578) | func (m *CatalogerMerger) addNewGenericCatalogers() {
method addNewCustomCatalogers (line 602) | func (m *CatalogerMerger) addNewCustomCatalogers() {
method processGenericCataloger (line 647) | func (m *CatalogerMerger) processGenericCataloger(existingEntry *capab...
method processCustomCataloger (line 667) | func (m *CatalogerMerger) processCustomCataloger(existingEntry *capabi...
function NewCatalogerMerger (line 527) | func NewCatalogerMerger(registry *CatalogerRegistry, enrichment *Enrichm...
function mergeDiscoveredWithExisting (line 703) | func mergeDiscoveredWithExisting(
function updateEntry (line 726) | func updateEntry(existing *capabilities.CatalogerEntry, discovered Disco...
function updateParsers (line 777) | func updateParsers(existingParsers []capabilities.Parser, discoveredPars...
function createTemplateEntry (line 841) | func createTemplateEntry(disc DiscoveredCataloger, info *capabilities.Ca...
function createTemplateParser (line 877) | func createTemplateParser(disc DiscoveredParser) capabilities.Parser {
function formatOrphans (line 891) | func formatOrphans(orphans []orphanInfo) string {
FILE: internal/capabilities/generate/merge_test.go
function TestCapabilitiesAreUpToDate (line 18) | func TestCapabilitiesAreUpToDate(t *testing.T) {
function TestMergeConfigSections (line 41) | func TestMergeConfigSections(t *testing.T) {
function TestMergeCatalogerConfigField (line 166) | func TestMergeCatalogerConfigField(t *testing.T) {
function TestMergePreservesManualCapabilities (line 229) | func TestMergePreservesManualCapabilities(t *testing.T) {
function TestCatalogerConfigFieldUpdatedForNewCatalogers (line 312) | func TestCatalogerConfigFieldUpdatedForNewCatalogers(t *testing.T) {
function TestStripPURLVersion (line 406) | func TestStripPURLVersion(t *testing.T) {
function TestInferEcosystem (line 442) | func TestInferEcosystem(t *testing.T) {
function TestConvertToJSONSchemaTypesFromMetadata (line 518) | func TestConvertToJSONSchemaTypesFromMetadata(t *testing.T) {
FILE: internal/capabilities/generate/metadata_check.go
function parsePackageMetadataTypes (line 37) | func parsePackageMetadataTypes(repoRoot string) ([]string, error) {
function extractTypeName (line 92) | func extractTypeName(expr ast.Expr) string {
function collectReferencedMetadataTypes (line 108) | func collectReferencedMetadataTypes(doc *capabilities.Document) []string {
function checkMetadataTypeCoverage (line 137) | func checkMetadataTypeCoverage(capabilitiesDir string, repoRoot string) ...
function printMetadataTypeCoverageWarning (line 171) | func printMetadataTypeCoverageWarning(capabilitiesDir string, repoRoot s...
function parseConstValues (line 198) | func parseConstValues(f *ast.File) map[string]string {
function extractTypesFromCompositeLit (line 225) | func extractTypesFromCompositeLit(compositeLit *ast.CompositeLit, constV...
function extractAllPkgsTypes (line 239) | func extractAllPkgsTypes(f *ast.File, constValues map[string]string) []s...
function parseAllPackageTypes (line 270) | func parseAllPackageTypes(repoRoot string) ([]string, error) {
function collectReferencedPackageTypes (line 290) | func collectReferencedPackageTypes(doc *capabilities.Document) []string {
function checkPackageTypeCoverage (line 319) | func checkPackageTypeCoverage(capabilitiesDir string, repoRoot string) (...
function printPackageTypeCoverageWarning (line 353) | func printPackageTypeCoverageWarning(capabilitiesDir string, repoRoot st...
FILE: internal/capabilities/generate/overrides.go
type binaryClassifierOverride (line 9) | type binaryClassifierOverride struct
function mustPURL (line 101) | func mustPURL(purl string) string {
function singleCPE (line 105) | func singleCPE(cpeString string, _ ...any) []string {
FILE: internal/capabilities/generate/testdata/cataloger/cataloger-with-constant/cataloger/python/cataloger.go
constant catalogerName (line 12) | catalogerName = "python-package-cataloger"
type CatalogerConfig (line 14) | type CatalogerConfig struct
function NewPythonCataloger (line 18) | func NewPythonCataloger(_ CatalogerConfig) pkg.Cataloger {
function parse (line 23) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/conflicting-names/cataloger/duplicate1/cataloger.go
type Config (line 12) | type Config struct
function NewDuplicateCataloger (line 16) | func NewDuplicateCataloger(_ Config) pkg.Cataloger {
function parse (line 21) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/conflicting-names/cataloger/duplicate2/cataloger.go
type Config (line 12) | type Config struct
function NewDuplicateCataloger (line 16) | func NewDuplicateCataloger(_ Config) pkg.Cataloger {
function parse (line 21) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/custom-cataloger-different-file/cataloger/dotnet/cataloger.go
function NewDotnetCataloger (line 7) | func NewDotnetCataloger(cfg CatalogerConfig) pkg.Cataloger {
FILE: internal/capabilities/generate/testdata/cataloger/custom-cataloger-different-file/cataloger/dotnet/types.go
constant catalogerName (line 11) | catalogerName = "dotnet-cataloger"
type CatalogerConfig (line 13) | type CatalogerConfig struct
type dotnetCataloger (line 17) | type dotnetCataloger struct
method Name (line 21) | func (d dotnetCataloger) Name() string {
method Catalog (line 25) | func (d dotnetCataloger) Catalog(_ context.Context, _ file.Resolver) (...
FILE: internal/capabilities/generate/testdata/cataloger/custom-cataloger-same-file/cataloger/java/cataloger.go
constant pomCatalogerName (line 11) | pomCatalogerName = "java-pom-cataloger"
type ArchiveCatalogerConfig (line 13) | type ArchiveCatalogerConfig struct
type pomXMLCataloger (line 17) | type pomXMLCataloger struct
method Name (line 21) | func (p pomXMLCataloger) Name() string {
method Catalog (line 25) | func (p pomXMLCataloger) Catalog(_ context.Context, _ file.Resolver) (...
function NewPomCataloger (line 29) | func NewPomCataloger(cfg ArchiveCatalogerConfig) pkg.Cataloger {
FILE: internal/capabilities/generate/testdata/cataloger/imported-config-type/cataloger/kernel/cataloger.go
function NewLinuxKernelCataloger (line 12) | func NewLinuxKernelCataloger(_ LinuxKernelCatalogerConfig) pkg.Cataloger {
function parse (line 17) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/imported-config-type/cataloger/kernel/config.go
type LinuxKernelCatalogerConfig (line 3) | type LinuxKernelCatalogerConfig struct
FILE: internal/capabilities/generate/testdata/cataloger/mixed-naming-patterns/cataloger/ruby/cataloger.go
type Config (line 12) | type Config struct
function NewRubyCataloger (line 16) | func NewRubyCataloger(_ Config) pkg.Cataloger {
function parse (line 21) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/no-config-cataloger/cataloger/javascript/cataloger.go
function NewJavaScriptCataloger (line 12) | func NewJavaScriptCataloger() pkg.Cataloger {
function parse (line 17) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/non-config-first-param/cataloger/binary/cataloger.go
type Parser (line 12) | type Parser struct
function NewBinaryCataloger (line 14) | func NewBinaryCataloger(_ Parser) pkg.Cataloger {
function parse (line 19) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/selector-expression-config/cataloger/rust/cataloger.go
type CatalogerConfig (line 13) | type CatalogerConfig struct
function NewRustCataloger (line 17) | func NewRustCataloger(_ CatalogerConfig) pkg.Cataloger {
function parse (line 22) | func parse(_ context.Context, _ file.Resolver, _ *generic.Environment, _...
FILE: internal/capabilities/generate/testdata/cataloger/simple-generic-cataloger/cataloger/golang/cataloger.go
type CatalogerConfig (line 12) | type CatalogerConfig struct
function NewGoModuleCataloger (line 16) | func NewGoModuleCataloger(_ CatalogerConfig) pkg.Cataloger {
function parseGoMod (line 21) | func parseGoMod(_ context.Context, _ file.Resolver, _ *generic.Environme...
FILE: internal/capabilities/generate/testdata/config-discovery/multiple-configs/cataloger/java/config.go
type ArchiveCatalogerConfig (line 4) | type ArchiveCatalogerConfig struct
FILE: internal/capabilities/generate/testdata/config-discovery/multiple-configs/cataloger/python/config.go
type CatalogerConfig (line 4) | type CatalogerConfig struct
FILE: internal/capabilities/generate/testdata/config-discovery/nested-config/cataloger/golang/config.go
type MainModuleVersionConfig (line 4) | type MainModuleVersionConfig struct
type CatalogerConfig (line 15) | type CatalogerConfig struct
FILE: internal/capabilities/generate/testdata/config-discovery/no-annotations/cataloger/javascript/config.go
type CatalogerConfig (line 4) | type CatalogerConfig struct
FILE: internal/capabilities/generate/testdata/config-discovery/simple-config/cataloger/golang/config.go
type CatalogerConfig (line 4) | type CatalogerConfig struct
FILE: internal/capabilities/generate/util_test.go
function checkCompletenessTestsEnabled (line 15) | func checkCompletenessTestsEnabled(t *testing.T) {
FILE: internal/capabilities/internal/cataloger_names.go
function AllPackageCatalogerInfo (line 13) | func AllPackageCatalogerInfo() ([]capabilities.CatalogerInfo, error) {
FILE: internal/capabilities/internal/fixtures.go
function FindTestDataDirs (line 13) | func FindTestDataDirs(repoRoot string) ([]string, error) {
function ReadTestObservations (line 34) | func ReadTestObservations(path string) (*pkgtestobservation.Test, error) {
FILE: internal/capabilities/internal/load_capabilities.go
function LoadCapabilities (line 16) | func LoadCapabilities(catalogerDir, repoRoot string) (*capabilities.Docu...
FILE: internal/capabilities/internal/load_capabilities_test.go
constant requireParserObservations (line 29) | requireParserObservations = false
function TestLoadDocument (line 62) | func TestLoadDocument(t *testing.T) {
function TestPackages (line 84) | func TestPackages(t *testing.T) {
function TestConfigCompleteness (line 95) | func TestConfigCompleteness(t *testing.T) {
function TestCapabilityConfigFieldReferences (line 157) | func TestCapabilityConfigFieldReferences(t *testing.T) {
function TestCapabilityFieldNaming (line 278) | func TestCapabilityFieldNaming(t *testing.T) {
function TestCapabilityValueTypes (line 339) | func TestCapabilityValueTypes(t *testing.T) {
function validateCapabilityValueType (line 411) | func validateCapabilityValueType(fieldPath string, value interface{}) er...
function TestMetadataTypesHaveJSONSchemaTypes (line 459) | func TestMetadataTypesHaveJSONSchemaTypes(t *testing.T) {
function convertMetadataTypeToJSONSchemaType (line 545) | func convertMetadataTypeToJSONSchemaType(metadataType string) string {
function findStructFields (line 554) | func findStructFields(file *ast.File, structName string) map[string]stri...
function getTypeName (line 588) | func getTypeName(expr ast.Expr) string {
function findMetadataStructFile (line 608) | func findMetadataStructFile(repoRoot, structName string) (filePath strin...
function parseEvidenceReference (line 667) | func parseEvidenceReference(evidence string) (structName string, fieldPa...
function validateFieldPath (line 695) | func validateFieldPath(repoRoot, structName string, fieldPath []string) ...
function TestCapabilityEvidenceFieldReferences (line 777) | func TestCapabilityEvidenceFieldReferences(t *testing.T) {
function TestDetectorConfigFieldReferences (line 856) | func TestDetectorConfigFieldReferences(t *testing.T) {
function TestCatalogersInSync (line 925) | func TestCatalogersInSync(t *testing.T) {
function getCatalogerNamesFromBinary (line 972) | func getCatalogerNamesFromBinary(t *testing.T) []string {
function validateCapabilitiesFilled (line 988) | func validateCapabilitiesFilled(t *testing.T, catalogers []capabilities....
function TestPackageTypeCoverage (line 1016) | func TestPackageTypeCoverage(t *testing.T) {
function TestMetadataTypeCoverage (line 1063) | func TestMetadataTypeCoverage(t *testing.T) {
function TestCatalogerStructure (line 1115) | func TestCatalogerStructure(t *testing.T) {
function TestCatalogerDataQuality (line 1157) | func TestCatalogerDataQuality(t *testing.T) {
function TestCatalogersHaveTestObservations (line 1238) | func TestCatalogersHaveTestObservations(t *testing.T) {
function extractPackageName (line 1347) | func extractPackageName(catalogerName string) string {
FILE: internal/capabilities/internal/paths.go
constant CatalogerDirRel (line 9) | CatalogerDirRel = "syft/pkg/cataloger"
constant InternalCapabilitiesDirRel (line 12) | InternalCapabilitiesDirRel = "internal/capabilities"
constant CapabilitiesFilename (line 15) | CapabilitiesFilename = "capabilities.yaml"
constant AppconfigFilename (line 18) | AppconfigFilename = "appconfig.yaml"
function CatalogerDir (line 22) | func CatalogerDir(repoRoot string) string {
function CapabilitiesDir (line 27) | func CapabilitiesDir(repoRoot string) string {
function EcosystemCapabilitiesPath (line 32) | func EcosystemCapabilitiesPath(catalogerDir, ecosystem string) string {
function AppconfigPath (line 37) | func AppconfigPath(repoRoot string) string {
FILE: internal/capabilities/internal/repo_root.go
function RepoRoot (line 12) | func RepoRoot() (string, error) {
FILE: internal/capabilities/internal/util_test.go
function checkCompletenessTestsEnabled (line 15) | func checkCompletenessTestsEnabled(t *testing.T) {
FILE: internal/capabilities/model.go
type ArtifactDetectionMethod (line 4) | type ArtifactDetectionMethod
constant GlobDetection (line 8) | GlobDetection ArtifactDetectionMethod = "glob"
constant PathDetection (line 10) | PathDetection ArtifactDetectionMethod = "path"
constant MIMETypeDetection (line 12) | MIMETypeDetection ArtifactDetectionMethod = "mimetype"
type Document (line 16) | type Document struct
type CatalogerConfigFieldEntry (line 23) | type CatalogerConfigFieldEntry struct
type CatalogerConfigEntry (line 30) | type CatalogerConfigEntry struct
type ApplicationConfigField (line 35) | type ApplicationConfigField struct
type Source (line 42) | type Source struct
type Detector (line 48) | type Detector struct
type DetectorPackageInfo (line 57) | type DetectorPackageInfo struct
type DetectorCondition (line 66) | type DetectorCondition struct
type CatalogerEntry (line 74) | type CatalogerEntry struct
type Parser (line 90) | type Parser struct
type CapabilityField (line 101) | type CapabilityField struct
type CapabilityCondition (line 116) | type CapabilityCondition struct
type CapabilitySet (line 127) | type CapabilitySet
FILE: internal/capabilities/model_test.go
function TestConfigSchemaExtensions (line 11) | func TestConfigSchemaExtensions(t *testing.T) {
function TestConfigSchemaOmitEmpty (line 88) | func TestConfigSchemaOmitEmpty(t *testing.T) {
function TestCatalogerConfigField (line 109) | func TestCatalogerConfigField(t *testing.T) {
function TestCatalogerConfigFieldOmitEmpty (line 134) | func TestCatalogerConfigFieldOmitEmpty(t *testing.T) {
FILE: internal/capabilities/pkgtestobservation/model.go
type Observations (line 6) | type Observations struct
type Relationship (line 15) | type Relationship struct
type Count (line 21) | type Count struct
type Test (line 27) | type Test struct
type Parser (line 35) | type Parser struct
type Cataloger (line 42) | type Cataloger struct
FILE: internal/capabilities/util_test.go
function checkCompletenessTestsEnabled (line 15) | func checkCompletenessTestsEnabled(t *testing.T) {
FILE: internal/cmptest/common_options.go
function DefaultOptions (line 14) | func DefaultOptions() []cmp.Option {
function DefaultIgnoreLocationLayerOptions (line 18) | func DefaultIgnoreLocationLayerOptions() []cmp.Option {
function BuildOptions (line 22) | func BuildOptions(licenseCmp LicenseComparer, locationCmp LocationCompar...
function locationSorter (line 46) | func locationSorter(a, b file.Location) int {
FILE: internal/cmptest/diff_reporter.go
type DiffReporter (line 11) | type DiffReporter struct
method PushStep (line 20) | func (r *DiffReporter) PushStep(ps cmp.PathStep) {
method Report (line 24) | func (r *DiffReporter) Report(rs cmp.Result) {
method PopStep (line 31) | func (r *DiffReporter) PopStep() {
method String (line 35) | func (r *DiffReporter) String() string {
function NewDiffReporter (line 16) | func NewDiffReporter() DiffReporter {
FILE: internal/cmptest/license.go
type LicenseComparer (line 10) | type LicenseComparer
function DefaultLicenseComparer (line 12) | func DefaultLicenseComparer(x, y pkg.License) bool {
function LicenseComparerWithoutLocationLayer (line 20) | func LicenseComparerWithoutLocationLayer(x, y pkg.License) bool {
FILE: internal/cmptest/location.go
type LocationComparer (line 10) | type LocationComparer
function DefaultLocationComparer (line 12) | func DefaultLocationComparer(x, y file.Location) bool {
function LocationComparerWithoutLayer (line 16) | func LocationComparerWithoutLayer(x, y file.Location) bool {
FILE: internal/cmptest/relationship.go
type RelationshipComparer (line 9) | type RelationshipComparer
function DefaultRelationshipComparer (line 21) | func DefaultRelationshipComparer(x, y artifact.Relationship) bool {
FILE: internal/cmptest/set.go
type slicer (line 3) | type slicer interface
function buildSetComparer (line 7) | func buildSetComparer[T any, S slicer[T]](l func(x, y T) bool, sorters ....
FILE: internal/constants.go
constant JSONSchemaVersion (line 6) | JSONSchemaVersion = "16.1.3"
FILE: internal/err_helper.go
function CloseAndLogError (line 14) | func CloseAndLogError(closer io.Closer, location string) {
type ErrPath (line 24) | type ErrPath struct
method Error (line 30) | func (e ErrPath) Error() string {
function IsErrPath (line 34) | func IsErrPath(err error) bool {
function IsErrPathPermission (line 39) | func IsErrPathPermission(err error) bool {
FILE: internal/evidence/constants.go
constant AnnotationKey (line 6) | AnnotationKey = "evidence"
constant PrimaryAnnotation (line 7) | PrimaryAnnotation = "primary"
constant SupportingAnnotation (line 8) | SupportingAnnotation = "supporting"
FILE: internal/file/archive_aliases.go
function IdentifyArchive (line 31) | func IdentifyArchive(ctx context.Context, path string, r io.Reader) (arc...
function handleCompoundArchiveAliases (line 40) | func handleCompoundArchiveAliases(path string) string {
FILE: internal/file/archive_aliases_test.go
function TestHandleCompoundArchiveAliases (line 9) | func TestHandleCompoundArchiveAliases(t *testing.T) {
FILE: internal/file/copy.go
constant perFileReadLimit (line 9) | perFileReadLimit = 2 * GB
function safeCopy (line 13) | func safeCopy(writer io.Writer, reader io.Reader) error {
FILE: internal/file/digest.go
function supportedHashAlgorithms (line 16) | func supportedHashAlgorithms() []crypto.Hash {
constant emptyMD5 (line 29) | emptyMD5 = "d41d8cd98f00b204e9800998ecf8427e"
constant emptySHA1 (line 30) | emptySHA1 = "da39a3ee5e6b4b0d3255bfef95601890afd80709"
constant emptySHA224 (line 31) | emptySHA224 = "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f"
constant emptySHA256 (line 32) | emptySHA256 = "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7...
constant emptySHA384 (line 33) | emptySHA384 = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf6...
constant emptySHA512 (line 34) | emptySHA512 = "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d...
function NewDigestsFromFile (line 37) | func NewDigestsFromFile(ctx context.Context, closer io.ReadCloser, hashe...
function Hashers (line 96) | func Hashers(names ...string) ([]crypto.Hash, error) {
function CleanDigestAlgorithmName (line 113) | func CleanDigestAlgorithmName(name string) string {
FILE: internal/file/digest_test.go
function TestCleanDigestAlgorithmName (line 15) | func TestCleanDigestAlgorithmName(t *testing.T) {
function TestNewDigestsFromFile (line 34) | func TestNewDigestsFromFile(t *testing.T) {
function TestHashers (line 126) | func TestHashers(t *testing.T) {
FILE: internal/file/getter.go
type Getter (line 22) | type Getter interface
type HashiGoGetter (line 31) | type HashiGoGetter struct
method GetFile (line 48) | func (g HashiGoGetter) GetFile(dst, src string, monitors ...*progress....
method GetToDir (line 56) | func (g HashiGoGetter) GetToDir(dst, src string, monitors ...*progress...
function NewGetter (line 37) | func NewGetter(id clio.Identification, httpClient *http.Client) *HashiGo...
function validateHTTPSource (line 68) | func validateHTTPSource(src string) error {
function getterClient (line 85) | func getterClient(dst, src string, dir bool, httpGetter getter.HttpGette...
function withProgress (line 108) | func withProgress(monitor *progress.Manual) func(client *getter.Client) ...
function mapToGetterClientOptions (line 114) | func mapToGetterClientOptions(monitors []*progress.Manual) []getter.Clie...
type readCloser (line 131) | type readCloser struct
method Close (line 135) | func (c *readCloser) Close() error { return nil }
type progressAdapter (line 137) | type progressAdapter struct
method TrackProgress (line 141) | func (a *progressAdapter) TrackProgress(_ string, currentSize, totalSi...
function getterDecompressorNames (line 149) | func getterDecompressorNames() (names []string) {
FILE: internal/file/getter_test.go
function TestGetter_GetFile (line 21) | func TestGetter_GetFile(t *testing.T) {
function TestGetter_GetToDir_FilterNonArchivesWired (line 62) | func TestGetter_GetToDir_FilterNonArchivesWired(t *testing.T) {
function TestGetter_validateHttpSource (line 82) | func TestGetter_validateHttpSource(t *testing.T) {
function TestGetter_GetToDir_CertConcerns (line 112) | func TestGetter_GetToDir_CertConcerns(t *testing.T) {
function assertUnknownAuthorityError (line 154) | func assertUnknownAuthorityError(t assert.TestingT, err error, _ ...inte...
function assertErrNonArchiveSource (line 158) | func assertErrNonArchiveSource(t assert.TestingT, err error, _ ...interf...
function removeTrustedCAs (line 162) | func removeTrustedCAs(client *http.Client) {
function createTarball (line 167) | func createTarball(filename string, content []byte) []byte {
type muxOption (line 181) | type muxOption
function withResponseForPath (line 183) | func withResponseForPath(t *testing.T, path string, response []byte) mux...
function newTestServer (line 203) | func newTestServer(t *testing.T, muxOptions ...muxOption) *httptest.Serv...
function createRequestURL (line 217) | func createRequestURL(t *testing.T, server *httptest.Server, path string...
function getClient (line 237) | func getClient(t *testing.T, server *httptest.Server) *http.Client {
function getHost (line 257) | func getHost(t *testing.T, server *httptest.Server) string {
FILE: internal/file/normalize_hashes.go
function NormalizeHashes (line 10) | func NormalizeHashes(hashes []crypto.Hash) []crypto.Hash {
FILE: internal/file/normalize_hashes_test.go
function TestNormalizeHashes (line 10) | func TestNormalizeHashes(t *testing.T) {
FILE: internal/file/opener.go
type Opener (line 9) | type Opener struct
method Open (line 14) | func (o Opener) Open() (io.ReadCloser, error) {
FILE: internal/file/squashfs.go
type WalkDiskDirFunc (line 12) | type WalkDiskDirFunc
function WalkDiskDir (line 16) | func WalkDiskDir(fsys filesystem.FileSystem, root string, fn WalkDiskDir...
function walkDiskDir (line 44) | func walkDiskDir(fsys filesystem.FileSystem, name string, d os.FileInfo,...
FILE: internal/file/squashfs_test.go
function createTestFS (line 16) | func createTestFS(t *testing.T) filesystem.FileSystem {
function TestWalkDiskDir_CompleteTraversal (line 60) | func TestWalkDiskDir_CompleteTraversal(t *testing.T) {
function TestWalkDiskDir_FileInfoCorrect (line 88) | func TestWalkDiskDir_FileInfoCorrect(t *testing.T) {
function TestWalkDiskDir_SkipDir (line 126) | func TestWalkDiskDir_SkipDir(t *testing.T) {
function TestWalkDiskDir_SkipAll (line 151) | func TestWalkDiskDir_SkipAll(t *testing.T) {
function TestWalkDiskDir_EmptyDirectory (line 176) | func TestWalkDiskDir_EmptyDirectory(t *testing.T) {
function TestWalkDiskDir_NonexistentPath (line 190) | func TestWalkDiskDir_NonexistentPath(t *testing.T) {
function TestWalkDiskDir_WalkFunctionError (line 200) | func TestWalkDiskDir_WalkFunctionError(t *testing.T) {
function TestWalkDiskDir_SubdirectoryTraversal (line 215) | func TestWalkDiskDir_SubdirectoryTraversal(t *testing.T) {
function TestWalkDiskDir_SingleFile (line 237) | func TestWalkDiskDir_SingleFile(t *testing.T) {
FILE: internal/file/tar_file_traversal.go
function TraverseFilesInTar (line 16) | func TraverseFilesInTar(ctx context.Context, archivePath string, visitor...
function ExtractGlobsFromTarToUniqueTempFile (line 37) | func ExtractGlobsFromTarToUniqueTempFile(ctx context.Context, archivePat...
function matchesAnyGlob (line 85) | func matchesAnyGlob(name string, globs ...string) bool {
FILE: internal/file/zip_file_helpers_test.go
function createZipArchive (line 23) | func createZipArchive(t testing.TB, sourceDirPath, destinationArchivePat...
function setupZipFileTest (line 66) | func setupZipFileTest(t testing.TB, sourceDirPath string, zip64 bool) st...
function ensureNestedZipExists (line 85) | func ensureNestedZipExists(t *testing.T, sourceDirPath string) error {
FILE: internal/file/zip_file_manifest.go
type ZipFileManifest (line 17) | type ZipFileManifest
method Add (line 44) | func (z ZipFileManifest) Add(entry string, info os.FileInfo) {
method GlobMatch (line 49) | func (z ZipFileManifest) GlobMatch(caseInsensitive bool, patterns ...s...
function NewZipFileManifest (line 20) | func NewZipFileManifest(ctx context.Context, archivePath string) (ZipFil...
function normalizeZipEntryName (line 85) | func normalizeZipEntryName(caseInsensitive bool, entry string) string {
FILE: internal/file/zip_file_manifest_test.go
function TestNewZipFileManifest (line 16) | func TestNewZipFileManifest(t *testing.T) {
function TestNewZip64FileManifest (line 56) | func TestNewZip64FileManifest(t *testing.T) {
function TestZipFileManifest_GlobMatch (line 91) | func TestZipFileManifest_GlobMatch(t *testing.T) {
FILE: internal/file/zip_file_traversal.go
constant _ (line 18) | _ = iota
constant KB (line 19) | KB = 1 << (10 * iota)
constant MB (line 20) | MB
constant GB (line 21) | GB
type errZipSlipDetected (line 24) | type errZipSlipDetected struct
method Error (line 29) | func (e *errZipSlipDetected) Error() string {
type zipTraversalRequest (line 33) | type zipTraversalRequest
function newZipTraverseRequest (line 35) | func newZipTraverseRequest(paths ...string) zipTraversalRequest {
function TraverseFilesInZip (line 44) | func TraverseFilesInZip(ctx context.Context, archivePath string, visitor...
function ExtractFromZipToUniqueTempFile (line 71) | func ExtractFromZipToUniqueTempFile(ctx context.Context, archivePath, di...
function ContentsFromZip (line 117) | func ContentsFromZip(ctx context.Context, archivePath string, paths ...s...
function UnzipToDir (line 154) | func UnzipToDir(ctx context.Context, archivePath, targetDir string) error {
function SafeJoin (line 168) | func SafeJoin(prefix string, dest ...string) (string, error) {
function extractSingleFile (line 181) | func extractSingleFile(file archives.FileInfo, expandedFilePath, archive...
FILE: internal/file/zip_file_traversal_test.go
function equal (line 25) | func equal(r1, r2 io.Reader) (bool, error) {
function TestUnzipToDir (line 44) | func TestUnzipToDir(t *testing.T) {
function TestContentsFromZip (line 126) | func TestContentsFromZip(t *testing.T) {
function prependZipSourceFixtureWithString (line 161) | func prependZipSourceFixtureWithString(tb testing.TB, value string) func...
function prepZipSourceFixture (line 206) | func prepZipSourceFixture(t testing.TB) string {
function zipSourceFixtureExpectedContents (line 220) | func zipSourceFixtureExpectedContents() map[string]string {
function assertZipSourceFixtureContents (line 227) | func assertZipSourceFixtureContents(t testing.TB, actual map[string]stri...
function assertErrorAs (line 245) | func assertErrorAs(expectedErr interface{}) assert.ErrorAssertionFunc {
function TestSafeJoin (line 251) | func TestSafeJoin(t *testing.T) {
function TestSafeJoin_SymlinkProtection (line 323) | func TestSafeJoin_SymlinkProtection(t *testing.T) {
function TestUnzipToDir_SymlinkAttacks (line 408) | func TestUnzipToDir_SymlinkAttacks(t *testing.T) {
function TestContentsFromZip_SymlinkAttacks (line 483) | func TestContentsFromZip_SymlinkAttacks(t *testing.T) {
function TestExtractFromZipToUniqueTempFile_SymlinkAttacks (line 553) | func TestExtractFromZipToUniqueTempFile_SymlinkAttacks(t *testing.T) {
type forensicFindings (line 639) | type forensicFindings struct
type forensicSymlink (line 646) | type forensicSymlink struct
function analyzeExtractionDirectory (line 655) | func analyzeExtractionDirectory(t *testing.T, extractDir string) forensi...
function checkFileOutsideExtraction (line 731) | func checkFileOutsideExtraction(t *testing.T, filePath string) bool {
function checkSymlinkCreation (line 749) | func checkSymlinkCreation(t *testing.T, symlinkPath, extractDir, expecte...
function createMaliciousZipWithSymlink (line 781) | func createMaliciousZipWithSymlink(t *testing.T, tempDir, symlinkName, s...
FILE: internal/input.go
function IsPipedInput (line 9) | func IsPipedInput() (bool, error) {
function IsTerminal (line 23) | func IsTerminal() bool {
FILE: internal/jsonschema/comments.go
function copyAliasFieldComments (line 15) | func copyAliasFieldComments(commentMap map[string]string, repoRoot strin...
function findTypeAliases (line 34) | func findTypeAliases(repoRoot string) map[string]string {
function hasDescriptionInAlternatives (line 79) | func hasDescriptionInAlternatives(schema *jsonschema.Schema) bool {
function warnMissingDescriptions (line 95) | func warnMissingDescriptions(schema *jsonschema.Schema, metadataNames []...
FILE: internal/jsonschema/comments_test.go
function TestCopyAliasFieldComments (line 16) | func TestCopyAliasFieldComments(t *testing.T) {
function TestFindTypeAliases (line 108) | func TestFindTypeAliases(t *testing.T) {
function TestHasDescriptionInAlternatives (line 187) | func TestHasDescriptionInAlternatives(t *testing.T) {
function TestWarnMissingDescriptions (line 251) | func TestWarnMissingDescriptions(t *testing.T) {
function newOrderedMap (line 376) | func newOrderedMap(m map[string]*jsonschema.Schema) *orderedmap.OrderedM...
FILE: internal/jsonschema/main.go
function init (line 31) | func init() {
function main (line 40) | func main() {
function schemaID (line 44) | func schemaID() jsonschema.ID {
function assembleTypeContainer (line 50) | func assembleTypeContainer(items []any) (any, map[string]string) {
function build (line 86) | func build() *jsonschema.Schema {
function encode (line 193) | func encode(schema *jsonschema.Schema) []byte {
function write (line 207) | func write(schema []byte) {
FILE: internal/licenses/context.go
type licenseScannerKey (line 7) | type licenseScannerKey struct
function SetContextLicenseScanner (line 11) | func SetContextLicenseScanner(ctx context.Context, s Scanner) context.Co...
function IsContextLicenseScannerSet (line 15) | func IsContextLicenseScannerSet(ctx context.Context) bool {
function ContextLicenseScanner (line 20) | func ContextLicenseScanner(ctx context.Context) (Scanner, error) {
FILE: internal/licenses/context_test.go
function TestSetContextLicenseScanner (line 10) | func TestSetContextLicenseScanner(t *testing.T) {
function TestIsContextLicenseScannerSet (line 22) | func TestIsContextLicenseScannerSet(t *testing.T) {
function TestContextLicenseScanner (line 31) | func TestContextLicenseScanner(t *testing.T) {
FILE: internal/licenses/find_evidence.go
method FindEvidence (line 8) | func (s *scanner) FindEvidence(_ context.Context, reader io.Reader) (evi...
FILE: internal/licenses/find_evidence_test.go
function TestDefaultScanner_FindEvidence (line 13) | func TestDefaultScanner_FindEvidence(t *testing.T) {
function testScanner (line 67) | func testScanner() Scanner {
function mustOpen (line 74) | func mustOpen(fixture string) []byte {
FILE: internal/licenses/list.go
function FileNames (line 7) | func FileNames() []string {
FILE: internal/licenses/scanner.go
constant UnknownLicensePrefix (line 14) | UnknownLicensePrefix = unknownLicenseType + "_"
constant DefaultCoverageThreshold (line 15) | DefaultCoverageThreshold = 75
constant unknownLicenseType (line 17) | unknownLicenseType = "UNKNOWN"
type Evidence (line 20) | type Evidence struct
type Scanner (line 28) | type Scanner interface
type scanner (line 34) | type scanner struct
type ScannerConfig (line 39) | type ScannerConfig struct
type Option (line 44) | type Option
function WithCoverage (line 46) | func WithCoverage(coverage float64) Option {
function NewDefaultScanner (line 53) | func NewDefaultScanner(o ...Option) (Scanner, error) {
function NewScanner (line 73) | func NewScanner(c *ScannerConfig) (Scanner, error) {
FILE: internal/log/log.go
function Set (line 16) | func Set(l logger.Logger) {
function Get (line 28) | func Get() logger.Logger {
function Errorf (line 33) | func Errorf(format string, args ...interface{}) {
function Error (line 38) | func Error(args ...interface{}) {
function Warnf (line 43) | func Warnf(format string, args ...interface{}) {
function Warn (line 48) | func Warn(args ...interface{}) {
function Infof (line 53) | func Infof(format string, args ...interface{}) {
function Info (line 58) | func Info(args ...interface{}) {
function Debugf (line 63) | func Debugf(format string, args ...interface{}) {
function Debug (line 68) | func Debug(args ...interface{}) {
function Tracef (line 73) | func Tracef(format string, args ...interface{}) {
function Trace (line 78) | func Trace(args ...interface{}) {
function WithFields (line 83) | func WithFields(fields ...interface{}) logger.MessageLogger {
function Nested (line 88) | func Nested(fields ...interface{}) logger.Logger {
FILE: internal/mimetype/mimetype_helper.go
function IsArchive (line 67) | func IsArchive(mimeType string) bool {
function IsExecutable (line 71) | func IsExecutable(mimeType string) bool {
FILE: internal/mimetype/mimetype_helper_test.go
function Test_IsArchive (line 9) | func Test_IsArchive(t *testing.T) {
function Test_IsExecutable (line 34) | func Test_IsExecutable(t *testing.T) {
FILE: internal/os/feature_detection.go
function DetectFeatures (line 16) | func DetectFeatures(_ context.Context, resolver file.Resolver, builder s...
function findRhelFeatures (line 31) | func findRhelFeatures(resolver file.Resolver, release *linux.Release) er...
function hasRhelExtendedSupportInContentManifest (line 52) | func hasRhelExtendedSupportInContentManifest(resolver file.Resolver, con...
FILE: internal/os/feature_detection_test.go
function Test_EnvironmentTask (line 19) | func Test_EnvironmentTask(t *testing.T) {
FILE: internal/packagemetadata/completion_tester.go
type CompletionTester (line 8) | type CompletionTester struct
method Ignore (line 27) | func (tr *CompletionTester) Ignore(is ...any) {
method Expect (line 31) | func (tr *CompletionTester) Expect(is ...any) {
method Tested (line 35) | func (tr *CompletionTester) Tested(t testing.TB, m any) {
method validate (line 62) | func (tr *CompletionTester) validate(t testing.TB) {
function NewCompletionTester (line 14) | func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester {
function keepNonNil (line 87) | func keepNonNil(is ...any) []any {
FILE: internal/packagemetadata/discover_type_names.go
function DiscoverTypeNames (line 32) | func DiscoverTypeNames() ([]string, error) {
function RepoRoot (line 44) | func RepoRoot() (string, error) {
function findMetadataDefinitionNames (line 56) | func findMetadataDefinitionNames(paths ...string) ([]string, error) {
function findMetadataDefinitionNamesInFile (line 96) | func findMetadataDefinitionNamesInFile(path string) ([]string, []string,...
function extractSliceOfStructType (line 144) | func extractSliceOfStructType(exp ast.Expr) *ast.StructType {
function extractStructType (line 172) | func extractStructType(exp ast.Expr) *ast.StructType {
function typeNamesUsedInStruct (line 200) | func typeNamesUsedInStruct(structType *ast.StructType) []string {
function isMetadataTypeCandidate (line 222) | func isMetadataTypeCandidate(name string) bool {
FILE: internal/packagemetadata/discover_type_names_test.go
function TestDiscoverTypeNames_byExample (line 11) | func TestDiscoverTypeNames_byExample(t *testing.T) {
FILE: internal/packagemetadata/generate/main.go
constant pkgImport (line 16) | pkgImport = "github.com/anchore/syft/syft/pkg"
constant path (line 17) | path = "packagemetadata/generated.go"
function main (line 20) | func main() {
FILE: internal/packagemetadata/generated.go
function AllTypes (line 8) | func AllTypes() []any {
FILE: internal/packagemetadata/names.go
type jsonType (line 10) | type jsonType struct
function jsonNames (line 17) | func jsonNames(ty any, name string, legacyNames ...string) jsonType {
function jsonNamesWithoutLookup (line 25) | func jsonNamesWithoutLookup(ty any, name string, noLookupLegacyName stri...
type jsonTypeMapping (line 33) | type jsonTypeMapping struct
function makeJSONTypes (line 39) | func makeJSONTypes(types ...jsonType) jsonTypeMapping {
function expandLegacyNameVariants (line 131) | func expandLegacyNameVariants(names ...string) []string {
function AllTypeNames (line 144) | func AllTypeNames() []string {
function JSONName (line 152) | func JSONName(metadata any) string {
function JSONLegacyName (line 159) | func JSONLegacyName(metadata any) string {
function ReflectTypeFromJSONName (line 166) | func ReflectTypeFromJSONName(name string) reflect.Type {
function JSONNameFromString (line 173) | func JSONNameFromString(typeName string) string {
function ToUpperCamelCase (line 188) | func ToUpperCamelCase(kebab string) string {
FILE: internal/packagemetadata/names_test.go
function TestAllNames (line 14) | func TestAllNames(t *testing.T) {
function TestReflectTypeFromJSONName (line 34) | func TestReflectTypeFromJSONName(t *testing.T) {
function TestReflectTypeFromJSONName_LegacyValues (line 76) | func TestReflectTypeFromJSONName_LegacyValues(t *testing.T) {
function Test_JSONName_JSONLegacyName (line 264) | func Test_JSONName_JSONLegacyName(t *testing.T) {
FILE: internal/redact/redact.go
function Set (line 7) | func Set(s redact.Store) {
function Get (line 16) | func Get() redact.Store {
function Add (line 20) | func Add(vs ...string) {
function Apply (line 29) | func Apply(value string) string {
FILE: internal/regex_helpers.go
constant readerChunkSize (line 8) | readerChunkSize = 1024 * 1024
function MatchNamedCaptureGroups (line 12) | func MatchNamedCaptureGroups(regEx *regexp.Regexp, content string) map[s...
function MatchNamedCaptureGroupsFromReader (line 42) | func MatchNamedCaptureGroupsFromReader(re *regexp.Regexp, r io.Reader) (...
function MatchAnyFromReader (line 56) | func MatchAnyFromReader(r io.Reader, res ...*regexp.Regexp) (bool, error) {
function matchNamedCaptureGroupsHandler (line 60) | func matchNamedCaptureGroupsHandler(re *regexp.Regexp, results map[strin...
function matchAnyHandler (line 75) | func matchAnyHandler(res []*regexp.Regexp) func(data []byte) (bool, erro...
function processReaderInChunks (line 88) | func processReaderInChunks(rdr io.Reader, chunkSize int, handler func(da...
function isEmptyMap (line 123) | func isEmptyMap(m map[string]string) bool {
FILE: internal/regex_helpers_test.go
function TestMatchCaptureGroups (line 12) | func TestMatchCaptureGroups(t *testing.T) {
function TestMatchNamedCaptureGroupsFromReader (line 74) | func TestMatchNamedCaptureGroupsFromReader(t *testing.T) {
function TestMatchAnyFromReader (line 122) | func TestMatchAnyFromReader(t *testing.T) {
function TestProcessReaderInChunks_ChunkBoundaries (line 169) | func TestProcessReaderInChunks_ChunkBoundaries(t *testing.T) {
FILE: internal/relationship/binary/binary_dependencies.go
function NewDependencyRelationships (line 15) | func NewDependencyRelationships(resolver file.Resolver, accessor sbomsyn...
function generateRelationships (line 27) | func generateRelationships(resolver file.Resolver, accessor sbomsync.Acc...
function PackagesToRemove (line 61) | func PackagesToRemove(accessor sbomsync.Accessor) []artifact.ID {
function compareElfBinaryPackages (line 70) | func compareElfBinaryPackages(s *sbom.SBOM) []artifact.ID {
function onlyPrimaryEvidenceLocations (line 88) | func onlyPrimaryEvidenceLocations(p pkg.Package) []file.Location {
function allElfPackages (line 100) | func allElfPackages(s *sbom.SBOM) []pkg.Package {
function isElfPackage (line 111) | func isElfPackage(p pkg.Package) bool {
function populateRelationships (line 116) | func populateRelationships(exec file.Executable, parentPkg pkg.Package, ...
FILE: internal/relationship/binary/binary_dependencies_test.go
function TestPackagesToRemove (line 18) | func TestPackagesToRemove(t *testing.T) {
function TestNewDependencyRelationships (line 137) | func TestNewDependencyRelationships(t *testing.T) {
function relationshipComparer (line 343) | func relationshipComparer(x, y []artifact.Relationship) string {
function lessRelationships (line 352) | func lessRelationships(r1, r2 artifact.Relationship) bool {
function newAccessor (line 365) | func newAccessor(pkgs []pkg.Package, coordinateIndex map[file.Coordinate...
FILE: internal/relationship/binary/shared_library_index.go
type sharedLibraryIndex (line 13) | type sharedLibraryIndex struct
method build (line 31) | func (i *sharedLibraryIndex) build(resolver file.Resolver, accessor sb...
method owningLibraryPackage (line 39) | func (i *sharedLibraryIndex) owningLibraryPackage(libraryBasename stri...
function newShareLibIndex (line 19) | func newShareLibIndex(resolver file.Resolver, accessor sbomsync.Accessor...
function locationsThatProvideLibraries (line 54) | func locationsThatProvideLibraries(accessor sbomsync.Accessor) (map[stri...
function packagesWithLibraryOwnership (line 76) | func packagesWithLibraryOwnership(resolver file.Resolver, accessor sboms...
function populatePackagesByLibraryPath (line 102) | func populatePackagesByLibraryPath(
FILE: internal/relationship/binary/shared_library_index_test.go
function Test_newShareLibIndex (line 12) | func Test_newShareLibIndex(t *testing.T) {
function Test_sharedLibraryIndex_build (line 39) | func Test_sharedLibraryIndex_build(t *testing.T) {
FILE: internal/relationship/by_file_ownership.go
constant altRpmDBGlob (line 19) | altRpmDBGlob = "**/rpm/{Packages,Packages.db,rpmdb.sqlite}"
type ownershipByFilesMetadata (line 32) | type ownershipByFilesMetadata struct
function ByFileOwnershipOverlapWorker (line 36) | func ByFileOwnershipOverlapWorker(resolver file.Resolver, accessor sboms...
function byFileOwnershipOverlap (line 50) | func byFileOwnershipOverlap(resolver file.Resolver, catalog *pkg.Collect...
function findOwnershipByFilesRelationships (line 88) | func findOwnershipByFilesRelationships(resolver file.Resolver, catalog *...
function directOwnersByPath (line 162) | func directOwnersByPath(catalog *pkg.Collection) map[pkg.Type]*strset.Set {
function resolvePaths (line 195) | func resolvePaths(ownedFilePath string, resolver file.Resolver) []string {
function matchesAny (line 214) | func matchesAny(s string, globs []string) bool {
FILE: internal/relationship/by_file_ownership_test.go
type mockFR (line 15) | type mockFR struct
method FilesByPath (line 20) | func (m mockFR) FilesByPath(paths ...string) ([]file.Location, error) {
function TestOwnershipByFilesRelationship (line 32) | func TestOwnershipByFilesRelationship(t *testing.T) {
FILE: internal/relationship/evident_by.go
function EvidentBy (line 8) | func EvidentBy(catalog *pkg.Collection) []artifact.Relationship {
FILE: internal/relationship/evident_by_test.go
function TestRelationshipsEvidentBy (line 14) | func TestRelationshipsEvidentBy(t *testing.T) {
FILE: internal/relationship/exclude_binaries_by_file_ownership_overlap.go
function ExcludeBinariesByFileOwnershipOverlap (line 35) | func ExcludeBinariesByFileOwnershipOverlap(accessor sbomsync.Accessor) {
function excludeByFileOwnershipOverlap (line 48) | func excludeByFileOwnershipOverlap(r artifact.Relationship, c *pkg.Colle...
function identifyOverlappingJVMRelationship (line 80) | func identifyOverlappingJVMRelationship(parent *pkg.Package, child *pkg....
function identifyOverlappingOSRelationship (line 115) | func identifyOverlappingOSRelationship(parent *pkg.Package, child *pkg.P...
function identifyOverlappingBitnamiRelationship (line 136) | func identifyOverlappingBitnamiRelationship(parent *pkg.Package, child *...
FILE: internal/relationship/exclude_binaries_by_file_ownership_overlap_test.go
function TestExcludeByFileOwnershipOverlap (line 12) | func TestExcludeByFileOwnershipOverlap(t *testing.T) {
function TestIdentifyOverlappingOSRelationship (line 75) | func TestIdentifyOverlappingOSRelationship(t *testing.T) {
function TestIdentifyOverlappingBitnamiRelationship (line 132) | func TestIdentifyOverlappingBitnamiRelationship(t *testing.T) {
function TestIdentifyOverlappingJVMRelationship (line 189) | func TestIdentifyOverlappingJVMRelationship(t *testing.T) {
FILE: internal/relationship/index.go
type Index (line 12) | type Index struct
method Add (line 29) | func (i *Index) Add(relationships ...artifact.Relationship) {
method Remove (line 67) | func (i *Index) Remove(id artifact.ID) {
method Replace (line 80) | func (i *Index) Replace(ogID artifact.ID, replacement artifact.Identif...
method From (line 109) | func (i *Index) From(identifiable artifact.Identifiable, types ...arti...
method To (line 114) | func (i *Index) To(identifiable artifact.Identifiable, types ...artifa...
method References (line 119) | func (i *Index) References(identifiable artifact.Identifiable, types ....
method Coordinates (line 125) | func (i *Index) Coordinates(identifiable artifact.Identifiable, types ...
method Contains (line 135) | func (i *Index) Contains(r artifact.Relationship) bool {
method All (line 145) | func (i *Index) All(types ...artifact.RelationshipType) []artifact.Rel...
function NewIndex (line 19) | func NewIndex(relationships ...artifact.Relationship) *Index {
function fromMapped (line 149) | func fromMapped(idMap map[artifact.ID]*mappedRelationships, identifiable...
function fromMappedByID (line 156) | func fromMappedByID(idMap map[artifact.ID]*mappedRelationships, id artif...
function toSortedSlice (line 167) | func toSortedSlice(relationships []*sortableRelationship, types []artifa...
function extractCoordinates (line 179) | func extractCoordinates(relationship artifact.Relationship) (results []f...
type mappedRelationships (line 191) | type mappedRelationships struct
method add (line 196) | func (m *mappedRelationships) add(id artifact.ID, newRelationship *sor...
type sortableRelationship (line 209) | type sortableRelationship struct
function sortFunc (line 215) | func sortFunc(a, b *sortableRelationship) int {
FILE: internal/relationship/index_test.go
function Test_Index (line 14) | func Test_Index(t *testing.T) {
function Test_sortOrder (line 80) | func Test_sortOrder(t *testing.T) {
function Test_Coordinates (line 149) | func Test_Coordinates(t *testing.T) {
type id (line 226) | type id
method ID (line 228) | func (i id) ID() artifact.ID {
function slice (line 232) | func slice[T any](values ...T) []T {
function TestRemove (line 236) | func TestRemove(t *testing.T) {
function TestReplace (line 331) | func TestReplace(t *testing.T) {
function compareRelationships (line 383) | func compareRelationships(t testing.TB, expected, actual []artifact.Rela...
function TestReplace_NoExistingRelations (line 397) | func TestReplace_NoExistingRelations(t *testing.T) {
FILE: internal/relationship/remove.go
function RemoveRelationshipsByID (line 6) | func RemoveRelationshipsByID(relationships []artifact.Relationship, id a...
FILE: internal/relationship/sort.go
function Sort (line 13) | func Sort(rels []artifact.Relationship) {
function less (line 19) | func less(i, j artifact.Relationship) bool {
FILE: internal/relationship/to_source.go
function ToSource (line 8) | func ToSource(src artifact.Identifiable, c *pkg.Collection) []artifact.R...
FILE: internal/sbomsync/builder.go
type Builder (line 18) | type Builder interface
type Accessor (line 35) | type Accessor interface
type sbomBuilder (line 40) | type sbomBuilder struct
method onWriteEvent (line 54) | func (b sbomBuilder) onWriteEvent() {
method WriteToSBOM (line 60) | func (b sbomBuilder) WriteToSBOM(fn func(*sbom.SBOM)) {
method ReadFromSBOM (line 68) | func (b sbomBuilder) ReadFromSBOM(fn func(*sbom.SBOM)) {
method AddPackages (line 75) | func (b sbomBuilder) AddPackages(p ...pkg.Package) {
method DeletePackages (line 83) | func (b sbomBuilder) DeletePackages(ids ...artifact.ID) {
method AddRelationships (line 111) | func (b sbomBuilder) AddRelationships(relationship ...artifact.Relatio...
method SetLinuxDistribution (line 119) | func (b sbomBuilder) SetLinuxDistribution(release linux.Release) {
function NewBuilder (line 46) | func NewBuilder(s *sbom.SBOM, onWrite ...func(*sbom.SBOM)) Builder {
FILE: internal/sbomsync/builder_test.go
function TestNewBuilder (line 13) | func TestNewBuilder(t *testing.T) {
function Test_sbomBuilder_DeletePackages (line 40) | func Test_sbomBuilder_DeletePackages(t *testing.T) {
FILE: internal/set.go
type Set (line 9) | type Set
function NewSet (line 12) | func NewSet[T comparable](start ...T) Set[T] {
method Add (line 21) | func (s Set[T]) Add(elements ...T) {
method Remove (line 28) | func (s Set[T]) Remove(element T) {
method Contains (line 33) | func (s Set[T]) Contains(element T) bool {
method ToSlice (line 39) | func (s Set[T]) ToSlice() []T {
method Equals (line 53) | func (s Set[T]) Equals(o Set[T]) bool {
method Empty (line 66) | func (s Set[T]) Empty() bool {
FILE: internal/set_test.go
function TestNewSet (line 10) | func TestNewSet(t *testing.T) {
function TestAdd (line 28) | func TestAdd(t *testing.T) {
function TestRemove (line 49) | func TestRemove(t *testing.T) {
function TestContains (line 70) | func TestContains(t *testing.T) {
function TestToSlice (line 90) | func TestToSlice(t *testing.T) {
function TestEquals (line 108) | func TestEquals(t *testing.T) {
function TestEmpty (line 130) | func TestEmpty(t *testing.T) {
FILE: internal/sourcemetadata/completion_tester.go
type CompletionTester (line 8) | type CompletionTester struct
method Ignore (line 27) | func (tr *CompletionTester) Ignore(is ...any) {
method Expect (line 31) | func (tr *CompletionTester) Expect(is ...any) {
method Tested (line 35) | func (tr *CompletionTester) Tested(t testing.TB, m any) {
method validate (line 62) | func (tr *CompletionTester) validate(t testing.TB) {
function NewCompletionTester (line 14) | func NewCompletionTester(t testing.TB, ignore ...any) *CompletionTester {
function keepNonNil (line 87) | func keepNonNil(is ...any) []any {
FILE: internal/sourcemetadata/discover_type_names.go
function DiscoverTypeNames (line 19) | func DiscoverTypeNames() ([]string, error) {
function repoRoot (line 31) | func repoRoot() (string, error) {
function findMetadataDefinitionNames (line 43) | func findMetadataDefinitionNames(paths ...string) ([]string, error) {
function findMetadataDefinitionNamesInFile (line 78) | func findMetadataDefinitionNamesInFile(path string) ([]string, []string,...
function typeNamesUsedInStruct (line 130) | func typeNamesUsedInStruct(structType *ast.StructType) []string {
function isMetadataTypeCandidate (line 152) | func isMetadataTypeCandidate(name string) bool {
FILE: internal/sourcemetadata/generate/main.go
constant srcImport (line 15) | srcImport = "github.com/anchore/syft/syft/source"
constant path (line 16) | path = "sourcemetadata/generated.go"
function main (line 19) | func main() {
FILE: internal/sourcemetadata/generated.go
function AllTypes (line 8) | func AllTypes() []any {
FILE: internal/sourcemetadata/names.go
function AllTypeNames (line 18) | func AllTypeNames() []string {
function JSONName (line 26) | func JSONName(metadata any) string {
function ReflectTypeFromJSONName (line 33) | func ReflectTypeFromJSONName(name string) reflect.Type {
FILE: internal/sourcemetadata/names_test.go
function TestAllNames (line 12) | func TestAllNames(t *testing.T) {
FILE: internal/spdxlicense/generate/generate_license_list.go
constant source (line 17) | source = "license_list.go"
constant url (line 18) | url = "https://spdx.org/licenses/licenses.json"
function main (line 43) | func main() {
function run (line 50) | func run() error {
function processSPDXLicense (line 108) | func processSPDXLicense(result LicenseList) map[string]string {
function cleanLicenseID (line 161) | func cleanLicenseID(id string) string {
function buildURLToLicenseMap (line 168) | func buildURLToLicenseMap(result LicenseList) map[string]string {
function stripScheme (line 196) | func stripScheme(url string) string {
FILE: internal/spdxlicense/generate/generate_license_list_test.go
function TestReplaceDeprecatedLicenses (line 12) | func TestReplaceDeprecatedLicenses(t *testing.T) {
function Test_processSPDXLicense (line 52) | func Test_processSPDXLicense(t *testing.T) {
FILE: internal/spdxlicense/generate/license.go
type LicenseList (line 9) | type LicenseList struct
method findReplacementLicense (line 24) | func (ll LicenseList) findReplacementLicense(deprecated License) *Lice...
type License (line 14) | type License struct
method canReplace (line 34) | func (l License) canReplace(deprecated License) bool {
function buildLicenseIDPermutations (line 78) | func buildLicenseIDPermutations(cleanID string) (perms []string) {
function findLicenseVersion (line 97) | func findLicenseVersion(license string) (version []string) {
function versionPermutations (line 113) | func versionPermutations(version []string) []string {
FILE: internal/spdxlicense/generate/license_test.go
function TestLicense_canReplace (line 44) | func TestLicense_canReplace(t *testing.T) {
function TestLicensePermutations (line 62) | func TestLicensePermutations(t *testing.T) {
function TestVersionPermutations (line 129) | func TestVersionPermutations(t *testing.T) {
function TestFindLicenseVersion (line 169) | func TestFindLicenseVersion(t *testing.T) {
function Test_findReplacementLicense (line 208) | func Test_findReplacementLicense(t *testing.T) {
FILE: internal/spdxlicense/license.go
constant LicenseRefPrefix (line 16) | LicenseRefPrefix = "LicenseRef-"
function ID (line 24) | func ID(id string) (value string, exists bool) {
function cleanLicenseID (line 33) | func cleanLicenseID(id string) string {
type LicenseInfo (line 40) | type LicenseInfo struct
function LicenseByURL (line 47) | func LicenseByURL(url string) (LicenseInfo, bool) {
function stripScheme (line 60) | func stripScheme(url string) string {
FILE: internal/spdxlicense/license_list.go
constant Version (line 5) | Version = "3.28.0"
FILE: internal/spdxlicense/license_list_test.go
function TestLicenceListIDs (line 9) | func TestLicenceListIDs(t *testing.T) {
FILE: internal/spdxlicense/license_test.go
function TestSPDXIDRecognition (line 9) | func TestSPDXIDRecognition(t *testing.T) {
FILE: internal/spdxlicense/license_url_test.go
function TestLicenseByURL (line 7) | func TestLicenseByURL(t *testing.T) {
function TestLicenseByURL_AlternateScheme (line 79) | func TestLicenseByURL_AlternateScheme(t *testing.T) {
function TestStripScheme (line 126) | func TestStripScheme(t *testing.T) {
function TestLicenseByURL_DeprecatedLicenses (line 169) | func TestLicenseByURL_DeprecatedLicenses(t *testing.T) {
FILE: internal/string_helpers.go
function HasAnyOfPrefixes (line 6) | func HasAnyOfPrefixes(input string, prefixes ...string) bool {
function HasAnyOfSuffixes (line 17) | func HasAnyOfSuffixes(input string, suffixes ...string) bool {
function TruncateMiddleEllipsis (line 27) | func TruncateMiddleEllipsis(input string, maxLen int) string {
function StringInSlice (line 34) | func StringInSlice(a string, list []string) bool {
function SplitAny (line 43) | func SplitAny(s string, seps string) []string {
FILE: internal/string_helpers_test.go
function TestHasAnyOfSuffixes (line 10) | func TestHasAnyOfSuffixes(t *testing.T) {
function TestHasAnyOfPrefixes (line 67) | func TestHasAnyOfPrefixes(t *testing.T) {
function TestTruncateMiddleEllipsis (line 125) | func TestTruncateMiddleEllipsis(t *testing.T) {
function TestSplitAny (line 165) | func TestSplitAny(t *testing.T) {
FILE: internal/task/cataloging_config.go
type CatalogingFactoryConfig (line 9) | type CatalogingFactoryConfig struct
function DefaultCatalogingFactoryConfig (line 19) | func DefaultCatalogingFactoryConfig() CatalogingFactoryConfig {
FILE: internal/task/environment_tasks.go
function NewEnvironmentTask (line 13) | func NewEnvironmentTask() Task {
FILE: internal/task/executor.go
function RunTask (line 18) | func RunTask(ctx context.Context, tsk Task, resolver file.Resolver, s sb...
function appendUnknowns (line 31) | func appendUnknowns(builder sbomsync.Builder, taskName string, unknowns ...
function runTaskSafely (line 50) | func runTaskSafely(ctx context.Context, t Task, resolver file.Resolver, ...
FILE: internal/task/executor_test.go
function Test_TaskExecutor_PanicHandling (line 15) | func Test_TaskExecutor_PanicHandling(t *testing.T) {
FILE: internal/task/expression.go
constant SetOperation (line 17) | SetOperation Operation = "set"
constant AddOperation (line 18) | AddOperation Operation = "add"
constant SubSelectOperation (line 19) | SubSelectOperation Operation = "sub-select"
constant RemoveOperation (line 20) | RemoveOperation Operation = "remove"
type ErrInvalidExpression (line 34) | type ErrInvalidExpression struct
method Error (line 40) | func (e ErrInvalidExpression) Error() string {
function newErrInvalidExpression (line 44) | func newErrInvalidExpression(exp string, op Operation, err error) ErrInv...
type Expression (line 56) | type Expression struct
method String (line 178) | func (e Expression) String() string {
type Operation (line 63) | type Operation
type Expressions (line 66) | type Expressions
method Clone (line 172) | func (e Expressions) Clone() Expressions {
method Len (line 195) | func (e Expressions) Len() int {
method Swap (line 199) | func (e Expressions) Swap(i, j int) {
method Less (line 211) | func (e Expressions) Less(i, j int) bool {
method Errors (line 222) | func (e Expressions) Errors() (errs []error) {
method Validate (line 231) | func (e Expressions) Validate() error {
type expressionContext (line 69) | type expressionContext struct
method newExpression (line 86) | func (ec expressionContext) newExpression(exp string, operation Operat...
function newExpressionContext (line 74) | func newExpressionContext(ts []Task) *expressionContext {
function newExpressionsFromSelectionRequest (line 145) | func newExpressionsFromSelectionRequest(nc *expressionContext, selection...
function isValidNode (line 168) | func isValidNode(s string) bool {
FILE: internal/task/expression_test.go
function Test_newExpressionsFromSelectionRequest (line 13) | func Test_newExpressionsFromSelectionRequest(t *testing.T) {
function Test_expressionNodes_sort (line 157) | func Test_expressionNodes_sort(t *testing.T) {
FILE: internal/task/factory.go
type factory (line 11) | type factory
type Factories (line 13) | type Factories
method Tasks (line 15) | func (f Factories) Tasks(cfg CatalogingFactoryConfig) ([]Task, error) {
FILE: internal/task/feature_detection.go
function NewOSFeatureDetectionTask (line 5) | func NewOSFeatureDetectionTask() Task {
FILE: internal/task/file_tasks.go
function DefaultFileTaskFactories (line 19) | func DefaultFileTaskFactories() Factories {
function newFileDigestCatalogerTaskFactory (line 28) | func newFileDigestCatalogerTaskFactory(tags ...string) factory {
function newFileDigestCatalogerTask (line 34) | func newFileDigestCatalogerTask(selection file.Selection, hashers []cryp...
function newFileMetadataCatalogerTaskFactory (line 59) | func newFileMetadataCatalogerTaskFactory(tags ...string) factory {
function newFileMetadataCatalogerTask (line 65) | func newFileMetadataCatalogerTask(selection file.Selection, tags ...stri...
function newFileContentCatalogerTaskFactory (line 90) | func newFileContentCatalogerTaskFactory(tags ...string) factory {
function newFileContentCatalogerTask (line 96) | func newFileContentCatalogerTask(cfg filecontent.Config, tags ...string)...
function newExecutableCatalogerTaskFactory (line 116) | func newExecutableCatalogerTaskFactory(tags ...string) factory {
function newExecutableCatalogerTask (line 122) | func newExecutableCatalogerTask(selection file.Selection, cfg executable...
function coordinatesForSelection (line 144) | func coordinatesForSelection(selection file.Selection, accessor sbomsync...
function commonFileTags (line 184) | func commonFileTags(tags []string) []string {
FILE: internal/task/file_tasks_test.go
function Test_coordinatesForSelection (line 15) | func Test_coordinatesForSelection(t *testing.T) {
FILE: internal/task/package_task_factory.go
function newPackageTaskFactory (line 23) | func newPackageTaskFactory(catalogerFactory func(CatalogingFactoryConfig...
function newSimplePackageTaskFactory (line 29) | func newSimplePackageTaskFactory(catalogerFactory func() pkg.Cataloger, ...
function NewPackageTask (line 36) | func NewPackageTask(cfg CatalogingFactoryConfig, c pkg.Cataloger, tags ....
function finalizePkgCatalogerResults (line 75) | func finalizePkgCatalogerResults(cfg CatalogingFactoryConfig, resolver f...
type packageReplacement (line 120) | type packageReplacement struct
function applyCompliance (line 125) | func applyCompliance(cfg cataloging.ComplianceConfig, pkgs []pkg.Package...
function filterNonCompliantPackages (line 140) | func filterNonCompliantPackages(pkgs []pkg.Package, cfg cataloging.Compl...
function applyComplianceRules (line 158) | func applyComplianceRules(p *pkg.Package, cfg cataloging.ComplianceConfi...
function hasAuthoritativeCPE (line 210) | func hasAuthoritativeCPE(cpes []cpe.CPE) bool {
function prettyName (line 219) | func prettyName(s string) string {
function packageFileOwnershipRelationships (line 231) | func packageFileOwnershipRelationships(p pkg.Package, resolver file.Path...
function applyLicenseContentRules (line 271) | func applyLicenseContentRules(p *pkg.Package, cfg cataloging.LicenseConf...
FILE: internal/task/package_task_factory_test.go
function Test_hasAuthoritativeCPE (line 16) | func Test_hasAuthoritativeCPE(t *testing.T) {
function TestApplyCompliance (line 62) | func TestApplyCompliance(t *testing.T) {
function TestFilterNonCompliantPackages (line 97) | func TestFilterNonCompliantPackages(t *testing.T) {
function TestApplyLicenseContentRules (line 120) | func TestApplyLicenseContentRules(t *testing.T) {
function TestApplyComplianceRules_DropAndStub (line 263) | func TestApplyComplianceRules_DropAndStub(t *testing.T) {
FILE: internal/task/package_tasks.go
constant Java (line 45) | Java = "java"
constant Maven (line 46) | Maven = "maven"
constant Go (line 49) | Go = "go"
constant Golang (line 50) | Golang = "golang"
constant JavaScript (line 53) | JavaScript = "javascript"
constant Node (line 54) | Node = "node"
constant NPM (line 55) | NPM = "npm"
constant Python (line 58) | Python = "python"
function DefaultPackageTaskFactories (line 62) | func DefaultPackageTaskFactories() Factories {
FILE: internal/task/relationship_tasks.go
type sourceIdentifierAdapter (line 18) | type sourceIdentifierAdapter struct
method ID (line 22) | func (s sourceIdentifierAdapter) ID() artifact.ID {
function NewRelationshipsTask (line 26) | func NewRelationshipsTask(cfg cataloging.RelationshipsConfig, src source...
function finalizeRelationships (line 40) | func finalizeRelationships(resolver file.Resolver, builder sbomsync.Buil...
FILE: internal/task/scope_tasks.go
function NewDeepSquashedScopeCleanupTask (line 14) | func NewDeepSquashedScopeCleanupTask() Task {
function packagesToRemove (line 26) | func packagesToRemove(accessor sbomsync.Accessor) []artifact.ID {
function getKey (line 61) | func getKey(pkg pkg.Package, loc file.Location) string {
FILE: internal/task/selection.go
type Selection (line 17) | type Selection struct
type TokenSelection (line 24) | type TokenSelection struct
method merge (line 36) | func (ts *TokenSelection) merge(other ...TokenSelection) {
function newTokenSelection (line 29) | func newTokenSelection(selected, deselected []string) TokenSelection {
function newSelection (line 47) | func newSelection() Selection {
function Select (line 57) | func Select(allTasks []Task, selectionRequest cataloging.SelectionReques...
function _select (line 63) | func _select(allTasks []Task, selectionRequest cataloging.SelectionReque...
function ensureDefaultSelectionHasFiles (line 80) | func ensureDefaultSelectionHasFiles(selectionRequest *cataloging.Selecti...
function SelectInGroups (line 101) | func SelectInGroups(taskGroups [][]Task, selectionRequest cataloging.Sel...
function mergeSelections (line 128) | func mergeSelections(selections []Selection, ogRequest cataloging.Select...
function splitCatalogerSelectionRequest (line 145) | func splitCatalogerSelectionRequest(req cataloging.SelectionRequest, sel...
function newSelectionWithTags (line 174) | func newSelectionWithTags(req cataloging.SelectionRequest, tags *strset....
function filterTags (line 183) | func filterTags(reqTags []string, filterTags *strset.Set) []string {
function tagsOrNamesThatTaskGroupRespondsTo (line 193) | func tagsOrNamesThatTaskGroupRespondsTo(tasks []Task, requestTagsOrNames...
function allRequestReferences (line 205) | func allRequestReferences(s cataloging.SelectionRequest) *strset.Set {
function selectByExpressions (line 215) | func selectByExpressions(ts tasks, nodes Expressions) (tasks, Selection) {
function evaluateExpression (line 277) | func evaluateExpression(ts tasks, node Expression) ([]Task, map[string]T...
function isSelected (line 307) | func isSelected(td Task, token string) bool {
FILE: internal/task/selection_test.go
function dummyTask (line 17) | func dummyTask(name string, tags ...string) Task {
function createDummyPackageTasks (line 24) | func createDummyPackageTasks() tasks {
function createDummyFileTasks (line 66) | func createDummyFileTasks() tasks {
function TestSelect (line 75) | func TestSelect(t *testing.T) {
function TestSelectInGroups (line 401) | func TestSelectInGroups(t *testing.T) {
FILE: internal/task/set.go
type set (line 3) | type set struct
method Len (line 19) | func (ts *set) Len() int {
method Add (line 23) | func (ts *set) Add(tasks ...Task) {
method Remove (line 34) | func (ts *set) Remove(tasks ...Task) {
method Intersect (line 51) | func (ts *set) Intersect(tasks ...Task) {
method Tasks (line 64) | func (ts set) Tasks() tasks {
function newSet (line 8) | func newSet(tasks ...Task) *set {
FILE: internal/task/set_test.go
type mockTask (line 15) | type mockTask struct
method Execute (line 19) | func (m mockTask) Execute(_ context.Context, _ file.Resolver, _ sbomsy...
method Name (line 23) | func (m mockTask) Name() string {
function Test_set_Add (line 27) | func Test_set_Add(t *testing.T) {
function Test_set_Remove (line 69) | func Test_set_Remove(t *testing.T) {
function Test_set_Intersect (line 99) | func Test_set_Intersect(t *testing.T) {
function Test_set_Tasks (line 129) | func Test_set_Tasks(t *testing.T) {
FILE: internal/task/task.go
type Task (line 20) | type Task interface
type Selector (line 25) | type Selector interface
type tasks (line 30) | type tasks
method Names (line 67) | func (ts tasks) Names() []string {
method Tags (line 75) | func (ts tasks) Tags() []string {
type task (line 32) | type task struct
method HasAllSelectors (line 50) | func (t task) HasAllSelectors(ids ...string) bool {
method Selectors (line 55) | func (t task) Selectors() []string {
method Name (line 59) | func (t task) Name() string {
method Execute (line 63) | func (t task) Execute(ctx context.Context, resolver file.Resolver, sbo...
function NewTask (line 38) | func NewTask(name string, tsk func(context.Context, file.Resolver, sboms...
FILE: internal/task/unknowns_tasks.go
constant unknownsLabelerTaskName (line 16) | unknownsLabelerTaskName = "unknowns-labeler"
function NewUnknownsLabelerTask (line 18) | func NewUnknownsLabelerTask(cfg cataloging.UnknownsConfig) Task {
type unknownsLabelerTask (line 22) | type unknownsLabelerTask struct
method processUnknowns (line 27) | func (c unknownsLabelerTask) processUnknowns(_ context.Context, resolv...
method finalize (line 35) | func (c unknownsLabelerTask) finalize(resolver file.Resolver, s *sbom....
function formatUnknown (line 70) | func formatUnknown(err string, task ...string) string {
function coordinateReferenceLookup (line 74) | func coordinateReferenceLookup(resolver file.Resolver, s *sbom.SBOM) fun...
FILE: internal/testutils/golden_files.go
constant TestDataDir (line 13) | TestDataDir = "testdata"
constant GoldenFileDirName (line 14) | GoldenFileDirName = "snapshot"
constant GoldenFileExt (line 15) | GoldenFileExt = ".golden"
constant GoldenFileDirPath (line 16) | GoldenFileDirPath = TestDataDir + string(filepath.Separator) + GoldenFil...
function GetGoldenFilePath (line 19) | func GetGoldenFilePath(t *testing.T) string {
function UpdateGoldenFileContents (line 27) | func UpdateGoldenFileContents(t *testing.T, contents []byte) {
function GetGoldenFileContents (line 40) | func GetGoldenFileContents(t *testing.T) []byte {
function fileOrDirExists (line 62) | func fileOrDirExists(t *testing.T, filename string) bool {
function dangerText (line 69) | func dangerText(s string) string {
FILE: internal/tmpdir/tmpdir.go
type ctxKey (line 11) | type ctxKey struct
function Root (line 16) | func Root(ctx context.Context, prefix string) (context.Context, *TempDir) {
function FromPath (line 24) | func FromPath(dir string) *TempDir {
function WithValue (line 33) | func WithValue(ctx context.Context, td *TempDir) context.Context {
function FromContext (line 38) | func FromContext(ctx context.Context) *TempDir {
type TempDir (line 47) | type TempDir struct
method path (line 59) | func (t *TempDir) path() (string, error) {
method NewChild (line 76) | func (t *TempDir) NewChild(name string) (string, func(), error) {
method NewFile (line 95) | func (t *TempDir) NewFile(pattern string) (*os.File, func(), error) {
method Cleanup (line 111) | func (t *TempDir) Cleanup() error {
function noop (line 56) | func noop() {}
FILE: internal/tmpdir/tmpdir_test.go
function TestRootAndFromContext (line 13) | func TestRootAndFromContext(t *testing.T) {
function TestWithValue (line 22) | func TestWithValue(t *testing.T) {
function TestNewChild (line 37) | func TestNewChild(t *testing.T) {
function TestNewFile (line 64) | func TestNewFile(t *testing.T) {
function TestCleanup (line 81) | func TestCleanup(t *testing.T) {
function TestCleanupPreventsNewAllocation (line 114) | func TestCleanupPreventsNewAllocation(t *testing.T) {
function TestEarlyCleanupFile (line 125) | func TestEarlyCleanupFile(t *testing.T) {
function TestEarlyCleanupChild (line 148) | func TestEarlyCleanupChild(t *testing.T) {
function TestEarlyCleanupThenRootCleanup (line 168) | func TestEarlyCleanupThenRootCleanup(t *testing.T) {
function TestConcurrentNewChildAndNewFile (line 193) | func TestConcurrentNewChildAndNewFile(t *testing.T) {
function TestConcurrentNewChildDuringCleanup (line 238) | func TestConcurrentNewChildDuringCleanup(t *testing.T) {
function TestLazyCreation (line 262) | func TestLazyCreation(t *testing.T) {
function TestFromPath (line 276) | func TestFromPath(t *testing.T) {
FILE: internal/tprint.go
function Tprintf (line 9) | func Tprintf(tmpl string, data map[string]interface{}) string {
FILE: internal/unknown/coordinate_error.go
type hasCoordinates (line 12) | type hasCoordinates interface
type CoordinateError (line 16) | type CoordinateError struct
method Error (line 23) | func (u *CoordinateError) Error() string {
function New (line 32) | func New(coords hasCoordinates, reason error) *CoordinateError {
function Newf (line 50) | func Newf(coords hasCoordinates, format string, args ...any) *Coordinate...
function Append (line 55) | func Append(errs error, coords hasCoordinates, reason error) error {
function Appendf (line 61) | func Appendf(errs error, coords hasCoordinates, format string, args ...a...
function Join (line 67) | func Join(errs ...error) error {
function Joinf (line 90) | func Joinf(errs error, format string, args ...any) error {
function IfEmptyf (line 96) | func IfEmptyf[T any](emptyTest []T, format string, args ...any) error {
function ExtractCoordinateErrors (line 105) | func ExtractCoordinateErrors(err error) (coordinateErrors []CoordinateEr...
function flatten (line 116) | func flatten(errs ...error) []error {
function containsErr (line 152) | func containsErr(out []error, err error) bool {
function visitErrors (line 168) | func visitErrors(err error, fn func(error) error) error {
FILE: internal/unknown/coordinate_error_test.go
function Test_visitErrors (line 14) | func Test_visitErrors(t *testing.T) {
function Test_Join (line 112) | func Test_Join(t *testing.T) {
function Test_flatten (line 170) | func Test_flatten(t *testing.T) {
function Test_Append (line 220) | func Test_Append(t *testing.T) {
FILE: internal/unknown/path_error.go
function ProcessPathErrors (line 14) | func ProcessPathErrors(err error) error {
FILE: internal/unknown/path_error_test.go
function Test_ProcessPathErrors (line 12) | func Test_ProcessPathErrors(t *testing.T) {
FILE: syft/artifact/id.go
type ID (line 10) | type ID
type Identifiable (line 12) | type Identifiable interface
function IDByHash (line 16) | func IDByHash(obj interface{}) (ID, error) {
FILE: syft/artifact/relationship.go
constant OwnershipByFileOverlapRelationship (line 8) | OwnershipByFileOverlapRelationship RelationshipType = "ownership-by-file...
constant EvidentByRelationship (line 14) | EvidentByRelationship RelationshipType = "evident-by"
constant ContainsRelationship (line 17) | ContainsRelationship RelationshipType = "contains"
constant DependencyOfRelationship (line 20) | DependencyOfRelationship RelationshipType = "dependency-of"
constant DescribedByRelationship (line 23) | DescribedByRelationship RelationshipType = "described-by"
function AllRelationshipTypes (line 26) | func AllRelationshipTypes() []RelationshipType {
type RelationshipType (line 35) | type RelationshipType
type Relationship (line 37) | type Relationship struct
FILE: syft/cataloging/archive_search.go
type ArchiveSearchConfig (line 3) | type ArchiveSearchConfig struct
method WithIncludeIndexedArchives (line 18) | func (c ArchiveSearchConfig) WithIncludeIndexedArchives(include bool) ...
method WithIncludeUnindexedArchives (line 23) | func (c ArchiveSearchConfig) WithIncludeUnindexedArchives(include bool...
function DefaultArchiveSearchConfig (line 11) | func DefaultArchiveSearchConfig() ArchiveSearchConfig {
FILE: syft/cataloging/compliance.go
constant ComplianceActionKeep (line 8) | ComplianceActionKeep ComplianceAction = "keep"
constant ComplianceActionDrop (line 9) | ComplianceActionDrop ComplianceAction = "drop"
constant ComplianceActionStub (line 10) | ComplianceActionStub ComplianceAction = "stub"
constant UnknownStubValue (line 13) | UnknownStubValue = "UNKNOWN"
type ComplianceAction (line 15) | type ComplianceAction
method Parse (line 37) | func (c ComplianceAction) Parse() ComplianceAction {
type ComplianceConfig (line 17) | type ComplianceConfig struct
method Parse (line 30) | func (c ComplianceConfig) Parse() ComplianceConfig {
function DefaultComplianceConfig (line 22) | func DefaultComplianceConfig() ComplianceConfig {
FILE: syft/cataloging/data_generation.go
type DataGenerationConfig (line 3) | type DataGenerationConfig struct
method WithGenerateCPEs (line 13) | func (c DataGenerationConfig) WithGenerateCPEs(generate bool) DataGene...
function DefaultDataGenerationConfig (line 7) | func DefaultDataGenerationConfig() DataGenerationConfig {
FILE: syft/cataloging/executor.go
constant ExecutorCPU (line 5) | ExecutorCPU = "cpu"
constant ExecutorFile (line 8) | ExecutorFile = "file"
FILE: syft/cataloging/filecataloging/config.go
type Config (line 16) | type Config struct
method MarshalJSON (line 42) | func (cfg Config) MarshalJSON() ([]byte, error) {
method UnmarshalJSON (line 58) | func (cfg *Config) UnmarshalJSON(data []byte) error {
method WithSelection (line 73) | func (cfg Config) WithSelection(selection file.Selection) Config {
method WithHashers (line 78) | func (cfg Config) WithHashers(hashers ...crypto.Hash) Config {
method WithContentConfig (line 83) | func (cfg Config) WithContentConfig(content filecontent.Config) Config {
type configMarshaledForm (line 23) | type configMarshaledForm struct
function DefaultConfig (line 29) | func DefaultConfig() Config {
function hashersToString (line 50) | func hashersToString(hashers []crypto.Hash) []string {
FILE: syft/cataloging/filecataloging/config_test.go
function TestConfig_MarshalJSON (line 14) | func TestConfig_MarshalJSON(t *testing.T) {
function TestConfig_UnmarshalJSON (line 47) | func TestConfig_UnmarshalJSON(t *testing.T) {
FILE: syft/cataloging/filecataloging/tags.go
constant FileTag (line 5) | FileTag = "file"
FILE: syft/cataloging/license.go
type LicenseContent (line 8) | type LicenseContent
constant LicenseContentIncludeAll (line 11) | LicenseContentIncludeAll LicenseContent = "all"
constant LicenseContentIncludeUnknown (line 12) | LicenseContentIncludeUnknown LicenseContent = "unknown"
constant LicenseContentExcludeAll (line 13) | LicenseContentExcludeAll LicenseContent = "none"
type LicenseConfig (line 16) | type LicenseConfig struct
function DefaultLicenseConfig (line 24) | func DefaultLicenseConfig() LicenseConfig {
FILE: syft/cataloging/pkgcataloging/cataloger_reference.go
type CatalogerReference (line 5) | type CatalogerReference struct
function NewCatalogerReference (line 11) | func NewCatalogerReference(cataloger pkg.Cataloger, tags []string) Catal...
function NewAlwaysEnabledCatalogerReference (line 18) | func NewAlwaysEnabledCatalogerReference(cataloger pkg.Cataloger) Catalog...
FILE: syft/cataloging/pkgcataloging/config.go
type Config (line 14) | type Config struct
method WithNixConfig (line 37) | func (c Config) WithNixConfig(cfg nix.Config) Config {
method WithBinaryConfig (line 42) | func (c Config) WithBinaryConfig(cfg binary.ClassifierCatalogerConfig)...
method WithDotnetConfig (line 47) | func (c Config) WithDotnetConfig(cfg dotnet.CatalogerConfig) Config {
method WithGolangConfig (line 52) | func (c Config) WithGolangConfig(cfg golang.CatalogerConfig) Config {
method WithJavascriptConfig (line 57) | func (c Config) WithJavascriptConfig(cfg javascript.CatalogerConfig) C...
method WithLinuxKernelConfig (line 62) | func (c Config) WithLinuxKernelConfig(cfg kernel.LinuxKernelCatalogerC...
method WithPythonConfig (line 67) | func (c Config) WithPythonConfig(cfg python.CatalogerConfig) Config {
method WithJavaArchiveConfig (line 72) | func (c Config) WithJavaArchiveConfig(cfg java.ArchiveCatalogerConfig)...
function DefaultConfig (line 25) | func DefaultConfig() Config {
FILE: syft/cataloging/pkgcataloging/tags.go
constant InstalledTag (line 5) | InstalledTag = "installed"
constant DeclaredTag (line 8) | DeclaredTag = "declared"
constant ImageTag (line 11) | ImageTag = "image"
constant DirectoryTag (line 14) | DirectoryTag = "directory"
constant PackageTag (line 17) | PackageTag = "package"
constant OSTag (line 20) | OSTag = "os"
constant LanguageTag (line 23) | LanguageTag = "language"
constant DeprecatedTag (line 26) | DeprecatedTag = "deprecated"
FILE: syft/cataloging/relationships.go
type RelationshipsConfig (line 3) | type RelationshipsConfig struct
method WithPackageFileOwnership (line 26) | func (c RelationshipsConfig) WithPackageFileOwnership(ownership bool) ...
method WithPackageFileOwnershipOverlap (line 31) | func (c RelationshipsConfig) WithPackageFileOwnershipOverlap(overlap b...
method WithExcludeBinaryPackagesWithFileOwnershipOverlap (line 36) | func (c RelationshipsConfig) WithExcludeBinaryPackagesWithFileOwnershi...
function DefaultRelationshipsConfig (line 18) | func DefaultRelationshipsConfig() RelationshipsConfig {
FILE: syft/cataloging/search.go
type SearchConfig (line 5) | type SearchConfig struct
method WithScope (line 15) | func (c SearchConfig) WithScope(scope source.Scope) SearchConfig {
function DefaultSearchConfig (line 9) | func DefaultSearchConfig() SearchConfig {
FILE: syft/cataloging/selection.go
type SelectionRequest (line 5) | type SelectionRequest struct
method WithExpression (line 16) | func (s SelectionRequest) WithExpression(expressions ...string) Select...
method WithDefaults (line 31) | func (s SelectionRequest) WithDefaults(nameOrTags ...string) Selection...
method WithSubSelections (line 36) | func (s SelectionRequest) WithSubSelections(tags ...string) SelectionR...
method WithAdditions (line 41) | func (s SelectionRequest) WithAdditions(names ...string) SelectionRequ...
method WithRemovals (line 46) | func (s SelectionRequest) WithRemovals(nameOrTags ...string) Selection...
method IsEmpty (line 51) | func (s SelectionRequest) IsEmpty() bool {
function NewSelectionRequest (line 12) | func NewSelectionRequest() SelectionRequest {
function cleanSelection (line 55) | func cleanSelection(tags []string) []string {
FILE: syft/cataloging/unknowns.go
type UnknownsConfig (line 3) | type UnknownsConfig struct
function DefaultUnknownsConfig (line 9) | func DefaultUnknownsConfig() UnknownsConfig {
FILE: syft/configuration_audit_trail.go
type configurationAuditTrail (line 13) | type configurationAuditTrail struct
method MarshalJSON (line 31) | func (cfg configurationAuditTrail) MarshalJSON() ([]byte, error) {
type catalogerManifest (line 24) | type catalogerManifest struct
type marshalAPIConfiguration (line 29) | type marshalAPIConfiguration
function marshalSorted (line 58) | func marshalSorted(m interface{}) ([]byte, error) {
FILE: syft/configuration_audit_trail_test.go
function Test_configurationAuditTrail_StructTags (line 22) | func Test_configurationAuditTrail_StructTags(t *testing.T) {
function getJSONTags (line 36) | func getJSONTags(t *testing.T, v interface{}) []string {
function collectJSONTags (line 43) | func collectJSONTags(t *testing.T, v reflect.Value, tags *[]string, pare...
function assertLowercaseKebab (line 103) | func assertLowercaseKebab(t *testing.T, tag string) {
function Test_collectJSONTags (line 109) | func Test_collectJSONTags(t *testing.T) {
function Test_configurationAuditTrail_MarshalJSON (line 217) | func Test_configurationAuditTrail_MarshalJSON(t *testing.T) {
function assertJSONKeysSorted (line 263) | func assertJSONKeysSorted(jsonBytes []byte) error {
function Test_assertJSONKeysSorted (line 299) | func Test_assertJSONKeysSorted(t *testing.T) {
FILE: syft/cpe/by_source_then_specificity.go
type BySourceThenSpecificity (line 5) | type BySourceThenSpecificity
method Len (line 7) | func (b BySourceThenSpecificity) Len() int {
method Less (line 11) | func (b BySourceThenSpecificity) Less(i, j int) bool {
method Swap (line 35) | func (b BySourceThenSpecificity) Swap(i, j int) {
FILE: syft/cpe/by_source_then_specificity_test.go
function TestBySourceThenSpecificity (line 10) | func TestBySourceThenSpecificity(t *testing.T) {
FILE: syft/cpe/by_specificity.go
type BySpecificity (line 9) | type BySpecificity
method Len (line 11) | func (c BySpecificity) Len() int { return len(c) }
method Swap (line 13) | func (c BySpecificity) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
method Less (line 15) | func (c BySpecificity) Less(i, j int) bool {
function isMoreSpecific (line 22) | func isMoreSpecific(i, j Attributes) bool {
function countFieldLength (line 43) | func countFieldLength(cpe Attributes) int {
function weightedCountForSpecifiedFields (line 47) | func weightedCountForSpecifiedFields(cpe Attributes) int {
FILE: syft/cpe/by_specificity_test.go
function Test_BySpecificity (line 10) | func Test_BySpecificity(t *testing.T) {
FILE: syft/cpe/cpe.go
type CPE (line 14) | type CPE struct
type Source (line 19) | type Source
method String (line 21) | func (c Source) String() string {
constant GeneratedSource (line 26) | GeneratedSource Source = "syft-generated"
constant NVDDictionaryLookupSource (line 27) | NVDDictionaryLookupSource Source = "nvd-cpe-dictionary"
constant DeclaredSource (line 28) | DeclaredSource Source = "declared"
constant Any (line 31) | Any = ""
type Attributes (line 33) | type Attributes struct
method asAttributes (line 47) | func (c Attributes) asAttributes() wfn.Attributes {
method BindToFmtString (line 55) | func (c Attributes) BindToFmtString() string {
method String (line 186) | func (c Attributes) String() string {
function fromAttributes (line 51) | func fromAttributes(a wfn.Attributes) Attributes {
function NewWithAny (line 59) | func NewWithAny() Attributes {
constant allowedCPEPunctuation (line 64) | allowedCPEPunctuation = "-!\"#$%&'()+,./:;<=>@[]^`{|}~"
constant cpeRegexString (line 70) | cpeRegexString = ((`^([c][pP][eE]:/[AHOaho]?(:[A-Za-z0-9\._\-~%]*){0,6})...
function New (line 77) | func New(value string, source Source) (CPE, error) {
function NewAttributes (line 90) | func NewAttributes(cpeStr string) (Attributes, error) {
function Must (line 108) | func Must(cpeStr string, source Source) CPE {
function MustAttributes (line 116) | func MustAttributes(cpeStr string) Attributes {
function ValidateString (line 124) | func ValidateString(cpeStr string) error {
function newWithoutValidation (line 133) | func newWithoutValidation(cpeStr string) (Attributes, error) {
function normalizeField (line 161) | func normalizeField(field string) string {
function stripSlashes (line 175) | func stripSlashes(s string) string {
function sanitize (line 212) | func sanitize(s string) string {
FILE: syft/cpe/cpe_test.go
function Test_NewAttributes (line 15) | func Test_NewAttributes(t *testing.T) {
function Test_normalizeCpeField (line 61) | func Test_normalizeCpeField(t *testing.T) {
function Test_CPEParser (line 91) | func Test_CPEParser(t *testing.T) {
function Test_InvalidCPE (line 115) | func Test_InvalidCPE(t *testing.T) {
function Test_RoundTrip (line 186) | func Test_RoundTrip(t *testing.T) {
FILE: syft/cpe/merge_cpes.go
function Merge (line 10) | func Merge(a, b []CPE) []CPE {
FILE: syft/cpe/merge_cpes_test.go
function Test_Merge (line 9) | func Test_Merge(t *testing.T) {
FILE: syft/create_sbom.go
function CreateSBOM (line 31) | func CreateSBOM(ctx context.Context, src source.Source, cfg *CreateSBOMC...
function setupContext (line 111) | func setupContext(ctx context.Context, cfg *CreateSBOMConfig) (context.C...
function SetContextLicenseScanner (line 131) | func SetContextLicenseScanner(ctx context.Context, cfg cataloging.Licens...
function setContextExecutors (line 143) | func setContextExecutors(ctx context.Context, cfg *CreateSBOMConfig) con...
function monitorPackageCount (line 169) | func monitorPackageCount(prog *monitor.TaskProgress) func(s *sbom.SBOM) {
function monitorPackageCatalogingTask (line 176) | func monitorPackageCatalogingTask() *monitor.TaskProgress {
function monitorCatalogingTask (line 189) | func monitorCatalogingTask(srcID artifact.ID, tasks [][]task.Task) *moni...
function formatTaskNames (line 209) | func formatTaskNames(tasks []task.Task) []string {
FILE: syft/create_sbom_config.go
type CreateSBOMConfig (line 21) | type CreateSBOMConfig struct
method WithTool (line 85) | func (c *CreateSBOMConfig) WithTool(name, version string, cfg ...any) ...
method WithParallelism (line 93) | func (c *CreateSBOMConfig) WithParallelism(p int) *CreateSBOMConfig {
method WithComplianceConfig (line 99) | func (c *CreateSBOMConfig) WithComplianceConfig(cfg cataloging.Complia...
method WithSearchConfig (line 105) | func (c *CreateSBOMConfig) WithSearchConfig(cfg cataloging.SearchConfi...
method WithRelationshipsConfig (line 111) | func (c *CreateSBOMConfig) WithRelationshipsConfig(cfg cataloging.Rela...
method WithUnknownsConfig (line 117) | func (c *CreateSBOMConfig) WithUnknownsConfig(cfg cataloging.UnknownsC...
method WithDataGenerationConfig (line 124) | func (c *CreateSBOMConfig) WithDataGenerationConfig(cfg cataloging.Dat...
method WithPackagesConfig (line 130) | func (c *CreateSBOMConfig) WithPackagesConfig(cfg pkgcataloging.Config...
method WithLicenseConfig (line 136) | func (c *CreateSBOMConfig) WithLicenseConfig(cfg cataloging.LicenseCon...
method WithFilesConfig (line 142) | func (c *CreateSBOMConfig) WithFilesConfig(cfg filecataloging.Config) ...
method WithoutFiles (line 148) | func (c *CreateSBOMConfig) WithoutFiles() *CreateSBOMConfig {
method WithCatalogerSelection (line 157) | func (c *CreateSBOMConfig) WithCatalogerSelection(selection cataloging...
method WithoutCatalogers (line 164) | func (c *CreateSBOMConfig) WithoutCatalogers() *CreateSBOMConfig {
method WithCatalogers (line 172) | func (c *CreateSBOMConfig) WithCatalogers(catalogerRefs ...pkgcatalogi...
method makeTaskGroups (line 186) | func (c *CreateSBOMConfig) makeTaskGroups(src source.Description) ([][...
method fileTasks (line 248) | func (c *CreateSBOMConfig) fileTasks(cfg task.CatalogingFactoryConfig)...
method selectTasks (line 258) | func (c *CreateSBOMConfig) selectTasks(src source.Description) ([]task...
method allPackageTasks (line 370) | func (c *CreateSBOMConfig) allPackageTasks(cfg task.CatalogingFactoryC...
method userPackageTasks (line 384) | func (c *CreateSBOMConfig) userPackageTasks(cfg task.CatalogingFactory...
method scopeTasks (line 408) | func (c *CreateSBOMConfig) scopeTasks() []task.Task {
method relationshipTasks (line 420) | func (c *CreateSBOMConfig) relationshipTasks(src source.Description) [...
method environmentTasks (line 432) | func (c *CreateSBOMConfig) environmentTasks() []task.Task {
method unknownsTasks (line 443) | func (c *CreateSBOMConfig) unknownsTasks() []task.Task {
method osFeatureDetectionTasks (line 454) | func (c *CreateSBOMConfig) osFeatureDetectionTasks() []task.Task {
method validate (line 464) | func (c *CreateSBOMConfig) validate() error {
method Create (line 474) | func (c *CreateSBOMConfig) Create(ctx context.Context, src source.Sour...
function DefaultCreateSBOMConfig (line 43) | func DefaultCreateSBOMConfig() *CreateSBOMConfig {
function syftVersion (line 62) | func syftVersion() string {
function deprecatedTasks (line 329) | func deprecatedTasks(taskGroups [][]task.Task) []string {
function logTaskNames (line 341) | func logTaskNames(tasks []task.Task, kind string) {
function finalTaskSelectionRequest (line 354) | func finalTaskSelectionRequest(req cataloging.SelectionRequest, src sour...
function findDefaultTags (line 478) | func findDefaultTags(src source.Description) ([]string, error) {
function replaceDefaultTagReferences (line 491) | func replaceDefaultTagReferences(defaultTags []string, lst []string) []s...
FILE: syft/create_sbom_config_test.go
type dummyCataloger (line 26) | type dummyCataloger struct
method Name (line 34) | func (d dummyCataloger) Name() string {
method Catalog (line 38) | func (d dummyCataloger) Catalog(_ context.Context, _ file.Resolver) ([...
function newDummyCataloger (line 30) | func newDummyCataloger(name string) pkg.Cataloger {
function TestCreateSBOMConfig_makeTaskGroups (line 42) | func TestCreateSBOMConfig_makeTaskGroups(t *testing.T) {
function pkgCatalogerNamesWithTagOrName (line 358) | func pkgCatalogerNamesWithTagOrName(t *testing.T, token string) []string {
function fileCatalogerNames (line 391) | func fileCatalogerNames(tokens ...string) []string {
function flatten (line 427) | func flatten(lists ...[]string) []string {
function relationshipCatalogerNames (line 436) | func relationshipCatalogerNames() []string {
function unknownsTaskNames (line 440) | func unknownsTaskNames() []string {
function osFeatureDetectionTaskNames (line 444) | func osFeatureDetectionTaskNames() []string {
function environmentCatalogerNames (line 448) | func environmentCatalogerNames() []string {
function taskGroupNames (line 452) | func taskGroupNames(groups [][]task.Task) [][]string {
function Test_replaceDefaultTagReferences (line 464) | func Test_replaceDefaultTagReferences(t *testing.T) {
function Test_findDefaultTag (line 489) | func Test_findDefaultTag(t *testing.T) {
function TestCreateSBOMConfig_validate (line 541) | func TestCreateSBOMConfig_validate(t *testing.T) {
FILE: syft/event/event.go
constant typePrefix (line 12) | typePrefix = "syft"
constant cliTypePrefix (line 13) | cliTypePrefix = typePrefix + "-cli"
constant FileIndexingStarted (line 18) | FileIndexingStarted partybus.EventType = typePrefix + "-file-indexing-st...
constant AttestationStarted (line 21) | AttestationStarted partybus.EventType = typePrefix + "-attestation-start...
constant CatalogerTaskStarted (line 24) | CatalogerTaskStarted partybus.EventType = typePrefix + "-cataloger-task-...
constant PullSourceStarted (line 28) | PullSourceStarted partybus.EventType = typePrefix + "-pull-source-started"
constant CLIAppUpdateAvailable (line 33) | CLIAppUpdateAvailable partybus.EventType = cliTypePrefix + "-app-update-...
constant CLIReport (line 36) | CLIReport partybus.EventType = cliTypePrefix + "-report"
constant CLINotification (line 39) | CLINotification partybus.EventType = cliTypePrefix + "-notification"
FILE: syft/event/monitor/generic_task.go
constant TopLevelCatalogingTaskID (line 10) | TopLevelCatalogingTaskID = "cataloging"
constant PackageCatalogingTaskID (line 11) | PackageCatalogingTaskID = "package-cataloging"
type ShellProgress (line 14) | type ShellProgress struct
type Title (line 19) | type Title struct
type GenericTask (line 25) | type GenericTask struct
type TaskProgress (line 43) | type TaskProgress struct
FILE: syft/event/parsers/parsers.go
type ErrBadPayload (line 17) | type ErrBadPayload struct
method Error (line 23) | func (e *ErrBadPayload) Error() string {
function newPayloadErr (line 27) | func newPayloadErr(t partybus.EventType, field string, value interface{}...
function checkEventType (line 35) | func checkEventType(actual, expected partybus.EventType) error {
function ParseFileIndexingStarted (line 42) | func ParseFileIndexingStarted(e partybus.Event) (string, progress.Staged...
function ParseCatalogerTaskStarted (line 60) | func ParseCatalogerTaskStarted(e partybus.Event) (progress.StagedProgres...
function ParsePullSourceStarted (line 80) | func ParsePullSourceStarted(e partybus.Event) (progress.StagedProgressab...
function ParseAttestationStartedEvent (line 100) | func ParseAttestationStartedEvent(e partybus.Event) (io.Reader, progress...
type UpdateCheck (line 120) | type UpdateCheck struct
function ParseCLIAppUpdateAvailable (line 125) | func ParseCLIAppUpdateAvailable(e partybus.Event) (*UpdateCheck, error) {
function ParseCLIReport (line 138) | func ParseCLIReport(e partybus.Event) (string, string, error) {
function ParseCLINotification (line 157) | func ParseCLINotification(e partybus.Event) (string, string, error) {
FILE: syft/file/cataloger/executable/cataloger.go
type Config (line 27) | type Config struct
type Cataloger (line 32) | type Cataloger struct
method Catalog (line 51) | func (i *Cataloger) Catalog(resolver file.Resolver) (map[file.Coordina...
method CatalogCtx (line 55) | func (i *Cataloger) CatalogCtx(ctx context.Context, resolver file.Reso...
function DefaultConfig (line 36) | func DefaultConfig() Config {
function NewCataloger (line 45) | func NewCataloger(cfg Config) *Cataloger {
function processExecutableLocation (line 92) | func processExecutableLocation(loc file.Location, resolver file.Resolver...
function catalogingProgress (line 109) | func catalogingProgress(locations int64) *monitor.TaskProgress {
function filterByGlobs (line 120) | func filterByGlobs(locs []file.Location, globs []string) ([]file.Locatio...
function locationMatchesGlob (line 137) | func locationMatchesGlob(loc file.Location, globs []string) (bool, error) {
function processExecutable (line 155) | func processExecutable(loc file.Location, reader unionreader.UnionReader...
function findExecutableFormat (line 200) | func findExecutableFormat(reader unionreader.UnionReader) (file.Executab...
function isMacho (line 223) | func isMacho(by []byte) bool {
function classOrMachOFat (line 245) | func classOrMachOFat(in []byte) bool {
function isPE (line 257) | func isPE(by []byte) bool {
function isELF (line 261) | func isELF(by []byte) bool {
FILE: syft/file/cataloger/executable/elf.go
function findELFFeatures (line 16) | func findELFFeatures(data *file.Executable, reader unionreader.UnionRead...
function findELFSecurityFeatures (line 41) | func findELFSecurityFeatures(f *elf.File) *file.ELFSecurityFeatures {
function isElfSymbolTableStripped (line 55) | func isElfSymbolTableStripped(file *elf.File) bool {
function checkElfStackCanary (line 59) | func checkElfStackCanary(file *elf.File) *bool {
function hasAnyDynamicSymbols (line 63) | func hasAnyDynamicSymbols(file *elf.File, symbolNames ...string) *bool {
function boolRef (line 80) | func boolRef(b bool) *bool {
function checkElfNXProtection (line 84) | func checkElfNXProtection(file *elf.File) bool {
function checkElfRelROProtection (line 96) | func checkElfRelROProtection(f *elf.File) file.RelocationReadOnly {
function hasBindNowDynTagOrFlag (line 118) | func hasBindNowDynTagOrFlag(f *elf.File) bool {
function hasElfDynFlag (line 129) | func hasElfDynFlag(f *elf.File, flag elf.DynFlag) bool {
function hasElfDynFlag1 (line 143) | func hasElfDynFlag1(f *elf.File, flag elf.DynFlag1) bool {
function hasElfDynTag (line 157) | func hasElfDynTag(f *elf.File, tag elf.DynTag) bool {
function isELFPIE (line 186) | func isELFPIE(f *elf.File) bool {
function isELFDSO (line 191) | func isELFDSO(f *elf.File) bool {
function checkLLVMSafeStack (line 195) | func checkLLVMSafeStack(file *elf.File) *bool {
function checkLLVMControlFlowIntegrity (line 200) | func checkLLVMControlFlowIntegrity(file *elf.File) *bool {
function isFunction (line 216) | func isFunction(sym elf.Symbol) bool {
function checkClangFortifySource (line 222) | func checkClangFortifySource(file *elf.File) *bool {
function elfHasEntrypoint (line 237) | func elfHasEntrypoint(f *elf.File) bool {
function elfHasExports (line 243) | func elfHasExports(f *elf.File) bool {
FILE: syft/file/cataloger/executable/elf_test.go
function Test_findELFSecurityFeatures (line 17) | func Test_findELFSecurityFeatures(t *testing.T) {
function Test_elfHasEntrypoint (line 162) | func Test_elfHasEntrypoint(t *testing.T) {
function Test_elfHasExports (line 196) | func Test_elfHasExports(t *testing.T) {
FILE: syft/file/cataloger/executable/macho.go
constant machoNPExt (line 13) | machoNPExt uint8 = 0x10
constant machoNExt (line 14) | machoNExt uint8 = 0x01
constant lcMain (line 17) | lcMain = 0x28 | 0x80000000
function findMachoFeatures (line 20) | func findMachoFeatures(data *file.Executable, reader unionreader.UnionRe...
function machoHasEntrypoint (line 59) | func machoHasEntrypoint(f *macho.File) bool {
function machoHasExports (line 78) | func machoHasExports(f *macho.File) bool {
FILE: syft/file/cataloger/executable/macho_test.go
function Test_machoHasEntrypoint (line 16) | func Test_machoHasEntrypoint(t *testing.T) {
function Test_machoHasExports (line 50) | func Test_machoHasExports(t *testing.T) {
function Test_machoUniversal (line 88) | func Test_machoUniversal(t *testing.T) {
FILE: syft/file/cataloger/executable/pe.go
function findPEFeatures (line 12) | func findPEFeatures(data *file.Executable, reader unionreader.UnionReade...
function peHasEntrypoint (line 37) | func peHasEntrypoint(f *pe.File) bool {
function peHasExports (line 71) | func peHasExports(f *pe.File) bool {
FILE: syft/file/cataloger/executable/pe_test.go
function Test_peHasEntrypoint (line 15) | func Test_peHasEntrypoint(t *testing.T) {
function Test_peHasExports (line 49) | func Test_peHasExports(t *testing.T) {
FILE: syft/file/cataloger/executable/testdata/elf/differ/__main__.py
function load_json (line 5) | def load_json(file_path):
function diff_json (line 10) | def diff_json(json1, json2):
function main (line 37) | def main():
FILE: syft/file/cataloger/executable/testdata/elf/project/lib.c
function foo (line 3) | void foo(void)
FILE: syft/file/cataloger/executable/testdata/elf/project/main.c
function int_arg (line 10) | static int int_arg(int arg) {
function float_arg (line 15) | static int float_arg(float arg) {
function bad_int_arg (line 21) | static int bad_int_arg(int arg) {
function not_entry_point (line 27) | static int not_entry_point(int arg) {
type foo (line 50) | struct foo {
type foo (line 60) | struct foo
function simple1 (line 67) | void simple1() {
function simple2 (line 73) | void simple2() {
function main (line 79) | int main(int argc, char **argv) {
FILE: syft/file/cataloger/executable/testdata/shared-info/project/hello/hello.c
function main (line 3) | int main() {
FILE: syft/file/cataloger/executable/testdata/shared-info/project/libhello/hello.c
function hello (line 3) | void hello() {
FILE: syft/file/cataloger/filecontent/cataloger.go
type Config (line 21) | type Config struct
type Cataloger (line 29) | type Cataloger struct
method Catalog (line 47) | func (i *Cataloger) Catalog(_ context.Context, resolver file.Resolver)...
method catalogLocation (line 96) | func (i *Cataloger) catalogLocation(resolver file.Resolver, location f...
function DefaultConfig (line 34) | func DefaultConfig() Config {
function NewCataloger (line 40) | func NewCataloger(cfg Config) *Cataloger {
function catalogingProgress (line 116) | func catalogingProgress(locations int64) *monitor.TaskProgress {
FILE: syft/file/cataloger/filecontent/cataloger_test.go
function TestContentsCataloger (line 12) | func TestContentsCataloger(t *testing.T) {
FILE: syft/file/cataloger/filedigest/cataloger.go
type Cataloger (line 26) | type Cataloger struct
method Catalog (line 36) | func (i *Cataloger) Catalog(ctx context.Context, resolver file.Resolve...
method catalogLocation (line 90) | func (i *Cataloger) catalogLocation(ctx context.Context, resolver file...
function NewCataloger (line 30) | func NewCataloger(hashes []crypto.Hash) *Cataloger {
function catalogingProgress (line 115) | func catalogingProgress(locations int64) *monitor.TaskProgress {
FILE: syft/file/cataloger/filedigest/cataloger_test.go
function testDigests (line 24) | func testDigests(t testing.TB, root string, files []string, hashes ...cr...
function TestDigestsCataloger (line 51) | func TestDigestsCataloger(t *testing.T) {
function TestDigestsCataloger_MixFileTypes (line 91) | func TestDigestsCataloger_MixFileTypes(t *testing.T) {
function TestFileDigestCataloger_GivenCoordinates (line 161) | func TestFileDigestCataloger_GivenCoordinates(t *testing.T) {
FILE: syft/file/cataloger/filemetadata/cataloger.go
type Cataloger (line 16) | type Cataloger struct
method Catalog (line 23) | func (i *Cataloger) Catalog(ctx context.Context, resolver file.Resolve...
function NewCataloger (line 19) | func NewCataloger() *Cataloger {
function catalogingProgress (line 79) | func catalogingProgress(locations int64) *monitor.TaskProgress {
FILE: syft/file/cataloger/filemetadata/cataloger_test.go
function TestFileMetadataCataloger (line 18) | func TestFileMetadataCataloger(t *testing.T) {
function TestFileMetadataCataloger_GivenCoordinates (line 157) | func TestFileMetadataCataloger_GivenCoordinates(t *testing.T) {
FILE: syft/file/cataloger/internal/all_regular_files.go
function AllRegularFiles (line 11) | func AllRegularFiles(ctx context.Context, resolver file.Resolver) (locat...
FILE: syft/file/cataloger/internal/all_regular_files_test.go
function Test_allRegularFiles (line 19) | func Test_allRegularFiles(t *testing.T) {
FILE: syft/file/coordinate_set.go
type CoordinateSet (line 11) | type CoordinateSet struct
method Add (line 23) | func (s *CoordinateSet) Add(coordinates ...Coordinates) {
method Remove (line 32) | func (s CoordinateSet) Remove(coordinates ...Coordinates) {
method Contains (line 41) | func (s CoordinateSet) Contains(l Coordinates) bool {
method Paths (line 49) | func (s CoordinateSet) Paths() []string {
method ToSlice (line 63) | func (s CoordinateSet) ToSlice(sorters ...func(a, b Coordinates) int) ...
method ToUnorderedSlice (line 90) | func (s CoordinateSet) ToUnorderedSlice() []Coordinates {
method Hash (line 103) | func (s CoordinateSet) Hash() (uint64, error) {
function NewCoordinateSet (line 15) | func NewCoordinateSet(coordinates ...Coordinates) (s CoordinateSet) {
FILE: syft/file/coordinate_set_test.go
function TestCoordinatesSet (line 12) | func TestCoordinatesSet(t *testing.T) {
function TestCoordinateSet_Hash (line 57) | func TestCoordinateSet_Hash(t *testing.T) {
FILE: syft/file/coordinates.go
type Coordinates (line 11) | type Coordinates struct
method ID (line 26) | func (c Coordinates) ID() artifact.ID {
method String (line 37) | func (c Coordinates) String() string {
method GetCoordinates (line 46) | func (c Coordinates) GetCoordinates() Coordinates {
function NewCoordinates (line 19) | func NewCoordinates(realPath, fsID string) Coordinates {
FILE: syft/file/digest.go
type Digest (line 4) | type Digest struct
FILE: syft/file/executable.go
type ExecutableFormat (line 5) | type ExecutableFormat
type RelocationReadOnly (line 8) | type RelocationReadOnly
constant ELF (line 12) | ELF ExecutableFormat = "elf"
constant MachO (line 13) | MachO ExecutableFormat = "macho"
constant PE (line 14) | PE ExecutableFormat = "pe"
constant RelocationReadOnlyNone (line 16) | RelocationReadOnlyNone RelocationReadOnly = "none"
constant RelocationReadOnlyPartial (line 17) | RelocationReadOnlyPartial RelocationReadOnly = "partial"
constant RelocationReadOnlyFull (line 18) | RelocationReadOnlyFull RelocationReadOnly = "full"
type Executable (line 22) | type Executable struct
type ELFSecurityFeatures (line 40) | type ELFSecurityFeatures struct
FILE: syft/file/license.go
type License (line 9) | type License struct
type LicenseEvidence (line 26) | type LicenseEvidence struct
function NewLicense (line 37) | func NewLicense(value string) License {
FILE: syft/file/location.go
constant VisibleAnnotationKey (line 14) | VisibleAnnotationKey = "visible"
constant HiddenAnnotation (line 17) | HiddenAnnotation = "false"
constant VisibleAnnotation (line 20) | VisibleAnnotation = "true"
type Location (line 25) | type Location struct
method WithAnnotation (line 67) | func (l Location) WithAnnotation(key, value string) Location {
method WithoutAnnotations (line 78) | func (l Location) WithoutAnnotations() Location {
method Path (line 188) | func (l Location) Path() string {
method String (line 195) | func (l Location) String() string {
method Equals (line 213) | func (l Location) Equals(other Location) bool {
type LocationData (line 31) | type LocationData struct
method Reference (line 43) | func (l LocationData) Reference() file.Reference {
type LocationMetadata (line 48) | type LocationMetadata struct
method merge (line 52) | func (m *LocationMetadata) merge(other LocationMetadata) error {
function NewLocation (line 85) | func NewLocation(realPath string) Location {
function NewVirtualLocation (line 100) | func NewVirtualLocation(realPath, accessPath string) Location {
function NewLocationFromCoordinates (line 114) | func NewLocationFromCoordinates(coordinates Coordinates) Location {
function NewVirtualLocationFromCoordinates (line 126) | func NewVirtualLocationFromCoordinates(coordinates Coordinates, accessPa...
function NewLocationFromImage (line 138) | func NewLocationFromImage(accessPath string, ref file.Reference, img *im...
function NewLocationFromDirectory (line 156) | func NewLocationFromDirectory(responsePath string, fd string, ref file.R...
function NewVirtualLocationFromDirectory (line 173) | func NewVirtualLocationFromDirectory(responsePath, responseAccessPath st...
FILE: syft/file/location_read_closer.go
type LocationReadCloser (line 6) | type LocationReadCloser struct
function NewLocationReadCloser (line 11) | func NewLocationReadCloser(location Location, reader io.ReadCloser) Loca...
FILE: syft/file/location_set.go
type LocationSet (line 13) | type LocationSet struct
method Add (line 25) | func (s *LocationSet) Add(locations ...Location) {
method Remove (line 42) | func (s LocationSet) Remove(locations ...Location) {
method Contains (line 51) | func (s LocationSet) Contains(l Location) bool {
method ToSlice (line 59) | func (s LocationSet) ToSlice(sorters ...func(a, b Location) int) []Loc...
method ToUnorderedSlice (line 80) | func (s LocationSet) ToUnorderedSlice() []Location {
method CoordinateSet (line 96) | func (s *LocationSet) CoordinateSet() CoordinateSet {
method Empty (line 107) | func (s *LocationSet) Empty() bool {
method Hash (line 114) | func (s LocationSet) Hash() (uint64, error) {
function NewLocationSet (line 17) | func NewLocationSet(locations ...Location) (s LocationSet) {
FILE: syft/file/location_set_test.go
function TestLocationSet_SortPaths (line 14) | func TestLocationSet_SortPaths(t *testing.T) {
function TestLocationSet_SortEvidence (line 98) | func TestLocationSet_SortEvidence(t *testing.T) {
function TestLocationSet_Hash (line 209) | func TestLocationSet_Hash(t *testing.T) {
FILE: syft/file/location_test.go
function TestLocation_ID (line 11) | func TestLocation_ID(t *testing.T) {
FILE: syft/file/locations.go
type Locations (line 12) | type Locations
method Len (line 14) | func (l Locations) Len() int {
method Less (line 18) | func (l Locations) Less(i, j int) bool {
method Swap (line 22) | func (l Locations) Swap(i, j int) {
function LocationSorter (line 27) | func LocationSorter(layers []string) func(a, b Location) int { //nolint:...
function CoordinatesSorter (line 91) | func CoordinatesSorter(layers []string) func(a, b Coordinates) int {
FILE: syft/file/locations_test.go
function TestLocationAndCoordinatesSorters (line 13) | func TestLocationAndCoordinatesSorters(t *testing.T) {
FILE: syft/file/mock_resolver.go
type MockResolver (line 21) | type MockResolver struct
method HasPath (line 106) | func (r MockResolver) HasPath(path string) bool {
method String (line 116) | func (r MockResolver) String() string {
method FileContentsByLocation (line 122) | func (r MockResolver) FileContentsByLocation(location Location) (io.Re...
method FilesByPath (line 133) | func (r MockResolver) FilesByPath(paths ...string) ([]Location, error) {
method FilesByGlob (line 147) | func (r MockResolver) FilesByGlob(patterns ...string) ([]Location, err...
method RelativeFileByPath (line 165) | func (r MockResolver) RelativeFileByPath(_ Location, path string) *Loc...
method AllLocations (line 178) | func (r MockResolver) AllLocations(ctx context.Context) <-chan Location {
method FileMetadataByLocation (line 194) | func (r MockResolver) FileMetadataByLocation(l Location) (Metadata, er...
method FilesByMIMEType (line 214) | func (r MockResolver) FilesByMIMEType(types ...string) ([]Location, er...
method FilesByMediaType (line 222) | func (r MockResolver) FilesByMediaType(types ...string) ([]Location, e...
method FilesByExtension (line 230) | func (r MockResolver) FilesByExtension(extensions ...string) ([]Locati...
method FilesByBasename (line 238) | func (r MockResolver) FilesByBasename(filenames ...string) ([]Location...
method FilesByBasenameGlob (line 246) | func (r MockResolver) FilesByBasenameGlob(_ ...string) ([]Location, er...
method Write (line 251) | func (r MockResolver) Write(_ Location, _ io.Reader) error {
function NewMockResolverForPaths (line 32) | func NewMockResolverForPaths(paths ...string) *MockResolver {
function NewMockResolverForPathsWithMetadata (line 53) | func NewMockResolverForPathsWithMetadata(metadata map[Coordinates]Metada...
function NewMockResolverForMediaTypes (line 79) | func NewMockResolverForMediaTy
Copy disabled (too large)
Download .json
Condensed preview — 2510 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (28,876K chars).
[
{
"path": ".binny.yaml",
"chars": 2435,
"preview": "tools:\n # we want to use a pinned version of binny to manage the toolchain (so binny manages itself!)\n - name: binny\n "
},
{
"path": ".bouncer.yaml",
"chars": 2155,
"preview": "permit:\n - BSD.*\n - CC0.*\n - MIT.*\n - Apache.*\n - MPL.*\n - ISC\n - WTFPL\n - Unlicense\n\nignore-packages:\n # https"
},
{
"path": ".chronicle.yaml",
"chars": 1516,
"preview": "enforce-v0: false\ntitle: \"\"\n\ngithub:\n host: github.com\n include-issue-pr-authors: true\n include-issue-prs: true\n inc"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 322,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: bug\nassignees: ''\n\n---\n\n**What happened"
},
{
"path": ".github/ISSUE_TEMPLATE/config.yml",
"chars": 250,
"preview": "contact_links:\n\n - name: Join our Discourse community 💬\n # link to our community Discourse site\n url: https://anc"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 281,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: ''\nlabels: enhancement\nassignees: ''\n\n---\n\n**Wh"
},
{
"path": ".github/actions/bootstrap/action.yaml",
"chars": 2458,
"preview": "name: \"Bootstrap\"\n\ndescription: \"Bootstrap all tools and dependencies\"\ninputs:\n go-version:\n description: \"Go versio"
},
{
"path": ".github/dependabot.yml",
"chars": 1498,
"preview": "# Dependabot configuration\n#\n# Grouping behavior (see inline comments for details):\n# - Minor + patch updates: grouped"
},
{
"path": ".github/pull_request_template.md",
"chars": 1243,
"preview": "## Description\n\n<!-- Please include a summary of the changes along with any relevant motivation and context -->\n\n<!-- If"
},
{
"path": ".github/scripts/capability-drift-check.sh",
"chars": 491,
"preview": "#!/usr/bin/env bash\nset -u\n\nif [ \"$(git status --porcelain | wc -l)\" -ne \"0\" ]; then\n echo \" 🔴 there are uncommitted c"
},
{
"path": ".github/scripts/check_binary_fixture_size.sh",
"chars": 756,
"preview": "#!/bin/bash\n\n# current limit for fixture size\nsize=1000\n\nif [ $# -eq 0 ]; then\n echo \"Usage: $0 <directory>\"\n exit 1\nf"
},
{
"path": ".github/scripts/ci-check.sh",
"chars": 238,
"preview": "#!/usr/bin/env bash\n\nred=$(tput setaf 1)\nbold=$(tput bold)\nnormal=$(tput sgr0)\n\n# assert we are running in CI (or die!)\n"
},
{
"path": ".github/scripts/coverage.py",
"chars": 861,
"preview": "#!/usr/bin/env python3\nimport subprocess\nimport sys\nimport shlex\n\n\nclass bcolors:\n HEADER = '\\033[95m'\n OKBLUE = '"
},
{
"path": ".github/scripts/find_cache_paths.py",
"chars": 4093,
"preview": "#!/usr/bin/env python3\nfrom __future__ import annotations\n\nimport os\nimport glob\nimport sys\nimport json\nimport hashlib\n\n"
},
{
"path": ".github/scripts/fingerprint_docker_fixtures.py",
"chars": 2289,
"preview": "#!/usr/bin/env python3\n\nimport os\nimport subprocess\nimport hashlib\n\nBOLD = '\\033[1m'\nYELLOW = '\\033[0;33m'\nRESET = '\\033"
},
{
"path": ".github/scripts/go-mod-tidy-check.sh",
"chars": 974,
"preview": "#!/usr/bin/env bash\nset -eu\n\nORIGINAL_STATE_DIR=$(mktemp -d \"TEMP-original-state-XXXXXXXXX\")\nTIDY_STATE_DIR=$(mktemp -d "
},
{
"path": ".github/scripts/json-schema-drift-check.sh",
"chars": 452,
"preview": "#!/usr/bin/env bash\nset -u\n\nif [ \"$(git status --porcelain | wc -l)\" -ne \"0\" ]; then\n echo \" 🔴 there are uncommitted c"
},
{
"path": ".github/scripts/labeler.py",
"chars": 9265,
"preview": "#!/usr/bin/env python3\n\nfrom __future__ import annotations\n\nimport sys\nimport glob\nimport subprocess\nimport os\nimport re"
},
{
"path": ".github/scripts/labeler_test.py",
"chars": 3386,
"preview": "#!/usr/bin/env python3\n\nimport unittest\nfrom unittest.mock import patch\nimport subprocess\n\nimport labeler\n\nclass Labeler"
},
{
"path": ".github/scripts/trigger-release.sh",
"chars": 1798,
"preview": "#!/usr/bin/env bash\nset -eu\n\nbold=$(tput bold)\nnormal=$(tput sgr0)\n\nGH_CLI=.tool/gh\n\nif ! [ -x \"$(command -v $GH_CLI)\" ]"
},
{
"path": ".github/workflows/codeql-analysis.yml",
"chars": 2748,
"preview": "# For most projects, this workflow file will not need changing; you simply need\n# to commit it to your repository.\n#\n# Y"
},
{
"path": ".github/workflows/dependabot-automation.yaml",
"chars": 177,
"preview": "name: Dependabot Automation\non:\n pull_request:\n\npermissions:\n pull-requests: write\n\njobs:\n run:\n uses: anchore/wor"
},
{
"path": ".github/workflows/detect-schema-changes.yaml",
"chars": 2157,
"preview": "name: \"Detect schema changes\"\n\non:\n # IMPORTANT! This workflow is triggered by the `pull_request_target` event\n # whic"
},
{
"path": ".github/workflows/oss-project-board-add.yaml",
"chars": 304,
"preview": "name: Add to OSS board\n\npermissions:\n contents: read\n\non:\n issues:\n types:\n - opened\n - reopened\n - "
},
{
"path": ".github/workflows/release.yaml",
"chars": 10440,
"preview": "name: \"Release\"\n\npermissions:\n contents: read\n\non:\n workflow_dispatch:\n inputs:\n version:\n description:"
},
{
"path": ".github/workflows/remove-awaiting-response-label.yaml",
"chars": 332,
"preview": "name: \"Manage Awaiting Response Label\"\n\non:\n issue_comment:\n types: [created]\n\njobs:\n run:\n permissions:\n c"
},
{
"path": ".github/workflows/test-fixture-cache-publish.yaml",
"chars": 1601,
"preview": "name: \"Test fixture cache: publish\"\n\non:\n workflow_dispatch:\n schedule:\n # run nightly at 4AM UTC\n - cron: \"0 4 "
},
{
"path": ".github/workflows/update-anchore-dependencies.yml",
"chars": 1681,
"preview": "name: PR to update Anchore dependencies\non:\n workflow_dispatch:\n inputs:\n repos:\n description: \"List of "
},
{
"path": ".github/workflows/update-bootstrap-tools.yml",
"chars": 2022,
"preview": "name: PR for latest versions of tools\non:\n schedule:\n - cron: \"0 8 * * *\" # 3 AM EST\n\n workflow_dispatch:\n\npermissi"
},
{
"path": ".github/workflows/update-cpe-dictionary-index.yml",
"chars": 2916,
"preview": "name: PR to update CPE dictionary index\non:\n schedule:\n - cron: \"0 1 * * 1\" # every monday at 1 AM\n\n workflow_dispa"
},
{
"path": ".github/workflows/update-spdx-license-list.yaml",
"chars": 2223,
"preview": "name: PR to update SPDX license list\non:\n schedule:\n - cron: \"0 6 * * 1\" # every monday at 6 AM UTC\n\n workflow_disp"
},
{
"path": ".github/workflows/validate-github-actions.yaml",
"chars": 864,
"preview": "name: \"Validate GitHub Actions\"\n\non:\n pull_request:\n paths:\n - '.github/workflows/**'\n - '.github/actions/"
},
{
"path": ".github/workflows/validations.yaml",
"chars": 8082,
"preview": "name: \"Validations\"\n\n# we should cancel any in-progress runs for the same workflow + PR/ref\n# so that we can avoid redun"
},
{
"path": ".github/zizmor.yml",
"chars": 385,
"preview": "rules:\n unpinned-uses:\n config:\n policies:\n # anchore/workflows is an internal repository; using @main i"
},
{
"path": ".gitignore",
"chars": 897,
"preview": "# local development tailoring\ngo.work\ngo.work.sum\n.tool-versions\n.python-version\n\n# app configuration\n/.syft.yaml\n\n# too"
},
{
"path": ".golangci.yaml",
"chars": 3208,
"preview": "version: \"2\"\nrun:\n tests: false\nlinters:\n default: none\n enable:\n - asciicheck\n - bodyclose\n - copyloopvar\n "
},
{
"path": ".goreleaser.yaml",
"chars": 10588,
"preview": "version: 2\nproject_name: syft\n\nrelease:\n prerelease: auto\n draft: false\n\nenv:\n - DOCKER_CLI_EXPERIMENTAL=enabled\n - "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 288,
"preview": "# Code of Conduct\n\nAll contributors for any Anchore project must follow the [Contributor Covenant Code of Conduct](https"
},
{
"path": "CONTRIBUTING.md",
"chars": 1146,
"preview": "# Contributing\n\nThank you for your interest in contributing to Syft!\n\nPlease see the [contribution guide](https://oss.an"
},
{
"path": "CONTRIBUTORS.md",
"chars": 489,
"preview": "# Syft Contributors\n\nThe following Syft components were contributed by external authors/organizations.\n\n## GraalVM Nativ"
},
{
"path": "Dockerfile",
"chars": 1164,
"preview": "FROM gcr.io/distroless/static-debian12:latest AS build\n\nFROM scratch\n# needed for version check HTTPS request\nCOPY --fro"
},
{
"path": "Dockerfile.debug",
"chars": 1033,
"preview": "FROM gcr.io/distroless/static-debian12:debug-nonroot\n\n# create the /tmp dir, which is needed for image content cache\nWOR"
},
{
"path": "Dockerfile.nonroot",
"chars": 1027,
"preview": "FROM gcr.io/distroless/static-debian12:nonroot\n\n# create the /tmp dir, which is needed for image content cache\nWORKDIR /"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "Makefile",
"chars": 1320,
"preview": "OWNER = anchore\nPROJECT = syft\n\nTOOL_DIR = .tool\nBINNY = $(TOOL_DIR)/binny\nTASK = $(TOOL_DIR)/task\n\n.DEFAULT_GOAL := mak"
},
{
"path": "README.md",
"chars": 6309,
"preview": "<p align=\"center\">\n <img src=\"https://user-images.githubusercontent.com/5199289/136844524-1527b09f-c5cb-4aa9-be54-5aa"
},
{
"path": "RELEASE.md",
"chars": 2067,
"preview": "# Release\n\nA release of syft comprises:\n- a new semver git tag from the current tip of the main branch\n- a new [github r"
},
{
"path": "SECURITY.md",
"chars": 648,
"preview": "# Security Policy\n\n## Supported Versions\n\nSecurity updates are applied only to the most recent release, try to always be"
},
{
"path": "Taskfile.yaml",
"chars": 22450,
"preview": "\nversion: \"3\"\n\nincludes:\n generate:cpe-index: ./task.d/generate/cpe-index.yaml\n\nvars:\n OWNER: anchore\n PROJECT: syft\n"
},
{
"path": "artifacthub-repo.yml",
"chars": 218,
"preview": "# See documentation here: https://github.com/artifacthub/hub/blob/v1.6.0/docs/metadata/artifacthub-repo.yml\nrepositoryID"
},
{
"path": "cmd/syft/cli/cli.go",
"chars": 2381,
"preview": "package cli\n\nimport (\n\t\"io\"\n\t\"os\"\n\n\tcranecmd \"github.com/google/go-containerregistry/cmd/crane/cmd\"\n\t\"github.com/spf13/c"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_attestation_test.snap",
"chars": 545,
"preview": "\n[TestHandler_handleAttestationStarted/attesting_in_progress/task_line - 1]\n ⠋ Creating a thing "
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_cataloger_task_test.snap",
"chars": 852,
"preview": "\n[TestHandler_handleCatalogerTaskStarted/cataloging_task_in_progress - 1]\n ⠙ Cataloging contents \n ⠙ some ta"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_fetch_image_test.snap",
"chars": 323,
"preview": "\n[TestHandler_handleFetchImage/fetch_image_in_progress - 1]\n ⠋ Loading image ━━━━━━━━━━━━━━━━━━━━ [cu"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_file_indexing_test.snap",
"chars": 339,
"preview": "\n[TestHandler_handleFileIndexingStarted/cataloging_in_progress - 1]\n ⠋ Indexing file system ━━━━━━━━━━━━━━━━━"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_pull_docker_image_test.snap",
"chars": 277,
"preview": "\n[Test_dockerPullStatusFormatter_Render/pulling - 1]\n3 Layers▕▅▃ ▏[12 B / 30 B]\n---\n\n[Test_dockerPullStatusFormatter_Ren"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_pull_source_test.snap",
"chars": 341,
"preview": "\n[TestHandler_handlePullSourceStarted/snap_download_in_progress - 1]\n ⠋ Downloading snap file... ━━━━━━━━━━━━━━━━"
},
{
"path": "cmd/syft/cli/ui/__snapshots__/handle_read_image_test.snap",
"chars": 319,
"preview": "\n[TestHandler_handleReadImage/read_image_in_progress - 1]\n ⠋ Parsing image ━━━━━━━━━━━━━━━━━━━━ "
},
{
"path": "cmd/syft/cli/ui/handle_attestation.go",
"chars": 6038,
"preview": "package ui\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"githu"
},
{
"path": "cmd/syft/cli/ui/handle_attestation_test.go",
"chars": 3404,
"preview": "package ui\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/g"
},
{
"path": "cmd/syft/cli/ui/handle_cataloger_task.go",
"chars": 3405,
"preview": "package ui\n\nimport (\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/charmbracelet/lipgloss\"\n\t\"github.com/google/"
},
{
"path": "cmd/syft/cli/ui/handle_cataloger_task_test.go",
"chars": 4936,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/go-snaps/snaps\"\n\t\"gi"
},
{
"path": "cmd/syft/cli/ui/handle_fetch_image.go",
"chars": 758,
"preview": "package ui\n\nimport (\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/wagoodman/go-partybus\"\n\n\t\"github.com/anchore"
},
{
"path": "cmd/syft/cli/ui/handle_fetch_image_test.go",
"chars": 2064,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/go-snaps/sna"
},
{
"path": "cmd/syft/cli/ui/handle_file_indexing.go",
"chars": 759,
"preview": "package ui\n\nimport (\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/wagoodman/go-partybus\"\n\n\t\"github.com/anchore"
},
{
"path": "cmd/syft/cli/ui/handle_file_indexing_test.go",
"chars": 2064,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/go-snaps/sna"
},
{
"path": "cmd/syft/cli/ui/handle_pull_containerd_image.go",
"chars": 5085,
"preview": "package ui\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/charmbracelet/lipgloss\"\n\t"
},
{
"path": "cmd/syft/cli/ui/handle_pull_docker_image.go",
"chars": 5761,
"preview": "package ui\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/charmbracelet/lipgloss\"\n\t"
},
{
"path": "cmd/syft/cli/ui/handle_pull_docker_image_test.go",
"chars": 3644,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\n\t\"github.com/gkampitakis/go-snaps/snaps\"\n\t\"github.com/wagoodman/go-progress\"\n\n\t\"github."
},
{
"path": "cmd/syft/cli/ui/handle_pull_source.go",
"chars": 915,
"preview": "package ui\n\nimport (\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/wagoodman/go-partybus\"\n\n\t\"github.com/anchore"
},
{
"path": "cmd/syft/cli/ui/handle_pull_source_test.go",
"chars": 2951,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/go-snaps/sna"
},
{
"path": "cmd/syft/cli/ui/handle_read_image.go",
"chars": 764,
"preview": "package ui\n\nimport (\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/wagoodman/go-partybus\"\n\n\t\"github.com/anchore"
},
{
"path": "cmd/syft/cli/ui/handle_read_image_test.go",
"chars": 2629,
"preview": "package ui\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/gkampitakis/go-snaps/sna"
},
{
"path": "cmd/syft/cli/ui/handler.go",
"chars": 2111,
"preview": "package ui\n\nimport (\n\t\"sync\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n\t\"github.com/wagoodman/go-partybus\"\n\n\t\"github.co"
},
{
"path": "cmd/syft/cli/ui/new_task_progress.go",
"chars": 483,
"preview": "package ui\n\nimport \"github.com/anchore/bubbly/bubbles/taskprogress\"\n\nfunc (m Handler) newTaskProgress(title taskprogress"
},
{
"path": "cmd/syft/cli/ui/util_test.go",
"chars": 990,
"preview": "package ui\n\nimport (\n\t\"reflect\"\n\t\"sync\"\n\t\"testing\"\n\n\ttea \"github.com/charmbracelet/bubbletea\"\n)\n\nfunc runModel(t testing"
},
{
"path": "cmd/syft/internal/clio_setup_config.go",
"chars": 1819,
"preview": "package internal\n\nimport (\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/stereoscope\"\n\thandler \"github.co"
},
{
"path": "cmd/syft/internal/commands/attest.go",
"chars": 8409,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/spf13/cobra\"\n\t\"github.com/w"
},
{
"path": "cmd/syft/internal/commands/attest_test.go",
"chars": 7540,
"preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/goo"
},
{
"path": "cmd/syft/internal/commands/cataloger.go",
"chars": 575,
"preview": "package commands\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/anchore/clio\"\n)\n\nfunc Cataloger(app clio.Appli"
},
{
"path": "cmd/syft/internal/commands/cataloger_info.go",
"chars": 17782,
"preview": "package commands\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/lipglos"
},
{
"path": "cmd/syft/internal/commands/cataloger_info_test.go",
"chars": 8775,
"preview": "package commands\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/stretchr/testify/assert\"\n"
},
{
"path": "cmd/syft/internal/commands/cataloger_list.go",
"chars": 9219,
"preview": "package commands\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/charmbracelet/lipgloss\"\n\t\"gith"
},
{
"path": "cmd/syft/internal/commands/cataloger_list_test.go",
"chars": 7140,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\t\"github.com/stretchr/"
},
{
"path": "cmd/syft/internal/commands/commands_test.go",
"chars": 528,
"preview": "package commands\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\tgologgerredact \"github.com/anchore/go-logger/adapter/redact\"\n\t\"github.com/"
},
{
"path": "cmd/syft/internal/commands/convert.go",
"chars": 2958,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchor"
},
{
"path": "cmd/syft/internal/commands/packages.go",
"chars": 867,
"preview": "package commands\n\nimport (\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/cmd/syft/inte"
},
{
"path": "cmd/syft/internal/commands/packages_test.go",
"chars": 11174,
"preview": "package commands\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/hashicorp/go-multierror\"\n\t\"github.com/stretchr/test"
},
{
"path": "cmd/syft/internal/commands/root.go",
"chars": 742,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/cmd/s"
},
{
"path": "cmd/syft/internal/commands/scan.go",
"chars": 14728,
"preview": "package commands\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"strings\"\n\n\t\"github.com/hashicorp/go-multierror"
},
{
"path": "cmd/syft/internal/commands/scan_test.go",
"chars": 1835,
"preview": "package commands\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/cmd/syft/interna"
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/no-legacy-options.yaml",
"chars": 70,
"preview": "# simple, valid syft config with no legacy fields used\nparallelism: 5\n"
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/with-base-path.yaml",
"chars": 22,
"preview": "base-path: \"something\""
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/with-default-pull-source.yaml",
"chars": 38,
"preview": "default-image-pull-source: \"something\""
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/with-exclude-binary-overlap-by-ownership.yaml",
"chars": 41,
"preview": "exclude-binary-overlap-by-ownership: true"
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/with-file-section.yaml",
"chars": 22,
"preview": "file:\n selection: all"
},
{
"path": "cmd/syft/internal/commands/testdata/scan-configs/with-file-string.yaml",
"chars": 10,
"preview": "file: path"
},
{
"path": "cmd/syft/internal/commands/update.go",
"chars": 3443,
"preview": "package commands\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/spf13/cobra\"\n\t\"github.com/wagoodman/go-part"
},
{
"path": "cmd/syft/internal/commands/update_test.go",
"chars": 6222,
"preview": "package commands\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/anchore/clio\"\n\thashiVersion \"github"
},
{
"path": "cmd/syft/internal/commands/utils.go",
"chars": 458,
"preview": "package commands\n\nimport (\n\t\"io\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/cmd/sy"
},
{
"path": "cmd/syft/internal/constants.go",
"chars": 60,
"preview": "package internal\n\nconst (\n\tNotProvided = \"[not provided]\"\n)\n"
},
{
"path": "cmd/syft/internal/options/attest.go",
"chars": 770,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n)\n\nvar _ clio.FlagAdder = (*Attest)(nil)\n\ntype Attest struct {\n\t// "
},
{
"path": "cmd/syft/internal/options/cache.go",
"chars": 3148,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/adrg/xdg\"\n"
},
{
"path": "cmd/syft/internal/options/cache_test.go",
"chars": 6643,
"preview": "package options\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/adrg/xdg\"\n\t\"github.co"
},
{
"path": "cmd/syft/internal/options/catalog.go",
"chars": 14152,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/iancoleman/strcase\"\n\n\t\"github.com/anchore/clio\"\n\t\"gith"
},
{
"path": "cmd/syft/internal/options/catalog_test.go",
"chars": 4264,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCatalog_PostLoad(t *testi"
},
{
"path": "cmd/syft/internal/options/cataloger_selection.go",
"chars": 2060,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/fangs\"\n)\n\ntype CatalogerSelection stru"
},
{
"path": "cmd/syft/internal/options/cataloger_selection_test.go",
"chars": 1894,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCatalogerSelection_PostLo"
},
{
"path": "cmd/syft/internal/options/compliance.go",
"chars": 1089,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/fangs\"\n\t\"github.com/anchore/syft/syft/cataloging\"\n)\n\nvar (\n\t_ fangs.Field"
},
{
"path": "cmd/syft/internal/options/config.go",
"chars": 436,
"preview": "package options\n\nimport \"github.com/anchore/fangs\"\n\n// Config holds a reference to the specific config file(s) that were"
},
{
"path": "cmd/syft/internal/options/dotnet.go",
"chars": 2560,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/dotnet\"\n)\n\ntype dotnet"
},
{
"path": "cmd/syft/internal/options/file.go",
"chars": 2618,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\n\t\"github.com/anchore/clio\"\n\tintFile \"git"
},
{
"path": "cmd/syft/internal/options/file_test.go",
"chars": 1116,
"preview": "package options\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/syft/file\"\n)\n\nfun"
},
{
"path": "cmd/syft/internal/options/format.go",
"chars": 4515,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/format\"\n\t\"github.com/anchore/syft/sy"
},
{
"path": "cmd/syft/internal/options/format_cyclonedx_json.go",
"chars": 500,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/syft/syft/format/cyclonedxjson\"\n)\n\ntype FormatCyclonedxJSON struct {\n\tPre"
},
{
"path": "cmd/syft/internal/options/format_cyclonedx_json_test.go",
"chars": 1693,
"preview": "package options\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestFormatCyclonedxJSON_b"
},
{
"path": "cmd/syft/internal/options/format_cyclonedx_xml.go",
"chars": 492,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/syft/syft/format/cyclonedxxml\"\n)\n\ntype FormatCyclonedxXML struct {\n\tPrett"
},
{
"path": "cmd/syft/internal/options/format_cyclonedx_xml_test.go",
"chars": 324,
"preview": "package options\n\nimport (\n\t\"testing\"\n)\n\nfunc TestFormatCyclonedxXML_buildConfig(t *testing.T) {\n\t// assert when building"
},
{
"path": "cmd/syft/internal/options/format_spdx_json.go",
"chars": 448,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/syft/syft/format/spdxjson\"\n)\n\ntype FormatSPDXJSON struct {\n\tPretty *bool "
},
{
"path": "cmd/syft/internal/options/format_spdx_json_test.go",
"chars": 309,
"preview": "package options\n\nimport (\n\t\"testing\"\n)\n\nfunc TestFormatSPDXJSON_buildConfig(t *testing.T) {\n\t// assert when building the"
},
{
"path": "cmd/syft/internal/options/format_syft_json.go",
"chars": 526,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/syft/syft/format/syftjson\"\n)\n\ntype FormatSyftJSON struct {\n\tLegacy bool "
},
{
"path": "cmd/syft/internal/options/format_syft_json_test.go",
"chars": 300,
"preview": "package options\n\nimport (\n\t\"testing\"\n)\n\nfunc TestFormatSyftJSON_buildConfig(t *testing.T) {\n\t// assert when building the"
},
{
"path": "cmd/syft/internal/options/format_template.go",
"chars": 810,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/format/template\"\n)\n\nvar _ clio.FlagA"
},
{
"path": "cmd/syft/internal/options/golang.go",
"chars": 5006,
"preview": "package options\n\nimport (\n\t\"strings\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/golang\"\n)\n"
},
{
"path": "cmd/syft/internal/options/java.go",
"chars": 3008,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/java\"\n)\n\ntype javaConf"
},
{
"path": "cmd/syft/internal/options/javascript.go",
"chars": 1446,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/javascript\"\n)\n\ntype ja"
},
{
"path": "cmd/syft/internal/options/license.go",
"chars": 1660,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/internal\"\n\t\"github.com/anchore/sy"
},
{
"path": "cmd/syft/internal/options/linux_kernel.go",
"chars": 694,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/kernel\"\n)\n\ntype linuxK"
},
{
"path": "cmd/syft/internal/options/nix.go",
"chars": 612,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/nix\"\n)\n\ntype nixConfig"
},
{
"path": "cmd/syft/internal/options/output.go",
"chars": 3787,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/hashicorp/go-multierror\"\n\t\"github.com/scylladb/go-set/"
},
{
"path": "cmd/syft/internal/options/output_file.go",
"chars": 1528,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/fangs\"\n\t\"github.com/anchore/go-homedir"
},
{
"path": "cmd/syft/internal/options/output_test.go",
"chars": 3837,
"preview": "package options\n\nimport (\n\t\"testing\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"githu"
},
{
"path": "cmd/syft/internal/options/pkg.go",
"chars": 1801,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/cataloging\"\n)\n\ntype packageConfig st"
},
{
"path": "cmd/syft/internal/options/python.go",
"chars": 1477,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/pkg/cataloger/python\"\n)\n\ntype python"
},
{
"path": "cmd/syft/internal/options/registry.go",
"chars": 4483,
"preview": "package options\n\nimport (\n\t\"os\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/stereoscope/pkg/image\"\n)\n\ntype Registry"
},
{
"path": "cmd/syft/internal/options/registry_test.go",
"chars": 2763,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/stereoscope/pkg"
},
{
"path": "cmd/syft/internal/options/relationships.go",
"chars": 1068,
"preview": "package options\n\nimport \"github.com/anchore/fangs\"\n\nvar _ fangs.FieldDescriber = (*relationshipsConfig)(nil)\n\ntype relat"
},
{
"path": "cmd/syft/internal/options/secret.go",
"chars": 407,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/internal/redact\"\n)\n\ntype secret s"
},
{
"path": "cmd/syft/internal/options/source.go",
"chars": 2841,
"preview": "package options\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/dustin/go-humanize\"\n\t\"github.com/scylladb/go-set/strse"
},
{
"path": "cmd/syft/internal/options/source_test.go",
"chars": 713,
"preview": "package options\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc Test_fileSource_PostLoad(t *testing."
},
{
"path": "cmd/syft/internal/options/unknowns.go",
"chars": 1320,
"preview": "package options\n\nimport (\n\t\"github.com/anchore/clio\"\n\t\"github.com/anchore/syft/syft/cataloging\"\n)\n\ntype unknownsConfig s"
},
{
"path": "cmd/syft/internal/options/update_check.go",
"chars": 548,
"preview": "package options\n\nimport \"github.com/anchore/fangs\"\n\ntype UpdateCheck struct {\n\tCheckForAppUpdate bool `yaml:\"check-for-a"
},
{
"path": "cmd/syft/internal/options/writer.go",
"chars": 6824,
"preview": "package options\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/hashicorp/go-multierror\"\n"
},
{
"path": "cmd/syft/internal/options/writer_test.go",
"chars": 5950,
"preview": "package options\n\nimport (\n\t\"io\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.c"
},
{
"path": "cmd/syft/internal/test/integration/.gitignore",
"chars": 7,
"preview": "results"
},
{
"path": "cmd/syft/internal/test/integration/all_layers_squashed_comparison_test.go",
"chars": 660,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/source\"\n)\n\nfunc Test_AllLayersIncludesSquashed("
},
{
"path": "cmd/syft/internal/test/integration/catalog_packages_cases_test.go",
"chars": 15809,
"preview": "package integration\n\nimport \"github.com/anchore/syft/syft/pkg\"\n\ntype testCase struct {\n\tname string\n\tpkgType "
},
{
"path": "cmd/syft/internal/test/integration/catalog_packages_test.go",
"chars": 10274,
"preview": "package integration\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\t\"github.com/stretc"
},
{
"path": "cmd/syft/internal/test/integration/distro_test.go",
"chars": 537,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/syft/linux\"\n\t"
},
{
"path": "cmd/syft/internal/test/integration/encode_decode_cycle_test.go",
"chars": 4737,
"preview": "package integration\n\nimport (\n\t\"bytes\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"g"
},
{
"path": "cmd/syft/internal/test/integration/files_test.go",
"chars": 4937,
"preview": "package integration\n\nimport (\n\t\"crypto\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/"
},
{
"path": "cmd/syft/internal/test/integration/go_compiler_detection_test.go",
"chars": 1893,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/cpe\"\n\t\"github.com/anchore/syft/syft/source\"\n)\n\n"
},
{
"path": "cmd/syft/internal/test/integration/java_purl_test.go",
"chars": 147495,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github."
},
{
"path": "cmd/syft/internal/test/integration/mariner_distroless_test.go",
"chars": 557,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/source\"\n)\n\n"
},
{
"path": "cmd/syft/internal/test/integration/node_packages_test.go",
"chars": 2114,
"preview": "package integration\n\nimport (\n\t\"reflect\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\n\t\"github.com/ancho"
},
{
"path": "cmd/syft/internal/test/integration/package_binary_elf_relationships_test.go",
"chars": 1798,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com/anchore/syft/internal/rel"
},
{
"path": "cmd/syft/internal/test/integration/package_cataloger_convention_test.go",
"chars": 9270,
"preview": "package integration\n\nimport (\n\t\"fmt\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"go/types\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"reflect\"\n\t\""
},
{
"path": "cmd/syft/internal/test/integration/package_catalogers_represented_test.go",
"chars": 6669,
"preview": "package integration\n\nimport (\n\t\"bytes\"\n\t\"go/ast\"\n\t\"go/parser\"\n\t\"go/token\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t"
},
{
"path": "cmd/syft/internal/test/integration/package_deduplication_test.go",
"chars": 2953,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"g"
},
{
"path": "cmd/syft/internal/test/integration/package_ownership_relationship_test.go",
"chars": 2423,
"preview": "package integration\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n\n\t\"github.com"
},
{
"path": "cmd/syft/internal/test/integration/regression_apk_scanner_buffer_size_test.go",
"chars": 674,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/source\"\n)\n\n"
},
{
"path": "cmd/syft/internal/test/integration/regression_go_bin_scanner_arch_test.go",
"chars": 1257,
"preview": "package integration\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/"
},
{
"path": "cmd/syft/internal/test/integration/regression_java_no_main_package_test.go",
"chars": 273,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/source\"\n)\n\nfunc TestRegressionJavaNoMainPackage"
},
{
"path": "cmd/syft/internal/test/integration/regression_java_virtualpath_test.go",
"chars": 1218,
"preview": "package integration\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/sy"
},
{
"path": "cmd/syft/internal/test/integration/regression_photon_package_test.go",
"chars": 528,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"g"
},
{
"path": "cmd/syft/internal/test/integration/regression_sbom_duplicate_relationships_test.go",
"chars": 741,
"preview": "package integration\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/scylladb/go-set/strset\"\n\n\t\"github.com/anchore/syft/syft/so"
},
{
"path": "cmd/syft/internal/test/integration/rust_audit_binary_test.go",
"chars": 478,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/source\"\n)\n\n"
},
{
"path": "cmd/syft/internal/test/integration/sbom_cataloger_test.go",
"chars": 1778,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/sbom\"\n\t\"git"
},
{
"path": "cmd/syft/internal/test/integration/sbom_metadata_component_test.go",
"chars": 719,
"preview": "package integration\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anchore/syft/syft/"
},
{
"path": "cmd/syft/internal/test/integration/sqlite_rpmdb_test.go",
"chars": 667,
"preview": "package integration\n\nimport (\n\t\"testing\"\n\n\t_ \"modernc.org/sqlite\"\n\n\t\"github.com/anchore/syft/syft/pkg\"\n\t\"github.com/anch"
},
{
"path": "cmd/syft/internal/test/integration/testdata/.gitignore",
"chars": 685,
"preview": "# we should strive to not commit blobs to the repo and strive to keep the build process of how blobs are acquired in-rep"
},
{
"path": "cmd/syft/internal/test/integration/testdata/Makefile",
"chars": 747,
"preview": "FINGERPRINT_FILE := cache.fingerprint\n\n.DEFAULT_GOAL := fixtures\n\n# requirement 1: 'fixtures' goal to generate any and a"
},
{
"path": "cmd/syft/internal/test/integration/testdata/files/somewhere/there/is/a/file",
"chars": 239,
"preview": "with a lot of contents!\nwith a lot of contents!\nwith a lot of contents!\nwith a lot of contents!\nwith a lot of contents!\n"
},
{
"path": "cmd/syft/internal/test/integration/testdata/files/somewhere/there/is/a-small-file",
"chars": 14,
"preview": "some contents!"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-distro-id/Dockerfile",
"chars": 94,
"preview": "FROM busybox:1.31.1@sha256:95cf004f559831017cdf4628aaf1bb30133677be8702a8c5f2994629f637a209\n\n\n"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-go-bin-arch-coverage/Dockerfile",
"chars": 393,
"preview": "FROM golang:1.21.1@sha256:cffaba795c36f07e372c7191b35ceaae114d74c31c3763d442982e3a4df3b39e as builder\nWORKDIR /app\nCOPY "
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-go-bin-arch-coverage/app.go",
"chars": 269,
"preview": "//build:ignore\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"golang.org/x/net/html\"\n\t\"golang.org/x/term\"\n)\n\nvar test = html.Err"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-go-bin-arch-coverage/go.mod",
"chars": 412,
"preview": "module github.com/anchore/test\n\ngo 1.17\n\nrequire (\n\tgolang.org/x/net v0.0.0-20211006190231-62292e806868\n\tgolang.org/x/te"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-golang-compiler/Dockerfile",
"chars": 204,
"preview": "FROM --platform=linux/amd64 golang:1.18.10-alpine\n\nFROM scratch\n\n# we don't need the entire golang toolchain, just a sin"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-java-no-main-package/Dockerfile",
"chars": 603,
"preview": "FROM jenkins/jenkins:2.346.3-slim-jdk17@sha256:028fbbd9112c60ed086f5197fcba71992317864d27644e5949cf9c52ff4b65f0 AS base\n"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-java-virtualpath-regression/Dockerfile",
"chars": 535,
"preview": "FROM alpine:3.18.3@sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a AS base\n\nRUN wget https://rep"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-java-virtualpath-regression/extract.py",
"chars": 3147,
"preview": "import os\nimport zipfile\nimport io\n\nARCHIVE_EXTENSIONS = ('.jar', '.war', '.ear', '.hpi', '.war', '.sar', '.nar', '.par'"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-large-apk-data/Dockerfile",
"chars": 423,
"preview": "FROM alpine@sha256:d9a7354e3845ea8466bb00b22224d9116b183e594527fb5b6c3d30bc01a20378 AS base\n\n# we keep these unpinned so"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-mariner-distroless/Dockerfile",
"chars": 401,
"preview": "FROM mcr.microsoft.com/cbl-mariner/distroless/base:2.0.202205275@sha256:f550c5428df17b145851ad75983aca6d613ad4b51ca7983b"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-os-binary-overlap/Dockerfile",
"chars": 368,
"preview": "FROM alpine:3.18.3@sha256:7144f7bab3d4c2648d7e59409f15ec52a18006a128c733fcff20d3a4a54ba44a\n\n# syft should not longer sho"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-owning-package/Dockerfile",
"chars": 284,
"preview": "FROM ubuntu:20.04@sha256:33a5cc25d22c45900796a1aca487ad7a7cb09f09ea00b779e3b2026b4fc2faba AS base\n# this covers rpm-pyth"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-photon-all-layers/Dockerfile",
"chars": 181,
"preview": "FROM photon:5.0-20230729@sha256:4cf2a1ce0a3f4625f13a0becb6b9bccfdb014c565be6e9a2ec4c4aad1ff8a5d9 AS base\n\nFROM scratch\n\n"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/Dockerfile",
"chars": 1598,
"preview": "FROM fedora:37@sha256:3f987b7657e944cf87a129cc262982d4f80e38bd98f7db313ccaf90ca7069dd2\n\nRUN dnf install 'dnf-command(dow"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/conan/conanfile.txt",
"chars": 198,
"preview": "# Docs at https://docs.conan.io/en/latest/reference/conanfile_txt.html\n\n[requires]\ncatch2/2.13.8\ndocopt.cpp/0.6.3\nfmt/8."
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/etc/os-release",
"chars": 378,
"preview": "NAME=\"Ubuntu\"\nVERSION=\"20.04 LTS (Focal Fossa)\"\nID=ubuntu\nID_LIKE=debian\nPRETTY_NAME=\"Ubuntu 20.04 LTS\"\nVERSION_ID=\"20.0"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/hackage/cabal.project.freeze",
"chars": 676,
"preview": "active-repositories: hackage.haskell.org:merge\nconstraints: any.Cabal ==3.2.1.0,\n any.Diff ==0.4.1,\n "
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/hackage/stack.yaml",
"chars": 901,
"preview": "flags: {}\nextra-package-dbs: []\npackages:\n - .\nresolver: lts-18.28\nextra-deps:\n - ShellCheck-0.8.0@sha256:353c9322847b"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/lib/apk/db/installed",
"chars": 919,
"preview": "C:Q1p78yvTLG094tHE1+dToJGbmYzQE=\nP:libc-utils\nV:0.7.2-r0\nA:x86_64\nS:1175\nI:4096\nT:Meta package to pull in correct libc\nU"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/dotnet/TestLibrary.deps.json",
"chars": 8583,
"preview": "{\n \"runtimeTarget\": {\n \"name\": \".NETCoreApp,Version=v6.0\",\n \"signature\": \"\"\n },\n \"compilationOptions\": {},\n \"t"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/erlang/accept.app",
"chars": 475,
"preview": "{application,accept,\n [{description,\"Accept header(s) for Erlang/Elixir\"},\n {vsn,\"0.3.5\"},\n "
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/github-actions/.github/workflows/validations.yaml",
"chars": 348,
"preview": "name: \"Validations\"\n\non:\n workflow_dispatch:\n pull_request:\n push:\n branches:\n - main\n\njobs:\n call-workflow-"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/go/go.mod",
"chars": 91,
"preview": "module github.com/anchore/syft\n\ngo 1.14\n\nrequire (\n\tgithub.com/bmatcuk/doublestar v1.3.1\n)\n"
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/homebrew/Cellar/afflib/1.2.3/.brew/afflib.rb",
"chars": 77,
"preview": "desc \"Advanced Forensic Format\"\nhomepage \"https://github.com/sshock/AFFLIBv3\""
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/java/generate-fixtures.md",
"chars": 105,
"preview": "See the syft/cataloger/java/testdata/java-builds dir to generate test fixtures and copy to here manually."
},
{
"path": "cmd/syft/internal/test/integration/testdata/image-pkg-coverage/pkgs/java/pom.xml",
"chars": 1582,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
}
]
// ... and 2310 more files (download for full content)
About this extraction
This page contains the full source code of the anchore/syft GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2510 files (24.9 MB), approximately 6.7M tokens, and a symbol index with 6319 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.