Count downloads for tag archives

This commit is contained in:
JakobDev 2024-04-02 16:34:57 +02:00
parent f8a5d6872c
commit 613e5387c5
22 changed files with 469 additions and 95 deletions

View file

@ -30,10 +30,11 @@ import (
// This is entirely opaque to external entities, though, and mostly used as a
// handle elsewhere.
type ArchiveRequest struct {
RepoID int64
refName string
Type git.ArchiveType
CommitID string
RepoID int64
refName string
Type git.ArchiveType
CommitID string
ReleaseID int64
}
// ErrUnknownArchiveFormat request archive format is not supported
@ -70,7 +71,7 @@ func (e RepoRefNotFoundError) Is(err error) bool {
// NewRequest creates an archival request, based on the URI. The
// resulting ArchiveRequest is suitable for being passed to ArchiveRepository()
// if it's determined that the request still needs to be satisfied.
func NewRequest(repoID int64, repo *git.Repository, uri string) (*ArchiveRequest, error) {
func NewRequest(ctx context.Context, repoID int64, repo *git.Repository, uri string) (*ArchiveRequest, error) {
r := &ArchiveRequest{
RepoID: repoID,
}
@ -99,6 +100,17 @@ func NewRequest(repoID int64, repo *git.Repository, uri string) (*ArchiveRequest
}
r.CommitID = commitID.String()
release, err := repo_model.GetRelease(ctx, repoID, r.refName)
if err != nil {
if !repo_model.IsErrReleaseNotExist(err) {
return nil, err
}
}
if release != nil {
r.ReleaseID = release.ID
}
return r, nil
}
@ -120,6 +132,10 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver
return nil, fmt.Errorf("models.GetRepoArchiver: %w", err)
}
if archiver != nil {
archiver.ReleaseID = aReq.ReleaseID
}
if archiver != nil && archiver.Status == repo_model.ArchiverReady {
// Archive already generated, we're done.
return archiver, nil
@ -145,6 +161,7 @@ func (aReq *ArchiveRequest) Await(ctx context.Context) (*repo_model.RepoArchiver
return nil, fmt.Errorf("repo_model.GetRepoArchiver: %w", err)
}
if archiver != nil && archiver.Status == repo_model.ArchiverReady {
archiver.ReleaseID = aReq.ReleaseID
return archiver, nil
}
}