2022-12-02 02:08:48 +03:00
|
|
|
// Copyright 2022 OpenSSF Scorecard Authors
|
2022-09-21 23:20:20 +03:00
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package gitlabrepo
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
"sync"
|
|
|
|
|
|
|
|
"github.com/xanzy/go-gitlab"
|
|
|
|
|
|
|
|
"github.com/ossf/scorecard/v4/clients"
|
|
|
|
)
|
|
|
|
|
|
|
|
type releasesHandler struct {
|
|
|
|
glClient *gitlab.Client
|
|
|
|
once *sync.Once
|
|
|
|
errSetup error
|
|
|
|
repourl *repoURL
|
|
|
|
releases []clients.Release
|
|
|
|
}
|
|
|
|
|
|
|
|
func (handler *releasesHandler) init(repourl *repoURL) {
|
|
|
|
handler.repourl = repourl
|
|
|
|
handler.errSetup = nil
|
|
|
|
handler.once = new(sync.Once)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (handler *releasesHandler) setup() error {
|
|
|
|
handler.once.Do(func() {
|
|
|
|
if !strings.EqualFold(handler.repourl.commitSHA, clients.HeadSHA) {
|
|
|
|
handler.errSetup = fmt.Errorf("%w: ListReleases only supported for HEAD queries", clients.ErrUnsupportedFeature)
|
|
|
|
return
|
|
|
|
}
|
:bug: Gitlab: Commit/Commitor Exceptions (#3026)
* feat: Added paging for contributor/users against gitlab projects
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* refactor: Updated the bot flag for unmatched users
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* fix: Not all commit users are in the git registry instance
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* fix: Skipping check if the email is empty, as well as if the "email" doesn't contain a "." char.
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* fix: Updated to allow for commits with PRs to be accounted/added to the client.commits
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* refactor: Updated to prevent linting issue regarding nested if's
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* test: Adding coverage for commits and contributors for gitlab
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* refactor: Moved queries from the client to their own functions
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* bug: Need to pass the ProjectID value to the contributor query
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* bug: Updating project title versus projectID values for api querying
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* test: Updated tests to match expected property set for projectID
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
* revert: Reverted based on feedback during review
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
---------
Signed-off-by: Robison, Jim B <jim.b.robison@lmco.com>
2023-05-19 04:31:07 +03:00
|
|
|
releases, _, err := handler.glClient.Releases.ListReleases(handler.repourl.projectID, &gitlab.ListReleasesOptions{})
|
2022-09-21 23:20:20 +03:00
|
|
|
if err != nil {
|
|
|
|
handler.errSetup = fmt.Errorf("%w: ListReleases failed", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if len(releases) > 0 {
|
|
|
|
handler.releases = releasesFrom(releases)
|
|
|
|
} else {
|
|
|
|
handler.releases = nil
|
|
|
|
}
|
|
|
|
})
|
|
|
|
return handler.errSetup
|
|
|
|
}
|
|
|
|
|
|
|
|
func (handler *releasesHandler) getReleases() ([]clients.Release, error) {
|
|
|
|
if err := handler.setup(); err != nil {
|
|
|
|
return nil, fmt.Errorf("error during Releases.setup: %w", err)
|
|
|
|
}
|
|
|
|
return handler.releases, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func releasesFrom(data []*gitlab.Release) []clients.Release {
|
|
|
|
var releases []clients.Release
|
|
|
|
for _, r := range data {
|
|
|
|
release := clients.Release{
|
|
|
|
TagName: r.TagName,
|
|
|
|
TargetCommitish: r.CommitPath,
|
|
|
|
}
|
2023-04-21 21:58:42 +03:00
|
|
|
if len(r.Assets.Links) > 0 {
|
|
|
|
release.URL = r.Assets.Links[0].DirectAssetURL
|
|
|
|
}
|
|
|
|
|
2022-09-21 23:20:20 +03:00
|
|
|
for _, a := range r.Assets.Sources {
|
|
|
|
release.Assets = append(release.Assets, clients.ReleaseAsset{
|
|
|
|
Name: a.Format,
|
|
|
|
URL: a.URL,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
releases = append(releases, release)
|
|
|
|
}
|
|
|
|
return releases
|
|
|
|
}
|