Skip to content

Implement `#new_blobs` via `#list_blobs`

Patrick Steinhardt requested to merge pks-new-blobs-list-blobs into master

What does this MR do?

In order to determine which blobs are new based on a given revision, we call Gitaly's ListNewBlobs RPC. This RPC is rather inflexible though: it only allows passing a single new revision. As a result, we cannot batch computation of new blobs across a set changes in our access checks.

As a first step towards fixing this limitation, we now migrate #new_blobs() to use the ListBlobs RPC: this is a much more flexible variant of ListNewBlobs, and most importantly it allows us to pass a set of revisions. When the old implementation is removed, we can thus easily allow #new_blobs() to receive multiple revisions.

Note that this changes the return type of #new_blobs(): instead of returning a set of Gitaly::NewBlobObject classes, we now return a set of Gitlab::Git::Blobs. While both share the same size and path attributes, the former tracks the blob ID via an id attribute while the latter uses an oid attribute. There is only a single callsite of #new_blobs() though, which is the FileSizeCheck push rule, and this callsite only uses the size and path attributes. So in the end, this change in behaviour is fine.

Screenshots or Screencasts (strongly suggested)

How to setup and validate locally (strongly suggested)

Does this MR meet the acceptance criteria?

Conformity

Availability and Testing

Security

Does this MR contain changes to processing or storing of credentials or tokens, authorization and authentication methods or other items described in the security review guidelines? If not, then delete this Security section.

  • Label as security and @ mention @gitlab-com/gl-security/appsec
  • The MR includes necessary changes to maintain consistency between UI, API, email, or other methods
  • Security reports checked/validated by a reviewer from the AppSec team

Merge request reports