Full Code of quay/clair for AI

main bab68a8c624c cached
334 files
1.3 MB
421.0k tokens
684 symbols
1 requests
Download .txt
Showing preview only (1,470K chars total). Download the full file or copy to clipboard to get everything.
Repository: quay/clair
Branch: main
Commit: bab68a8c624c
Files: 334
Total size: 1.3 MB

Directory structure:
gitextract_yglcs5c1/

├── .chglog/
│   ├── CHANGELOG.tpl.md
│   └── config.yml
├── .clang-format
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── actions/
│   │   ├── documentation/
│   │   │   └── action.yml
│   │   ├── go-cache/
│   │   │   └── action.yml
│   │   ├── go-tidy/
│   │   │   └── action.yml
│   │   └── set-image-expiration/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── issue-close-app.yml
│   ├── script/
│   │   └── nightly-module.sh
│   └── workflows/
│       ├── .gitignore
│       ├── .yamllint
│       ├── Makefile
│       ├── check-fast-forward.yml
│       ├── config-ci.yml
│       ├── cut-release.yml
│       ├── documentation.yml
│       ├── fast-forward.yml
│       ├── main.yml
│       ├── nightly-ci.yml
│       ├── nightly.yml
│       ├── prepare-release.yml
│       ├── tests.yml
│       └── v2-issues.yml
├── .gitignore
├── CHANGELOG.md
├── CODEOWNERS
├── DCO
├── Dockerfile
├── Documentation/
│   ├── SUMMARY.md
│   ├── concepts/
│   │   ├── api_internal.md
│   │   ├── authentication.md
│   │   ├── indexing.md
│   │   ├── matching.md
│   │   ├── notifications.md
│   │   ├── operation.md
│   │   └── updatersandairgap.md
│   ├── concepts.md
│   ├── contribution/
│   │   ├── building.md
│   │   ├── commit_style.md
│   │   ├── openapi.md
│   │   └── releases.md
│   ├── contribution.md
│   ├── howto/
│   │   ├── api.md
│   │   ├── deployment.md
│   │   ├── getting_started.md
│   │   └── testing.md
│   ├── howto.md
│   ├── listing_test.go
│   ├── reference/
│   │   ├── api.md
│   │   ├── clairctl.md
│   │   ├── config.md
│   │   ├── indexer.md
│   │   ├── matcher.md
│   │   ├── metrics.md
│   │   └── notifier.md
│   ├── reference.md
│   ├── reference_test.go
│   └── whatis.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── ROADMAP.md
├── book.toml
├── clair-error/
│   ├── errors.go
│   └── notifications.go
├── cmd/
│   ├── build.go
│   ├── clair/
│   │   ├── main.go
│   │   ├── os_other.go
│   │   └── os_unix.go
│   ├── config.go
│   ├── config_test.go
│   └── testdata/
│       ├── ComplexJSON/
│       │   ├── config.json
│       │   ├── config.json.d/
│       │   │   └── dropin.json
│       │   └── want.json
│       ├── ComplexYAML/
│       │   ├── config.yaml
│       │   ├── config.yaml.d/
│       │   │   ├── dropin.yaml
│       │   │   ├── empty.yaml
│       │   │   ├── ignored.json-patch
│       │   │   ├── later.yaml
│       │   │   └── updater.yaml-patch
│       │   └── want.json
│       ├── Error/
│       │   ├── BadKind.toml
│       │   ├── BadPatch.json
│       │   ├── BadPatch.json.d/
│       │   │   ├── decode.json-patch
│       │   │   └── invalid.json-patch
│       │   ├── Indents.yaml
│       │   ├── NotAnArray.json
│       │   ├── NotAnArray.json.d/
│       │   │   └── badpatch.json-patch
│       │   ├── NotAnObject.json
│       │   ├── NotYAML.yaml
│       │   └── TooShort.json
│       ├── SimpleJSON/
│       │   ├── config.json
│       │   └── want.json
│       └── SimpleYAML/
│           ├── config.yaml
│           └── want.json
├── code-of-conduct.md
├── config/
│   ├── auth.go
│   ├── auth_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── database.go
│   ├── defaults.go
│   ├── doc.go
│   ├── enums.go
│   ├── enums_string.go
│   ├── enums_test.go
│   ├── go.mod
│   ├── go.sum
│   ├── indexer.go
│   ├── introspection.go
│   ├── lint.go
│   ├── lint_test.go
│   ├── matcher.go
│   ├── matchers.go
│   ├── notifier.go
│   ├── otlp.go
│   ├── otlpcompressor_string.go
│   ├── reflect.go
│   ├── tags_test.go
│   ├── tls.go
│   ├── updaters.go
│   └── validate.go
├── config.yaml.sample
├── contrib/
│   ├── cmd/
│   │   └── quaybackstop/
│   │       ├── Dockerfile
│   │       ├── clair.go
│   │       ├── main.go
│   │       ├── main_old.go
│   │       ├── quay.go
│   │       ├── sig_linux.go
│   │       └── sig_other.go
│   └── openshift/
│       ├── build_and_deploy.sh
│       ├── grafana/
│       │   ├── dashboard-clair.configmap.yaml.tpl
│       │   └── dashboards/
│       │       └── dashboard-clair.configmap.yaml
│       ├── manifests/
│       │   ├── backstop.yaml
│       │   ├── db-job.yaml
│       │   └── manifests.yaml
│       └── pr_check.sh
├── docker-compose.yaml
├── etc/
│   ├── .gitignore
│   ├── config.mk
│   ├── container.mk
│   ├── dev.mk
│   ├── dist.mk
│   └── doc.mk
├── go.mod
├── go.sum
├── health/
│   ├── readinesshandler.go
│   └── readinesshandler_test.go
├── httptransport/
│   ├── api/
│   │   ├── .gitattributes
│   │   ├── lib/
│   │   │   └── oapi.jq
│   │   ├── openapi.zsh
│   │   └── v1/
│   │       ├── examples/
│   │       │   ├── affected_manifests.json
│   │       │   ├── bulk_delete.json
│   │       │   ├── cpe.json
│   │       │   ├── digest.json
│   │       │   ├── distribution.json
│   │       │   ├── environment.json
│   │       │   ├── manifest.json
│   │       │   ├── notification_page.json
│   │       │   ├── package.json
│   │       │   ├── vulnerability.json
│   │       │   └── vulnerability_summary.json
│   │       ├── openapi.etag
│   │       ├── openapi.jq
│   │       ├── openapi.json
│   │       └── openapi.yaml
│   ├── auth.go
│   ├── auth_test.go
│   ├── client/
│   │   ├── httpclient.go
│   │   ├── indexer.go
│   │   ├── matcher.go
│   │   └── matcher_test.go
│   ├── common.go
│   ├── concurrentlimit.go
│   ├── concurrentlimit_test.go
│   ├── discoveryhandler.go
│   ├── discoveryhandler_test.go
│   ├── error.go
│   ├── error_test.go
│   ├── gone.go
│   ├── indexer_v1.go
│   ├── indexer_v1_test.go
│   ├── instrumentation.go
│   ├── instrumentation_test.go
│   ├── matcher_v1.go
│   ├── matcher_v1_test.go
│   ├── notification_v1.go
│   ├── notification_v1_test.go
│   ├── robotshandler.go
│   ├── robotshandler_test.go
│   ├── server.go
│   ├── server_test.go
│   └── types/
│       └── v1/
│           ├── affected_manifests.schema.json
│           ├── bulk_delete.schema.json
│           ├── cpe.schema.json
│           ├── digest.schema.json
│           ├── distribution.schema.json
│           ├── environment.schema.json
│           ├── error.schema.json
│           ├── index_report.schema.json
│           ├── index_state.schema.json
│           ├── layer.schema.json
│           ├── manifest.schema.json
│           ├── normalized_severity.schema.json
│           ├── notification.schema.json
│           ├── notification_page.schema.json
│           ├── notification_webhook.schema.json
│           ├── package.schema.json
│           ├── range.schema.json
│           ├── repository.schema.json
│           ├── types.go
│           ├── update_diff.schema.json
│           ├── update_operation.schema.json
│           ├── update_operations.schema.json
│           ├── vulnerability.schema.json
│           ├── vulnerability_core.schema.json
│           ├── vulnerability_report.schema.json
│           ├── vulnerability_summaries.schema.json
│           └── vulnerability_summary.schema.json
├── indexer/
│   ├── mock.go
│   └── service.go
├── initialize/
│   ├── auto/
│   │   ├── auto.go
│   │   ├── auto_test.go
│   │   ├── cpu.go
│   │   ├── cpu_linux.go
│   │   ├── cpu_linux_test.go
│   │   ├── memory.go
│   │   ├── memory_linux.go
│   │   ├── memory_linux_test.go
│   │   └── profiling.go
│   ├── logging.go
│   └── services.go
├── internal/
│   ├── codec/
│   │   ├── codec.go
│   │   ├── codec_test.go
│   │   └── reader.go
│   ├── httputil/
│   │   ├── client.go
│   │   ├── client_test.go
│   │   ├── ratelimiter.go
│   │   ├── ratelimiter_test.go
│   │   ├── responserecorder.go
│   │   ├── responserecorder_test.go
│   │   └── signer.go
│   └── logging/
│       └── logging.go
├── introspection/
│   ├── otlp.go
│   └── server.go
├── local-dev/
│   ├── clair/
│   │   ├── .gitignore
│   │   ├── config.yaml
│   │   ├── config.yaml.d/
│   │   │   └── .gitignore
│   │   ├── init.sql
│   │   └── quay.yaml.d/
│   │       └── .gitignore
│   ├── grafana/
│   │   └── provisioning/
│   │       ├── dashboards/
│   │       │   ├── clair.json
│   │       │   ├── dashboard.yml
│   │       │   └── database.json
│   │       └── datasources/
│   │           └── datasource.yml
│   ├── pgadmin/
│   │   ├── passfile.txt
│   │   └── servers.json
│   ├── prometheus/
│   │   └── prometheus.yml
│   ├── pyroscope/
│   │   └── server.yml
│   ├── quay/
│   │   └── config.yaml
│   └── traefik/
│       ├── config/
│       │   ├── clair.yaml
│       │   ├── dashboard.yaml
│       │   ├── grafana.yaml
│       │   ├── jaeger.yaml
│       │   ├── pgadmin.yaml
│       │   ├── postgresql.yaml
│       │   ├── prom.yaml
│       │   ├── pyroscope.yaml
│       │   ├── quay.yaml
│       │   └── rabbitmq.yaml
│       └── traefik.yaml
├── matcher/
│   ├── mock.go
│   └── service.go
├── middleware/
│   ├── auth/
│   │   ├── handler.go
│   │   ├── httpauth_psk.go
│   │   └── httpauth_psk_test.go
│   └── compress/
│       ├── handler.go
│       └── handler_test.go
└── notifier/
    ├── amqp/
    │   ├── deliverer.go
    │   ├── deliverer_integration_test.go
    │   ├── directdeliverer.go
    │   ├── directdeliverer_integration_test.go
    │   ├── doc.go
    │   └── failover.go
    ├── callback.go
    ├── callback_test.go
    ├── deliverer.go
    ├── delivery.go
    ├── locker.go
    ├── migrations/
    │   ├── 01-init.sql
    │   ├── 02-constraints.sql
    │   ├── 03-constraints.sql
    │   ├── 04-drop-key.sql
    │   └── migrations.go
    ├── mockstore.go
    ├── notification.go
    ├── notificationhandle.go
    ├── pager.go
    ├── poller.go
    ├── postgres/
    │   ├── e2e_test.go
    │   ├── get_status.go
    │   ├── notifications.go
    │   ├── notifications_test.go
    │   ├── pagination_test.go
    │   ├── postgres_test.go
    │   ├── receipt.go
    │   ├── set_status.go
    │   ├── store.go
    │   ├── store_test.go
    │   └── testdata/
    │       └── .gitignore
    ├── processor.go
    ├── processor_create_test.go
    ├── processor_safe_test.go
    ├── receipt.go
    ├── service/
    │   ├── mock.go
    │   ├── notifier.go
    │   └── testmode.go
    ├── service.go
    ├── stomp/
    │   ├── deliverer.go
    │   ├── directdeliverer.go
    │   ├── doc.go
    │   ├── failover.go
    │   └── integration_test.go
    ├── store.go
    ├── summary_test.go
    ├── vulnsummary.go
    └── webhook/
        ├── cmd/
        │   └── webhookd/
        │       └── main.go
        ├── deliverer.go
        └── deliverer_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .chglog/CHANGELOG.tpl.md
================================================
{{ if .Versions -}}
<a name="unreleased"></a>
## [Unreleased]

{{ if .Unreleased.CommitGroups -}}
{{ range .Unreleased.CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- [{{.Hash.Short}}]({{ $.Info.RepositoryURL  }}/commit/{{ .Hash.Long }}): {{ .Subject }}
{{ if .Refs -}}{{ range .Refs }} -{{if .Action}}{{ .Action }} {{ end }} [#{{ .Ref }}]({{ $.Info.RepositoryURL  }}/issues/{{ .Ref }}){{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}

{{ range .Versions }}
<a name="{{ .Tag.Name }}"></a>
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]{{ else }}{{ .Tag.Name }}{{ end }} - {{ datetime "2006-01-02" .Tag.Date }}
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- [{{.Hash.Short}}]({{ $.Info.RepositoryURL  }}/commit/{{ .Hash.Long }}): {{ .Subject }}
{{ if .Refs -}}{{ range .Refs }} - {{if .Action}}{{ .Action }}{{ end }} [#{{ .Ref }}]({{ $.Info.RepositoryURL  }}/issues/{{ .Ref }}){{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}

{{- if .RevertCommits -}}
### Reverts
{{ range .RevertCommits -}}
- {{ .Revert.Header }}
{{ end }}
{{ end -}}

{{- if .MergeCommits -}}
### Pull Requests
{{ range .MergeCommits -}}
- {{ .Header }}
{{ end }}
{{ end -}}

{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

{{- if .Versions }}
[Unreleased]: {{ .Info.RepositoryURL }}/compare/{{ $latest := index .Versions 0 }}{{ $latest.Tag.Name }}...HEAD
{{ range .Versions -}}
{{ if .Tag.Previous -}}
[{{ .Tag.Name }}]: {{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}
{{ end -}}
{{ end -}}
{{ end -}}
{{ end -}}


================================================
FILE: .chglog/config.yml
================================================
style: github
template: CHANGELOG.tpl.md
info:
  title: CHANGELOG
  repository_url: https://github.com/quay/clair
options:
  tag_filter_pattern: '^v'
  sort: semver
  commits:
    sort_by: Scope
  commit_groups:
    group_by: Scope
  header:
    pattern: '^(.*?):\s*(.*)$'
    pattern_maps:
      - Scope
      - Subject
  issues:
    prefix: 
      - "#"

  refs:
    actions:
      - Closes
      - Fixes
      - PullRequest

  notes:
    keywords:
      - BREAKING CHANGE
      - NOTE


================================================
FILE: .clang-format
================================================
---
Language:        Proto
BasedOnStyle:    Google
...



================================================
FILE: .dockerignore
================================================
# Files
DCO
.dockerignore
LICENSE
*.md
NOTICE
*.oci
*.tar*
/clairctl-*
!testdata/**
# Directories
/book
/contrib
!/contrib/cmd
/Documenatation
/etc
/local-dev
/.github
# Allow `.git` to get sent for build vcs stamping.


================================================
FILE: .gitattributes
================================================
cmd/build.go export-subst
*.go diff=golang
Documentation/reference/api.md linguist-generated


================================================
FILE: .github/CONTRIBUTING.md
================================================
# How to Contribute

Clair is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub pull requests.
This document outlines some of the conventions on development workflow, commit message formatting, contact points and other resources to make it easier to get your contribution accepted.

# Certificate of Origin

By contributing to this project you agree to the Developer Certificate of Origin [DCO](../DCO).
This document was created by the Linux Kernel community and is a simple statement that you, as a contributor, have the legal right to make the contribution.
See the [DCO](../DCO) file for details.

# Email and Chat

The project currently uses a mailing list and IRC channel:

- Email: [clair-dev@googlegroups.com](https://groups.google.com/forum/#!forum/clair-dev)
- IRC: #[clair](irc://irc.freenode.org:6667/#clair) IRC channel on freenode.org

Please avoid emailing maintainers directly.
They are very busy and read the mailing lists.

## Getting Started

- Fork the repository on GitHub
- Read the [README](../README.md) for build and test instructions
- Play with the project, submit bugs, submit patches!

## Contribution Flow

This is a rough outline of what a contributor's workflow looks like:

- Create a topic branch from where you want to base your work (usually main).
- Make commits of logical units.
- Make sure your commit messages are in the proper format (see below).
- Push your changes to a topic branch in your fork of the repository.
- Make sure the tests pass, and add any new tests as appropriate.
- Submit a pull request to the original repository.

Thanks for your contributions!

### Format of the Commit Message

We follow a rough convention for commit messages that is designed to answer two questions: what changed and why.
The subject line should feature the what and the body of the commit should describe the why.

```
scripts: add the test-cluster command

this uses tmux to setup a test cluster that you can easily kill and
start for debugging.

Fixes #38
```

The format can be described more formally as follows:

```
<subsystem>: <what changed>
<BLANK LINE>
<why this change was made>
<BLANK LINE>
<footer>
```

The first line is the subject and should be no longer than 70 characters, the second line is always blank, and other lines should be wrapped at 80 characters.
This allows the message to be easier to read on GitHub as well as in various git tools.


================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
<!--

Project discussion and other meta topics should be discussed on the mailing
list or in the discussions section.

GitHub issues are ONLY for bugs and features for the Clair API.
Please first create an issue on your client's repository before opening one here.

Are you using a development build of Clair?
Your problem might be solved by switching to a stable release.

-->

### Description of Problem / Feature Request

<!--- your content here --->

### Expected Outcome

<!--- your content here --->

### Actual Outcome

<!--- your content here --->
<!-- Please attach or paste logs from both clair and clairctl. -->

### Environment

<!--

Issues that do not contain the Environment section are AUTOMATICALLY CLOSED.
If you're making a feature request, please specify "N/A" under the environment section.

Please note that issues against Clair v2 will be closed automatically unless
someone has volunteered to work on it.
-->

- Clair version/image: 
- Clair client name/version: 
- Host OS: 
- Kernel (e.g. `uname -a`): 
- Kubernetes version (use `kubectl version`): 
- Network/Firewall setup: 


================================================
FILE: .github/actions/documentation/action.yml
================================================
name: 'Documentation'
description: 'build with mdBook and optionally push'
inputs:
  publish:
    description: 'push resulting files to gh-pages'
    default: 'true'
  token:
    description: 'github token'
    default: ${{ github.token }}
runs:
  using: 'composite'
  steps:
    - uses: peaceiris/actions-mdbook@v1
      with:
        mdbook-version: 'latest'
    - shell: sh
      run: |
        d="$(echo "${GITHUB_REF#refs/tags/}" | sed '/^refs\/heads\//d')"
        if test -z "$d"; then
          exec mdbook build
        else
          exec mdbook build --dest-dir "./book/${d}"
        fi
    - if: ${{ inputs.publish == 'true' }}
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: ${{ inputs.token }}
        publish_dir: ./book
        keep_files: true


================================================
FILE: .github/actions/go-cache/action.yml
================================================
name: 'Go cache'
description: 'cache go modules, and build artifacts'
inputs:
  go:
    description: 'Go version to use'
runs:
  using: 'composite'
  steps:
    - uses: actions/cache@v4
      with:
        path: |
          ~/.cache/go-build
          ~/go/pkg/mod
        key: ${{ runner.os }}-go${{ inputs.go }}-${{ hashFiles('**/go.sum') }}
        restore-keys: |
          ${{ runner.os }}-go${{ inputs.go }}
    - shell: bash
      run: |
        find . -name go.mod -type f -printf '%h\n' | while read dir; do
          cd "$dir"
          go mod download
        done


================================================
FILE: .github/actions/go-tidy/action.yml
================================================
name: 'Go tidy'
description: 'check that all modules are tidy-clean'
inputs:
  go:
    description: 'Go version to use'
  dir:
    description: 'module root directory'
    default: '.'
runs:
  using: 'composite'
  steps:
    - uses: ./.github/actions/go-cache
      with:
        go: ${{ inputs.go }}
    - run: |
        cd "${{ inputs.dir }}"
        go mod tidy
        git diff --exit-code
      shell: bash


================================================
FILE: .github/actions/set-image-expiration/action.yml
================================================
name: 'Set Image Expiration'
description: 'Use the Quay API to set an expiration time on an image'
inputs:
  quay:
    description: 'Quay instance to issue calls to.'
    required: false
    default: 'quay.io'
  duration:
    description: 'Duration (in seconds) into the future to expire the image.'
    required: false
    default: '1209600'
  repo:
    description: 'Namespace & repository'
    required: true
  tag:
    description: 'image tag'
    required: true
  token:
    description: 'API token'
    required: true
runs:
  using: 'composite'
  steps:
    - id: add-mask
      name: Add Mask
      shell: sh
      run: |
        printf '::add-mask::%s\n' "${{ inputs.token }}"
    - id: write-script
      name: Prepare Request
      shell: sh
      run: |
        jq -n -c --argjson e "$(($(date -u +%s) + ${{ inputs.duration }}))" '{expiration: $e}' > "${RUNNER_TEMP}/expiration.json"
        cat <<. >"${RUNNER_TEMP}/run"
        #!/usr/bin/env -S curl -K
        silent
        show-error
        fail-with-body
        data-binary="@${RUNNER_TEMP}/expiration.json"
        header="Authorization: Bearer ${{ inputs.token }}"
        header="Content-Type: application/json"
        header="Accept: application/json"
        request=PUT
        url="https://${{ inputs.quay }}/api/v1/repository/${{ inputs.repo }}/tag/${{ inputs.tag }}"
        .
        chmod +x "${RUNNER_TEMP}/run"
    - id: call
      name: Execute Request
      shell: sh
      run: '${RUNNER_TEMP}/run'


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "gomod"
    directory: "/"
    allow:
      - dependency-type: "direct"
    schedule:
      interval: "weekly"
    commit-message:
      prefix: "chore"
      include: "scope"
    groups:
      otel:
        patterns:
          - "go.opentelemetry.io/otel/*"
      golang-x:
        patterns:
          - "golang.org/x/*"
  - package-ecosystem: "gomod"
    directory: "/config"
    allow:
      - dependency-type: "direct"
    schedule:
      interval: "weekly"
    commit-message:
      prefix: "chore"
      include: "scope"
    groups:
      otel:
        patterns:
          - "go.opentelemetry.io/otel/*"
      golang-x:
        patterns:
          - "golang.org/x/*"


================================================
FILE: .github/issue-close-app.yml
================================================
comment: "This issue is closed because it does not meet our issue template. Please read it."
issueConfigs:
- content:
  - "### Environment"


================================================
FILE: .github/script/nightly-module.sh
================================================
#!/bin/sh
set -e
: "${CLAIRCORE_BRANCH:=main}"
cd "$(git rev-parse --show-toplevel)"
test -d vendor && rm -rf vendor

echo "::group::Edits"
go mod edit \
	"-replace=github.com/quay/claircore=github.com/quay/claircore@${CLAIRCORE_BRANCH}"
go mod tidy
go mod download # Shouldn't be needed, but just to be safe...
echo "::endgroup::"

clair_version="$(git describe --tags --always --dirty --match 'v4.*')"
echo "clair_version=${clair_version}" >> "$GITHUB_OUTPUT"

cat <<. >>"$GITHUB_STEP_SUMMARY"
### Changes

- **Go version:** $(go version)
- **Clair version:** ${clair_version}
.
{
	echo '```patch'
	git diff
	echo '```' 
} >>"$GITHUB_STEP_SUMMARY"


================================================
FILE: .github/workflows/.gitignore
================================================
yq
yajsv
*.json-schema


================================================
FILE: .github/workflows/.yamllint
================================================
---
extends: default
rules:
  line-length: false
  truthy:
    check-keys: false


================================================
FILE: .github/workflows/Makefile
================================================
check: github-workflow.json-schema yajsv yq
	for f in *.yml; do ./yq -o json "$$f" > "$${f%yml}json"; done
	./yajsv -s $< *.json
	rm *.json
	command -v yamllint >/dev/null 2>&1 && yamllint .

clean:
	rm -rf yq yajsv github-workflow.json-schema

.PHONY: check clean

yq:
	cd /tmp && GOBIN=$(PWD) go install github.com/mikefarah/yq/v4@latest

yajsv:
	cd /tmp && GOBIN=$(PWD) go install github.com/neilpa/yajsv@latest

github-workflow.json-schema:
	curl -sSLf https://github.com/SchemaStore/schemastore/raw/master/src/schemas/json/github-workflow.json > $@


================================================
FILE: .github/workflows/check-fast-forward.yml
================================================
---
name: Check Fast Forward
on:
  pull_request:
    types: [opened, reopened, synchronize]
jobs:
  check-fast-forward:
    runs-on: ubuntu-latest

    permissions:
      contents: read
      # We appear to need write permission for both pull-requests and
      # issues in order to post a comment to a pull request.
      pull-requests: write
      issues: write

    steps:
      - name: Checking if fast forwarding is possible
        uses: sequoia-pgp/fast-forward@v1
        with:
          merge: false
          comment: on-error


================================================
FILE: .github/workflows/config-ci.yml
================================================
---
name: Config module CI

on:
  push:
    paths:
      - config/**
    branches:
      - main
      - release-4.*
  pull_request:
    paths:
      - config/**
    branches:
      - main
      - release-4.*

jobs:
  commit-check:
    name: Commit Check
    runs-on: ubuntu-latest
    steps:
      - name: Commit Check
        uses: gsactions/commit-message-checker@v2
        with:
          pattern: |
            ^[^:!]+: .+\n\n.*$
          error: 'Commit must begin with <scope>: <subject>'
          flags: 'gm'
          excludeTitle: true
          excludeDescription: true
          checkAllCommitMessages: true
          accessToken: ${{ secrets.GITHUB_TOKEN }}

  tidy:
    name: Tidy
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        id: checkout
        if: ${{ !cancelled() }}
        uses: actions/checkout@v6
      - name: Setup Go
        id: setupgo
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' }}
        uses: actions/setup-go@v6
        with:
          cache: false
          go-version-file: ./config/go.mod
      - name: Go Tidy
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' && steps.setupgo.conclusion == 'success' }}
        working-directory: ./config
        run: |
          trap 'echo "::error file=go.mod,title=Tidy Check::Commit would leave go.mod untidy"' ERR
          go mod tidy
          git diff --exit-code

  tests:
    name: Tests
    if: ${{ !cancelled() }}
    uses: ./.github/workflows/tests.yml
    with:
      cd: config
      package_expr: ./...
      qemu: false


================================================
FILE: .github/workflows/cut-release.yml
================================================
---
name: Release

on:
  push:
    tags:
      - v4.*
  workflow_dispatch: {}

jobs:
  config:
    name: Config
    runs-on: 'ubuntu-latest'
    strategy:
      matrix:
        image: ['quay.io/projectquay/golang:1.25']
    container:
      image: ${{ matrix.image }}
    outputs:
      version: ${{ steps.setup.outputs.version }}
      tar_prefix: ${{ steps.setup.outputs.tar_prefix }}
      is_prerelease: ${{ startsWith(github.ref, 'refs/tags/') && (contains(github.ref, 'alpha') || contains(github.ref, 'beta') || contains(github.ref, 'rc')) }}
      image_tag: ${{ steps.setup.outputs.image_tag }}
      image_repo: ${{ steps.setup.outputs.image_repo }}
      build_image: ${{ steps.setup.outputs.build_image }}
      build_go_version: ${{ steps.setup.outputs.build_go_version }}
      build_cache_key: ${{ steps.setup.outputs.cache_key }}
      chglog_version: ${{ '0.15.1' }}
    steps:
      - name: Setup
        id: setup
        run: |
          : "${tag:="$(basename "${GITHUB_REF}")"}"
          : "${repo:=$GITHUB_REPOSITORY}"
          test "${GITHUB_REPOSITORY_OWNER}" = quay && repo="projectquay/${GITHUB_REPOSITORY##*/}" ||:
          cat <<. >>"$GITHUB_OUTPUT"
          version=$tag
          tar_prefix=clair-${tag}/
          image_tag=${tag#v}
          image_repo=${repo}
          build_image=${{ matrix.image }}
          build_go_version=$(go version | cut -f 3 -d ' ' | sed 's/^go//;s/\.[0-9]\+$//')
          cache_key=$(go version | md5sum - | cut -f 1 -d ' ')
          .

  release-archive:
    name: Create Release Archive
    runs-on: 'ubuntu-latest'
    needs: [config]
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - uses: ./.github/actions/go-cache
        with:
          go: ${{ needs.config.outputs.build_go_version }}
      - name: Create Release Archive
        run: |
          # Fix the checkout action overwriting the tag: (see https://github.com/actions/checkout/issues/882)
          git fetch origin "+${GITHUB_REF}:${GITHUB_REF}"
          git archive --prefix '${{ needs.config.outputs.tar_prefix }}' -o clair.tar "${GITHUB_REF}"
          go mod vendor
          tar -rf clair.tar --transform 's,^,${{ needs.config.outputs.tar_prefix }},' vendor
          gzip clair.tar
          mv clair.tar.gz clair-${{ needs.config.outputs.version }}.tar.gz
      - name: Cache Changelog
        uses: actions/cache@v5
        id: chglog-cache
        if: github.event_name != 'workflow_dispatch'
        with:
          path: /usr/local/bin/git-chglog
          key: changelog-${{ needs.config.outputs.chglog_version }}
      - name: Fetch Changelog
        if: steps.chglog-cache.outputs.cache-hit != 'true' && github.event_name != 'workflow_dispatch'
        run: |
          cd "$RUNNER_TEMP"
          v="${{ needs.config.outputs.chglog_version }}"
          f="git-chglog_${v}_linux_amd64.tar.gz"
          curl -fsOSL "https://github.com/git-chglog/git-chglog/releases/download/v${v}/${f}"
          tar xvf "${f}"
          install git-chglog /usr/local/bin
      - name: Generate changelog
        shell: bash
        if: github.event_name != 'workflow_dispatch'
        run: |
          v="${{ needs.config.outputs.version }}"
          echo "creating change log for tag: ${v}"
          git-chglog "${v}" > changelog
      - name: Fake changelog
        if: github.event_name == 'workflow_dispatch'
        run: touch changelog
      - name: Upload Release Archive
        uses: actions/upload-artifact@v7
        with:
          name: clair-release
          path: |
            clair-${{ needs.config.outputs.version }}.tar.gz
            changelog
          if-no-files-found: error

  release-binaries:
    name: Create Release Binaries
    runs-on: 'ubuntu-latest'
    container: ${{ needs.config.outputs.build_image }}
    needs: [config, release-archive]
    strategy:
      matrix:
        goarch: ['arm64', 'amd64', '386', 'ppc64le', 's390x']
        goos: ['linux', 'windows', 'darwin']
        exclude:
          - goos: darwin
            goarch: '386'
          - goos: windows
            goarch: '386'
          - goos: windows
            goarch: 'ppc64le'
          - goos: darwin
            goarch: 'ppc64le'
          - goos: windows
            goarch: 's390x'
          - goos: darwin
            goarch: 's390x'
    env:
      GOOS: ${{matrix.goos}}
      GOARCH: ${{matrix.goarch}}
    steps:
      - name: Fetch Artifacts
        uses: actions/download-artifact@v7
        id: download
        with:
          name: clair-release
      - name: Unpack
        run: |
          tar -xz -f ${{steps.download.outputs.download-path}}/clair-${{ needs.config.outputs.version }}.tar.gz --strip-components=1
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ needs.config.outputs.build_go_version }}
      - name: Build
        # Build with path trimming, ELF debug stripping, and no VCS injection (should be done by the `git archive` process).
        run: |
          go build\
            -trimpath -ldflags="-s -w" -buildvcs=false\
            -o "clairctl-${{matrix.goos}}-${{matrix.goarch}}"\
            ./cmd/clairctl
      - name: Upload
        uses: actions/upload-artifact@v7
        with:
          name: clairctl-${{matrix.goos}}-${{matrix.goarch}}
          path: clairctl-${{matrix.goos}}-${{matrix.goarch}}
          if-no-files-found: error

  release:
    name: Release
    runs-on: 'ubuntu-latest'
    if: github.event_name == 'push'
    needs: [config, release-archive, release-binaries]
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
    steps:
      - name: Fetch Artifacts
        uses: actions/download-artifact@v7
        id: download
        with:
          name: clair-release
      - name: Create Release
        uses: ncipollo/release-action@v1
        id: create_release
        with:
          name: ${{ needs.config.outputs.version }} Release
          bodyFile: ${{steps.download.outputs.download-path}}/changelog
          prerelease: ${{ needs.config.outputs.is_prerelease }}
          artifacts: '${{steps.download.outputs.download-path}}/clair-*'

  publish-container:
    name: Publish Container
    runs-on: 'ubuntu-latest'
    needs: [config, release-archive, release]
    steps:
      - name: Fetch Artifacts
        uses: actions/download-artifact@v7
        id: download
        with:
          name: clair-release
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        with:
          platforms: all
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      - name: Login
        uses: docker/login-action@v3
        with:
          registry: quay.io
          username: ${{ secrets.QUAY_USER }}
          password: ${{ secrets.QUAY_TOKEN }}
      - name: Extract Release
        run: |
          mkdir "${{ runner.temp }}/build"
          tar -xz -f ${{steps.download.outputs.download-path}}/clair-${{ needs.config.outputs.version }}.tar.gz --strip-components=1 -C "${{ runner.temp }}/build"
      - name: Build Container
        uses: docker/build-push-action@v6
        with:
          cache-from: type=gha
          cache-to: type=gha,mode=max
          context: ${{ runner.temp }}/build
          platforms: linux/amd64,linux/arm64,linux/ppc64le,linux/s390x
          push: true
          tags: |
            quay.io/${{ needs.config.outputs.image_repo }}:${{ needs.config.outputs.image_tag }}
      - name: Checkout
        if: needs.config.outputs.is_prerelease == 'true'
        uses: actions/checkout@v6
      - name: Set Expiration
        if: needs.config.outputs.is_prerelease == 'true'
        uses: ./.github/actions/set-image-expiration
        with:
          repo: ${{ needs.config.outputs.image_repo }}
          tag: ${{ needs.config.outputs.image_tag }}
          token: ${{ secrets.QUAY_API_TOKEN }}

  publish-binaries:
    name: Publish Binaries
    runs-on: 'ubuntu-latest'
    needs: [release-archive, release]
    strategy:
      matrix:
        goarch: ['arm64', 'amd64', '386', 'ppc64le', 's390x']
        goos: ['linux', 'windows', 'darwin']
        exclude:
          - goos: darwin
            goarch: '386'
          - goos: windows
            goarch: '386'
          - goos: darwin
            goarch: ppc64le
          - goos: windows
            goarch: ppc64le
          - goos: windows
            goarch: 's390x'
          - goos: darwin
            goarch: 's390x'
    steps:
      - name: Fetch Artifacts
        uses: actions/download-artifact@v7
        id: download
        with:
          pattern: clairctl-*
          merge-multiple: true
      - name: Publish clairctl-${{matrix.goos}}-${{matrix.goarch}}
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.release.outputs.upload_url }}
          asset_path: ${{steps.download.outputs.download-path}}/clairctl-${{matrix.goos}}-${{matrix.goarch}}
          asset_name: clairctl-${{matrix.goos}}-${{matrix.goarch}}
          asset_content_type: application/octet-stream

  deploy-documentation:
    name: Deploy Documentation
    runs-on: ubuntu-latest
    needs: [release]
    steps:
      - uses: actions/checkout@v6
      - uses: ./.github/actions/documentation


================================================
FILE: .github/workflows/documentation.yml
================================================
---
name: Deploy Main Documentation

on:
  push:
    branches:
      - main
    paths:
      - 'Documentation/**'

jobs:
  deploy-documentation:
    name: Deploy Documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: ./.github/actions/documentation


================================================
FILE: .github/workflows/fast-forward.yml
================================================
---
name: Fast Forward
on:
  issue_comment:
    types: [created, edited]
  pull_request_review:
    types: [submitted]
jobs:
  fast-forward:
    # Only run if the comment or approval contains the /fast-forward command,
    # or if it was a dependabot PR.
    if: >-
      ${{
      ( github.event.issue.pull_request && contains(github.event.comment.body, '/fast-forward')) ||
      (
        github.event.review && github.event.review.state == 'approved' && (
          github.event.pull_request.user.url == 'https://api.github.com/users/dependabot%5Bbot%5D' ||
          contains(github.event.review.body, '/fast-forward')
        ))
      }}
    runs-on: ubuntu-latest

    permissions:
      contents: write
      pull-requests: write
      issues: write

    steps:
      - name: Fast forwarding
        uses: sequoia-pgp/fast-forward@v1
        with:
          merge: true
          comment: on-error


================================================
FILE: .github/workflows/main.yml
================================================
---
name: CI

on:
  push:
    branches:
      - main
      - release-4.*
  pull_request:
    branches:
      - main
      - release-4.*

jobs:
  lints:
    name: Lints
    runs-on: ubuntu-latest
    steps:
      - name: Commit Check
        uses: gsactions/commit-message-checker@v2
        with:
          pattern: |
            ^[^:!]+: .+\n\n.*$
          error: 'Commit must begin with <scope>: <subject>'
          flags: 'gm'
          excludeTitle: true
          excludeDescription: true
          checkAllCommitMessages: true
          accessToken: ${{ secrets.GITHUB_TOKEN }}
      - name: Checkout
        id: checkout
        if: ${{ !cancelled() }}
        uses: actions/checkout@v6
      - name: Check Filenames
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' }}
        run: | # Check for all the characters Windows hates.
          git ls-files -- ':/:*[<>:"|?*]*' | while read -r file; do
            printf '::error file=%s,title=Bad Filename::Disallowed character in file name\n' "$file"
          done
          exit $(git ls-files -- ':/:*[<>:"|?*]*' | wc -l)
      - name: Check Container Versions
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' }}
        run: |
          # awk ...
          version=$(sed -n '/^go /{s/go \(1\.[0-9]\+\)\.[0-9]\+/\1/;p;q}' go.mod)
          {
            find . -name Dockerfile |
              xargs awk -v "want=$version" '/^ARG GO_VERSION/{split($2,ver,/=/);if(ver[2]!=want) printf "%s\t%d\n", FILENAME, FNR}'
            awk -v "want=$version" '/&go-image/{split($3,ref,/:/);if(ref[2]!=want) printf "%s\t%d\n", FILENAME, FNR}' docker-compose.yaml
          } |
            awk -v "want=$version" '{printf "::error file=%s,line=%d,title=Go Version Skew::Go version does not match `go.mod`: want %s\n", $1, $2, want}'
      - name: Setup Go
        id: 'setupgo'
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' }}
        uses: actions/setup-go@v6
        with:
          cache: false
          go-version-file: ./go.mod
      - name: Go Tidy
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' && steps.setupgo.conclusion == 'success' }}
        run: |
          # go mod tidy
          trap 'echo "::error file=go.mod,title=Tidy Check::Commit would leave go.mod untidy"' ERR
          go mod tidy
          git diff --exit-code

  documentation:
    name: Documentation
    needs: ['lints']
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v6
      - uses: ./.github/actions/documentation
        with:
          publish: false

  tests:
    name: Tests
    needs: ['lints']
    uses: ./.github/workflows/tests.yml
    with:
      package_expr: ./...
      qemu: false


================================================
FILE: .github/workflows/nightly-ci.yml
================================================
---
name: Nightly CI

on:
  schedule:
    - cron: '30 4 * * *'
  workflow_dispatch:
    inputs:
      package_expr:
        required: false
        type: string
        description: 'Package expression(s) passed to `go test`'

jobs:
  defaults:
    name: Check Input
    runs-on: ubuntu-latest
    outputs:
      package_expr: ${{ steps.config.outputs.package_expr }}
    steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v6
      - name: Make package expressions
        id: config
        if: ${{ !cancelled() && steps.checkout.conclusion == 'success' }}
        run: |
          if test -n "${{ inputs.package_expr }}"; then
            printf 'package_expr=%s\n' '${{ inputs.package_expr }}' >> "$GITHUB_OUTPUT"
          else
            printf 'package_expr=%s\n' "$(go list -m github.com/quay/clair{core,}/... | awk '{printf("%s/... ",$1)}')" >> "$GITHUB_OUTPUT"
          fi

  tests:
    name: Tests
    needs: ['defaults']
    uses: ./.github/workflows/tests.yml
    with:
      package_expr: ${{ needs.defaults.outputs.package_expr }}
      qemu: true


================================================
FILE: .github/workflows/nightly.yml
================================================
---
name: Nightly

on:
  workflow_dispatch:
    inputs:
      branch:
        description: 'Claircore branch to reference'
        required: false
      tag:
        description: 'Tag to push resulting image to'
        required: false
  schedule:
    - cron: '30 5 * * *'

jobs:
  build:
    name: Build and Push container
    runs-on: 'ubuntu-latest'
    steps:
      - name: Setup
        id: setup
        env:
          QUAY_TOKEN: ${{ secrets.QUAY_TOKEN }}
          QUAY_API_TOKEN: ${{ secrets.QUAY_API_TOKEN }}
        # This step uses defaults written in the shell script instead of the
        # nicer workflow inputs so that the cron trigger works.
        run: |
          br=$(test -n "${{github.event.inputs.branch}}" && echo "${{github.event.inputs.branch}}" || echo main)
          : "${repo:=$GITHUB_REPOSITORY}"
          test "${repo%%/*}" = quay && repo="projectquay/${repo##*/}" ||:
          cat <<. >>$GITHUB_OUTPUT
          push=${{ env.QUAY_TOKEN != '' }}
          api=${{ env.QUAY_API_TOKEN != '' }}
          date=$(date -u '+%Y-%m-%d')
          tag=$(test -n "${{github.event.inputs.tag}}" && echo "${{github.event.inputs.tag}}" || echo nightly)
          claircore_branch=${br}
          repo=${repo}
          .
          # Environment variables
          printf 'CLAIRCORE_BRANCH=%s\n' "${br}" >> $GITHUB_ENV
      - uses: docker/setup-qemu-action@v3
        with:
          platforms: all
      - uses: docker/setup-buildx-action@v3
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
      - id: setup-go
        uses: actions/setup-go@v6
        with:
          go-version-file: go.mod
          check-latest: true
      - name: Warm cache
        if: steps.setup-go.outputs.cache-hit != 'true'
        run: |
          # go mod download
          find . -name go.mod -type f -execdir go mod download \;
      - id: mod
        run: ./.github/script/nightly-module.sh
      - id: novelty
        uses: actions/cache@v5
        with:
          path: go.sum
          key: novelty-${{ github.sha }}-${{ hashFiles('./go.*') }}
      - uses: docker/login-action@v3
        if: steps.setup.outputs.push && steps.novelty.outputs.cache-hit != 'true'
        with:
          registry: quay.io
          username: ${{ secrets.QUAY_USER }}
          password: ${{ secrets.QUAY_TOKEN }}
      - name: Export
        if: steps.novelty.outputs.cache-hit != 'true'
        # This exports the current state of the main branch, and appends our modified go module files.
        run: |
          mkdir "${{ runner.temp }}/build"
          git archive --add-file=go.mod --add-file=go.sum origin/main |
            tar -x -C "${{ runner.temp }}/build"
          (
            cd "${{ runner.temp }}/build"
            go mod vendor
          )
      - uses: docker/build-push-action@v6
        if: steps.novelty.outputs.cache-hit != 'true'
        with:
          cache-from: type=gha
          cache-to: type=gha,mode=max
          context: ${{ runner.temp }}/build
          platforms: linux/amd64,linux/arm64,linux/s390x,linux/ppc64le
          push: ${{ steps.setup.outputs.push && steps.novelty.outputs.cache-hit != 'true' }}
          tags: |
            quay.io/${{ steps.setup.outputs.repo }}:${{ steps.setup.outputs.tag }}
            quay.io/${{ steps.setup.outputs.repo }}:${{ steps.setup.outputs.tag }}-${{ steps.setup.outputs.date }}
      - uses: ./.github/actions/set-image-expiration
        if: steps.setup.outputs.push && steps.setup.outputs.api && steps.novelty.outputs.cache-hit != 'true'
        with:
          repo: ${{ steps.setup.outputs.repo }}
          tag: ${{ steps.setup.outputs.tag }}-${{ steps.setup.outputs.date }}
          token: ${{ secrets.QUAY_API_TOKEN }}


================================================
FILE: .github/workflows/prepare-release.yml
================================================
---
name: Prepare Release

on:
  workflow_dispatch:
    inputs:
      branch:
        description: 'the branch to prepare the release against'
        required: true
        default: 'main'
      tag:
        description: 'the tag to be released'
        required: true

jobs:
  prepare:
    name: Prepare Release
    runs-on: 'ubuntu-latest'
    steps:
      - name: Checkout
        uses: actions/checkout@v6
        with:
          fetch-depth: 0
          ref: ${{ github.event.inputs.branch }}
      - name: Changelog
        shell: bash
        run: |
          curl -o /tmp/git-chglog.tar.gz -fsSL\
            https://github.com/git-chglog/git-chglog/releases/download/v0.14.0/git-chglog_0.14.0_linux_amd64.tar.gz
          tar xvf /tmp/git-chglog.tar.gz --directory /tmp
          chmod u+x /tmp/git-chglog
          echo "creating change log for tag: ${{ github.event.inputs.tag }}"

          # if this is a release branch filter our change
          # log to only include logs with the same minor
          # versions
          # otherwise just filter v4 for full v4 history
          # on main branch
          filter_tag="--tag-filter-pattern v4"
          branch=${{ github.event.inputs.branch }}
          echo "discovered branch $branch"
          if [[ ${branch%-*} == "release" ]]; then
            filter_tag="--tag-filter-pattern v${branch#release-}"
          fi

          /tmp/git-chglog $filter_tag --next-tag "${{ github.event.inputs.tag }}" -o CHANGELOG.md v4.0.0-alpha.2..
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v8
        with:
          title: "${{ github.event.inputs.tag }} Changelog Bump"
          body: "This is an automated changelog commit."
          commit-message: "chore: ${{ github.event.inputs.tag }} changelog bump"
          branch: "ready-${{ github.event.inputs.tag }}"
          signoff: true
          delete-branch: true


================================================
FILE: .github/workflows/tests.yml
================================================
---
name: Tests

on:
  workflow_call:
    inputs:
      package_expr:
        required: true
        type: string
        description: 'Package expression(s) passed to `go test`'
      qemu:
        required: false
        type: boolean
        default: false
        description: 'Run tests for additional architectures under qemu-static'
      cd:
        required: false
        type: string
        default: ""
        description: 'Change to this directory before running tests'

jobs:
  setup:
    name: Setup
    runs-on: ubuntu-latest
    strategy:
      matrix:
        go: ['oldstable', 'stable']
    outputs:
      go-cache: ${{ steps.check.outputs.cache-hit == 'true' || steps.setup-go.outputs.cache-hit == 'true' || steps.warm.conclusion == 'success' }}
      runner-arch: ${{ steps.arch.outputs.result }}
    steps:
      - name: Map Arch
        id: arch
        uses: actions/github-script@v8
        with:
          result-encoding: string
          script: |
            switch (process.env.RUNNER_ARCH) {
            case "X64":
              return "amd64";
            case "ARM64":
              return "arm64";
            default:
              core.setFailed(`unknown/unsupported architecture: ${process.env.RUNNER_ARCH}`);
            }
            return ""
      - name: Checkout
        if: ${{ inputs.cd == '' }}
        id: checkout
        uses: actions/checkout@v6
      - name: Check Go Version
        if: ${{ inputs.cd == '' && steps.checkout.conclusion == 'success' }}
        id: checkversion
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}
          cache: false
      - name: Get ImageOS
        # There's no way around this, because "ImageOS" is only available to
        # processes, but the setup-go action uses it in its key.
        if: ${{ inputs.cd == '' && steps.checkout.conclusion == 'success' }}
        id: imageos
        uses: actions/github-script@v8
        with:
          result-encoding: string
          script: |
            return process.env.ImageOS
      - name: Check Cache
        if: ${{ inputs.cd == '' && steps.checkout.conclusion == 'success' }}
        id: check
        uses: actions/cache/restore@v5
        with:
          key: >-
            setup-go-${{ runner.os }}-${{ steps.imageos.outputs.result }}-go-${{ steps.checkversion.outputs.go-version }}-${{ hashFiles('go.sum') }}
          lookup-only: true
          path: |
            ~/go/pkg/mod
            ~/.cache/go-build
      - name: Setup Go
        if: ${{ inputs.cd == '' && steps.check.outputs.cache-hit != 'true' }}
        id: setup-go
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}
      - name: Warm Cache on Miss
        id: warm
        if: ${{ inputs.cd == '' && steps.check.outputs.cache-hit != 'true' && steps.setup-go.outputs.cache-hit != 'true' }}
        run: |
          # Warm module+build cache
          for GOARCH in amd64 arm64 ppc64le s390x; do
            export GOARCH
            for mod in '' github.com/quay/clair/config github.com/quay/claircore github.com/quay/claircore/toolkit; do
              echo Downloading modules for "${mod-main}/$GOARCH"
              go mod download $mod
            done
            echo Building '"std"' for "$GOARCH"
            go build std
          done

  tests:
    name: Tests
    runs-on: ubuntu-latest
    needs: ['setup']
    strategy:
      matrix:
        go: ['oldstable', 'stable']
        platform: ${{ inputs.qemu && fromJSON('["amd64","arm64","ppc64le","s390x"]') || fromJSON('["amd64"]')}}
      fail-fast: false
    services:
      postgres:
        image: docker.io/library/postgres:15
        env:
          POSTGRES_DB: "clair"
          POSTGRES_INITDB_ARGS: "--no-sync"
          POSTGRES_PASSWORD: password
          POSTGRES_USER: "clair"
        options: >-
          --health-cmd "pg_isready -U clair"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432
      rabbitmq:
        image: docker.io/library/rabbitmq:3
        env:
          RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS: '-rabbit vm_memory_high_watermark 0.85'
        ports:
          - 5672
          - 61613

    steps:
      - name: Configure RabbitMQ
        run: |
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl await_startup
          docker exec ${{ job.services.rabbitmq.id }} rabbitmq-plugins enable rabbitmq_stomp
          docker exec ${{ job.services.rabbitmq.id }} rabbitmq-plugins disable rabbitmq_management_agent rabbitmq_prometheus rabbitmq_web_dispatch
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl add_vhost localhost
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl set_permissions -p localhost guest '.*' '.*' '.*'
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl add_user clair password
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl set_permissions -p '/' clair '.*' '.*' '.*'
          docker exec ${{ job.services.rabbitmq.id }} rabbitmqctl set_permissions -p localhost clair '.*' '.*' '.*'

      - name: Checkout
        uses: actions/checkout@v6
      - name: Setup Go
        id: setup-go
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}
          cache: ${{ needs.setup.outputs.go-cache }}
      - name: Assets Cache
        id: assets
        uses: actions/cache/restore@v5
        with:
          key: integration-assets-${{ hashFiles('go.sum') }}
          restore-keys: |
            integration-assets-
          path: |
            ~/.cache/clair-testing
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        if: ${{ matrix.platform != needs.setup.outputs.runner-arch }}
        with:
          platforms: linux/${{ matrix.platform }}

      - name: Tests
        # NB If Clair gains any C dependencies, this will need additional setup:
        #  - `-extldflags=-static`
        #  - CGO_ENABLED=1
        #  - relevant architecture's libc, linker, etc.
        env:
          POSTGRES_CONNECTION_STRING: >-
            host=localhost
            port=${{ job.services.postgres.ports[5432] }}
            user=clair
            dbname=clair
            password=password
            sslmode=disable
          RABBITMQ_CONNECTION_STRING: "amqp://clair:password@localhost:${{ job.services.rabbitmq.ports[5672] }}/"
          STOMP_CONNECTION_STRING: "stomp://clair:password@localhost:${{ job.services.rabbitmq.ports[61613] }}/"
          GOARCH: ${{ matrix.platform }}
          CGO_ENABLED: '0'
          GOFLAGS: '-mod=mod'
        working-directory: ./${{ inputs.cd }}
        run: |
          # Go Tests
          for expr in ${{ inputs.package_expr }}; do
            printf '::group::go test %s\n' "$expr"
            go test -tags integration "$expr"
            printf '::endgroup::\n'
          done


================================================
FILE: .github/workflows/v2-issues.yml
================================================
---
name: 'Manage v2 Issues'
on:
  workflow_dispatch:
    inputs:
      debug:
        description: 'Run in debug mode (i.e. dry-run)'
        required: false
        default: false
  schedule:
    - cron: '30 1 * * *'

jobs:
  stale:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/stale@v10
        with:
          only-labels: 'V2'
          exempt-issue-labels: 'V2/active'
          days-before-stale: 14
          days-before-issue-stale: 0
          days-before-close: 14
          remove-stale-when-updated: false
          ignore-updates: true
          debug-only: ${{ github.event.inputs.debug || false }}
          enable-statistics: true
          operations-per-run: 1000


================================================
FILE: .gitignore
================================================
vendor/
book/
clairctl
!clairctl/


================================================
FILE: CHANGELOG.md
================================================
<a name="unreleased"></a>
## [Unreleased]



<a name="v4.9.0"></a>
## [v4.9.0] - 2025-12-08
### All
- [1aca06b8](https://github.com/quay/clair/commit/1aca06b8155b038d4d2f480cab58e938cf156337): fix formatted print calls
### Amqp
- [1a9f8769](https://github.com/quay/clair/commit/1a9f8769746a484fba6acdd2d4a88da661f1eb28): add deprecation notice
### Build(Deps)
- [e4feca46](https://github.com/quay/clair/commit/e4feca46d5cea624c2764b427f3e9f1b07deaeeb): bump golang.org/x/time from 0.7.0 to 0.8.0
- [f54011b5](https://github.com/quay/clair/commit/f54011b57c4fb44d153a3ab15f9dc1a80bb182a9): bump golang.org/x/sync from 0.8.0 to 0.9.0
- [ee5524b8](https://github.com/quay/clair/commit/ee5524b897ae19af977f8b5fc7de19c30e925fce): bump go.opentelemetry.io/otel/sdk from 1.31.0 to 1.32.0
- [757b649c](https://github.com/quay/clair/commit/757b649c3286a01948e0342985d4c09915f6c392): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [20c0040f](https://github.com/quay/clair/commit/20c0040f8982f2fed944fb4182bac5aa3c56ada4): bump github.com/go-stomp/stomp/v3 from 3.1.2 to 3.1.3
- [1607766c](https://github.com/quay/clair/commit/1607766cc5691378c70a6113a57d3a2086c65e63): bump github.com/prometheus/client_golang
- [0a3a4611](https://github.com/quay/clair/commit/0a3a4611964014c0c9846d8c79acdd062af9c17d): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [12ea7bf9](https://github.com/quay/clair/commit/12ea7bf97273f2a22d72dddd76bd7fb7e717838f): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [146d4a67](https://github.com/quay/clair/commit/146d4a670c8d24774206bc5b30deb506901f3c7d): bump github.com/urfave/cli/v2 from 2.27.3 to 2.27.5
- [50003694](https://github.com/quay/clair/commit/5000369402f550817eaa1364ba6eccce3691aa2e): bump github.com/klauspost/compress from 1.17.10 to 1.17.11
- [6069bb24](https://github.com/quay/clair/commit/6069bb249b9228210a988b3ecb883f1adcd77e7a): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
### Chore
- [cbfd97b6](https://github.com/quay/clair/commit/cbfd97b655b59c192bda4aefde5dc0c8cd3ae8bb): fix typos in config.yaml.sample
- [7c9c079b](https://github.com/quay/clair/commit/7c9c079bc643e8f1383ad476f624331938d30d61): update claircore to v1.5.48
- [8e9a6d46](https://github.com/quay/clair/commit/8e9a6d4629288f02a24368105598d02ef6ec0583): update claircore to v1.5.47
- [804ef6a4](https://github.com/quay/clair/commit/804ef6a4890f6aa3a96f9910b6be14876b7623a5): update claircore to v1.5.46
- [a50727a3](https://github.com/quay/clair/commit/a50727a3f281079fffa90b0172f99c8c0f6a027c): add DVO ignore annotations
- [8d991938](https://github.com/quay/clair/commit/8d991938a30759da699ea7dd696a4b9bb79ff9dc): update claircore to v1.5.45
- [ff2059cf](https://github.com/quay/clair/commit/ff2059cf2cbaa422967cc920edf6bbd82d77ed15): update claircore to v1.5.44
- [db51ed82](https://github.com/quay/clair/commit/db51ed82dc8d62bf1051c8286f98233e728b3dab): update claircore to v1.5.42
- [c2dc1766](https://github.com/quay/clair/commit/c2dc1766fffcb7126c3d63299f1702a7be4e2ce9): update claircore to v1.5.41
- [8aa9e1e2](https://github.com/quay/clair/commit/8aa9e1e205961e855159a698e5a8f97089e91a3c): update claircore to v1.5.40
- [eca299b7](https://github.com/quay/clair/commit/eca299b706af03bb4517bd6f4717744708bced16): update go references to go1.24
- [1660b66b](https://github.com/quay/clair/commit/1660b66bd59630b9513a1a0f16cbdd4e552ed43f): upgrade from pgx v4 to v5
- [68d03bae](https://github.com/quay/clair/commit/68d03bae216bbfe785b2fd52c66ac3481c21792d): remove reviews from dependabot config
- [0c5292e7](https://github.com/quay/clair/commit/0c5292e7b19a6271d8c7ea5da72dc5ef66fba3e7): upgrade config module to v1.4.2
- [e5d4c19c](https://github.com/quay/clair/commit/e5d4c19cb3f448f1f057124a916f8056abb0325b): update minimum go version to 1.23
- [e45fbf0e](https://github.com/quay/clair/commit/e45fbf0e762de8fad56200cdbc22547df7c112d3): update claircore to v1.5.35
- [708bf2f5](https://github.com/quay/clair/commit/708bf2f54c7715fd77fa874030740995c60a1c6a): update local-dev tracing configs to fix errors
- [216ca2f1](https://github.com/quay/clair/commit/216ca2f1df0677e4ac0e42758d1fc16010e344ed): update claircore to v1.5.34
- [dde57fc1](https://github.com/quay/clair/commit/dde57fc11d5328f3bb2d561e2df2a312fb812a01): update openAPI spec to remove SourcePackage
- [e5149fd3](https://github.com/quay/clair/commit/e5149fd3ebb1e730ee549af3098a5fc60ccbf0f5): group some dependencies to avoid excessive PRs
- [60ebea73](https://github.com/quay/clair/commit/60ebea73e6abd1c69005e86edf26aefd7a6df23f): update claircore to v1.5.33
### Chore(Deps)
- [f598d3ec](https://github.com/quay/clair/commit/f598d3ec6c2c091f9ec15da2988e0f579dd6bddc): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [a952e3c6](https://github.com/quay/clair/commit/a952e3c66d3482aa7285b58836beaf195bc4b88f): bump the otel group with 11 updates
- [878fbceb](https://github.com/quay/clair/commit/878fbceb42510407fece6b4f46ea66335491af21): bump github.com/google/go-containerregistry
- [468e409c](https://github.com/quay/clair/commit/468e409ce4ddfb459e48023a5c898753fb1fd68f): bump actions/upload-artifact from 4 to 5
- [c87bc8f0](https://github.com/quay/clair/commit/c87bc8f075780714db8f2251285d86f649212f05): bump github.com/klauspost/compress from 1.18.1 to 1.18.2
- [2a5c11fd](https://github.com/quay/clair/commit/2a5c11fd121e9c40cf7e601bce67f119a380def8): bump actions/checkout from 5 to 6
- [b12439f4](https://github.com/quay/clair/commit/b12439f4fadd467b198b4f226c4d2fb6a466fe26): bump golang.org/x/crypto from 0.44.0 to 0.45.0
- [e169a50a](https://github.com/quay/clair/commit/e169a50a7971142e77e0f9194676424bbbe3493f): bump google.golang.org/grpc from 1.76.0 to 1.77.0
- [3e778f2c](https://github.com/quay/clair/commit/3e778f2c2c3a4d0674aa1da2e540dc2a32abaecd): bump golang.org/x/net in the golang-x group
- [4563ccbd](https://github.com/quay/clair/commit/4563ccbd8481f0f651b09e8f6e07e2d561850c31): bump github.com/go-stomp/stomp/v3 from 3.1.3 to 3.1.5
- [195cdb06](https://github.com/quay/clair/commit/195cdb06b3e76ceb2e565178898af2d45d416e5c): bump golang.org/x/sync in the golang-x group
- [b50044f4](https://github.com/quay/clair/commit/b50044f42e2780fab6db3147138c4c52193ade84): bump actions/download-artifact from 5 to 6
- [1b429595](https://github.com/quay/clair/commit/1b42959514e932319d63e27dbb98545b622728f7): bump github.com/klauspost/compress from 1.18.0 to 1.18.1
- [e439e4df](https://github.com/quay/clair/commit/e439e4df7a2db9922b7043d09071809d5ce8f6d8): bump the golang-x group with 2 updates
- [fe37c68b](https://github.com/quay/clair/commit/fe37c68b97f59e0fe526ca97bad05210a74ef004): bump google.golang.org/grpc from 1.75.1 to 1.76.0
- [ee6ea1c8](https://github.com/quay/clair/commit/ee6ea1c8816bc1f6541f4aa5dabc08f5b704ff2e): bump github.com/quay/claircore from 1.5.42 to 1.5.43
- [afcfd7f0](https://github.com/quay/clair/commit/afcfd7f0b7013ecfd38f71883b511f5bda6646f8): bump google.golang.org/grpc from 1.75.0 to 1.75.1
- [6a4937e4](https://github.com/quay/clair/commit/6a4937e45475a9c910dd0b3bef3803efb3d14166): bump the golang-x group across 1 directory with 3 updates
- [53cf68e9](https://github.com/quay/clair/commit/53cf68e9b024baf58d99b5a1ed90e57ea9861942): bump github.com/jackc/pgx/v5 from 5.7.5 to 5.7.6
- [e9850949](https://github.com/quay/clair/commit/e9850949db1eddca2de7c0c1fc568aaa1cd2f83b): bump github.com/prometheus/client_golang
- [290969cd](https://github.com/quay/clair/commit/290969cd1ef8f9e87cf12a658b8223b0ac4a5635): bump actions/stale from 9 to 10
- [5b5519b5](https://github.com/quay/clair/commit/5b5519b5e264c4107166b3f26239aac0ce696bac): bump actions/github-script from 7 to 8
- [b78c76b1](https://github.com/quay/clair/commit/b78c76b152890837cb2961039af982d404a35ff0): bump actions/setup-go from 5 to 6
- [b1f4716b](https://github.com/quay/clair/commit/b1f4716b279fdddb143b0cf5c65a5a5b4f62c43d): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [93174450](https://github.com/quay/clair/commit/93174450e69ef63b1f2b0368a13aac0a818aba70): bump github.com/grafana/pyroscope-go/godeltaprof
- [0f1fde39](https://github.com/quay/clair/commit/0f1fde397494c03329574edbaf2b9e4f66a56103): bump the otel group with 11 updates
- [8dbb0f48](https://github.com/quay/clair/commit/8dbb0f4868eea306a5c9ae1576c2fd4041446b6f): bump golang.org/x/net in the golang-x group
- [a35a1281](https://github.com/quay/clair/commit/a35a12819da47d1ac10519788be4adce24f6c33a): bump github.com/ulikunitz/xz from 0.5.11 to 0.5.14
- [1fa9a753](https://github.com/quay/clair/commit/1fa9a75352b7304dc25a42808ae8c51b12d344b2): bump actions/checkout from 4 to 5
- [f0b0949c](https://github.com/quay/clair/commit/f0b0949cf7eb3168f4b471414c99ae846a95a7e7): bump actions/download-artifact from 4 to 5
- [890f4a1b](https://github.com/quay/clair/commit/890f4a1bc06b6817db91e38a9c6211019a171bcf): bump github.com/prometheus/client_golang
- [80add42b](https://github.com/quay/clair/commit/80add42bbc040210aecc60cbde3a760ad71b5cb6): bump google.golang.org/grpc from 1.73.0 to 1.75.0
- [e4746794](https://github.com/quay/clair/commit/e4746794de3720b6f49b8ec67afc84b8df4ab0d4): bump github.com/jackc/pgx/v5 from 5.7.4 to 5.7.5
- [ba6fe31c](https://github.com/quay/clair/commit/ba6fe31c743674b828c5cee5ca269fe2545f1871): bump go.opentelemetry.io/otel/exporters/prometheus
- [40b0402e](https://github.com/quay/clair/commit/40b0402e4945d6e28076b0bf8345550fb64cba35): bump the golang-x group with 2 updates
- [f9635886](https://github.com/quay/clair/commit/f96358865c699367dd3fa197c7b579c73780ec3d): bump github.com/quay/zlog from 1.1.8 to 1.1.9
- [4415106e](https://github.com/quay/clair/commit/4415106e79b9ef686133f7f9dc218c5c64e16da2): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [b7325ada](https://github.com/quay/clair/commit/b7325adaaea397ceda18b86e75295d43781b0bd7): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [78b92595](https://github.com/quay/clair/commit/78b92595494b4cc2a221dd1d8f8f19235ee594e9): bump the otel group with 11 updates
- [62956271](https://github.com/quay/clair/commit/629562717ccdd276f0d23ea2d2a814f817fa9b5b): bump github.com/urfave/cli/v2 from 2.27.6 to 2.27.7
- [440eee8e](https://github.com/quay/clair/commit/440eee8e1dccfd24f55cf97b23a52e3666c346cc): bump github.com/google/go-containerregistry
- [e75e2e2b](https://github.com/quay/clair/commit/e75e2e2b43d2990f656c7505f0dcc61c4a3219eb): bump the golang-x group with 3 updates
- [cf20adbd](https://github.com/quay/clair/commit/cf20adbddc9dd63917e6321cd5c0d1f0467d51cf): bump google.golang.org/grpc from 1.72.2 to 1.73.0
- [d9c211b4](https://github.com/quay/clair/commit/d9c211b4eedfc4254005fc99ff02b9e6d730e9ac): bump github.com/quay/claircore from 1.5.37 to 1.5.38
- [6338de8b](https://github.com/quay/clair/commit/6338de8b2318c30973eba180969e49242e42f50c): bump github.com/ugorji/go/codec from 1.2.12 to 1.2.14
- [566271a1](https://github.com/quay/clair/commit/566271a163f8be8817e9c2d6e199aa5cf229b3b8): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [3e3a2d33](https://github.com/quay/clair/commit/3e3a2d336195c8a64ece2ae387c0f556c76d165a): bump github.com/google/go-containerregistry
- [81b725ba](https://github.com/quay/clair/commit/81b725ba9ee96443e9013dc3817edd4677beee38): bump google.golang.org/grpc from 1.72.1 to 1.72.2
- [faad36e2](https://github.com/quay/clair/commit/faad36e2c040e7588c6be9cc2dc91f39b037ae68): bump the otel group with 11 updates
- [7979e036](https://github.com/quay/clair/commit/7979e036f09e90e12a61aa7152bbc8d780cdbc08): bump google.golang.org/grpc from 1.72.0 to 1.72.1
- [99ab2c1a](https://github.com/quay/clair/commit/99ab2c1ab17bb58e9e2e7ff10fc5a524d0e8d60d): bump the golang-x group with 2 updates
- [a166f610](https://github.com/quay/clair/commit/a166f6103a50b3374797f7825270fc74d95ca51c): bump github.com/quay/claircore from 1.5.36 to 1.5.37
- [d8e9dcf4](https://github.com/quay/clair/commit/d8e9dcf43083d7c5812f85190ffaeebe2b4e8db9): bump google.golang.org/grpc from 1.71.1 to 1.72.0
- [bfa8f11d](https://github.com/quay/clair/commit/bfa8f11de0d6ff542c23c5146248473b932b9b4b): bump github.com/quay/claircore from 1.5.35 to 1.5.36
- [f8a41628](https://github.com/quay/clair/commit/f8a4162819ca57e13e073c7e52ab78093347cd84): bump github.com/prometheus/client_golang
- [7ce22abe](https://github.com/quay/clair/commit/7ce22abec64cc1ffa0b96522f9c1903340539ff4): bump google.golang.org/grpc from 1.71.0 to 1.71.1
- [c53cf2ba](https://github.com/quay/clair/commit/c53cf2bafc79dcd13b8a27532da5e2118dc0d1a3): bump the golang-x group with 2 updates
- [a5833a44](https://github.com/quay/clair/commit/a5833a4405c11add7666e1532551a5d71e3036e5): bump golang.org/x/net in the golang-x group
- [cc6fb14a](https://github.com/quay/clair/commit/cc6fb14ada0f9af9411fef5a247dad04a77e269b): bump github.com/rs/zerolog from 1.33.0 to 1.34.0
- [851e4a36](https://github.com/quay/clair/commit/851e4a36dfd093bda1a81ff555a13c6d8fae38bb): bump github.com/urfave/cli/v2 from 2.27.5 to 2.27.6
- [e9997624](https://github.com/quay/clair/commit/e9997624ee9ae9e030052f764f9b2e428a9021f7): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [a73e832b](https://github.com/quay/clair/commit/a73e832bb478f34ec5cc74f3e63d79be4a0b8867): bump github.com/prometheus/client_golang
- [35110e9e](https://github.com/quay/clair/commit/35110e9e3b285dfefa2f8e4e858fb24fda84d245): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [0a9866e3](https://github.com/quay/clair/commit/0a9866e39c2398ecf80b289c1b90227f0c1ba966): bump the golang-x group with 3 updates
- [1ce14606](https://github.com/quay/clair/commit/1ce146061c87336eb3f41d394fbab4e15b237922): bump the otel group with 11 updates
- [919d5287](https://github.com/quay/clair/commit/919d5287ee85489e211f0f909078a7ff204af886): bump github.com/google/go-cmp in /config
- [2673e4f4](https://github.com/quay/clair/commit/2673e4f4a9adf3b836d0ba9d6b5dd28823f540ce): bump github.com/rogpeppe/go-internal from 1.13.1 to 1.14.1
- [cf7af98a](https://github.com/quay/clair/commit/cf7af98a4571e2a05ca0839000be2ca275a647c6): bump github.com/go-jose/go-jose/v3 from 3.0.3 to 3.0.4
- [6c9fae1e](https://github.com/quay/clair/commit/6c9fae1e29f50dc11871f28cbe51d609120a065b): bump github.com/google/go-cmp from 0.6.0 to 0.7.0
- [707d8049](https://github.com/quay/clair/commit/707d80495e98786757f31f7028bc54f98e524276): bump github.com/prometheus/client_golang
- [136a618f](https://github.com/quay/clair/commit/136a618f241f48c00a32b0386e9225bb5d1dfa7d): bump github.com/klauspost/compress from 1.17.11 to 1.18.0
- [3e7c6e74](https://github.com/quay/clair/commit/3e7c6e7463307ebef02b708e85d3092c41771e44): bump the golang-x group with 3 updates
- [73db520d](https://github.com/quay/clair/commit/73db520d4c8d0a55e8aa2e4f507412443f12226a): bump github.com/evanphx/json-patch/v5 from 5.9.10 to 5.9.11
- [a3a60f10](https://github.com/quay/clair/commit/a3a60f1017a482909f9451c04501d9c3c179855f): bump google.golang.org/grpc from 1.69.4 to 1.70.0
- [cc29705c](https://github.com/quay/clair/commit/cc29705c7cb02f77566db47dc57c4cac78032420): bump github.com/evanphx/json-patch/v5 from 5.9.0 to 5.9.10
- [d05b4049](https://github.com/quay/clair/commit/d05b4049c7cceda76416b35795ef9290f82c5d95): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [8b99d320](https://github.com/quay/clair/commit/8b99d32021936f2eadda01c38b2bb788272cb7bb): bump the otel group with 11 updates
- [b2c66991](https://github.com/quay/clair/commit/b2c669913bbd4ef1a7df5c2dfad6459ee8fcb117): bump google.golang.org/grpc from 1.69.2 to 1.69.4
- [ef4a1f11](https://github.com/quay/clair/commit/ef4a1f113ae4c192feeadaf50571ff8f11ddb6ed): bump the golang-x group with 2 updates
- [38b77499](https://github.com/quay/clair/commit/38b774994da0481efb4b852d86b96332167baef8): bump golang.org/x/net in the golang-x group
- [80c0381a](https://github.com/quay/clair/commit/80c0381a0d6de6ab79b04294980c1d7e59deb72a): bump the otel group across 1 directory with 2 updates
- [3eff1ef1](https://github.com/quay/clair/commit/3eff1ef131d17b383fdf84172818f6e8d5d307e2): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [5bf85313](https://github.com/quay/clair/commit/5bf853139ea1a3cdcc5ee73fe21b18c7fef4fe35): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [9ebb61d9](https://github.com/quay/clair/commit/9ebb61d945cc8b61d507adee56e020788bcfb931): bump golang.org/x/crypto from 0.30.0 to 0.31.0
- [0881e079](https://github.com/quay/clair/commit/0881e07960cd3799d78707760876cf713e7de29a): bump the golang-x group with 2 updates
- [f556ef16](https://github.com/quay/clair/commit/f556ef162483b3e39605d7073c0ab02108323da1): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [bf8737a1](https://github.com/quay/clair/commit/bf8737a14ae5ab91e1747238f327feade8d9084b): bump golang.org/x/net in the golang-x group
- [f1d9aae4](https://github.com/quay/clair/commit/f1d9aae4eb4952687c02f7ba1f9237e2d8510fd2): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
### Chore(Manifests)
- [48b75fe4](https://github.com/quay/clair/commit/48b75fe45d534081c65d3a55e8206b8ca405f276): add anti-affinity rules
### Ci
- [a0a35fd7](https://github.com/quay/clair/commit/a0a35fd7b6f2aed63adf9feb2c5d5af76a93278e): Allow go test to access un-vendored dependencies
### Cicd
- [ab791a2e](https://github.com/quay/clair/commit/ab791a2ee21107beb49cd516807f1b15c21b085e): run multiarch tests without a full container
- [935a61f3](https://github.com/quay/clair/commit/935a61f3142baf1d426d52cb20dddc74a259cc99): vendor modules into nightly source
### Clairctl
- [4c93f8ea](https://github.com/quay/clair/commit/4c93f8ea2611855503e9c0ca18e0d5e7f9aa55e7): Print a friendly error on panic
 -  [#2221](https://github.com/quay/clair/issues/2221)### Config
- [0db9beaf](https://github.com/quay/clair/commit/0db9beaf1c5fa7da76d03a06672000666f62b591): add ability to disable enrichment
- [7ab81b38](https://github.com/quay/clair/commit/7ab81b3866677804f19dffdf29422d6213a4ba2c): clean environment in example
### Dev
- [503215f5](https://github.com/quay/clair/commit/503215f5100fff89ea1656281394a151fd9cb8b5): rename dashboard.json file to clair.json
- [65cd4244](https://github.com/quay/clair/commit/65cd4244e3b322e7a9c75482cdd6696b6ab24ec3): add a grafana dashboard for postgres stats
### Docker
- [10485679](https://github.com/quay/clair/commit/1048567920dd7aa56442c55c3b928a09f5f9899d): remove version line from docker-compose.yaml
### Docker-Compose
- [8c71b46e](https://github.com/quay/clair/commit/8c71b46e83770234c08e86dea1fa53f01c6a8ad8): update containers
### Enrichments
- [6527a9ec](https://github.com/quay/clair/commit/6527a9ec3e9ab360cb2ed18646041e628fd2dcda): disable enrichers if config option is set
### Fix
- [0a8c3864](https://github.com/quay/clair/commit/0a8c3864648d43fa2650742dba351efdd8c035fe): typo in variable name
### Go.Mod
- [6db583f7](https://github.com/quay/clair/commit/6db583f7dcffaa3d94ba7566df23b79dc430057e): Update Go version to 1.24.9 for CVE-2025-47907
### Health
- [b57b9fa6](https://github.com/quay/clair/commit/b57b9fa642ab2cb561fb205f5349fd81adb56c82): using atomic.Uint32
### Introspection
- [797c2f45](https://github.com/quay/clair/commit/797c2f45fbd8b3c6660a5ef5979e62ffa0b26107): implement OTLP support for metrics and traces
### Misc
- [5891f64b](https://github.com/quay/clair/commit/5891f64bd2451ddf62ad01176416aa8eccba9b79): remove API doc make target, CI check
### Notifier
- [a9a68e18](https://github.com/quay/clair/commit/a9a68e18dd8e4fec4d05a2e82dda92e14b7542e3): increase default durations to be more reasonable
### Openapi
- [8c540b96](https://github.com/quay/clair/commit/8c540b964f6b8afc99f6a82f60fede028fc739f1): rebuild OpenAPI spec
### Signer
- [1c6d0496](https://github.com/quay/clair/commit/1c6d0496ea19a72b0d0dcaff959b4554d19b7b9e): initialize before checking for PSK
 - Fixes [#2214](https://github.com/quay/clair/issues/2214) -  [#2221](https://github.com/quay/clair/issues/2221)### Stomp
- [b2501ba3](https://github.com/quay/clair/commit/b2501ba3f277034283d1ecfb30b6fb808ab8ffc9): ignore Unsubscribe error in test
- [0b8e3507](https://github.com/quay/clair/commit/0b8e3507a0425fde64932627245a66458cb853da): add deprecation notice
- [684be8d0](https://github.com/quay/clair/commit/684be8d043d43b66915fbf0d8976c1230a15f9b3): catch test-specific error
### Types/V1
- [50d0164b](https://github.com/quay/clair/commit/50d0164b0cf9d305f4cc5af1f0a9787e67623ca9): add JSON API v1 types and schemas
### Reverts
- cicd: exclude darwin/arm64


<a name="v4.8.0"></a>
## [v4.8.0] - 2024-10-09
### 'Chore
- [ab3a754e](https://github.com/quay/clair/commit/ab3a754e1408d8fed0160ce999536c8fd2f452f7): update claircore to v1.5.19
- [f783b356](https://github.com/quay/clair/commit/f783b356ce3c7903641913ee25d0a384c19602db): update claircore to v1.5.18
- [9286ab86](https://github.com/quay/clair/commit/9286ab86517a6738bd82150e695badde814f8bab): update claircore to v1.5.17
### Admin
- [d3467bad](https://github.com/quay/clair/commit/d3467bad8aab1f463b51ed22ad377b78ef687920): add pre v4.8.0 admin command to delete OVAL vulns
- [d53780b6](https://github.com/quay/clair/commit/d53780b6ada05c763576457cc7d0a8f98147f29e): add a check for compatible migration version
- [87c24a9c](https://github.com/quay/clair/commit/87c24a9c63b59ebfeae76f198ddace78ff095c54): add command to update go packages with norm_version
- [02e6c925](https://github.com/quay/clair/commit/02e6c9256ea5514088b7817df4df13c62b45fc73): add pre v4.7.3 admin command to create index
### All
- [55294aaf](https://github.com/quay/clair/commit/55294aafae6d943edf09328ed52c4e6d92676966): fix incorrect API paths
- [daa78ec2](https://github.com/quay/clair/commit/daa78ec25bf087e65a1b5ac387880666515cc359): fix some typos
### Amqp
- [8fcd294c](https://github.com/quay/clair/commit/8fcd294c6609be94d6d56b14ff2b39046e8f134c): migrate to maintained package
 -  [#1793](https://github.com/quay/clair/issues/1793)### Auto
- [07b0ea7b](https://github.com/quay/clair/commit/07b0ea7b47e7b15867bb6c5209eca995faf119f9): improve log messages
 -  [#2092](https://github.com/quay/clair/issues/2092)### Build(Deps)
- [5092198b](https://github.com/quay/clair/commit/5092198b0459e12ec2472dd74c6c7d60b33e847d): bump golang.org/x/time from 0.6.0 to 0.7.0
- [e7b6deac](https://github.com/quay/clair/commit/e7b6deacd205a9e2138f91115c7d19c87ffb2365): bump golang.org/x/net from 0.29.0 to 0.30.0
- [55fb7735](https://github.com/quay/clair/commit/55fb773530fe243935f3ceb59606d500db27820e): bump github.com/klauspost/compress from 1.17.9 to 1.17.10
- [7a2e7186](https://github.com/quay/clair/commit/7a2e7186b5d33cbbb2b66fbfbcbaaad3fb60c210): bump github.com/prometheus/client_golang
- [698d9170](https://github.com/quay/clair/commit/698d9170d5d88e79b80ee3a5aa5f4f8b2a929e99): bump github.com/rogpeppe/go-internal from 1.12.0 to 1.13.1
- [7ec7e04f](https://github.com/quay/clair/commit/7ec7e04f6eaff5cf4cacc11839d4b167f685a4b1): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [96ee336f](https://github.com/quay/clair/commit/96ee336fa33329d69819f00400a79491eca8952e): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [5fb41ed8](https://github.com/quay/clair/commit/5fb41ed8436ac629aef16d78658c3b7b6ce90232): bump golang.org/x/net from 0.28.0 to 0.29.0
- [2a13e7b7](https://github.com/quay/clair/commit/2a13e7b751f934cfde15e64cebd8001686e4d839): bump peter-evans/create-pull-request from 6 to 7
- [061b1e09](https://github.com/quay/clair/commit/061b1e091394f5ac49d18dab9727cf70f72dc0bc): bump github.com/prometheus/client_golang
- [a2c920f4](https://github.com/quay/clair/commit/a2c920f4e8b82a753459fc772d763b3891d9f30c): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [bbaece4e](https://github.com/quay/clair/commit/bbaece4ef05e6cc1b5fc3f4de9ece173df2d908f): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [24aff4e4](https://github.com/quay/clair/commit/24aff4e4362e5eef9cf77aba231c11da8d7b6c3d): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [b203913a](https://github.com/quay/clair/commit/b203913af17ed8a5ba0a19514d52ea177618aafe): bump github.com/prometheus/client_golang
- [96937294](https://github.com/quay/clair/commit/96937294d27187b80cd632b018c8e4aabdaf5d1a): bump github.com/grafana/pyroscope-go/godeltaprof
- [01b57db6](https://github.com/quay/clair/commit/01b57db6fa2188a9630cec86239406d3ae706d2d): bump github.com/google/go-containerregistry
- [7ceeaaa2](https://github.com/quay/clair/commit/7ceeaaa2e589e3a89414d2ede08799a359926b1d): bump github.com/go-stomp/stomp/v3 from 3.1.1 to 3.1.2
- [c3ce1982](https://github.com/quay/clair/commit/c3ce198288a56c2d011cf114cae09704eee0e2bf): bump github.com/urfave/cli/v2 from 2.27.2 to 2.27.3
- [95f5a5f2](https://github.com/quay/clair/commit/95f5a5f2afce16af5f7013025198d10294f5eb05): bump github.com/google/go-containerregistry
- [1a5f342c](https://github.com/quay/clair/commit/1a5f342c73dc841a97e8f043e1f4fd7e310dea35): bump github.com/go-stomp/stomp/v3 from 3.1.0 to 3.1.1
- [5821a5bf](https://github.com/quay/clair/commit/5821a5bfd0f4defe0f4cbb27bfc90102215a914d): bump golang.org/x/net from 0.26.0 to 0.27.0
- [08587861](https://github.com/quay/clair/commit/0858786146e0b1971b4417b0c7744e035f1fef73): bump github.com/google/go-containerregistry
- [74914938](https://github.com/quay/clair/commit/749149387eda7b4ecc564d9df24c6eb011fb0f94): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [67bdbbbe](https://github.com/quay/clair/commit/67bdbbbef3b521a7cc94545a7428cc3f46be27d0): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [dd9d6760](https://github.com/quay/clair/commit/dd9d676048b92ed497ad8612da8ef175cca9675f): bump go.opentelemetry.io/otel from 1.27.0 to 1.28.0
- [fcee4364](https://github.com/quay/clair/commit/fcee436402c57cfb1555b2380d972b2301415e65): bump github.com/klauspost/compress from 1.17.8 to 1.17.9
- [3f229e99](https://github.com/quay/clair/commit/3f229e99b279bebd371c5b7fba26d610110751a9): bump github.com/google/go-containerregistry
- [c5ae5021](https://github.com/quay/clair/commit/c5ae5021f3fd28ab25caf00bd6629e81015efef2): bump docker/build-push-action from 5 to 6
- [7400db24](https://github.com/quay/clair/commit/7400db249415f5597f634c85979ae20b5c64f308): bump golang.org/x/net from 0.25.0 to 0.26.0
- [74b377b8](https://github.com/quay/clair/commit/74b377b8f9bf340c427025de0dfe9b02cfa094f4): bump github.com/rs/zerolog from 1.32.0 to 1.33.0
- [1fff0726](https://github.com/quay/clair/commit/1fff07260778fb19820ad3fe038be41d39e9a44a): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [f2533fbf](https://github.com/quay/clair/commit/f2533fbf053c50c35548078091fb0596a8d5bdc4): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [5376a756](https://github.com/quay/clair/commit/5376a7563dd4fc7f2565d6e270f0a0cc6c22bad9): bump github.com/rabbitmq/amqp091-go from 1.9.0 to 1.10.0
- [d82ab343](https://github.com/quay/clair/commit/d82ab34331da273e75ab63e27d92c3c5a9d91f94): bump golang.org/x/net from 0.24.0 to 0.25.0
- [453d2c60](https://github.com/quay/clair/commit/453d2c60547c493ae8968ed45e72b26ad139e72c): bump github.com/urfave/cli/v2 from 2.27.1 to 2.27.2
- [5323fa31](https://github.com/quay/clair/commit/5323fa3186a2695903c2737831f66a31dcb58dfa): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [3e1f5c15](https://github.com/quay/clair/commit/3e1f5c15a0713859ba51d5eab54e98b881b1ecb9): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [71078832](https://github.com/quay/clair/commit/710788327dc2870e4e277b77dff338adb030c73a): bump go.opentelemetry.io/otel from 1.25.0 to 1.26.0
- [1006287a](https://github.com/quay/clair/commit/1006287a5e9568c3deb30c13674f3baf24cdab2a): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [43f3a3e4](https://github.com/quay/clair/commit/43f3a3e4c426c9a160926aeb5008783a903307aa): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [343515af](https://github.com/quay/clair/commit/343515af8838b521c61663fe846bb32662363f01): bump github.com/klauspost/compress from 1.17.7 to 1.17.8
- [c3db2e4d](https://github.com/quay/clair/commit/c3db2e4dc61b8f9ba8039e655f159efd7c1d2d5b): bump github.com/quay/claircore from 1.5.25 to 1.5.26
- [4cf0febf](https://github.com/quay/clair/commit/4cf0febfff33b734ffb021bfd2b35a8082320d4e): bump golang.org/x/sync from 0.6.0 to 0.7.0
- [36d21edd](https://github.com/quay/clair/commit/36d21edd3d1471094f0b4737fcadcad8b41ee53b): bump golang.org/x/net from 0.22.0 to 0.24.0
- [93a70b35](https://github.com/quay/clair/commit/93a70b35ee2c51544e87d7a1109e301be3baf821): bump go.opentelemetry.io/otel/sdk from 1.24.0 to 1.25.0
- [da30be8b](https://github.com/quay/clair/commit/da30be8bad23248b514903fddbb6864953a7b636): bump github.com/google/go-containerregistry
- [5a5e1776](https://github.com/quay/clair/commit/5a5e177685daaf45b38640a48658b6cbfc5ca36f): bump golang.org/x/net from 0.21.0 to 0.22.0
- [d4ceeea2](https://github.com/quay/clair/commit/d4ceeea24f518abc409e0d60361a575f3b395cbe): bump github.com/go-jose/go-jose/v3 from 3.0.2 to 3.0.3
- [d64064ce](https://github.com/quay/clair/commit/d64064ce59c2c0fbb1b0ea1f9e1ab27dfa39329d): bump github.com/prometheus/client_golang
- [06c9ddab](https://github.com/quay/clair/commit/06c9ddab732512b03f9edc5f69d1551823154f7c): bump github.com/jackc/pgx/v4 from 4.18.1 to 4.18.3
- [e4d79110](https://github.com/quay/clair/commit/e4d7911000add800242efd6fdaba557c69774052): bump github.com/go-stomp/stomp/v3 from 3.0.6 to 3.1.0
- [d7c5821f](https://github.com/quay/clair/commit/d7c5821f888b01545247cb7a80e79b9d70caac36): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [523ebf7f](https://github.com/quay/clair/commit/523ebf7fb0204171656b62d69c5ea3a8ba275772): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [0803380f](https://github.com/quay/clair/commit/0803380f040f699cb08564899fe2a5d6a674d504): bump github.com/go-jose/go-jose/v3 from 3.0.1 to 3.0.2
- [a3e0786c](https://github.com/quay/clair/commit/a3e0786c5984447725ab7cd7826cae108314dc57): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [684c3ac3](https://github.com/quay/clair/commit/684c3ac3310861186ff5a61b56c98b1c5facd4b0): bump peter-evans/create-pull-request from 6.0.0 to 6.0.1
- [3fb2c921](https://github.com/quay/clair/commit/3fb2c921c83dfbe89ca92b7e46cb9bf0d98c84a7): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [51981290](https://github.com/quay/clair/commit/519812903d6048748ea5b29c5dd33889ae9afa50): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [115cbb22](https://github.com/quay/clair/commit/115cbb2203768ade1a861358230767deab0fbd42): bump github.com/go-stomp/stomp/v3 from 3.0.5 to 3.0.6
- [43b164e7](https://github.com/quay/clair/commit/43b164e78cfaf48ff317bd491712b2ceac9d2668): bump golang.org/x/net from 0.20.0 to 0.21.0
- [acf2cdf6](https://github.com/quay/clair/commit/acf2cdf6305ea0b23021ddb55346d6dfabcc0fab): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [0c7fe4dd](https://github.com/quay/clair/commit/0c7fe4dd821aff8c569d332938c1dd53b43f1aaa): bump go.opentelemetry.io/otel/sdk from 1.22.0 to 1.23.1
- [16a1504a](https://github.com/quay/clair/commit/16a1504accbe3e33b01f639ac2038890eeef66fe): bump go.opentelemetry.io/otel from 1.22.0 to 1.23.1
- [1f98abe7](https://github.com/quay/clair/commit/1f98abe77ca9ab3fb0cf8a2b68a692f3ebfb6c63): bump peter-evans/create-pull-request from 5.0.2 to 6.0.0
- [fb5efb51](https://github.com/quay/clair/commit/fb5efb51ec338f5c8b1a57a0e6b73ec6c8867e84): bump github.com/klauspost/compress from 1.17.5 to 1.17.6
- [8dbacd3c](https://github.com/quay/clair/commit/8dbacd3c0fd7f16bc6fdbc0cc3c3caf9536b0cd3): bump github.com/rs/zerolog from 1.31.0 to 1.32.0
- [96d34f64](https://github.com/quay/clair/commit/96d34f64849f2acfe785b88f2e674e540d605f1a): bump github.com/google/go-containerregistry
- [3bcf9aac](https://github.com/quay/clair/commit/3bcf9aacf00f574b32f7baee77466852e3d17dfe): bump github.com/klauspost/compress from 1.17.4 to 1.17.5
- [19afbbbe](https://github.com/quay/clair/commit/19afbbbe284b0af634043a82947b2a6ed10f5a41): bump github.com/evanphx/json-patch/v5 from 5.8.0 to 5.9.0
- [50eb4b52](https://github.com/quay/clair/commit/50eb4b5281f9bd8410c8595c17f373f2ccd014d7): bump github.com/google/uuid from 1.5.0 to 1.6.0
- [4ed100ec](https://github.com/quay/clair/commit/4ed100ec4b4d33ac136b0394cc7c4fb06fd9a4bc): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [1d338051](https://github.com/quay/clair/commit/1d338051f374f78b3989ef92d8255be0ce7089b0): bump actions/cache from 3 to 4
- [a0e1ba8b](https://github.com/quay/clair/commit/a0e1ba8bcb0a027e340511b36c29593eb5a11488): bump github.com/grafana/pyroscope-go/godeltaprof
- [1ab0557b](https://github.com/quay/clair/commit/1ab0557b60d3e8843dc37132184c435f0c2965da): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [fcf0ccdd](https://github.com/quay/clair/commit/fcf0ccdde5b06410c1e758535c35271ba324f25b): bump go.opentelemetry.io/otel/sdk from 1.21.0 to 1.22.0
- [6fe56438](https://github.com/quay/clair/commit/6fe564389c53b74e692f06afb7414927740f4e3d): bump github.com/evanphx/json-patch/v5 from 5.7.0 to 5.8.0
- [6ef2554e](https://github.com/quay/clair/commit/6ef2554ef2f98aeefc22a9bc6836394e8b0523e0): bump golang.org/x/net from 0.19.0 to 0.20.0
- [7b48e897](https://github.com/quay/clair/commit/7b48e897374e5e67e7d59753ee28175361d59b3a): bump golang.org/x/sync from 0.5.0 to 0.6.0
- [c25d841a](https://github.com/quay/clair/commit/c25d841aba4e3cc0996c62d5a5a8bd6eb6c921a5): bump github.com/quay/zlog from 1.1.7 to 1.1.8
- [94b57fa0](https://github.com/quay/clair/commit/94b57fa0c8c465b579e357a30e09fbebb2e52629): bump github.com/prometheus/client_golang
- [ad2c872c](https://github.com/quay/clair/commit/ad2c872c05584a73f70f214db52a9bbfce72c530): bump github.com/urfave/cli/v2 from 2.26.0 to 2.27.1
- [2159bfb5](https://github.com/quay/clair/commit/2159bfb5f10819d6f66e1f8b17c4df9ed8d50153): bump github.com/google/uuid from 1.4.0 to 1.5.0
- [aaa335b3](https://github.com/quay/clair/commit/aaa335b3e8dcd73b0881ab2d50a8f0a1fecda177): bump golang.org/x/crypto from 0.16.0 to 0.17.0
- [9c588cf5](https://github.com/quay/clair/commit/9c588cf5a7dfacb37f7e781870e3c884b562cb5a): bump github.com/google/go-containerregistry
- [cbc166d6](https://github.com/quay/clair/commit/cbc166d61c9e0c427cd78077feb5ab3635ca82ee): bump actions/upload-artifact from 3 to 4
- [355cab98](https://github.com/quay/clair/commit/355cab9896e5ccd892e41698fdc3599b4aa3f11e): bump actions/download-artifact from 3 to 4
- [7b7ff298](https://github.com/quay/clair/commit/7b7ff298a524bee4582b475dcc162c01fc2e8e47): bump github.com/ugorji/go/codec from 1.2.11 to 1.2.12
- [45625c51](https://github.com/quay/clair/commit/45625c51e82f0045c441e0f55d7869a978bd97f4): bump github.com/urfave/cli/v2 from 2.25.7 to 2.26.0
- [b6b39706](https://github.com/quay/clair/commit/b6b397064846253c7229d27ad90919fcc025a334): bump actions/setup-go from 4 to 5
- [913a5114](https://github.com/quay/clair/commit/913a51146ccee020ff19895f3ffe96fdc629a3ad): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [71c66638](https://github.com/quay/clair/commit/71c66638229e9670e1bf5da3d8e77446795c386d): bump github.com/klauspost/compress from 1.17.2 to 1.17.4
- [825dddc1](https://github.com/quay/clair/commit/825dddc106931ccbb4ee1008ba647b15cfe595c3): bump golang.org/x/net from 0.17.0 to 0.19.0
- [e7314325](https://github.com/quay/clair/commit/e73143254426f46a75bc178c8aaddf2da097735a): bump actions/stale from 8 to 9
- [99291347](https://github.com/quay/clair/commit/99291347704de0f22afe657b9111e23669dc18b1): bump github.com/quay/zlog from 1.1.5 to 1.1.7
- [d75c2c40](https://github.com/quay/clair/commit/d75c2c40ef3d4f8bae6f38a6dd13d2f7d1f10668): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [83a935dd](https://github.com/quay/clair/commit/83a935dd39b92b90a62b7f376d7f9be7da1dacd3): bump go.opentelemetry.io/otel/sdk from 1.20.0 to 1.21.0
- [4db3b77e](https://github.com/quay/clair/commit/4db3b77e1c2630a8b6c0014fbd6517efda0872e7): bump github.com/go-jose/go-jose/v3
- [1b2248b9](https://github.com/quay/clair/commit/1b2248b9ac524b0c4e83c4290f26ccb94da78b9f): update opentelemetry modules
 -  [#1909](https://github.com/quay/clair/issues/1909) -  [#1911](https://github.com/quay/clair/issues/1911) -  [#1912](https://github.com/quay/clair/issues/1912) -  [#1913](https://github.com/quay/clair/issues/1913)- [4a84b949](https://github.com/quay/clair/commit/4a84b9491c0309af8ec4e0dce6b5c5daf0089d2c): bump github.com/google/uuid from 1.3.1 to 1.4.0
- [efc1ab07](https://github.com/quay/clair/commit/efc1ab07d1fbd101d584bbfe8a883fbf6cf8552d): bump golang.org/x/time from 0.3.0 to 0.4.0
- [61aa3ebd](https://github.com/quay/clair/commit/61aa3ebd9671f7e23d152971328a268482fe095d): bump golang.org/x/sync from 0.4.0 to 0.5.0
- [54eb2e85](https://github.com/quay/clair/commit/54eb2e857c033483ea5acddd8254f6ee080ab77b): bump github.com/google/go-cmp from 0.5.9 to 0.6.0
- [b0497e58](https://github.com/quay/clair/commit/b0497e58b2c61a6462bb7a7fabf5302230b3ea28): bump github.com/klauspost/compress from 1.17.0 to 1.17.2
- [a90ecc45](https://github.com/quay/clair/commit/a90ecc4514385e011e971b97adc157062cddecf0): bump go.opentelemetry.io/otel/sdk from 1.17.0 to 1.19.0
- [55dc551f](https://github.com/quay/clair/commit/55dc551f39550ff7857acf500a7f80666b213bf6): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [5a8c21a0](https://github.com/quay/clair/commit/5a8c21a0271a5dac4e83e100fe4f291552f0a429): bump github.com/google/go-cmp in /config
- [f3072d19](https://github.com/quay/clair/commit/f3072d198700320c2144d2b1409d59440886084b): bump go.opentelemetry.io/otel from 1.18.0 to 1.19.0
- [8468d861](https://github.com/quay/clair/commit/8468d861204350005c9eff1469a67cd4b409a915): bump golang.org/x/net from 0.16.0 to 0.17.0
- [afafe835](https://github.com/quay/clair/commit/afafe8357a948d9b6bcd8f82a7b8fad86512a66e): bump golang.org/x/net from 0.15.0 to 0.16.0
- [f162e1ce](https://github.com/quay/clair/commit/f162e1ce4b4444d69227b90f8bfc440c8514bcb9): bump github.com/rs/zerolog from 1.30.0 to 1.31.0
- [e6f72bc4](https://github.com/quay/clair/commit/e6f72bc47903135bd1978988f040b14577e075b2): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [c0eef84b](https://github.com/quay/clair/commit/c0eef84b28488258f0a5e42233240c04f52ffb2f): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [7129bacf](https://github.com/quay/clair/commit/7129bacf79302b91edf0482b3ca271d85dd66642): bump github.com/evanphx/json-patch/v5 from 5.6.0 to 5.7.0
- [6969e003](https://github.com/quay/clair/commit/6969e003d05dfb7777afa0d5a628f8d445dfa2d3): bump docker/setup-buildx-action from 2 to 3
- [606c5c9b](https://github.com/quay/clair/commit/606c5c9b36bdf18fa243024b69e002798e6146f7): bump docker/login-action from 2 to 3
- [24eb3f71](https://github.com/quay/clair/commit/24eb3f7113929b65b9257b60ba9cba923c575f09): bump docker/build-push-action from 4 to 5
- [dbaebb58](https://github.com/quay/clair/commit/dbaebb5821b567255e50315c60a8ee00b9b541fb): bump docker/setup-qemu-action from 2 to 3
- [a31be2e2](https://github.com/quay/clair/commit/a31be2e2cae12d3ca09fc19f5f97ab2ceb5aaa85): bump actions/checkout from 3 to 4
- [480996b1](https://github.com/quay/clair/commit/480996b1f386a117feff025d56b5d6c0eab7f77c): bump go.opentelemetry.io/otel/exporters/jaeger
- [bc21afa0](https://github.com/quay/clair/commit/bc21afa0171521104b21c6175099cb3c5cb48175): bump github.com/google/uuid from 1.3.0 to 1.3.1
- [5ae4f0fa](https://github.com/quay/clair/commit/5ae4f0fa3db4e5154d178bccaa2a652f11576000): bump github.com/google/go-containerregistry
- [56cd1851](https://github.com/quay/clair/commit/56cd1851f463d31e6c1f552d42ea35a591186a60): bump github.com/rs/zerolog from 1.29.1 to 1.30.0
- [67b92e71](https://github.com/quay/clair/commit/67b92e71ca3ae3017add43f846e9c4b83f9fd29f): bump golang.org/x/net from 0.12.0 to 0.15.0
- [a478ce91](https://github.com/quay/clair/commit/a478ce918566144d58b50ffb892cb33a11992036): bump github.com/pyroscope-io/godeltaprof
### Chore
- [05680a2b](https://github.com/quay/clair/commit/05680a2bd328410c3aa19de39f3226acc3c234d6): v4.8.0 changelog bump
- [94113d95](https://github.com/quay/clair/commit/94113d9539b83a25829a540afdb965a579d96c6e): update claircore to v1.5.32
- [e77deb98](https://github.com/quay/clair/commit/e77deb9820c6d8896c377d228f5741ea57b7bc2f): update config module to v1.4.1
- [e5fca953](https://github.com/quay/clair/commit/e5fca9539437286efbbbe5ead42972607ac149a5): update references to rhel updater to rhel-vex updater
- [64b66ff9](https://github.com/quay/clair/commit/64b66ff96e05f20c4410a78292e293a9bfa744c8): update go version to specific patch
- [89ebd521](https://github.com/quay/clair/commit/89ebd521d32d76eb4a37d150fa5e59d193542ff5): update go version to 1.22
- [9333770e](https://github.com/quay/clair/commit/9333770e3e6f2434d291ef3619c314cd3d4d213f): update claircore to v1.5.31
- [93fa883d](https://github.com/quay/clair/commit/93fa883df4a24f3fd681295012fd84821e986680): update claircore to v1.5.30
- [1209772d](https://github.com/quay/clair/commit/1209772de458082e25aee042aa44febb2ec7fa46): update claircore to v1.5.29
- [3c623553](https://github.com/quay/clair/commit/3c6235532215d96a54210ca88f6eae692cdbda17): run the go formatting over the repo
- [7703b4a2](https://github.com/quay/clair/commit/7703b4a23b4e1a4fcdf391a09ce1d7252bdc0722): fix some comments
- [7d3f12e3](https://github.com/quay/clair/commit/7d3f12e34ef637d7f4a7682ebc0aba7e1ffe4210): use the merge-multiple directive when downloading binaries
- [b5a0d8a6](https://github.com/quay/clair/commit/b5a0d8a60c643c0867c850634145f6192d694667): update claircore to v1.5.28
- [ac255112](https://github.com/quay/clair/commit/ac25511280ca75fd6b7b32dcdadfdd01f5fdc9db): Add merge step when creating release binaries
- [5dc73b16](https://github.com/quay/clair/commit/5dc73b16ffffe7a5245355a5c56a726a4e1801e4): update go version for release
- [ea990567](https://github.com/quay/clair/commit/ea990567b95d61f0f7438ba6b8ad2519dda3288a): update claircore to v1.5.27
- [0bf9286e](https://github.com/quay/clair/commit/0bf9286e2c0e6c1591616729aa5b35386471efd3): update production manifest with new tmp dir
- [6a3ce17f](https://github.com/quay/clair/commit/6a3ce17f0a45f962f1d1d25eccfd99d235bbfeff): update go version
- [3e5740e0](https://github.com/quay/clair/commit/3e5740e038742aa29fe193d2dee70616eca17eaf): remove repetitive word
- [222f2273](https://github.com/quay/clair/commit/222f2273813baec3078404e2a74c1227784db262): update claircore to v1.5.25
- [7ac4609b](https://github.com/quay/clair/commit/7ac4609b00cbe6093af07ab0320fe3275fbbb313): update claircore to v1.5.24
- [bad8abe5](https://github.com/quay/clair/commit/bad8abe5786b17c8291870864f04c5bec70cf758): update claircore to v1.5.23
- [c81b3b9a](https://github.com/quay/clair/commit/c81b3b9a57ccd5a549ed8f29d1b646be752893c6): update claircore to v1.5.22
- [a9b5e91d](https://github.com/quay/clair/commit/a9b5e91d7c09bea896d55575b2c88a97bc919271): update claircore to v1.5.21
- [6de0d807](https://github.com/quay/clair/commit/6de0d807a5d63d5b10d63c274c297fcf095a308b): Add Go 1.22 support via moved godeltaprof dependancy bump
- [b65445ce](https://github.com/quay/clair/commit/b65445ce7c0874a61fbccdd5df33419a62268d49): clean up sample config
- [a359eb01](https://github.com/quay/clair/commit/a359eb01e0b9aaa4eb3e6433af8812a2de9908b5): migrate go-jose to maintained version
- [5cf5fb8d](https://github.com/quay/clair/commit/5cf5fb8dba87b03ca37ed5a60856f5b4c3e72404): update claircore to v1.5.20
- [180fa4f4](https://github.com/quay/clair/commit/180fa4f444ff0affcc6ee9dd4436f97ea75c2dab): bump claircore to v1.5.16
- [696b266e](https://github.com/quay/clair/commit/696b266e18205b216a2a4e4cdb95fd814892ef57): bump claircore to v1.5.15
- [2829eacf](https://github.com/quay/clair/commit/2829eacfbe5eb89cb8e5261d136354da50300a82): bump claircore to v1.5.14
### Cicd
- [dbcfe30d](https://github.com/quay/clair/commit/dbcfe30d9225b65e3f5d4bd117dfe437ec8e057a): tweak login behavior
- [6861b804](https://github.com/quay/clair/commit/6861b8047fd8e64ee285d48319cd40939be86367): remove second go-caching action
- [c42bee62](https://github.com/quay/clair/commit/c42bee62e2fcad39743be02191055d967d5a15a6): improve nightly script output
- [08581d82](https://github.com/quay/clair/commit/08581d82726f60d26c4508400883e936d270909c): tweaks to the set-image-expiration action
- [3b650c56](https://github.com/quay/clair/commit/3b650c56a5ecd4242ecb4926a0b4e62a7a1ef691): fix nightly build
- [6884969b](https://github.com/quay/clair/commit/6884969b37239a30e0966e71adcafb5ce51f74dc): add /var/tmp mount to make sure it's on a real filesystem
- [139aed21](https://github.com/quay/clair/commit/139aed21d72f91d007302fa4df690ff17a574c5d): reorganize the docker test so that it's less error-prone
- [b48682a4](https://github.com/quay/clair/commit/b48682a4260353ed6be503913020baaa4d028924): remove comment that the linter complained about
- [bf7005f0](https://github.com/quay/clair/commit/bf7005f091ae65ac6ecb481b88f0cece30bc0493): add `/fast-forward` command
- [d11a2602](https://github.com/quay/clair/commit/d11a26026e871d42c6dd8c9b4f97d53b4272d029): add container version skew check
- [fd153765](https://github.com/quay/clair/commit/fd1537652df13da6a988e1eb8822e416dae57866): update testing workflow
- [23a8c33d](https://github.com/quay/clair/commit/23a8c33d7f062a61d5fe96b1821dd7bcea80c24c): don't upload workspace on failure
- [6f3b1347](https://github.com/quay/clair/commit/6f3b13479a40b3285fbb2cfd633fc8815db98a1e): update actions/cache version
- [0604f1e6](https://github.com/quay/clair/commit/0604f1e6004e10d92f06c67552b7604dcd98f77f): change version specifiers to be major-version only
- [718ef948](https://github.com/quay/clair/commit/718ef948653b85198caaafb50db1ca64fe5706e4): make nightly script shellcheck-clean
### Clair
- [ba6fc371](https://github.com/quay/clair/commit/ba6fc37173c2f0fae701482a3d1e758c1988ce04): add platform-specific signals
- [76a5d50b](https://github.com/quay/clair/commit/76a5d50b0c2fedc4a426988955436a47fb480ac8): break cancellation chain for request contexts
- [b0086d80](https://github.com/quay/clair/commit/b0086d800b113d038f8a4b66fcf134a5b41105b3): redo shutdown structure
 -  [#1946](https://github.com/quay/clair/issues/1946)### Clairctl
- [13acc582](https://github.com/quay/clair/commit/13acc5828603177ab9b0cf5b871c65dbbdaa6ed7): warn when range requests are not honored
### Cmd
- [7de8cea7](https://github.com/quay/clair/commit/7de8cea790f5caed8621a576f20ccae20078bb40): add exported source date
- [7121ceaa](https://github.com/quay/clair/commit/7121ceaad9dd92c3b6229182f06db0ea3a1424e0): annotate fake key for gitleaks
### Compress
- [c90a55fd](https://github.com/quay/clair/commit/c90a55fd056d18b18b0f64f02320a226ad1c34e7): update compression middleware
### Config
- [33a77438](https://github.com/quay/clair/commit/33a7743867d99a1ad96c146ff618a6d27c5f9b0b): update minimum TLS version for server
- [e0a1f235](https://github.com/quay/clair/commit/e0a1f235b6bf26010f932dc732043d79d1b56f3f): Update comment to describe currently supported updaters
- [36210370](https://github.com/quay/clair/commit/36210370be51136471d12968751f32367b2e9871): add Sentry config
- [33cc3e5c](https://github.com/quay/clair/commit/33cc3e5c0199841c108a95e88c4d764739f21e80): add OTLP configuration types
- [f503d670](https://github.com/quay/clair/commit/f503d6703d60e66c3186d727fbc670988ea342e3): fix typo
### Contrib
- [74974320](https://github.com/quay/clair/commit/74974320f4a1358911fdc263d2060839ca25cb2d): correct position of startupProbe spec
- [5ad0d6be](https://github.com/quay/clair/commit/5ad0d6be2d06cfe9e6805a565f5f5a569583a5a0): update `build_and_deploy.sh` script
- [accee22f](https://github.com/quay/clair/commit/accee22ffd15d8ad8da957b3946b5ab03120999b): account for different container engine clients
- [1160febe](https://github.com/quay/clair/commit/1160febe28589c4eb85bef8bc5e51e4c7db82907): update build script to use podman
- [f19b59bd](https://github.com/quay/clair/commit/f19b59bd3efad37aa199c62c5bc5e5914d8d4143): remove rms that were needed for previous fetcher
- [b60d8266](https://github.com/quay/clair/commit/b60d8266700903ad06c2ec65842e0f2383d352ab): update dashboard regex
- [4405fdad](https://github.com/quay/clair/commit/4405fdad0274fdfebb2cb0a7e1214cdb36c74ede): simplify openshift/pr_check.sh
- [16bd3666](https://github.com/quay/clair/commit/16bd36669a0274815f6766f78dbb37d05d250646): add grafana dashboards for deletion metrics
### Contrib/Openshfit
- [89af3db1](https://github.com/quay/clair/commit/89af3db111a317abeb1b4c409840aa8f7660dcbf): only start buildkitd container if needed
### Contrib/Openshift
- [ab6e9e07](https://github.com/quay/clair/commit/ab6e9e07dd04130f7bf0b6733071f530cea7769b): login shenanigans
- [002df72b](https://github.com/quay/clair/commit/002df72bfe3ef5f0b89c24f8e6a640a330de0bf5): avoid patching when using upstream images
### Doc
- [244183ee](https://github.com/quay/clair/commit/244183ee2072d48b6bd2eeadd3acebd0f6eb7ffe): fix typo
### Dockerfile
- [f7abfe50](https://github.com/quay/clair/commit/f7abfe50c2ea47a60601d05d9137833b2336b8bd): update with new syntax and features
- [e2fbf199](https://github.com/quay/clair/commit/e2fbf1998bd45c99bc44382798f240d08651dd6c): add `GOTOOLCHAIN`
- [e871998f](https://github.com/quay/clair/commit/e871998fb9cb01153fd307f446c5c71561fafad8): tweak ignores
- [d78d3beb](https://github.com/quay/clair/commit/d78d3beb15fae2204eb7ea86e51474e015ac936f): remove sh loop
### Docs
- [038966e2](https://github.com/quay/clair/commit/038966e2ba65cd88ad85d1828de71b8fc61e7549): add building and Makefile usage sections
- [137b6c50](https://github.com/quay/clair/commit/137b6c50640688b196106e64452620e28f56c8f2): add mention of disk space path and usage
- [1e78f45a](https://github.com/quay/clair/commit/1e78f45a4e213c1d73f5a745b08e30aa94d7f7c8): add OTLP configuration to prose documentation
- [eb54b889](https://github.com/quay/clair/commit/eb54b8896f6fd93bd67d6b6c0875cfff426698d7): add dropins to prose documentation
 -  [#1783](https://github.com/quay/clair/issues/1783)### Documentation
- [80482345](https://github.com/quay/clair/commit/804823453f154b6fb3afa602320443df4621779f): add more information on how to test and get started
### Documentation
- [38b72352](https://github.com/quay/clair/commit/38b723529f11e02d595c3f04dccbc86d600c2932): correct stale configuration options
### Httptransport
- [20582315](https://github.com/quay/clair/commit/205823151a20ab7e2f167042b3a3f6344b3077c0): fix test flake
- [df348dc9](https://github.com/quay/clair/commit/df348dc9b7b2deea92083fb6462e76c12db41493): GET vuln report returns 404 when indexing in-progress
- [e84883f7](https://github.com/quay/clair/commit/e84883f7f6c2c962cbd70e0affa8d229aff58c9d): change api error handling to panic internally
- [c7920962](https://github.com/quay/clair/commit/c79209620b424729ca317631e809b2f1eb6a9448): add metrics test
- [15732398](https://github.com/quay/clair/commit/15732398f24adf20984f187c71ba8edabe4fd1af): add unauthenticated "/robots.txt" endpoint
- [201ed2be](https://github.com/quay/clair/commit/201ed2be9d487773d8878ef894d99f221c6161db): add "robots.txt" endpoint
- [5262f773](https://github.com/quay/clair/commit/5262f773924d56f418175fee5e7fde188bf6fb83): add client-close detection
- [e97f6b3c](https://github.com/quay/clair/commit/e97f6b3cbaf291b45c78f6534833f0d05108954a): use compression middleware
- [0d2bf7e6](https://github.com/quay/clair/commit/0d2bf7e693ccc61043a23c8cc2ff0bfad4bb926d): lints
- [d4b9d30f](https://github.com/quay/clair/commit/d4b9d30fc1083db5ed00f812946bde3d56461db0): rework constructor
- [067bf861](https://github.com/quay/clair/commit/067bf861976632afca16d941f12202b6e71066a5): update DiscoveryHandler to new style
- [7a1186e3](https://github.com/quay/clair/commit/7a1186e31a89cd1bbf7fc086b2dc47bd2a3f7b00): re-instrument handlers with new primitives
- [bddbc57b](https://github.com/quay/clair/commit/bddbc57bad5ed1e933b3fd74e55fa080802dfdee): exit goroutine in error helper
### Httputil
- [1fd77f0d](https://github.com/quay/clair/commit/1fd77f0dcb5cee865e9656365fb9660439a2f28f): add test for non-OK statuses
- [0cde61bf](https://github.com/quay/clair/commit/0cde61bfd5557e90a6e7e59d66fd24db9cc608e8): add response recorder
### Initialize
- [4686fb46](https://github.com/quay/clair/commit/4686fb46c2f7c4050dd80e3d99124201e69b11a3): use defaults for NewRemoteFetcher
### Introspection
- [c31e40e3](https://github.com/quay/clair/commit/c31e40e349827a5d963ca5361cc961cdcf4dc567): lints
- [8e1a7bd8](https://github.com/quay/clair/commit/8e1a7bd8a60179677a96579470d46f3f5934efd2): allow trace shutdown hook full timeout
### Makefile
- [95a765f4](https://github.com/quay/clair/commit/95a765f46b7d31efab121b555bb5d57f2beb00b7): fix direct `go` command
- [a9a8ec98](https://github.com/quay/clair/commit/a9a8ec9896e3c77ce602c3253d8872210cc30618): make `buildctl` usage more convenient
- [2c093d9c](https://github.com/quay/clair/commit/2c093d9c113f7fd51529d60cee8f2a21de648f7e): force line endings for `git archive`
- [f7bfacf1](https://github.com/quay/clair/commit/f7bfacf17a91ec245b1238c959242b17f2d41274): rebuild the make setup
- [7cc2107b](https://github.com/quay/clair/commit/7cc2107b4b2b820c108f793f2a19084fd440f929): updates
### Openshift
- [6bb55a21](https://github.com/quay/clair/commit/6bb55a2128a5184164af4be37b73210f279d9bb3): add backstop cron manifest
- [3615748d](https://github.com/quay/clair/commit/3615748dad2effa94a8def781a2305375354176c): handle multiple Dockerfiles in build script
- [5f36fc12](https://github.com/quay/clair/commit/5f36fc125ebccc6465b445b9b83ec19dbbffdc87): have the pr_check script "dry run" a build
- [3d3c03ce](https://github.com/quay/clair/commit/3d3c03ce5a008b9253553c2c2b7d1746e7632171): add "dry run" flag
- [135af0e0](https://github.com/quay/clair/commit/135af0e02df0f3a3d2a2d1364a0b929e062732a7): make build_and_deploy script shellcheck-clean
### Quaybackstop
- [e5e7ba5a](https://github.com/quay/clair/commit/e5e7ba5a9ed18d984d89b9814e5aa517ae2c3b6f): add backstop GC command
### README
- [abd13784](https://github.com/quay/clair/commit/abd137848bc9fa8300d8a454b20082020c890d47): format nit
### Stomp
- [3de24d71](https://github.com/quay/clair/commit/3de24d7191005449dcc5de9a6c2ba19a6f5b26b0): guard against race in test
### Webhook
- [41cda1fb](https://github.com/quay/clair/commit/41cda1fbb963dfe8f7474dd09f5727dfae6e11ac): move+update debug server

<a name="v4.7.4"></a>
## [v4.7.4] - 2024-05-01
### Build(Deps)
- [3ebd889c](https://github.com/quay/clair/commit/3ebd889cb37603e071ba0d8fb8ba631702b13414): bump peter-evans/create-pull-request from 6.0.0 to 6.0.1
- [b7566a0f](https://github.com/quay/clair/commit/b7566a0feedc5de0227a5bfd6e2921014ec68704): bump peter-evans/create-pull-request from 5.0.2 to 6.0.0
- [4db2f09b](https://github.com/quay/clair/commit/4db2f09be2330e4dc9061dc2e9d44d8979b8c34d): bump actions/cache from 3 to 4
- [6cef8311](https://github.com/quay/clair/commit/6cef8311255b024dd3a1fc0a70f7edf38969906c): bump actions/upload-artifact from 3 to 4
- [5ed80215](https://github.com/quay/clair/commit/5ed80215fa17adb7e72ba3d9267368474afd411e): bump actions/download-artifact from 3 to 4
- [c9e1f56b](https://github.com/quay/clair/commit/c9e1f56b224f25aacd5df861563006520e63297b): bump actions/setup-go from 4 to 5
- [3ab3de55](https://github.com/quay/clair/commit/3ab3de558380fff38b8503de914c1b9c0611c4c8): bump actions/stale from 8 to 9
- [591188f0](https://github.com/quay/clair/commit/591188f0a877b81878209be4b9185d4cb7c404f3): bump docker/setup-buildx-action from 2 to 3
- [7ef6ef6b](https://github.com/quay/clair/commit/7ef6ef6b7587386b80cef9fbe7269b0083c8f039): bump docker/login-action from 2 to 3
- [5597e7cc](https://github.com/quay/clair/commit/5597e7ccb94c113cc8344e8289be886049b23f63): bump docker/build-push-action from 4 to 5
- [14d7f2b4](https://github.com/quay/clair/commit/14d7f2b4927fa9e4debc9005fb6dc620a6a47833): bump docker/setup-qemu-action from 2 to 3
- [1204db98](https://github.com/quay/clair/commit/1204db98853cdfdce7790f3d3276d4617e4e3000): bump actions/checkout from 3 to 4
### Chore
- [4170798b](https://github.com/quay/clair/commit/4170798b6d464be0b8f74b1979785a17ad71dbd0): 4.7.4 changelog bump
- [96dc6074](https://github.com/quay/clair/commit/96dc60748b492df1cb4af3761c9c44c10266ed09): Add merge step when creating release binaries
- [a1c7eb7c](https://github.com/quay/clair/commit/a1c7eb7c8cce687e12fcc056be1acacbdc608a31): update go version for release
- [6eeb9393](https://github.com/quay/clair/commit/6eeb9393b539cf49a10c42e247b833ce7e040607): update claircore to v1.5.27
- [809dd5ab](https://github.com/quay/clair/commit/809dd5ab474994eb9a32599f4257437fde995064): update go version
### Cicd
- [e6378d03](https://github.com/quay/clair/commit/e6378d0333085a072cf73bfa32228af24b710b05): add container version skew check
- [2ba3ecc0](https://github.com/quay/clair/commit/2ba3ecc0a66679dcd82f7015695db5b2a3f0c02a): update testing workflow
- [ae135c49](https://github.com/quay/clair/commit/ae135c4956358d6c18109438b6e59170100787ea): don't upload workspace on failure
- [7222dc88](https://github.com/quay/clair/commit/7222dc88d4fe919cc2b88e2fe7587061a881b794): change version specifiers to be major-version only
### Clairctl
- [2a2ba37f](https://github.com/quay/clair/commit/2a2ba37f6404e377d702e50f78bccd172b08b03f): warn when range requests are not honored
### Dockerfile
- [5547b96a](https://github.com/quay/clair/commit/5547b96aeff795da43fbc6e2dc8ec7b5dda7691d): remove sh loop
### Docs
- [3753415b](https://github.com/quay/clair/commit/3753415b4e2b6bc9b63a940b8b2101d82ab523ef): add mention of disk space path and usage
### Httptransport
- [c6df986f](https://github.com/quay/clair/commit/c6df986fddfe5121b6fd9dbfff0ccca35c55cb71): GET vuln report returns 404 when indexing in-progress
### Initialize
- [9828576a](https://github.com/quay/clair/commit/9828576af20c966e0dbe99bbac68d3e80b07baa1): use defaults for NewRemoteFetcher

<a name="v4.7.3"></a>
## [v4.7.3] - 2024-02-26
### Admin
- [9517c7be](https://github.com/quay/clair/commit/9517c7bed060d575869a2cbaaa5a255d3714a0eb): add a check for compatible migration version
 -  [#1915](https://github.com/quay/clair/issues/1915)- [5d689efb](https://github.com/quay/clair/commit/5d689efb908aaa01290140a0f8b4e022588226dd): add command to update go packages with norm_version
 -  [#1915](https://github.com/quay/clair/issues/1915)### Chore
- [e5a896c9](https://github.com/quay/clair/commit/e5a896c9b939e7e59d92be4f17805f0ed70ea89e): v4.7.3 changelog bump
- [d17ee97b](https://github.com/quay/clair/commit/d17ee97bdccdc46ba25c8c7de151bb84f84236ef): update claircore to v1.5.25
 -  [#1990](https://github.com/quay/clair/issues/1990) -  [#1957](https://github.com/quay/clair/issues/1957) -  [#1942](https://github.com/quay/clair/issues/1942)### Config
- [6ba32131](https://github.com/quay/clair/commit/6ba32131be6a79c4d5d070e666e81bfedcc09798): update minimum TLS version for server
 -  [#1945](https://github.com/quay/clair/issues/1945)
<a name="v4.7.2"></a>
## [v4.7.2] - 2023-10-09
### 'Chore
- [9a3cde3b](https://github.com/quay/clair/commit/9a3cde3b16bb0c0e02fb7e128ff86e255ec6112f): update claircore to v1.5.19
### Admin
- [5a825a07](https://github.com/quay/clair/commit/5a825a07191e62f3214700df519202806a39d6c9): add pre v4.7.3 admin command to create index
### Chore
- [0729ad2a](https://github.com/quay/clair/commit/0729ad2a36721f9fe99196370a9f3cd31fdbd4b7): bump claircore to v1.5.16
### Contrib
- [04f36991](https://github.com/quay/clair/commit/04f36991e19cfb44423cbb2e96ccfcd786dd85c5): add grafana dashboards for deletion metrics
### Docs
- [8a2d99f4](https://github.com/quay/clair/commit/8a2d99f4da70de6bdf14858c6163a2e3b8042782): add dropins to prose documentation
 -  [#1783](https://github.com/quay/clair/issues/1783) -  [#1806](https://github.com/quay/clair/issues/1806)
<a name="v4.7.1"></a>
## [v4.7.1] - 2023-08-10
### Build(Deps)
- [bd4bdbf6](https://github.com/quay/clair/commit/bd4bdbf68c62eb9982e028cafcabd58eb4e91c6c): bump github.com/pyroscope-io/godeltaprof
### Chore
- [25ab0f4e](https://github.com/quay/clair/commit/25ab0f4e01ac08870b6e8fe9cccc134a011a4f4f): bump claircore to v1.5.15
- [4bf37a11](https://github.com/quay/clair/commit/4bf37a11861ca89c56dc94db9b1e002ef3d44265): bump claircore to v1.5.14

<a name="v4.7.0"></a>
## [v4.7.0] - 2023-07-27
### Auto
- [1e574c25](https://github.com/quay/clair/commit/1e574c25a3830b1d2f1b420c9ea2deaaba13a238): enable mutex, blocking profiles by default
### Build(Deps)
- [adee21df](https://github.com/quay/clair/commit/adee21df77903f159ca1b6dc631700d096c42f0f): bump golang.org/x/net from 0.11.0 to 0.12.0
- [32c9ae2e](https://github.com/quay/clair/commit/32c9ae2e81c4ab8a443f50926697a40a6cf9af56): bump github.com/klauspost/compress from 1.16.6 to 1.16.7
### Chore
- [1bfbfa1b](https://github.com/quay/clair/commit/1bfbfa1bcf5489bcc91ad34aef0d4517cc6bb2e4): bump claircore to v1.5.13
- [31cf5570](https://github.com/quay/clair/commit/31cf5570673f8e34a9fd40dfe3e6710cf517da17): Bump claircore to v1.5.12
- [2d2d16a1](https://github.com/quay/clair/commit/2d2d16a15ad90928174d1549d7a17bf24aa285aa): Bump claircore to v1.5.11
- [048ad2f1](https://github.com/quay/clair/commit/048ad2f1dd03197afd3434ef0bec83d1d3dedd1a): Bump claircore to v1.5.10
- [5550b27a](https://github.com/quay/clair/commit/5550b27a89e1004e93d85d6194dbe5132a9c2659): bump Claircore to v1.5.9
- [7df2b863](https://github.com/quay/clair/commit/7df2b86372b18ba9eeb07ffe87f17e80a04e26d4): add pyroscope to compose setup
- [c28648e5](https://github.com/quay/clair/commit/c28648e5ea7336bf6e2a70cb1d3d9dbb6c706b95): Update outdated docs and comment with default update period.
- [a02a0f2f](https://github.com/quay/clair/commit/a02a0f2f0d6315250a083351a584ce11e8a55dcf): remove refs to deprecated io/ioutil
- [44638edf](https://github.com/quay/clair/commit/44638edf5b99ddcc7c73b8313557f200469228d4): Remove dogstatsd variable and references
### Clairctl
- [bccabff1](https://github.com/quay/clair/commit/bccabff1a003a37a35b7976eb1ff3e9fce35e97e): Add post 4.7 admin command to delete pyupio vulns
- [d2b3d826](https://github.com/quay/clair/commit/d2b3d826bba6522e69d214023d16070287b9da15): Scan the pointer to the pointer of the bool
- [05bd8fa0](https://github.com/quay/clair/commit/05bd8fa0382c6527d49627aff70cbfc9dd8ad9e1): Add log line signifying admin is done
- [c636e207](https://github.com/quay/clair/commit/c636e207b3ad3a07512035dc228a5af9c75a12cd): Remove DSN logging
- [89cae779](https://github.com/quay/clair/commit/89cae7796e63749f7b0dd123135d96af6cf91d48): `admin` subcommand
### Cmd
- [8231b438](https://github.com/quay/clair/commit/8231b438bedf60bbfeb3b8ac8bcd384a28f63d5e): version for old gits
 -  [#882](https://github.com/quay/clair/issues/882)### Config
- [83ee24af](https://github.com/quay/clair/commit/83ee24afd2262353dfe41c0f6bec8d64e289c27b): pick a real versioning scheme
### Contrib
- [70d878eb](https://github.com/quay/clair/commit/70d878eb268f17f4f92b1833a634c367e3bacc1b): Add manifest for a Job to run DB jobs
### Docs
- [394efe15](https://github.com/quay/clair/commit/394efe1557b8edd9f01d3d2d7a129bbc91b657ed): Fix up debug tools table
- [a4ec17f6](https://github.com/quay/clair/commit/a4ec17f618708480613c94bedfced910ae892d76): Add description of debugging services available during local-dev
### Httptransport
- [86f7a86a](https://github.com/quay/clair/commit/86f7a86aaa45f6bb6b9f8422678996a69b2f64ef): add request ID to profiler labels
### Introspection
- [caba76e1](https://github.com/quay/clair/commit/caba76e1329660c1c136130e5619626c308e514f): add delta pprof endpoints

<a name="v4.7.0-rc.1"></a>
## [v4.7.0-rc.1] - 2023-06-26
### Airgap
- [94757c7d](https://github.com/quay/clair/commit/94757c7d8cda907902d1020a5c2fe74b2e5ccba9): Remove libindex Airgap option
### All
- [5d30ed66](https://github.com/quay/clair/commit/5d30ed66f5d80dcfa47a850b69f01ed281074271): update to new config module
### Build(Deps)
- [00a4279d](https://github.com/quay/clair/commit/00a4279d3796097a3ac0474836c35a5dea94efd9): bump github.com/prometheus/client_golang
- [f4f22e33](https://github.com/quay/clair/commit/f4f22e33a9da565d89d37888c87247529d65d08d): bump golang.org/x/net from 0.10.0 to 0.11.0
- [36a7c88c](https://github.com/quay/clair/commit/36a7c88c9a777de33b08c61168827a0a1f4c5241): bump github.com/klauspost/compress from 1.16.5 to 1.16.6
- [17cdc922](https://github.com/quay/clair/commit/17cdc92270670c2b29d2df22c7f504b6d374254c): bump peter-evans/create-pull-request from 5.0.1 to 5.0.2
- [b95be229](https://github.com/quay/clair/commit/b95be2296ef34e657b458a6a621a4206e31c033e): bump github.com/streadway/amqp from 1.0.0 to 1.1.0
- [45f808da](https://github.com/quay/clair/commit/45f808dac09fd1ccd8e899de131dcf884554a0a5): bump github.com/urfave/cli/v2 from 2.25.5 to 2.25.7
- [b75a00c3](https://github.com/quay/clair/commit/b75a00c30ad255f3d04c59233d03c4a81133e842): bump github.com/urfave/cli/v2 from 2.25.3 to 2.25.5
- [22a75603](https://github.com/quay/clair/commit/22a756036c818026a82f25b9598c61c9802694c9): bump github.com/google/go-containerregistry
- [300b1374](https://github.com/quay/clair/commit/300b13743f868e6578a3a55634e090ee60f7d53a): bump go.opentelemetry.io/otel/exporters/jaeger
- [b2d7a091](https://github.com/quay/clair/commit/b2d7a091bde14b7b7f43a2ab073210ee284889c0): bump github.com/urfave/cli/v2 from 2.3.0 to 2.25.3
- [a21fb21d](https://github.com/quay/clair/commit/a21fb21d39dbdc727324e68a7b4a7afa63199278): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [b188cba7](https://github.com/quay/clair/commit/b188cba75dbef66fcd5994aaf6e49fc4955228f6): bump github.com/quay/claircore from 1.5.2 to 1.5.3
- [eb9d1225](https://github.com/quay/clair/commit/eb9d12256205d230a0c6f4c249eba459a4249c1d): bump golang.org/x/sync from 0.1.0 to 0.2.0
- [f35c832f](https://github.com/quay/clair/commit/f35c832ff59f0090e6e9c01c34594f2e8acef86d): bump golang.org/x/net from 0.9.0 to 0.10.0
- [3dbbaf7b](https://github.com/quay/clair/commit/3dbbaf7bcd87a75fb65c2d9b59f1ba34d7ed14a7): bump github.com/rs/zerolog from 1.29.0 to 1.29.1
- [1ee7cb8a](https://github.com/quay/clair/commit/1ee7cb8aadb4f898bb190543e6d05cc27d3f8097): bump go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace
- [dcb7a05a](https://github.com/quay/clair/commit/dcb7a05a245990b4c61dcb2df9d60c5437493e8e): bump go.opentelemetry.io/otel/exporters/jaeger
- [fca257d7](https://github.com/quay/clair/commit/fca257d7d55d91d4798f078f94e86460ce95c7cf): bump go.opentelemetry.io/otel/exporters/stdout/stdouttrace
- [933cc5c7](https://github.com/quay/clair/commit/933cc5c788782971b1841753b619c330ccd449b8): bump github.com/ugorji/go/codec from 1.2.9 to 1.2.11
- [4f39b319](https://github.com/quay/clair/commit/4f39b319ccc910ee78aae5a8a7818621dfa4bfc4): bump github.com/klauspost/compress from 1.16.4 to 1.16.5
- [3643f9d2](https://github.com/quay/clair/commit/3643f9d27c6a10a09760383956c8e1c7d3eab4c4): bump go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp
- [c13eaecc](https://github.com/quay/clair/commit/c13eaecc738240c1df5d77767ee6eab71c8d9c21): bump go.opentelemetry.io/otel/trace from 1.11.0 to 1.15.1
- [43e3daea](https://github.com/quay/clair/commit/43e3daea1d0473d2263f42ba88ef3144a30307e8): bump github.com/jackc/pgx/v4 from 4.18.0 to 4.18.1
- [2180bc40](https://github.com/quay/clair/commit/2180bc4071915f9c5f1f52c4036063a7d0ec297b): bump gopkg.in/square/go-jose.v2 from 2.5.1 to 2.6.0
- [f669244a](https://github.com/quay/clair/commit/f669244a80a1743b82f565281b96fd211d8241e8): bump peter-evans/create-pull-request from 5.0.0 to 5.0.1
- [74bc404f](https://github.com/quay/clair/commit/74bc404fbc2dc6f0dac55780e8df75fc4ce8bd6f): bump peter-evans/create-pull-request from 4.2.4 to 5.0.0
- [912c6e47](https://github.com/quay/clair/commit/912c6e47e3e09197ee8f962fc1e25b18851b14ac): bump actions/stale from 7 to 8
- [ddec3b43](https://github.com/quay/clair/commit/ddec3b437fc08f7144ddeee272cd24d99af789dd): bump peter-evans/create-pull-request from 4.2.3 to 4.2.4
- [f35a3611](https://github.com/quay/clair/commit/f35a361187b5ce9b9e5e63b311343d7847183847): bump actions/setup-go from 3 to 4
- [d3655eef](https://github.com/quay/clair/commit/d3655eefb8332a02503d534d34258fcb1188433a): bump golang.org/x/net from 0.5.0 to 0.7.0
- [854a2fbf](https://github.com/quay/clair/commit/854a2fbf120a2bcc14a0a2c0072a033ff90873eb): bump docker/build-push-action from 3 to 4
### Chore
- [9d58dba8](https://github.com/quay/clair/commit/9d58dba8890b49cae279274d3bd11ab1bc83b55f): v4.7.0-rc.1 changelog bump
- [31823df2](https://github.com/quay/clair/commit/31823df20228404dea72417262709905308d3314): bump Claircore to v1.5.8
- [836c0579](https://github.com/quay/clair/commit/836c0579450d1648c74b69de4005e91dcfa2cbe1): bump Claircore to v1.5.7
- [e688e88b](https://github.com/quay/clair/commit/e688e88b6dd64549a5b93da242bc13235ab2236a): bump Claircore to v1.5.6
- [3d61485d](https://github.com/quay/clair/commit/3d61485d00aa5c5d4eb172f3e0db40403096d7e4): bump Claircore to v1.5.5
- [ddc4cc24](https://github.com/quay/clair/commit/ddc4cc24d9d5751c58e27c4b16aa50b7405c05cd): bump Claircore to v1.5.4
- [76686650](https://github.com/quay/clair/commit/7668665029a5f9e030b17abee0862194b905be1f): Add the osv updater to the local-dev config
- [56e63e8b](https://github.com/quay/clair/commit/56e63e8b7566b56b5a5c85847a190ec2ea5570e8): Update opentelemetry to v1.16.0
- [5df81b19](https://github.com/quay/clair/commit/5df81b1953121cca97e1afec2527f35c84021632): bump Claircore to v1.5.2
- [cc0d9df4](https://github.com/quay/clair/commit/cc0d9df4038a0d4f59312f6649e75fb9b0377dd7): bump Claircore to v1.5.1
- [35971dc9](https://github.com/quay/clair/commit/35971dc9b33d873950c9e95055f6b0ffd84650a4): produce nightly for ppc64le
- [471da4ee](https://github.com/quay/clair/commit/471da4eeb96492a113b7c6f3c48ab47cb21b2a26): Only ask dependabot to care about direct dependencies
- [62119209](https://github.com/quay/clair/commit/62119209db607dce8456782067d885d1e7af43fd): updated nightly for s390x support
- [57774bd9](https://github.com/quay/clair/commit/57774bd943cd2ec3ce564325e1de2277a1722999): added s390x support
- [248a4733](https://github.com/quay/clair/commit/248a4733789c2bf2b0e51b81cc9b3ec00fd9b052): move emulator tests to a nightly run
- [bd0488ee](https://github.com/quay/clair/commit/bd0488eed8da465cc0fbca8b1c04f5a992dd07ea): add gomod ecosystems to dependabot
- [8174e950](https://github.com/quay/clair/commit/8174e950186c03bee10a9174643bca0f173710c2): Remove 1.19
- [efe27892](https://github.com/quay/clair/commit/efe27892afe6519f2676813d18f3a3d662e52009): Bump Claircore to v1.4.22
- [1b857d13](https://github.com/quay/clair/commit/1b857d139305ebf91dd2f53865e5e97ba5e346eb): Update go version in go.mod
- [5faf0fc9](https://github.com/quay/clair/commit/5faf0fc9edba86cef87bff4e9941fd2a93a2889a): Bump Claircore to v1.4.21
- [a433c93c](https://github.com/quay/clair/commit/a433c93c349f63e7b8cc6f4d5a95a2394fe1dd31): Bump Claircore to v1.4.20
- [d565775c](https://github.com/quay/clair/commit/d565775c190a4262ce049cb06a9c1842c42e00b8): Add back GIT_HASH as needed for image name
- [12f38e45](https://github.com/quay/clair/commit/12f38e45cec579f92438059702884fa4284bb93c): Update go-image version in docker-compose manifest
- [02f311d5](https://github.com/quay/clair/commit/02f311d56de5fb482742f3708cdae0d0e08cbf2c): Use our dedicated metric for the go version
- [896b2dfb](https://github.com/quay/clair/commit/896b2dfb77cdd4c06b4edd038c4833b8cfacd092): Update go version in Dockerfile
- [d10c06e0](https://github.com/quay/clair/commit/d10c06e086f9c69075d5faef14e2eba021d201a9): Bump claircore to v1.4.18
### Cicd
- [58c26f4a](https://github.com/quay/clair/commit/58c26f4a2d8f4df9efebfade7f785b4613a15683): don't checkout source on clairctl builds
- [2eb10895](https://github.com/quay/clair/commit/2eb10895a4946c68528db6bd1e54ff8004b16426): use common workflow in main module CI
- [83d9b2f5](https://github.com/quay/clair/commit/83d9b2f50c8157506a3440ae51c063f4ebd5e3ed): use common workflow in config module CI
- [e2f264f4](https://github.com/quay/clair/commit/e2f264f4aac85df33cb2c0a9db88a25ad65072ad): fix nightly connection strings
- [1ea95d83](https://github.com/quay/clair/commit/1ea95d838b028dd8c22a6a6487a5f5961e231fd3): rename yamllint config
- [7e2ae8fc](https://github.com/quay/clair/commit/7e2ae8fc43709eb09220ea9085f9ff7a6f4fe40e): fix nightly-ci error
- [1267335e](https://github.com/quay/clair/commit/1267335e515cddfcc07af49955c97bb05a3b042e): use rabbitmq as STOMP broker in nightly CI
- [2edb4915](https://github.com/quay/clair/commit/2edb491524f701c3d15c752bac3bf5bbac574272): use rabbitmq as STOMP broker in tests
- [74c34c0c](https://github.com/quay/clair/commit/74c34c0cc16f60b8b20d213d14dc3e37f846756c): update nightly job to work
- [30a98697](https://github.com/quay/clair/commit/30a98697e42069c5faa2f115464226f6575b456b): update go versions
### Clair
- [5226d2a3](https://github.com/quay/clair/commit/5226d2a310145ce86ade6e805d280e6b058dbe03): use new `cmd.LoadConfig`
### Clairctl
- [06f5bc05](https://github.com/quay/clair/commit/06f5bc0515ce49096b8236291bbfa2a0143a293f): use new `cmd.LoadConfig`
### Cmd
- [3ff924ad](https://github.com/quay/clair/commit/3ff924ad2f6e0461ed5bfe5440887c1f53790f3d): implement modular configs
- [d3e88775](https://github.com/quay/clair/commit/d3e887750a0617b0f8387ed5c15f39ffe175bedb): better version information
### Config
- [cee776b3](https://github.com/quay/clair/commit/cee776b3830e60d3ec8ccd6703363e9c1f2ae56d): add newtype for Durations
- [1ebbbf24](https://github.com/quay/clair/commit/1ebbbf24c573ddb241b22fae6f5ea6c45482b015): add some omitempty tags
- [3b6047ca](https://github.com/quay/clair/commit/3b6047ca80de3be3b71d89d4471b1ea2382ef76f): update module to remove x/sys dependency
### Contrib
- [bb3a4be5](https://github.com/quay/clair/commit/bb3a4be513bf7fcc390a0fa7baaba9bcd8bbe5bc): Better versioning when building the service image
- [8566c525](https://github.com/quay/clair/commit/8566c525cccda9eb8aebb5d4980754fd649fca1f): Add a dashboard panel to surface running versions
### Docker-Compose
- [bb777399](https://github.com/quay/clair/commit/bb77739996f7df185dd3b5da70bef6227cf6cf7e): use rabbitmq instead of activemq
### Dockerfile
- [497ab2d2](https://github.com/quay/clair/commit/497ab2d2cae0beea8ef41aeb0878742e8a69d4f1): remove init process
### Docs
- [45e6f5c0](https://github.com/quay/clair/commit/45e6f5c0b6d535a134c07a18154528f3dcf00e9c): update old `go get` command
- [d2d9f385](https://github.com/quay/clair/commit/d2d9f38548ea5d3b2477d095a4d11a2a773200bc): fix host flag order
 -  [#1754](https://github.com/quay/clair/issues/1754)- [d726e157](https://github.com/quay/clair/commit/d726e15796882e6f2adba6a84a0aef419bc59849): remove reference to "filters"
 -  [#1690](https://github.com/quay/clair/issues/1690)### Go.Mod
- [670376a2](https://github.com/quay/clair/commit/670376a29dad524e8ebea8f2acd22220053e6ec9): update json (de)serializer
### Httptransport
- [72417962](https://github.com/quay/clair/commit/72417962880862b986872709317a39fa0582f143): debug log calls to apiError
- [378a4b5f](https://github.com/quay/clair/commit/378a4b5f35ceb452654e7d9dca12fc455ac1697c): fix request_id logging
### Httputil
- [b18f989c](https://github.com/quay/clair/commit/b18f989c7869a480b7bbfc8181d515227e701a39): fix ParseIP usage
 -  [#1689](https://github.com/quay/clair/issues/1689)### Notifier
- [5446e49f](https://github.com/quay/clair/commit/5446e49ff9de13a0d95ce5937f1ce722e59304f5): Avoid double reference
### Stomp
- [5b876935](https://github.com/quay/clair/commit/5b87693500fcd9222426e62f6bc86bd7736159e1): override default behavior for "host" header
- [643bd1c9](https://github.com/quay/clair/commit/643bd1c957d6755b7fe0f4fb762d31071274dd2a): rework tests
- [f84e3491](https://github.com/quay/clair/commit/f84e3491966e88bdc337f98029c0c8a1de0267d5): plumb Context into Dialer
- [7d476ebd](https://github.com/quay/clair/commit/7d476ebd90bd05a52f4ab2a64711a312972d2abe): remove apparent ActiveMQ-ism
- [aa441b3c](https://github.com/quay/clair/commit/aa441b3cffb3109fcb2a717caec059027042dd76): switch to module release for stomp client
 -  [#1739](https://github.com/quay/clair/issues/1739)### Updater
- [95970e28](https://github.com/quay/clair/commit/95970e283b0fc37f56cf2f93e27a801c0b03b809): Extend default updater time to 6 hours

<a name="v4.6.1"></a>
## [v4.6.1] - 2023-04-13
### Airgap
- [e02aba27](https://github.com/quay/clair/commit/e02aba27de01cb461f79bee9644aac80c2f9bd65): Remove libindex Airgap option
### Chore
- [36990912](https://github.com/quay/clair/commit/36990912450fba2ccbef260a4829f1d9f69f45c6): v4.6.1 changelog bump
- [e676671c](https://github.com/quay/clair/commit/e676671c17d2612470cd8de05aa668312fbb3036): Bump Claircore to v1.4.21
### Go.Mod
- [36de97cc](https://github.com/quay/clair/commit/36de97ccf619113b1ef4dff6bfd0e0c692252544): update json (de)serializer
### Httptransport
- [922f33d1](https://github.com/quay/clair/commit/922f33d18919578049fbf2ccb756e6990b66f280): fix request_id logging
### Httputil
- [9e8eacf5](https://github.com/quay/clair/commit/9e8eacf51b2a45f967036396b3dc14a52edc480d): fix ParseIP usage
 -  [#1689](https://github.com/quay/clair/issues/1689)### Notifier
- [ffa4556d](https://github.com/quay/clair/commit/ffa4556d0f251cc984ed34594356625b9b747744): Avoid double reference

<a name="v4.6.0"></a>
## [v4.6.0] - 2023-01-20
### All
- [577a55d4](https://github.com/quay/clair/commit/577a55d44d0ec337178680ec1ad6f0862a0c2482): use httputil to construct requests
### Auto
- [1f1010fe](https://github.com/quay/clair/commit/1f1010fe4ff81ed954ce9e680a7228742d41f533): add automatic memory limit discovery
### Build(Deps)
- [ef896eb6](https://github.com/quay/clair/commit/ef896eb62d4e5fd286213d8208105de92b28dadc): bump actions/stale from 6 to 7
- [5a212ffe](https://github.com/quay/clair/commit/5a212ffed49b0f652d5f742400eb040b71dde16f): bump peter-evans/create-pull-request from 4.1.4 to 4.2.3
- [b883bc2b](https://github.com/quay/clair/commit/b883bc2b9174618abd156e61037517a9f379020f): bump gsactions/commit-message-checker from 1 to 2
### Chore
- [5fd26563](https://github.com/quay/clair/commit/5fd265634d162dc0acba6c28e36d35dd0a90aec0): v4.6.0 changelog bump
- [33f4fcbd](https://github.com/quay/clair/commit/33f4fcbdd0d80c9aa6878a0bdb6b1bd3332db823): Bump claircore to v1.4.17
- [54d44908](https://github.com/quay/clair/commit/54d449081e29a456ed533bd2d1f189b7f4bc1b39): Bump Claircore to v1.4.16
- [430e6087](https://github.com/quay/clair/commit/430e6087b6f245dc2cc95ef36836bedc9e458748): Bump Claircore to v1.4.15
- [652d8ce6](https://github.com/quay/clair/commit/652d8ce6d5d627ba63e2aaf8f22991e1cc2fc5b4): Bump Claircore to v1.4.14
- [9f6828cd](https://github.com/quay/clair/commit/9f6828cd36dce5033a68c641585c2f0b93edec87): Update to Go 1.18 for local-dev
- [1c002bcd](https://github.com/quay/clair/commit/1c002bcda7e604e083de6f576d1a8801dceac44a): added ppc64le support
- [4b37dcdf](https://github.com/quay/clair/commit/4b37dcdfcd0c89ff0be26ffd3e9dfbb9d15229df): Bump Claircore to v1.4.13
- [9b273420](https://github.com/quay/clair/commit/9b273420c9aa0bd1975d925e5d38f8d852a58851): Bump claircore to v1.4.12
### Cicd
- [1dfb42a0](https://github.com/quay/clair/commit/1dfb42a09a25d7298ee2c343893dcc2c25d3f830): use extracted git archive
- [aff17a4a](https://github.com/quay/clair/commit/aff17a4a3e2c9288baa69a1b9bee0b2e6318d276): update usage of `set-output`
- [a8a97f80](https://github.com/quay/clair/commit/a8a97f80632c1c88711b7729a2d3bb726cdf9cbf): update cache action
- [7de63a9c](https://github.com/quay/clair/commit/7de63a9c01f1f3990b5c8d91ee3bf486418f0ff0): add tests for odd architectures
- [e923360c](https://github.com/quay/clair/commit/e923360cb2124e20da6646d02e94b5e9541b6653): omit Dockerfile build args
- [14b8f690](https://github.com/quay/clair/commit/14b8f6906a08529e93fa563c5567311154e58b1b): enable go1.19
- [5a8128c1](https://github.com/quay/clair/commit/5a8128c1241a9e48a8b84c290405993e12e6d776): inject version into built `clairctl` binaries
 -  [#1649](https://github.com/quay/clair/issues/1649)### Clairctl
- [a367a7ae](https://github.com/quay/clair/commit/a367a7ae9b59fee5a5b102f4da89a1f5bc732e0a): use a better user-agent
- [3b9ff6de](https://github.com/quay/clair/commit/3b9ff6de75b27d6a3ce593212850f294942b8be0): update with new signer
### Client
- [ddea858f](https://github.com/quay/clair/commit/ddea858f16e990eca838edbb8fe59560cb63bcdc): Add the passed host to the signer
- [adbaa567](https://github.com/quay/clair/commit/adbaa567fb9e9d271c406f47c76218d301e1cdc9): use signer
- [d8ad1ba4](https://github.com/quay/clair/commit/d8ad1ba475fd0a40f592c3b3618a9b1d16295171): update for httputil changes
### Cmd
- [8b899803](https://github.com/quay/clair/commit/8b8998034ceded096a761b99ff0a1f5a79f0a7b6): use git-archive for version information
### Documentation
- [9d1a7aab](https://github.com/quay/clair/commit/9d1a7aab465664bb70ea3672aed70e8193c6e4d0): fix typo in link
### Httptransport
- [25ac033f](https://github.com/quay/clair/commit/25ac033f67e2e1d39edd8ebf85b3bf61f751e433): use new signer scheme in test
- [a9228d40](https://github.com/quay/clair/commit/a9228d40cb4bfc210148b2f931f7f287515bfa5e): add a `request_id` to logs
 -  [#1547](https://github.com/quay/clair/issues/1547)### Httputil
- [e746ff05](https://github.com/quay/clair/commit/e746ff056193606b8a20a240a098ef1309311e2d): rework request signing and request restriction
### Service
- [e08f3972](https://github.com/quay/clair/commit/e08f3972393d8d9a23b9fec79e9beee11fc5933a): add signer option
### Webhook
- [d99f7005](https://github.com/quay/clair/commit/d99f7005bc48724d1da804a47a4099e7eedce252): add explicit signer argument

<a name="v4.5.1"></a>
## [v4.5.1] - 2022-11-22
### Chore
- [0a0aa1cc](https://github.com/quay/clair/commit/0a0aa1cca3937cec42649bf171d2e1436c9bd792): Bump claircore to v1.4.12
 -  [#1646](https://github.com/quay/clair/issues/1646)
<a name="v4.5.0"></a>
## [v4.5.0] - 2022-11-04
### Build(Deps)
- [df77d75a](https://github.com/quay/clair/commit/df77d75a9850ebc2120f3c0a6162d246a7847ce0): bump peter-evans/create-pull-request from 4.1.3 to 4.1.4
### Chore
- [e0aec666](https://github.com/quay/clair/commit/e0aec666625ab4b5f1b3ddc35ff0fc75aa578e8c): Remove windows 386 as a binary target for releases
- [0772b85f](https://github.com/quay/clair/commit/0772b85feaab5928e3f1d5352c6c7c17cef3e782): v4.5.0 changelog bump
- [070a611a](https://github.com/quay/clair/commit/070a611a2dadcb8cf16c57c40479db4d028c0d03): Bump Claircore to v1.4.11
- [5ff4805a](https://github.com/quay/clair/commit/5ff4805a3294313e38e540664ba7a7f9732876b4): Bump Claircore to v1.4.10
- [08ad0697](https://github.com/quay/clair/commit/08ad06979051308d3d7cbc07d751977cf48d6a9e): Bump Claircore to v1.4.9
- [731c16f7](https://github.com/quay/clair/commit/731c16f70b7938df46b0f3ca6e431377982da4e9): bump Claircore to v1.4.8
### Clairctl
- [e431960e](https://github.com/quay/clair/commit/e431960e87fc6a8f2c257b1bda860c242a6c713b): Add delete command
- [66325b12](https://github.com/quay/clair/commit/66325b12a329a0517e453aa0a2658b9c263335d1): don't use internal client
### Cmd
- [9b0f1a96](https://github.com/quay/clair/commit/9b0f1a962585761065b7adb0d18191f911c93ed3): unify version information

<a name="v4.5.0-rc.0"></a>
## [v4.5.0-rc.0] - 2022-10-10
### All
- [1a1d5662](https://github.com/quay/clair/commit/1a1d566249aa4be93c60e1af773ced0a8d227fb2): remove Quay keyserver support
### Build(Deps)
- [224d0698](https://github.com/quay/clair/commit/224d06988b6196ef6617ae807abb652a0580c0dc): bump actions/stale from 5 to 6
- [180b887c](https://github.com/quay/clair/commit/180b887c8748e3367e962fa78551d526b79de378): bump peter-evans/create-pull-request from 4.1.2 to 4.1.3
- [0537bbc0](https://github.com/quay/clair/commit/0537bbc06eeb1a050530a62ac263a4a60bd298c4): bump peter-evans/create-pull-request from 4.1.1 to 4.1.2
- [47a9c1cb](https://github.com/quay/clair/commit/47a9c1cb108872a6d30fe36328b2bf9126f9b13d): bump peter-evans/create-pull-request from 4.0.4 to 4.1.1
- [3cad3319](https://github.com/quay/clair/commit/3cad331970a3d1a9c8093f62087e63d48859a7b3): bump peter-evans/create-pull-request from 4.0.3 to 4.0.4
- [c5975257](https://github.com/quay/clair/commit/c597525708138d390041a4d72ed9de9f43ec28c5): bump peter-evans/create-pull-request from 4.0.2 to 4.0.3
- [57dc2378](https://github.com/quay/clair/commit/57dc23781da8328410be551090a92aec99dbd41e): bump docker/setup-qemu-action from 1 to 2
- [c4e2031b](https://github.com/quay/clair/commit/c4e2031b36dea93fbe8078bff093c0525d32da6e): bump docker/login-action from 1 to 2
- [a9823a91](https://github.com/quay/clair/commit/a9823a9107234e7c51f2daf0824ed0e35bd4939b): bump docker/setup-buildx-action from 1 to 2
- [7c8bafbe](https://github.com/quay/clair/commit/7c8bafbe9b9b021da81055d98f95106649cf6d48): bump docker/build-push-action from 2 to 3
- [4408b1bb](https://github.com/quay/clair/commit/4408b1bb39d8c443509872dd54dd959bc5a11ac5): bump actions/download-artifact from 2 to 3
- [4c91a714](https://github.com/quay/clair/commit/4c91a714cd1fa86a20e8d40fcbe8a344e3b94e72): bump actions/setup-go from 2 to 3
- [64389db0](https://github.com/quay/clair/commit/64389db059ed0a3dbba6d0599272961ab88adb7a): bump actions/upload-artifact from 2 to 3
- [1db22a62](https://github.com/quay/clair/commit/1db22a62b0569c96772a3b6785ca007454e063fd): bump peter-evans/create-pull-request from 4.0.1 to 4.0.2
- [c0953e6f](https://github.com/quay/clair/commit/c0953e6f15ef83d2af317ae7a1cd40d37336446e): bump actions/stale from 4 to 5
- [53e944f9](https://github.com/quay/clair/commit/53e944f9f2321330d1ed8172365892bf461b0eb3): bump peter-evans/create-pull-request from 3.14.0 to 4.0.1
- [c76efaee](https://github.com/quay/clair/commit/c76efaee8d97a5820d2ba0b3668ad3ccd10fbe02): bump actions/cache from 2 to 3
### CRDA
- [4bb2d332](https://github.com/quay/clair/commit/4bb2d33291f652961a4f4d2da8e5e297df4d19ee): replace API key request form URL
### Chore
- [4d4c425b](https://github.com/quay/clair/commit/4d4c425b25996a7d0834307fc908090ecbbe805b): Bump claircore to v1.4.4
### Chore
- [aae2d839](https://github.com/quay/clair/commit/aae2d839fbc36996e97ab1d93fca00c70d2278c6): v4.5.0-rc.0 changelog bump
- [95073d0b](https://github.com/quay/clair/commit/95073d0bdff80f74a055bb8cbc4ebf01d6c800a0): Bump claircore to v1.4.7
- [415b2a17](https://github.com/quay/clair/commit/415b2a17bc71064a4db47d622b378c345ca5a4ed): Add back Publish Binaries to upload clairctl versions
- [c9041efa](https://github.com/quay/clair/commit/c9041efaf9aa0b8082bc06e400d31767285e5c20): bump Claircore to v1.4.6
- [039d2073](https://github.com/quay/clair/commit/039d2073b21fd8d1ba52d26f14884c56d620df30): bump Claircore to v1.4.5
- [4e44f7ef](https://github.com/quay/clair/commit/4e44f7efd1ae880b6edf0b7145c271619d10cb03): bump claircore v1.4.2 -> v1.4.3
- [e2b8e101](https://github.com/quay/clair/commit/e2b8e10152744ff245469be83c75f1a794648584): Bump claircore v1.4.1 -> 1.4.2
- [3273a969](https://github.com/quay/clair/commit/3273a96981b007d8c4e271aec0371cb7e4f45baf): bump claircore to v1.3.2
### Ci
- [45443c8e](https://github.com/quay/clair/commit/45443c8ead5ad369987b33ec8a0b28ec0544d9c3): fix prerelease conditional
- [eea6fea1](https://github.com/quay/clair/commit/eea6fea1966b4d599e8eb900150c2b90bff47e37): fix config tidy check
- [4180d787](https://github.com/quay/clair/commit/4180d78769579b28534a45a78a96a7b7bb09eaa1): update workflows and machinery for go1.18
### Clair
- [b8882f9d](https://github.com/quay/clair/commit/b8882f9ddb1d3801fdbb47705a68640cfd819aab): better argument error messages
 -  [#1605](https://github.com/quay/clair/issues/1605)### Clairctl
- [f0d6a357](https://github.com/quay/clair/commit/f0d6a35763d5589f17c1a40dca5e155188a79b1e): fix error reporting for streaming responses
### Config
- [677a3137](https://github.com/quay/clair/commit/677a3137e27c55f802a8d7d6fd6c7a7ce7587f9b): Don't use flag default combo
- [f0e077e0](https://github.com/quay/clair/commit/f0e077e0cd79d7a71314a4b87e5cb1d14549efa8): add "omitempty" tags everywhere
- [f1bb53ea](https://github.com/quay/clair/commit/f1bb53ea2b5e03385cf59c941b185baf6df16f8b): implement TextMarshaler for LogLevel
- [6a99b61a](https://github.com/quay/clair/commit/6a99b61ab5fed89f018ab3c707c52a6aca15add0): add top-level docs
### Contrib
- [9612ee67](https://github.com/quay/clair/commit/9612ee675ce9ce5db35c596c82a27057e322099e): remove rpmscanner files on startup
- [a6609638](https://github.com/quay/clair/commit/a660963897dbf9cf7097acfade26e45fd8276154): First wipe anything that might be left before starting clair indexers
- [6a6fd901](https://github.com/quay/clair/commit/6a6fd90151d454b7288d0144dc855974969b2c26): fix DB connection charts
- [6b60eef6](https://github.com/quay/clair/commit/6b60eef6bcf91d9f809ad00928196bfd802db897): Only count index report creation latency for successful requests
- [17862ae3](https://github.com/quay/clair/commit/17862ae3775cfa8b085856455614d3799bef36f7): Add DB connections to Grafana dashboard
- [37ca1ab0](https://github.com/quay/clair/commit/37ca1ab04958c4c474c05b24b62d0172747ad9d7): Add dedicated serviceAccount
- [1d89c032](https://github.com/quay/clair/commit/1d89c032aac54789241a82491c97496be403ec30): Wipe all the temporary files in the process of being fetched
- [187764a3](https://github.com/quay/clair/commit/187764a3c7859d86906b34023a9f8658d25390ea): Wipe all the contents of /tmp on container start
- [ae7675af](https://github.com/quay/clair/commit/ae7675af1e68c4e5cf2301480b7a3b99ae6faf89): Use the readyz endpoint in startup probes
 - Fixes [#1488](https://github.com/quay/clair/issues/1488)### Docker-Compose
- [dfd68db8](https://github.com/quay/clair/commit/dfd68db8df6ebe61b20888858fadf3b2fab27e5b): remove -mod=vendor flag
### Dockerfile
- [e689241b](https://github.com/quay/clair/commit/e689241b16f07e79257a2b3264ff5cb730388d8d): strip binaries to reduce size
- [2af2a7f6](https://github.com/quay/clair/commit/2af2a7f617cf49ba2cd2588d5583479743f3d8c5): fix build with newer ubi8/ubi-minimal image
- [f2e209c6](https://github.com/quay/clair/commit/f2e209c62acd6d2a728ac59dbbcc3ce734962310): update for 1.18, add trimpath
### Docs
- [369319cd](https://github.com/quay/clair/commit/369319cd1ebabaf86fa5e029a0f23724434faed5): note tested `docker-compose` version
### Documentation
- [9258a313](https://github.com/quay/clair/commit/9258a313a95086148e5c0efe293ed7c5a686dbec): add config reference cross-checking
- [9a74ac8f](https://github.com/quay/clair/commit/9a74ac8f4f1e0606e1830e881b52ae2ab4331d92): add notes on metrics
- [d09b3192](https://github.com/quay/clair/commit/d09b3192a4a8fec2a54c6d89594f17d3694c9b33): add link checker
### Go.Mod
- [d583395e](https://github.com/quay/clair/commit/d583395ec2a03655f44c8eea7e1052e04d6ff889): update claircore version
- [12b676d4](https://github.com/quay/clair/commit/12b676d4862a97629acf5bc501189da9728d690d): patch update dependencies
- [e1833161](https://github.com/quay/clair/commit/e1833161315d45484f433fdb3a3692a9a617f3bd): update claircore version
- [65dcc39c](https://github.com/quay/clair/commit/65dcc39c688ab14cc8330ef05eef77b445d6ecd9): update minimum go version
### Httptransport
- [f34148ad](https://github.com/quay/clair/commit/f34148adb89922c4035840cf81018392953f209b): update discovery endpoint
- [88149118](https://github.com/quay/clair/commit/88149118a5f0ee212a069938a7a3031aa8725fde): use less-verbose instrumentation construction
- [51119521](https://github.com/quay/clair/commit/5111952106e614c671171f872dcaf7627adf908b): update notification endpoints
 -  [#1523](https://github.com/quay/clair/issues/1523)- [fa49078d](https://github.com/quay/clair/commit/fa49078db0cabae7fbdab0e725752b8de93bc714): fix test log panic
- [19fa0aa8](https://github.com/quay/clair/commit/19fa0aa8af90288542b9cf65fea08b91f3c106bb): Refactor Matcher to align with indexer
- [ce462ea4](https://github.com/quay/clair/commit/ce462ea41a81be2c13f9a4a85847b7f93570db48): handle no notifier in "combo" mode
### Indexer
- [8e5d76d3](https://github.com/quay/clair/commit/8e5d76d3926c748caaf34e7d722b58502c5a5813): Return 4XX status code when Index() returns tarfs.ErrBadFormat
### Introspection
- [f4db2610](https://github.com/quay/clair/commit/f4db2610af02f6b933cddfeb71f271d58e412a8a): allow custom health function
### Logging
- [5c5a1ab4](https://github.com/quay/clair/commit/5c5a1ab496ea07c38a885b260dea14aa952f08b9): log when request is rate-limited
### Matcher
- [e5cb6a91](https://github.com/quay/clair/commit/e5cb6a91484254ab647989ab7761ae4d0f85a5f4): Update matcher client to match server definition
### Metrics
- [e1664659](https://github.com/quay/clair/commit/e1664659909ddfac0fca48b4995d2b772ebd085b): Spread clair_http_indexerv1_request_duration buckets
### Prometheus
- [b6ce5043](https://github.com/quay/clair/commit/b6ce504373675f4b75c5e229098d9fd89669b13f): rework indexer buckets
### Services
- [668f443f](https://github.com/quay/clair/commit/668f443f1c0829ce3f5977ff158214fa76951d59): update initialization
### Webhook
- [472e70b6](https://github.com/quay/clair/commit/472e70b6c4c6a65f7afd5ef4ecd2c4d722578ba5): clone headers on request

<a name="v4.4.4"></a>
## [v4.4.4] - 2022-06-09
### Chore
- [48a3a4ee](https://github.com/quay/clair/commit/48a3a4eef20ce76e25bb57ed9e8444af60998fd4): v4.4.4 changelog bump
- [6b1f27ed](https://github.com/quay/clair/commit/6b1f27ed682605fa89641cebf4f0f029c604f0d3): Bump claircore v1.4.1 -> 1.4.2

<a name="v4.4.3"></a>
## [v4.4.3] - 2022-06-06
### Chore
- [3682f31e](https://github.com/quay/clair/commit/3682f31ee399e2b14a1d669c1f3d9ee774feefdd): v4.4.3 changelog bump
### Go.Mod
- [51c63e32](https://github.com/quay/clair/commit/51c63e323cc27824cdb59b942b66af110400d5b3): update claircore version
 -  [#1580](https://github.com/quay/clair/issues/1580)### Webhook
- [edc65d66](https://github.com/quay/clair/commit/edc65d667261fbc08d54bbc4057151f47ce6d4b7): clone headers on request
 -  [#1557](https://github.com/quay/clair/issues/1557)
<a name="v4.4.2"></a>
## [v4.4.2] - 2022-05-26
### Chore
- [2a4694bf](https://github.com/quay/clair/commit/2a4694bff671a9e41c3c5c5c77eb1a53afebf971): v4.4.2 changelog bump
### Go.Mod
- [67f32bff](https://github.com/quay/clair/commit/67f32bff3f3ef655ff24313ccc7905d6d2a0a719): update claircore version
 -  [#1571](https://github.com/quay/clair/issues/1571)
<a name="v4.4.1"></a>
## [v4.4.1] - 2022-04-04
### Chore
- [363dca4d](https://github.com/quay/clair/commit/363dca4d771d7e36e2925552cce102e458193c4f): v4.4.1 changelog bump
- [cc5a916e](https://github.com/quay/clair/commit/cc5a916ef11f5de53af0b87b9ad75d940a615beb): bump claircore to v1.3.2
 -  [#1537](https://github.com/quay/clair/issues/1537)### Httptransport
- [d314e412](https://github.com/quay/clair/commit/d314e41234292084dc125c3c9489f3958ca772ae): handle no notifier in "combo" mode
 -  [#1531](https://github.com/quay/clair/issues/1531)
<a name="v4.4.0"></a>
## [v4.4.0] - 2022-03-16
### Chore
- [c7075aa4](https://github.com/quay/clair/commit/c7075aa46dfffbbd9b09393d5db42938cda2a615): v4.4.0 changelog bump

<a name="v4.4.0-rc.7"></a>
## [v4.4.0-rc.7] - 2022-03-14
### Chore
- [94fdf1f8](https://github.com/quay/clair/commit/94fdf1f83102d1ae11f9363f7a41532e2414f18e): v4.4.0-rc.7 changelog bump
### Ci
- [87a2421f](https://github.com/quay/clair/commit/87a2421f458591be50f2303de4cf76add5789925): use runner context object

<a name="v4.4.0-rc.6"></a>
## [v4.4.0-rc.6] - 2022-03-14
### Build(Deps)
- [323e83ce](https://github.com/quay/clair/commit/323e83cee577e6df4b41db03f6a90d05480c6443): bump actions/checkout from 2 to 3
### Chore
- [0ea0e9d5](https://github.com/quay/clair/commit/0ea0e9d547de3d0ed2d7fe4e400b1fcb8cb16476): v4.4.0-rc.6 changelog bump
### Ci
- [d4983fdb](https://github.com/quay/clair/commit/d4983fdb737aa11ce01a952dc4ca6b26af7f4bab): fix extract step
### Httptransport
- [5caad7fc](https://github.com/quay/clair/commit/5caad7fc921b64a877e5055171c382a28ba2dbba): remove unused AffectedManifest handler

<a name="v4.4.0-rc.5"></a>
## [v4.4.0-rc.5] - 2022-03-03
### Chore
- [8d2d1593](https://github.com/quay/clair/commit/8d2d159396004f17bfedb755b5f6a32b90ede1c2): v4.4.0-rc.5 changelog bump
### Ci
- [58c761e3](https://github.com/quay/clair/commit/58c761e3662524358720ea15789e5121375f7bc6): update nightly version description
- [bbdd9252](https://github.com/quay/clair/commit/bbdd925292fd426cdaae8172fafe2f333d7b127b): fix tar prefix

<a name="v4.4.0-rc.4"></a>
## [v4.4.0-rc.4] - 2022-03-03
### Chore
- [fa6fad70](https://github.com/quay/clair/commit/fa6fad709018f8f27a7c43d8da6cfe69489587a5): v4.4.0-rc.4 changelog bump
### Cicd
- [3ba11c9c](https://github.com/quay/clair/commit/3ba11c9cf57f7a8cb3f17e956dbb379fdb986724): checkout repo where needed

<a name="v4.4.0-rc.3"></a>
## [v4.4.0-rc.3] - 2022-03-03
### Build(Deps)
- [593b868e](https://github.com/quay/clair/commit/593b868eac69f88481d48085a8b15a3004d0ebe3): bump peter-evans/create-pull-request from 3.12.1 to 3.14.0
### Chore
- [c7ef8501](https://github.com/quay/clair/commit/c7ef8501a5e76ec71d953307f0ec6964144a11e8): v4.4.0-rc.3 changelog bump
- [fa2c5380](https://github.com/quay/clair/commit/fa2c5380ad1116ed465d1e37d3d0ad816f6b6f58): Update zlog dep
### Contrib
- [6d2dfbea](https://github.com/quay/clair/commit/6d2dfbeaddf5d7a569e5b54ae5ad9a808ac683bf): Update grafana dashboards
### Metrics
- [cdb67fb6](https://github.com/quay/clair/commit/cdb67fb652b9025e7db791474b4e1d6d8dc000c9): matcher add status code label to matcher latency metric

<a name="v4.4.0-rc.2"></a>
## [v4.4.0-rc.2] - 2022-02-23
### Chore
- [5454de31](https://github.com/quay/clair/commit/5454de316c55704c508e8e2101ed0090791210b8): v4.4.0-rc.2 changelog bump
### Workflows
- [8359de62](https://github.com/quay/clair/commit/8359de622b212f3b1d12839913e2cf1c692d9592): fix "chglog" typo

<a name="v4.4.0-rc.1"></a>
## [v4.4.0-rc.1] - 2022-02-23
### Chore
- [6b029ffc](https://github.com/quay/clair/commit/6b029ffc6290bc6034b6f343d78b978d4513e55e): v4.4.0-rc.1 changelog bump
### Workflows
- [f2819bd6](https://github.com/quay/clair/commit/f2819bd63b90d93ac0930a83d5de11bd5adbfe4a): rewrite go version check
- [a40b1849](https://github.com/quay/clair/commit/a40b1849582a95e3e43f40485f6509eb90d3ca93): remove `env` usage

<a name="v4.4.0-rc.0"></a>
## [v4.4.0-rc.0] - 2022-02-23
### All
- [128b27b7](https://github.com/quay/clair/commit/128b27b72563d1d42be426d1a7b144250ec8cb0a): update zlog and corresponding otel packages
- [35c9c9f2](https://github.com/quay/clair/commit/35c9c9f28947af2e3394c2a866ee07f325809e22): move config package to new module
### Auto
- [3b2f4958](https://github.com/quay/clair/commit/3b2f49585d3c444d40fa5bd49d24fe624d0e7778): fall back to root cgroup
- [00163750](https://github.com/quay/clair/commit/00163750e4929759a0d2f816e9749fe19082cbd7): add automatic runtime configuration
### Build(Deps)
- [496f24c9](https://github.com/quay/clair/commit/496f24c9cf25ccde2a3c1164a25fe3ca2518e622): bump peter-evans/create-pull-request from 3.12.0 to 3.12.1
- [422d6b4a](https://github.com/quay/clair/commit/422d6b4a60fcb3ae7c059b97d89dcd456ed01d28): bump peter-evans/create-pull-request from 3.11.0 to 3.12.0
- [55dbdd99](https://github.com/quay/clair/commit/55dbdd995748bdef7575165f1010732bd1db19e9): bump peter-evans/create-pull-request from 3.10.1 to 3.11.0
- [0d2a60b3](https://github.com/quay/clair/commit/0d2a60b3f83aa393f1e4d2547b61561a9c60900c): bump peter-evans/create-pull-request from 3.5.1 to 3.10.1
### Chore
- [5997745c](https://github.com/quay/clair/commit/5997745c9765afadd3369abb604b079c376524fb): v4.4.0-rc.0 changelog bump
- [bd115483](https://github.com/quay/clair/commit/bd1154839eff429bb774abba186477feadbfa9b6): bump claircore to v1.3.1
- [c1d66d61](https://github.com/quay/clair/commit/c1d66d614fc41594d4538af77cac01ef886cd1f1): update claircore version
- [953fa97b](https://github.com/quay/clair/commit/953fa97b70878dfbe2ccf0b1183c902b8618119b): update claircore version
- [74210ca1](https://github.com/quay/clair/commit/74210ca1bea67f0369bc9b26d40354410317627b): update changelog to cope with submodule tags
- [5c44e70c](https://github.com/quay/clair/commit/5c44e70c92331f4150b8c2474043e6d92f125d31): update claircore version
- [28647ba1](https://github.com/quay/clair/commit/28647ba13fd38162ebdbc2f878db2691431f197a): update claircore version
### Cicd
- [3399a752](https://github.com/quay/clair/commit/3399a75297495a7bcc512ef0366ab886c139665e): update actions to use native conditional
- [c473c92c](https://github.com/quay/clair/commit/c473c92c31d3e38027b35395fb951524e03f84c7): add CI job for config module
- [752988a9](https://github.com/quay/clair/commit/752988a99d99daca7acda5b921ec5ebd5e5df63e): fix output/outputs typo
- [a930239b](https://github.com/quay/clair/commit/a930239bfcb587bf7dc7958a907144ee39ac4258): fix nightly setup
- [6a6df52d](https://github.com/quay/clair/commit/6a6df52dcc4e435fefd95848aa7098e94af4a9b6): factor out go module and build caching
- [dc30ee31](https://github.com/quay/clair/commit/dc30ee31dfd438d0427ae28c8d3a0b4f8f3a21ca): add conditional step hack
- [83f6bcf5](https://github.com/quay/clair/commit/83f6bcf5c3cba6c91d9eff307de0a8e97593b4b0): prevent push on unchanged code
- [8b173887](https://github.com/quay/clair/commit/8b1738873ac2081f4b9c0b14e0ddccfa54b71858): use common documentation action
- [f185a9b4](https://github.com/quay/clair/commit/f185a9b42422adcd07d652e261a2044069b3c9a8): use common expiration action
- [bfc1abd3](https://github.com/quay/clair/commit/bfc1abd354227f2f18c97f5b2a734710cafd6110): add caches to release workflow
- [29d9153b](https://github.com/quay/clair/commit/29d9153b83a9a959ee5b76a1783db2218c5f9b71): move config into a discrete step
- [9bb8cc7b](https://github.com/quay/clair/commit/9bb8cc7b1e52ca43e271eef3007f7bbc179c0314): add some composite actions
- [b9a9d069](https://github.com/quay/clair/commit/b9a9d06973d8bfad87764cb836e8e7872bfac1a7): use local go for mod check
- [f7188e3d](https://github.com/quay/clair/commit/f7188e3d88896ee1f2bd7b85291d6ce8c5bd7041): add dependabot for GitHub Actions
### Clair
- [11cb491f](https://github.com/quay/clair/commit/11cb491fc6efef6c5dedc2d292b628034f4cf3b5): allow TLS for API server
- [c1d51a66](https://github.com/quay/clair/commit/c1d51a66f1143d60683f0ae682e6dc0d3102cb20): update for config package changes
### Clairctl
- [a8c7ebe9](https://github.com/quay/clair/commit/a8c7ebe95819969c10ccc1afcf264e04412dcf56): uniform import/export compression
- [872ba0b1](https://github.com/quay/clair/commit/872ba0b1801eddaf06774d40c523863a2793ac1c): add additional report flags
- [ac80e5d8](https://github.com/quay/clair/commit/ac80e5d830c007ab9580592f7c396676592fc728): add retries to manifest fetching
- [dc3d1148](https://github.com/quay/clair/commit/dc3d114879474e4fa007915d6b146a5023c5d8a7): internal client improvements
### Client
- [1972a877](https://github.com/quay/clair/commit/1972a87703ad5a542958537fe70fbe5c9d857760): add DeleteManifests method
### Config
- [e0f865ad](https://github.com/quay/clair/commit/e0f865ad8f8c050335ecce946cf06fc0a9cf4a6d): add deprecation notice to `max_conn_pool`
- [d2152205](https://github.com/quay/clair/commit/d2152205f56f1029c7face5d4f2b486f28677147): MarshalText on value receiver
- [2cc4af7e](https://github.com/quay/clair/commit/2cc4af7e1cd1b35b3ff0d0f4bae1be3188bfb675): auto-size concurrent request capacity
- [1b4a736d](https://github.com/quay/clair/commit/1b4a736d2ed78c4c8bcc1c8b6477e06ac462a513): add tls for http API
- [9d2575d1](https://github.com/quay/clair/commit/9d2575d1cd491d62b02038a7698592995b243a16): update sample config for crda-matcher
- [69e53bae](https://github.com/quay/clair/commit/69e53baea3b55851a2f892ac5fec1d940d79d95d): add documentation to all exported types
- [cc7d8a37](https://github.com/quay/clair/commit/cc7d8a37e5315ba8504bd74f0c26cdafd881bbb4): consolidate and document default values
- [7bcfc206](https://github.com/quay/clair/commit/7bcfc2063df8e5e10d8ca32752295d7bddf6fd68): move to use Mode and LogLevel types
- [9033bc9f](https://github.com/quay/clair/commit/9033bc9f865db1d6b2e99139bc4eff6ed927e516): implement and use validator interface
- [63c26ab8](https://github.com/quay/clair/commit/63c26ab8a2b135f3a634ae8103f9ff09cf10f7c0): add linter
- [6759ce5c](https://github.com/quay/clair/commit/6759ce5c54515a2c1b4461c5f10917b8efdc7de8): add test for struct tags
- [c6b2d3c5](https://github.com/quay/clair/commit/c6b2d3c5c115dad1ae31391830e2d28ef606e276): swap notifier config structs
- [1f4ed842](https://github.com/quay/clair/commit/1f4ed8429be91e760669cf510dac4698df1e7cb5): use json for unmarshal test
- [11509eef](https://github.com/quay/clair/commit/11509eef7718d156458c0af58f7be2e5fb7cad6a): move notifier structs into this package
- [0439169a](https://github.com/quay/clair/commit/0439169a89605f50851fc54a5106eca9e37ba0ff): remove yaml.Node in API
- [eb64aa50](https://github.com/quay/clair/commit/eb64aa50a4414ea295eb6c73e1df42e212fb40f2): struct ordering and simplifications
- [579719a3](https://github.com/quay/clair/commit/579719a3458a4d71e02603b384289b38e9c204cc): remove unused FilterSets method
- [ae7e5a3b](https://github.com/quay/clair/commit/ae7e5a3bcaf97f01290af4cee25164188ff02493): do base64 encoding smarter
### Contrib
- [45fae9fa](https://github.com/quay/clair/commit/45fae9fa2b559606b7f181ee1cae8d4a6e7e77a5): Better visualization of API latency.
- [56c1fe90](https://github.com/quay/clair/commit/56c1fe9087134ccd99fe71ac7135e067b336768f): Update grafana dashboard to relect new metrics names
- [c88c406f](https://github.com/quay/clair/commit/c88c406fb3854cfe70bfc0cfaf8158f9c0c565d9): revert headless service
- [136f8e6b](https://github.com/quay/clair/commit/136f8e6b50bbcaf532cd7bc08a4c193313382c5d): grafana dashboard updates
- [e2ff9a6b](https://github.com/quay/clair/commit/e2ff9a6b1545dffaed61c939727ddcdc6e3b03ec): make indexer service headless
- [3af15937](https://github.com/quay/clair/commit/3af15937ca093e91b34a67047d5c218f7895e6c0): adding missing template variables
- [b49b8f75](https://github.com/quay/clair/commit/b49b8f75bbc9dc5abc41005578f0d6971f28fb45): need to have single braces for strings
- [e9a0ded5](https://github.com/quay/clair/commit/e9a0ded5669a4fcdd7ecbf1f3428f6c4b0b8c994): add initContainer to wipe VPC on startup
- [ded05191](https://github.com/quay/clair/commit/ded051917dd730faf1392158761a25ebc175f536): add set podManagementPolicy to Parallel
- [eddad2e6](https://github.com/quay/clair/commit/eddad2e61984defca5b0e9f842d2df44c1ea11fc): use a real target for generating configMap
- [f0e9108e](https://github.com/quay/clair/commit/f0e9108ebb5bbdea5197ecd4d1c069af74ef7d56): different directories for template and configmap
- [6c78d1fd](https://github.com/quay/clair/commit/6c78d1fddebb34916a055c00558a409f5279e133): add indentation
- [7c258d39](https://github.com/quay/clair/commit/7c258d395ab5474696f50a1785ff51eabb69272e): add grafana configMap
- [7bfc9f94](https://github.com/quay/clair/commit/7bfc9f94050d77a7028e7f14f7d1172384703bbc): update config secret
### Deps
- [30964e6b](https://github.com/quay/clair/commit/30964e6b4ebe0559c799367f790646645581af06): update zlog
### Docker-Compose
- [3c2ad90f](https://github.com/quay/clair/commit/3c2ad90ffc1d32f6adb05ca0b93618c035705841): add ActiveMQ container
- [16950591](https://github.com/quay/clair/commit/169505918bb7cbf8b0693850dbd2aba8e10c3952): add paused skopeo container
- [f4f243f7](https://github.com/quay/clair/commit/f4f243f799aa50e83705b74b915b43e2e40e7944): use profiles and anchors
### Docs
- [8cc4bf29](https://github.com/quay/clair/commit/8cc4bf29d762bee7ec7fd2c3f26608a3b158f90d): update `max_conn_pool`
- [722c0deb](https://github.com/quay/clair/commit/722c0deb2a70ea21641bcf541c659a98667fc43e): link to upstream go package documentation
- [7d93d376](https://github.com/quay/clair/commit/7d93d3760fd78c262c5f145892799fec9ebad5fa): add crda remote matcher details
### Go.Mod
- [b1fe4db1](https://github.com/quay/clair/commit/b1fe4db1d1b295b5377a0a70dbe5ae977e393eb5): update claircore
- [bd8160c9](https://github.com/quay/clair/commit/bd8160c908a6ec27420144c5c39397c8e866bd97): update go-containerregistry
### Grafana
- [c65579fc](https://github.com/quay/clair/commit/c65579fc0d5e526171966423587e287060ed91c2): Adding GC DB charts to dashboard
- [9c82a96d](https://github.com/quay/clair/commit/9c82a96d99dcda1d0fb60e48c2a8177ba9c8a29c): Update dashboard with Notifier metrics
### Httptransport
- [c8024bbd](https://github.com/quay/clair/commit/c8024bbdafaa7b4065eb4fe213b87ff5295195a4): fix error message
- [9a21b499](https://github.com/quay/clair/commit/9a21b49913b28a817f80cdf242c07ccc39095a19): use new IndexerV1 handler
- [c66e2060](https://github.com/quay/clair/commit/c66e20606bc1f615cb596fdf3846a7da63129992): add IndexerV1 type
- [29ad2ba5](https://github.com/quay/clair/commit/29ad2ba574d7241ad6f447a42ef4515e1545bde5): add concurrency limiter
- [85b851e9](https://github.com/quay/clair/commit/85b851e92abc4b63e50385e859e88bc220733f58): add instrumentation helper
- [55198e82](https://github.com/quay/clair/commit/55198e82ca372485443b70a9c6c7a1bd18c5532e): add error helper
- [d3cbb5ad](https://github.com/quay/clair/commit/d3cbb5ad25753123736d9ca96be35cf5edbe8086): fix content negotiation
 -  [#1441](https://github.com/quay/clair/issues/1441)- [96bad4f4](https://github.com/quay/clair/commit/96bad4f4fd3f63cd07d7c0e79c64e0dc31e88d25): error message correction
- [88cf06e5](https://github.com/quay/clair/commit/88cf06e577ae5d68ca77af84442e9d317775b576): gofmt simplification
- [6f9ca6bc](https://github.com/quay/clair/commit/6f9ca6bcc61d4baa0b78a4828f24d62751c6e3a4): simpler codegen for openapi JSON
### Httputil
- [9ca1e8bd](https://github.com/quay/clair/commit/9ca1e8bd04d67a42df824e58095aa284cf058798): move signed client creation
### Indexer
- [78819116](https://github.com/quay/clair/commit/7881911674a27753214d845e8571f64a2b35d3cd): add DeleteManifests method
### Initialize
- [6562b707](https://github.com/quay/clair/commit/6562b7076de65553f9e002a8129eec75febfbb50): update to new interfaces
### Local-Dev
- [b2d68b39](https://github.com/quay/clair/commit/b2d68b39a8ae3095d2cbcc471f8efcd30be43ea9): config changes to restore grafana functionality
- [d0ec89d1](https://github.com/quay/clair/commit/d0ec89d11c150d5b66f404fbee77b052f67fff5b): quay: update for other config changes
- [2a0943b1](https://github.com/quay/clair/commit/2a0943b14ac09198a51216ebe945a5ab9552cc57): prometheus: update endpoints
- [a8348361](https://github.com/quay/clair/commit/a834836104231718b6413fa875ffcf3d0575f1ab): pgadmin: update for multiple databases
- [c92b02c2](https://github.com/quay/clair/commit/c92b02c2439be10e264876357d3a4badb5cbfde6): grafana: update endpoint
- [3ee44c14](https://github.com/quay/clair/commit/3ee44c148ef0ae3e5b2928b734df1ac128723d8a): traefik: use file configuration
- [0fd11207](https://github.com/quay/clair/commit/0fd1120745da17dee5ce81a51bf64ae98cedb050): clair: update default dev config
### Makefile
- [356a4d7d](https://github.com/quay/clair/commit/356a4d7d526313f0d16549dba37c0d1c4f1c3da1): update targets and docs
### Migrations
- [2e8fc1d3](https://github.com/quay/clair/commit/2e8fc1d30ee8c6b22555557712d7edda42b21fae): add cascade constraints
### Notifier
- [d1e7791a](https://github.com/quay/clair/commit/d1e7791a7c86dde918eaa7f12f1acd61b9620917): update to new interfaces
- [fb1c0231](https://github.com/quay/clair/commit/fb1c023112e16a3557b35fd1f2fa6770319965cb): move Service interface here
- [0733900a](https://github.com/quay/clair/commit/0733900a3c67767ceaf37a544884515c4741ed79): change DeleteNotification to CollectNotifications
- [4ba6aca0](https://github.com/quay/clair/commit/4ba6aca06c26d298b6e287ffb595ee3f2af42b68): use external concurrency in Delivery, Poller, Processor
- [df0b2b4a](https://github.com/quay/clair/commit/df0b2b4ab579c1b3b5d808e5abf5fef6156da810): documentation and simplification pass
### Openapi
- [93a835ec](https://github.com/quay/clair/commit/93a835ec75959252d0d7eaac4d16a7ffca468a67): update OpenAPI spec with delete operations
### Postgres
- [dab3735a](https://github.com/quay/clair/commit/dab3735a0252b1f4da1b00b1079bc6270fbde2f2): update tests
- [164219e8](https://github.com/quay/clair/commit/164219e8a9ea2d8d819509a185ace12a5ceb46f2): add Init function
- [e0db5ac2](https://github.com/quay/clair/commit/e0db5ac2d3edfc12f93d55cba2d40b512bc115d9): refactor notification methods
- [4650b691](https://github.com/quay/clair/commit/4650b691b7a50851522eecbf0fdc99e119375175): refactor receipt methods
- [be87d387](https://github.com/quay/clair/commit/be87d387d36469f8f3f4969229d74101ac30596f): refactor status getters
- [149ec354](https://github.com/quay/clair/commit/149ec354bdcb435d3ea2fe9482cbe31167f46100): refactor status setters
### Service
- [e86c1fbf](https://github.com/quay/clair/commit/e86c1fbfe45b7b6898ba09ca567e814e5022698e): unify connection string handling
- [02c0dc21](https://github.com/quay/clair/commit/02c0dc21e7379f1c7cf024c0dbf41df7192c3ec1): update for changes in the config package
### Webhook
- [1068f493](https://github.com/quay/clair/commit/1068f4930f255b279c3c13eec6a24b1f5fa8b171): add debug server
- [7334521f](https://github.com/quay/clair/commit/7334521fb9994d0857f7e176edc7ff48b0edb9b4): fix a code smell

<a name="v4.3.6"></a>
## [v4.3.6] - 2022-01-14
### Chore
- [84801fa2](https://github.com/quay/clair/commit/84801fa23add925ba6b406a9e1bc5d2aaba217fb): v4.3.6 changelog bump
### Go.Mod
- [8562653a](https://github.com/quay/clair/commit/8562653ac42933bbf0e73d82abde09c2a337ea22): update claircore
### Webhook
- [ca28de41](https://github.com/quay/clair/commit/ca28de4149e5041958b220daa2c8601abb424dda): clone headers out of Config struct

<a name="v4.3.5"></a>
## [v4.3.5] - 2021-11-19
### Chore
- [844bfd24](https://github.com/quay/clair/commit/844bfd2436fb5acb1d08975acad152d78367364a): v4.3.5 changelog bump
- [bef331e6](https://github.com/quay/clair/commit/bef331e67e1b00a1e6f2139c0c817907de93d7d4): Revert "chore: v3.4.5 changelog bump"
- [c01d88c6](https://github.com/quay/clair/commit/c01d88c6ac2513cb728703f5721ce61ff839f5a3): v3.4.5 changelog bump
- [8849c613](https://github.com/quay/clair/commit/8849c61360520230b6c987bdc243db03b7340c9f): update claircore version
 -  [#1437](https://github.com/quay/clair/issues/1437)
<a name="v4.3.4"></a>
## [v4.3.4] - 2021-11-05
### Chore
- [dddb910b](https://github.com/quay/clair/commit/dddb910b6f51e7b69042ba3db98c2a0d6cc1caa2): v4.3.4 changelog bump
- [41d25933](https://github.com/quay/clair/commit/41d25933ad25b8ae5deb4b6da84336c2a4d400fe): update changelog to cope with submodule tags
 -  [#1421](https://github.com/quay/clair/issues/1421)
<a name="v4.3.3"></a>
## [v4.3.3] - 2021-11-05
### Chore
- [4aca7b5a](https://github.com/quay/clair/commit/4aca7b5a8bd82826d4c6e41dcafcb52d72696d3a): v4.3.3 changelog bump
- [5e060135](https://github.com/quay/clair/commit/5e060135111e07fcc3d0c2fc6c6570a98021dde7): update claircore version
 -  [#1418](https://github.com/quay/clair/issues/1418)
<a name="v4.3.2"></a>
## [v4.3.2] - 2021-10-29
### Chore
- [bfd97186](https://github.com/quay/clair/commit/bfd971861e88bb21e4480ac98b8b0b7e1abf1501): v4.3.2 changelog bump
### Go.Mod
- [f8dff8b8](https://github.com/quay/clair/commit/f8dff8b8691ad58508457b2022425a7c533fca3c): update go-containerregistry
 -  [#1407](https://github.com/quay/clair/issues/1407)
<a name="v4.3.1"></a>
## [v4.3.1] - 2021-10-28
### Chore
- [6ddf8620](https://github.com/quay/clair/commit/6ddf86205e558df705e0f21dd12c582a67566b3d): v4.3.1 changelog bump
- [ec26f33a](https://github.com/quay/clair/commit/ec26f33a54fb2995a5898f1bd42484bf90da14fd): update claircore version
 -  [#1404](https://github.com/quay/clair/issues/1404)
<a name="v4.3.0"></a>
## [v4.3.0] - 2021-10-01
### Chore
- [ce63ff26](https://github.com/quay/clair/commit/ce63ff2615cef36804346acc016c625d2fcfd630): v4.3.0 changelog bump
### Contrib
- [2cee4e1c](https://github.com/quay/clair/commit/2cee4e1c6b06179f8166b3090526d6d5d592433c): update secrets path
### Dockerfile
- [5493bbc0](https://github.com/quay/clair/commit/5493bbc0d5cdd67c52c4d1786ddc3226086403d6): remove dumb-init, tar

<a name="v4.3.0-rc.0"></a>
## [v4.3.0-rc.0] - 2021-09-28
### Chore
- [b5ea27bc](https://github.com/quay/clair/commit/b5ea27bc324308e359adf3084b92301441457001): v4.3.0-rc.0 changelog bump
- [d65432d3](https://github.com/quay/clair/commit/d65432d3cc7dbe57de1b7be7cfd4745005e44159): update claircore version
- [5ab6c761](https://github.com/quay/clair/commit/5ab6c76121a03543f8edf748fa511a7d486df54c): automation around v2 issues
- [b53aeb71](https://github.com/quay/clair/commit/b53aeb714aa3536dd7aa295ea6306a20e69e03cf): update claircore version
- [f06b0419](https://github.com/quay/clair/commit/f06b0419f3aa38d54a56fda3a07729fab80ca6a1): update go version
### Cicd
- [7f192003](https://github.com/quay/clair/commit/7f192003eef5eb6e0d42e2d21264410f71af96ce): create expiring, dated image
- [673ab1eb](https://github.com/quay/clair/commit/673ab1ebd1efc1cfc778316ca7c4f183687138a1): update go version
- [ace31fe6](https://github.com/quay/clair/commit/ace31fe6e8737fb4ab4ad66750e7637c8af36e0d): re-vendor after modifying the module
- [411facfa](https://github.com/quay/clair/commit/411facfaeb292bd74e1865a2b48767ac1560febf): use push flag with build
- [7d29f694](https://github.com/quay/clair/commit/7d29f694b0de2751ef1d1886ca2b15317a3b33d0): add "nightly" workflow
- [e36bc822](https://github.com/quay/clair/commit/e36bc8226ab762948cc0f855751b5d55eea44afe): add script to edit module for nightly
### Clairctl
- [66a3137a](https://github.com/quay/clair/commit/66a3137af6d6b5f1640c32e55aa5a65b71d606a0): update to new API
### Config
- [b4ec7aa3](https://github.com/quay/clair/commit/b4ec7aa3e2d4bd272e8f518ff3bd2b3e2434216d): add CacheAge field
### Contrib
- [73082541](https://github.com/quay/clair/commit/73082541568b014b89407bee9d30a0142ccd21ea): stop unneeded vendoring
- [87f8f6cb](https://github.com/quay/clair/commit/87f8f6cb7525ad6e85c49907f17a35523de2a19f): update saas file
### Documentation
- [28b78c54](https://github.com/quay/clair/commit/28b78c5415696ab23a1465f5b631f0be2cb97704): fix typo
### Httptransport
- [22a25484](https://github.com/quay/clair/commit/22a25484e149bc5665e5e78754552cbda6967b9f): add Cache-Control header to VulnerabilityReport response
- [1d6ce962](https://github.com/quay/clair/commit/1d6ce962d79c2cad86e8c7f6c5a247bf1f329d92): documentation updates
- [f7fdc906](https://github.com/quay/clair/commit/f7fdc906c3bd0e779e0480b2444d6068ae939546): fix auth test logging
### Matcher
- [b3c3e385](https://github.com/quay/clair/commit/b3c3e38574df1d53c37fbf9c7fe0128b2c76c35e): default garbage collection on
### Notifier
- [0f6d0e4a](https://github.com/quay/clair/commit/0f6d0e4a6950c64c74f18f1c4d0dee3fbc2eaf01): move to ctxlock
### Shutdown
- [6b7029df](https://github.com/quay/clair/commit/6b7029df2f74a44f57f924545442465874103e0b): introduce the new NotifyContext

<a name="v4.2.3"></a>
## [v4.2.3] - 2021-09-28
### Chore
- [8bc69b0a](https://github.com/quay/clair/commit/8bc69b0a4c83a3275ee8dc17042a58357cd167ec): v4.2.3 changelog bump
- [7ee97e50](https://github.com/quay/clair/commit/7ee97e506372454963c81a3c5c045ce487056d87): bump claircore version

<a name="v4.2.2"></a>
## [v4.2.2] - 2021-08-17
### Chore
- [3762d9c3](https://github.com/quay/clair/commit/3762d9c3459f5bb1b12fab46453358b79f3952ba): v4.2.2 changelog bump
- [90f2909e](https://github.com/quay/clair/commit/90f2909ed8d29b90dad205f9ad92bbbf9660f88c): bump claircore version

<a name="v4.2.1"></a>
## [v4.2.1] - 2021-08-16
### Chore
- [1882e1ee](https://github.com/quay/clair/commit/1882e1eed86bfcd1e9a9667bc1900fdb1da081db): v4.2.1 changelog bump
- [b48814b6](https://github.com/quay/clair/commit/b48814b6b79fc75fb91dce858490e2d4a8f2db3d): bump claircore version

<a name="v4.2.0"></a>
## [v4.2.0] - 2021-08-10
### Chore
- [2c7fd9cb](https://github.com/quay/clair/commit/2c7fd9cbcdc1d37e42ea9338ae72ada0b1da10dc): v4.2.0 changelog bump
- [1e0a43aa](https://github.com/quay/clair/commit/1e0a43aa1d6714c79a5b9f5b4568c0de16d3e127): bump claircore to v0.5.2
### Http
- [4cd09528](https://github.com/quay/clair/commit/4cd0952833b7048ccf8fbf024a7c61a3c4a6c34b): rate limit index report requests
### Introspection
- [5b129ad9](https://github.com/quay/clair/commit/5b129ad997fb33b02c6ac1c605fb8444399a5c43): capture rate-limited requests

<a name="v4.2.0-rc.2"></a>
## [v4.2.0-rc.2] - 2021-07-29
### Chore
- [263d6677](https://github.com/quay/clair/commit/263d6677e6cf661c281de6087bb93628b79c3ee0): update claircore
### Deployment
- [c888a3f2](https://github.com/quay/clair/commit/c888a3f21b6397355761b6eb056d95487bbf3eca): Fix microdnf install inconsistencies

<a name="v4.2.0-rc.1"></a>
## [v4.2.0-rc.1] - 2021-07-20
### All
- [9ce2af3f](https://github.com/quay/clair/commit/9ce2af3fbc3b7040de37ef47accf37e055e0d730): remove jzelinskie from codeowners
### Chore
- [72df3577](https://github.com/quay/clair/commit/72df35774fcb65e772214378b25da870fd5c7adb): update CODEOWNERS
- [248e7961](https://github.com/quay/clair/commit/248e796184f8da454b21564b3ec6e43020391b92): update responserecorder
- [5354f107](https://github.com/quay/clair/commit/5354f1073cf073202c7c98388c13abc6b6743d08): bump claircore version
### Clairctl
- [45538e0c](https://github.com/quay/clair/commit/45538e0ccee4d4ee12247da11f295ff32dcbe4ff): add support for s3 registries using V4
 - Fixes [#1264](https://github.com/quay/clair/issues/1264)### Config
- [af6a1f49](https://github.com/quay/clair/commit/af6a1f49b35f10faff1102a5d776050eb74cd0d0): omit Authorization header for empty claims
 - Fixes [#1283](https://github.com/quay/clair/issues/1283)### Docker
- [22ee21df](https://github.com/quay/clair/commit/22ee21df6f712a7461c9dfd6c48b06c1da5b8670): reflect quay Dockerfile updates
### Httptransport
- [fee8bc5a](https://github.com/quay/clair/commit/fee8bc5ae70ee6030f7c2d6ad9b901e6fb7aaaea): remove key management API
### Initialize
- [1e26de57](https://github.com/quay/clair/commit/1e26de5737f369b1c55f873471c43a1fa1919fef): use new enrichers
### Introspection
- [8d128903](https://github.com/quay/clair/commit/8d128903a1990e33c036edab6f02bd3c28472407): use the response recorder
### Keymanager
- [dc0b7079](https://github.com/quay/clair/commit/dc0b70791b4ed37fbb6bb697c40cafb4824adfab): remove package
### Local-Dev
- [0285c300](https://github.com/quay/clair/commit/0285c3000abc1bf588b9773dfb225fa74afcf2cb): add grafana to docker-compose
- [5df0b7b4](https://github.com/quay/clair/commit/5df0b7b4c46a88e9f476e99a4b0c03ede88722ea): remove whitelist env var for quay conf
### Matcher
- [49bfd4d7](https://github.com/quay/clair/commit/49bfd4d791c087634df749f9895caebd0e5c4f41): disable updaters creates empty updater sets
 - Fixes [#1273](https://github.com/quay/clair/issues/1273)### Migrations
- [cef8142a](https://github.com/quay/clair/commit/cef8142a725016c49425b4dd27d61708fec899e3): add future key table removal
### Notifier
- [85ac7bb8](https://github.com/quay/clair/commit/85ac7bb877d7cb2154d5a59c6cf13bb690d8179c): remove KeyStore interface
### Openapi
- [5d032233](https://github.com/quay/clair/commit/5d032233ad90b10728bb564e92019b8b9b9b1197): fix paths
 -  [#1280](https://github.com/quay/clair/issues/1280)### Postgres
- [a5ae3426](https://github.com/quay/clair/commit/a5ae34261ee7e4451ed3d6d27b28e0a7d472f44d): update to new test database harness
- [6184ce33](https://github.com/quay/clair/commit/6184ce332fd1531d11bc27e2150fe16b899d6449): update test harness
- [0ca77cec](https://github.com/quay/clair/commit/0ca77cec0af74b4304c2ccf805ee3dea642cad37): remove KeyStore implementation and tests
### Service
- [d1ca564c](https://github.com/quay/clair/commit/d1ca564c59f844ce27538c41527ddf639aabb3e4): remove KeyManager and KeyStore
### Services
- [b3e490db](https://github.com/quay/clair/commit/b3e490dbc1022a5d08f7ceef8565928fdd19be98): disable transport compression in matcher
### Webhook
- [79089a44](https://github.com/quay/clair/commit/79089a44122587eea8ceab246b7d34615ebcf9dd): remove keymanager usage

<a name="v4.1.6"></a>
## [v4.1.6] - 2021-09-28
### Chore
- [018a2db2](https://github.com/quay/clair/commit/018a2db20131d0e56c1f52732a9ed1d73cf23d61): v4.1.6 changelog bump
- [63b5b3d9](https://github.com/quay/clair/commit/63b5b3d97f50fc1c22eb4be55e9cfc2cdb7ed86b): bump claircore version

<a name="v4.1.5"></a>
## [v4.1.5] - 2021-08-17
### Chore
- [7df9b906](https://github.com/quay/clair/commit/7df9b9067c3b7e7a9351bbc73b2dc48d507203af): v4.1.5 changelog bump
- [f4d8255c](https://github.com/quay/clair/commit/f4d8255c3a7db8b7e59066bc13ff25d39be938ae): bump claircore version

<a name="v4.1.4"></a>
## [v4.1.4] - 2021-08-16
### Chore
- [92eef18d](https://github.com/quay/clair/commit/92eef18de3a6dfc08373598d542e6644beab9d0a): v4.1.4 changelog bump
- [bee9c642](https://github.com/quay/clair/commit/bee9c642bba0aad96fcc48c7c2b2c7b0692c6825): bump claircore version

<a name="v4.1.3"></a>
## [v4.1.3] - 2021-08-11
### Chore
- [df2624c1](https://github.com/quay/clair/commit/df2624c1c9256d5e578db2047a772d372a561ea0): v4.1.3 changelog bump
- [7ac3d94f](https://github.com/quay/clair/commit/7ac3d94f12726e3f0f88281ecab47341fb5fbb0a): bump claircore

<a name="v4.1.2"></a>
## [v4.1.2] - 2021-08-06
### Chore
- [e6c9bc28](https://github.com/quay/clair/commit/e6c9bc2890b75b91a7d3a7aa5257a37b25d05dfb): v4.1.2 changelog bump
- [1e130f28](https://github.com/quay/clair/commit/1e130f2844d26ceac4a26f0548d8bc2bea79a91f): bump claircore version
### Introspection
- [804cbedb](https://github.com/quay/clair/commit/804cbedbd6724bc22f9adac02186f45bf77c703f): use the response recorder
 -  [#1318](https://github.com/quay/clair/issues/1318)### Services
- [bc60dcc2](https://github.com/quay/clair/commit/bc60dcc29d4440636f68911e79b08b188ac8e81e): disable transport compression in matcher

<a name="v4.1.1"></a>
## [v4.1.1] - 2021-06-15
### Chore
- [6528f738](https://github.com/quay/clair/commit/6528f738a2a0cf303625040459d5590050f75294): v4.1.1 changelog bump
- [a3a8020c](https://github.com/quay/clair/commit/a3a8020c2225de42e248352503b06704d7167839): bump claircore version
### Clairctl
- [343e7da0](https://github.com/quay/clair/commit/343e7da0f82f83e40f88a6fb64c5f6441ad2f27a): add support for s3 registries using V4
 - Fixes [#1264](https://github.com/quay/clair/issues/1264)### Config
- [ad9eccf9](https://github.com/quay/clair/commit/ad9eccf9c93a00bda4300ae783b42753d2c10d35): omit Authorization header for empty claims
 -  [#1284](https://github.com/quay/clair/issues/1284)
<a name="v4.1.0"></a>
## [v4.1.0] - 2021-05-13
### All
- [66387930](https://github.com/quay/clair/commit/66387930f2b80087a32a1aeddc9b1ef16eec01e1): use RateLimiter where it seems appropriate
### Chore
- [8bcbbf1b](https://github.com/quay/clair/commit/8bcbbf1be8b14051a05cc86bc404834b5778a6e8): v4.1.0 changelog bump
- [04f2cb71](https://github.com/quay/clair/commit/04f2cb71acc8eceac0d1a7766c5ebfcfa01150ee): bump claircore version
### Cicd
- [8b0cdb38](https://github.com/quay/clair/commit/8b0cdb38fa8f4d701e0ef804e37728721798f564): use golang major version tag for dev env
- [c1895c43](https://github.com/quay/clair/commit/c1895c433dfc3a872cce2c1468801ecdddf2e962): use quay.io/projectquay/golang image
### Claircore
- [bc2b0591](https://github.com/quay/clair/commit/bc2b0591d3ea3a07498820bc625f7dc9cd5ce934): update to use new libvuln API
### Clairctl
- [c80a99d1](https://github.com/quay/clair/commit/c80a99d14ed96e539a79212fb23f608a03ee636c): move to updates.Manager interface
- [30f86961](https://github.com/quay/clair/commit/30f86961b88b7a590157f28fc6cb8f22f16dfa06): move to zlog
### Httputil
- [ed8ffc50](https://github.com/quay/clair/commit/ed8ffc50b56c9b11873f00bb2deb4fba9107ec95): create package and RateLimiter
### Initialize
- [5df82e19](https://github.com/quay/clair/commit/5df82e19e971c67ebdecf3f92682d4ae897db53a): update call to Libindex contstructor
### Introspection
- [ec59a431](https://github.com/quay/clair/commit/ec59a431032713654e2eb7a29ad7c446dd16a490): enable readiness endpoint

<a name="v4.1.0-alpha.3"></a>
## [v4.1.0-alpha.3] - 2021-05-04
### Chore
- [f3d64ffc](https://github.com/quay/clair/commit/f3d64ffc3f3b8ebcf4d91d60117e8a268d840fd8): v4.1.0-alpha.3 changelog bump
- [01c44cc3](https://github.com/quay/clair/commit/01c44cc39dd5d5c644d6849dfe204a1ffd02bab8): update claircore revision
### Cicd
- [4535b9f4](https://github.com/quay/clair/commit/4535b9f41c310b3d590e2e0d8e3758d0d39d5105): changelog fixups
### Config
- [1f9b5657](https://github.com/quay/clair/commit/1f9b56577957ce28044b221af58b160328a671a2): validate based on combo mode or not
### Httptransport
- [9e67501d](https://github.com/quay/clair/commit/9e67501d818045749c4f263128b72e7cb6856bd1): fix LatestUpdateOperations method
### Notifier
- [6d331530](https://github.com/quay/clair/commit/6d331530c7a8714a16d32ce3ca6e74ec8afc5184): check msg contents in integration tests
- [cc4a10ff](https://github.com/quay/clair/commit/cc4a10ffedfc2edaae229cd953b3602ca16da2ec): remove direct zerolog use
### Tests
- [08734ab2](https://github.com/quay/clair/commit/08734ab233457dc4bba1b071331f0c8024f6b4dd): fix small unit test race
- [6e50ec2e](https://github.com/quay/clair/commit/6e50ec2eec4eb50711ac48f14181e5a7ca075a70): add testing command
- [1e92bd24](https://github.com/quay/clair/commit/1e92bd241ba42eec3cca6c8e983ba937caa23bd9): fix small race

<a name="v4.1.0-alpha.2"></a>
## [v4.1.0-alpha.2] - 2021-04-09
### Chore
- [e0eea383](https://github.com/quay/clair/commit/e0eea383b9e791b5b041136b88f1b69b3d4841bb): v4.1.0-alpha.2 changelog bump
### Codec
- [d5cac131](https://github.com/quay/clair/commit/d5cac1315481a87f596f395e1c2da2bf57eaf18c): use stdlib time.Time encoding
 - Closes [#1231](https://github.com/quay/clair/issues/1231)### Docs
- [60f9684a](https://github.com/quay/clair/commit/60f9684accfd7e6b9e1bd585a55874803e1160f5): minor updates
- [cbdc9caa](https://github.com/quay/clair/commit/cbdc9caab450489377ab1d6bb19429d54df639cc): update configuration file reference

<a name="v4.1.0-alpha.1"></a>
## [v4.1.0-alpha.1] - 2021-04-05
### All
- [a5bfaeb3](https://github.com/quay/clair/commit/a5bfaeb33cc43350234345aba0059a02098f0d67): switch to using codec package
### Chore
- [493beb13](https://github.com/quay/clair/commit/493beb13d3a9d0739bcffa74217f7e2107f8438d): v4.1.0-alpha.1 changelog bump
- [47344357](https://github.com/quay/clair/commit/473443575e0160cdc83574dcd48982d9922ddf4e): v4.1.0-alpha.1 changelog bump
- [6e8a8383](https://github.com/quay/clair/commit/6e8a838305c6bdc6a71e3b3a9ee5735660ebbd22): bump cc to v0.4.0
- [5a6f1c3b](https://github.com/quay/clair/commit/5a6f1c3b24f9c178838e905a1435078f9706a7b9): update claircore version for database fix
- [ea0378d4](https://github.com/quay/clair/commit/ea0378d4d67376ebb924b7fb78d4d4f22ad9e1de): bump cc v0.3.0
- [6e195c99](https://github.com/quay/clair/commit/6e195c99a14139360c8d09f90c94024eb7d27b67): fix yaml file indentation issue
### Cicd
- [b1145e3a](https://github.com/quay/clair/commit/b1145e3a1c5e8faf3d1a64a403de940386b73102): sort changelog by semver
- [7dc55fa9](https://github.com/quay/clair/commit/7dc55fa9bb0b968ab580c7d6d0ea4ffa053eaba0): bump in go.16, bump out go1.14
- [d5e57afb](https://github.com/quay/clair/commit/d5e57afb594d58cf817a962d9e282c820ab6577e): enable CI on stable branches
- [f7737e58](https://github.com/quay/clair/commit/f7737e58cfca3640d4a901a658317becb47ba2af): fix openshift ci/cd script
- [30c0311a](https://github.com/quay/clair/commit/30c0311a8b1584a40f5b956b3b3d9e9ab7eee18a): update golang container for go-mod in app-sre
- [cb656dfb](https://github.com/quay/clair/commit/cb656dfbd69ff1ce11976c7de672b50277091ab8): add notifier to app interface
- [9254ab66](https://github.com/quay/clair/commit/9254ab66ea7f1b9711242026045da35b7ffa2782): use quay.io image in CI and Dockerfile
### Clair
- [ecd8999c](https://github.com/quay/clair/commit/ecd8999cbfd6b9140f0aa8aebc11a67cbefcb4d2): fix initialization error logging
- [dc2f8936](https://github.com/quay/clair/commit/dc2f8936a564fbc234e1b8f00a3eb4778452f2ec): reorganize initialization
- [391c2f76](https://github.com/quay/clair/commit/391c2f766bcbf9c2392c12dca2bb9f225f1ef424): add Shutdown struct
### Claircore
- [f1834212](https://github.com/quay/clair/commit/f1834212272b07f02228b04a67e9339001dc51f8): bump to v0.2.0
### Clairctl
- [5740a1b0](https://github.com/quay/clair/commit/5740a1b0427c81ae5f447add372db43a1ec73dbf): Add subpath to clairctl
### Client
- [bd50a957](https://github.com/quay/clair/commit/bd50a9570d996578e0209286a66ec3d7f41d6aaf): remove request body buffering
- [ce11fd70](https://github.com/quay/clair/commit/ce11fd7077c2fb10715b37a8248b42583d930462): fix panic on request failure
 -  [#1186](https://github.com/quay/clair/issues/1186)### Codec
- [1fb6dcfd](https://github.com/quay/clair/commit/1fb6dcfd32143520aa348b184e865be7a6081134): add package for codec pooling
### Config
- [e9390fad](https://github.com/quay/clair/commit/e9390fadc24e53e455360f709e79674f752c4a29): add matchers settings
- [eb519e07](https://github.com/quay/clair/commit/eb519e0752d3cf7f5f8daeefd4ad9bd29cbfa8c2): allow gc to be disabled
- [f2d73134](https://github.com/quay/clair/commit/f2d731341722e3d59c9351c10b7e8eedbe74f276): rework into specific validators
### Docs
- [0f230f99](https://github.com/quay/clair/commit/0f230f99f22150a00b36654ee8a5a7674e5507f7): add support matrix
- [102ae88d](https://github.com/quay/clair/commit/102ae88dd84c1f769b8c037226d92b301d887aab): update cli reference
- [9d0a2b20](https://github.com/quay/clair/commit/9d0a2b20a6808f0e86cbd4f2a6046a6c7abdc2ea): fix psk related config references
- [44303dcc](https://github.com/quay/clair/commit/44303dccfd26935fd66ff041e22602c709c4a428): install clairctl correctly
- [a3bb1b6d](https://github.com/quay/clair/commit/a3bb1b6d8caebf228ac39b8793d5326bea0d1b55): use correct clairctl subcommands
 - Closes [#1122](https://github.com/quay/clair/issues/1122)### Documentation
- [2e659250](https://github.com/quay/clair/commit/2e6592500fbe9c3197782133965de6503b07b6ab): modified testing.md for clarity
 -  [#1180](https://github.com/quay/clair/issues/1180)### Httptransport
- [21dc720a](https://github.com/quay/clair/commit/21dc720a7f1e63e731eadbf72cf192913bf88c39): add mime type to indexer and matcher handler
- [8616cc68](https://github.com/quay/clair/commit/8616cc68b030fc417c693b3d2dc7208015ce9f4e): return Accepted when not ready
- [1ac26daf](https://github.com/quay/clair/commit/1ac26daf5501876495ec09f4e67b50eaca4bd1a5): fix panic in metrics registration
- [7305b3d7](https://github.com/quay/clair/commit/7305b3d735786e340833e045e2cd5888c8af866b): use correct handler for state endpoint
- [df5e7f96](https://github.com/quay/clair/commit/df5e7f9658b1fed55d067013656115b062127c23): check for err before deferring resp.Body.Close()
### Initialize
- [8a2df099](https://github.com/quay/clair/commit/8a2df099fe2e69a572e8d81b352f688f82de341a): remove New function
- [2d27ae5c](https://github.com/quay/clair/commit/2d27ae5cd3fe55737c2fa02b46616ec09ade47c5): add standalone initialization functions
### Instrospection
- [b78f954d](https://github.com/quay/clair/commit/b78f954dbf3210f7deb87dc371b1d35cba216d78): bump to opentelemetry 0.16.0
### Introspection
- [1ece08f4](https://github.com/quay/clair/commit/1ece08f49434828c8c672f08ec45844b99187983): database metrics for notifier
- [84ba35f2](https://github.com/quay/clair/commit/84ba35f29ee81849cb2f424b3624895f9bd05a79): implement prometheus http
### Local-Dev
- [1c85589a](https://github.com/quay/clair/commit/1c85589abdef98b5af8d4f6e2cd9eb5db6a723a0): remove unintented change in config.yaml
### Logging
- [9f3d167d](https://github.com/quay/clair/commit/9f3d167d5d85d345c7d0ee666be075a545a553f4): move to zlog throughout
### Matcher
- [858c540b](https://github.com/quay/clair/commit/858c540b2ef9b8d7f71d16bbe3ba797f73f654ab): add Initialized method
### Notifier
- [e7bf3b17](https://github.com/quay/clair/commit/e7bf3b1730e04ad10ec4baef1643556bf5626090): construct notification objects directly
- [99622021](https://github.com/quay/clair/commit/99622021c594149a0b0d183b6349e2ee7139e5d2): do AffectedManifests calls in chunks
### Severity_mapping
- [8e39fa40](https://github.com/quay/clair/commit/8e39fa40eebca7b50ab29f0001686fa7c5c49e1e): remove defcon1 severity
### Updaters
- [8105b033](https://github.com/quay/clair/commit/8105b033fb53f0907373f6af76af954fe95a856d): plumb update retention in

<a name="v4.0.6"></a>
## [v4.0.6] - 2021-06-15
### Chore
- [d1694147](https://github.com/quay/clair/commit/d16941471a9d2e7e5434dab9173b70c1966f75f9): v4.0.6 changelog bump
- [73adee2f](https://github.com/quay/clair/commit/73adee2f86d17460a41c0b7f08a320442ff18b91): bump claircore to v0.1.26
### Cicd
- [cd64d3ff](https://github.com/quay/clair/commit/cd64d3ffebdb4bf3f42ebb8f755f86ad7866d5d5): changelog fixups
### Clairctl
- [f745d455](https://github.com/quay/clair/commit/f745d455a26145ab06fca2efa23a9fd9da7cda2d): add support for s3 registries using V4
 - Fixes [#1264](https://github.com/quay/clair/issues/1264)
<a name="v4.0.5"></a>
## [v4.0.5] - 2021-04-16
### Chore
- [b92ba981](https://github.com/quay/clair/commit/b92ba981540bf13344f5fe48d5683fd2c600e92b): v4.0.5 changelog bump
- [486ccfb9](https://github.com/quay/clair/commit/486ccfb9d8baac5f468acf0cc0752d7d2d9f8ce4): bump cc stable to v0.1.25

<a name="v4.0.4"></a>
## [v4.0.4] - 2021-03-25
### Chore
- [4bfd7d11](https://github.com/quay/clair/commit/4bfd7d11c3f1290af889e258283f585f5f4abbd4): v4.0.4 changelog bump
- [4ff4c908](https://github.com/quay/clair/commit/4ff4c9082573cadf8c96b6e4f5e67aa46ac31699): bump cc to stable v0.1.24
### Cicd
- [0800ba46](https://github.com/quay/clair/commit/0800ba46b160c30c623f0ad7062fe7882604233e): sort changelog by semver
### Initialize
- [7c4787bf](https://github.com/quay/clair/commit/7c4787bfb1585d54f0ef371487228cb4941db5a0): wire up DisableUpdaters option

<a name="v4.0.3"></a>
## [v4.0.3] - 2021-03-12
### Chore
- [a844fb22](https://github.com/quay/clair/commit/a844fb2290bdaeb2d6f99c013e1ea3ab2b17dc6f): v4.0.3 changelog bump
- [a26eb80d](https://github.com/quay/clair/commit/a26eb80d83bf0e993ccd7df977be6bc456a0de4c): bump cc stable to v0.1.23

<a name="v4.0.2"></a>
## [v4.0.2] - 2021-02-18
### Chore
- [5c236e6d](https://github.com/quay/clair/commit/5c236e6d2afe05c92245f817337341ae6478125d): 4.0.2 changelog bump
### Client
- [8b63953e](https://github.com/quay/clair/commit/8b63953e99e0246a9428205cf51c66ec3af65ba3): fix panic on request failure
 -  [#1186](https://github.com/quay/clair/issues/1186) -  [#1188](https://github.com/quay/clair/issues/1188)
<a name="v4.0.1"></a>
## [v4.0.1] - 2021-02-15
### Chore
- [8a392f1b](https://github.com/quay/clair/commit/8a392f1bd3a381e98ece87e9ccd4842113563bb4): v4.0.1 changelog bump
- [c47be87d](https://github.com/quay/clair/commit/c47be87d6fbb0a34960001a45246d3936e5f8710): bump cc to v0.1.22 stable

<a name="v4.0.0"></a>
## [v4.0.0] - 2020-12-15
### Chore
- [73cdf7d9](https://github.com/quay/clair/commit/73cdf7d904a1aa6341a27c3ecae11c89d7444e39): v4.0.0 changelog bump
### Reverts
- Dockerfile: Get build image from Quay instead of DockerHub
- cicd: use golang image from quay.io


<a name="v4.0.0-rc.24"></a>
## [v4.0.0-rc.24] - 2020-12-11
### Chore
- [d3b3497d](https://github.com/quay/clair/commit/d3b3497d997020a879eca1190150ce73642d90b9): v4.0.0-rc.24 changelog bump
- [0515f09a](https://github.com/quay/clair/commit/0515f09a2fbc4f5a29fda476f6be1f0e77f5d8fa): bump cc to v0.1.20

<a name="v4.0.0-rc.23"></a>
## [v4.0.0-rc.23] - 2020-12-07
### Chore
- [2080ece3](https://github.com/quay/clair/commit/2080ece3032daf0f28f85dd07749886a451cf71f): v4.0.0-rc.23 changelog bump
- [289208cf](https://github.com/quay/clair/commit/289208cfab02b587366434372e5295150306abf2): bump cc to v0.1.19
### Cicd
- [30444f3b](https://github.com/quay/clair/commit/30444f3b782044373ab174ffa2628aaf9495d832): use golang image from quay.io

<a name="v4.0.0-rc.22"></a>
## [v4.0.0-rc.22] - 2020-12-02
### Chore
- [8ef85097](https://github.com/quay/clair/commit/8ef8509753387e1dcdf709e71fee16cbdd7146f9): v4.0.0-rc.22 changelog bump
- [bbe1cd8f](https://github.com/quay/clair/commit/bbe1cd8f19f62a0becbd110d27cb20b6bd699f36): claircore v0.1.18 bump
### Documentation
- [d962bef8](https://github.com/quay/clair/commit/d962bef8140516c739e322a7406c0068e2164d45): update links in howto/api

<a name="v4.0.0-rc.21"></a>
## [v4.0.0-rc.21] - 2020-12-01
### Chore
- [c6933f0a](https://github.com/quay/clair/commit/c6933f0ab78810eeb8dd3fb66cea0d86e9a7d1de): v4.0.0-rc.21 changelog bump
- [56484395](https://github.com/quay/clair/commit/5648439518cbf10b44fc7fac8a3710c044487bb8): bump cc to v0.0.17
### Cidi
- [a576bf29](https://github.com/quay/clair/commit/a576bf290ba9ccbae5d869a5f12ff2897585a2c0): bump create pull request action
### Clairctl
- [835af272](https://github.com/quay/clair/commit/835af272fad49342f51adb4633ff639de3cc14a1): fix and codify import arguments
- [b9ef1073](https://github.com/quay/clair/commit/b9ef1073ca48ed5ed7caaa3e0fbad03a7d83592c): update import and export online help
- [9883e80f](https://github.com/quay/clair/commit/9883e80f331190e60de711b0705e9b37017fc5b1): unifiy config, client handling
### Config
- [dc8ba891](https://github.com/quay/clair/commit/dc8ba8912fa482378ef393aa51b4e9528d2877f2): expose notification summary toggle
- [bb3cd669](https://github.com/quay/clair/commit/bb3cd669f66345aaa0fc5df6f502f34922cc069e): add 'omitempty' to 'updaters' config struct for correct marshalling
### Direct-Delivery
- [ea564d48](https://github.com/quay/clair/commit/ea564d489f2cb8b43c6ea1c90eb40bbcf39ebc63): Fix slices in direct notifier
### Dockerfile
- [c18563d9](https://github.com/quay/clair/commit/c18563d90b5ca9d6185f1e503c54912bcdee7564): Get build image from Quay instead of DockerHub
### Docs
- [425fc38a](https://github.com/quay/clair/commit/425fc38af9837527421ebf550259f9d7e8371039): add clairctl's new powers to the reference
- [f4169c43](https://github.com/quay/clair/commit/f4169c43d283ede2678ab620db5fa4ee9d6b2c37): Add information about AMQP delivery compatibility
### Local-Dev
- [550f6b93](https://github.com/quay/clair/commit/550f6b93b178846b243585d912c7d6efdd6abcae): fix pgadmin name
### Notifier
- [153f3e36](https://github.com/quay/clair/commit/153f3e3682921b84249950ddfbd186d825377bef): add summary tests
- [dd2e16db](https://github.com/quay/clair/commit/dd2e16db6e952fd5135dadb99ce8ec4b6ea65361): optionally disable per-manifest summary
- [77ca6535](https://github.com/quay/clair/commit/77ca6535649c4860b17d345505d44c0511d12bb0): log failed delivery reason

<a name="v4.0.0-rc.20"></a>
## [v4.0.0-rc.20] - 2020-11-02
### Chore
- [ba70ca3e](https://github.com/quay/clair/commit/ba70ca3eda70c4654d0f44348ec89231dfb40f44): v4.0.0-rc.20 changelog bump
- [e0e1f0db](https://github.com/quay/clair/commit/e0e1f0dbcd8e7ff46b3c34066f9e894ce124e84f): bump claircore to v0.1.15

<a name="v4.0.0-rc.19"></a>
## [v4.0.0-rc.19] - 2020-10-26
### Chore
- [ecdcc8ea](https://github.com/quay/clair/commit/ecdcc8ea104161ecbc36edd7cbf2d6e49e1f836d): v4.0.0-rc.19 changelog bump
### Config
- [157628df](https://github.com/quay/clair/commit/157628dfe1c7f1f837dc8df0e622a2d64a31c79a): add custom config marshaling
### Go.Mod
- [1d4f6c33](https://github.com/quay/clair/commit/1d4f6c33fa314f9a550ba4b2701ec208aff9c93f): new claircore version

<a name="v4.0.0-rc.18"></a>
## [v4.0.0-rc.18] - 2020-10-21
### Chore
- [f0881e4a](https://github.com/quay/clair/commit/f0881e4a16050a902dc1df3afe77f7ea280d77ef): v4.0.0-rc.18 changelog bump
### Notifier
- [40abaa67](https://github.com/quay/clair/commit/40abaa67e5b3e4453d6e6cf2ec3452a0c3570f42): do less work

<a name="v4.0.0-rc.17"></a>
## [v4.0.0-rc.17] - 2020-10-19
### Chore
- [37f77912](https://github.com/quay/clair/commit/37f7791287d28de53828ee35c139dc78d5f3e962): claircore bump v0.1.13
### Cicd
- [d2bc2b6c](https://github.com/quay/clair/commit/d2bc2b6cda9ff609e0e9883467095f6e425cdae9): remove deprecated set-env commands
- [0cfda4dd](https://github.com/quay/clair/commit/0cfda4ddf6a86f01fddd8b8143ce4f64b23a0527): update documentation action
- [49e01d60](https://github.com/quay/clair/commit/49e01d60feeb9fdce618d82b7b328f80bdb4fa89): fix container build
### Clairctl
- [2363778b](https://github.com/quay/clair/commit/2363778b4086a62de55cef1afa8f3c519328ec25): add environment variables for clairctl
### Docs
- [dc4bda49](https://github.com/quay/clair/commit/dc4bda499e7aeed655536aa8409b6512113eb7ea): add Makefile target to build docs website
### Local-Dev
- [15b607a9](https://github.com/quay/clair/commit/15b607a98e92d87f083d4ca406c7d795fc373cd5): add pgadmin4 container
### Notifier
- [673bd0fe](https://github.com/quay/clair/commit/673bd0fe32d5422e8eb3dff3716a2bfce81b891c): fix poller loop

<a name="v4.0.0-rc.16"></a>
## [v4.0.0-rc.16] - 2020-10-09
### Chore
- [88407e25](https://github.com/quay/clair/commit/88407e254d33b7c66e0484ee980daa3f69b1683e): v4.0.0-rc.16 changelog bump
### Cicd
- [96909bf3](https://github.com/quay/clair/commit/96909bf3bfca47c8ea1ce0b53d9d5b7e9897b55e): exclude darwin/arm64
- [7786d7d3](https://github.com/quay/clair/commit/7786d7d34b01b48f9d2d87682faa54936c25a21f): more debugging
- [89c26ec5](https://github.com/quay/clair/commit/89c26ec55443050d2e3dd425b4e37a15fe96c061): more debugging
- [7a1eeafd](https://github.com/quay/clair/commit/7a1eeafd0bebc261f356f05244c3a946bfee8c87): make sure the workspace exists
- [68c0318b](https://github.com/quay/clair/commit/68c0318b1b225387402a3d4e66c1803f64fd1d98): make empty changelog on manual trigger
- [4e5ee290](https://github.com/quay/clair/commit/4e5ee2908d49191f54951cc276cf95387f90b83c): rig up a workflow_dispatch to help debugging

<a name="v4.0.0-rc.15"></a>
## [v4.0.0-rc.15] - 2020-10-09
### Chore
- [8d87481b](https://github.com/quay/clair/commit/8d87481b80e495c52c8677eae2db1e288576dcb1): v4.0.0-rc.15 changelog bump
### Cicd
- [d7582487](https://github.com/quay/clair/commit/d758248755fe18f4658eee93cc5d40dc2b206c06): maybe there's some newline issues

<a name="v4.0.0-rc.14"></a>
## [v4.0.0-rc.14] - 2020-10-09
### Chore
- [e46b4f89](https://github.com/quay/clair/commit/e46b4f89aa2a4a13062c2dd4726b66d476ef8b24): v4.0.0-rc.14 changelog bump
### Cicd
- [58a987d6](https://github.com/quay/clair/commit/58a987d6078506357933b378c299576bf15e39c8): invalid goos+goarch pair

<a name="v4.0.0-rc.13"></a>
## [v4.0.0-rc.13] - 2020-10-09
### Chore
- [63263273](https://github.com/quay/clair/commit/63263273a7440cb93fcd044a33ad2d0b5a70f425): v4.0.0-rc.13 changelog bump
### Cicd
- [f6a28c2d](https://github.com/quay/clair/commit/f6a28c2dcc252b4e8be08158a227b8fed7b71b27): fix goos/goarch

<a name="v4.0.0-rc.12"></a>
## [v4.0.0-rc.12] - 2020-10-08
### Chore
- [61ce6759](https://github.com/quay/clair/commit/61ce675946bd186f5a0be800ab26cad3f008a0f1): v4.0.0-rc.12 changelog bump
### Cicd
- [28dcd944](https://github.com/quay/clair/commit/28dcd9443f95c4243a94896b04ff7b3075a1c21c): parallelize release process, keep test failures
### Clairctl
- [b1fee08e](https://github.com/quay/clair/commit/b1fee08e43401fdbe6fd9af222bbe64b6412c773): update some interactive help
### Go.Mod
- [af868db1](https://github.com/quay/clair/commit/af868db100705074f718f1a8f7caaafaa8b88220): update dependencies
### Local-Dev
- [3b602925](https://github.com/quay/clair/commit/3b60292591900173f4eda02461d3891e48d070c2): make quay container ignore validations
### Notifier
- [0c1554e9](https://github.com/quay/clair/commit/0c1554e9aa6cb8d1116376bf303c8af8e5112b23): ensure Content-Type header present in webhook notification
- [a2d5f9b9](https://github.com/quay/clair/commit/a2d5f9b92371094ade82b8f9bef19d72fb8addcd): copy url struct
### Pull Requests
- Merge pull request [#1086](https://github.com/quay/clair/issues/1086) from alecmerdler/webhook-notifier-headers


<a name="v4.0.0-rc.11"></a>
## [v4.0.0-rc.11] - 2020-10-02
### Chore
- [f9f86350](https://github.com/quay/clair/commit/f9f86350521ed9c02258c713a992d76976fab9cc): v4.0.0-rc.11 changelog bump
### Config
- [a4e04105](https://github.com/quay/clair/commit/a4e04105cb15173ee3b06090de7573540969a89c): allow HTTP client to specify claims
- [5aba7278](https://github.com/quay/clair/commit/5aba72783bff70fa41769cbe33365a34835bd73f): ensure yaml/json struct tag for auth 'Issuer' field are the same
### Notifier
- [57e1ed0a](https://github.com/quay/clair/commit/57e1ed0a1178ca5b980f65e5030a00a82acf52c8): pass configured client into notifier
### Pull Requests
- Merge pull request [#1078](https://github.com/quay/clair/issues/1078) from alecmerdler/fix-issuer-struct-tag


<a name="v4.0.0-rc.10"></a>
## [v4.0.0-rc.10] - 2020-10-01
### Chore
- [2c54a824](https://github.com/quay/clair/commit/2c54a82467af83db44b9dcccdfb73a320699426b): v4.0.0-rc.10 changelog bump
### Cicd
- [f04bc76c](https://github.com/quay/clair/commit/f04bc76c666b3d1c5098dcc14b928a165066549a): api reference check
### Docs
- [0d8a2a4a](https://github.com/quay/clair/commit/0d8a2a4aae8358597e3b67cbf4deb8be79e76dec): bump api reference
### Go.Mod
- [bd1a3b77](https://github.com/quay/clair/commit/bd1a3b772c2dbd6ae87a94c5608f1cdc2bf0044a): update claircore version
### Httptransport
- [2c9762b0](https://github.com/quay/clair/commit/2c9762b0351449b5b09249da513178b3d2757985): remove redundant method check
### Openapi
- [015d862d](https://github.com/quay/clair/commit/015d862dce63068951d145c5512ec95977262a03): yamllint and spellcheck
- [d06dabfe](https://github.com/quay/clair/commit/d06dabfe57fbb90ba376e8f1fa81d18db90ed070): change OperationIDs for notification endpoints

<a name="v4.0.0-rc.9"></a>
## [v4.0.0-rc.9] - 2020-09-29
### Cicd
- [04fab4a7](https://github.com/quay/clair/commit/04fab4a7ef9344ee5e3578c60873a5e56bff64b7): build container with local checkout

<a name="v4.0.0-rc.8"></a>
## [v4.0.0-rc.8] - 2020-09-29
### Chore
- [6181cc6c](https://github.com/quay/clair/commit/6181cc6c7a47203482f420ccd257318a0d478978): v4.0.0-rc.8 changelog bump
### Cicd
- [7520b091](https://github.com/quay/clair/commit/7520b0912967a0811660ead8e35f80d85899c000): fix container building

<a name="v4.0.0-rc.7"></a>
## [v4.0.0-rc.7] - 2020-09-29
### Chore
- [9282d299](https://github.com/quay/clair/commit/9282d299fda9f1dee321d0f9b883651e18bf4bf8): v4.0.0-rc.7 changelog bump
### Cicd
- [195ce7a5](https://github.com/quay/clair/commit/195ce7a59a5db9d7e1f854e25242434e82635fa7): move container building out of container

<a name="v4.0.0-rc.6"></a>
## [v4.0.0-rc.6] - 2020-09-29
### Chore
- [2f5756de](https://github.com/quay/clair/commit/2f5756de91a4367c4ebda047f2dcbc29bf252d6f): v4.0.0-rc.6 changelog bump
### Cicd
- [f6aa6e6e](https://github.com/quay/clair/commit/f6aa6e6e028f73c5ae05e65e2c870972fa04393d): use multiline string for clairctl build command

<a name="v4.0.0-rc.5"></a>
## [v4.0.0-rc.5] - 2020-09-29
### Chore
- [9b9ab323](https://github.com/quay/clair/commit/9b9ab323147b14dbd9fecf4c0620c8f34ae7b23a): v4.0.0-rc.5 changelog bump
### Cicd
- [9aa8adc1](https://github.com/quay/clair/commit/9aa8adc10d4e48b01abff666e160b498d982124a): fix clairctl builds

<a name="v4.0.0-rc.4"></a>
## [v4.0.0-rc.4] - 2020-09-29
### Chore
- [31adc6de](https://github.com/quay/clair/commit/31adc6dec374eb2ff1a08cf1154d327cf5f30865): v4.0.0-rc.4 changelog bump
- [d141c5ca](https://github.com/quay/clair/commit/d141c5cac5d4e4b13f614ebedb89c99ee3ebf8b0): bump claircore to v0.1.9
- [cd34ea9e](https://github.com/quay/clair/commit/cd34ea9e264a8690bb88866f96a407949b14b0a1): remove unused files
### Cicd
- [600c737c](https://github.com/quay/clair/commit/600c737c659ea03a6695cc6c0dda0f1d8cce4497): constrain changelog
- [c447bcce](https://github.com/quay/clair/commit/c447bcce4ce4546228b91559c85108ec7a3194af): commit check regexp fix
- [54ee2d25](https://github.com/quay/clair/commit/54ee2d25cd05593edc38a94103bef459f6219c4b): change log generation and releases
### Docs
- [d34acaf5](https://github.com/quay/clair/commit/d34acaf54063d04979820a6be6e8c0181fc0fb65): update for v4
### Httptransport
- [e1144aaf](https://github.com/quay/clair/commit/e1144aaf0af143d63c59d1cfcc8f06490377c1d8): made discovery endpoint more Accepting
### Misc
- [18e4db2c](https://github.com/quay/clair/commit/18e4db2c0298696797975911ff4c7b48f41b54fc): doc and commit check fixes
### Notifier
- [7d95067f](https://github.com/quay/clair/commit/7d95067f4762ec1aa79879e23c7956eaef8ca4f7): remove first update constraint

<a name="v4.0.0-rc.3"></a>
## [v4.0.0-rc.3] - 2020-09-23
### Auth
- [f00698ba](https://github.com/quay/clair/commit/f00698ba36ac1b88bb77f21ca4e9d99caf28b0b1): psk fixup
### Chore
- [a38501b3](https://github.com/quay/clair/commit/a38501b3aabb92b244f51268e565c1763f62622b): claircore bump to v0.1.8
### Client
- [32b327f7](https://github.com/quay/clair/commit/32b327f701f579d595b5b94cb7ca08813e366101): fix nil check
### Deployment
- [bc4c3243](https://github.com/quay/clair/commit/bc4c3243c0e0bb952bb2e5d7a29d9e5d08e71962): use service prefix for simplified path routing
### Docs
- [4f35fd09](https://github.com/quay/clair/commit/4f35fd0959cbfb2f7c195c45d17d1c90ca1b7390): rework mdbook
### Logging
- [15f3755b](https://github.com/quay/clair/commit/15f3755b349064a9093fa199e2a89e89038a1b61): use duration stringer
- [10b87578](https://github.com/quay/clair/commit/10b87578aa55ecaed27d36964b1de18e7eaffe42): add similar logging to v3

<a name="v4.0.0-rc.2"></a>
## [v4.0.0-rc.2] - 2020-09-11
### Chore
- [f41fba50](https://github.com/quay/clair/commit/f41fba5087f0ff5ebcd3724cb22975a5547fa572): bump cc and golang container

<a name="v4.0.0-rc.1"></a>
## [v4.0.0-rc.1] - 2020-09-10
### Auth
- [29ed5f60](https://github.com/quay/clair/commit/29ed5f60b8dfe882f95aae7d61b1e373e06a2145): use better guesses for "aud" claim
- [6932ad32](https://github.com/quay/clair/commit/6932ad3264c3b1760ef46d094b25c12664cee1cc): add keyserver algorithm allowlist
- [dc91ec9e](https://github.com/quay/clair/commit/dc91ec9e96db7ab7eee853c89a768ac0414a8f9a): test multiple PSK signing algorithms
### Clairctl
- [c0a9c0b7](https://github.com/quay/clair/commit/c0a9c0b7d336de1377eb3cb14fb8a1af97a49b3e): init default updaters
- [050bc2d1](https://github.com/quay/clair/commit/050bc2d1f44824f2573c6219a21d3a00e1ce7a76): add import and export commands
### Config
- [03cf7555](https://github.com/quay/clair/commit/03cf7555ab13856fddd5b71e1374d1
Download .txt
gitextract_yglcs5c1/

├── .chglog/
│   ├── CHANGELOG.tpl.md
│   └── config.yml
├── .clang-format
├── .dockerignore
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE.md
│   ├── actions/
│   │   ├── documentation/
│   │   │   └── action.yml
│   │   ├── go-cache/
│   │   │   └── action.yml
│   │   ├── go-tidy/
│   │   │   └── action.yml
│   │   └── set-image-expiration/
│   │       └── action.yml
│   ├── dependabot.yml
│   ├── issue-close-app.yml
│   ├── script/
│   │   └── nightly-module.sh
│   └── workflows/
│       ├── .gitignore
│       ├── .yamllint
│       ├── Makefile
│       ├── check-fast-forward.yml
│       ├── config-ci.yml
│       ├── cut-release.yml
│       ├── documentation.yml
│       ├── fast-forward.yml
│       ├── main.yml
│       ├── nightly-ci.yml
│       ├── nightly.yml
│       ├── prepare-release.yml
│       ├── tests.yml
│       └── v2-issues.yml
├── .gitignore
├── CHANGELOG.md
├── CODEOWNERS
├── DCO
├── Dockerfile
├── Documentation/
│   ├── SUMMARY.md
│   ├── concepts/
│   │   ├── api_internal.md
│   │   ├── authentication.md
│   │   ├── indexing.md
│   │   ├── matching.md
│   │   ├── notifications.md
│   │   ├── operation.md
│   │   └── updatersandairgap.md
│   ├── concepts.md
│   ├── contribution/
│   │   ├── building.md
│   │   ├── commit_style.md
│   │   ├── openapi.md
│   │   └── releases.md
│   ├── contribution.md
│   ├── howto/
│   │   ├── api.md
│   │   ├── deployment.md
│   │   ├── getting_started.md
│   │   └── testing.md
│   ├── howto.md
│   ├── listing_test.go
│   ├── reference/
│   │   ├── api.md
│   │   ├── clairctl.md
│   │   ├── config.md
│   │   ├── indexer.md
│   │   ├── matcher.md
│   │   ├── metrics.md
│   │   └── notifier.md
│   ├── reference.md
│   ├── reference_test.go
│   └── whatis.md
├── LICENSE
├── Makefile
├── NOTICE
├── README.md
├── ROADMAP.md
├── book.toml
├── clair-error/
│   ├── errors.go
│   └── notifications.go
├── cmd/
│   ├── build.go
│   ├── clair/
│   │   ├── main.go
│   │   ├── os_other.go
│   │   └── os_unix.go
│   ├── config.go
│   ├── config_test.go
│   └── testdata/
│       ├── ComplexJSON/
│       │   ├── config.json
│       │   ├── config.json.d/
│       │   │   └── dropin.json
│       │   └── want.json
│       ├── ComplexYAML/
│       │   ├── config.yaml
│       │   ├── config.yaml.d/
│       │   │   ├── dropin.yaml
│       │   │   ├── empty.yaml
│       │   │   ├── ignored.json-patch
│       │   │   ├── later.yaml
│       │   │   └── updater.yaml-patch
│       │   └── want.json
│       ├── Error/
│       │   ├── BadKind.toml
│       │   ├── BadPatch.json
│       │   ├── BadPatch.json.d/
│       │   │   ├── decode.json-patch
│       │   │   └── invalid.json-patch
│       │   ├── Indents.yaml
│       │   ├── NotAnArray.json
│       │   ├── NotAnArray.json.d/
│       │   │   └── badpatch.json-patch
│       │   ├── NotAnObject.json
│       │   ├── NotYAML.yaml
│       │   └── TooShort.json
│       ├── SimpleJSON/
│       │   ├── config.json
│       │   └── want.json
│       └── SimpleYAML/
│           ├── config.yaml
│           └── want.json
├── code-of-conduct.md
├── config/
│   ├── auth.go
│   ├── auth_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── database.go
│   ├── defaults.go
│   ├── doc.go
│   ├── enums.go
│   ├── enums_string.go
│   ├── enums_test.go
│   ├── go.mod
│   ├── go.sum
│   ├── indexer.go
│   ├── introspection.go
│   ├── lint.go
│   ├── lint_test.go
│   ├── matcher.go
│   ├── matchers.go
│   ├── notifier.go
│   ├── otlp.go
│   ├── otlpcompressor_string.go
│   ├── reflect.go
│   ├── tags_test.go
│   ├── tls.go
│   ├── updaters.go
│   └── validate.go
├── config.yaml.sample
├── contrib/
│   ├── cmd/
│   │   └── quaybackstop/
│   │       ├── Dockerfile
│   │       ├── clair.go
│   │       ├── main.go
│   │       ├── main_old.go
│   │       ├── quay.go
│   │       ├── sig_linux.go
│   │       └── sig_other.go
│   └── openshift/
│       ├── build_and_deploy.sh
│       ├── grafana/
│       │   ├── dashboard-clair.configmap.yaml.tpl
│       │   └── dashboards/
│       │       └── dashboard-clair.configmap.yaml
│       ├── manifests/
│       │   ├── backstop.yaml
│       │   ├── db-job.yaml
│       │   └── manifests.yaml
│       └── pr_check.sh
├── docker-compose.yaml
├── etc/
│   ├── .gitignore
│   ├── config.mk
│   ├── container.mk
│   ├── dev.mk
│   ├── dist.mk
│   └── doc.mk
├── go.mod
├── go.sum
├── health/
│   ├── readinesshandler.go
│   └── readinesshandler_test.go
├── httptransport/
│   ├── api/
│   │   ├── .gitattributes
│   │   ├── lib/
│   │   │   └── oapi.jq
│   │   ├── openapi.zsh
│   │   └── v1/
│   │       ├── examples/
│   │       │   ├── affected_manifests.json
│   │       │   ├── bulk_delete.json
│   │       │   ├── cpe.json
│   │       │   ├── digest.json
│   │       │   ├── distribution.json
│   │       │   ├── environment.json
│   │       │   ├── manifest.json
│   │       │   ├── notification_page.json
│   │       │   ├── package.json
│   │       │   ├── vulnerability.json
│   │       │   └── vulnerability_summary.json
│   │       ├── openapi.etag
│   │       ├── openapi.jq
│   │       ├── openapi.json
│   │       └── openapi.yaml
│   ├── auth.go
│   ├── auth_test.go
│   ├── client/
│   │   ├── httpclient.go
│   │   ├── indexer.go
│   │   ├── matcher.go
│   │   └── matcher_test.go
│   ├── common.go
│   ├── concurrentlimit.go
│   ├── concurrentlimit_test.go
│   ├── discoveryhandler.go
│   ├── discoveryhandler_test.go
│   ├── error.go
│   ├── error_test.go
│   ├── gone.go
│   ├── indexer_v1.go
│   ├── indexer_v1_test.go
│   ├── instrumentation.go
│   ├── instrumentation_test.go
│   ├── matcher_v1.go
│   ├── matcher_v1_test.go
│   ├── notification_v1.go
│   ├── notification_v1_test.go
│   ├── robotshandler.go
│   ├── robotshandler_test.go
│   ├── server.go
│   ├── server_test.go
│   └── types/
│       └── v1/
│           ├── affected_manifests.schema.json
│           ├── bulk_delete.schema.json
│           ├── cpe.schema.json
│           ├── digest.schema.json
│           ├── distribution.schema.json
│           ├── environment.schema.json
│           ├── error.schema.json
│           ├── index_report.schema.json
│           ├── index_state.schema.json
│           ├── layer.schema.json
│           ├── manifest.schema.json
│           ├── normalized_severity.schema.json
│           ├── notification.schema.json
│           ├── notification_page.schema.json
│           ├── notification_webhook.schema.json
│           ├── package.schema.json
│           ├── range.schema.json
│           ├── repository.schema.json
│           ├── types.go
│           ├── update_diff.schema.json
│           ├── update_operation.schema.json
│           ├── update_operations.schema.json
│           ├── vulnerability.schema.json
│           ├── vulnerability_core.schema.json
│           ├── vulnerability_report.schema.json
│           ├── vulnerability_summaries.schema.json
│           └── vulnerability_summary.schema.json
├── indexer/
│   ├── mock.go
│   └── service.go
├── initialize/
│   ├── auto/
│   │   ├── auto.go
│   │   ├── auto_test.go
│   │   ├── cpu.go
│   │   ├── cpu_linux.go
│   │   ├── cpu_linux_test.go
│   │   ├── memory.go
│   │   ├── memory_linux.go
│   │   ├── memory_linux_test.go
│   │   └── profiling.go
│   ├── logging.go
│   └── services.go
├── internal/
│   ├── codec/
│   │   ├── codec.go
│   │   ├── codec_test.go
│   │   └── reader.go
│   ├── httputil/
│   │   ├── client.go
│   │   ├── client_test.go
│   │   ├── ratelimiter.go
│   │   ├── ratelimiter_test.go
│   │   ├── responserecorder.go
│   │   ├── responserecorder_test.go
│   │   └── signer.go
│   └── logging/
│       └── logging.go
├── introspection/
│   ├── otlp.go
│   └── server.go
├── local-dev/
│   ├── clair/
│   │   ├── .gitignore
│   │   ├── config.yaml
│   │   ├── config.yaml.d/
│   │   │   └── .gitignore
│   │   ├── init.sql
│   │   └── quay.yaml.d/
│   │       └── .gitignore
│   ├── grafana/
│   │   └── provisioning/
│   │       ├── dashboards/
│   │       │   ├── clair.json
│   │       │   ├── dashboard.yml
│   │       │   └── database.json
│   │       └── datasources/
│   │           └── datasource.yml
│   ├── pgadmin/
│   │   ├── passfile.txt
│   │   └── servers.json
│   ├── prometheus/
│   │   └── prometheus.yml
│   ├── pyroscope/
│   │   └── server.yml
│   ├── quay/
│   │   └── config.yaml
│   └── traefik/
│       ├── config/
│       │   ├── clair.yaml
│       │   ├── dashboard.yaml
│       │   ├── grafana.yaml
│       │   ├── jaeger.yaml
│       │   ├── pgadmin.yaml
│       │   ├── postgresql.yaml
│       │   ├── prom.yaml
│       │   ├── pyroscope.yaml
│       │   ├── quay.yaml
│       │   └── rabbitmq.yaml
│       └── traefik.yaml
├── matcher/
│   ├── mock.go
│   └── service.go
├── middleware/
│   ├── auth/
│   │   ├── handler.go
│   │   ├── httpauth_psk.go
│   │   └── httpauth_psk_test.go
│   └── compress/
│       ├── handler.go
│       └── handler_test.go
└── notifier/
    ├── amqp/
    │   ├── deliverer.go
    │   ├── deliverer_integration_test.go
    │   ├── directdeliverer.go
    │   ├── directdeliverer_integration_test.go
    │   ├── doc.go
    │   └── failover.go
    ├── callback.go
    ├── callback_test.go
    ├── deliverer.go
    ├── delivery.go
    ├── locker.go
    ├── migrations/
    │   ├── 01-init.sql
    │   ├── 02-constraints.sql
    │   ├── 03-constraints.sql
    │   ├── 04-drop-key.sql
    │   └── migrations.go
    ├── mockstore.go
    ├── notification.go
    ├── notificationhandle.go
    ├── pager.go
    ├── poller.go
    ├── postgres/
    │   ├── e2e_test.go
    │   ├── get_status.go
    │   ├── notifications.go
    │   ├── notifications_test.go
    │   ├── pagination_test.go
    │   ├── postgres_test.go
    │   ├── receipt.go
    │   ├── set_status.go
    │   ├── store.go
    │   ├── store_test.go
    │   └── testdata/
    │       └── .gitignore
    ├── processor.go
    ├── processor_create_test.go
    ├── processor_safe_test.go
    ├── receipt.go
    ├── service/
    │   ├── mock.go
    │   ├── notifier.go
    │   └── testmode.go
    ├── service.go
    ├── stomp/
    │   ├── deliverer.go
    │   ├── directdeliverer.go
    │   ├── doc.go
    │   ├── failover.go
    │   └── integration_test.go
    ├── store.go
    ├── summary_test.go
    ├── vulnsummary.go
    └── webhook/
        ├── cmd/
        │   └── webhookd/
        │       └── main.go
        ├── deliverer.go
        └── deliverer_test.go
Download .txt
SYMBOL INDEX (684 symbols across 140 files)

FILE: Documentation/listing_test.go
  function TestListing (line 17) | func TestListing(t *testing.T) {

FILE: Documentation/reference_test.go
  function TestConfigReference (line 17) | func TestConfigReference(t *testing.T) {
  type walkFunc (line 46) | type walkFunc
  function walk (line 48) | func walk(ws *[]string, path string, t reflect.Type) error {

FILE: clair-error/errors.go
  type ErrRequestFail (line 10) | type ErrRequestFail struct
    method Error (line 15) | func (e *ErrRequestFail) Error() string {
  type ErrBadManifest (line 20) | type ErrBadManifest struct
    method Error (line 24) | func (e *ErrBadManifest) Error() string {
    method Unwrap (line 28) | func (e *ErrBadManifest) Unwrap() error {
  type ErrBadIndexReport (line 33) | type ErrBadIndexReport struct
    method Error (line 37) | func (e *ErrBadIndexReport) Error() string {
    method Unwrap (line 41) | func (e *ErrBadIndexReport) Unwrap() error {
  type ErrIndexStart (line 46) | type ErrIndexStart struct
    method Error (line 50) | func (e *ErrIndexStart) Error() string {
    method Unwrap (line 54) | func (e *ErrIndexStart) Unwrap() error {
  type ErrIndexReportNotFound (line 59) | type ErrIndexReportNotFound struct
    method Error (line 63) | func (e *ErrIndexReportNotFound) Error() string {
  type ErrIndexReportRetrieval (line 68) | type ErrIndexReportRetrieval struct
    method Error (line 72) | func (e *ErrIndexReportRetrieval) Error() string {
    method Unwrap (line 76) | func (e *ErrIndexReportRetrieval) Unwrap() error {
  type ErrMatch (line 81) | type ErrMatch struct
    method Error (line 85) | func (e *ErrMatch) Error() string {
    method Unwrap (line 89) | func (e *ErrMatch) Unwrap() error {
  type ErrNotInitialized (line 94) | type ErrNotInitialized struct
    method Error (line 98) | func (e ErrNotInitialized) Error() string {
  type ErrBadVulnerabilities (line 104) | type ErrBadVulnerabilities struct
    method Error (line 108) | func (e *ErrBadVulnerabilities) Error() string {
    method Unwrap (line 112) | func (e *ErrBadVulnerabilities) Unwrap() error {
  type ErrBadAffectedManifests (line 118) | type ErrBadAffectedManifests struct
    method Error (line 122) | func (e *ErrBadAffectedManifests) Error() string {
    method Unwrap (line 126) | func (e *ErrBadAffectedManifests) Unwrap() error {
  type ErrKeyNotFound (line 130) | type ErrKeyNotFound struct
    method Error (line 134) | func (e ErrKeyNotFound) Error() string {

FILE: clair-error/notifications.go
  type ErrNoUpdateOperation (line 11) | type ErrNoUpdateOperation struct
    method Error (line 15) | func (e ErrNoUpdateOperation) Error() string {
  type ErrBadNotification (line 21) | type ErrBadNotification struct
    method Error (line 26) | func (e ErrBadNotification) Error() string {
    method Unwrap (line 30) | func (e ErrBadNotification) Unwrap() error {
  type ErrDeleteNotification (line 36) | type ErrDeleteNotification struct
    method Error (line 41) | func (e ErrDeleteNotification) Error() string {
    method Unwrap (line 45) | func (e ErrDeleteNotification) Unwrap() error {
  type ErrNoReceipt (line 50) | type ErrNoReceipt struct
    method Error (line 54) | func (e ErrNoReceipt) Error() string {
  type ErrReceipt (line 59) | type ErrReceipt struct
    method Error (line 64) | func (e ErrReceipt) Error() string {
    method Unwrap (line 68) | func (e ErrReceipt) Unwrap() error {
  type ErrCreated (line 73) | type ErrCreated struct
    method Error (line 77) | func (e ErrCreated) Error() string {
    method Unwrap (line 81) | func (e ErrCreated) Unwrap() error {
  type ErrFailed (line 86) | type ErrFailed struct
    method Error (line 90) | func (e ErrFailed) Error() string {
    method Unwrap (line 94) | func (e ErrFailed) Unwrap() error {
  type ErrPutNotifications (line 101) | type ErrPutNotifications struct
    method Error (line 106) | func (e ErrPutNotifications) Error() string {
    method Unwrap (line 110) | func (e ErrPutNotifications) Unwrap() error {
  type ErrDeliveryFailed (line 115) | type ErrDeliveryFailed struct
    method Error (line 119) | func (e ErrDeliveryFailed) Error() string {
    method Unwrap (line 123) | func (e ErrDeliveryFailed) Unwrap() error {

FILE: cmd/build.go
  constant describe (line 18) | describe = `$Format:%(describe:match=v4.*)$`
  constant revision (line 19) | revision = `$Format:%h (%cI)$`
  function init (line 38) | func init() {

FILE: cmd/clair/main.go
  constant envConfig (line 30) | envConfig = `CLAIR_CONF`
  constant envMode (line 31) | envMode   = `CLAIR_MODE`
  function main (line 34) | func main() {
  function serveAPI (line 125) | func serveAPI(ctx context.Context, cfg *config.Config) func() error {
  function serveIntrospection (line 173) | func serveIntrospection(ctx context.Context, cfg *config.Config) func() ...

FILE: cmd/config.go
  function LoadConfig (line 40) | func LoadConfig(cfg *config.Config, name string, strict bool) error {
  function loadAsJSON (line 141) | func loadAsJSON(path string) ([]byte, error) {

FILE: cmd/config_test.go
  function TestLoadConfig (line 16) | func TestLoadConfig(t *testing.T) {

FILE: config/auth.go
  type Base64 (line 10) | type Base64
    method MarshalText (line 18) | func (b Base64) MarshalText() ([]byte, error) {
    method UnmarshalText (line 26) | func (b *Base64) UnmarshalText(in []byte) error {
  type Auth (line 41) | type Auth struct
    method Any (line 47) | func (a Auth) Any() bool {
    method lint (line 51) | func (a *Auth) lint() ([]Warning, error) {
  type AuthKeyserver (line 64) | type AuthKeyserver struct
    method lint (line 69) | func (a *AuthKeyserver) lint() ([]Warning, error) {
  type AuthPSK (line 78) | type AuthPSK struct
    method validate (line 83) | func (a *AuthPSK) validate(_ Mode) ([]Warning, error) {

FILE: config/auth_test.go
  function TestBase64 (line 14) | func TestBase64(t *testing.T) {
  function TestAuthUnmarshal (line 32) | func TestAuthUnmarshal(t *testing.T) {
  function TestAuthMarshal (line 92) | func TestAuthMarshal(t *testing.T) {

FILE: config/config.go
  type Config (line 11) | type Config struct
    method validate (line 45) | func (c *Config) validate(mode Mode) ([]Warning, error) {
    method lint (line 64) | func (c *Config) lint() (ws []Warning, err error) {
  type Duration (line 81) | type Duration
    method UnmarshalText (line 84) | func (d *Duration) UnmarshalText(b []byte) error {
    method MarshalText (line 94) | func (d *Duration) MarshalText() ([]byte, error) {

FILE: config/config_test.go
  type ValidateTestcase (line 11) | type ValidateTestcase struct
    method Run (line 17) | func (tc ValidateTestcase) Run(t *testing.T) {
  function TestValidateFailure (line 35) | func TestValidateFailure(t *testing.T) {
  function TestUpdateRetention (line 346) | func TestUpdateRetention(t *testing.T) {
  function TestDisableUpdaters (line 385) | func TestDisableUpdaters(t *testing.T) {

FILE: config/database.go
  function checkDSN (line 9) | func checkDSN(s string) (w []Warning, err error) {

FILE: config/defaults.go
  constant DefaultAddress (line 8) | DefaultAddress = ":6060"
  constant DefaultScanLockRetry (line 11) | DefaultScanLockRetry = 1
  constant DefaultMatcherPeriod (line 13) | DefaultMatcherPeriod = 6 * time.Hour
  constant DefaultUpdateRetention (line 16) | DefaultUpdateRetention = 10
  constant DefaultNotifierPollInterval (line 20) | DefaultNotifierPollInterval = 6 * time.Hour
  constant DefaultNotifierDeliveryInterval (line 24) | DefaultNotifierDeliveryInterval = 1 * time.Hour

FILE: config/enums.go
  type Mode (line 16) | type Mode
  constant ComboMode (line 20) | ComboMode    Mode = iota
  constant IndexerMode (line 21) | IndexerMode
  constant MatcherMode (line 22) | MatcherMode
  constant NotifierMode (line 23) | NotifierMode
  function ParseMode (line 29) | func ParseMode(s string) (Mode, error) {
  type LogLevel (line 42) | type LogLevel
    method UnmarshalText (line 72) | func (l *LogLevel) UnmarshalText(b []byte) (err error) {
    method MarshalText (line 81) | func (l *LogLevel) MarshalText() ([]byte, error) {
  constant InfoLog (line 49) | InfoLog       LogLevel = iota
  constant DebugColorLog (line 50) | DebugColorLog
  constant DebugLog (line 51) | DebugLog
  constant WarnLog (line 52) | WarnLog
  constant ErrorLog (line 53) | ErrorLog
  constant FatalLog (line 54) | FatalLog
  constant PanicLog (line 55) | PanicLog
  function ParseLogLevel (line 61) | func ParseLogLevel(s string) (LogLevel, error) {

FILE: config/enums_string.go
  function _ (line 7) | func _() {
  constant _Mode_name (line 17) | _Mode_name = "comboindexermatchernotifier"
  method String (line 21) | func (i Mode) String() string {
  function _ (line 27) | func _() {
  constant _LogLevel_name (line 40) | _LogLevel_name = "infodebug-colordebugwarnerrorfatalpanic"
  method String (line 44) | func (i LogLevel) String() string {

FILE: config/enums_test.go
  function TestEnumMarshal (line 10) | func TestEnumMarshal(t *testing.T) {

FILE: config/indexer.go
  type Indexer (line 6) | type Indexer struct
    method validate (line 51) | func (i *Indexer) validate(mode Mode) (ws []Warning, err error) {
    method lint (line 73) | func (i *Indexer) lint() (ws []Warning, err error) {
  type ScannerConfig (line 107) | type ScannerConfig struct

FILE: config/introspection.go
  type Trace (line 8) | type Trace struct
    method lint (line 16) | func (t *Trace) lint() ([]Warning, error) {
  type Jaeger (line 41) | type Jaeger struct
  type Sentry (line 58) | type Sentry struct
  type Metrics (line 69) | type Metrics struct
    method lint (line 75) | func (m *Metrics) lint() ([]Warning, error) {
  type Prometheus (line 94) | type Prometheus struct

FILE: config/lint.go
  function Lint (line 14) | func Lint(c *Config) ([]Warning, error) {
  type linter (line 25) | type linter interface
  type Warning (line 33) | type Warning struct
    method Error (line 41) | func (w *Warning) Error() string {
    method Unwrap (line 54) | func (w *Warning) Unwrap() error { return w.inner }

FILE: config/lint_test.go
  function init (line 9) | func init() {
  function ExampleLint (line 20) | func ExampleLint() {

FILE: config/matcher.go
  type Matcher (line 9) | type Matcher struct
    method validate (line 64) | func (m *Matcher) validate(mode Mode) ([]Warning, error) {
    method lint (line 98) | func (m *Matcher) lint() (ws []Warning, err error) {

FILE: config/matchers.go
  type Matchers (line 4) | type Matchers struct

FILE: config/notifier.go
  type Notifier (line 14) | type Notifier struct
    method validate (line 69) | func (n *Notifier) validate(mode Mode) ([]Warning, error) {
    method lint (line 94) | func (n *Notifier) lint() (ws []Warning, err error) {
  type Webhook (line 146) | type Webhook struct
    method validate (line 162) | func (w *Webhook) validate(mode Mode) ([]Warning, error) {
    method lint (line 191) | func (w *Webhook) lint() ([]Warning, error) {
  type Exchange (line 205) | type Exchange struct
    method validate (line 220) | func (e *Exchange) validate(_ Mode) ([]Warning, error) {
  type AMQP (line 228) | type AMQP struct
    method validate (line 262) | func (c *AMQP) validate(mode Mode) ([]Warning, error) {
    method lint (line 299) | func (c *AMQP) lint() (w []Warning, err error) {
  type Login (line 314) | type Login struct
  type STOMP (line 320) | type STOMP struct
    method validate (line 350) | func (c *STOMP) validate(mode Mode) ([]Warning, error) {
    method lint (line 383) | func (c *STOMP) lint() (w []Warning, err error) {

FILE: config/otlp.go
  type OTLPCommon (line 10) | type OTLPCommon struct
    method lint (line 40) | func (c *OTLPCommon) lint() (ws []Warning, _ error) {
    method validate (line 51) | func (c *OTLPCommon) validate(_ Mode) (ws []Warning, _ error) {
  type OTLPHTTPCommon (line 56) | type OTLPHTTPCommon struct
    method lint (line 64) | func (c *OTLPHTTPCommon) lint() (ws []Warning, _ error) {
    method validate (line 75) | func (c *OTLPHTTPCommon) validate(_ Mode) (ws []Warning, err error) {
  type OTLPgRPCCommon (line 93) | type OTLPgRPCCommon struct
  type TraceOTLP (line 110) | type TraceOTLP struct
    method lint (line 118) | func (t *TraceOTLP) lint() (ws []Warning, _ error) {
  type TraceOTLPHTTP (line 128) | type TraceOTLPHTTP struct
  type TraceOTLPgRPC (line 133) | type TraceOTLPgRPC struct
  type MetricOTLP (line 143) | type MetricOTLP struct
    method lint (line 151) | func (m *MetricOTLP) lint() (ws []Warning, _ error) {
  type MetricOTLPHTTP (line 161) | type MetricOTLPHTTP struct
  type MetricOTLPgRPC (line 166) | type MetricOTLPgRPC struct
  type OTLPCompressor (line 173) | type OTLPCompressor
  constant OTLPCompressUnset (line 177) | OTLPCompressUnset OTLPCompressor = iota
  constant OTLPCompressNone (line 178) | OTLPCompressNone
  constant OTLPCompressGzip (line 179) | OTLPCompressGzip

FILE: config/otlpcompressor_string.go
  function _ (line 7) | func _() {
  constant _OTLPCompressor_name (line 16) | _OTLPCompressor_name = "nonegzip"
  method String (line 20) | func (i OTLPCompressor) String() string {

FILE: config/reflect.go
  type walkFunc (line 9) | type walkFunc
  function forEach (line 11) | func forEach(i interface{}, f walkFunc) ([]Warning, error) {
  function walk (line 17) | func walk(ws *[]Warning, path string, v reflect.Value, wf walkFunc) error {

FILE: config/tags_test.go
  function TestTags (line 10) | func TestTags(t *testing.T) {
  function typecheck (line 18) | func typecheck(t *testing.T, typ reflect.Type) {

FILE: config/tls.go
  type TLS (line 19) | type TLS struct
    method Config (line 35) | func (t *TLS) Config() (*tls.Config, error) {
    method lint (line 66) | func (t *TLS) lint() ([]Warning, error) {
    method validate (line 76) | func (t *TLS) validate(_ Mode) ([]Warning, error) {

FILE: config/updaters.go
  type Updaters (line 4) | type Updaters struct

FILE: config/validate.go
  function Validate (line 5) | func Validate(c *Config) ([]Warning, error) {
  type validator (line 16) | type validator interface

FILE: contrib/cmd/quaybackstop/clair.go
  method SetClairGABI (line 32) | func (a *App) SetClairGABI(s string) (err error) {
  method SetClairGABIAuth (line 37) | func (a *App) SetClairGABIAuth(s string) error {
  method SetClairConfig (line 45) | func (a *App) SetClairConfig(s string) error {
  method SetIndexerAddr (line 76) | func (a *App) SetIndexerAddr(s string) (err error) {
  method AllManifests (line 86) | func (a *App) AllManifests(ctx context.Context) (iter.Seq[[]string], fun...
  method IssueDeletes (line 262) | func (a *App) IssueDeletes(ctx context.Context, seq iter.Seq[[]string]) ...

FILE: contrib/cmd/quaybackstop/main.go
  function main (line 43) | func main() {
  function usage (line 81) | func usage(set *flag.FlagSet) func() {
  function setLogging (line 126) | func setLogging(opts *slog.HandlerOptions) func(string) error {
  constant LevelTrace (line 150) | LevelTrace = slog.LevelDebug + slog.LevelDebug
  function Run (line 153) | func Run(ctx context.Context, app App) error {
  type App (line 168) | type App struct
    method SetCursorFile (line 193) | func (a *App) SetCursorFile(s string) (err error) {
    method OK (line 202) | func (a *App) OK() error {
    method Status (line 217) | func (a *App) Status() {
    method Close (line 242) | func (a *App) Close() error {
    method NewRequestWithContext (line 262) | func (a *App) NewRequestWithContext(ctx context.Context, method string...
    method GABIQuery (line 317) | func (a *App) GABIQuery(ctx context.Context, u *url.URL, buf *bytes.Bu...
  function query (line 349) | func query(str *strings.Builder) gabiQuery {
  type gabiQuery (line 354) | type gabiQuery struct
  type gabiResponse (line 359) | type gabiResponse struct
  function fmtPostgresqlArray (line 379) | func fmtPostgresqlArray(w io.Writer, strs []string) {

FILE: contrib/cmd/quaybackstop/main_old.go
  function main (line 10) | func main() {

FILE: contrib/cmd/quaybackstop/quay.go
  method SetQuayGABIAuth (line 26) | func (a *App) SetQuayGABIAuth(s string) error {
  method SetQuayGABI (line 34) | func (a *App) SetQuayGABI(s string) (err error) {
  method SetQuayConfig (line 39) | func (a *App) SetQuayConfig(s string) error {
  type quayConfig (line 87) | type quayConfig struct
  method SelectMissing (line 101) | func (a *App) SelectMissing(ctx context.Context, manifests iter.Seq[[]st...

FILE: health/readinesshandler.go
  function Ready (line 11) | func Ready() {
  function Unready (line 17) | func Unready() {
  function ReadinessHandler (line 25) | func ReadinessHandler() http.Handler {

FILE: health/readinesshandler_test.go
  function TestReadinessHandler (line 13) | func TestReadinessHandler(t *testing.T) {

FILE: httptransport/auth.go
  function authHandler (line 14) | func authHandler(cfg *config.Config, next http.Handler) (http.Handler, e...

FILE: httptransport/auth_test.go
  type authTestcase (line 22) | type authTestcase struct
    method Run (line 34) | func (tc *authTestcase) Run(ctx context.Context) func(*testing.T) {
  function TestAuth (line 118) | func TestAuth(t *testing.T) {

FILE: httptransport/client/httpclient.go
  type uoCache (line 15) | type uoCache struct
    method Set (line 25) | func (c *uoCache) Set(m map[string][]driver.UpdateOperation, v string) {
    method Copy (line 35) | func (c *uoCache) Copy() map[string][]driver.UpdateOperation {
  function newOUCache (line 47) | func newOUCache() *uoCache {
  type HTTP (line 54) | type HTTP struct
    method sign (line 133) | func (s *HTTP) sign(ctx context.Context, req *http.Request) error {
  constant DefaultAddr (line 67) | DefaultAddr = `http://clair:6060/`
  function NewHTTP (line 70) | func NewHTTP(ctx context.Context, opt ...Option) (*HTTP, error) {
  type Option (line 93) | type Option
  function WithAddr (line 101) | func WithAddr(root string) Option {
  function WithClient (line 115) | func WithClient(c *http.Client) Option {
  function WithSigner (line 122) | func WithSigner(v Signer) Option {
  type Signer (line 129) | type Signer interface

FILE: httptransport/client/indexer.go
  method AffectedManifests (line 21) | func (s *HTTP) AffectedManifests(ctx context.Context, v []claircore.Vuln...
  method Index (line 71) | func (s *HTTP) Index(ctx context.Context, manifest *claircore.Manifest) ...
  method IndexReport (line 112) | func (s *HTTP) IndexReport(ctx context.Context, manifest claircore.Diges...
  method State (line 152) | func (s *HTTP) State(ctx context.Context) (string, error) {
  method DeleteManifests (line 179) | func (s *HTTP) DeleteManifests(ctx context.Context, d ...claircore.Diges...

FILE: httptransport/client/matcher.go
  method Scan (line 25) | func (c *HTTP) Scan(ctx context.Context, ir *claircore.IndexReport) (*cl...
  method DeleteUpdateOperations (line 65) | func (c *HTTP) DeleteUpdateOperations(ctx context.Context, ref ...uuid.U...
  method LatestUpdateOperation (line 140) | func (c *HTTP) LatestUpdateOperation(_ context.Context, _ driver.UpdateK...
  method UpdateOperations (line 145) | func (c *HTTP) UpdateOperations(ctx context.Context, k driver.UpdateKind...
  method LatestUpdateOperations (line 164) | func (c *HTTP) LatestUpdateOperations(ctx context.Context, k driver.Upda...
  method updateOperations (line 193) | func (c *HTTP) updateOperations(ctx context.Context, req *http.Request, ...
  method UpdateDiff (line 228) | func (c *HTTP) UpdateDiff(ctx context.Context, prev, cur uuid.UUID) (*dr...
  method Initialized (line 266) | func (c *HTTP) Initialized(_ context.Context) (bool, error) {

FILE: httptransport/client/matcher_test.go
  function TestDiffer (line 22) | func TestDiffer(t *testing.T) {

FILE: httptransport/common.go
  function getDigest (line 24) | func getDigest(_ http.ResponseWriter, r *http.Request) (d claircore.Dige...
  function pickContentType (line 40) | func pickContentType(w http.ResponseWriter, r *http.Request, allow []str...
  type accept (line 95) | type accept struct
    method Match (line 104) | func (a *accept) Match(mt string) bool {
  function withRequestID (line 131) | func withRequestID(r *http.Request) *http.Request {

FILE: httptransport/concurrentlimit.go
  type limitHandler (line 27) | type limitHandler struct
    method ServeHTTP (line 36) | func (l *limitHandler) ServeHTTP(w http.ResponseWriter, r *http.Reques...

FILE: httptransport/concurrentlimit_test.go
  function TestConcurrentRequests (line 18) | func TestConcurrentRequests(t *testing.T) {

FILE: httptransport/discoveryhandler.go
  function DiscoveryHandler (line 47) | func DiscoveryHandler(_ context.Context, prefix string, topt otelhttp.Op...
  function init (line 116) | func init() {

FILE: httptransport/discoveryhandler_test.go
  function TestDiscovery (line 15) | func TestDiscovery(t *testing.T) {

FILE: httptransport/error.go
  constant statusClientClosedRequest (line 17) | statusClientClosedRequest = 499
  function apiError (line 23) | func apiError(ctx context.Context, w http.ResponseWriter, code int, f st...

FILE: httptransport/error_test.go
  function TestClientDisconnect (line 14) | func TestClientDisconnect(t *testing.T) {

FILE: httptransport/indexer_v1.go
  function NewIndexerV1 (line 24) | func NewIndexerV1(_ context.Context, prefix string, srv indexer.Service,...
  type IndexerV1 (line 49) | type IndexerV1 struct
    method ServeHTTP (line 57) | func (h *IndexerV1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    method indexReport (line 83) | func (h *IndexerV1) indexReport(w http.ResponseWriter, r *http.Request) {
    method indexReportOne (line 159) | func (h *IndexerV1) indexReportOne(w http.ResponseWriter, r *http.Requ...
    method indexState (line 213) | func (h *IndexerV1) indexState(w http.ResponseWriter, r *http.Request) {
    method affectedManifests (line 250) | func (h *IndexerV1) affectedManifests(w http.ResponseWriter, r *http.R...
  constant linkIndex (line 155) | linkIndex  = `<%s>; rel="https://projectquay.io/clair/v1/index_report"`
  constant linkReport (line 156) | linkReport = `<%s>; rel="https://projectquay.io/clair/v1/vulnerability_r...
  function init (line 284) | func init() {

FILE: httptransport/indexer_v1_test.go
  function TestIndexReportBadLayer (line 24) | func TestIndexReportBadLayer(t *testing.T) {
  function TestIndexerV1 (line 66) | func TestIndexerV1(t *testing.T) {

FILE: httptransport/instrumentation.go
  constant metricNamespace (line 14) | metricNamespace = `clair`
  constant metricSubsystem (line 15) | metricSubsystem = `http`
  type wrapper (line 18) | type wrapper struct
    method initRegisterer (line 31) | func (m *wrapper) initRegisterer(name string, reg prometheus.Registere...
    method init (line 90) | func (m *wrapper) init(name string) {
    method wrap (line 94) | func (m *wrapper) wrap(tag string, h http.Handler) http.Handler {
    method wrapFunc (line 105) | func (m *wrapper) wrapFunc(tag string, h http.HandlerFunc) http.Handler {
  function catchAbort (line 111) | func catchAbort(h http.Handler) http.Handler {

FILE: httptransport/instrumentation_test.go
  function TestMetric (line 17) | func TestMetric(t *testing.T) {

FILE: httptransport/matcher_v1.go
  function NewMatcherV1 (line 30) | func NewMatcherV1(_ context.Context, prefix string, srv matcher.Service,...
  type MatcherV1 (line 57) | type MatcherV1 struct
    method ServeHTTP (line 67) | func (h *MatcherV1) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    method vulnerabilityReport (line 95) | func (h *MatcherV1) vulnerabilityReport(w http.ResponseWriter, r *http...
    method updateDiffHandler (line 147) | func (h *MatcherV1) updateDiffHandler(w http.ResponseWriter, r *http.R...
    method updateOperationHandlerGet (line 183) | func (h *MatcherV1) updateOperationHandlerGet(w http.ResponseWriter, r...
    method updateOperationHandlerDelete (line 230) | func (h *MatcherV1) updateOperationHandlerDelete(w http.ResponseWriter...
  function init (line 253) | func init() {

FILE: httptransport/matcher_v1_test.go
  function TestUpdateDiffHandler (line 27) | func TestUpdateDiffHandler(t *testing.T) {
  function testUpdateDiffMatcher (line 35) | func testUpdateDiffMatcher(t *testing.T) {
  function testUpdateDiffHandlerParams (line 118) | func testUpdateDiffHandlerParams(t *testing.T) {
  function testUpdateDiffHandlerMethods (line 196) | func testUpdateDiffHandlerMethods(t *testing.T) {
  function TestUpdateOperationHandler (line 242) | func TestUpdateOperationHandler(t *testing.T) {
  function testUpdateOperationHandlerErrors (line 250) | func testUpdateOperationHandlerErrors(t *testing.T) {
  function testUpdateOperationHandlerMethods (line 306) | func testUpdateOperationHandlerMethods(t *testing.T) {
  function testUpdateOperationHandlerGet (line 341) | func testUpdateOperationHandlerGet(t *testing.T) {

FILE: httptransport/notification_v1.go
  constant defaultPageSize (line 22) | defaultPageSize = 500
  type notificationResponse (line 24) | type notificationResponse struct
  type NotificationV1 (line 30) | type NotificationV1 struct
    method ServeHTTP (line 57) | func (h *NotificationV1) ServeHTTP(w http.ResponseWriter, r *http.Requ...
    method serveHTTP (line 82) | func (h *NotificationV1) serveHTTP(w http.ResponseWriter, r *http.Requ...
    method delete (line 93) | func (h *NotificationV1) delete(w http.ResponseWriter, r *http.Request) {
    method get (line 112) | func (h *NotificationV1) get(w http.ResponseWriter, r *http.Request) {
  function NewNotificationV1 (line 39) | func NewNotificationV1(_ context.Context, prefix string, srv notifier.Se...
  function init (line 176) | func init() {

FILE: httptransport/notification_v1_test.go
  function TestNotificationsHandler (line 24) | func TestNotificationsHandler(t *testing.T) {
  function testNotificationHandlerDelete (line 36) | func testNotificationHandlerDelete(ctx context.Context) func(*testing.T) {
  function testNotificationHandlerGet (line 71) | func testNotificationHandlerGet(ctx context.Context) func(*testing.T) {
  function testNotificationHandlerGetParams (line 130) | func testNotificationHandlerGetParams(ctx context.Context) func(*testing...
  function testNotificationsHandlerMethods (line 195) | func testNotificationsHandlerMethods(ctx context.Context) func(*testing....

FILE: httptransport/robotshandler.go
  constant robotstxt (line 13) | robotstxt = "User-agent: *\nDisallow: /\n"

FILE: httptransport/robotshandler_test.go
  function TestRobotsTXT (line 13) | func TestRobotsTXT(t *testing.T) {

FILE: httptransport/server.go
  constant apiRoot (line 24) | apiRoot                      = "/api/v1/"
  constant indexerRoot (line 25) | indexerRoot                  = "/indexer"
  constant matcherRoot (line 26) | matcherRoot                  = "/matcher"
  constant notifierRoot (line 27) | notifierRoot                 = "/notifier"
  constant internalRoot (line 28) | internalRoot                 = apiRoot + "internal/"
  constant IndexAPIPath (line 29) | IndexAPIPath                 = indexerRoot + apiRoot + "index_report"
  constant IndexReportAPIPath (line 30) | IndexReportAPIPath           = indexerRoot + apiRoot + "index_report/"
  constant IndexStateAPIPath (line 31) | IndexStateAPIPath            = indexerRoot + apiRoot + "index_state"
  constant AffectedManifestAPIPath (line 32) | AffectedManifestAPIPath      = indexerRoot + internalRoot + "affected_ma...
  constant VulnerabilityReportPath (line 33) | VulnerabilityReportPath      = matcherRoot + apiRoot + "vulnerability_re...
  constant UpdateOperationAPIPath (line 34) | UpdateOperationAPIPath       = matcherRoot + internalRoot + "update_oper...
  constant UpdateOperationDeleteAPIPath (line 35) | UpdateOperationDeleteAPIPath = matcherRoot + internalRoot + "update_oper...
  constant UpdateDiffAPIPath (line 36) | UpdateDiffAPIPath            = matcherRoot + internalRoot + "update_diff"
  constant NotificationAPIPath (line 37) | NotificationAPIPath          = notifierRoot + apiRoot + "notification/"
  constant KeysAPIPath (line 38) | KeysAPIPath                  = notifierRoot + apiRoot + "services/notifi...
  constant KeyByIDAPIPath (line 39) | KeyByIDAPIPath               = notifierRoot + apiRoot + "services/notifi...
  constant OpenAPIV1Path (line 40) | OpenAPIV1Path                = "/openapi/v1"
  function New (line 47) | func New(ctx context.Context, conf *config.Config, indexer indexer.Servi...
  constant IntraserviceIssuer (line 124) | IntraserviceIssuer = `clair-intraservice`
  function unmodified (line 127) | func unmodified(r *http.Request, v string) bool {
  function writerError (line 150) | func writerError(w http.ResponseWriter, e *error) func() {
  function setCacheControl (line 162) | func setCacheControl(w http.ResponseWriter, age time.Duration) {

FILE: httptransport/server_test.go
  function TestUpdateEndpoints (line 24) | func TestUpdateEndpoints(t *testing.T) {

FILE: indexer/mock.go
  type Mock (line 15) | type Mock struct
    method Index (line 23) | func (i *Mock) Index(ctx context.Context, manifest *claircore.Manifest...
    method IndexReport (line 30) | func (i *Mock) IndexReport(ctx context.Context, digest claircore.Diges...
    method State (line 37) | func (i *Mock) State(ctx context.Context) (string, error) {
    method AffectedManifests (line 44) | func (i *Mock) AffectedManifests(ctx context.Context, vulns []claircor...
    method DeleteManifests (line 51) | func (i *Mock) DeleteManifests(ctx context.Context, d ...claircore.Dig...

FILE: indexer/service.go
  type Service (line 13) | type Service interface
  type StateReporter (line 22) | type StateReporter interface
  type StateIndexer (line 29) | type StateIndexer interface
  type Indexer (line 35) | type Indexer interface
  type Reporter (line 41) | type Reporter interface
  type Stater (line 46) | type Stater interface
  type Affected (line 51) | type Affected interface

FILE: initialize/auto/auto.go
  function init (line 14) | func init() {
  function PrintLogs (line 22) | func PrintLogs(ctx context.Context) {
  function debugLog (line 30) | func debugLog(m string) {
  function infoLog (line 37) | func infoLog(m string) {

FILE: initialize/auto/auto_test.go
  function TestMain (line 8) | func TestMain(m *testing.M) {

FILE: initialize/auto/cpu.go
  function CPU (line 7) | func CPU() {}

FILE: initialize/auto/cpu_linux.go
  function CPU (line 18) | func CPU() {
  function cgLookup (line 40) | func cgLookup(r fs.FS) (int, error) {

FILE: initialize/auto/cpu_linux_test.go
  type cgTestcase (line 35) | type cgTestcase struct
    method Run (line 42) | func (tc cgTestcase) Run(ctx context.Context, t *testing.T) {
  function TestCPUDetection (line 56) | func TestCPUDetection(t *testing.T) {

FILE: initialize/auto/memory.go
  function Memory (line 6) | func Memory() {}

FILE: initialize/auto/memory_linux.go
  function Memory (line 26) | func Memory() {
  constant doNothing (line 54) | doNothing = -1
  constant setMax (line 55) | setMax    = -2
  function memLookup (line 58) | func memLookup(r fs.FS) (int64, error) {

FILE: initialize/auto/memory_linux_test.go
  type memTestcase (line 14) | type memTestcase struct
    method Run (line 21) | func (tc memTestcase) Run(ctx context.Context, t *testing.T) {
  function TestMemoryDetection (line 37) | func TestMemoryDetection(t *testing.T) {

FILE: initialize/auto/profiling.go
  function Profiling (line 18) | func Profiling() {

FILE: initialize/logging.go
  function Logging (line 14) | func Logging(ctx context.Context, cfg *config.Config) error {

FILE: initialize/services.go
  constant NotifierIssuer (line 38) | NotifierIssuer = `clair-notifier`
  type Srv (line 50) | type Srv struct
  function Services (line 58) | func Services(ctx context.Context, cfg *config.Config) (*Srv, error) {
  function localIndexer (line 115) | func localIndexer(ctx context.Context, cfg *config.Config) (indexer.Serv...
  function remoteIndexer (line 193) | func remoteIndexer(ctx context.Context, cfg *config.Config, addr string)...
  function remoteClient (line 205) | func remoteClient(ctx context.Context, cfg *config.Config, claim jwt.Cla...
  function localMatcher (line 221) | func localMatcher(ctx context.Context, cfg *config.Config) (matcher.Serv...
  function remoteMatcher (line 302) | func remoteMatcher(ctx context.Context, cfg *config.Config, addr string)...
  function localNotifier (line 314) | func localNotifier(ctx context.Context, cfg *config.Config, i indexer.Se...

FILE: internal/codec/codec.go
  function init (line 14) | func init() {
  function GetEncoder (line 42) | func GetEncoder(w io.Writer) *Encoder {
  function PutEncoder (line 49) | func PutEncoder(e *Encoder) {
  function GetDecoder (line 58) | func GetDecoder(r io.Reader) *Decoder {
  function PutDecoder (line 65) | func PutDecoder(d *Decoder) {

FILE: internal/codec/codec_test.go
  function Example (line 15) | func Example() {
  function BenchmarkDecode (line 29) | func BenchmarkDecode(b *testing.B) {
  function BenchmarkDecodeStdlib (line 53) | func BenchmarkDecodeStdlib(b *testing.B) {
  function TestTimeNotNull (line 78) | func TestTimeNotNull(t *testing.T) {

FILE: internal/codec/reader.go
  function JSONReader (line 7) | func JSONReader(v interface{}) io.ReadCloser {

FILE: internal/httputil/client.go
  function NewClient (line 25) | func NewClient(ctx context.Context, localOnly bool) (*http.Client, error) {
  function ctlLocalOnly (line 46) | func ctlLocalOnly(network, address string, _ syscall.RawConn) error {
  function NewRequestWithContext (line 81) | func NewRequestWithContext(ctx context.Context, method, url string, body...

FILE: internal/httputil/client_test.go
  function TestLocalOnly (line 9) | func TestLocalOnly(t *testing.T) {

FILE: internal/httputil/ratelimiter.go
  function RateLimiter (line 14) | func RateLimiter(next http.RoundTripper) http.RoundTripper {
  type ratelimiter (line 23) | type ratelimiter struct
    method RoundTrip (line 31) | func (r *ratelimiter) RoundTrip(req *http.Request) (*http.Response, er...
  constant rateCap (line 28) | rateCap = 10
  function detune (line 62) | func detune(in rate.Limit) rate.Limit {

FILE: internal/httputil/ratelimiter_test.go
  function TestRate (line 11) | func TestRate(t *testing.T) {

FILE: internal/httputil/responserecorder.go
  function ResponseRecorder (line 8) | func ResponseRecorder(status *int, length *int64, w http.ResponseWriter)...
  type responseRecord (line 25) | type responseRecord struct
    method Unwrap (line 32) | func (r *responseRecord) Unwrap() http.ResponseWriter {
    method WriteHeader (line 36) | func (r *responseRecord) WriteHeader(c int) {
    method Write (line 45) | func (r *responseRecord) Write(b []byte) (int, error) {

FILE: internal/httputil/responserecorder_test.go
  function TestResponseRecorder (line 9) | func TestResponseRecorder(t *testing.T) {

FILE: internal/httputil/signer.go
  function NewSigner (line 24) | func NewSigner(ctx context.Context, cfg *config.Config, cl jwt.Claims) (...
  type Signer (line 83) | type Signer struct
    method Add (line 69) | func (s *Signer) Add(ctx context.Context, uri string) error {
    method Sign (line 90) | func (s *Signer) Sign(ctx context.Context, req *http.Request) error {

FILE: internal/logging/logging.go
  function init (line 14) | func init() {
  function DefaultOptions (line 24) | func DefaultOptions() *zlog.Options {
  function SetLogger (line 34) | func SetLogger(opts *zlog.Options) {

FILE: introspection/otlp.go
  type otlpHooks (line 24) | type otlpHooks struct
  method Options (line 44) | func (h *otlpHooks[O]) Options(v any) (opts []O, err error) {
  function otlpCompressorHook (line 177) | func otlpCompressorHook[O any](none, gzip O) func(config.OTLPCompressor)...
  function grpcTLSHook (line 195) | func grpcTLSHook[O any](f func(credentials.TransportCredentials) O) func...

FILE: introspection/server.go
  constant Stdout (line 37) | Stdout = "stdout"
  constant OTLP (line 38) | OTLP   = "otlp"
  constant Prom (line 43) | Prom = "prometheus"
  constant Jaeger (line 48) | Jaeger = "jaeger"
  constant DefaultPromEndpoint (line 53) | DefaultPromEndpoint = "/metrics"
  constant HealthEndpoint (line 54) | HealthEndpoint      = "/healthz"
  constant ReadyEndpoint (line 55) | ReadyEndpoint       = "/readyz"
  constant DefaultIntrospectionAddr (line 59) | DefaultIntrospectionAddr = ":8089"
  type Server (line 62) | type Server struct
    method withDiagnostics (line 330) | func (i *Server) withDiagnostics(_ context.Context) error {
    method withReady (line 352) | func (i *Server) withReady(_ context.Context) error {
  function New (line 75) | func New(ctx context.Context, conf *config.Config, health func() bool) (...

FILE: matcher/mock.go
  type Mock (line 18) | type Mock struct
    method DeleteUpdateOperations (line 33) | func (d *Mock) DeleteUpdateOperations(ctx context.Context, refs ...uui...
    method UpdateDiff (line 43) | func (d *Mock) UpdateDiff(ctx context.Context, prev uuid.UUID, cur uui...
    method UpdateOperations (line 51) | func (d *Mock) UpdateOperations(ctx context.Context, k driver.UpdateKi...
    method LatestUpdateOperations (line 59) | func (d *Mock) LatestUpdateOperations(ctx context.Context, k driver.Up...
    method LatestUpdateOperation (line 68) | func (d *Mock) LatestUpdateOperation(ctx context.Context, k driver.Upd...
    method Scan (line 75) | func (d *Mock) Scan(ctx context.Context, ir *claircore.IndexReport) (*...
    method Initialized (line 82) | func (d *Mock) Initialized(ctx context.Context) (bool, error) {

FILE: matcher/service.go
  type Service (line 15) | type Service interface
  type Scanner (line 21) | type Scanner interface
  type Differ (line 27) | type Differ interface

FILE: middleware/auth/handler.go
  type Checker (line 11) | type Checker interface
  type handler (line 15) | type handler struct
    method ServeHTTP (line 20) | func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  function Handler (line 30) | func Handler(h http.Handler, f ...Checker) http.Handler {
  type any (line 44) | type any
    method Check (line 47) | func (a any) Check(ctx context.Context, r *http.Request) bool {
  type fail (line 57) | type fail struct
    method Check (line 60) | func (fail) Check(_ context.Context, _ *http.Request) bool { return fa...
  function fromHeader (line 62) | func fromHeader(r *http.Request) (string, bool) {

FILE: middleware/auth/httpauth_psk.go
  type PSK (line 16) | type PSK struct
    method Check (line 30) | func (p *PSK) Check(ctx context.Context, r *http.Request) bool {
  function NewPSK (line 22) | func NewPSK(key []byte, issuer []string) (*PSK, error) {

FILE: middleware/auth/httpauth_psk_test.go
  type pskTestcase (line 23) | type pskTestcase struct
    method String (line 30) | func (tc *pskTestcase) String() string {
    method Generate (line 42) | func (tc *pskTestcase) Generate(rand *rand.Rand, sz int) reflect.Value {
    method Handler (line 77) | func (tc *pskTestcase) Handler(t *testing.T) http.Handler {
  function roundtrips (line 92) | func roundtrips(t *testing.T) func(*pskTestcase) bool {
  function TestPSKAuth (line 164) | func TestPSKAuth(t *testing.T) {

FILE: middleware/compress/handler.go
  function Handler (line 26) | func Handler(next http.Handler) http.Handler {
  type handler (line 58) | type handler struct
    method ServeHTTP (line 105) | func (c *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  function parseAccept (line 67) | func parseAccept(h string) ([]accept, map[string]struct{}) {
  type accept (line 99) | type accept struct
  constant acceptable (line 200) | acceptable = `zstd, gzip, deflate`
  type compressWriter (line 204) | type compressWriter struct
    method Unwrap (line 216) | func (c *compressWriter) Unwrap() http.ResponseWriter {
    method Write (line 219) | func (c *compressWriter) Write(b []byte) (int, error) {
    method FlushError (line 222) | func (c *compressWriter) FlushError() error {
  type zwriter (line 209) | type zwriter interface

FILE: middleware/compress/handler_test.go
  function setupHandler (line 25) | func setupHandler(t *testing.T) {
  type mkFunc (line 45) | type mkFunc
  function testencoding (line 47) | func testencoding(t *testing.T, enc string, status int, mk mkFunc) {
  function TestCompressor (line 100) | func TestCompressor(t *testing.T) {

FILE: notifier/amqp/deliverer.go
  type Deliverer (line 24) | type Deliverer struct
    method load (line 41) | func (d *Deliverer) load(conf *config.AMQP) error {
    method Name (line 72) | func (d *Deliverer) Name() string {
    method Deliver (line 76) | func (d *Deliverer) Deliver(ctx context.Context, nID uuid.UUID) error {
  function New (line 33) | func New(conf *config.AMQP) (*Deliverer, error) {

FILE: notifier/amqp/deliverer_integration_test.go
  constant defaultRabbitMQURI (line 19) | defaultRabbitMQURI = "amqp://guest:guest@localhost:5672/"
  function TestDeliverer (line 24) | func TestDeliverer(t *testing.T) {

FILE: notifier/amqp/directdeliverer.go
  type DirectDeliverer (line 23) | type DirectDeliverer struct
    method Name (line 37) | func (d *DirectDeliverer) Name() string {
    method Notifications (line 43) | func (d *DirectDeliverer) Notifications(ctx context.Context, n []notif...
    method Deliver (line 56) | func (d *DirectDeliverer) Deliver(ctx context.Context, _ uuid.UUID) er...
  function NewDirectDeliverer (line 28) | func NewDirectDeliverer(conf *config.AMQP) (*DirectDeliverer, error) {

FILE: notifier/amqp/directdeliverer_integration_test.go
  function TestDirectDeliverer (line 23) | func TestDirectDeliverer(t *testing.T) {

FILE: notifier/amqp/failover.go
  type failOver (line 19) | type failOver struct
    method Connection (line 29) | func (f *failOver) Connection(ctx context.Context) (*amqp.Connection, ...

FILE: notifier/callback.go
  type Callback (line 13) | type Callback struct
    method MarshalJSON (line 18) | func (cb Callback) MarshalJSON() ([]byte, error) {
    method UnmarshalJSON (line 26) | func (cb *Callback) UnmarshalJSON(b []byte) error {

FILE: notifier/callback_test.go
  function TestCallbackSerializtion (line 12) | func TestCallbackSerializtion(t *testing.T) {

FILE: notifier/deliverer.go
  type Deliverer (line 10) | type Deliverer interface
  type DirectDeliverer (line 26) | type DirectDeliverer interface

FILE: notifier/delivery.go
  type Delivery (line 16) | type Delivery struct
    method Deliver (line 39) | func (d *Delivery) Deliver(ctx context.Context) error {
    method RunDelivery (line 60) | func (d *Delivery) RunDelivery(ctx context.Context) error {
    method do (line 106) | func (d *Delivery) do(ctx context.Context, nID uuid.UUID) error {
  function NewDelivery (line 27) | func NewDelivery(store Store, l Locker, d Deliverer, interval time.Durat...

FILE: notifier/locker.go
  type Locker (line 6) | type Locker interface

FILE: notifier/migrations/01-init.sql
  type notification (line 2) | CREATE TABLE IF NOT EXISTS notification (
  type notifier_update_operation (line 8) | CREATE TABLE IF NOT EXISTS notifier_update_operation (
  type notification_body (line 15) | CREATE TABLE IF NOT EXISTS notification_body (
  type notification_body_idx (line 21) | CREATE INDEX notification_body_idx ON notification_body (notification_id...
  type receipt (line 33) | CREATE TABLE IF NOT EXISTS receipt (
  type receipt_idx (line 41) | CREATE INDEX receipt_idx ON receipt (notification_id, uo_id)
  type key (line 45) | CREATE TABLE IF NOT EXISTS key (

FILE: notifier/migrations/migrations.go
  function runFile (line 13) | func runFile(n string) func(*sql.Tx) error {
  constant MigrationTable (line 26) | MigrationTable = "notifier_migrations"

FILE: notifier/mockstore.go
  type MockStore (line 10) | type MockStore struct
    method Notifications (line 27) | func (m *MockStore) Notifications(ctx context.Context, id uuid.UUID, p...
    method PutNotifications (line 41) | func (m *MockStore) PutNotifications(ctx context.Context, opts PutOpts...
    method PutReceipt (line 49) | func (m *MockStore) PutReceipt(ctx context.Context, updater string, r ...
    method CollectNotifications (line 54) | func (m *MockStore) CollectNotifications(ctx context.Context) error {
    method Receipt (line 59) | func (m *MockStore) Receipt(ctx context.Context, id uuid.UUID) (Receip...
    method ReceiptByUOID (line 64) | func (m *MockStore) ReceiptByUOID(ctx context.Context, id uuid.UUID) (...
    method Created (line 69) | func (m *MockStore) Created(ctx context.Context) ([]uuid.UUID, error) {
    method Failed (line 74) | func (m *MockStore) Failed(ctx context.Context) ([]uuid.UUID, error) {
    method Deleted (line 79) | func (m *MockStore) Deleted(ctx context.Context) ([]uuid.UUID, error) {
    method SetDelivered (line 84) | func (m *MockStore) SetDelivered(ctx context.Context, id uuid.UUID) er...
    method SetDeliveryFailed (line 89) | func (m *MockStore) SetDeliveryFailed(ctx context.Context, id uuid.UUI...
    method SetDeleted (line 94) | func (m *MockStore) SetDeleted(ctx context.Context, id uuid.UUID) error {

FILE: notifier/notification.go
  type Reason (line 9) | type Reason
  constant Added (line 12) | Added   Reason = "added"
  constant Removed (line 13) | Removed Reason = "removed"
  constant Changed (line 14) | Changed Reason = "changed"
  type Notification (line 25) | type Notification struct

FILE: notifier/notificationhandle.go
  type NotificationHandle (line 7) | type NotificationHandle struct

FILE: notifier/pager.go
  type Page (line 8) | type Page struct

FILE: notifier/poller.go
  constant MaxChanSize (line 17) | MaxChanSize = 1024
  type PollerOpt (line 21) | type PollerOpt
  type Poller (line 24) | type Poller struct
    method Poll (line 54) | func (p *Poller) Poll(ctx context.Context, c chan<- Event) error {
    method onTick (line 78) | func (p *Poller) onTick(ctx context.Context, c chan<- Event) {
  function NewPoller (line 34) | func NewPoller(store Store, differ matcher.Differ, interval time.Duratio...
  type Event (line 44) | type Event struct

FILE: notifier/postgres/e2e_test.go
  function TestE2E (line 24) | func TestE2E(t *testing.T) {
  type e2e (line 47) | type e2e struct
    method Run (line 87) | func (e *e2e) Run(ctx context.Context, t *testing.T) {
    method PutNotifications (line 112) | func (e *e2e) PutNotifications(ctx context.Context) func(*testing.T) {
    method Created (line 129) | func (e *e2e) Created(ctx context.Context) func(*testing.T) {
    method Notifications (line 170) | func (e *e2e) Notifications(ctx context.Context) func(*testing.T) {
    method SetDelivered (line 217) | func (e *e2e) SetDelivered(ctx context.Context) func(*testing.T) {
    method SetDeliveryFailed (line 240) | func (e *e2e) SetDeliveryFailed(ctx context.Context) func(*testing.T) {
    method SetDeleted (line 272) | func (e *e2e) SetDeleted(ctx context.Context) func(*testing.T) {
    method PutReceipt (line 304) | func (e *e2e) PutReceipt(ctx context.Context) func(*testing.T) {
    method CollectNotifications (line 335) | func (e *e2e) CollectNotifications(ctx context.Context) func(*testing....
  function NewE2E (line 60) | func NewE2E(ctx context.Context, t *testing.T, ct int) *e2e {

FILE: notifier/postgres/get_status.go
  method getStatus (line 70) | func (s *Store) getStatus(ctx context.Context, status string, m statusMe...
  method Created (line 107) | func (s *Store) Created(ctx context.Context) ([]uuid.UUID, error) {
  method Failed (line 119) | func (s *Store) Failed(ctx context.Context) ([]uuid.UUID, error) {
  method Deleted (line 131) | func (s *Store) Deleted(ctx context.Context) ([]uuid.UUID, error) {

FILE: notifier/postgres/notifications.go
  method Notifications (line 98) | func (s *Store) Notifications(ctx context.Context, id uuid.UUID, page *n...
  method PutNotifications (line 207) | func (s *Store) PutNotifications(ctx context.Context, opts notifier.PutO...
  function copyNotifications (line 273) | func copyNotifications(id *uuid.UUID, ns []notifier.Notification) *notif...
  type notificationSource (line 282) | type notificationSource struct
    method Next (line 290) | func (r *notificationSource) Next() bool {
    method Values (line 294) | func (r *notificationSource) Values() ([]interface{}, error) {
    method Err (line 307) | func (r *notificationSource) Err() error {
    method Columns (line 314) | func (r *notificationSource) Columns() []string {
  method CollectNotifications (line 323) | func (s *Store) CollectNotifications(ctx context.Context) error {

FILE: notifier/postgres/notifications_test.go
  function TestNotificationCopy (line 18) | func TestNotificationCopy(t *testing.T) {
  type notificationCopyTestcase (line 33) | type notificationCopyTestcase struct
    method Setup (line 38) | func (n *notificationCopyTestcase) Setup(t testing.TB) {
    method Func (line 57) | func (n notificationCopyTestcase) Func(ctx context.Context) func(*test...

FILE: notifier/postgres/pagination_test.go
  function TestPagination (line 15) | func TestPagination(t *testing.T) {

FILE: notifier/postgres/postgres_test.go
  function TestMain (line 10) | func TestMain(m *testing.M) {

FILE: notifier/postgres/receipt.go
  method Receipt (line 84) | func (s *Store) Receipt(ctx context.Context, id uuid.UUID) (notifier.Rec...
  method ReceiptByUOID (line 95) | func (s *Store) ReceiptByUOID(ctx context.Context, id uuid.UUID) (notifi...
  function getReceipt (line 105) | func getReceipt(ctx context.Context, r *notifier.Receipt, query, name st...
  method PutReceipt (line 134) | func (s *Store) PutReceipt(ctx context.Context, updater string, r notifi...

FILE: notifier/postgres/set_status.go
  method setStatus (line 72) | func (s *Store) setStatus(ctx context.Context, id uuid.UUID, status stri...
  method SetDelivered (line 94) | func (s *Store) SetDelivered(ctx context.Context, id uuid.UUID) error {
  method SetDeliveryFailed (line 102) | func (s *Store) SetDeliveryFailed(ctx context.Context, id uuid.UUID) err...
  method SetDeleted (line 110) | func (s *Store) SetDeleted(ctx context.Context, id uuid.UUID) error {

FILE: notifier/postgres/store.go
  type Store (line 20) | type Store struct
  function NewStore (line 27) | func NewStore(pool *pgxpool.Pool) *Store {
  function Init (line 32) | func Init(ctx context.Context, cfg *pgx.ConnConfig) error {
  constant adminKeyspace (line 52) | adminKeyspace int32 = 4
  constant _ (line 54) | _ int32 = iota
  constant gcLock (line 55) | gcLock
  function errLabel (line 58) | func errLabel(e error) string {
  type statusMetrics (line 65) | type statusMetrics struct
  function txExec (line 77) | func txExec(ctx context.Context, m statusMetrics, tx pgx.Tx, name, query...

FILE: notifier/postgres/store_test.go
  function TestingStore (line 13) | func TestingStore(ctx context.Context, t testing.TB) *Store {

FILE: notifier/processor.go
  type Processor (line 25) | type Processor struct
    method Process (line 55) | func (p *Processor) Process(ctx context.Context, c <-chan Event) error {
    method create (line 88) | func (p *Processor) create(ctx context.Context, log *slog.Logger, e Ev...
    method safe (line 261) | func (p *Processor) safe(ctx context.Context, log *slog.Logger, e Even...
  function NewProcessor (line 42) | func NewProcessor(store Store, l Locker, indexer indexer.Service, matche...
  function min (line 156) | func min(a, b int) int {
  type notifTab (line 166) | type notifTab struct
  function getAffected (line 175) | func getAffected(ctx context.Context, ic indexer.Service, nosummary bool...

FILE: notifier/processor_create_test.go
  function TestProcessCreate (line 73) | func TestProcessCreate(t *testing.T) {
  function testProcessorStoreErr (line 82) | func testProcessorStoreErr(t *testing.T) {
  function testProcessorIndexerErr (line 126) | func testProcessorIndexerErr(t *testing.T) {
  function testProcessorMatcherErr (line 167) | func testProcessorMatcherErr(t *testing.T) {
  function testProcessorCreate (line 204) | func testProcessorCreate(t *testing.T) {

FILE: notifier/processor_safe_test.go
  function TestProcessorSafe (line 42) | func TestProcessorSafe(t *testing.T) {
  function testSafe (line 52) | func testSafe(t *testing.T) {
  function testUnsafeStoreErr (line 79) | func testUnsafeStoreErr(t *testing.T) {
  function testUnsafeMatcherErr (line 108) | func testUnsafeMatcherErr(t *testing.T) {
  function testUnsafeStaleUOID (line 138) | func testUnsafeStaleUOID(t *testing.T) {
  function testUnsafeDuplications (line 169) | func testUnsafeDuplications(t *testing.T) {

FILE: notifier/receipt.go
  type Status (line 10) | type Status
  constant Created (line 14) | Created Status = "created"
  constant Delivered (line 16) | Delivered Status = "delivered"
  constant DeliveryFailed (line 18) | DeliveryFailed Status = "delivery_failed"
  constant Deleted (line 20) | Deleted Status = "deleted"
  type Receipt (line 24) | type Receipt struct

FILE: notifier/service.go
  type Service (line 12) | type Service interface

FILE: notifier/service/mock.go
  type Mock (line 14) | type Mock struct
    method Notifications (line 19) | func (m *Mock) Notifications(ctx context.Context, id uuid.UUID, page *...
    method DeleteNotifications (line 23) | func (m *Mock) DeleteNotifications(ctx context.Context, id uuid.UUID) ...

FILE: notifier/service/notifier.go
  type Notifier (line 37) | type Notifier struct
    method Notifications (line 45) | func (s *Notifier) Notifications(ctx context.Context, id uuid.UUID, pa...
    method DeleteNotifications (line 50) | func (s *Notifier) DeleteNotifications(ctx context.Context, id uuid.UU...
    method Run (line 167) | func (s *Notifier) Run(ctx context.Context) error {
    method gc (line 187) | func (s *Notifier) gc(ctx context.Context) func() error {
  type Opts (line 55) | type Opts struct
  function New (line 69) | func New(ctx context.Context, store notifier.Store, locks notifier.Locke...
  function testModeInit (line 154) | func testModeInit(ctx context.Context, opts *Opts) error {

FILE: notifier/service/testmode.go
  function indexerForTestMode (line 21) | func indexerForTestMode(mock *indexer.Mock) {
  function matcherForTestMode (line 59) | func matcherForTestMode(mock *matcher.Mock) {

FILE: notifier/stomp/deliverer.go
  type Deliverer (line 20) | type Deliverer struct
    method load (line 35) | func (d *Deliverer) load(cfg *config.STOMP) error {
    method Name (line 61) | func (d *Deliverer) Name() string {
    method Deliver (line 65) | func (d *Deliverer) Deliver(ctx context.Context, nID uuid.UUID) error {
  function New (line 27) | func New(conf *config.STOMP) (*Deliverer, error) {

FILE: notifier/stomp/directdeliverer.go
  type DirectDeliverer (line 19) | type DirectDeliverer struct
    method Name (line 33) | func (d *DirectDeliverer) Name() string {
    method Notifications (line 39) | func (d *DirectDeliverer) Notifications(ctx context.Context, n []notif...
    method Deliver (line 52) | func (d *DirectDeliverer) Deliver(ctx context.Context, nID uuid.UUID) ...
  function NewDirectDeliverer (line 24) | func NewDirectDeliverer(conf *config.STOMP) (*DirectDeliverer, error) {
  function errDeliever (line 108) | func errDeliever(e error) error {

FILE: notifier/stomp/failover.go
  type failOver (line 19) | type failOver struct
    method Dial (line 31) | func (f *failOver) Dial(ctx context.Context, addr string) (*gostomp.Co...
    method Connection (line 72) | func (f *failOver) Connection(ctx context.Context) (*gostomp.Conn, err...

FILE: notifier/stomp/integration_test.go
  function setURI (line 25) | func setURI(t *testing.T, cfg config.STOMP, uri string) (next config.STO...
  type logAdapter (line 61) | type logAdapter struct
    method Debugf (line 65) | func (a logAdapter) Debugf(format string, value ...interface{})   { a....
    method Infof (line 66) | func (a logAdapter) Infof(format string, value ...interface{})    { a....
    method Warningf (line 67) | func (a logAdapter) Warningf(format string, value ...interface{}) { a....
    method Debug (line 68) | func (a logAdapter) Debug(msg string)                             { a....
    method Info (line 69) | func (a logAdapter) Info(msg string)                              { a....
    method Warning (line 70) | func (a logAdapter) Warning(msg string)                           { a....
    method Error (line 71) | func (a logAdapter) Error(msg string)                             { a....
  function consumer (line 73) | func consumer(ctx context.Context, t *testing.T, dial string, opt []func...
  function TestDeliverer (line 124) | func TestDeliverer(t *testing.T) {
  function TestDirectDeliverer (line 196) | func TestDirectDeliverer(t *testing.T) {

FILE: notifier/store.go
  type PutOpts (line 11) | type PutOpts struct
  type Store (line 26) | type Store interface
  type Notificationer (line 32) | type Notificationer interface
  type Receipter (line 71) | type Receipter interface

FILE: notifier/summary_test.go
  function TestNotificationSummary (line 17) | func TestNotificationSummary(t *testing.T) {

FILE: notifier/vulnsummary.go
  type VulnSummary (line 7) | type VulnSummary struct
    method FromVulnerability (line 18) | func (vs *VulnSummary) FromVulnerability(v *claircore.Vulnerability) {

FILE: notifier/webhook/cmd/webhookd/main.go
  function main (line 35) | func main() {
  type Recv (line 116) | type Recv struct
    method ServeHTTP (line 125) | func (h *Recv) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    method sign (line 247) | func (h *Recv) sign(req *http.Request) error {
  constant contentType (line 122) | contentType = `application/json`
  type response (line 241) | type response struct
  type logRequest (line 269) | type logRequest
    method LogValue (line 272) | func (l *logRequest) LogValue() slog.Value {
  type logResponse (line 281) | type logResponse
    method LogValue (line 284) | func (l *logResponse) LogValue() slog.Value {

FILE: notifier/webhook/deliverer.go
  type Deliverer (line 23) | type Deliverer struct
    method Name (line 66) | func (d *Deliverer) Name() string {
    method Deliver (line 73) | func (d *Deliverer) Deliver(ctx context.Context, nID uuid.UUID) error {
  type Signer (line 32) | type Signer interface
  function New (line 37) | func New(conf *config.Webhook, client *http.Client, signer Signer) (*Del...

FILE: notifier/webhook/deliverer_test.go
  function TestDeliverer (line 27) | func TestDeliverer(t *testing.T) {
Condensed preview — 334 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,537K chars).
[
  {
    "path": ".chglog/CHANGELOG.tpl.md",
    "chars": 1633,
    "preview": "{{ if .Versions -}}\n<a name=\"unreleased\"></a>\n## [Unreleased]\n\n{{ if .Unreleased.CommitGroups -}}\n{{ range .Unreleased.C"
  },
  {
    "path": ".chglog/config.yml",
    "chars": 488,
    "preview": "style: github\ntemplate: CHANGELOG.tpl.md\ninfo:\n  title: CHANGELOG\n  repository_url: https://github.com/quay/clair\noption"
  },
  {
    "path": ".clang-format",
    "chars": 56,
    "preview": "---\nLanguage:        Proto\nBasedOnStyle:    Google\n...\n\n"
  },
  {
    "path": ".dockerignore",
    "chars": 219,
    "preview": "# Files\nDCO\n.dockerignore\nLICENSE\n*.md\nNOTICE\n*.oci\n*.tar*\n/clairctl-*\n!testdata/**\n# Directories\n/book\n/contrib\n!/contr"
  },
  {
    "path": ".gitattributes",
    "chars": 93,
    "preview": "cmd/build.go export-subst\n*.go diff=golang\nDocumentation/reference/api.md linguist-generated\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 2418,
    "preview": "# How to Contribute\n\nClair is [Apache 2.0 licensed](LICENSE) and accepts contributions via GitHub pull requests.\nThis do"
  },
  {
    "path": ".github/ISSUE_TEMPLATE.md",
    "chars": 1103,
    "preview": "<!--\n\nProject discussion and other meta topics should be discussed on the mailing\nlist or in the discussions section.\n\nG"
  },
  {
    "path": ".github/actions/documentation/action.yml",
    "chars": 789,
    "preview": "name: 'Documentation'\ndescription: 'build with mdBook and optionally push'\ninputs:\n  publish:\n    description: 'push res"
  },
  {
    "path": ".github/actions/go-cache/action.yml",
    "chars": 576,
    "preview": "name: 'Go cache'\ndescription: 'cache go modules, and build artifacts'\ninputs:\n  go:\n    description: 'Go version to use'"
  },
  {
    "path": ".github/actions/go-tidy/action.yml",
    "chars": 412,
    "preview": "name: 'Go tidy'\ndescription: 'check that all modules are tidy-clean'\ninputs:\n  go:\n    description: 'Go version to use'\n"
  },
  {
    "path": ".github/actions/set-image-expiration/action.yml",
    "chars": 1486,
    "preview": "name: 'Set Image Expiration'\ndescription: 'Use the Quay API to set an expiration time on an image'\ninputs:\n  quay:\n    d"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 814,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  "
  },
  {
    "path": ".github/issue-close-app.yml",
    "chars": 140,
    "preview": "comment: \"This issue is closed because it does not meet our issue template. Please read it.\"\nissueConfigs:\n- content:\n  "
  },
  {
    "path": ".github/script/nightly-module.sh",
    "chars": 650,
    "preview": "#!/bin/sh\nset -e\n: \"${CLAIRCORE_BRANCH:=main}\"\ncd \"$(git rev-parse --show-toplevel)\"\ntest -d vendor && rm -rf vendor\n\nec"
  },
  {
    "path": ".github/workflows/.gitignore",
    "chars": 23,
    "preview": "yq\nyajsv\n*.json-schema\n"
  },
  {
    "path": ".github/workflows/.yamllint",
    "chars": 81,
    "preview": "---\nextends: default\nrules:\n  line-length: false\n  truthy:\n    check-keys: false\n"
  },
  {
    "path": ".github/workflows/Makefile",
    "chars": 554,
    "preview": "check: github-workflow.json-schema yajsv yq\n\tfor f in *.yml; do ./yq -o json \"$$f\" > \"$${f%yml}json\"; done\n\t./yajsv -s $"
  },
  {
    "path": ".github/workflows/check-fast-forward.yml",
    "chars": 537,
    "preview": "---\nname: Check Fast Forward\non:\n  pull_request:\n    types: [opened, reopened, synchronize]\njobs:\n  check-fast-forward:\n"
  },
  {
    "path": ".github/workflows/config-ci.yml",
    "chars": 1580,
    "preview": "---\nname: Config module CI\n\non:\n  push:\n    paths:\n      - config/**\n    branches:\n      - main\n      - release-4.*\n  pu"
  },
  {
    "path": ".github/workflows/cut-release.yml",
    "chars": 9345,
    "preview": "---\nname: Release\n\non:\n  push:\n    tags:\n      - v4.*\n  workflow_dispatch: {}\n\njobs:\n  config:\n    name: Config\n    runs"
  },
  {
    "path": ".github/workflows/documentation.yml",
    "chars": 294,
    "preview": "---\nname: Deploy Main Documentation\n\non:\n  push:\n    branches:\n      - main\n    paths:\n      - 'Documentation/**'\n\njobs:"
  },
  {
    "path": ".github/workflows/fast-forward.yml",
    "chars": 906,
    "preview": "---\nname: Fast Forward\non:\n  issue_comment:\n    types: [created, edited]\n  pull_request_review:\n    types: [submitted]\nj"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 2738,
    "preview": "---\nname: CI\n\non:\n  push:\n    branches:\n      - main\n      - release-4.*\n  pull_request:\n    branches:\n      - main\n    "
  },
  {
    "path": ".github/workflows/nightly-ci.yml",
    "chars": 1095,
    "preview": "---\nname: Nightly CI\n\non:\n  schedule:\n    - cron: '30 4 * * *'\n  workflow_dispatch:\n    inputs:\n      package_expr:\n    "
  },
  {
    "path": ".github/workflows/nightly.yml",
    "chars": 3735,
    "preview": "---\nname: Nightly\n\non:\n  workflow_dispatch:\n    inputs:\n      branch:\n        description: 'Claircore branch to referenc"
  },
  {
    "path": ".github/workflows/prepare-release.yml",
    "chars": 1912,
    "preview": "---\nname: Prepare Release\n\non:\n  workflow_dispatch:\n    inputs:\n      branch:\n        description: 'the branch to prepar"
  },
  {
    "path": ".github/workflows/tests.yml",
    "chars": 6923,
    "preview": "---\nname: Tests\n\non:\n  workflow_call:\n    inputs:\n      package_expr:\n        required: true\n        type: string\n      "
  },
  {
    "path": ".github/workflows/v2-issues.yml",
    "chars": 698,
    "preview": "---\nname: 'Manage v2 Issues'\non:\n  workflow_dispatch:\n    inputs:\n      debug:\n        description: 'Run in debug mode ("
  },
  {
    "path": ".gitignore",
    "chars": 34,
    "preview": "vendor/\nbook/\nclairctl\n!clairctl/\n"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 272051,
    "preview": "<a name=\"unreleased\"></a>\n## [Unreleased]\n\n\n\n<a name=\"v4.9.0\"></a>\n## [v4.9.0] - 2025-12-08\n### All\n- [1aca06b8](https:/"
  },
  {
    "path": "CODEOWNERS",
    "chars": 14,
    "preview": "*\t@quay/clair\n"
  },
  {
    "path": "DCO",
    "chars": 1422,
    "preview": "Developer Certificate of Origin\nVersion 1.1\n\nCopyright (C) 2004, 2006 The Linux Foundation and its contributors.\n660 Yor"
  },
  {
    "path": "Dockerfile",
    "chars": 2400,
    "preview": "# syntax=docker.io/docker/dockerfile:1.7\n\n# Copyright 2024 clair authors\n#\n# Licensed under the Apache License, Version "
  },
  {
    "path": "Documentation/SUMMARY.md",
    "chars": 1114,
    "preview": "# Summary\n\n- [What is ClairV4](./whatis.md)\n- [How Tos](./howto.md)\n  - [Getting Started With ClairV4](./howto/getting_s"
  },
  {
    "path": "Documentation/concepts/api_internal.md",
    "chars": 1066,
    "preview": "# Internal\n\nInternal endpoints are underneath `/api/v1/internal` and are meant for\ncommunication between Clair microserv"
  },
  {
    "path": "Documentation/concepts/authentication.md",
    "chars": 864,
    "preview": "# Authentication\n\nPrevious versions of Clair used [jwtproxy] to gate authentication. For ease of\nbuilding and deployment"
  },
  {
    "path": "Documentation/concepts/indexing.md",
    "chars": 2082,
    "preview": "# Indexing\n\nThe [Indexer](../reference/indexer.md) service is responsble for \"indexing a manifest\".\n\nIndexing involves t"
  },
  {
    "path": "Documentation/concepts/matching.md",
    "chars": 1726,
    "preview": "# Matching\n\nA [Matcher](../reference/matcher.md) node is responsible for matching vulnerabilities to a provided IndexRep"
  },
  {
    "path": "Documentation/concepts/notifications.md",
    "chars": 6496,
    "preview": "# Notifications\n\nClairV4 implements a notification system.\n\nThe notifier service will keep track of new security databas"
  },
  {
    "path": "Documentation/concepts/operation.md",
    "chars": 12,
    "preview": "# Operation\n"
  },
  {
    "path": "Documentation/concepts/updatersandairgap.md",
    "chars": 2738,
    "preview": "## Updaters\n\nClair utilizes go packages we call \"updaters\" that encapsulate the logic of\nfetching and parsing different "
  },
  {
    "path": "Documentation/concepts.md",
    "chars": 292,
    "preview": "# Concepts\n\nThe following sections give a conceptual overview of how Clair works internally.\n\n- [Internal API](./concept"
  },
  {
    "path": "Documentation/contribution/building.md",
    "chars": 690,
    "preview": "# Building\n\nThis repo is intended to be built with familiar `go build` or `go install` invocations.\nAll binaries (except"
  },
  {
    "path": "Documentation/contribution/commit_style.md",
    "chars": 1322,
    "preview": "# Commit Style\n\nThe Clair project utilizes well structured commits to keep the history useful and help with release auto"
  },
  {
    "path": "Documentation/contribution/openapi.md",
    "chars": 1712,
    "preview": "# OpenAPI\n\nThe [OpenAPI specification] has moved from `openapi.yaml` to the `openapi.json`\nand `openapi.yaml` files in `"
  },
  {
    "path": "Documentation/contribution/releases.md",
    "chars": 1641,
    "preview": "# Releases\n\nClair releases are cut roughly every three months and actively maintained for\nsix.\n\nThis means that bugfixes"
  },
  {
    "path": "Documentation/contribution.md",
    "chars": 260,
    "preview": "# Contribuion\nThe following sections provides information on how to contribute to Clair.\n\n- [Building](./contribution/bu"
  },
  {
    "path": "Documentation/howto/api.md",
    "chars": 801,
    "preview": "# API Definition\n\nClair provides its API definition via an OpenAPI specification. You can view our OpenAPI spec [here][o"
  },
  {
    "path": "Documentation/howto/deployment.md",
    "chars": 6431,
    "preview": "# Deploying Clair\n\nClair v4 was designed with flexible deployment architectures in mind.\nAn operator is free to choose a"
  },
  {
    "path": "Documentation/howto/getting_started.md",
    "chars": 6848,
    "preview": "# Getting Started With Clair\n\n## Releases\n\nAll of the source code needed to build clair is packaged as an archive and\nat"
  },
  {
    "path": "Documentation/howto/testing.md",
    "chars": 5048,
    "preview": "# Testing Clair\n\nWe provide dev tooling in order to quickly get a fully configured Clair and Quay environment stood up l"
  },
  {
    "path": "Documentation/howto.md",
    "chars": 263,
    "preview": "# How Tos\n\nThe following sections provide instructions on accomplish specific goals in Clair.\n\n- [API Definition](./howt"
  },
  {
    "path": "Documentation/listing_test.go",
    "chars": 1443,
    "preview": "package Documentation\n\nimport (\n\t\"bufio\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"sort\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp"
  },
  {
    "path": "Documentation/reference/api.md",
    "chars": 60142,
    "preview": "---\ntitle: Clair Container Analyzer v1.2.0\nlanguage_tabs:\n  - python: Python\n  - go: Golang\n  - javascript: Javascript\nl"
  },
  {
    "path": "Documentation/reference/clairctl.md",
    "chars": 2600,
    "preview": "# Clairctl\n\n`clairctl` is a command line tool for working with Clair.\nThis CLI is capable of generating manifests from m"
  },
  {
    "path": "Documentation/reference/config.md",
    "chars": 23546,
    "preview": "# Config\n\n## CLI Flags And Environment Variables\n\nClair is configured by a structured yaml or JSON[^1] file and an optio"
  },
  {
    "path": "Documentation/reference/indexer.md",
    "chars": 235,
    "preview": "# Indexer\n\nWhen Clair is running in Indexer mode, it is responsible for receiving Manifests and generating IndexReports."
  },
  {
    "path": "Documentation/reference/matcher.md",
    "chars": 228,
    "preview": "# Matcher\n\nWhen Clair is running in Matcher mode it is responsible for receiving IndexReports and generating Vulnerabili"
  },
  {
    "path": "Documentation/reference/metrics.md",
    "chars": 334,
    "preview": "Clair exports [metrics](./config.md#metrics) on the [introspection\nport](./config.md#introspection_addr) in the Promethe"
  },
  {
    "path": "Documentation/reference/notifier.md",
    "chars": 252,
    "preview": "# Notifier \n\nWhen Clair is running in Notifier mode, it is responsible for generating notifications when new vulnerabili"
  },
  {
    "path": "Documentation/reference.md",
    "chars": 348,
    "preview": "# Reference\nThe following sections provide reference information useful when exploring the documentation or working with"
  },
  {
    "path": "Documentation/reference_test.go",
    "chars": 1545,
    "preview": "package Documentation\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"reflect\"\n\t\"regexp\"\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/g"
  },
  {
    "path": "Documentation/whatis.md",
    "chars": 2322,
    "preview": "# What is Clair\n\nClair is an application for parsing image contents and reporting vulnerabilities affecting the contents"
  },
  {
    "path": "LICENSE",
    "chars": 11325,
    "preview": "Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licens"
  },
  {
    "path": "Makefile",
    "chars": 1546,
    "preview": "# Copyright 2024 clair authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use thi"
  },
  {
    "path": "NOTICE",
    "chars": 126,
    "preview": "CoreOS Project\nCopyright 2015 CoreOS, Inc\n\nThis product includes software developed at CoreOS, Inc.\n(http://www.coreos.c"
  },
  {
    "path": "README.md",
    "chars": 2044,
    "preview": "# Clair\n\n[![Docker Repository on Quay](https://quay.io/repository/projectquay/clair/status \"Docker Repository on Quay\")]"
  },
  {
    "path": "ROADMAP.md",
    "chars": 1105,
    "preview": "# Clair Roadmap\n\nThis document defines a high level roadmap for Clair development.\n\nThe dates below should not be consid"
  },
  {
    "path": "book.toml",
    "chars": 291,
    "preview": "[book]\ntitle = \"Clair Documentation\"\nauthors = [\"Clair Authors\"]\ndescription = \"Documentation for Clair.\"\nsrc = \"Documen"
  },
  {
    "path": "clair-error/errors.go",
    "chars": 2647,
    "preview": "package clairerror\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n)\n\n// ErrRequestFail indicates an http request failure\nty"
  },
  {
    "path": "clair-error/notifications.go",
    "chars": 3105,
    "preview": "package clairerror\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/google/uuid\"\n)\n\n// ErrNoUpdateOperation inidcates that the queried upd"
  },
  {
    "path": "cmd/build.go",
    "chars": 2877,
    "preview": "// Package cmd provides some common information to clair's binaries.\npackage cmd // import \"github.com/quay/clair/v4/cmd"
  },
  {
    "path": "cmd/clair/main.go",
    "chars": 4957,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"errors\"\n\t\"flag\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signa"
  },
  {
    "path": "cmd/clair/os_other.go",
    "chars": 82,
    "preview": "//go:build !unix\n\npackage main\n\nimport \"os\"\n\nvar platformShutdown = []os.Signal{}\n"
  },
  {
    "path": "cmd/clair/os_unix.go",
    "chars": 112,
    "preview": "//go:build unix\n\npackage main\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nvar platformShutdown = []os.Signal{syscall.SIGTERM}\n"
  },
  {
    "path": "cmd/config.go",
    "chars": 5232,
    "preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tjsonpatch "
  },
  {
    "path": "cmd/config_test.go",
    "chars": 1265,
    "preview": "package cmd_test\n\nimport (\n\t\"encoding/json\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp"
  },
  {
    "path": "cmd/testdata/ComplexJSON/config.json",
    "chars": 70,
    "preview": "{\n\t\"http_listen_addr\": \":80\",\n\t\"log_level\": \"error\",\n\t\"matcher\": {}\n}\n"
  },
  {
    "path": "cmd/testdata/ComplexJSON/config.json.d/dropin.json",
    "chars": 27,
    "preview": "{\n  \"log_level\": \"error\"\n}\n"
  },
  {
    "path": "cmd/testdata/ComplexJSON/want.json",
    "chars": 54,
    "preview": "{\n\t\"http_listen_addr\": \":80\",\n\t\"log_level\": \"error\"\n}\n"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml",
    "chars": 1392,
    "preview": "---\nlog_level: debug-color\nintrospection_addr: \":8089\"\nhttp_listen_addr: \":6060\"\nupdaters:\n  sets:\n    - ubuntu\n    - de"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml.d/dropin.yaml",
    "chars": 16,
    "preview": "log_level: null\n"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml.d/empty.yaml",
    "chars": 1,
    "preview": "\n"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml.d/ignored.json-patch",
    "chars": 139,
    "preview": "# This file is ignored -- look at all this invalid JSON!\n[\n  {\n    \"op\": \"add\",\n    \"path\": \"/updaters/sets/-\",\n    \"val"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml.d/later.yaml",
    "chars": 46,
    "preview": "log_level: panic\nupdaters:\n  sets:\n    - rhel\n"
  },
  {
    "path": "cmd/testdata/ComplexYAML/config.yaml.d/updater.yaml-patch",
    "chars": 48,
    "preview": "- op: add\n  path: /updaters/sets/-\n  value: osv\n"
  },
  {
    "path": "cmd/testdata/ComplexYAML/want.json",
    "chars": 1297,
    "preview": "{\n  \"log_level\": \"panic\",\n  \"introspection_addr\": \":8089\",\n  \"http_listen_addr\": \":6060\",\n  \"updaters\": {\n    \"sets\": [\n"
  },
  {
    "path": "cmd/testdata/Error/BadKind.toml",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "cmd/testdata/Error/BadPatch.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "cmd/testdata/Error/BadPatch.json.d/decode.json-patch",
    "chars": 21,
    "preview": "[\n  [\n    null\n  ]\n]\n"
  },
  {
    "path": "cmd/testdata/Error/BadPatch.json.d/invalid.json-patch",
    "chars": 70,
    "preview": "[\n  {\n    \"op\": \"invalid\",\n    \"path\": \"any\",\n    \"value\": null\n  }\n]\n"
  },
  {
    "path": "cmd/testdata/Error/Indents.yaml",
    "chars": 881,
    "preview": "auth:\r\n    psk:\r\n        iss:\r\n            - quay\r\n            - clairctl\r\n        key: dmVyeXNlY3JldA0K  #gitleaks:allo"
  },
  {
    "path": "cmd/testdata/Error/NotAnArray.json",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "cmd/testdata/Error/NotAnArray.json.d/badpatch.json-patch",
    "chars": 3,
    "preview": "{}\n"
  },
  {
    "path": "cmd/testdata/Error/NotAnObject.json",
    "chars": 3,
    "preview": "[]\n"
  },
  {
    "path": "cmd/testdata/Error/NotYAML.yaml",
    "chars": 24,
    "preview": "key:\n\t- no tabs allowed\n"
  },
  {
    "path": "cmd/testdata/Error/TooShort.json",
    "chars": 1,
    "preview": "0"
  },
  {
    "path": "cmd/testdata/SimpleJSON/config.json",
    "chars": 70,
    "preview": "{\n\t\"http_listen_addr\": \":80\",\n\t\"log_level\": \"error\",\n\t\"matcher\": {}\n}\n"
  },
  {
    "path": "cmd/testdata/SimpleJSON/want.json",
    "chars": 54,
    "preview": "{\n\t\"http_listen_addr\": \":80\",\n\t\"log_level\": \"error\"\n}\n"
  },
  {
    "path": "cmd/testdata/SimpleYAML/config.yaml",
    "chars": 1392,
    "preview": "---\nlog_level: debug-color\nintrospection_addr: \":8089\"\nhttp_listen_addr: \":6060\"\nupdaters:\n  sets:\n    - ubuntu\n    - de"
  },
  {
    "path": "cmd/testdata/SimpleYAML/want.json",
    "chars": 1338,
    "preview": "{\n  \"log_level\": \"debug-color\",\n  \"introspection_addr\": \":8089\",\n  \"http_listen_addr\": \":6060\",\n  \"updaters\": {\n    \"set"
  },
  {
    "path": "code-of-conduct.md",
    "chars": 3037,
    "preview": "## CoreOS Community Code of Conduct\n\n### Contributor Code of Conduct\n\nAs contributors and maintainers of this project, a"
  },
  {
    "path": "config/auth.go",
    "chars": 2522,
    "preview": "package config\n\nimport (\n\t\"encoding\"\n\t\"encoding/base64\"\n\t\"fmt\"\n)\n\n// Base64 is a byte slice that encodes to and from bas"
  },
  {
    "path": "config/auth_test.go",
    "chars": 2161,
    "preview": "package config_test\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"testing\"\n\t\"testing/quick\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\n\t\""
  },
  {
    "path": "config/config.go",
    "chars": 3108,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"time\"\n)\n\n// Config is the configuration object for the commands in\n// github.co"
  },
  {
    "path": "config/config_test.go",
    "chars": 9415,
    "preview": "package config_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/google/go-cmp/cmp\"\n\t\"github.com/quay/clair/config\"\n)\n\ntype"
  },
  {
    "path": "config/database.go",
    "chars": 916,
    "preview": "package config\n\nimport (\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc checkDSN(s string) (w []Warning, err error) {\n\tswitch {\n\tca"
  },
  {
    "path": "config/defaults.go",
    "chars": 1099,
    "preview": "package config\n\nimport \"time\"\n\n// These are defaults, used in the documented spots.\nconst (\n\t// DefaultAddress is used i"
  },
  {
    "path": "config/doc.go",
    "chars": 961,
    "preview": "// Package config is the configuration package for Clair's binaries. See the\n// [Config] type for the main entry point.\n"
  },
  {
    "path": "config/enums.go",
    "chars": 2598,
    "preview": "package config\n\nimport (\n\t\"encoding\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n)\n\n//go:generate -command stringer go run golang.org/x/"
  },
  {
    "path": "config/enums_string.go",
    "chars": 1363,
    "preview": "// Code generated by \"stringer -type Mode,LogLevel -linecomment -output enums_string.go\"; DO NOT EDIT.\n\npackage config\n\n"
  },
  {
    "path": "config/enums_test.go",
    "chars": 899,
    "preview": "package config_test\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\n\t\"github.com/quay/clair/config\"\n)\n\nfunc TestEnumMarshal(t *testing.T)"
  },
  {
    "path": "config/go.mod",
    "chars": 88,
    "preview": "module github.com/quay/clair/config\n\ngo 1.22.0\n\nrequire github.com/google/go-cmp v0.7.0\n"
  },
  {
    "path": "config/go.sum",
    "chars": 167,
    "preview": "github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=\ngithub.com/google/go-cmp v0.7.0/go.mod h"
  },
  {
    "path": "config/indexer.go",
    "chars": 4068,
    "preview": "package config\n\nimport \"runtime\"\n\n// Indexer provides Clair Indexer node configuration\ntype Indexer struct {\n\t// Scanner"
  },
  {
    "path": "config/introspection.go",
    "chars": 3201,
    "preview": "package config\n\nimport \"fmt\"\n\n// Trace specifies how to configure Clair's tracing support.\n//\n// The \"Name\" key must mat"
  },
  {
    "path": "config/lint.go",
    "chars": 1323,
    "preview": "package config\n\nimport (\n\t\"errors\"\n\t\"strings\"\n)\n\n// Lint runs lints on the provided Config.\n//\n// An error is reported o"
  },
  {
    "path": "config/lint_test.go",
    "chars": 1389,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n)\n\nfunc init() {\n\t// Forcibly clear PostgreSQL environment variables to"
  },
  {
    "path": "config/matcher.go",
    "chars": 4134,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net/url\"\n)\n\n// Matcher is the configuration for the matcher service.\ntype Matcher stru"
  },
  {
    "path": "config/matchers.go",
    "chars": 683,
    "preview": "package config\n\n// Matchers configures the individual matchers run by the matcher system.\ntype Matchers struct {\n\t// Con"
  },
  {
    "path": "config/notifier.go",
    "chars": 12428,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"reflect\"\n\t\"strings\"\n\t\"time\"\n)\n\n// Notifier provides Clai"
  },
  {
    "path": "config/otlp.go",
    "chars": 5862,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"path\"\n\t\"strings\"\n)\n\n// OTLPCommon is common configuration options for an OTLP client.\n"
  },
  {
    "path": "config/otlpcompressor_string.go",
    "chars": 733,
    "preview": "// Code generated by \"stringer -type OTLPCompressor -linecomment\"; DO NOT EDIT.\n\npackage config\n\nimport \"strconv\"\n\nfunc "
  },
  {
    "path": "config/reflect.go",
    "chars": 1882,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"strings\"\n)\n\ntype walkFunc func(interface{}) ([]Warning, error)\n\nfunc forEac"
  },
  {
    "path": "config/tags_test.go",
    "chars": 1433,
    "preview": "package config\n\nimport (\n\t\"reflect\"\n\t\"testing\"\n)\n\n// TestTags checks that exported types and fields used in the root Con"
  },
  {
    "path": "config/tls.go",
    "chars": 2374,
    "preview": "package config\n\nimport (\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n)\n\n// TLS describes some TLS settings.\n//\n/"
  },
  {
    "path": "config/updaters.go",
    "chars": 1110,
    "preview": "package config\n\n// Updaters configures updater behavior.\ntype Updaters struct {\n\t// Filter is a regexp that disallows up"
  },
  {
    "path": "config/validate.go",
    "chars": 488,
    "preview": "package config\n\n// Validate confirms the necessary values to support the desired Clair mode\n// exist and sets default va"
  },
  {
    "path": "config.yaml.sample",
    "chars": 2667,
    "preview": "# Copyright 2015 clair authors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use thi"
  },
  {
    "path": "contrib/cmd/quaybackstop/Dockerfile",
    "chars": 1887,
    "preview": "# syntax=docker.io/docker/dockerfile:1.7\n\n# Copyright 2024 clair authors\n#\n# Licensed under the Apache License, Version "
  },
  {
    "path": "contrib/cmd/quaybackstop/clair.go",
    "chars": 8261,
    "preview": "//go:build go1.23\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"iter\"\n\t\"log/s"
  },
  {
    "path": "contrib/cmd/quaybackstop/main.go",
    "chars": 11362,
    "preview": "//go:build go1.23\n\n// Quaybackstop is a helper command to ensure that Quay's GC decisions are\n// propagated back to Clai"
  },
  {
    "path": "contrib/cmd/quaybackstop/main_old.go",
    "chars": 194,
    "preview": "//go:build !go1.23\n\npackage main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n)\n\nfunc main() {\n\tfmt.Fprintln(os.Stderr, \"This command was comp"
  },
  {
    "path": "contrib/cmd/quaybackstop/quay.go",
    "chars": 6904,
    "preview": "//go:build go1.23\n\npackage main\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"iter\"\n\t"
  },
  {
    "path": "contrib/cmd/quaybackstop/sig_linux.go",
    "chars": 140,
    "preview": "//go:build linux\n\npackage main\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nvar signals = []os.Signal{\n\tsyscall.SIGTERM, syscall.SIGINT"
  },
  {
    "path": "contrib/cmd/quaybackstop/sig_other.go",
    "chars": 74,
    "preview": "//go:build !linux\n\npackage main\n\nimport \"os\"\n\nvar signals = []os.Signal{}\n"
  },
  {
    "path": "contrib/openshift/build_and_deploy.sh",
    "chars": 3957,
    "preview": "#!/usr/bin/bash\nset -euo pipefail\n\nsplice() { local IFS=\"$1\"; shift; echo \"$*\"; }\n\nwhile getopts nxz name; do\n\tcase \"$na"
  },
  {
    "path": "contrib/openshift/grafana/dashboard-clair.configmap.yaml.tpl",
    "chars": 443,
    "preview": "# WARNING: This is generated from local-dev/grafana/data/dashboards/clair.json\n# please modify there and run make contri"
  },
  {
    "path": "contrib/openshift/grafana/dashboards/dashboard-clair.configmap.yaml",
    "chars": 110472,
    "preview": "# WARNING: This is generated from local-dev/grafana/data/dashboards/clair.json\n# please modify there and run make contri"
  },
  {
    "path": "contrib/openshift/manifests/backstop.yaml",
    "chars": 3626,
    "preview": "---\napiVersion: template.openshift.io/v1\nkind: Template\nmetadata:\n  name: clair-gc-quaybackstop\n  labels:\n    app: clair"
  },
  {
    "path": "contrib/openshift/manifests/db-job.yaml",
    "chars": 1531,
    "preview": "---\napiVersion: v1\nkind: Template\nmetadata:\n  name: clair-db-jobs\nparameters:\n- name: SUBCOMMAND\n  value: \"pre\"\n  requir"
  },
  {
    "path": "contrib/openshift/manifests/manifests.yaml",
    "chars": 14709,
    "preview": "---\napiVersion: v1\nkind: Template\nmetadata:\n  name: clair\n  labels:\n    app: clair\nobjects:\n  #\n  # indexer deployment\n "
  },
  {
    "path": "contrib/openshift/pr_check.sh",
    "chars": 327,
    "preview": "#!/usr/bin/bash\nset -euo pipefail\n[ -n \"${DEBUG-}\" ] && set -x\n\n# This should be run from the repo root, but enforce tha"
  },
  {
    "path": "docker-compose.yaml",
    "chars": 5923,
    "preview": "---\n# This is just to hold a bunch of yaml anchors and try to consolidate parts of\n# the config.\nx-anchors:\n  go: &go-im"
  },
  {
    "path": "etc/.gitignore",
    "chars": 16,
    "preview": "config.local.mk\n"
  },
  {
    "path": "etc/config.mk",
    "chars": 3233,
    "preview": "# `docker` and `docker-compose` control the commands invoked for a container\n# engine and a \"compose file\" handler, resp"
  },
  {
    "path": "etc/container.mk",
    "chars": 3086,
    "preview": "# The following builds a command in the \"buildctl_cmd\" variable that expects a\n# context in the shell variable \"src\" and"
  },
  {
    "path": "etc/dev.mk",
    "chars": 4090,
    "preview": "# The \"vendor\" target aliases the actual file that controls the go vendor\n# directory.\n.PHONY: vendor\nvendor: vendor/mod"
  },
  {
    "path": "etc/dist.mk",
    "chars": 760,
    "preview": "# The \"dist\" target builds a dist archive at git revision \"VERSION\".\n.PHONY: dist\ndist: clair-$(VERSION).tar.gz\n\n# Clair"
  },
  {
    "path": "etc/doc.mk",
    "chars": 94,
    "preview": "# Book builds the documentation into the `book` directory.\nbook:\n\tmdbook build\nrm_pat += book\n"
  },
  {
    "path": "go.mod",
    "chars": 5335,
    "preview": "module github.com/quay/clair/v4\n\ngo 1.25.0\n\nrequire (\n\tgithub.com/Masterminds/semver v1.5.0\n\tgithub.com/evanphx/json-pat"
  },
  {
    "path": "go.sum",
    "chars": 32166,
    "preview": "github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08=\ngithub.com/DATA-DOG/go-sqlmock v1."
  },
  {
    "path": "health/readinesshandler.go",
    "chars": 1015,
    "preview": "package health\n\nimport (\n\t\"net/http\"\n\t\"sync/atomic\"\n)\n\nvar ready atomic.Uint32\n\n// Ready instructs the ReadinessHandler "
  },
  {
    "path": "health/readinesshandler_test.go",
    "chars": 1395,
    "preview": "package health_test\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/quay/clair/v4/health\""
  },
  {
    "path": "httptransport/api/.gitattributes",
    "chars": 105,
    "preview": "v*/openapi.json linguist-generated\nv*/openapi.yaml linguist-generated\nv*/openapi.etag linguist-generated\n"
  },
  {
    "path": "httptransport/api/lib/oapi.jq",
    "chars": 2087,
    "preview": "# vim: set expandtab ts=2 sw=2:\nmodule {\n  name: \"openapi\",\n};\n\n# Some helper functions:\n\ndef ref($ref): # Construct a J"
  },
  {
    "path": "httptransport/api/openapi.zsh",
    "chars": 2871,
    "preview": "#!/usr/bin/zsh\nset -euo pipefail\n\n# This script builds the OpenAPI documents, rendering them into YAML and JSON.\n#\n# The"
  },
  {
    "path": "httptransport/api/v1/examples/affected_manifests.json",
    "chars": 145,
    "preview": "{\"vulnerabilities\":{\"42\":{\"id\":\"42\"}},\"vulnerable_manifests\":{\"sha256:01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef"
  },
  {
    "path": "httptransport/api/v1/examples/bulk_delete.json",
    "chars": 80,
    "preview": "[\n  \"sha256:fc84b5febd328eccaa913807716887b3eb5ed08bc22cc6933a9ebf82766725e3\"\n]\n"
  },
  {
    "path": "httptransport/api/v1/examples/cpe.json",
    "chars": 117,
    "preview": "\"cpe:/a:microsoft:internet_explorer:8.0.6001:beta\"\n\"cpe:2.3:a:microsoft:internet_explorer:8.0.6001:beta:*:*:*:*:*:*\"\n"
  },
  {
    "path": "httptransport/api/v1/examples/digest.json",
    "chars": 286,
    "preview": "\"sha256:44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a\"\n\"sha512:27c74670adb75075fad058d5ceaf7b20c4e778"
  },
  {
    "path": "httptransport/api/v1/examples/distribution.json",
    "chars": 196,
    "preview": "{\n  \"id\": \"1\",\n  \"did\": \"ubuntu\",\n  \"name\": \"Ubuntu\",\n  \"version\": \"18.04.3 LTS (Bionic Beaver)\",\n  \"version_code_name\":"
  },
  {
    "path": "httptransport/api/v1/examples/environment.json",
    "chars": 185,
    "preview": "{\n  \"value\": {\n    \"package_db\": \"var/lib/dpkg/status\",\n    \"introduced_in\": \"sha256:35c102085707f703de2d9eaad8752d6fe1b"
  },
  {
    "path": "httptransport/api/v1/examples/manifest.json",
    "chars": 412,
    "preview": "{\n  \"hash\": \"sha256:fc84b5febd328eccaa913807716887b3eb5ed08bc22cc6933a9ebf82766725e3\",\n  \"layers\": [\n    {\n      \"hash\":"
  },
  {
    "path": "httptransport/api/v1/examples/notification_page.json",
    "chars": 1432,
    "preview": "{\n  \"page\": {\n    \"size\": 100,\n    \"next\": \"1b4d0db2-e757-4150-bbbb-543658144205\"\n  },\n  \"notifications\": [\n    {\n      "
  },
  {
    "path": "httptransport/api/v1/examples/package.json",
    "chars": 280,
    "preview": "{\n  \"id\": \"10\",\n  \"name\": \"libapt-pkg5.0\",\n  \"version\": \"1.6.11\",\n  \"kind\": \"binary\",\n  \"normalized_version\": \"\",\n  \"arc"
  },
  {
    "path": "httptransport/api/v1/examples/vulnerability.json",
    "chars": 1309,
    "preview": "{\n  \"id\": \"356835\",\n  \"updater\": \"ubuntu\",\n  \"name\": \"CVE-2009-5155\",\n  \"description\": \"In the GNU C Library (aka glibc "
  },
  {
    "path": "httptransport/api/v1/examples/vulnerability_summary.json",
    "chars": 761,
    "preview": "{\n  \"name\": \"CVE-2009-5155\",\n  \"description\": \"In the GNU C Library (aka glibc or libc6) before 2.28, parse_reg_exp in p"
  },
  {
    "path": "httptransport/api/v1/openapi.etag",
    "chars": 66,
    "preview": "\"c8f7a50c0be60ee322a40f622e544801f5014effe8ff338ea35b18ed4c07806b\""
  },
  {
    "path": "httptransport/api/v1/openapi.jq",
    "chars": 15675,
    "preview": "# vim: set expandtab ts=2 sw=2:\ninclude \"oapi\";\n\n# Some helper functions:\ndef example_ref($id): ref(\"examples/\\($id).jso"
  },
  {
    "path": "httptransport/api/v1/openapi.json",
    "chars": 63246,
    "preview": "{\n  \"openapi\": \"3.1.0\",\n  \"info\": {\n    \"title\": \"Clair Container Analyzer\",\n    \"description\": \"Clair is a set of coope"
  },
  {
    "path": "httptransport/api/v1/openapi.yaml",
    "chars": 49258,
    "preview": "openapi: 3.1.0\ninfo:\n  title: Clair Container Analyzer\n  description: |-\n    Clair is a set of cooperating microservices"
  },
  {
    "path": "httptransport/auth.go",
    "chars": 890,
    "preview": "package httptransport\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/quay/clair/config\"\n\n\t\"github.com/quay/clair/v4/middl"
  },
  {
    "path": "httptransport/auth_test.go",
    "chars": 3830,
    "preview": "package httptransport\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/rand\"\n\t\"encoding/hex\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"net"
  },
  {
    "path": "httptransport/client/httpclient.go",
    "chars": 3065,
    "preview": "package client\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/quay/claircore/libvuln/d"
  },
  {
    "path": "httptransport/client/indexer.go",
    "chars": 6330,
    "preview": "package client\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"path\"\n\n\t\"github.com/quay/claircore\"\n\n\tclairerror \"gith"
  },
  {
    "path": "httptransport/client/matcher.go",
    "chars": 7649,
    "preview": "package client\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/google/uuid"
  },
  {
    "path": "httptransport/client/matcher_test.go",
    "chars": 4804,
    "preview": "package client_test\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"path\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\""
  },
  {
    "path": "httptransport/common.go",
    "chars": 3995,
    "preview": "package httptransport\n\nimport (\n\tcrand \"crypto/rand\"\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"fmt\"\n\t\"math/rand\"\n\t\"mime\"\n\t\"net/http"
  },
  {
    "path": "httptransport/concurrentlimit.go",
    "chars": 1624,
    "preview": "package httptransport\n\nimport (\n\t\"log/slog\"\n\t\"net/http\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"github.com/"
  },
  {
    "path": "httptransport/concurrentlimit_test.go",
    "chars": 1984,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"testing\"\n\n\t\""
  },
  {
    "path": "httptransport/discoveryhandler.go",
    "chars": 3421,
    "preview": "package httptransport\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t_ \"embed\" // for json and etag\n\t\"encoding/json\"\n\t\"errors\"\n\t\"io\"\n\t\"l"
  },
  {
    "path": "httptransport/discoveryhandler_test.go",
    "chars": 2092,
    "preview": "package httptransport\n\nimport (\n\t\"encoding/json\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/quay/cl"
  },
  {
    "path": "httptransport/error.go",
    "chars": 2128,
    "preview": "package httptransport\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n)\n\n// Stat"
  },
  {
    "path": "httptransport/error_test.go",
    "chars": 1501,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\n\t\"github.com/quay/claircore/test"
  },
  {
    "path": "httptransport/gone.go",
    "chars": 217,
    "preview": "package httptransport\n\nimport \"net/http\"\n\nvar gone = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n\tco"
  },
  {
    "path": "httptransport/indexer_v1.go",
    "chars": 8869,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"path\"\n\t\"time\"\n\n\t\"github.com/quay/c"
  },
  {
    "path": "httptransport/indexer_v1_test.go",
    "chars": 6840,
    "preview": "package httptransport\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"te"
  },
  {
    "path": "httptransport/instrumentation.go",
    "chars": 4107,
    "preview": "package httptransport\n\nimport (\n\t\"errors\"\n\t\"log/slog\"\n\t\"net/http\"\n\n\t\"github.com/prometheus/client_golang/prometheus\"\n\t\"g"
  },
  {
    "path": "httptransport/instrumentation_test.go",
    "chars": 1999,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"githu"
  },
  {
    "path": "httptransport/matcher_v1.go",
    "chars": 7683,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/http/httptrace\"\n\t\"path\"\n\t\"path/filepa"
  },
  {
    "path": "httptransport/matcher_v1_test.go",
    "chars": 12671,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"path\"\n\t\"tes"
  },
  {
    "path": "httptransport/notification_v1.go",
    "chars": 5125,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"time\""
  },
  {
    "path": "httptransport/notification_v1_test.go",
    "chars": 6553,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"testing"
  },
  {
    "path": "httptransport/robotshandler.go",
    "chars": 602,
    "preview": "package httptransport\n\nimport (\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/quay/clair/v4/cmd\"\n)\n\nvar startup = time.No"
  },
  {
    "path": "httptransport/robotshandler_test.go",
    "chars": 557,
    "preview": "package httptransport\n\nimport (\n\t\"bytes\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/http/httputil\"\n\t\"testing\"\n\n\t\"github.com/"
  },
  {
    "path": "httptransport/server.go",
    "chars": 5995,
    "preview": "// Package httptransport contains the HTTP logic for implementing the Clair(v4)\n// HTTP API v1.\npackage httptransport\n\ni"
  },
  {
    "path": "httptransport/server_test.go",
    "chars": 2375,
    "preview": "package httptransport\n\nimport (\n\t\"context\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"net/url\"\n\t\"path\"\n\t\"testing\"\n\n\t\"gith"
  },
  {
    "path": "httptransport/types/v1/affected_manifests.schema.json",
    "chars": 970,
    "preview": "{\n  \"$id\": \"https://clairproject.org/api/http/v1/affected_manifests.schema.json\",\n  \"$schema\": \"https://json-schema.org/"
  },
  {
    "path": "httptransport/types/v1/bulk_delete.schema.json",
    "chars": 371,
    "preview": "{\n  \"$id\": \"https://clairproject.org/api/http/v1/bulk_delete.schema.json\",\n  \"$schema\": \"https://json-schema.org/draft/2"
  }
]

// ... and 134 more files (download for full content)

About this extraction

This page contains the full source code of the quay/clair GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 334 files (1.3 MB), approximately 421.0k tokens, and a symbol index with 684 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.

Copied to clipboard!