Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package grype-db for openSUSE:Factory checked in at 2026-02-09 15:34:53 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/grype-db (Old) and /work/SRC/openSUSE:Factory/.grype-db.new.1670 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "grype-db" Mon Feb 9 15:34:53 2026 rev:29 rq:1331942 version:0.51.0 Changes: -------- --- /work/SRC/openSUSE:Factory/grype-db/grype-db.changes 2026-01-30 18:26:08.651267396 +0100 +++ /work/SRC/openSUSE:Factory/.grype-db.new.1670/grype-db.changes 2026-02-09 15:35:01.455834332 +0100 @@ -1,0 +2,29 @@ +Mon Feb 09 06:20:19 UTC 2026 - Johannes Kastl <[email protected]> + +- Update to version 0.51.0: + * Added Features + - capture new CVSS scores and additional references from GHSA + [#863 @westonsteimel] + - Add support for secureos distro (#765) [#856 + @willmurphyscode] + * Bug Fixes + - remove default configs from grype-db-manager [#861 + @willmurphyscode] + * Additional Changes + - document use of uv not poetry [#640 @popey] + * Dependencies + - chore(deps): Bump boto3 in the python-minor-and-patch group + (#868) + - chore(deps): Bump actions/cache in /.github/actions/bootstrap + (#867) + - chore(deps): Bump actions/cache from 5.0.2 to 5.0.3 (#866) + - chore(deps): Bump the python-minor-and-patch group across 1 + directory with 4 updates (#862) + - chore(deps): update tools to latest versions (#865) + - chore(deps): update anchore dependencies (#864) + - chore(deps): Bump actions/setup-python in + /.github/actions/bootstrap (#854) + - chore(deps): Bump peter-evans/create-pull-request from 8.0.0 + to 8.1.0 (#853) + +------------------------------------------------------------------- Old: ---- grype-db-0.50.0.obscpio New: ---- grype-db-0.51.0.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ grype-db.spec ++++++ --- /var/tmp/diff_new_pack.9weiQt/_old 2026-02-09 15:35:04.047943357 +0100 +++ /var/tmp/diff_new_pack.9weiQt/_new 2026-02-09 15:35:04.051943525 +0100 @@ -17,7 +17,7 @@ Name: grype-db -Version: 0.50.0 +Version: 0.51.0 Release: 0 Summary: A vulnerability scanner for container images and filesystems License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.9weiQt/_old 2026-02-09 15:35:04.107945881 +0100 +++ /var/tmp/diff_new_pack.9weiQt/_new 2026-02-09 15:35:04.111946049 +0100 @@ -3,7 +3,7 @@ <param name="url">https://github.com/anchore/grype-db</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="revision">v0.50.0</param> + <param name="revision">v0.51.0</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.9weiQt/_old 2026-02-09 15:35:04.143947395 +0100 +++ /var/tmp/diff_new_pack.9weiQt/_new 2026-02-09 15:35:04.151947732 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/anchore/grype-db</param> - <param name="changesrevision">ebc5f8151645415711407e8edc248df8c89d5195</param></service></servicedata> + <param name="changesrevision">013670be3fbdc9eea9e85f19c549aa48f8320e55</param></service></servicedata> (No newline at EOF) ++++++ grype-db-0.50.0.obscpio -> grype-db-0.51.0.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/.binny.yaml new/grype-db-0.51.0/.binny.yaml --- old/grype-db-0.50.0/.binny.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/.binny.yaml 2026-02-06 13:53:02.000000000 +0100 @@ -2,7 +2,7 @@ # we want to use a pinned version of binny to manage the toolchain (so binny manages itself!) - name: binny version: - want: v0.11.1 + want: v0.11.2 method: github-release with: repo: anchore/binny diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/.grype-db-manager.yaml new/grype-db-0.51.0/.grype-db-manager.yaml --- old/grype-db-0.50.0/.grype-db-manager.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/.grype-db-manager.yaml 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -data: !include config/grype-db-manager/include.d/data.yaml - -grype-db: !include config/grype-db-manager/include.d/grype-db-local-build-r2.yaml - -# note: do not put any values here! -# distribution: -# ... - -validate: !include config/grype-db-manager/include.d/validate.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/DEVELOPING.md new/grype-db-0.51.0/DEVELOPING.md --- old/grype-db-0.50.0/DEVELOPING.md 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/DEVELOPING.md 2026-02-06 13:53:02.000000000 +0100 @@ -5,16 +5,11 @@ This codebase is primarily Go, however, there are also Python scripts critical to the daily DB publishing process as well as acceptance testing. You will require the following: -- Python 3.8+ installed on your system. Consider using [pyenv](https://github.com/pyenv/pyenv) if you do not have a +- Python 3.11+ installed on your system. Consider using [pyenv](https://github.com/pyenv/pyenv) if you do not have a preference for managing python interpreter installations. - `zstd` binary utility if you are packaging v6+ DB schemas - _(optional)_ `xz` binary utility if you have specifically overridden the package command options - -- [Poetry](https://python-poetry.org/) installed for dependency and virtualenv management for python dependencies, to install: - - ```bash - curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python - - ``` +- [uv](https://docs.astral.sh/uv/) installed for dependency and virtualenv management for python dependencies (see [installation docs](https://docs.astral.sh/uv/getting-started/installation/)) To download go tooling used for static analysis and dependent go modules run the following: @@ -264,8 +259,7 @@ ```bash # from the repo root - # must be in a poetry shell - grype-db-manager db build-and-upload --schema-version <version> + uv run grype-db-manager db build-and-upload --schema-version <version> ``` This call needs to be repeated for all schema versions that are supported (see `manager/src/grype_db_manager/data/schema-info.json`). @@ -282,8 +276,7 @@ ```bash # from the repo root - # must be in a poetry shell - grype-db-manager listing update + uv run grype-db-manager listing update ``` During this step the locally crafted listing file is tested against installations of grype. The correctness of the diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/config/grype-db/publish-nightly-r2.yaml new/grype-db-0.51.0/config/grype-db/publish-nightly-r2.yaml --- old/grype-db-0.50.0/config/grype-db/publish-nightly-r2.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/config/grype-db/publish-nightly-r2.yaml 2026-02-06 13:53:02.000000000 +0100 @@ -28,6 +28,7 @@ - name: minimos - name: oracle - name: rhel + - name: secureos - name: sles - name: ubuntu - name: wolfi diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/config/grype-db/publish-nightly.yaml new/grype-db-0.51.0/config/grype-db/publish-nightly.yaml --- old/grype-db-0.50.0/config/grype-db/publish-nightly.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/config/grype-db/publish-nightly.yaml 1970-01-01 01:00:00.000000000 +0100 @@ -1,45 +0,0 @@ -# this is a grype-db application configuration file intended for use with the daily db publisher workflow - -provider: - root: data/vunnel - - # No manual configs are provided since 'provider.vunnel.generateConfigs' is set to true - # this means that well run vunnel to get the list of supported providers. All supported providers - # will be included in the database build. This prevents the need from manually updating this file - # for every new provider that is added. - # - # Any providers that should be excluded from processing should be added to the 'provider.vunnel.excludeProviders' list. - configs: - - name: nvd - - name: alpine - - name: amazon - - name: bitnami - - name: chainguard - - name: chainguard-libraries - - name: debian - - name: echo - - name: epss - - name: github - - name: kev - - name: mariner - - name: minimos - - name: oracle - - name: rhel - - name: sles - - name: ubuntu - - name: wolfi - - vunnel: - executor: docker - docker-tag: latest - generate-configs: false - env: - GITHUB_TOKEN: $GITHUB_TOKEN - NVD_API_KEY: $NVD_API_KEY - -pull: - parallelism: 4 - -package: - # required for v5 - publish-base-url: https://toolbox-data.anchore.io/grype/databases diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/config/grype-db-manager/include.d/grype-db-local-build-r2.yaml new/grype-db-0.51.0/config/grype-db-manager/include.d/grype-db-local-build-r2.yaml --- old/grype-db-0.50.0/config/grype-db-manager/include.d/grype-db-local-build-r2.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/config/grype-db-manager/include.d/grype-db-local-build-r2.yaml 1970-01-01 01:00:00.000000000 +0100 @@ -1,9 +0,0 @@ -# grype-db: - -# use the current repo at the current commit as the source of truth for the grype-db build source. -# note: assume this will be invoked from the root of the repo -version: latest - -# grype-db application configuration to use. -# note: assume this will be invoked from the root of the repo -config: config/grype-db/publish-nightly-r2.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/config/grype-db-manager/include.d/grype-db-local-build.yaml new/grype-db-0.51.0/config/grype-db-manager/include.d/grype-db-local-build.yaml --- old/grype-db-0.50.0/config/grype-db-manager/include.d/grype-db-local-build.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/config/grype-db-manager/include.d/grype-db-local-build.yaml 2026-02-06 13:53:02.000000000 +0100 @@ -6,4 +6,4 @@ # grype-db application configuration to use. # note: assume this will be invoked from the root of the repo -config: config/grype-db/publish-nightly.yaml +config: config/grype-db/publish-nightly-r2.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/config/grype-db-manager/publish-production-r2.yaml new/grype-db-0.51.0/config/grype-db-manager/publish-production-r2.yaml --- old/grype-db-0.50.0/config/grype-db-manager/publish-production-r2.yaml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/config/grype-db-manager/publish-production-r2.yaml 2026-02-06 13:53:02.000000000 +0100 @@ -2,7 +2,7 @@ data: !include config/grype-db-manager/include.d/data.yaml -grype-db: !include config/grype-db-manager/include.d/grype-db-local-build-r2.yaml +grype-db: !include config/grype-db-manager/include.d/grype-db-local-build.yaml distribution: !include config/grype-db-manager/include.d/distribution-production-r2.yaml diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/go.mod new/grype-db-0.51.0/go.mod --- old/grype-db-0.50.0/go.mod 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/go.mod 2026-02-06 13:53:02.000000000 +0100 @@ -8,9 +8,9 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/adrg/xdg v0.5.3 github.com/anchore/go-logger v0.0.0-20250318195838-07ae343dd722 - github.com/anchore/grype v0.107.0 + github.com/anchore/grype v0.107.1 github.com/anchore/packageurl-go v0.1.1-0.20250220190351-d62adb6e1115 - github.com/anchore/syft v1.41.1 + github.com/anchore/syft v1.41.2 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de github.com/dave/jennifer v1.7.1 github.com/dustin/go-humanize v1.0.1 @@ -314,7 +314,7 @@ modernc.org/libc v1.67.6 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.44.1 // indirect + modernc.org/sqlite v1.44.3 // indirect ) // the go.mod file did not have the correct minimum go version at the time of release tagging diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/go.sum new/grype-db-0.51.0/go.sum --- old/grype-db-0.50.0/go.sum 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/go.sum 2026-02-06 13:53:02.000000000 +0100 @@ -152,14 +152,14 @@ github.com/anchore/go-testutils v0.0.0-20200925183923-d5f45b0d3c04/go.mod h1:6dK64g27Qi1qGQZ67gFmBFvEHScy0/C8qhQhNe5B5pQ= github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4 h1:rmZG77uXgE+o2gozGEBoUMpX27lsku+xrMwlmBZJtbg= github.com/anchore/go-version v1.2.2-0.20210903204242-51efa5b487c4/go.mod h1:Bkc+JYWjMCF8OyZ340IMSIi2Ebf3uwByOk6ho4wne1E= -github.com/anchore/grype v0.107.0 h1:7uzKfPikWG5EIDOWG+vHn8s1eGlDggR2WYHxHW0qxVM= -github.com/anchore/grype v0.107.0/go.mod h1:pA3mape0QNEI+beNfjS3LXtnUfJgk3zVvOR1FYIlE8Y= +github.com/anchore/grype v0.107.1 h1:N7EIlJfuq7RKA5nSgXPxOfifyB8EABYd2vP+CJwL1bY= +github.com/anchore/grype v0.107.1/go.mod h1:DilbSyGMuYZREWL/tIZYOA4PedC2X2FOaEMAmQaNGhg= github.com/anchore/packageurl-go v0.1.1-0.20250220190351-d62adb6e1115 h1:ZyRCmiEjnoGJZ1+Ah0ZZ/mKKqNhGcUZBl0s7PTTDzvY= github.com/anchore/packageurl-go v0.1.1-0.20250220190351-d62adb6e1115/go.mod h1:KoYIv7tdP5+CC9VGkeZV4/vGCKsY55VvoG+5dadg4YI= github.com/anchore/stereoscope v0.1.19 h1:1G5LVmRN1Sz6qNezpVAEeN7QfWwCE9zw9TJK1ZGnkvw= github.com/anchore/stereoscope v0.1.19/go.mod h1:+laNHlk05xA2YqgEzq8mxkFzclL3NRdeNIsiQQVeZZ4= -github.com/anchore/syft v1.41.1 h1:lUoEi/ICCSe8eqDmwwG7Kw6brVT20Ap5OmiqWlmddAg= -github.com/anchore/syft v1.41.1/go.mod h1:vrE06rTzgwrHB3T7fh83S/M555rpxy/olUG5c+oVcoU= +github.com/anchore/syft v1.41.2 h1:mC2l3P8dUvBdz+97ZNcKD410s8vGFGFXdZa+neaQEb8= +github.com/anchore/syft v1.41.2/go.mod h1:j8SaTiPQzSxElS0MWw3ML2m2EK4av/7Vm4q8WpwUmYw= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= @@ -1576,8 +1576,8 @@ modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.44.1 h1:qybx/rNpfQipX/t47OxbHmkkJuv2JWifCMH8SVUiDas= -modernc.org/sqlite v1.44.1/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA= +modernc.org/sqlite v1.44.3 h1:+39JvV/HWMcYslAwRxHb8067w+2zowvFOUrOWIy9PjY= +modernc.org/sqlite v1.44.3/go.mod h1:CzbrU2lSB1DKUusvwGz7rqEKIq+NUd8GWuBBZDs9/nA= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/Makefile new/grype-db-0.51.0/manager/Makefile --- old/grype-db-0.50.0/manager/Makefile 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/Makefile 2026-02-06 13:53:02.000000000 +0100 @@ -46,20 +46,6 @@ cd tests/cli && uv run make -## DB Testing targets ################################# - -.PHONY: db-acceptance -db-acceptance: ## Run DB acceptance tests - @ echo "Building and testing DB schema=$(schema_version)" - if [ -z "$(schema_version)" ]; then \ - echo "schema_version is not set"; \ - exit 1; \ - fi - - export DB_ID=$(shell uv run grype-db-manager db build --schema-version $(schema_version)) - uv run grype-db-manager db validaate $(DB_ID) - - ## Halp! ################################# .PHONY: help diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/src/grype_db_manager/cli/cli.py new/grype-db-0.51.0/manager/src/grype_db_manager/cli/cli.py --- old/grype-db-0.50.0/manager/src/grype_db_manager/cli/cli.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/src/grype_db_manager/cli/cli.py 2026-02-06 13:53:02.000000000 +0100 @@ -12,7 +12,7 @@ @click.option("--verbose", "-v", "verbosity", count=True, help="show details of all comparisons") [email protected]("--config", "-c", "config_path", default=None, help="override config path") [email protected]("--config", "-c", "config_path", default=None, help="config file path (required for subcommands)") @click.group(help="A tool for publishing validated grype databases to S3 for distribution.") @click.version_option(package_name=package_name, message="%(prog)s %(version)s") @click.pass_context @@ -23,7 +23,17 @@ import colorlog # noqa: PLC0415 - ctx.obj = config.load(path=config_path, verbosity=verbosity) + # config is required for subcommands, but not for --help or --version + if ctx.invoked_subcommand is not None: + if not config_path: + msg = "missing required option: -c/--config" + raise click.UsageError(msg) + ctx.obj = config.load(path=config_path) + ctx.obj.verbosity = verbosity + elif config_path: + # allow loading config even without subcommand (e.g., for future use) + ctx.obj = config.load(path=config_path) + ctx.obj.verbosity = verbosity class DeltaTimeFormatter(colorlog.ColoredFormatter): def __init__(self, *args: Any, **kwargs: Any): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/src/grype_db_manager/cli/config.py new/grype-db-0.51.0/manager/src/grype_db_manager/cli/config.py --- old/grype-db-0.50.0/manager/src/grype_db_manager/cli/config.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/src/grype_db_manager/cli/config.py 2026-02-06 13:53:02.000000000 +0100 @@ -21,12 +21,6 @@ yaml.add_constructor("!include", yaml_include.Constructor(base_dir=os.getcwd()), Loader=yaml.SafeLoader) -DEFAULT_CONFIGS = ( - ".grype-db-manager.yaml", - "grype-db-manager.yaml", -) - - @dataclass class Log: level: str = "INFO" @@ -37,7 +31,7 @@ @dataclass class GrypeDB: - version: str = "latest" + version: str = "" config: str = "" @@ -78,27 +72,10 @@ @dataclass() class Validate: - default_max_year: int = 2021 + default_max_year: int = 0 gates: list[ValidateDB] = field(default_factory=list) listing: ValidateListing = field(default_factory=ValidateListing) - expected_providers: list[str] = field( - default_factory=lambda: [ - "alpine", - "amazon", - "chainguard", - "debian", - "echo", - "github", - "mariner", - "minimos", - "nvd", - "oracle", - "rhel", - "sles", - "ubuntu", - "wolfi", - ], - ) + expected_providers: list[str] = field(default_factory=list) @dataclass() @@ -123,9 +100,9 @@ @dataclass class Data: - root: str = ".grype-db-manager" - vunnel_root: str = "data/vunnel" - yardstick_root: str = "data/yardstick" + root: str = "" + vunnel_root: str = "" + yardstick_root: str = "" @dataclass @@ -194,47 +171,15 @@ def load( - path: None | str | list[str] | tuple[str] = DEFAULT_CONFIGS, + path: str, wire_values: bool = True, - verbosity: int = 0, env: Mapping | None = None, ) -> Application: - cfg = _load_paths(path, wire_values=wire_values, env=env, verbosity=verbosity) - - if not cfg: - msg = "no config found" - raise FileNotFoundError(msg) - - return cfg - - -def _load_paths( - path: None | str | list[str] | tuple[str], - wire_values: bool = True, - env: Mapping | None = None, - verbosity: int = 0, -) -> Application | None: if not path: - path = DEFAULT_CONFIGS - - if isinstance(path, str): - if path == "": - path = DEFAULT_CONFIGS - else: - return _load(path, wire_values=wire_values, env=env) - - if isinstance(path, (list, tuple)): - for p in path: - if not os.path.exists(p): - continue - - return _load(p, wire_values=wire_values, env=env) - - # use the default application config - return Application(verbosity=verbosity) + msg = "config path is required (use -c/--config)" + raise ValueError(msg) - msg = f"invalid path type {type(path)}" - raise ValueError(msg) + return _load(path, wire_values=wire_values, env=env) def _load(path: str, wire_values: bool = True, env: Mapping | None = None) -> Application: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/src/grype_db_manager/grypedb.py new/grype-db-0.51.0/manager/src/grype_db_manager/grypedb.py --- old/grype-db-0.50.0/manager/src/grype_db_manager/grypedb.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/src/grype_db_manager/grypedb.py 2026-02-06 13:53:02.000000000 +0100 @@ -136,111 +136,11 @@ "wolfi:distro:wolfi:rolling", ] -v3_expected_namespaces = [ - "alpine:3.10", - "alpine:3.11", - "alpine:3.12", - "alpine:3.13", - "alpine:3.14", - "alpine:3.15", - "alpine:3.16", - "alpine:3.17", - "alpine:3.18", - "alpine:3.2", - "alpine:3.3", - "alpine:3.4", - "alpine:3.5", - "alpine:3.6", - "alpine:3.7", - "alpine:3.8", - "alpine:3.9", - "alpine:edge", - "amzn:2", - "amzn:2022", - "amzn:2023", - "chainguard:rolling", - "debian:10", - "debian:11", - "debian:12", - "debian:13", - "debian:7", - "debian:8", - "debian:9", - "debian:unstable", - "github:composer", - "github:dart", - "github:gem", - "github:go", - "github:java", - "github:npm", - "github:nuget", - "github:python", - "github:rust", - "github:swift", - "mariner:1.0", - "mariner:2.0", - "minimos:rolling", - "nvd", - "ol:5", - "ol:6", - "ol:7", - "ol:8", - "ol:9", - "rhel:5", - "rhel:6", - "rhel:7", - "rhel:8", - "rhel:9", - "sles:11", - "sles:11.1", - "sles:11.2", - "sles:11.3", - "sles:11.4", - "sles:12", - "sles:12.1", - "sles:12.2", - "sles:12.3", - "sles:12.4", - "sles:12.5", - "sles:15", - "sles:15.1", - "sles:15.2", - "sles:15.3", - "sles:15.4", - "sles:15.5", - "ubuntu:12.04", - "ubuntu:12.10", - "ubuntu:13.04", - "ubuntu:14.04", - "ubuntu:14.10", - "ubuntu:15.04", - "ubuntu:15.10", - "ubuntu:16.04", - "ubuntu:16.10", - "ubuntu:17.04", - "ubuntu:17.10", - "ubuntu:18.04", - "ubuntu:18.10", - "ubuntu:19.04", - "ubuntu:19.10", - "ubuntu:20.04", - "ubuntu:20.10", - "ubuntu:21.04", - "ubuntu:21.10", - "ubuntu:22.04", - "ubuntu:22.10", - "ubuntu:23.04", - "ubuntu:23.10", - "ubuntu:24.04", - "wolfi:rolling", -] - def expected_namespaces(schema_version: int) -> list[str]: - if schema_version <= 3: - return v3_expected_namespaces - if schema_version == 4: - return v4_expected_namespaces + if schema_version < 5: + msg = f"schema {schema_version} is EOL. v5 is latest supported version" + raise ValueError(msg) return v4_expected_namespaces + v5_additional_namespaces @@ -622,6 +522,10 @@ str | None: The path to the installed binary, or None if no installation was performed. """ + if not input_version: + msg = "grype-db version is required (set grype_db.version in config)" + raise ValueError(msg) + os.makedirs(bin_dir, exist_ok=True) # Check for explicit grype-db binary override (opt-in only) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-legacy-workflow-3.py new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-legacy-workflow-3.py --- old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-legacy-workflow-3.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-legacy-workflow-3.py 2026-02-06 13:53:02.000000000 +0100 @@ -11,7 +11,7 @@ def main(): - cfg = config.load() + cfg = config.load(".grype-db-manager.yaml") s3_bucket = cfg.distribution.s3_bucket s3_path = cfg.distribution.s3_path diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-legacy-workflow-4.py new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-legacy-workflow-4.py --- old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-legacy-workflow-4.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-legacy-workflow-4.py 2026-02-06 13:53:02.000000000 +0100 @@ -11,7 +11,7 @@ def main(): - cfg = config.load() + cfg = config.load(".grype-db-manager.yaml") s3_bucket = cfg.distribution.s3_bucket s3_path = cfg.distribution.s3_path diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-workflow-1.py new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-workflow-1.py --- old/grype-db-0.50.0/manager/tests/cli/s3-mock/setup-workflow-1.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/cli/s3-mock/setup-workflow-1.py 2026-02-06 13:53:02.000000000 +0100 @@ -11,7 +11,7 @@ def main(): - cfg = config.load() + cfg = config.load(".grype-db-manager.yaml") s3_bucket = cfg.distribution.s3_bucket region = cfg.distribution.aws_region diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/cli/test_legacy_workflows.py new/grype-db-0.51.0/manager/tests/cli/test_legacy_workflows.py --- old/grype-db-0.50.0/manager/tests/cli/test_legacy_workflows.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/cli/test_legacy_workflows.py 2026-02-06 13:53:02.000000000 +0100 @@ -14,16 +14,16 @@ command.run("make vunnel-oracle-data", env=cli_env) logger.step("case 1: create the DB") - stdout, _ = command.run("grype-db-manager -v db build -s 5", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml -v db build -s 5", env=cli_env) assert stdout.strip(), "Expected non-empty output" db_id = stdout.splitlines()[-1] # assume DB ID is the last line of output - stdout, _ = command.run("grype-db-manager db list", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml db list", env=cli_env) assert db_id in stdout, f"Expected DB ID {db_id} in output" logger.step("case 2: delete the DB") - command.run("grype-db-manager db clear", env=cli_env) - stdout, _ = command.run("grype-db-manager db list", env=cli_env) + command.run("grype-db-manager -c .grype-db-manager.yaml db clear", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml db list", env=cli_env) assert db_id not in stdout, f"Did not expect DB ID {db_id} in output" @@ -39,7 +39,7 @@ command.run("make vunnel-oracle-data", env=cli_env) # create the database - stdout, _ = command.run("grype-db-manager -v db build -s 5", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml -v db build -s 5", env=cli_env) assert stdout.strip(), "Expected non-empty output" db_id = stdout.splitlines()[-1] # Get the last line as the DB ID @@ -51,7 +51,7 @@ cli_env["GOWORK"] = "off" stdout, _ = command.run( - f"grype-db-manager -vv db validate {db_id} --skip-namespace-check --recapture", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id} --skip-namespace-check --recapture", env=cli_env, expect_fail=True, ) @@ -65,7 +65,7 @@ command.run("make install-oracle-labels", env=cli_env) _, stderr = command.run( - f"grype-db-manager -vv db validate {db_id}", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id}", env=cli_env, expect_fail=True, ) @@ -79,7 +79,7 @@ command.run("make install-oracle-labels", env=cli_env) stdout, _ = command.run( - f"grype-db-manager -vv db validate {db_id} --skip-namespace-check", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id} --skip-namespace-check", env=cli_env, ) assert "Quality gate passed!" in stdout @@ -121,7 +121,7 @@ logger.step("case 1: update a listing file based on S3 state") # generate a new listing file - stdout, _ = command.run("grype-db-manager listing update", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml listing update", env=cli_env) assert "Validation passed" in stdout assert "listing.json uploaded to s3://testbucket/grype/databases" in stdout @@ -195,7 +195,7 @@ # build, validate, and upload the database stdout, _ = command.run( - f"grype-db-manager db build-and-upload --schema-version {schema_version} --skip-namespace-check", + f"grype-db-manager -c .grype-db-manager.yaml db build-and-upload --schema-version {schema_version} --skip-namespace-check", env=cli_env, ) assert "Quality gate passed!" in stdout @@ -204,7 +204,7 @@ logger.step("case 2: update the listing file based on the DB uploaded") # update the listing file and validate - stdout, _ = command.run("grype-db-manager -v listing update", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml -v listing update", env=cli_env) assert "Validation passed" in stdout assert "listing.json uploaded to s3://testbucket/grype/databases" in stdout diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/cli/test_workflows.py new/grype-db-0.51.0/manager/tests/cli/test_workflows.py --- old/grype-db-0.50.0/manager/tests/cli/test_workflows.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/cli/test_workflows.py 2026-02-06 13:53:02.000000000 +0100 @@ -31,7 +31,7 @@ } ) - cfg = config.load() + cfg = config.load(".grype-db-manager.yaml") image = cfg.validate.gates[0].images[0] grype = grype.install(schema.grype_version(schema_version), bin_dir) @@ -46,15 +46,15 @@ command.run("python setup-workflow-1.py", env=cli_env) logger.step("case 1: create the DB") - stdout, _ = command.run(f"grype-db-manager -v db build -s {schema_version}", env=cli_env) + stdout, _ = command.run(f"grype-db-manager -c .grype-db-manager.yaml -v db build -s {schema_version}", env=cli_env) assert stdout.strip(), "Expected non-empty output" db_id = stdout.splitlines()[-1] # assume DB ID is the last line of output - stdout, _ = command.run("grype-db-manager db list", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml db list", env=cli_env) assert db_id in stdout, f"Expected DB ID {db_id} in output" logger.step("case 2: upload the DB") - stdout, _ = command.run(f"grype-db-manager db upload {db_id}", env=cli_env) + stdout, _ = command.run(f"grype-db-manager -c .grype-db-manager.yaml db upload {db_id}", env=cli_env) assert f"DB archive '{db_id}' uploaded to s3://testbucket/grype/databases/v{schema_version}" in stdout assert f"latest.json '{db_id}' uploaded to s3://testbucket/grype/databases/v{schema_version}" in stdout @@ -66,8 +66,8 @@ assert "ELSA-2021-9314" in stdout logger.step("case 4: delete the DB") - command.run("grype-db-manager db clear", env=cli_env) - stdout, _ = command.run("grype-db-manager db list", env=cli_env) + command.run("grype-db-manager -c .grype-db-manager.yaml db clear", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml db list", env=cli_env) assert db_id not in stdout, f"Did not expect DB ID {db_id} in output" ### end of testing ### @@ -89,7 +89,7 @@ command.run("make vunnel-oracle-data", env=cli_env) # create the database - stdout, _ = command.run("grype-db-manager -v db build -s 6", env=cli_env) + stdout, _ = command.run("grype-db-manager -c .grype-db-manager.yaml -v db build -s 6", env=cli_env) assert stdout.strip(), "Expected non-empty output" db_id = stdout.splitlines()[-1] # Get the last line as the DB ID @@ -102,7 +102,7 @@ # note: we add --force to ensure we're checking validations (even if it's disabled for the schema) stdout, stderr = command.run( - f"grype-db-manager -vv db validate {db_id} --skip-namespace-check --force --recapture", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id} --skip-namespace-check --force --recapture", env=cli_env, expect_fail=True, ) @@ -117,7 +117,7 @@ command.run("make install-oracle-labels", env=cli_env) _, stderr = command.run( - f"grype-db-manager -vv db validate {db_id} --force", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id} --force", env=cli_env, expect_fail=True, ) @@ -131,7 +131,7 @@ command.run("make install-oracle-labels", env=cli_env) stdout, _ = command.run( - f"grype-db-manager -vv db validate {db_id} --skip-namespace-check --force", + f"grype-db-manager -c .grype-db-manager.yaml -vv db validate {db_id} --skip-namespace-check --force", env=cli_env, ) assert "Quality gate passed!" in stdout diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/unit/cli/test_config.py new/grype-db-0.51.0/manager/tests/unit/cli/test_config.py --- old/grype-db-0.50.0/manager/tests/unit/cli/test_config.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/unit/cli/test_config.py 2026-02-06 13:53:02.000000000 +0100 @@ -42,62 +42,6 @@ assert cfg.distribution.s3_path == "s3-path" -def test_load_default(): - cfg = config.Application() - - actual = cfg.to_yaml() - - expected = """\ -assertAwsCredentials: true -data: - root: .grype-db-manager - vunnelRoot: data/vunnel - yardstickRoot: data/yardstick -distribution: - awsRegion: null - downloadUrlPrefix: null - listingFileName: listing.json - listingReplicas: [] - s3AlwaysSuffixSchemaVersion: false - s3Bucket: null - s3EndpointUrl: null - s3Path: null -grypeDb: - config: '' - version: latest -log: - level: INFO -schemaMappingFile: '' -validate: - defaultMaxYear: 2021 - expectedProviders: - - alpine - - amazon - - chainguard - - debian - - echo - - github - - mariner - - minimos - - nvd - - oracle - - rhel - - sles - - ubuntu - - wolfi - gates: [] - listing: - image: null - minimumPackages: null - minimumVulnerabilities: null - overrideDbSchemaVersion: null - overrideGrypeVersion: null -verbosity: 0 -""" - - assert actual == expected - - def test_load(test_dir_path): config_path = test_dir_path("fixtures/config/full.yaml") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/unit/cli/test_listing.py new/grype-db-0.51.0/manager/tests/unit/cli/test_listing.py --- old/grype-db-0.50.0/manager/tests/unit/cli/test_listing.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/unit/cli/test_listing.py 2026-02-06 13:53:02.000000000 +0100 @@ -39,7 +39,7 @@ listing_file_name = "listing.json" with utils.set_directory(dir_with_config): - cfg = config.load() + cfg = config.load(".grype-db-manager.yaml") if os.path.exists(listing_file_name): os.remove(listing_file_name) @@ -144,7 +144,7 @@ expected_object = db.Listing.from_json(f.read()) runner = CliRunner() - result = runner.invoke(cli.cli, "listing create".split()) + result = runner.invoke(cli.cli, "-c .grype-db-manager.yaml listing create".split()) # for debugging print(result.output) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/manager/tests/unit/test_grypedb.py new/grype-db-0.51.0/manager/tests/unit/test_grypedb.py --- old/grype-db-0.50.0/manager/tests/unit/test_grypedb.py 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/manager/tests/unit/test_grypedb.py 2026-02-06 13:53:02.000000000 +0100 @@ -73,9 +73,6 @@ pytest.param(grypedb.expected_namespaces(5), 5, False, id="v5 matches"), pytest.param(grypedb.expected_namespaces(5) + ["extra_items"], 5, False, id="v5 with extra items"), pytest.param(list(grypedb.expected_namespaces(5))[:-5], 5, True, id="v5 missing items"), - pytest.param(grypedb.expected_namespaces(3), 3, False, id="v3 matches"), - pytest.param(grypedb.expected_namespaces(3) + ["extra_items"], 3, False, id="v3 with extra items"), - pytest.param(list(grypedb.expected_namespaces(3))[:-5], 3, True, id="v3 missing items"), ], ) def test_validate_namespaces(self, tmp_path: pathlib.Path, mocker, schema_version, listed_namespaces, expect_error): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/process/v6/transformers/github/test-fixtures/GHSA-qc55-vm3j-74gp.json new/grype-db-0.51.0/pkg/process/v6/transformers/github/test-fixtures/GHSA-qc55-vm3j-74gp.json --- old/grype-db-0.50.0/pkg/process/v6/transformers/github/test-fixtures/GHSA-qc55-vm3j-74gp.json 1970-01-01 01:00:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/process/v6/transformers/github/test-fixtures/GHSA-qc55-vm3j-74gp.json 2026-02-06 13:53:02.000000000 +0100 @@ -0,0 +1,73 @@ +{ + "Vulnerability": {}, + "Advisory": { + "Classification": "GENERAL", + "Severity": "High", + "CVSS": { + "version": "3.0", + "vector_string": "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N", + "base_metrics": { + "base_score": 5.5, + "exploitability_score": 1.8, + "impact_score": 3.6, + "base_severity": "Medium" + }, + "status": "N/A" + }, + "cvss_severities": [ + { + "version": "3.0", + "vector": "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N" + }, + { + "version": "4.0", + "vector": "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N" + } + ], + "FixedIn": [ + { + "name": "jsnapy", + "identifier": "1.3.0", + "ecosystem": "python", + "namespace": "github:python", + "range": "< 1.3.0", + "available": { + "date": "2020-07-28", + "kind": "first-observed" + } + } + ], + "Summary": "JSNAPy allows unprivileged local users to alter files under the directory", + "url": "https://github.com/advisories/GHSA-qc55-vm3j-74gp", + "CVE": [ + "CVE-2018-0023" + ], + "Metadata": { + "CVE": [ + "CVE-2018-0023" + ] + }, + "ghsaId": "GHSA-qc55-vm3j-74gp", + "published": "2018-07-12T20:30:36Z", + "updated": "2024-09-24T21:02:13Z", + "withdrawn": null, + "references": [ + { + "url": "https://nvd.nist.gov/vuln/detail/CVE-2018-0023" + }, + { + "url": "https://github.com/advisories/GHSA-qc55-vm3j-74gp" + }, + { + "url": "https://kb.juniper.net/JSA10856" + }, + { + "url": "https://github.com/pypa/advisory-database/tree/main/vulns/jsnapy/PYSEC-2018-84.yaml" + }, + { + "url": "https://web.archive.org/web/20200227125151/http://www.securityfocus.com/bid/103745" + } + ], + "namespace": "github:python" + } +} \ No newline at end of file diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/process/v6/transformers/github/transform.go new/grype-db-0.51.0/pkg/process/v6/transformers/github/transform.go --- old/grype-db-0.50.0/pkg/process/v6/transformers/github/transform.go 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/process/v6/transformers/github/transform.go 2026-02-06 13:53:02.000000000 +0100 @@ -264,7 +264,8 @@ }) } - if vulnerability.Advisory.CVSS != nil { + // If the new CVSSSeverities field isn't populated, fallback to the old CVSS property + if len(vulnerability.Advisory.CVSSSeverities) == 0 && vulnerability.Advisory.CVSS != nil { severities = append(severities, grypeDB.Severity{ Scheme: grypeDB.SeveritySchemeCVSS, Value: grypeDB.CVSSSeverity{ @@ -272,6 +273,16 @@ Version: vulnerability.Advisory.CVSS.Version, }, }) + } else { + for _, cvss := range vulnerability.Advisory.CVSSSeverities { + severities = append(severities, grypeDB.Severity{ + Scheme: grypeDB.SeveritySchemeCVSS, + Value: grypeDB.CVSSSeverity{ + Vector: cvss.Vector, + Version: cvss.Version, + }, + }) + } } return severities @@ -283,13 +294,23 @@ } func getReferences(vulnerability unmarshal.GitHubAdvisory) []grypeDB.Reference { - // TODO: The additional reference links are not currently captured in the vunnel result, but should be enhanced to - // https://github.com/anchore/vunnel/issues/646 to capture this + // Capture the GitHub Advisory URL as the first reference refs := []grypeDB.Reference{ { URL: vulnerability.Advisory.URL, }, } - return refs + for _, reference := range vulnerability.Advisory.References { + clean := strings.TrimSpace(reference.URL) + if clean == "" { + continue + } + // TODO there is other info we could be capturing too (source) + refs = append(refs, grypeDB.Reference{ + URL: clean, + }) + } + + return transformers.DeduplicateReferences(refs) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/process/v6/transformers/github/transform_test.go new/grype-db-0.51.0/pkg/process/v6/transformers/github/transform_test.go --- old/grype-db-0.50.0/pkg/process/v6/transformers/github/transform_test.go 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/process/v6/transformers/github/transform_test.go 2026-02-06 13:53:02.000000000 +0100 @@ -322,6 +322,66 @@ }, }, }, + { + name: "test-fixtures/GHSA-qc55-vm3j-74gp.json", + expected: []grypeDB.VulnerabilityHandle{ + { + Name: "GHSA-qc55-vm3j-74gp", + ProviderID: "github", + Provider: &grypeDB.Provider{ + ID: "github", + Version: "1", + DateCaptured: &now, + }, + ModifiedDate: internal.ParseTime("2024-09-24T21:02:13Z"), + PublishedDate: internal.ParseTime("2018-07-12T20:30:36Z"), + WithdrawnDate: nil, + Status: grypeDB.VulnerabilityActive, + BlobValue: &grypeDB.VulnerabilityBlob{ + ID: "GHSA-qc55-vm3j-74gp", + Description: "JSNAPy allows unprivileged local users to alter files under the directory", + References: []grypeDB.Reference{ + { + URL: "https://github.com/advisories/GHSA-qc55-vm3j-74gp", + }, + { + URL: "https://nvd.nist.gov/vuln/detail/CVE-2018-0023", + }, + { + URL: "https://kb.juniper.net/JSA10856", + }, + { + URL: "https://github.com/pypa/advisory-database/tree/main/vulns/jsnapy/PYSEC-2018-84.yaml", + }, + { + URL: "https://web.archive.org/web/20200227125151/http://www.securityfocus.com/bid/103745", + }, + }, + Aliases: []string{"CVE-2018-0023"}, + Severities: []grypeDB.Severity{ + { + Scheme: grypeDB.SeveritySchemeCHML, + Value: "high", + }, + { + Scheme: grypeDB.SeveritySchemeCVSS, + Value: grypeDB.CVSSSeverity{ + Vector: "CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N", + Version: "3.0", + }, + }, + { + Scheme: grypeDB.SeveritySchemeCVSS, + Value: grypeDB.CVSSSeverity{ + Vector: "CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N", + Version: "4.0", + }, + }, + }, + }, + }, + }, + }, } for _, tt := range tests { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/process/v6/transformers/nvd/transform.go new/grype-db-0.51.0/pkg/process/v6/transformers/nvd/transform.go --- old/grype-db-0.50.0/pkg/process/v6/transformers/nvd/transform.go 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/process/v6/transformers/nvd/transform.go 2026-02-06 13:53:02.000000000 +0100 @@ -357,51 +357,5 @@ }) } - return deduplicateReferences(references) -} - -// deduplicateReferences removes duplicate references, where two references are considered -// identical if they have the same URL and their normalized, sorted tags are equal -func deduplicateReferences(references []grypeDB.Reference) []grypeDB.Reference { - var result []grypeDB.Reference - seenBefore := make(map[string][]grypeDB.Reference) - for _, ref := range references { - if _, anySeenRefs := seenBefore[ref.URL]; !anySeenRefs { - seenBefore[ref.URL] = []grypeDB.Reference{ref} - result = append(result, ref) - continue - } - alreadySeenRefs := seenBefore[ref.URL] - isDuplicate := false - // Check if this reference already exists for this URL - for _, already := range alreadySeenRefs { - if refsAreEqual(already, ref) { - isDuplicate = true - break - } - } - if !isDuplicate { - seenBefore[ref.URL] = append(seenBefore[ref.URL], ref) - result = append(result, ref) - } - } - - return result -} - -func refsAreEqual(a, b grypeDB.Reference) bool { - if a.URL != b.URL { - return false - } - - if len(a.Tags) != len(b.Tags) { - return false - } - - for i := range a.Tags { - if a.Tags[i] != b.Tags[i] { - return false - } - } - return true + return transformers.DeduplicateReferences(references) } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/process/v6/transformers/references.go new/grype-db-0.51.0/pkg/process/v6/transformers/references.go --- old/grype-db-0.50.0/pkg/process/v6/transformers/references.go 1970-01-01 01:00:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/process/v6/transformers/references.go 2026-02-06 13:53:02.000000000 +0100 @@ -0,0 +1,49 @@ +package transformers + +import grypeDB "github.com/anchore/grype/grype/db/v6" + +// deduplicateReferences removes duplicate references, where two references are considered +// identical if they have the same URL and their normalized, sorted tags are equal +func DeduplicateReferences(references []grypeDB.Reference) []grypeDB.Reference { + var result []grypeDB.Reference + seenBefore := make(map[string][]grypeDB.Reference) + for _, ref := range references { + if _, anySeenRefs := seenBefore[ref.URL]; !anySeenRefs { + seenBefore[ref.URL] = []grypeDB.Reference{ref} + result = append(result, ref) + continue + } + alreadySeenRefs := seenBefore[ref.URL] + isDuplicate := false + // Check if this reference already exists for this URL + for _, already := range alreadySeenRefs { + if refsAreEqual(already, ref) { + isDuplicate = true + break + } + } + if !isDuplicate { + seenBefore[ref.URL] = append(seenBefore[ref.URL], ref) + result = append(result, ref) + } + } + + return result +} + +func refsAreEqual(a, b grypeDB.Reference) bool { + if a.URL != b.URL { + return false + } + + if len(a.Tags) != len(b.Tags) { + return false + } + + for i := range a.Tags { + if a.Tags[i] != b.Tags[i] { + return false + } + } + return true +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pkg/provider/unmarshal/github_advisory.go new/grype-db-0.51.0/pkg/provider/unmarshal/github_advisory.go --- old/grype-db-0.50.0/pkg/provider/unmarshal/github_advisory.go 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/pkg/provider/unmarshal/github_advisory.go 2026-02-06 13:53:02.000000000 +0100 @@ -19,18 +19,25 @@ VectorString string `json:"vector_string"` Version string `json:"version"` } `json:"CVSS"` + CVSSSeverities []*struct { + Vector string `json:"vector"` + Version string `json:"version"` + } `json:"cvss_severities"` FixedIn []GithubFixedIn `json:"FixedIn"` Metadata struct { CVE []string `json:"CVE"` } `json:"Metadata"` - Severity string `json:"Severity"` - Summary string `json:"Summary"` - GhsaID string `json:"ghsaId"` - Namespace string `json:"namespace"` - URL string `json:"url"` - Published string `json:"published"` - Updated string `json:"updated"` - Withdrawn string `json:"withdrawn"` + Severity string `json:"Severity"` + Summary string `json:"Summary"` + GhsaID string `json:"ghsaId"` + Namespace string `json:"namespace"` + URL string `json:"url"` + Published string `json:"published"` + Updated string `json:"updated"` + Withdrawn string `json:"withdrawn"` + References []*struct { + URL string `json:"url"` + } `json:"references"` } `json:"Advisory"` } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/pyproject.toml new/grype-db-0.51.0/pyproject.toml --- old/grype-db-0.50.0/pyproject.toml 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/pyproject.toml 2026-02-06 13:53:02.000000000 +0100 @@ -152,7 +152,7 @@ "PLW2901", # "Outer for loop variable X overwritten by inner assignment target", not useful in most cases "RUF100", # no blanket "noqa" usage, can be improved over time, but not now "TRY003", # specifying long messages outside the exception class is excellent context! why is this an antipattern? - "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)` -- not compatible with python 3.9 (even with __future__ import) + "COM812", # conflicts with ruff formatter ] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/test/db/acceptance.sh new/grype-db-0.51.0/test/db/acceptance.sh --- old/grype-db-0.50.0/test/db/acceptance.sh 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/test/db/acceptance.sh 2026-02-06 13:53:02.000000000 +0100 @@ -17,7 +17,7 @@ title "Building DB" fi -DB_ID=$(grype-db-manager -v db build --schema-version $SCHEMA_VERSION) +DB_ID=$(grype-db-manager -v -c ./config/grype-db-manager/acceptance-pr.yaml db build --schema-version $SCHEMA_VERSION) if [ -z "$DB_ID" ]; then echo "Failed to create DB instance" @@ -26,4 +26,4 @@ title "Validating DB" -grype-db-manager -vv db validate $DB_ID +grype-db-manager -vv -c ./config/grype-db-manager/acceptance-pr.yaml db validate $DB_ID diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/grype-db-0.50.0/uv.lock new/grype-db-0.51.0/uv.lock --- old/grype-db-0.50.0/uv.lock 2026-01-30 00:06:00.000000000 +0100 +++ new/grype-db-0.51.0/uv.lock 2026-02-06 13:53:02.000000000 +0100 @@ -4,30 +4,30 @@ [[package]] name = "boto3" -version = "1.42.29" +version = "1.42.38" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5c/24/1dd85b64004103c2e60476d0fa8d78435f5fed9db1129cd2cd332784037a/boto3-1.42.29.tar.gz", hash = "sha256:247e54f24116ad6792cfc14b274288383af3ec3433b0547da8a14a8bd6e81950", size = 112810, upload-time = "2026-01-15T20:36:39.404Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/38/1e5eb348e41d97ca2b6164df28501409c2fe9bd34455c256dd87644b7c0e/boto3-1.42.38.tar.gz", hash = "sha256:af2e5c08972d35fa4b4bc457031794343a6ddb1df5692db43302d5b5feaac23e", size = 112852, upload-time = "2026-01-29T20:39:37.786Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/51/30/2c25d7be8418e7f137ffece6097c68199dbd6996da645ec9b5a5a9647123/boto3-1.42.29-py3-none-any.whl", hash = "sha256:6c9c4dece67bf72d82ba7dff48e33a56a87cdf9b16c8887f88ca7789a95d3317", size = 140574, upload-time = "2026-01-15T20:36:37.206Z" }, + { url = "https://files.pythonhosted.org/packages/ec/98/22e5f4f5ced6cf1aface4b438307a157e9cb7a4bcbd19f4b9dec89b0fe33/boto3-1.42.38-py3-none-any.whl", hash = "sha256:b5a748b3fdddba8aa2988af0e462996ef72dc2760b0eab30329b9d201d4b38f2", size = 140606, upload-time = "2026-01-29T20:39:36.641Z" }, ] [[package]] name = "botocore" -version = "1.42.30" +version = "1.42.42" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/44/38/23862628a0eb044c8b8b3d7a9ad1920b3bfd6bce6d746d5a871e8382c7e4/botocore-1.42.30.tar.gz", hash = "sha256:9bf1662b8273d5cc3828a49f71ca85abf4e021011c1f0a71f41a2ea5769a5116", size = 14891439, upload-time = "2026-01-16T20:37:13.77Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/96/4eca9755ca444402c46c73cc8ff252c8eb73ab0ccf35ca76d89e7b7820ac/botocore-1.42.42.tar.gz", hash = "sha256:cb75639f5ba7bf73b83ac18bcd87f07b7f484f302748da974dad2801a83a1d60", size = 14926585, upload-time = "2026-02-04T20:28:33.66Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/8d/6d7b016383b1f74dd93611b1c5078bbaddaca901553ab886dcda87cae365/botocore-1.42.30-py3-none-any.whl", hash = "sha256:97070a438cac92430bb7b65f8ebd7075224f4a289719da4ee293d22d1e98db02", size = 14566340, upload-time = "2026-01-16T20:37:10.94Z" }, + { url = "https://files.pythonhosted.org/packages/e6/51/aac7e419521d5519e13087a7198623655648c939822bd7f4bdc9ccbe07f9/botocore-1.42.42-py3-none-any.whl", hash = "sha256:1c9df5fc31e9073a9aa956271c4007d72f5d342cafca5f4154ea099bc6f83085", size = 14600186, upload-time = "2026-02-04T20:28:29.268Z" }, ] [[package]] @@ -908,28 +908,28 @@ [[package]] name = "ruff" -version = "0.14.13" +version = "0.14.14" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/50/0a/1914efb7903174b381ee2ffeebb4253e729de57f114e63595114c8ca451f/ruff-0.14.13.tar.gz", hash = "sha256:83cd6c0763190784b99650a20fec7633c59f6ebe41c5cc9d45ee42749563ad47", size = 6059504, upload-time = "2026-01-15T20:15:16.918Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2e/06/f71e3a86b2df0dfa2d2f72195941cd09b44f87711cb7fa5193732cb9a5fc/ruff-0.14.14.tar.gz", hash = "sha256:2d0f819c9a90205f3a867dbbd0be083bee9912e170fd7d9704cc8ae45824896b", size = 4515732, upload-time = "2026-01-22T22:30:17.527Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/ae/0deefbc65ca74b0ab1fd3917f94dc3b398233346a74b8bbb0a916a1a6bf6/ruff-0.14.13-py3-none-linux_armv6l.whl", hash = "sha256:76f62c62cd37c276cb03a275b198c7c15bd1d60c989f944db08a8c1c2dbec18b", size = 13062418, upload-time = "2026-01-15T20:14:50.779Z" }, - { url = "https://files.pythonhosted.org/packages/47/df/5916604faa530a97a3c154c62a81cb6b735c0cb05d1e26d5ad0f0c8ac48a/ruff-0.14.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:914a8023ece0528d5cc33f5a684f5f38199bbb566a04815c2c211d8f40b5d0ed", size = 13442344, upload-time = "2026-01-15T20:15:07.94Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f3/e0e694dd69163c3a1671e102aa574a50357536f18a33375050334d5cd517/ruff-0.14.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d24899478c35ebfa730597a4a775d430ad0d5631b8647a3ab368c29b7e7bd063", size = 12354720, upload-time = "2026-01-15T20:15:09.854Z" }, - { url = "https://files.pythonhosted.org/packages/c3/e8/67f5fcbbaee25e8fc3b56cc33e9892eca7ffe09f773c8e5907757a7e3bdb/ruff-0.14.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aaf3870f14d925bbaf18b8a2347ee0ae7d95a2e490e4d4aea6813ed15ebc80e", size = 12774493, upload-time = "2026-01-15T20:15:20.908Z" }, - { url = "https://files.pythonhosted.org/packages/6b/ce/d2e9cb510870b52a9565d885c0d7668cc050e30fa2c8ac3fb1fda15c083d/ruff-0.14.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac5b7f63dd3b27cc811850f5ffd8fff845b00ad70e60b043aabf8d6ecc304e09", size = 12815174, upload-time = "2026-01-15T20:15:05.74Z" }, - { url = "https://files.pythonhosted.org/packages/88/00/c38e5da58beebcf4fa32d0ddd993b63dfacefd02ab7922614231330845bf/ruff-0.14.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2b1097750d90ba82ce4ba676e85230a0ed694178ca5e61aa9b459970b3eb9", size = 13680909, upload-time = "2026-01-15T20:15:14.537Z" }, - { url = "https://files.pythonhosted.org/packages/61/61/cd37c9dd5bd0a3099ba79b2a5899ad417d8f3b04038810b0501a80814fd7/ruff-0.14.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7d0bf87705acbbcb8d4c24b2d77fbb73d40210a95c3903b443cd9e30824a5032", size = 15144215, upload-time = "2026-01-15T20:15:22.886Z" }, - { url = "https://files.pythonhosted.org/packages/56/8a/85502d7edbf98c2df7b8876f316c0157359165e16cdf98507c65c8d07d3d/ruff-0.14.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3eb5da8e2c9e9f13431032fdcbe7681de9ceda5835efee3269417c13f1fed5c", size = 14706067, upload-time = "2026-01-15T20:14:48.271Z" }, - { url = "https://files.pythonhosted.org/packages/7e/2f/de0df127feb2ee8c1e54354dc1179b4a23798f0866019528c938ba439aca/ruff-0.14.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:642442b42957093811cd8d2140dfadd19c7417030a7a68cf8d51fcdd5f217427", size = 14133916, upload-time = "2026-01-15T20:14:57.357Z" }, - { url = "https://files.pythonhosted.org/packages/0d/77/9b99686bb9fe07a757c82f6f95e555c7a47801a9305576a9c67e0a31d280/ruff-0.14.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4acdf009f32b46f6e8864af19cbf6841eaaed8638e65c8dac845aea0d703c841", size = 13859207, upload-time = "2026-01-15T20:14:55.111Z" }, - { url = "https://files.pythonhosted.org/packages/7d/46/2bdcb34a87a179a4d23022d818c1c236cb40e477faf0d7c9afb6813e5876/ruff-0.14.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:591a7f68860ea4e003917d19b5c4f5ac39ff558f162dc753a2c5de897fd5502c", size = 14043686, upload-time = "2026-01-15T20:14:52.841Z" }, - { url = "https://files.pythonhosted.org/packages/1a/a9/5c6a4f56a0512c691cf143371bcf60505ed0f0860f24a85da8bd123b2bf1/ruff-0.14.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:774c77e841cc6e046fc3e91623ce0903d1cd07e3a36b1a9fe79b81dab3de506b", size = 12663837, upload-time = "2026-01-15T20:15:18.921Z" }, - { url = "https://files.pythonhosted.org/packages/fe/bb/b920016ece7651fa7fcd335d9d199306665486694d4361547ccb19394c44/ruff-0.14.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:61f4e40077a1248436772bb6512db5fc4457fe4c49e7a94ea7c5088655dd21ae", size = 12805867, upload-time = "2026-01-15T20:14:59.272Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b3/0bd909851e5696cd21e32a8fc25727e5f58f1934b3596975503e6e85415c/ruff-0.14.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6d02f1428357fae9e98ac7aa94b7e966fd24151088510d32cf6f902d6c09235e", size = 13208528, upload-time = "2026-01-15T20:15:03.732Z" }, - { url = "https://files.pythonhosted.org/packages/3b/3b/e2d94cb613f6bbd5155a75cbe072813756363eba46a3f2177a1fcd0cd670/ruff-0.14.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e399341472ce15237be0c0ae5fbceca4b04cd9bebab1a2b2c979e015455d8f0c", size = 13929242, upload-time = "2026-01-15T20:15:11.918Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c5/abd840d4132fd51a12f594934af5eba1d5d27298a6f5b5d6c3be45301caf/ruff-0.14.13-py3-none-win32.whl", hash = "sha256:ef720f529aec113968b45dfdb838ac8934e519711da53a0456038a0efecbd680", size = 12919024, upload-time = "2026-01-15T20:14:43.647Z" }, - { url = "https://files.pythonhosted.org/packages/c2/55/6384b0b8ce731b6e2ade2b5449bf07c0e4c31e8a2e68ea65b3bafadcecc5/ruff-0.14.13-py3-none-win_amd64.whl", hash = "sha256:6070bd026e409734b9257e03e3ef18c6e1a216f0435c6751d7a8ec69cb59abef", size = 14097887, upload-time = "2026-01-15T20:15:01.48Z" }, - { url = "https://files.pythonhosted.org/packages/4d/e1/7348090988095e4e39560cfc2f7555b1b2a7357deba19167b600fdf5215d/ruff-0.14.13-py3-none-win_arm64.whl", hash = "sha256:7ab819e14f1ad9fe39f246cfcc435880ef7a9390d81a2b6ac7e01039083dd247", size = 13080224, upload-time = "2026-01-15T20:14:45.853Z" }, + { url = "https://files.pythonhosted.org/packages/d2/89/20a12e97bc6b9f9f68343952da08a8099c57237aef953a56b82711d55edd/ruff-0.14.14-py3-none-linux_armv6l.whl", hash = "sha256:7cfe36b56e8489dee8fbc777c61959f60ec0f1f11817e8f2415f429552846aed", size = 10467650, upload-time = "2026-01-22T22:30:08.578Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b1/c5de3fd2d5a831fcae21beda5e3589c0ba67eec8202e992388e4b17a6040/ruff-0.14.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6006a0082336e7920b9573ef8a7f52eec837add1265cc74e04ea8a4368cd704c", size = 10883245, upload-time = "2026-01-22T22:30:04.155Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7c/3c1db59a10e7490f8f6f8559d1db8636cbb13dccebf18686f4e3c9d7c772/ruff-0.14.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:026c1d25996818f0bf498636686199d9bd0d9d6341c9c2c3b62e2a0198b758de", size = 10231273, upload-time = "2026-01-22T22:30:34.642Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6e/5e0e0d9674be0f8581d1f5e0f0a04761203affce3232c1a1189d0e3b4dad/ruff-0.14.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f666445819d31210b71e0a6d1c01e24447a20b85458eea25a25fe8142210ae0e", size = 10585753, upload-time = "2026-01-22T22:30:31.781Z" }, + { url = "https://files.pythonhosted.org/packages/23/09/754ab09f46ff1884d422dc26d59ba18b4e5d355be147721bb2518aa2a014/ruff-0.14.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c0f18b922c6d2ff9a5e6c3ee16259adc513ca775bcf82c67ebab7cbd9da5bc8", size = 10286052, upload-time = "2026-01-22T22:30:24.827Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cc/e71f88dd2a12afb5f50733851729d6b571a7c3a35bfdb16c3035132675a0/ruff-0.14.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1629e67489c2dea43e8658c3dba659edbfd87361624b4040d1df04c9740ae906", size = 11043637, upload-time = "2026-01-22T22:30:13.239Z" }, + { url = "https://files.pythonhosted.org/packages/67/b2/397245026352494497dac935d7f00f1468c03a23a0c5db6ad8fc49ca3fb2/ruff-0.14.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:27493a2131ea0f899057d49d303e4292b2cae2bb57253c1ed1f256fbcd1da480", size = 12194761, upload-time = "2026-01-22T22:30:22.542Z" }, + { url = "https://files.pythonhosted.org/packages/5b/06/06ef271459f778323112c51b7587ce85230785cd64e91772034ddb88f200/ruff-0.14.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ff589aab3f5b539e35db38425da31a57521efd1e4ad1ae08fc34dbe30bd7df", size = 12005701, upload-time = "2026-01-22T22:30:20.499Z" }, + { url = "https://files.pythonhosted.org/packages/41/d6/99364514541cf811ccc5ac44362f88df66373e9fec1b9d1c4cc830593fe7/ruff-0.14.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc12d74eef0f29f51775f5b755913eb523546b88e2d733e1d701fe65144e89b", size = 11282455, upload-time = "2026-01-22T22:29:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/ca/71/37daa46f89475f8582b7762ecd2722492df26421714a33e72ccc9a84d7a5/ruff-0.14.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb8481604b7a9e75eff53772496201690ce2687067e038b3cc31aaf16aa0b974", size = 11215882, upload-time = "2026-01-22T22:29:57.032Z" }, + { url = "https://files.pythonhosted.org/packages/2c/10/a31f86169ec91c0705e618443ee74ede0bdd94da0a57b28e72db68b2dbac/ruff-0.14.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:14649acb1cf7b5d2d283ebd2f58d56b75836ed8c6f329664fa91cdea19e76e66", size = 11180549, upload-time = "2026-01-22T22:30:27.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/1e/c723f20536b5163adf79bdd10c5f093414293cdf567eed9bdb7b83940f3f/ruff-0.14.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e8058d2145566510790eab4e2fad186002e288dec5e0d343a92fe7b0bc1b3e13", size = 10543416, upload-time = "2026-01-22T22:30:01.964Z" }, + { url = "https://files.pythonhosted.org/packages/3e/34/8a84cea7e42c2d94ba5bde1d7a4fae164d6318f13f933d92da6d7c2041ff/ruff-0.14.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e651e977a79e4c758eb807f0481d673a67ffe53cfa92209781dfa3a996cf8412", size = 10285491, upload-time = "2026-01-22T22:30:29.51Z" }, + { url = "https://files.pythonhosted.org/packages/55/ef/b7c5ea0be82518906c978e365e56a77f8de7678c8bb6651ccfbdc178c29f/ruff-0.14.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:cc8b22da8d9d6fdd844a68ae937e2a0adf9b16514e9a97cc60355e2d4b219fc3", size = 10733525, upload-time = "2026-01-22T22:30:06.499Z" }, + { url = "https://files.pythonhosted.org/packages/6a/5b/aaf1dfbcc53a2811f6cc0a1759de24e4b03e02ba8762daabd9b6bd8c59e3/ruff-0.14.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:16bc890fb4cc9781bb05beb5ab4cd51be9e7cb376bf1dd3580512b24eb3fda2b", size = 11315626, upload-time = "2026-01-22T22:30:36.848Z" }, + { url = "https://files.pythonhosted.org/packages/2c/aa/9f89c719c467dfaf8ad799b9bae0df494513fb21d31a6059cb5870e57e74/ruff-0.14.14-py3-none-win32.whl", hash = "sha256:b530c191970b143375b6a68e6f743800b2b786bbcf03a7965b06c4bf04568167", size = 10502442, upload-time = "2026-01-22T22:30:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/87/44/90fa543014c45560cae1fffc63ea059fb3575ee6e1cb654562197e5d16fb/ruff-0.14.14-py3-none-win_amd64.whl", hash = "sha256:3dde1435e6b6fe5b66506c1dff67a421d0b7f6488d466f651c07f4cab3bf20fd", size = 11630486, upload-time = "2026-01-22T22:30:10.852Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6a/40fee331a52339926a92e17ae748827270b288a35ef4a15c9c8f2ec54715/ruff-0.14.14-py3-none-win_arm64.whl", hash = "sha256:56e6981a98b13a32236a72a8da421d7839221fa308b223b9283312312e5ac76c", size = 10920448, upload-time = "2026-01-22T22:30:15.417Z" }, ] [[package]] @@ -1091,7 +1091,7 @@ [[package]] name = "uv-dynamic-versioning" -version = "0.12.0" +version = "0.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dunamai" }, @@ -1099,9 +1099,9 @@ { name = "jinja2" }, { name = "tomlkit" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/ae/66c95eca70db2a0d01212f05c6cb589e0668532daad10bbbf434f82ccfe7/uv_dynamic_versioning-0.12.0.tar.gz", hash = "sha256:e853e0c5b2425a68005580325d4975a8c37b66015589ca45ef96e660fe0f8f16", size = 41499, upload-time = "2025-12-14T00:47:40.774Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/b7/46e3106071b85016237f6de589e99f614565d10a16af17b374d003272076/uv_dynamic_versioning-0.13.0.tar.gz", hash = "sha256:3220cbf10987d862d78e9931957782a274fa438d33efb1fa26b8155353749e06", size = 38797, upload-time = "2026-01-19T09:45:33.366Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/8b/1dace94e7786f40e5cbcebb3a43365832798e497bbbb7281557cef72cb4c/uv_dynamic_versioning-0.12.0-py3-none-any.whl", hash = "sha256:2d2f1fb806c2e351d0d0a3840aaf7b3c6ce73757080b1ada4ac5dc44f7dd4c9e", size = 11477, upload-time = "2025-12-14T00:47:39.305Z" }, + { url = "https://files.pythonhosted.org/packages/28/4f/15d9ec8aaed4a78aca1b8f0368f0cdd3cca8a04a81edbf03bc9e12c1a188/uv_dynamic_versioning-0.13.0-py3-none-any.whl", hash = "sha256:86d37b89fa2b6836a515301f74ea2d56a1bc59a46a74d66a24c869d1fc8f7585", size = 11480, upload-time = "2026-01-19T09:45:32.002Z" }, ] [[package]] @@ -1189,7 +1189,7 @@ [[package]] name = "yardstick" -version = "0.15.0" +version = "0.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1207,9 +1207,9 @@ { name = "xxhash" }, { name = "zstandard" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e4/6b/3c3884d01e0c5a8c288e2effe840967ce38668ae30b30e8c9d97a75b5a30/yardstick-0.15.0.tar.gz", hash = "sha256:980e205f93a495db6f233062491eb974b3d0d3d0a766e9a70c15abd99db12192", size = 149600, upload-time = "2025-10-23T20:51:57.365Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/48/cf4e4e9ccc2d6195e5a5b9ff218de8694ce39b5844aadc8e97fb94e24634/yardstick-0.16.0.tar.gz", hash = "sha256:ffa894be5f39a5c746f7c3fe1bf86186f00e03565b3734b9cbd6b6a32f276018", size = 181740, upload-time = "2026-01-26T21:22:52.711Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/f0/82c2ba7953eb72f82a91aa6db35cccd35fdcdedc1529a4d754bc63cfd909/yardstick-0.15.0-py3-none-any.whl", hash = "sha256:b60433e9cba8f0a82d8b533a42d6e63bf822899561c7e974e23ba44fd7d10457", size = 94886, upload-time = "2025-10-23T20:51:55.93Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f4/14a0f44365050169f3100e19ca4a17f0aa0ef03b5a6458b580ad57001f7e/yardstick-0.16.0-py3-none-any.whl", hash = "sha256:2fffeb11af224f95ea39736931158317bb34ec4e72903749c6568f17b26d731f", size = 105772, upload-time = "2026-01-26T21:22:53.852Z" }, ] [[package]] ++++++ grype-db.obsinfo ++++++ --- /var/tmp/diff_new_pack.9weiQt/_old 2026-02-09 15:35:24.400799412 +0100 +++ /var/tmp/diff_new_pack.9weiQt/_new 2026-02-09 15:35:24.420800253 +0100 @@ -1,5 +1,5 @@ name: grype-db -version: 0.50.0 -mtime: 1769727960 -commit: ebc5f8151645415711407e8edc248df8c89d5195 +version: 0.51.0 +mtime: 1770382382 +commit: 013670be3fbdc9eea9e85f19c549aa48f8320e55 ++++++ vendor.tar.gz ++++++ /work/SRC/openSUSE:Factory/grype-db/vendor.tar.gz /work/SRC/openSUSE:Factory/.grype-db.new.1670/vendor.tar.gz differ: char 132, line 1
